From 76a139b9243f2a444742ea935cddd47faddd9a22 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sun, 8 Feb 2026 18:00:05 -0700 Subject: [PATCH 1/7] Add CodeQL background server manager and LSP tools Implements CodeQLServerManager for config-aware lifecycle management of CodeQL's three background servers (language-server, query-server2, cli-server) with session-isolated cache directories and automatic restart on configuration changes. Adds four LSP-based MCP tools: - codeql_lsp_diagnostics (renamed from codeql_language_server_eval) - codeql_lsp_completion - codeql_lsp_definition - codeql_lsp_references Resolves #17 (server manager with config hashing, session isolation, graceful shutdown) and #1 (LSP completion/definition/references tools). --- client/integration-tests/README.md | 2 +- .../after/monitoring-state.json | 14 + .../before/monitoring-state.json | 8 + .../from_clause_completion/README.md | 17 + .../after/monitoring-state.json | 14 + .../before/monitoring-state.json | 9 + .../after/monitoring-state.json | 14 + .../before/monitoring-state.json | 8 + .../class_definition/README.md | 17 + .../after/monitoring-state.json | 14 + .../before/monitoring-state.json | 9 + .../after/monitoring-state.json | 4 +- .../after/semantic_query.ql | 0 .../before/monitoring-state.json | 0 .../before/semantic_query.ql | 0 .../after/monitoring-state.json | 14 + .../syntax_validation/after/test_query.ql | 0 .../before/monitoring-state.json | 6 + .../syntax_validation/before/test_query.ql | 0 .../valid_query_no_errors/README.md | 16 + .../after/monitoring-state.json | 14 + .../after/valid_query.ql | 11 + .../before/monitoring-state.json | 6 + .../before/valid_query.ql | 11 + .../after/monitoring-state.json | 14 + .../before/monitoring-state.json | 8 + .../predicate_references/README.md | 17 + .../after/monitoring-state.json | 14 + .../before/monitoring-state.json | 9 + client/src/lib/integration-test-runner.js | 10 +- .../lib/monitoring-integration-test-runner.js | 2 +- docs/tools-reference.md | 76 + server/dist/codeql-development-mcp-server.js | 3951 ++++++++++------- .../dist/codeql-development-mcp-server.js.map | 8 +- server/src/codeql-development-mcp-server.ts | 10 + server/src/lib/cli-server.ts | 247 ++ server/src/lib/language-server.ts | 200 +- server/src/lib/query-server.ts | 245 + server/src/lib/server-config.ts | 188 + server/src/lib/server-manager.ts | 312 ++ .../ql-lsp-iterative-development.prompt.md | 109 + server/src/prompts/ql-tdd-advanced.prompt.md | 34 +- server/src/prompts/ql-tdd-basic.prompt.md | 11 + .../prompts/tools-query-workflow.prompt.md | 17 +- server/src/prompts/workflow-prompts.ts | 316 +- server/src/tools/codeql-tools.ts | 4 +- server/src/tools/codeql/index.ts | 2 +- server/src/tools/lsp/index.ts | 15 + .../lsp-diagnostics.ts} | 188 +- server/src/tools/lsp/lsp-handlers.ts | 140 + server/src/tools/lsp/lsp-tools.ts | 159 + server/test/src/lib/cli-server.test.ts | 235 + server/test/src/lib/language-server.test.ts | 237 +- server/test/src/lib/query-server.test.ts | 267 ++ server/test/src/lib/server-config.test.ts | 150 + server/test/src/lib/server-manager.test.ts | 200 + .../test/src/prompts/workflow-prompts.test.ts | 401 +- server/test/src/tools/codeql-tools.test.ts | 5 +- .../tools/codeql/language-server-eval.test.ts | 428 -- server/test/src/tools/lsp/index.test.ts | 66 + .../src/tools/lsp/lsp-diagnostics.test.ts | 332 ++ .../test/src/tools/lsp/lsp-handlers.test.ts | 258 ++ server/test/src/tools/lsp/lsp-tools.test.ts | 152 + 63 files changed, 7111 insertions(+), 2134 deletions(-) create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/after/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/before/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/README.md create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/after/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/before/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/after/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/before/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/README.md create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/after/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/before/monitoring-state.json rename client/integration-tests/primitives/tools/{codeql_language_server_eval => codeql_lsp_diagnostics}/semantic_validation/after/monitoring-state.json (88%) rename client/integration-tests/primitives/tools/{codeql_language_server_eval => codeql_lsp_diagnostics}/semantic_validation/after/semantic_query.ql (100%) rename client/integration-tests/primitives/tools/{codeql_language_server_eval => codeql_lsp_diagnostics}/semantic_validation/before/monitoring-state.json (100%) rename client/integration-tests/primitives/tools/{codeql_language_server_eval => codeql_lsp_diagnostics}/semantic_validation/before/semantic_query.ql (100%) create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/after/monitoring-state.json rename client/integration-tests/primitives/tools/{codeql_language_server_eval => codeql_lsp_diagnostics}/syntax_validation/after/test_query.ql (100%) create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/before/monitoring-state.json rename client/integration-tests/primitives/tools/{codeql_language_server_eval => codeql_lsp_diagnostics}/syntax_validation/before/test_query.ql (100%) create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/README.md create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/after/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/after/valid_query.ql create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/before/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/before/valid_query.ql create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/after/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/before/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/README.md create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/after/monitoring-state.json create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/before/monitoring-state.json create mode 100644 server/src/lib/cli-server.ts create mode 100644 server/src/lib/query-server.ts create mode 100644 server/src/lib/server-config.ts create mode 100644 server/src/lib/server-manager.ts create mode 100644 server/src/prompts/ql-lsp-iterative-development.prompt.md create mode 100644 server/src/tools/lsp/index.ts rename server/src/tools/{codeql/language-server-eval.ts => lsp/lsp-diagnostics.ts} (66%) create mode 100644 server/src/tools/lsp/lsp-handlers.ts create mode 100644 server/src/tools/lsp/lsp-tools.ts create mode 100644 server/test/src/lib/cli-server.test.ts create mode 100644 server/test/src/lib/query-server.test.ts create mode 100644 server/test/src/lib/server-config.test.ts create mode 100644 server/test/src/lib/server-manager.test.ts delete mode 100644 server/test/src/tools/codeql/language-server-eval.test.ts create mode 100644 server/test/src/tools/lsp/index.test.ts create mode 100644 server/test/src/tools/lsp/lsp-diagnostics.test.ts create mode 100644 server/test/src/tools/lsp/lsp-handlers.test.ts create mode 100644 server/test/src/tools/lsp/lsp-tools.test.ts diff --git a/client/integration-tests/README.md b/client/integration-tests/README.md index fc148c51..edcd49c2 100644 --- a/client/integration-tests/README.md +++ b/client/integration-tests/README.md @@ -127,7 +127,7 @@ Monitoring-based integration tests enable testing of MCP tools that previously c ## Example: Tool with Both File-Based and Monitoring Tests ```text -client/integration-tests/primitives/tools/codeql_language_server_eval/ +client/integration-tests/primitives/tools/codeql_lsp_diagnostics/ └── semantic_validation/ ├── before/ │ ├── semantic_query.ql # File-based test input diff --git a/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/after/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/after/monitoring-state.json new file mode 100644 index 00000000..d6d436df --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/after/monitoring-state.json @@ -0,0 +1,14 @@ +{ + "sessions": [ + { + "id": "integration_test_session", + "calls": [ + { + "tool": "codeql_lsp_completion", + "timestamp": "2026-02-08T00:00:00.000Z", + "status": "success" + } + ] + } + ] +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/before/monitoring-state.json new file mode 100644 index 00000000..7b65d02f --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/before/monitoring-state.json @@ -0,0 +1,8 @@ +{ + "sessions": [], + "parameters": { + "file_path": "server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql", + "line": 12, + "character": 7 + } +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/README.md b/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/README.md new file mode 100644 index 00000000..72886520 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/README.md @@ -0,0 +1,17 @@ +# `codeql_lsp_completion/from_clause_completion` + +## PURPOSE + +Tests that `codeql_lsp_completion` returns completion items when the cursor is +positioned inside a `from` clause after an `import` statement. + +## INPUTS + +- **file_path**: `server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql` +- **line**: 11 (inside the `from` clause) +- **character**: 5 (after keyword prefix) + +## EXPECTED OUTPUTS + +- A non-empty list of completion items with labels, documentation, and kind. +- Monitoring state updated to record a successful `codeql_lsp_completion` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/after/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/after/monitoring-state.json new file mode 100644 index 00000000..d6d436df --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/after/monitoring-state.json @@ -0,0 +1,14 @@ +{ + "sessions": [ + { + "id": "integration_test_session", + "calls": [ + { + "tool": "codeql_lsp_completion", + "timestamp": "2026-02-08T00:00:00.000Z", + "status": "success" + } + ] + } + ] +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/before/monitoring-state.json new file mode 100644 index 00000000..1f0e222d --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/before/monitoring-state.json @@ -0,0 +1,9 @@ +{ + "sessions": [], + "parameters": { + "file_path": "server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql", + "line": 11, + "character": 5, + "workspace_uri": "server/ql/javascript/examples" + } +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/after/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/after/monitoring-state.json new file mode 100644 index 00000000..f9307750 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/after/monitoring-state.json @@ -0,0 +1,14 @@ +{ + "sessions": [ + { + "id": "integration_test_session", + "calls": [ + { + "tool": "codeql_lsp_definition", + "timestamp": "2026-02-08T00:00:00.000Z", + "status": "success" + } + ] + } + ] +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/before/monitoring-state.json new file mode 100644 index 00000000..91ccb74a --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/before/monitoring-state.json @@ -0,0 +1,8 @@ +{ + "sessions": [], + "parameters": { + "file_path": "server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql", + "line": 13, + "character": 6 + } +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/README.md b/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/README.md new file mode 100644 index 00000000..e7511899 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/README.md @@ -0,0 +1,17 @@ +# `codeql_lsp_definition/class_definition` + +## PURPOSE + +Tests that `codeql_lsp_definition` returns definition locations when the cursor +is on a class name used in a `from` clause. + +## INPUTS + +- **file_path**: `server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql` +- **line**: 12 (on the class name in the `from` clause) +- **character**: 5 (cursor on the class name) + +## EXPECTED OUTPUTS + +- One or more definition locations with URIs pointing to `.qll` library files. +- Monitoring state updated to record a successful `codeql_lsp_definition` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/after/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/after/monitoring-state.json new file mode 100644 index 00000000..f9307750 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/after/monitoring-state.json @@ -0,0 +1,14 @@ +{ + "sessions": [ + { + "id": "integration_test_session", + "calls": [ + { + "tool": "codeql_lsp_definition", + "timestamp": "2026-02-08T00:00:00.000Z", + "status": "success" + } + ] + } + ] +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/before/monitoring-state.json new file mode 100644 index 00000000..3244d196 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/before/monitoring-state.json @@ -0,0 +1,9 @@ +{ + "sessions": [], + "parameters": { + "file_path": "server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql", + "line": 12, + "character": 5, + "workspace_uri": "server/ql/javascript/examples" + } +} diff --git a/client/integration-tests/primitives/tools/codeql_language_server_eval/semantic_validation/after/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/after/monitoring-state.json similarity index 88% rename from client/integration-tests/primitives/tools/codeql_language_server_eval/semantic_validation/after/monitoring-state.json rename to client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/after/monitoring-state.json index e636e8f4..a3b9dab2 100644 --- a/client/integration-tests/primitives/tools/codeql_language_server_eval/semantic_validation/after/monitoring-state.json +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/after/monitoring-state.json @@ -5,7 +5,7 @@ "queryPath": "/test/semantic_query.ql", "language": "javascript", "queryType": "test", - "description": "CodeQL language server evaluation test", + "description": "CodeQL LSP diagnostics test", "status": "active", "state": { "compilationStatus": "success", @@ -17,7 +17,7 @@ { "callId": "eval-call-1", "timestamp": "2024-01-01T00:00:00.000Z", - "toolName": "codeql_language_server_eval", + "toolName": "codeql_lsp_diagnostics", "parameters": { "sessionId": "codeql-eval-session", "query": "from DataFlow::Configuration cfg select cfg", diff --git a/client/integration-tests/primitives/tools/codeql_language_server_eval/semantic_validation/after/semantic_query.ql b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/after/semantic_query.ql similarity index 100% rename from client/integration-tests/primitives/tools/codeql_language_server_eval/semantic_validation/after/semantic_query.ql rename to client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/after/semantic_query.ql diff --git a/client/integration-tests/primitives/tools/codeql_language_server_eval/semantic_validation/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/before/monitoring-state.json similarity index 100% rename from client/integration-tests/primitives/tools/codeql_language_server_eval/semantic_validation/before/monitoring-state.json rename to client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/before/monitoring-state.json diff --git a/client/integration-tests/primitives/tools/codeql_language_server_eval/semantic_validation/before/semantic_query.ql b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/before/semantic_query.ql similarity index 100% rename from client/integration-tests/primitives/tools/codeql_language_server_eval/semantic_validation/before/semantic_query.ql rename to client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/before/semantic_query.ql diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/after/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/after/monitoring-state.json new file mode 100644 index 00000000..4640fa70 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/after/monitoring-state.json @@ -0,0 +1,14 @@ +{ + "sessions": [ + { + "id": "integration_test_session", + "calls": [ + { + "tool": "codeql_lsp_diagnostics", + "timestamp": "2026-02-08T00:00:00.000Z", + "status": "success" + } + ] + } + ] +} diff --git a/client/integration-tests/primitives/tools/codeql_language_server_eval/syntax_validation/after/test_query.ql b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/after/test_query.ql similarity index 100% rename from client/integration-tests/primitives/tools/codeql_language_server_eval/syntax_validation/after/test_query.ql rename to client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/after/test_query.ql diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/before/monitoring-state.json new file mode 100644 index 00000000..15858ad2 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/before/monitoring-state.json @@ -0,0 +1,6 @@ +{ + "sessions": [], + "parameters": { + "ql_code": "invalid_type x\nwhere x = \"test\"\nselect x, \"This has syntax errors\"" + } +} diff --git a/client/integration-tests/primitives/tools/codeql_language_server_eval/syntax_validation/before/test_query.ql b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/before/test_query.ql similarity index 100% rename from client/integration-tests/primitives/tools/codeql_language_server_eval/syntax_validation/before/test_query.ql rename to client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/before/test_query.ql diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/README.md b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/README.md new file mode 100644 index 00000000..a7fb871e --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/README.md @@ -0,0 +1,16 @@ +# `codeql_lsp_diagnostics/valid_query_no_errors` + +## PURPOSE + +Tests that `codeql_lsp_diagnostics` returns zero diagnostics for a +syntactically and semantically valid QL snippet. + +## INPUTS + +- **ql_code**: A valid inline QL query (`select 1 + 1`). + +## EXPECTED OUTPUTS + +- `isValid` is `true`, zero errors/warnings in the summary. +- The `valid_query.ql` file remains unchanged. +- Monitoring state updated to record a successful `codeql_lsp_diagnostics` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/after/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/after/monitoring-state.json new file mode 100644 index 00000000..4640fa70 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/after/monitoring-state.json @@ -0,0 +1,14 @@ +{ + "sessions": [ + { + "id": "integration_test_session", + "calls": [ + { + "tool": "codeql_lsp_diagnostics", + "timestamp": "2026-02-08T00:00:00.000Z", + "status": "success" + } + ] + } + ] +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/after/valid_query.ql b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/after/valid_query.ql new file mode 100644 index 00000000..ff117bea --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/after/valid_query.ql @@ -0,0 +1,11 @@ +/** + * @name Valid Test Query + * @description A valid CodeQL query with no syntax errors + * @id test/valid-query + * @kind problem + * @problem.severity warning + */ + +from string x +where x = "test" +select x, "This is a valid query" diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/before/monitoring-state.json new file mode 100644 index 00000000..8832acd9 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/before/monitoring-state.json @@ -0,0 +1,6 @@ +{ + "sessions": [], + "parameters": { + "ql_code": "select 1 + 1" + } +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/before/valid_query.ql b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/before/valid_query.ql new file mode 100644 index 00000000..ff117bea --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/valid_query_no_errors/before/valid_query.ql @@ -0,0 +1,11 @@ +/** + * @name Valid Test Query + * @description A valid CodeQL query with no syntax errors + * @id test/valid-query + * @kind problem + * @problem.severity warning + */ + +from string x +where x = "test" +select x, "This is a valid query" diff --git a/client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/after/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/after/monitoring-state.json new file mode 100644 index 00000000..5648c22b --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/after/monitoring-state.json @@ -0,0 +1,14 @@ +{ + "sessions": [ + { + "id": "integration_test_session", + "calls": [ + { + "tool": "codeql_lsp_references", + "timestamp": "2026-02-08T00:00:00.000Z", + "status": "success" + } + ] + } + ] +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/before/monitoring-state.json new file mode 100644 index 00000000..91ccb74a --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/before/monitoring-state.json @@ -0,0 +1,8 @@ +{ + "sessions": [], + "parameters": { + "file_path": "server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql", + "line": 13, + "character": 6 + } +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/README.md b/client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/README.md new file mode 100644 index 00000000..9607433a --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/README.md @@ -0,0 +1,17 @@ +# `codeql_lsp_references/predicate_references` + +## PURPOSE + +Tests that `codeql_lsp_references` returns reference locations when the cursor +is on a predicate name that is used in a `where` or `select` clause. + +## INPUTS + +- **file_path**: `server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql` +- **line**: 14 (on a predicate call in the `where` clause) +- **character**: 4 (cursor on the predicate name) + +## EXPECTED OUTPUTS + +- One or more reference locations, including the declaration itself. +- Monitoring state updated to record a successful `codeql_lsp_references` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/after/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/after/monitoring-state.json new file mode 100644 index 00000000..5648c22b --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/after/monitoring-state.json @@ -0,0 +1,14 @@ +{ + "sessions": [ + { + "id": "integration_test_session", + "calls": [ + { + "tool": "codeql_lsp_references", + "timestamp": "2026-02-08T00:00:00.000Z", + "status": "success" + } + ] + } + ] +} diff --git a/client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/before/monitoring-state.json new file mode 100644 index 00000000..a576a4c6 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_references/predicate_references/before/monitoring-state.json @@ -0,0 +1,9 @@ +{ + "sessions": [], + "parameters": { + "file_path": "server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql", + "line": 14, + "character": 4, + "workspace_uri": "server/ql/javascript/examples" + } +} diff --git a/client/src/lib/integration-test-runner.js b/client/src/lib/integration-test-runner.js index 04f10f57..5ed86e57 100644 --- a/client/src/lib/integration-test-runner.js +++ b/client/src/lib/integration-test-runner.js @@ -232,8 +232,8 @@ export class IntegrationTestRunner { return; } - // Handle special case for codeql_language_server_eval tool - if (toolName === "codeql_language_server_eval") { + // Handle special case for codeql_lsp_diagnostics tool + if (toolName === "codeql_lsp_diagnostics") { await this.runLanguageServerEvalTest(toolName, testCase, beforeDir, afterDir); return; } @@ -293,7 +293,7 @@ export class IntegrationTestRunner { } /** - * Special test runner for codeql_language_server_eval tool + * Special test runner for codeql_lsp_diagnostics tool * This tool validates QL code and returns diagnostics, rather than modifying files */ async runLanguageServerEvalTest(toolName, testCase, beforeDir, afterDir) { @@ -331,7 +331,7 @@ export class IntegrationTestRunner { // eslint-disable-next-line no-unused-vars const _afterContent = fs.readFileSync(afterPath, "utf8"); - // Run the language server eval tool on the before content + // Run the codeql_lsp_diagnostics tool on the before content const result = await this.client.callTool({ name: toolName, arguments: { @@ -882,7 +882,7 @@ export class IntegrationTestRunner { const beforeDir = path.join(testCaseDir, "before"); const staticPath = this.getStaticFilesPath(); - if (toolName === "codeql_language_server_eval") { + if (toolName === "codeql_lsp_diagnostics") { params.ql_code = "from DataFlow::Configuration cfg select cfg"; // Skip workspace_uri for now as it's not needed for basic validation } else if (toolName === "codeql_bqrs_decode") { diff --git a/client/src/lib/monitoring-integration-test-runner.js b/client/src/lib/monitoring-integration-test-runner.js index 6931dc33..f0c1ed1a 100644 --- a/client/src/lib/monitoring-integration-test-runner.js +++ b/client/src/lib/monitoring-integration-test-runner.js @@ -329,7 +329,7 @@ export class MonitoringIntegrationTestRunner { getToolSpecificParams(toolName, _testCase, testCaseDir) { const params = {}; - if (toolName === "codeql_language_server_eval") { + if (toolName === "codeql_lsp_diagnostics") { params.query = "from DataFlow::Configuration cfg select cfg"; params.language = "javascript"; } else if (toolName === "codeql_query_format") { diff --git a/docs/tools-reference.md b/docs/tools-reference.md index c813790a..ef330f0f 100644 --- a/docs/tools-reference.md +++ b/docs/tools-reference.md @@ -8,6 +8,7 @@ The MCP server provides tools that wrap CodeQL CLI commands and helper utilities - **Query Development** - Create, compile, and format queries - **Query Execution** - Run queries and process results +- **Validation & LSP** - Validate QL code and navigate symbols via LSP - **Testing** - Run and manage CodeQL tests - **Database Operations** - Create and analyze databases - **Resolution** - Resolve paths, dependencies, and metadata @@ -144,6 +145,81 @@ Analyze a database: - output: /path/to/results.sarif ``` +## Validation & LSP Tools + +### validate_codeql_query + +Quick heuristic validation for CodeQL query structure. Checks for common patterns like `from`/`where`/`select` clauses and metadata presence. Does **not** compile the query. + +**Parameters:** + +| Parameter | Type | Required | Description | +| ---------- | ------ | -------- | --------------------------------- | +| `query` | string | Yes | The CodeQL query text to validate | +| `language` | string | No | Target programming language | + +### codeql_lsp_diagnostics + +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. + +> **Note**: Inline `ql_code` is evaluated as a virtual document and cannot resolve pack imports (e.g., `import javascript`). For validating queries with imports, use `codeql_query_compile` on the actual file instead. This tool is best for syntax validation and checking QL code fragments that don't depend on external libraries. + +**Parameters:** + +| Parameter | Type | Required | Description | +| --------------- | ------ | -------- | ---------------------------------------------------- | +| `ql_code` | string | Yes | The CodeQL code to evaluate | +| `workspace_uri` | string | No | Workspace URI for context (defaults to `./ql`) | +| `search_path` | string | No | Search path for CodeQL libraries | +| `log_level` | string | No | Log level: OFF, ERROR, WARN, INFO, DEBUG, TRACE, ALL | + +### codeql_lsp_completion + +Get code completions at a cursor position in a CodeQL file. + +> **Important**: Set `workspace_uri` to the pack or workspace root directory (as a `file://` URI) for dependency resolution. Without it, completions for imported library types will be empty. + +**Parameters:** + +| Parameter | Type | Required | Description | +| --------------- | ------ | -------- | --------------------------------------------- | +| `file_path` | string | Yes | Absolute path to the `.ql`/`.qll` file | +| `line` | number | Yes | 0-based line number | +| `character` | number | Yes | 0-based character offset | +| `file_content` | string | No | File content override (reads disk if omitted) | +| `search_path` | string | No | Search path for CodeQL libraries | +| `workspace_uri` | string | No | Workspace URI for context | + +### codeql_lsp_definition + +Go to the definition of a CodeQL symbol at a given position. + +**Parameters:** + +| Parameter | Type | Required | Description | +| --------------- | ------ | -------- | --------------------------------------------- | +| `file_path` | string | Yes | Absolute path to the `.ql`/`.qll` file | +| `line` | number | Yes | 0-based line number | +| `character` | number | Yes | 0-based character offset | +| `file_content` | string | No | File content override (reads disk if omitted) | +| `search_path` | string | No | Search path for CodeQL libraries | +| `workspace_uri` | string | No | Workspace URI for context | + +### codeql_lsp_references + +Find all references to a CodeQL symbol at a given position. + +**Parameters:** + +| Parameter | Type | Required | Description | +| --------------- | ------ | -------- | --------------------------------------------- | +| `file_path` | string | Yes | Absolute path to the `.ql`/`.qll` file | +| `line` | number | Yes | 0-based line number | +| `character` | number | Yes | 0-based character offset | +| `file_content` | string | No | File content override (reads disk if omitted) | +| `search_path` | string | No | Search path for CodeQL libraries | +| `workspace_uri` | string | No | Workspace URI for context | + ## Testing Tools ### codeql_test_run diff --git a/server/dist/codeql-development-mcp-server.js b/server/dist/codeql-development-mcp-server.js index 3d84287b..bf38b654 100755 --- a/server/dist/codeql-development-mcp-server.js +++ b/server/dist/codeql-development-mcp-server.js @@ -416,8 +416,8 @@ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/ import express from "express"; import cors from "cors"; import dotenv from "dotenv"; -import { resolve as resolve10 } from "path"; -import { pathToFileURL as pathToFileURL3 } from "url"; +import { resolve as resolve11 } from "path"; +import { pathToFileURL as pathToFileURL4 } from "url"; // src/tools/codeql/bqrs-decode.ts import { z as z2 } from "zod"; @@ -4535,640 +4535,198 @@ var codeqlGenerateQueryHelpTool = { resultProcessor: defaultCLIResultProcessor }; -// src/tools/codeql/language-server-eval.ts +// src/tools/codeql/pack-install.ts import { z as z12 } from "zod"; +var codeqlPackInstallTool = { + name: "codeql_pack_install", + description: "Install CodeQL pack dependencies", + command: "codeql", + subcommand: "pack install", + inputSchema: { + packDir: z12.string().optional().describe("Directory containing qlpack.yml (default: current)"), + force: z12.boolean().optional().describe("Force reinstall of dependencies"), + "no-strict-mode": z12.boolean().optional().describe("Allow non-strict dependency resolution"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql pack install", + "codeql pack install --force /path/to/pack", + "codeql pack install --no-strict-mode" + ] +}; -// src/lib/language-server.ts -init_logger(); -init_package_paths(); -import { spawn } from "child_process"; -import { EventEmitter } from "events"; -import { setTimeout as setTimeout2, clearTimeout } from "timers"; -import { pathToFileURL } from "url"; -import { delimiter as delimiter2, join as join5 } from "path"; +// src/tools/codeql/pack-ls.ts +import { z as z13 } from "zod"; +var codeqlPackLsTool = { + name: "codeql_pack_ls", + description: "List CodeQL packs under some local directory path", + command: "codeql", + subcommand: "pack ls", + inputSchema: { + dir: z13.string().optional().describe("The root directory of the package or workspace, defaults to the current working directory"), + format: z13.enum(["text", "json"]).optional().describe("Output format: text (default) or json"), + groups: z13.string().optional().describe("List of CodeQL pack groups to include or exclude"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql pack ls -- .", + "codeql pack ls --format=json -- /path/to/pack-directory", + "codeql pack ls --format=json --groups=queries,tests -- ." + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/profile-codeql-query.ts init_cli_executor(); -var CodeQLLanguageServer = class extends EventEmitter { - constructor(_options = {}) { - super(); - this._options = _options; - } - server = null; - messageId = 1; - pendingResponses = /* @__PURE__ */ new Map(); - isInitialized = false; - messageBuffer = ""; - async start() { - if (this.server) { - throw new Error("Language server is already running"); - } - logger.info("Starting CodeQL Language Server..."); - const args = [ - "execute", - "language-server", - "--check-errors=ON_CHANGE" - ]; - if (this._options.searchPath) { - args.push(`--search-path=${this._options.searchPath}`); - } - if (this._options.logdir) { - args.push(`--logdir=${this._options.logdir}`); - } - if (this._options.loglevel) { - args.push(`--loglevel=${this._options.loglevel}`); - } - if (this._options.synchronous) { - args.push("--synchronous"); - } - 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; +init_logger(); +import { z as z14 } from "zod"; +import { writeFileSync as writeFileSync3, readFileSync as readFileSync4, existsSync as existsSync6 } from "fs"; +import { join as join5, dirname as dirname6, basename as basename4 } from "path"; +import { mkdirSync as mkdirSync5 } from "fs"; +function parseEvaluatorLog(logPath) { + const logContent = readFileSync4(logPath, "utf-8"); + const jsonObjects = logContent.split("\n\n").filter((s) => s.trim()); + const events = jsonObjects.map((obj) => { + try { + return JSON.parse(obj); + } catch (_error) { + logger.warn(`Failed to parse evaluator log object: ${obj.substring(0, 100)}...`); + return null; } - this.server = spawn("codeql", args, { - stdio: ["pipe", "pipe", "pipe"], - env: spawnEnv - }); - this.server.stderr?.on("data", (data) => { - logger.debug("CodeQL LS stderr:", data.toString()); - }); - this.server.stdout?.on("data", (data) => { - this.handleStdout(data); - }); - this.server.on("error", (error) => { - logger.error("CodeQL Language Server error:", error); - this.emit("error", error); - }); - this.server.on("exit", (code) => { - logger.info("CodeQL Language Server exited with code:", code); - this.server = null; - this.isInitialized = false; - this.emit("exit", code); - }); - await new Promise((resolve11) => setTimeout2(resolve11, 2e3)); - } - handleStdout(data) { - this.messageBuffer += data.toString(); - let headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); - while (headerEnd !== -1) { - const header = this.messageBuffer.substring(0, headerEnd); - const contentLengthMatch = header.match(/Content-Length: (\d+)/); - if (contentLengthMatch) { - const contentLength = parseInt(contentLengthMatch[1]); - const messageStart = headerEnd + 4; - const messageEnd = messageStart + contentLength; - if (this.messageBuffer.length >= messageEnd) { - const messageContent = this.messageBuffer.substring(messageStart, messageEnd); - this.messageBuffer = this.messageBuffer.substring(messageEnd); - try { - const message = JSON.parse(messageContent); - this.handleMessage(message); - } catch (error) { - logger.error("Failed to parse LSP message:", error, messageContent); + }).filter((event) => event !== null); + const pipelineMap = /* @__PURE__ */ new Map(); + const predicateNameToEventId = /* @__PURE__ */ new Map(); + let queryName = ""; + let queryStartTime = 0; + let queryEndTime = 0; + for (const event of events) { + switch (event.type) { + case "QUERY_STARTED": + queryName = event.queryName || ""; + queryStartTime = event.nanoTime; + break; + case "QUERY_COMPLETED": + queryEndTime = event.nanoTime; + break; + case "PREDICATE_STARTED": { + const predicateName = event.predicateName; + const position = event.position; + const predicateType = event.predicateType; + const dependencies = event.dependencies; + predicateNameToEventId.set(predicateName, event.eventId); + const dependencyEventIds = []; + const dependencyNames = []; + if (dependencies) { + for (const depName of Object.keys(dependencies)) { + dependencyNames.push(depName); + const depEventId = predicateNameToEventId.get(depName); + if (depEventId !== void 0) { + dependencyEventIds.push(depEventId); + } } - headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); - } else { - break; } - } else { - logger.error("Invalid LSP header:", header); - this.messageBuffer = ""; + pipelineMap.set(event.eventId, { + eventId: event.eventId, + name: predicateName, + position, + type: predicateType, + startTime: event.nanoTime, + dependencies: dependencyNames, + dependencyEventIds + }); break; } - } - } - handleMessage(message) { - logger.debug("Received LSP message:", message); - if (message.id !== void 0 && this.pendingResponses.has(Number(message.id))) { - const pending = this.pendingResponses.get(Number(message.id)); - this.pendingResponses.delete(Number(message.id)); - if (message.error) { - pending.reject(new Error(`LSP Error: ${message.error.message}`)); - } else { - pending.resolve(message.result); + case "PREDICATE_COMPLETED": { + const startEventId = event.startEvent; + const pipelineInfo = pipelineMap.get(startEventId); + if (pipelineInfo) { + const startEvent = events.find((e) => e.eventId === startEventId); + if (startEvent) { + const duration = (event.nanoTime - startEvent.nanoTime) / 1e6; + pipelineInfo.endTime = event.nanoTime; + pipelineInfo.duration = duration; + pipelineInfo.resultSize = event.resultSize; + pipelineInfo.tupleCount = event.tupleCount; + } + } + break; } - return; } - if (message.method === "textDocument/publishDiagnostics") { - this.emit("diagnostics", message.params); - } - } - sendMessage(message) { - if (!this.server?.stdin) { - throw new Error("Language server is not running"); - } - const messageStr = JSON.stringify(message); - const contentLength = Buffer.byteLength(messageStr, "utf8"); - const header = `Content-Length: ${contentLength}\r -\r -`; - const fullMessage = header + messageStr; - logger.debug("Sending LSP message:", fullMessage); - this.server.stdin.write(fullMessage); } - sendRequest(method, params) { - const id = this.messageId++; - const message = { - jsonrpc: "2.0", - id, - method, - params - }; - return new Promise((resolve11, reject) => { - this.pendingResponses.set(id, { resolve: resolve11, reject }); - this.sendMessage(message); - setTimeout2(() => { - if (this.pendingResponses.has(id)) { - this.pendingResponses.delete(id); - reject(new Error(`LSP request timeout for method: ${method}`)); - } - }, 1e4); - }); - } - sendNotification(method, params) { - const message = { - jsonrpc: "2.0", - method, - params - }; - this.sendMessage(message); - } - async initialize(workspaceUri) { - if (this.isInitialized) { - return; - } - logger.info("Initializing CodeQL Language Server..."); - const initParams = { - processId: process.pid, - clientInfo: { - name: "codeql-development-mcp-server", - version: getPackageVersion() - }, - capabilities: { - textDocument: { - synchronization: { - didOpen: true, - didChange: true, - didClose: true - }, - publishDiagnostics: {} - } - } - }; - if (workspaceUri) { - initParams.workspaceFolders = [{ - uri: workspaceUri, - name: "codeql-workspace" - }]; - } - await this.sendRequest("initialize", initParams); - this.sendNotification("initialized", {}); - this.isInitialized = true; - logger.info("CodeQL Language Server initialized successfully"); - } - async evaluateQL(qlCode, uri) { - if (!this.isInitialized) { - throw new Error("Language server is not initialized"); - } - const documentUri = uri || pathToFileURL(join5(getProjectTmpDir("lsp-eval"), "eval.ql")).href; - return new Promise((resolve11, reject) => { - let diagnosticsReceived = false; - const timeout = setTimeout2(() => { - if (!diagnosticsReceived) { - this.removeAllListeners("diagnostics"); - reject(new Error("Timeout waiting for diagnostics")); - } - }, 5e3); - const diagnosticsHandler = (params) => { - if (params.uri === documentUri) { - diagnosticsReceived = true; - clearTimeout(timeout); - this.removeListener("diagnostics", diagnosticsHandler); - this.sendNotification("textDocument/didClose", { - textDocument: { uri: documentUri } - }); - resolve11(params.diagnostics); - } - }; - this.on("diagnostics", diagnosticsHandler); - this.sendNotification("textDocument/didOpen", { - textDocument: { - uri: documentUri, - languageId: "ql", - version: 1, - text: qlCode - } - }); - }); - } - async shutdown() { - if (!this.server) { - return; - } - logger.info("Shutting down CodeQL Language Server..."); - try { - await this.sendRequest("shutdown", {}); - this.sendNotification("exit", {}); - } catch (error) { - logger.warn("Error during graceful shutdown:", error); - } - setTimeout2(() => { - if (this.server) { - this.server.kill("SIGTERM"); - } - }, 1e3); - this.isInitialized = false; - } - isRunning() { - return this.server !== null && !this.server.killed; - } -}; - -// src/tools/codeql/language-server-eval.ts -init_logger(); -import { join as join6, resolve as resolve6 } from "path"; -import { pathToFileURL as pathToFileURL2 } from "url"; -var globalLanguageServer = null; -function formatDiagnostics(diagnostics) { - if (diagnostics.length === 0) { - return "\u2705 No issues found in QL code"; - } - const lines = []; - lines.push(`Found ${diagnostics.length} issue(s): -`); - diagnostics.forEach((diagnostic, index) => { - const severityIcon = getSeverityIcon(diagnostic.severity); - const severityName = getSeverityName(diagnostic.severity); - const location = `Line ${diagnostic.range.start.line + 1}, Column ${diagnostic.range.start.character + 1}`; - lines.push(`${index + 1}. ${severityIcon} ${severityName} at ${location}`); - lines.push(` ${diagnostic.message}`); - if (diagnostic.source) { - lines.push(` Source: ${diagnostic.source}`); - } - if (diagnostic.code) { - lines.push(` Code: ${diagnostic.code}`); - } - lines.push(""); - }); - return lines.join("\n"); -} -function getSeverityIcon(severity) { - switch (severity) { - case 1: - return "\u274C"; - // Error - case 2: - return "\u26A0\uFE0F"; - // Warning - case 3: - return "\u2139\uFE0F"; - // Information - case 4: - return "\u{1F4A1}"; - // Hint - default: - return "\u2753"; - } -} -function getSeverityName(severity) { - switch (severity) { - case 1: - return "Error"; - case 2: - return "Warning"; - case 3: - return "Information"; - case 4: - return "Hint"; - default: - return "Unknown"; - } -} -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: resolve6(pkgRoot, "ql"), - loglevel: "WARN", - ...options + const pipelines = Array.from(pipelineMap.values()).filter((p) => p.duration !== void 0).sort((a, b) => a.eventId - b.eventId); + const totalDuration = queryEndTime > 0 ? (queryEndTime - queryStartTime) / 1e6 : 0; + return { + queryName, + totalDuration, + totalEvents: events.length, + pipelines }; - globalLanguageServer = new CodeQLLanguageServer(defaultOptions); - try { - await globalLanguageServer.start(); - const workspaceUri = pathToFileURL2(resolve6(pkgRoot, "ql")).href; - await globalLanguageServer.initialize(workspaceUri); - logger.info("CodeQL Language Server started and initialized successfully"); - return globalLanguageServer; - } catch (error) { - logger.error("Failed to start language server:", error); - globalLanguageServer = null; - throw error; - } } -async function evaluateQLCode({ - qlCode, - workspaceUri: _workspaceUri, - serverOptions = {} -}) { - try { - logger.info("Evaluating QL code via Language Server..."); - const languageServer = await getLanguageServer(serverOptions); - const evalUri = pathToFileURL2(join6(getProjectTmpDir("lsp-eval"), `eval_${Date.now()}.ql`)).href; - const diagnostics = await languageServer.evaluateQL(qlCode, evalUri); - const summary = { - errorCount: diagnostics.filter((d) => d.severity === 1).length, - warningCount: diagnostics.filter((d) => d.severity === 2).length, - infoCount: diagnostics.filter((d) => d.severity === 3).length, - hintCount: diagnostics.filter((d) => d.severity === 4).length - }; - const isValid = summary.errorCount === 0; - const formattedOutput = formatDiagnostics(diagnostics); - logger.info(`QL evaluation complete. Valid: ${isValid}, Issues: ${diagnostics.length}`); - return { - isValid, - diagnostics, - summary, - formattedOutput - }; - } catch (error) { - logger.error("Error evaluating QL code:", error); - throw new Error(`QL evaluation failed: ${error instanceof Error ? error.message : "Unknown error"}`); - } +function formatAsJson(profile) { + return JSON.stringify(profile, null, 2); } -async function shutdownLanguageServer() { - if (globalLanguageServer) { - logger.info("Shutting down CodeQL Language Server..."); - await globalLanguageServer.shutdown(); - globalLanguageServer = null; - } +function formatAsMermaid(profile) { + const lines = []; + lines.push("```mermaid"); + lines.push("graph TD"); + lines.push(""); + lines.push(` QUERY["${basename4(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms"]`); + lines.push(""); + profile.pipelines.forEach((pipeline) => { + const nodeId = `P${pipeline.eventId}`; + const duration = pipeline.duration.toFixed(2); + const resultSize = pipeline.resultSize !== void 0 ? pipeline.resultSize : "?"; + const name = pipeline.name.replace(/[<>]/g, "").substring(0, 40); + lines.push(` ${nodeId}["${name}
${duration}ms | ${resultSize} results"]`); + }); + lines.push(""); + const rootPipelines = profile.pipelines.filter((p) => p.dependencies.length === 0); + rootPipelines.forEach((pipeline) => { + lines.push(` QUERY --> P${pipeline.eventId}`); + }); + lines.push(""); + profile.pipelines.forEach((pipeline) => { + pipeline.dependencyEventIds.forEach((depEventId) => { + const duration = pipeline.duration.toFixed(2); + lines.push(` P${depEventId} -->|"${duration}ms"| P${pipeline.eventId}`); + }); + }); + lines.push(""); + lines.push(" classDef default fill:#e1f5ff,stroke:#333,stroke-width:2px"); + lines.push(" classDef query fill:#ffe1e1,stroke:#333,stroke-width:3px"); + lines.push(" class QUERY query"); + lines.push("```"); + return lines.join("\n"); } -function registerLanguageServerEvalTool(server) { +function registerProfileCodeQLQueryTool(server) { server.tool( - "codeql_language_server_eval", - "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.", + "profile_codeql_query", + "Profile the performance of a CodeQL query run against a specific database by analyzing the evaluator log JSON file", { - ql_code: z12.string().describe("The CodeQL (QL) code to evaluate for syntax and semantic errors"), - workspace_uri: z12.string().optional().describe("Optional workspace URI for context (defaults to ./ql directory)"), - search_path: z12.string().optional().describe("Optional search path for CodeQL libraries"), - log_level: z12.enum(["OFF", "ERROR", "WARN", "INFO", "DEBUG", "TRACE", "ALL"]).optional().describe("Language server log level") + query: z14.string().describe("Path to the .ql query file"), + database: z14.string().describe("Path to the CodeQL database directory"), + evaluatorLog: z14.string().optional().describe( + "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." + ), + outputDir: z14.string().optional().describe("Directory to write profiling data files (defaults to same directory as evaluator log)") }, - async ({ ql_code, workspace_uri, search_path, log_level }) => { + async (params) => { try { - const serverOptions = {}; - if (search_path) { - serverOptions.searchPath = search_path; - } - if (log_level) { - serverOptions.loglevel = log_level; - } - const result = await evaluateQLCode({ - qlCode: ql_code, - workspaceUri: workspace_uri, - serverOptions - }); - const responseContent = { - isValid: result.isValid, - summary: result.summary, - formattedOutput: result.formattedOutput, - diagnostics: result.diagnostics.map((d) => ({ - line: d.range.start.line + 1, - // Convert to 1-based line numbers - column: d.range.start.character + 1, - // Convert to 1-based column numbers - severity: getSeverityName(d.severity), - message: d.message, - code: d.code, - source: d.source - })) - }; - return { - content: [ - { - type: "text", - text: JSON.stringify(responseContent, null, 2) - } - ] - }; - } catch (error) { - logger.error("Error in language server eval tool:", error); - return { - content: [ - { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` - } - ], - isError: true - }; - } - } - ); - process.on("SIGINT", async () => { - await shutdownLanguageServer(); - }); - process.on("SIGTERM", async () => { - await shutdownLanguageServer(); - }); -} - -// src/tools/codeql/pack-install.ts -import { z as z13 } from "zod"; -var codeqlPackInstallTool = { - name: "codeql_pack_install", - description: "Install CodeQL pack dependencies", - command: "codeql", - subcommand: "pack install", - inputSchema: { - packDir: z13.string().optional().describe("Directory containing qlpack.yml (default: current)"), - force: z13.boolean().optional().describe("Force reinstall of dependencies"), - "no-strict-mode": z13.boolean().optional().describe("Allow non-strict dependency resolution"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql pack install", - "codeql pack install --force /path/to/pack", - "codeql pack install --no-strict-mode" - ] -}; - -// src/tools/codeql/pack-ls.ts -import { z as z14 } from "zod"; -var codeqlPackLsTool = { - name: "codeql_pack_ls", - description: "List CodeQL packs under some local directory path", - command: "codeql", - subcommand: "pack ls", - inputSchema: { - dir: z14.string().optional().describe("The root directory of the package or workspace, defaults to the current working directory"), - format: z14.enum(["text", "json"]).optional().describe("Output format: text (default) or json"), - groups: z14.string().optional().describe("List of CodeQL pack groups to include or exclude"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql pack ls -- .", - "codeql pack ls --format=json -- /path/to/pack-directory", - "codeql pack ls --format=json --groups=queries,tests -- ." - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/profile-codeql-query.ts -init_cli_executor(); -init_logger(); -import { z as z15 } from "zod"; -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 = readFileSync4(logPath, "utf-8"); - const jsonObjects = logContent.split("\n\n").filter((s) => s.trim()); - const events = jsonObjects.map((obj) => { - try { - return JSON.parse(obj); - } catch (_error) { - logger.warn(`Failed to parse evaluator log object: ${obj.substring(0, 100)}...`); - return null; - } - }).filter((event) => event !== null); - const pipelineMap = /* @__PURE__ */ new Map(); - const predicateNameToEventId = /* @__PURE__ */ new Map(); - let queryName = ""; - let queryStartTime = 0; - let queryEndTime = 0; - for (const event of events) { - switch (event.type) { - case "QUERY_STARTED": - queryName = event.queryName || ""; - queryStartTime = event.nanoTime; - break; - case "QUERY_COMPLETED": - queryEndTime = event.nanoTime; - break; - case "PREDICATE_STARTED": { - const predicateName = event.predicateName; - const position = event.position; - const predicateType = event.predicateType; - const dependencies = event.dependencies; - predicateNameToEventId.set(predicateName, event.eventId); - const dependencyEventIds = []; - const dependencyNames = []; - if (dependencies) { - for (const depName of Object.keys(dependencies)) { - dependencyNames.push(depName); - const depEventId = predicateNameToEventId.get(depName); - if (depEventId !== void 0) { - dependencyEventIds.push(depEventId); - } - } - } - pipelineMap.set(event.eventId, { - eventId: event.eventId, - name: predicateName, - position, - type: predicateType, - startTime: event.nanoTime, - dependencies: dependencyNames, - dependencyEventIds - }); - break; - } - case "PREDICATE_COMPLETED": { - const startEventId = event.startEvent; - const pipelineInfo = pipelineMap.get(startEventId); - if (pipelineInfo) { - const startEvent = events.find((e) => e.eventId === startEventId); - if (startEvent) { - const duration = (event.nanoTime - startEvent.nanoTime) / 1e6; - pipelineInfo.endTime = event.nanoTime; - pipelineInfo.duration = duration; - pipelineInfo.resultSize = event.resultSize; - pipelineInfo.tupleCount = event.tupleCount; - } - } - break; - } - } - } - const pipelines = Array.from(pipelineMap.values()).filter((p) => p.duration !== void 0).sort((a, b) => a.eventId - b.eventId); - const totalDuration = queryEndTime > 0 ? (queryEndTime - queryStartTime) / 1e6 : 0; - return { - queryName, - totalDuration, - totalEvents: events.length, - pipelines - }; -} -function formatAsJson(profile) { - return JSON.stringify(profile, null, 2); -} -function formatAsMermaid(profile) { - const lines = []; - lines.push("```mermaid"); - lines.push("graph TD"); - lines.push(""); - lines.push(` QUERY["${basename4(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms"]`); - lines.push(""); - profile.pipelines.forEach((pipeline) => { - const nodeId = `P${pipeline.eventId}`; - const duration = pipeline.duration.toFixed(2); - const resultSize = pipeline.resultSize !== void 0 ? pipeline.resultSize : "?"; - const name = pipeline.name.replace(/[<>]/g, "").substring(0, 40); - lines.push(` ${nodeId}["${name}
${duration}ms | ${resultSize} results"]`); - }); - lines.push(""); - const rootPipelines = profile.pipelines.filter((p) => p.dependencies.length === 0); - rootPipelines.forEach((pipeline) => { - lines.push(` QUERY --> P${pipeline.eventId}`); - }); - lines.push(""); - profile.pipelines.forEach((pipeline) => { - pipeline.dependencyEventIds.forEach((depEventId) => { - const duration = pipeline.duration.toFixed(2); - lines.push(` P${depEventId} -->|"${duration}ms"| P${pipeline.eventId}`); - }); - }); - lines.push(""); - lines.push(" classDef default fill:#e1f5ff,stroke:#333,stroke-width:2px"); - lines.push(" classDef query fill:#ffe1e1,stroke:#333,stroke-width:3px"); - lines.push(" class QUERY query"); - lines.push("```"); - return lines.join("\n"); -} -function registerProfileCodeQLQueryTool(server) { - server.tool( - "profile_codeql_query", - "Profile the performance of a CodeQL query run against a specific database by analyzing the evaluator log JSON file", - { - query: z15.string().describe("Path to the .ql query file"), - database: z15.string().describe("Path to the CodeQL database directory"), - evaluatorLog: z15.string().optional().describe( - "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." - ), - outputDir: z15.string().optional().describe("Directory to write profiling data files (defaults to same directory as evaluator log)") - }, - async (params) => { - try { - const { query, database, evaluatorLog, outputDir } = params; - let logPath = evaluatorLog; - let bqrsPath; - let sarifPath; - if (!logPath) { - logger.info("No evaluator log provided, running query to generate one"); - const defaultOutputDir = outputDir || join7(dirname6(query), "profile-output"); - mkdirSync5(defaultOutputDir, { recursive: true }); - logPath = join7(defaultOutputDir, "evaluator-log.jsonl"); - bqrsPath = join7(defaultOutputDir, "query-results.bqrs"); - sarifPath = join7(defaultOutputDir, "query-results.sarif"); - const queryResult = await executeCodeQLCommand( - "query run", + const { query, database, evaluatorLog, outputDir } = params; + let logPath = evaluatorLog; + let bqrsPath; + let sarifPath; + if (!logPath) { + logger.info("No evaluator log provided, running query to generate one"); + const defaultOutputDir = outputDir || join5(dirname6(query), "profile-output"); + mkdirSync5(defaultOutputDir, { recursive: true }); + logPath = join5(defaultOutputDir, "evaluator-log.jsonl"); + bqrsPath = join5(defaultOutputDir, "query-results.bqrs"); + sarifPath = join5(defaultOutputDir, "query-results.sarif"); + const queryResult = await executeCodeQLCommand( + "query run", { database, output: bqrsPath, @@ -5219,11 +4777,11 @@ function registerProfileCodeQLQueryTool(server) { const profile = parseEvaluatorLog(logPath); const profileOutputDir = outputDir || dirname6(logPath); mkdirSync5(profileOutputDir, { recursive: true }); - const jsonPath = join7(profileOutputDir, "query-evaluation-profile.json"); + const jsonPath = join5(profileOutputDir, "query-evaluation-profile.json"); const jsonContent = formatAsJson(profile); writeFileSync3(jsonPath, jsonContent); logger.info(`Profile JSON written to: ${jsonPath}`); - const mdPath = join7(profileOutputDir, "query-evaluation-profile.md"); + const mdPath = join5(profileOutputDir, "query-evaluation-profile.md"); const mdContent = formatAsMermaid(profile); writeFileSync3(mdPath, mdContent); logger.info(`Profile Mermaid diagram written to: ${mdPath}`); @@ -5280,20 +4838,20 @@ function registerProfileCodeQLQueryTool(server) { } // src/tools/codeql/query-compile.ts -import { z as z16 } from "zod"; +import { z as z15 } from "zod"; var codeqlQueryCompileTool = { name: "codeql_query_compile", description: "Compile and validate CodeQL queries", command: "codeql", subcommand: "query compile", inputSchema: { - query: z16.string().describe("Path to the CodeQL query file (.ql)"), - database: z16.string().optional().describe("Path to the CodeQL database"), - library: z16.string().optional().describe("Path to query library"), - output: z16.string().optional().describe("Output file path"), - warnings: z16.enum(["hide", "show", "error"]).optional().describe("How to handle compilation warnings"), - verbose: z16.boolean().optional().describe("Enable verbose output"), - additionalArgs: z16.array(z16.string()).optional().describe("Additional command-line arguments") + query: z15.string().describe("Path to the CodeQL query file (.ql)"), + database: z15.string().optional().describe("Path to the CodeQL database"), + library: z15.string().optional().describe("Path to query library"), + output: z15.string().optional().describe("Output file path"), + warnings: z15.enum(["hide", "show", "error"]).optional().describe("How to handle compilation warnings"), + verbose: z15.boolean().optional().describe("Enable verbose output"), + additionalArgs: z15.array(z15.string()).optional().describe("Additional command-line arguments") }, examples: [ "codeql query compile --database=/path/to/db MyQuery.ql", @@ -5302,7 +4860,7 @@ var codeqlQueryCompileTool = { }; // src/tools/codeql/query-format.ts -import { z as z17 } from "zod"; +import { z as z16 } from "zod"; function formatResultProcessor(result, params) { const isCheckOnly = params["check-only"]; const hasFormatChanges = result.exitCode === 1; @@ -5318,12 +4876,12 @@ var codeqlQueryFormatTool = { command: "codeql", subcommand: "query format", inputSchema: { - files: z17.array(z17.string()).describe("One or more .ql or .qll source files to format"), - output: z17.string().optional().describe("Write formatted code to this file instead of stdout"), - "in-place": z17.boolean().optional().describe("Overwrite each input file with formatted version"), - "check-only": z17.boolean().optional().describe("Check formatting without writing output"), - backup: z17.string().optional().describe("Backup extension when overwriting existing files"), - "no-syntax-errors": z17.boolean().optional().describe("Ignore syntax errors and pretend file is formatted"), + files: z16.array(z16.string()).describe("One or more .ql or .qll source files to format"), + output: z16.string().optional().describe("Write formatted code to this file instead of stdout"), + "in-place": z16.boolean().optional().describe("Overwrite each input file with formatted version"), + "check-only": z16.boolean().optional().describe("Check formatting without writing output"), + backup: z16.string().optional().describe("Backup extension when overwriting existing files"), + "no-syntax-errors": z16.boolean().optional().describe("Ignore syntax errors and pretend file is formatted"), verbose: createCodeQLSchemas.verbose(), additionalArgs: createCodeQLSchemas.additionalArgs() }, @@ -5336,33 +4894,33 @@ var codeqlQueryFormatTool = { }; // src/tools/codeql/query-run.ts -import { z as z18 } from "zod"; +import { z as z17 } from "zod"; var codeqlQueryRunTool = { name: "codeql_query_run", description: 'Execute a CodeQL query against a database. Use either "query" parameter for direct file path OR "queryName" + "queryLanguage" for pre-defined tool queries.', command: "codeql", subcommand: "query run", inputSchema: { - query: z18.string().optional().describe("Path to the CodeQL query file (.ql) - cannot be used with queryName"), - queryName: z18.string().optional().describe('Name of pre-defined query to run (e.g., "PrintAST", "CallGraphFrom", "CallGraphTo") - requires queryLanguage'), - queryLanguage: z18.string().optional().describe('Programming language for tools queries (e.g., "javascript", "java", "python") - required when using queryName'), - queryPack: z18.string().optional().describe("Query pack path (defaults to server/ql//tools/src/ for tool queries)"), - sourceFiles: z18.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")'), - sourceFunction: z18.string().optional().describe('Comma-separated list of source function names for CallGraphFrom queries (e.g., "main,processData")'), - targetFunction: z18.string().optional().describe('Comma-separated list of target function names for CallGraphTo queries (e.g., "helper,validateInput")'), + query: z17.string().optional().describe("Path to the CodeQL query file (.ql) - cannot be used with queryName"), + queryName: z17.string().optional().describe('Name of pre-defined query to run (e.g., "PrintAST", "CallGraphFrom", "CallGraphTo") - requires queryLanguage'), + queryLanguage: z17.string().optional().describe('Programming language for tools queries (e.g., "javascript", "java", "python") - required when using queryName'), + queryPack: z17.string().optional().describe("Query pack path (defaults to server/ql//tools/src/ for tool queries)"), + sourceFiles: z17.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")'), + sourceFunction: z17.string().optional().describe('Comma-separated list of source function names for CallGraphFrom queries (e.g., "main,processData")'), + targetFunction: z17.string().optional().describe('Comma-separated list of target function names for CallGraphTo queries (e.g., "helper,validateInput")'), database: createCodeQLSchemas.database(), output: createCodeQLSchemas.output(), - external: z18.array(z18.string()).optional().describe("External predicate data: predicate=file.csv"), + external: z17.array(z17.string()).optional().describe("External predicate data: predicate=file.csv"), timeout: createCodeQLSchemas.timeout(), - logDir: z18.string().optional().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/"), - "evaluator-log": z18.string().optional().describe("Path to save evaluator log (deprecated: use logDir instead)"), - "evaluator-log-minify": z18.boolean().optional().describe("Minimize evaluator log for smaller size"), - "evaluator-log-level": z18.number().min(1).max(5).optional().describe("Evaluator log verbosity level (1-5, default 5)"), - "tuple-counting": z18.boolean().optional().describe("Display tuple counts for each evaluation step in evaluator logs"), - format: z18.enum(["sarif-latest", "sarifv2.1.0", "csv", "graphtext", "dgml", "dot"]).optional().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."), - interpretedOutput: z18.string().optional().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"), - evaluationFunction: z18.string().optional().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'), - evaluationOutput: z18.string().optional().describe("[DEPRECATED - use interpretedOutput parameter instead] Output file for evaluation results"), + logDir: z17.string().optional().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/"), + "evaluator-log": z17.string().optional().describe("Path to save evaluator log (deprecated: use logDir instead)"), + "evaluator-log-minify": z17.boolean().optional().describe("Minimize evaluator log for smaller size"), + "evaluator-log-level": z17.number().min(1).max(5).optional().describe("Evaluator log verbosity level (1-5, default 5)"), + "tuple-counting": z17.boolean().optional().describe("Display tuple counts for each evaluation step in evaluator logs"), + format: z17.enum(["sarif-latest", "sarifv2.1.0", "csv", "graphtext", "dgml", "dot"]).optional().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."), + interpretedOutput: z17.string().optional().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"), + evaluationFunction: z17.string().optional().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'), + evaluationOutput: z17.string().optional().describe("[DEPRECATED - use interpretedOutput parameter instead] Output file for evaluation results"), verbose: createCodeQLSchemas.verbose(), additionalArgs: createCodeQLSchemas.additionalArgs() }, @@ -5377,8 +4935,8 @@ var codeqlQueryRunTool = { }; // src/tools/codeql/quick-evaluate.ts -import { z as z19 } from "zod"; -import { join as join8, resolve as resolve7 } from "path"; +import { z as z18 } from "zod"; +import { join as join6, resolve as resolve6 } from "path"; init_logger(); async function quickEvaluate({ file, @@ -5396,548 +4954,1870 @@ async function quickEvaluate({ throw new Error(`Symbol '${symbol}' not found as class or predicate in file: ${file}`); } } - const resolvedOutput = resolve7(output_path || join8(getProjectTmpDir("quickeval"), "quickeval.bqrs")); - return resolvedOutput; - } catch (error) { - throw new Error(`CodeQL evaluation failed: ${error instanceof Error ? error.message : "Unknown error"}`); + const resolvedOutput = resolve6(output_path || join6(getProjectTmpDir("quickeval"), "quickeval.bqrs")); + return resolvedOutput; + } catch (error) { + throw new Error(`CodeQL evaluation failed: ${error instanceof Error ? error.message : "Unknown error"}`); + } +} +function registerQuickEvaluateTool(server) { + server.tool( + "quick_evaluate", + "Quick evaluate either a class or a predicate in a CodeQL query for debugging", + { + file: z18.string().describe("Path to the .ql file containing the symbol"), + db: z18.string().describe("Path to the CodeQL database"), + symbol: z18.string().describe("Name of the class or predicate to evaluate"), + output_path: z18.string().optional().describe("Output path for results (defaults to project-local .tmp/quickeval/)") + }, + async ({ file, db, symbol, output_path }) => { + try { + const result = await quickEvaluate({ file, db, symbol, output_path }); + return { + content: [{ type: "text", text: result }] + }; + } catch (error) { + logger.error("Error in quick evaluate:", error); + return { + content: [ + { + type: "text", + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + } + ], + isError: true + }; + } + } + ); +} + +// src/tools/codeql/register-database.ts +init_logger(); +import { z as z19 } from "zod"; +import { access, constants } from "fs/promises"; +import { resolve as resolve7 } from "path"; +async function registerDatabase(dbPath) { + try { + const resolvedPath = resolve7(dbPath); + await access(resolvedPath, constants.F_OK); + const dbYmlPath = resolve7(resolvedPath, "codeql-database.yml"); + await access(dbYmlPath, constants.F_OK); + const srcZipPath = resolve7(resolvedPath, "src.zip"); + const srcDirPath = resolve7(resolvedPath, "src"); + let hasSrcZip = false; + let hasSrcDir = false; + try { + await access(srcZipPath, constants.F_OK); + hasSrcZip = true; + } catch { + } + if (!hasSrcZip) { + try { + await access(srcDirPath, constants.F_OK); + hasSrcDir = true; + } catch { + } + } + if (!hasSrcZip && !hasSrcDir) { + throw new Error(`Missing required source archive (src.zip) or source directory (src/) in: ${dbPath}`); + } + const sourceType = hasSrcZip ? "src.zip" : "src/"; + return `Database registered: ${dbPath} (source: ${sourceType})`; + } catch (error) { + if (error instanceof Error) { + const errorCode = error.code; + if (errorCode === "ENOENT") { + if (error.message.includes("codeql-database.yml")) { + throw new Error(`Missing required codeql-database.yml in: ${dbPath}`); + } + throw new Error(`Database path does not exist: ${dbPath}`); + } + if (errorCode === "EACCES") { + throw new Error(`Database path does not exist: ${dbPath}`); + } + } + throw new Error(`Failed to register database: ${error instanceof Error ? error.message : "Unknown error"}`); + } +} +function registerRegisterDatabaseTool(server) { + server.tool( + "register_database", + "Register a CodeQL database given a local path to the database directory", + { + db_path: z19.string().describe("Path to the CodeQL database directory") + }, + async ({ db_path }) => { + try { + const result = await registerDatabase(db_path); + return { + content: [{ type: "text", text: result }] + }; + } catch (error) { + logger.error("Error registering database:", error); + return { + content: [ + { + type: "text", + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + } + ], + isError: true + }; + } + } + ); +} + +// src/tools/codeql/resolve-database.ts +import { z as z20 } from "zod"; +var codeqlResolveDatabaseTool = { + name: "codeql_resolve_database", + description: "Resolve database path and validate database structure", + command: "codeql", + subcommand: "resolve database", + inputSchema: { + database: z20.string().describe("Database path to resolve"), + format: z20.enum(["text", "json", "betterjson"]).optional().describe("Output format for database information"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql resolve database -- /path/to/database", + "codeql resolve database --format=json -- my-database", + "codeql resolve database --format=betterjson -- database-dir" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/resolve-languages.ts +import { z as z21 } from "zod"; +var codeqlResolveLanguagesTool = { + name: "codeql_resolve_languages", + description: "List installed CodeQL extractor packs", + command: "codeql", + subcommand: "resolve languages", + inputSchema: { + format: z21.enum(["text", "json", "betterjson"]).optional().describe("Output format for language information"), + verbose: z21.boolean().optional().describe("Enable verbose output"), + additionalArgs: z21.array(z21.string()).optional().describe("Additional command-line arguments") + }, + examples: [ + "codeql resolve languages --format=text", + "codeql resolve languages --format=json", + "codeql resolve languages --format=betterjson" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/resolve-library-path.ts +import { z as z22 } from "zod"; +var codeqlResolveLibraryPathTool = { + name: "codeql_resolve_library-path", + description: "Resolve library path for CodeQL queries and libraries", + command: "codeql", + subcommand: "resolve library-path", + inputSchema: { + language: z22.string().optional().describe("Programming language to resolve library path for"), + format: z22.enum(["text", "json", "betterjson"]).optional().describe("Output format for library path information"), + verbose: z22.boolean().optional().describe("Enable verbose output"), + additionalArgs: z22.array(z22.string()).optional().describe("Additional command-line arguments") + }, + examples: [ + "codeql resolve library-path --language=java", + "codeql resolve library-path --format=json --language=python", + "codeql resolve library-path --format=betterjson" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/resolve-metadata.ts +import { z as z23 } from "zod"; +var codeqlResolveMetadataTool = { + name: "codeql_resolve_metadata", + description: "Resolve and return the key-value metadata pairs from a CodeQL query source file.", + command: "codeql", + subcommand: "resolve metadata", + inputSchema: { + query: z23.string().describe("Query file to resolve metadata for"), + format: z23.enum(["json"]).optional().describe("Output format for metadata information (always JSON, optional for future compatibility)"), + verbose: z23.boolean().optional().describe("Enable verbose output"), + additionalArgs: z23.array(z23.string()).optional().describe("Additional command-line arguments") + }, + examples: [ + "codeql resolve metadata -- relative-path/2/MyQuery.ql", + "codeql resolve metadata --format=json -- /absolute-plus/relative-path/2/MyQuery.ql" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/resolve-qlref.ts +import { z as z24 } from "zod"; +var codeqlResolveQlrefTool = { + name: "codeql_resolve_qlref", + description: "Resolve qlref files to their corresponding query files", + command: "codeql", + subcommand: "resolve qlref", + inputSchema: { + qlref: z24.string().describe("Path to the .qlref file to resolve"), + format: z24.enum(["text", "json", "betterjson"]).optional().describe("Output format for qlref resolution"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql resolve qlref -- test/MyQuery.qlref", + "codeql resolve qlref --format=json -- test/MyQuery.qlref", + "codeql resolve qlref --format=betterjson -- test/MyQuery.qlref" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/resolve-queries.ts +import { z as z25 } from "zod"; +var jsonOnlyResultProcessor = (result, params) => { + if (!result.success) { + return `Command failed (exit code ${result.exitCode || "unknown"}): +${result.error || result.stderr}`; + } + if (params.format === "json" || params.format === "betterjson" || params.format === "bylanguage") { + return result.stdout || "[]"; + } + let output = ""; + if (result.stdout) { + output += result.stdout; + } + if (result.stderr) { + if (output) { + output += "\n\nWarnings/Info:\n"; + } + output += result.stderr; + } + if (!output) { + output = "Command executed successfully (no output)"; + } + return output; +}; +var codeqlResolveQueriesTool = { + name: "codeql_resolve_queries", + description: "List available CodeQL queries found on the local filesystem", + command: "codeql", + subcommand: "resolve queries", + inputSchema: { + directory: z25.string().optional().describe("Directory to search for queries"), + language: z25.string().optional().describe("Filter queries by programming language"), + format: z25.enum(["text", "json", "betterjson", "bylanguage"]).optional().describe("Output format for query list"), + "additional-packs": z25.union([z25.string(), z25.array(z25.string())]).optional().describe("Additional pack directories to search for CodeQL packs"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql resolve queries", + "codeql resolve queries --language=java --format=json", + "codeql resolve queries --format=betterjson -- /path/to/queries", + "codeql resolve queries --additional-packs=/path/to/packs codeql/java-queries" + ], + resultProcessor: jsonOnlyResultProcessor +}; + +// src/tools/codeql/resolve-tests.ts +import { z as z26 } from "zod"; +var codeqlResolveTestsTool = { + name: "codeql_resolve_tests", + description: "Resolve the local filesystem paths of unit tests and/or queries under some base directory", + command: "codeql", + subcommand: "resolve tests", + inputSchema: { + tests: z26.array(z26.string()).optional().describe("One or more tests (.ql, .qlref files, or test directories)"), + format: z26.enum(["text", "json"]).optional().describe("Output format for test list"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql resolve tests", + "codeql resolve tests --format=json -- test-directory", + "codeql resolve tests --format=json -- test1.ql test2.ql" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/test-accept.ts +import { z as z27 } from "zod"; +var codeqlTestAcceptTool = { + name: "codeql_test_accept", + description: "Accept new test results as the expected baseline", + command: "codeql", + subcommand: "test accept", + inputSchema: { + tests: z27.array(z27.string()).describe("One or more tests (.ql, .qlref files, or test directories)"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql test accept -- languages/java/test/MyQuery/MyQuery.qlref", + "codeql test accept -- languages/java/test/MyQuery/", + "codeql test accept -- languages/java/src/MyQuery/MyQuery.ql" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/test-extract.ts +import { z as z28 } from "zod"; +var codeqlTestExtractTool = { + name: "codeql_test_extract", + description: "Extract test databases for CodeQL query tests", + command: "codeql", + subcommand: "test extract", + inputSchema: { + tests: z28.array(z28.string()).describe("One or more test directories or files"), + language: z28.string().optional().describe("Programming language for extraction"), + threads: createCodeQLSchemas.threads(), + ram: createCodeQLSchemas.ram(), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql test extract -- languages/java/test/MyQuery/", + "codeql test extract --language=java --threads=4 -- test-directory", + "codeql test extract --threads=2 --ram=2048 -- multiple/test/directories" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/test-run.ts +import { z as z29 } from "zod"; +var codeqlTestRunTool = { + name: "codeql_test_run", + description: "Run CodeQL query tests", + command: "codeql", + subcommand: "test run", + inputSchema: { + tests: z29.array(z29.string()).describe("One or more tests (.ql, .qlref files, or test directories)"), + "show-extractor-output": z29.boolean().optional().describe("Show output from extractors during test execution"), + "keep-databases": z29.boolean().optional().describe("Keep test databases after running tests"), + "learn": z29.boolean().optional().describe("Accept current output as expected for failing tests"), + logDir: z29.string().optional().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/"), + threads: createCodeQLSchemas.threads(), + ram: createCodeQLSchemas.ram(), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql test run /path/to/tests", + "codeql test run --learn /path/to/failing/tests", + "codeql test run --threads=4 --keep-databases /path/to/tests", + "codeql test run --log-dir=/custom/log/path /path/to/tests" + ] +}; + +// src/tools/codeql-tools.ts +import { z as z30 } from "zod"; + +// src/lib/validation.ts +function validateCodeQLSyntax(query, _language) { + const validation = { + isValid: true, + errors: [], + warnings: [], + suggestions: [] + }; + if (!query.trim()) { + validation.isValid = false; + validation.errors.push("Query cannot be empty"); + return validation; + } + if (!query.includes("from") && !query.includes("select")) { + validation.warnings.push('Query should typically include "from" and "select" clauses'); + } + if (!query.includes("@name") && !query.includes("@description")) { + validation.suggestions.push("Consider adding @name and @description metadata"); + } + return validation; +} + +// src/lib/query-scaffolding.ts +import * as fs2 from "fs"; +import * as path2 from "path"; +function getLanguageExtension2(language) { + const extensions = { + javascript: "js", + typescript: "ts", + python: "py", + java: "java", + csharp: "cs", + cpp: "cpp", + go: "go", + ruby: "rb", + actions: "yml" + }; + return extensions[language.toLowerCase()] || "txt"; +} +function generateQueryTemplate(queryName, language, description, queryId) { + const desc = description || `${queryName} query`; + const id = queryId || `${language}/example/${queryName.toLowerCase()}`; + return `/** + * @id ${id} + * @name ${queryName} + * @description ${desc} + * @kind problem + * @precision medium + * @problem.severity warning + */ + +import ${language} + +// TODO: Implement query logic +from File f +where f.getBaseName() = "${queryName}.${getLanguageExtension2(language)}" +select f, "TODO: Add query logic" +`; +} +function createCodeQLQuery(options) { + const { basePath, queryName, language, description, queryId } = options; + const absoluteBasePath = path2.resolve(basePath); + const srcDir = path2.join(absoluteBasePath, "src", queryName); + const testDir = path2.join(absoluteBasePath, "test", queryName); + const queryPath = path2.join(srcDir, `${queryName}.ql`); + const qlrefPath = path2.join(testDir, `${queryName}.qlref`); + const testCodePath = path2.join(testDir, `${queryName}.${getLanguageExtension2(language)}`); + const filesCreated = []; + try { + fs2.mkdirSync(srcDir, { recursive: true }); + fs2.mkdirSync(testDir, { recursive: true }); + try { + const queryContent = generateQueryTemplate(queryName, language, description, queryId); + fs2.writeFileSync(queryPath, queryContent, { encoding: "utf8", flag: "wx" }); + filesCreated.push(queryPath); + } catch (e) { + const err = e; + if (err.code !== "EEXIST") throw e; + } + try { + const qlrefContent = `${queryName}/${queryName}.ql +`; + fs2.writeFileSync(qlrefPath, qlrefContent, { encoding: "utf8", flag: "wx" }); + filesCreated.push(qlrefPath); + } catch (e) { + const err = e; + if (err.code !== "EEXIST") throw e; + } + try { + const testCodeContent = `// Test code for ${queryName} +// TODO: Add test cases +`; + fs2.writeFileSync(testCodePath, testCodeContent, { encoding: "utf8", flag: "wx" }); + filesCreated.push(testCodePath); + } catch (e) { + const err = e; + if (err.code !== "EEXIST") throw e; + } + return { + queryPath, + testPath: testDir, + qlrefPath, + testCodePath, + filesCreated + }; + } catch (error) { + throw new Error(`Failed to create query scaffolding: ${error instanceof Error ? error.message : "Unknown error"}`); + } +} + +// src/tools/codeql-tools.ts +init_logger(); +function registerCodeQLTools(server) { + server.tool( + "validate_codeql_query", + "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_lsp_diagnostics instead.", + { + query: z30.string().describe("The CodeQL query to validate"), + language: z30.string().optional().describe("Target programming language") + }, + async ({ query, language }) => { + try { + const validation = validateCodeQLSyntax(query, language); + return { + content: [{ type: "text", text: JSON.stringify(validation, null, 2) }] + }; + } catch (error) { + logger.error("Error validating CodeQL query:", error); + return { + content: [ + { + type: "text", + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + } + ], + isError: true + }; + } + } + ); + server.tool( + "create_codeql_query", + "Create directory structure and files for a new CodeQL query with tests", + { + basePath: z30.string().describe("Base path where src/ and test/ directories will be created"), + queryName: z30.string().describe("Name of the query (e.g., MySecurityQuery)"), + language: z30.string().describe("Target programming language (e.g., javascript, python, java)"), + description: z30.string().optional().describe("Description of what the query does"), + queryId: z30.string().optional().describe("Custom query ID (defaults to language/example/queryname)") + }, + async ({ basePath, queryName, language, description, queryId }) => { + try { + const result = createCodeQLQuery({ + basePath, + queryName, + language, + description, + queryId + }); + const summary = { + success: true, + queryPath: result.queryPath, + testPath: result.testPath, + qlrefPath: result.qlrefPath, + testCodePath: result.testCodePath, + filesCreated: result.filesCreated, + nextSteps: [ + "Review and customize the generated query in: " + result.queryPath, + "Add test cases to: " + result.testCodePath, + "Run codeql_pack_install to install dependencies", + "Run codeql_test_extract to create test database", + "Run codeql_test_run to execute tests" + ] + }; + return { + content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] + }; + } catch (error) { + logger.error("Error creating CodeQL query:", error); + return { + content: [ + { + type: "text", + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + } + ], + isError: true + }; + } + } + ); + registerCLITool(server, codeqlBqrsDecodeTool); + registerCLITool(server, codeqlBqrsInfoTool); + registerCLITool(server, codeqlBqrsInterpretTool); + registerCLITool(server, codeqlDatabaseAnalyzeTool); + registerCLITool(server, codeqlDatabaseCreateTool); + registerCLITool(server, codeqlGenerateLogSummaryTool); + registerCLITool(server, codeqlGenerateQueryHelpTool); + registerCLITool(server, codeqlPackInstallTool); + registerCLITool(server, codeqlPackLsTool); + registerCLITool(server, codeqlQueryCompileTool); + registerCLITool(server, codeqlQueryFormatTool); + registerCLITool(server, codeqlQueryRunTool); + registerCLITool(server, codeqlResolveDatabaseTool); + registerCLITool(server, codeqlResolveLanguagesTool); + registerCLITool(server, codeqlResolveLibraryPathTool); + registerCLITool(server, codeqlResolveMetadataTool); + registerCLITool(server, codeqlResolveQlrefTool); + registerCLITool(server, codeqlResolveQueriesTool); + registerCLITool(server, codeqlResolveTestsTool); + registerCLITool(server, codeqlTestAcceptTool); + registerCLITool(server, codeqlTestExtractTool); + registerCLITool(server, codeqlTestRunTool); + registerFindClassPositionTool(server); + registerFindCodeQLQueryFilesTool(server); + registerFindPredicatePositionTool(server); + registerProfileCodeQLQueryTool(server); + registerQuickEvaluateTool(server); + registerRegisterDatabaseTool(server); +} + +// src/lib/resources.ts +import { readFileSync as readFileSync5 } from "fs"; +import { join as join8, 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 readFileSync5(join8(__dirname2, "../resources/getting-started.md"), "utf-8"); + } catch { + return "Getting started guide not available"; + } +} +function getQueryBasicsGuide() { + try { + return readFileSync5(join8(__dirname2, "../resources/query-basics.md"), "utf-8"); + } catch { + return "Query basics guide not available"; + } +} +function getSecurityTemplates() { + try { + return readFileSync5(join8(__dirname2, "../resources/security-templates.md"), "utf-8"); + } catch { + return "Security templates not available"; + } +} +function getPerformancePatterns() { + try { + return readFileSync5(join8(__dirname2, "../resources/performance-patterns.md"), "utf-8"); + } catch { + return "Performance patterns not available"; + } +} + +// src/tools/codeql-resources.ts +function registerCodeQLResources(server) { + server.resource( + "CodeQL Getting Started", + "codeql://learning/getting-started", + { + description: "Comprehensive introduction to CodeQL for beginners", + mimeType: "text/markdown" + }, + async () => { + return { + contents: [ + { + uri: "codeql://learning/getting-started", + mimeType: "text/markdown", + text: getGettingStartedGuide() + } + ] + }; + } + ); + server.resource( + "CodeQL Query Basics", + "codeql://learning/query-basics", + { + description: "Learn the fundamentals of writing CodeQL queries", + mimeType: "text/markdown" + }, + async () => { + return { + contents: [ + { + uri: "codeql://learning/query-basics", + mimeType: "text/markdown", + text: getQueryBasicsGuide() + } + ] + }; + } + ); + server.resource( + "CodeQL Security Templates", + "codeql://templates/security", + { + description: "Ready-to-use security query templates", + mimeType: "text/markdown" + }, + async () => { + return { + contents: [ + { + uri: "codeql://templates/security", + mimeType: "text/markdown", + text: getSecurityTemplates() + } + ] + }; + } + ); + server.resource( + "CodeQL Performance Patterns", + "codeql://patterns/performance", + { + description: "Best practices for writing efficient CodeQL queries", + mimeType: "text/markdown" + }, + async () => { + return { + contents: [ + { + uri: "codeql://patterns/performance", + mimeType: "text/markdown", + text: getPerformancePatterns() + } + ] + }; + } + ); +} + +// src/tools/lsp/lsp-diagnostics.ts +import { z as z31 } from "zod"; + +// src/lib/server-manager.ts +import { mkdirSync as mkdirSync7 } from "fs"; +import { join as join10 } from "path"; +import { randomUUID } from "crypto"; + +// src/lib/server-config.ts +import { createHash } from "crypto"; +function computeConfigHash(type2, config) { + const sortKeys = (_key, value) => { + if (value && typeof value === "object" && !Array.isArray(value)) { + const sorted = {}; + for (const k of Object.keys(value).sort()) { + sorted[k] = value[k]; + } + return sorted; + } + return value; + }; + const canonical = JSON.stringify({ config, type: type2 }, sortKeys); + return createHash("sha256").update(canonical).digest("hex"); +} +function buildQueryServerArgs(config) { + const args = [ + "execute", + "query-server2" + ]; + if (config.searchPath) { + args.push(`--search-path=${config.searchPath}`); + } + if (config.commonCaches) { + args.push(`--common-caches=${config.commonCaches}`); + } + if (config.logdir) { + args.push(`--logdir=${config.logdir}`); + } + if (config.threads !== void 0) { + args.push(`--threads=${config.threads}`); + } + if (config.timeout !== void 0) { + args.push(`--timeout=${config.timeout}`); + } + if (config.maxDiskCache !== void 0) { + args.push(`--max-disk-cache=${config.maxDiskCache}`); + } + if (config.evaluatorLog) { + args.push(`--evaluator-log=${config.evaluatorLog}`); + } + if (config.tupleCounting) { + args.push("--tuple-counting"); + } + if (config.debug) { + args.push("--debug"); + args.push("--tuple-counting"); + } + return args; +} +function buildCLIServerArgs(config) { + const args = [ + "execute", + "cli-server" + ]; + if (config.commonCaches) { + args.push(`--common-caches=${config.commonCaches}`); + } + if (config.logdir) { + args.push(`--logdir=${config.logdir}`); + } + return args; +} + +// src/lib/language-server.ts +init_logger(); +init_package_paths(); +import { spawn } from "child_process"; +import { EventEmitter } from "events"; +import { setTimeout as setTimeout2, clearTimeout } from "timers"; +import { pathToFileURL } from "url"; +import { delimiter as delimiter2, join as join9 } from "path"; +init_cli_executor(); +var CodeQLLanguageServer = class extends EventEmitter { + constructor(_options = {}) { + super(); + this._options = _options; + } + server = null; + messageId = 1; + pendingResponses = /* @__PURE__ */ new Map(); + isInitialized = false; + currentWorkspaceUri; + messageBuffer = ""; + async start() { + if (this.server) { + throw new Error("Language server is already running"); + } + logger.info("Starting CodeQL Language Server..."); + const args = [ + "execute", + "language-server", + "--check-errors=ON_CHANGE" + ]; + if (this._options.searchPath) { + args.push(`--search-path=${this._options.searchPath}`); + } + if (this._options.logdir) { + args.push(`--logdir=${this._options.logdir}`); + } + if (this._options.loglevel) { + args.push(`--loglevel=${this._options.loglevel}`); + } + if (this._options.synchronous) { + args.push("--synchronous"); + } + 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"], + env: spawnEnv + }); + this.server.stderr?.on("data", (data) => { + logger.debug("CodeQL LS stderr:", data.toString()); + }); + this.server.stdout?.on("data", (data) => { + this.handleStdout(data); + }); + this.server.on("error", (error) => { + logger.error("CodeQL Language Server error:", error); + this.emit("error", error); + }); + this.server.on("exit", (code) => { + logger.info("CodeQL Language Server exited with code:", code); + this.server = null; + this.isInitialized = false; + this.emit("exit", code); + }); + await new Promise((resolve12) => setTimeout2(resolve12, 2e3)); + } + handleStdout(data) { + this.messageBuffer += data.toString(); + let headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); + while (headerEnd !== -1) { + const header = this.messageBuffer.substring(0, headerEnd); + const contentLengthMatch = header.match(/Content-Length: (\d+)/); + if (contentLengthMatch) { + const contentLength = parseInt(contentLengthMatch[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + if (this.messageBuffer.length >= messageEnd) { + const messageContent = this.messageBuffer.substring(messageStart, messageEnd); + this.messageBuffer = this.messageBuffer.substring(messageEnd); + try { + const message = JSON.parse(messageContent); + this.handleMessage(message); + } catch (error) { + logger.error("Failed to parse LSP message:", error, messageContent); + } + headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); + } else { + break; + } + } else { + logger.error("Invalid LSP header:", header); + this.messageBuffer = ""; + break; + } + } + } + handleMessage(message) { + logger.debug("Received LSP message:", message); + if (message.id !== void 0 && this.pendingResponses.has(Number(message.id))) { + const pending = this.pendingResponses.get(Number(message.id)); + this.pendingResponses.delete(Number(message.id)); + if (message.error) { + pending.reject(new Error(`LSP Error: ${message.error.message}`)); + } else { + pending.resolve(message.result); + } + return; + } + if (message.method === "textDocument/publishDiagnostics") { + this.emit("diagnostics", message.params); + } + } + sendMessage(message) { + if (!this.server?.stdin) { + throw new Error("Language server is not running"); + } + const messageStr = JSON.stringify(message); + const contentLength = Buffer.byteLength(messageStr, "utf8"); + const header = `Content-Length: ${contentLength}\r +\r +`; + const fullMessage = header + messageStr; + logger.debug("Sending LSP message:", fullMessage); + this.server.stdin.write(fullMessage); + } + sendRequest(method, params) { + const id = this.messageId++; + const message = { + jsonrpc: "2.0", + id, + method, + params + }; + return new Promise((resolve12, reject) => { + this.pendingResponses.set(id, { resolve: resolve12, reject }); + this.sendMessage(message); + setTimeout2(() => { + if (this.pendingResponses.has(id)) { + this.pendingResponses.delete(id); + reject(new Error(`LSP request timeout for method: ${method}`)); + } + }, 1e4); + }); + } + sendNotification(method, params) { + const message = { + jsonrpc: "2.0", + method, + params + }; + this.sendMessage(message); + } + /** + * Initialize the language server with an optional workspace URI. + * + * If the server is already initialized with a different workspace, a + * `workspace/didChangeWorkspaceFolders` notification is sent to update + * the workspace context instead of requiring a full restart. + */ + async initialize(workspaceUri) { + if (this.isInitialized) { + if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) { + await this.updateWorkspace(workspaceUri); + } + return; + } + logger.info("Initializing CodeQL Language Server..."); + const initParams = { + processId: process.pid, + clientInfo: { + name: "codeql-development-mcp-server", + version: getPackageVersion() + }, + capabilities: { + textDocument: { + completion: { completionItem: { snippetSupport: false } }, + definition: {}, + publishDiagnostics: {}, + references: {}, + synchronization: { + didClose: true, + didChange: true, + didOpen: true + } + }, + workspace: { + workspaceFolders: true + } + } + }; + if (workspaceUri) { + initParams.workspaceFolders = [{ + uri: workspaceUri, + name: "codeql-workspace" + }]; + } + await this.sendRequest("initialize", initParams); + this.sendNotification("initialized", {}); + this.currentWorkspaceUri = workspaceUri; + this.isInitialized = true; + logger.info("CodeQL Language Server initialized successfully"); + } + /** + * Update the workspace folders on a running, initialized server. + */ + async updateWorkspace(newUri) { + logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`); + const removed = this.currentWorkspaceUri ? [{ uri: this.currentWorkspaceUri, name: "codeql-workspace" }] : []; + this.sendNotification("workspace/didChangeWorkspaceFolders", { + event: { + added: [{ uri: newUri, name: "codeql-workspace" }], + removed + } + }); + this.currentWorkspaceUri = newUri; + } + /** + * Get the current workspace URI. + */ + getWorkspaceUri() { + return this.currentWorkspaceUri; + } + async evaluateQL(qlCode, uri) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); + } + const documentUri = uri || pathToFileURL(join9(getProjectTmpDir("lsp-eval"), "eval.ql")).href; + return new Promise((resolve12, reject) => { + let diagnosticsReceived = false; + const timeout = setTimeout2(() => { + if (!diagnosticsReceived) { + this.removeAllListeners("diagnostics"); + reject(new Error("Timeout waiting for diagnostics")); + } + }, 5e3); + const diagnosticsHandler = (params) => { + if (params.uri === documentUri) { + diagnosticsReceived = true; + clearTimeout(timeout); + this.removeListener("diagnostics", diagnosticsHandler); + this.sendNotification("textDocument/didClose", { + textDocument: { uri: documentUri } + }); + resolve12(params.diagnostics); + } + }; + this.on("diagnostics", diagnosticsHandler); + this.sendNotification("textDocument/didOpen", { + textDocument: { + uri: documentUri, + languageId: "ql", + version: 1, + text: qlCode + } + }); + }); + } + // ---- LSP feature methods (issue #1) ---- + /** + * Get code completions at a position in a document. + */ + async getCompletions(params) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); + } + const result = await this.sendRequest("textDocument/completion", params); + if (result && typeof result === "object" && "items" in result) { + return result.items; + } + return result || []; + } + /** + * Find the definition(s) of a symbol at a position. + */ + async getDefinition(params) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); + } + const result = await this.sendRequest("textDocument/definition", params); + return this.normalizeLocations(result); + } + /** + * Find all references to a symbol at a position. + */ + async getReferences(params) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); + } + const result = await this.sendRequest("textDocument/references", { + ...params, + context: params.context ?? { includeDeclaration: true } + }); + return this.normalizeLocations(result); + } + /** + * Open a text document in the language server. + * The document must be opened before requesting completions, definitions, etc. + */ + openDocument(uri, text, languageId = "ql", version = 1) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); + } + this.sendNotification("textDocument/didOpen", { + textDocument: { uri, languageId, version, text } + }); + } + /** + * Close a text document in the language server. + */ + closeDocument(uri) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); + } + this.sendNotification("textDocument/didClose", { + textDocument: { uri } + }); + } + /** + * Normalize a definition/references/implementation result to Location[]. + * The LSP spec allows Location | Location[] | LocationLink[]. + */ + normalizeLocations(result) { + if (!result) return []; + if (Array.isArray(result)) { + return result.map((item) => { + if ("targetUri" in item) { + return { uri: item.targetUri, range: item.targetRange }; + } + return item; + }); + } + if (typeof result === "object" && "uri" in result) { + return [result]; + } + return []; } -} -function registerQuickEvaluateTool(server) { - server.tool( - "quick_evaluate", - "Quick evaluate either a class or a predicate in a CodeQL query for debugging", - { - file: z19.string().describe("Path to the .ql file containing the symbol"), - db: z19.string().describe("Path to the CodeQL database"), - symbol: z19.string().describe("Name of the class or predicate to evaluate"), - output_path: z19.string().optional().describe("Output path for results (defaults to project-local .tmp/quickeval/)") - }, - async ({ file, db, symbol, output_path }) => { - try { - const result = await quickEvaluate({ file, db, symbol, output_path }); - return { - content: [{ type: "text", text: result }] - }; - } catch (error) { - logger.error("Error in quick evaluate:", error); - return { - content: [ - { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` - } - ], - isError: true - }; - } + async shutdown() { + if (!this.server) { + return; } - ); -} - -// src/tools/codeql/register-database.ts -init_logger(); -import { z as z20 } from "zod"; -import { access, constants } from "fs/promises"; -import { resolve as resolve8 } from "path"; -async function registerDatabase(dbPath) { - try { - const resolvedPath = resolve8(dbPath); - await access(resolvedPath, constants.F_OK); - const dbYmlPath = resolve8(resolvedPath, "codeql-database.yml"); - await access(dbYmlPath, constants.F_OK); - const srcZipPath = resolve8(resolvedPath, "src.zip"); - const srcDirPath = resolve8(resolvedPath, "src"); - let hasSrcZip = false; - let hasSrcDir = false; + logger.info("Shutting down CodeQL Language Server..."); try { - await access(srcZipPath, constants.F_OK); - hasSrcZip = true; - } catch { + await this.sendRequest("shutdown", {}); + this.sendNotification("exit", {}); + } catch (error) { + logger.warn("Error during graceful shutdown:", error); } - if (!hasSrcZip) { - try { - await access(srcDirPath, constants.F_OK); - hasSrcDir = true; - } catch { + setTimeout2(() => { + if (this.server) { + this.server.kill("SIGTERM"); } + }, 1e3); + this.isInitialized = false; + } + isRunning() { + return this.server !== null && !this.server.killed; + } +}; + +// src/lib/query-server.ts +import { spawn as spawn2 } from "child_process"; +import { delimiter as delimiter3 } from "path"; +import { EventEmitter as EventEmitter2 } from "events"; +import { clearTimeout as clearTimeout2, setTimeout as setTimeout3 } from "timers"; +init_cli_executor(); +init_logger(); +var CodeQLQueryServer = class extends EventEmitter2 { + messageBuffer = ""; + messageId = 1; + pendingRequests = /* @__PURE__ */ new Map(); + process = null; + config; + constructor(config) { + super(); + this.config = config; + } + /** + * Start the query-server2 process. + */ + async start() { + if (this.process) { + throw new Error("Query server is already running"); } - if (!hasSrcZip && !hasSrcDir) { - throw new Error(`Missing required source archive (src.zip) or source directory (src/) in: ${dbPath}`); + logger.info("Starting CodeQL Query Server (query-server2)..."); + const args = buildQueryServerArgs(this.config); + const spawnEnv = { ...process.env }; + const codeqlDir = getResolvedCodeQLDir(); + if (codeqlDir && spawnEnv.PATH) { + spawnEnv.PATH = `${codeqlDir}${delimiter3}${spawnEnv.PATH}`; + } else if (codeqlDir) { + spawnEnv.PATH = codeqlDir; } - const sourceType = hasSrcZip ? "src.zip" : "src/"; - return `Database registered: ${dbPath} (source: ${sourceType})`; - } catch (error) { - if (error instanceof Error) { - const errorCode = error.code; - if (errorCode === "ENOENT") { - if (error.message.includes("codeql-database.yml")) { - throw new Error(`Missing required codeql-database.yml in: ${dbPath}`); + this.process = spawn2("codeql", args, { + stdio: ["pipe", "pipe", "pipe"], + env: spawnEnv + }); + this.process.stderr?.on("data", (data) => { + logger.debug("QueryServer2 stderr:", data.toString()); + }); + this.process.stdout?.on("data", (data) => { + this.handleStdout(data); + }); + this.process.on("error", (error) => { + logger.error("Query server process error:", error); + this.emit("error", error); + }); + this.process.on("exit", (code) => { + logger.info(`Query server exited with code: ${code}`); + this.rejectAllPending(new Error(`Query server exited with code: ${code}`)); + this.process = null; + this.emit("exit", code); + }); + await new Promise((resolve12) => setTimeout3(resolve12, 2e3)); + logger.info("CodeQL Query Server started"); + } + /** + * Send a request to the query server and await the response. + * + * @param method - The JSON-RPC method name. + * @param params - The method parameters. + * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min). + * @returns The result from the server. + */ + sendRequest(method, params, timeoutMs = 3e5) { + const id = this.messageId++; + const message = { + id, + jsonrpc: "2.0", + method, + params + }; + return new Promise((resolve12, reject) => { + this.pendingRequests.set(id, { reject, resolve: resolve12 }); + this.sendRaw(message); + const timer = setTimeout3(() => { + if (this.pendingRequests.has(id)) { + this.pendingRequests.delete(id); + reject(new Error(`Query server request timeout for method: ${method}`)); } - throw new Error(`Database path does not exist: ${dbPath}`); - } - if (errorCode === "EACCES") { - throw new Error(`Database path does not exist: ${dbPath}`); - } - } - throw new Error(`Failed to register database: ${error instanceof Error ? error.message : "Unknown error"}`); + }, timeoutMs); + const originalResolve = resolve12; + const originalReject = reject; + const wrapped = { + reject: (err) => { + clearTimeout2(timer); + originalReject(err); + }, + resolve: (val) => { + clearTimeout2(timer); + originalResolve(val); + } + }; + this.pendingRequests.set(id, wrapped); + }); } -} -function registerRegisterDatabaseTool(server) { - server.tool( - "register_database", - "Register a CodeQL database given a local path to the database directory", - { - db_path: z20.string().describe("Path to the CodeQL database directory") - }, - async ({ db_path }) => { - try { - const result = await registerDatabase(db_path); - return { - content: [{ type: "text", text: result }] - }; - } catch (error) { - logger.error("Error registering database:", error); - return { - content: [ - { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` - } - ], - isError: true - }; - } + /** + * Gracefully shut down the query server. + */ + async shutdown() { + if (!this.process) { + return; } - ); -} - -// src/tools/codeql/resolve-database.ts -import { z as z21 } from "zod"; -var codeqlResolveDatabaseTool = { - name: "codeql_resolve_database", - description: "Resolve database path and validate database structure", - command: "codeql", - subcommand: "resolve database", - inputSchema: { - database: z21.string().describe("Database path to resolve"), - format: z21.enum(["text", "json", "betterjson"]).optional().describe("Output format for database information"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql resolve database -- /path/to/database", - "codeql resolve database --format=json -- my-database", - "codeql resolve database --format=betterjson -- database-dir" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/resolve-languages.ts -import { z as z22 } from "zod"; -var codeqlResolveLanguagesTool = { - name: "codeql_resolve_languages", - description: "List installed CodeQL extractor packs", - command: "codeql", - subcommand: "resolve languages", - inputSchema: { - format: z22.enum(["text", "json", "betterjson"]).optional().describe("Output format for language information"), - verbose: z22.boolean().optional().describe("Enable verbose output"), - additionalArgs: z22.array(z22.string()).optional().describe("Additional command-line arguments") - }, - examples: [ - "codeql resolve languages --format=text", - "codeql resolve languages --format=json", - "codeql resolve languages --format=betterjson" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/resolve-library-path.ts -import { z as z23 } from "zod"; -var codeqlResolveLibraryPathTool = { - name: "codeql_resolve_library-path", - description: "Resolve library path for CodeQL queries and libraries", - command: "codeql", - subcommand: "resolve library-path", - inputSchema: { - language: z23.string().optional().describe("Programming language to resolve library path for"), - format: z23.enum(["text", "json", "betterjson"]).optional().describe("Output format for library path information"), - verbose: z23.boolean().optional().describe("Enable verbose output"), - additionalArgs: z23.array(z23.string()).optional().describe("Additional command-line arguments") - }, - examples: [ - "codeql resolve library-path --language=java", - "codeql resolve library-path --format=json --language=python", - "codeql resolve library-path --format=betterjson" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/resolve-metadata.ts -import { z as z24 } from "zod"; -var codeqlResolveMetadataTool = { - name: "codeql_resolve_metadata", - description: "Resolve and return the key-value metadata pairs from a CodeQL query source file.", - command: "codeql", - subcommand: "resolve metadata", - inputSchema: { - query: z24.string().describe("Query file to resolve metadata for"), - format: z24.enum(["json"]).optional().describe("Output format for metadata information (always JSON, optional for future compatibility)"), - verbose: z24.boolean().optional().describe("Enable verbose output"), - additionalArgs: z24.array(z24.string()).optional().describe("Additional command-line arguments") - }, - examples: [ - "codeql resolve metadata -- relative-path/2/MyQuery.ql", - "codeql resolve metadata --format=json -- /absolute-plus/relative-path/2/MyQuery.ql" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/resolve-qlref.ts -import { z as z25 } from "zod"; -var codeqlResolveQlrefTool = { - name: "codeql_resolve_qlref", - description: "Resolve qlref files to their corresponding query files", - command: "codeql", - subcommand: "resolve qlref", - inputSchema: { - qlref: z25.string().describe("Path to the .qlref file to resolve"), - format: z25.enum(["text", "json", "betterjson"]).optional().describe("Output format for qlref resolution"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql resolve qlref -- test/MyQuery.qlref", - "codeql resolve qlref --format=json -- test/MyQuery.qlref", - "codeql resolve qlref --format=betterjson -- test/MyQuery.qlref" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/resolve-queries.ts -import { z as z26 } from "zod"; -var jsonOnlyResultProcessor = (result, params) => { - if (!result.success) { - return `Command failed (exit code ${result.exitCode || "unknown"}): -${result.error || result.stderr}`; + logger.info("Shutting down CodeQL Query Server..."); + try { + await this.sendRequest("shutdown", {}, 5e3); + } catch (error) { + logger.warn("Error during query server graceful shutdown:", error); + } + setTimeout3(() => { + if (this.process) { + this.process.kill("SIGTERM"); + this.process = null; + } + }, 2e3); } - if (params.format === "json" || params.format === "betterjson" || params.format === "bylanguage") { - return result.stdout || "[]"; + /** + * Whether the query server process is running. + */ + isRunning() { + return this.process !== null && !this.process.killed; } - let output = ""; - if (result.stdout) { - output += result.stdout; + // ---- private helpers ---- + handleStdout(data) { + this.messageBuffer += data.toString(); + let headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); + while (headerEnd !== -1) { + const header = this.messageBuffer.substring(0, headerEnd); + const contentLengthMatch = header.match(/Content-Length: (\d+)/); + if (contentLengthMatch) { + const contentLength = parseInt(contentLengthMatch[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + if (this.messageBuffer.length >= messageEnd) { + const messageContent = this.messageBuffer.substring(messageStart, messageEnd); + this.messageBuffer = this.messageBuffer.substring(messageEnd); + try { + const message = JSON.parse(messageContent); + this.handleMessage(message); + } catch (error) { + logger.error("Failed to parse query server message:", error); + } + headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); + } else { + break; + } + } else { + logger.error("Invalid query server header:", header); + this.messageBuffer = ""; + break; + } + } } - if (result.stderr) { - if (output) { - output += "\n\nWarnings/Info:\n"; + handleMessage(message) { + logger.debug("QueryServer2 message:", message); + if (message.id !== void 0 && this.pendingRequests.has(Number(message.id))) { + const pending = this.pendingRequests.get(Number(message.id)); + this.pendingRequests.delete(Number(message.id)); + if (message.error) { + pending.reject(new Error(`Query server error: ${message.error.message}`)); + } else { + pending.resolve(message.result); + } + return; + } + if (message.method) { + this.emit("notification", { method: message.method, params: message.params }); } - output += result.stderr; } - if (!output) { - output = "Command executed successfully (no output)"; + rejectAllPending(error) { + for (const [id, pending] of this.pendingRequests) { + pending.reject(error); + this.pendingRequests.delete(id); + } + } + sendRaw(message) { + if (!this.process?.stdin) { + throw new Error("Query server is not running"); + } + const body = JSON.stringify(message); + const contentLength = Buffer.byteLength(body, "utf8"); + const frame = `Content-Length: ${contentLength}\r +\r +${body}`; + this.process.stdin.write(frame); } - return output; -}; -var codeqlResolveQueriesTool = { - name: "codeql_resolve_queries", - description: "List available CodeQL queries found on the local filesystem", - command: "codeql", - subcommand: "resolve queries", - inputSchema: { - directory: z26.string().optional().describe("Directory to search for queries"), - language: z26.string().optional().describe("Filter queries by programming language"), - format: z26.enum(["text", "json", "betterjson", "bylanguage"]).optional().describe("Output format for query list"), - "additional-packs": z26.union([z26.string(), z26.array(z26.string())]).optional().describe("Additional pack directories to search for CodeQL packs"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql resolve queries", - "codeql resolve queries --language=java --format=json", - "codeql resolve queries --format=betterjson -- /path/to/queries", - "codeql resolve queries --additional-packs=/path/to/packs codeql/java-queries" - ], - resultProcessor: jsonOnlyResultProcessor -}; - -// src/tools/codeql/resolve-tests.ts -import { z as z27 } from "zod"; -var codeqlResolveTestsTool = { - name: "codeql_resolve_tests", - description: "Resolve the local filesystem paths of unit tests and/or queries under some base directory", - command: "codeql", - subcommand: "resolve tests", - inputSchema: { - tests: z27.array(z27.string()).optional().describe("One or more tests (.ql, .qlref files, or test directories)"), - format: z27.enum(["text", "json"]).optional().describe("Output format for test list"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql resolve tests", - "codeql resolve tests --format=json -- test-directory", - "codeql resolve tests --format=json -- test1.ql test2.ql" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/test-accept.ts -import { z as z28 } from "zod"; -var codeqlTestAcceptTool = { - name: "codeql_test_accept", - description: "Accept new test results as the expected baseline", - command: "codeql", - subcommand: "test accept", - inputSchema: { - tests: z28.array(z28.string()).describe("One or more tests (.ql, .qlref files, or test directories)"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql test accept -- languages/java/test/MyQuery/MyQuery.qlref", - "codeql test accept -- languages/java/test/MyQuery/", - "codeql test accept -- languages/java/src/MyQuery/MyQuery.ql" - ], - resultProcessor: defaultCLIResultProcessor }; -// src/tools/codeql/test-extract.ts -import { z as z29 } from "zod"; -var codeqlTestExtractTool = { - name: "codeql_test_extract", - description: "Extract test databases for CodeQL query tests", - command: "codeql", - subcommand: "test extract", - inputSchema: { - tests: z29.array(z29.string()).describe("One or more test directories or files"), - language: z29.string().optional().describe("Programming language for extraction"), - threads: createCodeQLSchemas.threads(), - ram: createCodeQLSchemas.ram(), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql test extract -- languages/java/test/MyQuery/", - "codeql test extract --language=java --threads=4 -- test-directory", - "codeql test extract --threads=2 --ram=2048 -- multiple/test/directories" - ], - resultProcessor: defaultCLIResultProcessor +// src/lib/cli-server.ts +import { spawn as spawn3 } from "child_process"; +import { delimiter as delimiter4 } from "path"; +import { EventEmitter as EventEmitter3 } from "events"; +import { clearTimeout as clearTimeout3, setTimeout as setTimeout4 } from "timers"; +init_cli_executor(); +init_logger(); +var CodeQLCLIServer = class extends EventEmitter3 { + commandInProgress = false; + commandQueue = []; + config; + currentReject = null; + currentResolve = null; + nullBuffer = Buffer.alloc(1); + process = null; + stdoutBuffer = ""; + constructor(config) { + super(); + this.config = config; + } + /** + * Start the cli-server process. + */ + async start() { + if (this.process) { + throw new Error("CLI server is already running"); + } + logger.info("Starting CodeQL CLI Server..."); + const args = buildCLIServerArgs(this.config); + const spawnEnv = { ...process.env }; + const codeqlDir = getResolvedCodeQLDir(); + if (codeqlDir && spawnEnv.PATH) { + spawnEnv.PATH = `${codeqlDir}${delimiter4}${spawnEnv.PATH}`; + } else if (codeqlDir) { + spawnEnv.PATH = codeqlDir; + } + this.process = spawn3("codeql", args, { + stdio: ["pipe", "pipe", "pipe"], + env: spawnEnv + }); + this.process.stdout?.on("data", (data) => { + this.handleStdout(data); + }); + this.process.stderr?.on("data", (data) => { + logger.debug("CLIServer stderr:", data.toString()); + }); + this.process.on("error", (error) => { + logger.error("CLI server process error:", error); + if (this.currentReject) { + this.currentReject(error); + this.currentReject = null; + this.currentResolve = null; + } + this.emit("error", error); + }); + this.process.on("exit", (code) => { + logger.info(`CLI server exited with code: ${code}`); + if (this.currentReject) { + this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`)); + this.currentReject = null; + this.currentResolve = null; + } + this.process = null; + this.emit("exit", code); + }); + await new Promise((resolve12) => setTimeout4(resolve12, 1500)); + logger.info("CodeQL CLI Server started"); + } + /** + * Run a CodeQL CLI command through the persistent server. + * + * Commands are serialized and queued; only one command runs at a time. + * + * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`). + * @returns The stdout output from the command. + */ + runCommand(args) { + return new Promise((resolve12, reject) => { + const execute = () => { + this.executeCommand({ args, reject, resolve: resolve12 }); + }; + if (this.commandInProgress) { + this.commandQueue.push(execute); + } else { + execute(); + } + }); + } + /** + * Gracefully shut down the CLI server. + */ + async shutdown() { + if (!this.process) { + return; + } + logger.info("Shutting down CodeQL CLI Server..."); + try { + this.process.stdin?.write(JSON.stringify(["shutdown"]), "utf8"); + this.process.stdin?.write(this.nullBuffer); + } catch (error) { + logger.warn("Error during CLI server shutdown request:", error); + } + await new Promise((resolve12) => { + const timer = setTimeout4(() => { + if (this.process) { + this.process.kill("SIGTERM"); + this.process = null; + } + resolve12(); + }, 2e3); + if (this.process) { + this.process.once("exit", () => { + clearTimeout3(timer); + this.process = null; + resolve12(); + }); + } else { + clearTimeout3(timer); + resolve12(); + } + }); + this.commandInProgress = false; + this.commandQueue = []; + logger.info("CodeQL CLI Server stopped"); + } + /** + * Whether the CLI server process is running. + */ + isRunning() { + return this.process !== null && !this.process.killed; + } + // ---- private helpers ---- + executeCommand(cmd) { + if (!this.process?.stdin) { + cmd.reject(new Error("CLI server is not running")); + return; + } + this.commandInProgress = true; + this.currentResolve = cmd.resolve; + this.currentReject = cmd.reject; + this.stdoutBuffer = ""; + try { + this.process.stdin.write(JSON.stringify(cmd.args), "utf8"); + this.process.stdin.write(this.nullBuffer); + } catch (error) { + this.commandInProgress = false; + this.currentResolve = null; + this.currentReject = null; + cmd.reject(error instanceof Error ? error : new Error(String(error))); + this.runNext(); + } + } + handleStdout(data) { + const str2 = data.toString(); + const nulIndex = str2.indexOf("\0"); + if (nulIndex === -1) { + this.stdoutBuffer += str2; + return; + } + this.stdoutBuffer += str2.substring(0, nulIndex); + const result = this.stdoutBuffer; + this.stdoutBuffer = ""; + if (this.currentResolve) { + this.currentResolve(result); + this.currentResolve = null; + this.currentReject = null; + } + this.commandInProgress = false; + this.runNext(); + const remainder = str2.substring(nulIndex + 1); + if (remainder.length > 0) { + this.stdoutBuffer = remainder; + } + } + runNext() { + const next = this.commandQueue.shift(); + if (next) { + next(); + } + } }; -// src/tools/codeql/test-run.ts -import { z as z30 } from "zod"; -var codeqlTestRunTool = { - name: "codeql_test_run", - description: "Run CodeQL query tests", - command: "codeql", - subcommand: "test run", - inputSchema: { - tests: z30.array(z30.string()).describe("One or more tests (.ql, .qlref files, or test directories)"), - "show-extractor-output": z30.boolean().optional().describe("Show output from extractors during test execution"), - "keep-databases": z30.boolean().optional().describe("Keep test databases after running tests"), - "learn": z30.boolean().optional().describe("Accept current output as expected for failing tests"), - logDir: z30.string().optional().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/"), - threads: createCodeQLSchemas.threads(), - ram: createCodeQLSchemas.ram(), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql test run /path/to/tests", - "codeql test run --learn /path/to/failing/tests", - "codeql test run --threads=4 --keep-databases /path/to/tests", - "codeql test run --log-dir=/custom/log/path /path/to/tests" - ] +// src/lib/server-manager.ts +init_logger(); +var CodeQLServerManager = class { + /** Keyed by `CodeQLServerType` — at most one per type at a time. */ + servers = /* @__PURE__ */ new Map(); + /** The session ID used for cache isolation. */ + sessionId; + /** Root directory for session-specific caches. */ + sessionCacheDir; + constructor(options) { + this.sessionId = options?.sessionId ?? randomUUID(); + this.sessionCacheDir = join10( + getProjectTmpDir("codeql-cache"), + this.sessionId + ); + for (const subdir of ["compilation-cache", "logs", "query-cache"]) { + mkdirSync7(join10(this.sessionCacheDir, subdir), { recursive: true }); + } + logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`); + } + // ---- Public API ---- + /** + * Get the current session ID. + */ + getSessionId() { + return this.sessionId; + } + /** + * Get the session-specific cache directory. + */ + getCacheDir() { + return this.sessionCacheDir; + } + /** + * Return the session-specific log directory. + */ + getLogDir() { + return join10(this.sessionCacheDir, "logs"); + } + /** + * Get or create a Language Server with the given configuration. + * + * If a language server is already running with the same config it is reused. + * If the config has changed the old server is shut down first. + */ + async getLanguageServer(config) { + const enriched = this.enrichConfig(config); + return this.getOrRestart("language", enriched, () => { + return new CodeQLLanguageServer({ + loglevel: enriched.loglevel, + logdir: enriched.logdir, + searchPath: enriched.searchPath, + synchronous: enriched.synchronous, + verbosity: enriched.verbosity + }); + }); + } + /** + * Get or create a Query Server with the given configuration. + */ + async getQueryServer(config) { + const enriched = this.enrichConfig(config); + return this.getOrRestart("query", enriched, () => { + return new CodeQLQueryServer(enriched); + }); + } + /** + * Get or create a CLI Server with the given configuration. + */ + async getCLIServer(config) { + const enriched = this.enrichConfig(config); + return this.getOrRestart("cli", enriched, () => { + return new CodeQLCLIServer(enriched); + }); + } + /** + * Shut down a specific server type. + */ + async shutdownServer(type2) { + const managed = this.servers.get(type2); + if (!managed) return; + logger.info(`Shutting down ${type2} server (session: ${managed.sessionId})`); + await this.stopServer(managed); + this.servers.delete(type2); + } + /** + * Shut down all managed servers. + */ + async shutdownAll() { + logger.info(`Shutting down all servers for session: ${this.sessionId}`); + const shutdownPromises = Array.from(this.servers.entries()).map( + async ([type2, managed]) => { + try { + await this.stopServer(managed); + } catch (error) { + logger.error(`Error shutting down ${type2} server:`, error); + } + } + ); + await Promise.all(shutdownPromises); + this.servers.clear(); + logger.info("All servers shut down"); + } + /** + * Check whether a server of the given type is currently running. + */ + isRunning(type2) { + const managed = this.servers.get(type2); + if (!managed) return false; + return managed.server.isRunning(); + } + /** + * Get status information for all managed servers. + */ + getStatus() { + const status = { + cli: null, + language: null, + query: null + }; + for (const [type2, managed] of this.servers) { + status[type2] = { + configHash: managed.configHash, + running: managed.server.isRunning(), + sessionId: managed.sessionId + }; + } + return status; + } + // ---- Private helpers ---- + /** + * Enrich a config with session-specific defaults for commonCaches and logdir. + */ + enrichConfig(config) { + return { + ...config, + commonCaches: config.commonCaches ?? this.sessionCacheDir, + logdir: config.logdir ?? this.getLogDir() + }; + } + /** + * Get an existing server if its config matches, otherwise stop the old + * one and start a new server. + */ + async getOrRestart(type2, config, factory) { + const hash = computeConfigHash(type2, config); + const existing = this.servers.get(type2); + if (existing && existing.configHash === hash && existing.server.isRunning()) { + logger.debug(`Reusing existing ${type2} server (hash: ${hash.substring(0, 8)})`); + return existing.server; + } + if (existing) { + logger.info(`${type2} server config changed or dead, restarting...`); + await this.stopServer(existing); + this.servers.delete(type2); + } + const server = factory(); + await server.start(); + this.servers.set(type2, { + configHash: hash, + server, + sessionId: this.sessionId, + type: type2 + }); + logger.info(`${type2} server started (hash: ${hash.substring(0, 8)})`); + return server; + } + /** + * Stop a managed server, ignoring errors. + */ + async stopServer(managed) { + try { + await managed.server.shutdown(); + } catch (error) { + logger.warn(`Error stopping ${managed.type} server:`, error); + } + } }; - -// src/tools/codeql-tools.ts -import { z as z31 } from "zod"; - -// src/lib/validation.ts -function validateCodeQLSyntax(query, _language) { - const validation = { - isValid: true, - errors: [], - warnings: [], - suggestions: [] - }; - if (!query.trim()) { - validation.isValid = false; - validation.errors.push("Query cannot be empty"); - return validation; +var globalServerManager = null; +function initServerManager(options) { + if (!globalServerManager) { + globalServerManager = new CodeQLServerManager(options); } - if (!query.includes("from") && !query.includes("select")) { - validation.warnings.push('Query should typically include "from" and "select" clauses'); + return globalServerManager; +} +function getServerManager() { + if (!globalServerManager) { + globalServerManager = new CodeQLServerManager(); } - if (!query.includes("@name") && !query.includes("@description")) { - validation.suggestions.push("Consider adding @name and @description metadata"); + return globalServerManager; +} +async function shutdownServerManager() { + if (globalServerManager) { + await globalServerManager.shutdownAll(); + globalServerManager = null; } - return validation; } -// src/lib/query-scaffolding.ts -import * as fs2 from "fs"; -import * as path2 from "path"; -function getLanguageExtension2(language) { - const extensions = { - javascript: "js", - typescript: "ts", - python: "py", - java: "java", - csharp: "cs", - cpp: "cpp", - go: "go", - ruby: "rb", - actions: "yml" - }; - return extensions[language.toLowerCase()] || "txt"; +// src/tools/lsp/lsp-diagnostics.ts +init_logger(); +import { join as join11, resolve as resolve9 } from "path"; +import { pathToFileURL as pathToFileURL2 } from "url"; +function formatDiagnostics(diagnostics) { + if (diagnostics.length === 0) { + return "\u2705 No issues found in QL code"; + } + const lines = []; + lines.push(`Found ${diagnostics.length} issue(s): +`); + diagnostics.forEach((diagnostic, index) => { + const severityIcon = getSeverityIcon(diagnostic.severity); + const severityName = getSeverityName(diagnostic.severity); + const location = `Line ${diagnostic.range.start.line + 1}, Column ${diagnostic.range.start.character + 1}`; + lines.push(`${index + 1}. ${severityIcon} ${severityName} at ${location}`); + lines.push(` ${diagnostic.message}`); + if (diagnostic.source) { + lines.push(` Source: ${diagnostic.source}`); + } + if (diagnostic.code) { + lines.push(` Code: ${diagnostic.code}`); + } + lines.push(""); + }); + return lines.join("\n"); } -function generateQueryTemplate(queryName, language, description, queryId) { - const desc = description || `${queryName} query`; - const id = queryId || `${language}/example/${queryName.toLowerCase()}`; - return `/** - * @id ${id} - * @name ${queryName} - * @description ${desc} - * @kind problem - * @precision medium - * @problem.severity warning - */ - -import ${language} - -// TODO: Implement query logic -from File f -where f.getBaseName() = "${queryName}.${getLanguageExtension2(language)}" -select f, "TODO: Add query logic" -`; +function getSeverityIcon(severity) { + switch (severity) { + case 1: + return "\u274C"; + // Error + case 2: + return "\u26A0\uFE0F"; + // Warning + case 3: + return "\u2139\uFE0F"; + // Information + case 4: + return "\u{1F4A1}"; + // Hint + default: + return "\u2753"; + } } -function createCodeQLQuery(options) { - const { basePath, queryName, language, description, queryId } = options; - const absoluteBasePath = path2.resolve(basePath); - const srcDir = path2.join(absoluteBasePath, "src", queryName); - const testDir = path2.join(absoluteBasePath, "test", queryName); - const queryPath = path2.join(srcDir, `${queryName}.ql`); - const qlrefPath = path2.join(testDir, `${queryName}.qlref`); - const testCodePath = path2.join(testDir, `${queryName}.${getLanguageExtension2(language)}`); - const filesCreated = []; +function getSeverityName(severity) { + switch (severity) { + case 1: + return "Error"; + case 2: + return "Warning"; + case 3: + return "Information"; + case 4: + return "Hint"; + default: + return "Unknown"; + } +} +async function getLanguageServer(options = {}, workspaceUri) { + const { packageRootDir: pkgRoot } = await Promise.resolve().then(() => (init_package_paths(), package_paths_exports)); + const config = { + checkErrors: "ON_CHANGE", + loglevel: options.loglevel ?? "WARN", + searchPath: options.searchPath ?? resolve9(pkgRoot, "ql"), + synchronous: options.synchronous, + verbosity: options.verbosity + }; + const manager = getServerManager(); + const languageServer = await manager.getLanguageServer(config); + const effectiveUri = workspaceUri ?? pathToFileURL2(resolve9(pkgRoot, "ql")).href; + await languageServer.initialize(effectiveUri); + return languageServer; +} +async function lspDiagnostics({ + qlCode, + workspaceUri, + serverOptions = {} +}) { try { - fs2.mkdirSync(srcDir, { recursive: true }); - fs2.mkdirSync(testDir, { recursive: true }); - try { - const queryContent = generateQueryTemplate(queryName, language, description, queryId); - fs2.writeFileSync(queryPath, queryContent, { encoding: "utf8", flag: "wx" }); - filesCreated.push(queryPath); - } catch (e) { - const err = e; - if (err.code !== "EEXIST") throw e; - } - try { - const qlrefContent = `${queryName}/${queryName}.ql -`; - fs2.writeFileSync(qlrefPath, qlrefContent, { encoding: "utf8", flag: "wx" }); - filesCreated.push(qlrefPath); - } catch (e) { - const err = e; - if (err.code !== "EEXIST") throw e; - } - try { - const testCodeContent = `// Test code for ${queryName} -// TODO: Add test cases -`; - fs2.writeFileSync(testCodePath, testCodeContent, { encoding: "utf8", flag: "wx" }); - filesCreated.push(testCodePath); - } catch (e) { - const err = e; - if (err.code !== "EEXIST") throw e; - } + logger.info("Evaluating QL code via Language Server..."); + const languageServer = await getLanguageServer(serverOptions, workspaceUri); + const evalUri = pathToFileURL2(join11(getProjectTmpDir("lsp-eval"), `eval_${Date.now()}.ql`)).href; + const diagnostics = await languageServer.evaluateQL(qlCode, evalUri); + const summary = { + errorCount: diagnostics.filter((d) => d.severity === 1).length, + hintCount: diagnostics.filter((d) => d.severity === 4).length, + infoCount: diagnostics.filter((d) => d.severity === 3).length, + warningCount: diagnostics.filter((d) => d.severity === 2).length + }; + const isValid = summary.errorCount === 0; + const formattedOutput = formatDiagnostics(diagnostics); + logger.info(`QL evaluation complete. Valid: ${isValid}, Issues: ${diagnostics.length}`); return { - queryPath, - testPath: testDir, - qlrefPath, - testCodePath, - filesCreated + diagnostics, + formattedOutput, + isValid, + summary }; } catch (error) { - throw new Error(`Failed to create query scaffolding: ${error instanceof Error ? error.message : "Unknown error"}`); + logger.error("Error evaluating QL code:", error); + throw new Error(`QL evaluation failed: ${error instanceof Error ? error.message : "Unknown error"}`); } } - -// src/tools/codeql-tools.ts -init_logger(); -function registerCodeQLTools(server) { - server.tool( - "validate_codeql_query", - "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.", - { - query: z31.string().describe("The CodeQL query to validate"), - language: z31.string().optional().describe("Target programming language") - }, - async ({ query, language }) => { - try { - const validation = validateCodeQLSyntax(query, language); - return { - content: [{ type: "text", text: JSON.stringify(validation, null, 2) }] - }; - } catch (error) { - logger.error("Error validating CodeQL query:", error); - return { - content: [ - { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` - } - ], - isError: true - }; - } - } - ); +async function shutdownDiagnosticsServer() { + const manager = getServerManager(); + await manager.shutdownServer("language"); +} +function registerLspDiagnosticsTool(server) { server.tool( - "create_codeql_query", - "Create directory structure and files for a new CodeQL query with tests", + "codeql_lsp_diagnostics", + "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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.", { - basePath: z31.string().describe("Base path where src/ and test/ directories will be created"), - queryName: z31.string().describe("Name of the query (e.g., MySecurityQuery)"), - language: z31.string().describe("Target programming language (e.g., javascript, python, java)"), - description: z31.string().optional().describe("Description of what the query does"), - queryId: z31.string().optional().describe("Custom query ID (defaults to language/example/queryname)") + log_level: z31.enum(["OFF", "ERROR", "WARN", "INFO", "DEBUG", "TRACE", "ALL"]).optional().describe("Language server log level"), + ql_code: z31.string().describe("The CodeQL (QL) code to evaluate for syntax and semantic errors"), + search_path: z31.string().optional().describe("Optional search path for CodeQL libraries"), + workspace_uri: z31.string().optional().describe("Optional workspace URI for context (defaults to ./ql directory)") }, - async ({ basePath, queryName, language, description, queryId }) => { + async ({ ql_code, workspace_uri, search_path, log_level }) => { try { - const result = createCodeQLQuery({ - basePath, - queryName, - language, - description, - queryId - }); - const summary = { - success: true, - queryPath: result.queryPath, - testPath: result.testPath, - qlrefPath: result.qlrefPath, - testCodePath: result.testCodePath, - filesCreated: result.filesCreated, - nextSteps: [ - "Review and customize the generated query in: " + result.queryPath, - "Add test cases to: " + result.testCodePath, - "Run codeql_pack_install to install dependencies", - "Run codeql_test_extract to create test database", - "Run codeql_test_run to execute tests" - ] + const serverOptions = {}; + if (search_path) { + serverOptions.searchPath = search_path; + } + if (log_level) { + serverOptions.loglevel = log_level; + } + const result = await lspDiagnostics({ + qlCode: ql_code, + serverOptions, + workspaceUri: workspace_uri + }); + const responseContent = { + diagnostics: result.diagnostics.map((d) => ({ + code: d.code, + column: d.range.start.character + 1, + // Convert to 1-based column numbers + line: d.range.start.line + 1, + // Convert to 1-based line numbers + message: d.message, + severity: getSeverityName(d.severity), + source: d.source + })), + formattedOutput: result.formattedOutput, + isValid: result.isValid, + summary: result.summary }; return { - content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] + content: [ + { + text: JSON.stringify(responseContent, null, 2), + type: "text" + } + ] }; } catch (error) { - logger.error("Error creating CodeQL query:", error); + logger.error("Error in codeql_lsp_diagnostics tool:", error); return { content: [ { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}`, + type: "text" } ], isError: true @@ -5945,155 +6825,207 @@ function registerCodeQLTools(server) { } } ); - registerCLITool(server, codeqlBqrsDecodeTool); - registerCLITool(server, codeqlBqrsInfoTool); - registerCLITool(server, codeqlBqrsInterpretTool); - registerCLITool(server, codeqlDatabaseAnalyzeTool); - registerCLITool(server, codeqlDatabaseCreateTool); - registerCLITool(server, codeqlGenerateLogSummaryTool); - registerCLITool(server, codeqlGenerateQueryHelpTool); - registerCLITool(server, codeqlPackInstallTool); - registerCLITool(server, codeqlPackLsTool); - registerCLITool(server, codeqlQueryCompileTool); - registerCLITool(server, codeqlQueryFormatTool); - registerCLITool(server, codeqlQueryRunTool); - registerCLITool(server, codeqlResolveDatabaseTool); - registerCLITool(server, codeqlResolveLanguagesTool); - registerCLITool(server, codeqlResolveLibraryPathTool); - registerCLITool(server, codeqlResolveMetadataTool); - registerCLITool(server, codeqlResolveQlrefTool); - registerCLITool(server, codeqlResolveQueriesTool); - registerCLITool(server, codeqlResolveTestsTool); - registerCLITool(server, codeqlTestAcceptTool); - registerCLITool(server, codeqlTestExtractTool); - registerCLITool(server, codeqlTestRunTool); - registerFindClassPositionTool(server); - registerFindCodeQLQueryFilesTool(server); - registerFindPredicatePositionTool(server); - registerLanguageServerEvalTool(server); - registerProfileCodeQLQueryTool(server); - registerQuickEvaluateTool(server); - registerRegisterDatabaseTool(server); + process.on("SIGINT", async () => { + await shutdownDiagnosticsServer(); + }); + process.on("SIGTERM", async () => { + await shutdownDiagnosticsServer(); + }); } -// src/lib/resources.ts -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 readFileSync5(join10(__dirname2, "../resources/getting-started.md"), "utf-8"); - } catch { - return "Getting started guide not available"; +// src/tools/lsp/lsp-handlers.ts +init_logger(); +import { readFileSync as readFileSync6 } from "fs"; +import { pathToFileURL as pathToFileURL3 } from "url"; +import { isAbsolute as isAbsolute5, resolve as resolve10 } from "path"; +async function getInitializedServer(params) { + const { packageRootDir: pkgRoot } = await Promise.resolve().then(() => (init_package_paths(), package_paths_exports)); + const config = { + checkErrors: "ON_CHANGE", + loglevel: "WARN", + searchPath: params.searchPath ?? resolve10(pkgRoot, "ql") + }; + const manager = getServerManager(); + const server = await manager.getLanguageServer(config); + const effectiveUri = params.workspaceUri ?? pathToFileURL3(resolve10(pkgRoot, "ql")).href; + await server.initialize(effectiveUri); + return server; +} +function prepareDocumentPosition(server, params) { + const absPath = isAbsolute5(params.filePath) ? params.filePath : resolve10(process.cwd(), params.filePath); + const docUri = pathToFileURL3(absPath).href; + let text; + if (params.fileContent) { + text = params.fileContent; + } else { + try { + text = readFileSync6(absPath, "utf-8"); + } catch (error) { + throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`); + } } + server.openDocument(docUri, text); + const positionParams = { + position: { character: params.character, line: params.line }, + textDocument: { uri: docUri } + }; + return { docUri, positionParams }; } -function getQueryBasicsGuide() { +async function lspCompletion(params) { + logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`); + const server = await getInitializedServer(params); + const { docUri, positionParams } = prepareDocumentPosition(server, params); try { - return readFileSync5(join10(__dirname2, "../resources/query-basics.md"), "utf-8"); - } catch { - return "Query basics guide not available"; + return await server.getCompletions(positionParams); + } finally { + server.closeDocument(docUri); } } -function getSecurityTemplates() { +async function lspDefinition(params) { + logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`); + const server = await getInitializedServer(params); + const { docUri, positionParams } = prepareDocumentPosition(server, params); try { - return readFileSync5(join10(__dirname2, "../resources/security-templates.md"), "utf-8"); - } catch { - return "Security templates not available"; + return await server.getDefinition(positionParams); + } finally { + server.closeDocument(docUri); } } -function getPerformancePatterns() { +async function lspReferences(params) { + logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`); + const server = await getInitializedServer(params); + const { docUri, positionParams } = prepareDocumentPosition(server, params); try { - return readFileSync5(join10(__dirname2, "../resources/performance-patterns.md"), "utf-8"); - } catch { - return "Performance patterns not available"; + return await server.getReferences({ + ...positionParams, + context: { includeDeclaration: true } + }); + } finally { + server.closeDocument(docUri); } } -// src/tools/codeql-resources.ts -function registerCodeQLResources(server) { - server.resource( - "CodeQL Getting Started", - "codeql://learning/getting-started", - { - description: "Comprehensive introduction to CodeQL for beginners", - mimeType: "text/markdown" - }, - async () => { - return { - contents: [ - { - uri: "codeql://learning/getting-started", - mimeType: "text/markdown", - text: getGettingStartedGuide() - } - ] - }; - } - ); - server.resource( - "CodeQL Query Basics", - "codeql://learning/query-basics", - { - description: "Learn the fundamentals of writing CodeQL queries", - mimeType: "text/markdown" - }, - async () => { - return { - contents: [ - { - uri: "codeql://learning/query-basics", - mimeType: "text/markdown", - text: getQueryBasicsGuide() - } - ] - }; +// src/tools/lsp/lsp-tools.ts +import { z as z32 } from "zod"; +init_logger(); +var lspParamsSchema = { + character: z32.number().int().min(0).describe("0-based character offset within the line"), + file_content: z32.string().optional().describe("Optional file content override (reads from disk if omitted)"), + file_path: z32.string().describe("Absolute path to the CodeQL (.ql/.qll) file"), + line: z32.number().int().min(0).describe("0-based line number in the document"), + search_path: z32.string().optional().describe("Optional search path for CodeQL libraries"), + workspace_uri: z32.string().optional().describe("Optional workspace URI for context (defaults to ./ql directory)") +}; +function toHandlerParams(input) { + return { + character: input.character, + fileContent: input.file_content, + filePath: input.file_path, + line: input.line, + searchPath: input.search_path, + workspaceUri: input.workspace_uri + }; +} +function registerLSPTools(server) { + registerLspDiagnosticsTool(server); + server.tool( + "codeql_lsp_completion", + "Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.", + lspParamsSchema, + async (input) => { + try { + const items = await lspCompletion(toHandlerParams(input)); + return { + content: [{ + text: JSON.stringify({ + completionCount: items.length, + items: items.map((item) => ({ + detail: item.detail, + documentation: item.documentation, + insertText: item.insertText, + kind: item.kind, + label: item.label + })) + }, null, 2), + type: "text" + }] + }; + } catch (error) { + logger.error("codeql_lsp_completion error:", error); + return { + content: [{ text: `Error: ${error instanceof Error ? error.message : "Unknown error"}`, type: "text" }], + isError: true + }; + } } ); - server.resource( - "CodeQL Security Templates", - "codeql://templates/security", - { - description: "Ready-to-use security query templates", - mimeType: "text/markdown" - }, - async () => { - return { - contents: [ - { - uri: "codeql://templates/security", - mimeType: "text/markdown", - text: getSecurityTemplates() - } - ] - }; + server.tool( + "codeql_lsp_definition", + "Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.", + lspParamsSchema, + async (input) => { + try { + const locations = await lspDefinition(toHandlerParams(input)); + return { + content: [{ + text: JSON.stringify({ + definitionCount: locations.length, + locations: locations.map((loc) => ({ + endCharacter: loc.range.end.character, + endLine: loc.range.end.line + 1, + startCharacter: loc.range.start.character, + startLine: loc.range.start.line + 1, + uri: loc.uri + })) + }, null, 2), + type: "text" + }] + }; + } catch (error) { + logger.error("codeql_lsp_definition error:", error); + return { + content: [{ text: `Error: ${error instanceof Error ? error.message : "Unknown error"}`, type: "text" }], + isError: true + }; + } } ); - server.resource( - "CodeQL Performance Patterns", - "codeql://patterns/performance", - { - description: "Best practices for writing efficient CodeQL queries", - mimeType: "text/markdown" - }, - async () => { - return { - contents: [ - { - uri: "codeql://patterns/performance", - mimeType: "text/markdown", - text: getPerformancePatterns() - } - ] - }; + server.tool( + "codeql_lsp_references", + "Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.", + lspParamsSchema, + async (input) => { + try { + const locations = await lspReferences(toHandlerParams(input)); + return { + content: [{ + text: JSON.stringify({ + locations: locations.map((loc) => ({ + endCharacter: loc.range.end.character, + endLine: loc.range.end.line + 1, + startCharacter: loc.range.start.character, + startLine: loc.range.start.line + 1, + uri: loc.uri + })), + referenceCount: locations.length + }, null, 2), + type: "text" + }] + }; + } catch (error) { + logger.error("codeql_lsp_references error:", error); + return { + content: [{ text: `Error: ${error instanceof Error ? error.message : "Unknown error"}`, type: "text" }], + isError: true + }; + } } ); } // src/resources/language-resources.ts -import { readFileSync as readFileSync6, existsSync as existsSync7 } from "fs"; -import { join as join11 } from "path"; +import { readFileSync as readFileSync7, existsSync as existsSync7 } from "fs"; +import { join as join12 } from "path"; // src/types/language-types.ts var LANGUAGE_RESOURCES = [ @@ -6153,12 +7085,12 @@ function getQLBasePath() { } function loadResourceContent(relativePath) { try { - const fullPath = join11(getQLBasePath(), relativePath); + const fullPath = join12(getQLBasePath(), relativePath); if (!existsSync7(fullPath)) { logger.warn(`Resource file not found: ${fullPath}`); return null; } - return readFileSync6(fullPath, "utf-8"); + return readFileSync7(fullPath, "utf-8"); } catch (error) { logger.error(`Error loading resource file ${relativePath}:`, error); return null; @@ -6280,19 +7212,19 @@ function registerLanguageResources(server) { } // src/prompts/workflow-prompts.ts -import { z as z32 } from "zod"; +import { z as z33 } from "zod"; import { basename as basename5 } from "path"; // src/prompts/prompt-loader.ts -import { readFileSync as readFileSync7 } from "fs"; -import { join as join12, dirname as dirname8 } from "path"; +import { readFileSync as readFileSync8 } from "fs"; +import { join as join13, 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(__dirname3, promptFileName); - return readFileSync7(promptPath, "utf-8"); + const promptPath = join13(__dirname3, promptFileName); + return readFileSync8(promptPath, "utf-8"); } catch (error) { return `Prompt template '${promptFileName}' not available: ${error instanceof Error ? error.message : "Unknown error"}`; } @@ -6324,20 +7256,67 @@ var SUPPORTED_LANGUAGES = [ "ruby", "swift" ]; -var workshopCreationWorkflowSchema = z32.object({ - queryPath: z32.string().describe("Path to the production-grade CodeQL query (.ql or .qlref)"), - language: z32.enum(SUPPORTED_LANGUAGES).describe("Programming language of the query"), - workshopName: z32.string().optional().describe("Name for the workshop directory"), - numStages: z32.coerce.number().optional().describe("Number of incremental stages (default: 4-8)") +var testDrivenDevelopmentSchema = z33.object({ + language: z33.enum(SUPPORTED_LANGUAGES).describe("Programming language for the query"), + queryName: z33.string().optional().describe("Name of the query to develop") +}); +var toolsQueryWorkflowSchema = z33.object({ + database: z33.string().describe("Path to the CodeQL database"), + language: z33.enum(SUPPORTED_LANGUAGES).describe("Programming language for the tools queries"), + sourceFiles: z33.string().optional().describe('Comma-separated source file names for PrintAST (e.g., "main.js,utils.js")'), + sourceFunction: z33.string().optional().describe('Function name for PrintCFG or CallGraphFrom (e.g., "processData")'), + targetFunction: z33.string().optional().describe('Function name for CallGraphTo (e.g., "validate")') +}); +var workshopCreationWorkflowSchema = z33.object({ + queryPath: z33.string().describe("Path to the production-grade CodeQL query (.ql or .qlref)"), + language: z33.enum(SUPPORTED_LANGUAGES).describe("Programming language of the query"), + workshopName: z33.string().optional().describe("Name for the workshop directory"), + numStages: z33.coerce.number().optional().describe("Number of incremental stages (default: 4-8)") }); +var qlTddBasicSchema = z33.object({ + language: z33.enum(SUPPORTED_LANGUAGES).optional().describe("Programming language for the query (optional)"), + queryName: z33.string().optional().describe("Name of the query to develop") +}); +var qlTddAdvancedSchema = z33.object({ + database: z33.string().optional().describe("Path to the CodeQL database for analysis"), + language: z33.enum(SUPPORTED_LANGUAGES).optional().describe("Programming language for the query (optional)"), + queryName: z33.string().optional().describe("Name of the query to develop") +}); +var sarifRankSchema = z33.object({ + queryId: z33.string().optional().describe("CodeQL query/rule identifier"), + sarifPath: z33.string().optional().describe("Path to the SARIF file to analyze") +}); +var explainCodeqlQuerySchema = z33.object({ + databasePath: z33.string().optional().describe("Optional path to a real CodeQL database for profiling"), + language: z33.enum(SUPPORTED_LANGUAGES).describe("Programming language of the query"), + queryPath: z33.string().describe("Path to the CodeQL query file (.ql or .qlref)") +}); +var documentCodeqlQuerySchema = z33.object({ + language: z33.enum(SUPPORTED_LANGUAGES).describe("Programming language of the query"), + queryPath: z33.string().describe("Path to the CodeQL query file (.ql or .qlref)") +}); +var qlLspIterativeDevelopmentSchema = z33.object({ + language: z33.enum(SUPPORTED_LANGUAGES).optional().describe("Programming language for the query"), + queryPath: z33.string().optional().describe("Path to the query file being developed"), + workspaceUri: z33.string().optional().describe("Workspace URI for LSP dependency resolution") +}); +var WORKFLOW_PROMPT_NAMES = [ + "document_codeql_query", + "explain_codeql_query", + "ql_lsp_iterative_development", + "ql_tdd_advanced", + "ql_tdd_basic", + "sarif_rank_false_positives", + "sarif_rank_true_positives", + "test_driven_development", + "tools_query_workflow", + "workshop_creation_workflow" +]; function registerWorkflowPrompts(server) { server.prompt( "test_driven_development", "Test-driven development workflow for CodeQL queries using MCP tools", - { - language: z32.enum(SUPPORTED_LANGUAGES).describe("Programming language for the query"), - queryName: z32.string().optional().describe("Name of the query to develop") - }, + testDrivenDevelopmentSchema.shape, async ({ language, queryName }) => { const template = loadPromptTemplate("ql-tdd-basic.prompt.md"); const content = processPromptTemplate(template, { @@ -6365,17 +7344,7 @@ ${content}` server.prompt( "tools_query_workflow", "Guide for using built-in tools queries (PrintAST, PrintCFG, CallGraphFrom, CallGraphTo) to understand code structure", - { - language: z32.enum(SUPPORTED_LANGUAGES).describe("Programming language for the tools queries"), - database: z32.string().describe("Path to the CodeQL database"), - sourceFiles: z32.string().optional().describe( - 'Comma-separated source file names for PrintAST (e.g., "main.js,utils.js")' - ), - sourceFunction: z32.string().optional().describe( - 'Function name for PrintCFG or CallGraphFrom (e.g., "processData")' - ), - targetFunction: z32.string().optional().describe('Function name for CallGraphTo (e.g., "validate")') - }, + toolsQueryWorkflowSchema.shape, async ({ language, database, @@ -6437,10 +7406,7 @@ ${content}` server.prompt( "ql_tdd_basic", "Test-driven CodeQL query development checklist - write tests first, implement query, iterate until tests pass", - { - language: z32.enum(SUPPORTED_LANGUAGES).optional().describe("Programming language for the query (optional)"), - queryName: z32.string().optional().describe("Name of the query to develop") - }, + qlTddBasicSchema.shape, async ({ language, queryName }) => { const template = loadPromptTemplate("ql-tdd-basic.prompt.md"); let contextSection = "## Your Development Context\n\n"; @@ -6471,11 +7437,7 @@ ${content}` server.prompt( "ql_tdd_advanced", "Advanced test-driven CodeQL development with AST visualization, control flow, and call graph analysis", - { - language: z32.enum(SUPPORTED_LANGUAGES).optional().describe("Programming language for the query (optional)"), - queryName: z32.string().optional().describe("Name of the query to develop"), - database: z32.string().optional().describe("Path to the CodeQL database for analysis") - }, + qlTddAdvancedSchema.shape, async ({ language, queryName, database }) => { const template = loadPromptTemplate("ql-tdd-advanced.prompt.md"); let contextSection = "## Your Development Context\n\n"; @@ -6510,10 +7472,7 @@ ${content}` server.prompt( "sarif_rank_false_positives", "Analyze SARIF results to identify likely false positives in CodeQL query results", - { - queryId: z32.string().optional().describe("CodeQL query/rule identifier"), - sarifPath: z32.string().optional().describe("Path to the SARIF file to analyze") - }, + sarifRankSchema.shape, async ({ queryId, sarifPath }) => { const template = loadPromptTemplate("sarif-rank-false-positives.prompt.md"); let contextSection = "## Analysis Context\n\n"; @@ -6544,10 +7503,7 @@ ${content}` server.prompt( "sarif_rank_true_positives", "Analyze SARIF results to identify likely true positives in CodeQL query results", - { - queryId: z32.string().optional().describe("CodeQL query/rule identifier"), - sarifPath: z32.string().optional().describe("Path to the SARIF file to analyze") - }, + sarifRankSchema.shape, async ({ queryId, sarifPath }) => { const template = loadPromptTemplate("sarif-rank-true-positives.prompt.md"); let contextSection = "## Analysis Context\n\n"; @@ -6578,11 +7534,7 @@ ${content}` server.prompt( "explain_codeql_query", "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", - { - queryPath: z32.string().describe("Path to the CodeQL query file (.ql or .qlref)"), - language: z32.enum(SUPPORTED_LANGUAGES).describe("Programming language of the query"), - databasePath: z32.string().optional().describe("Optional path to a real CodeQL database for profiling") - }, + explainCodeqlQuerySchema.shape, async ({ queryPath, language, databasePath }) => { const template = loadPromptTemplate("explain-codeql-query.prompt.md"); let contextSection = "## Query to Explain\n\n"; @@ -6611,10 +7563,7 @@ ${content}` server.prompt( "document_codeql_query", "Create or update documentation for a CodeQL query - generates standardized markdown documentation as a sibling file to the query", - { - queryPath: z32.string().describe("Path to the CodeQL query file (.ql or .qlref)"), - language: z32.enum(SUPPORTED_LANGUAGES).describe("Programming language of the query") - }, + documentCodeqlQuerySchema.shape, async ({ queryPath, language }) => { const template = loadPromptTemplate("document-codeql-query.prompt.md"); const contextSection = `## Query to Document @@ -6636,7 +7585,42 @@ ${content}` }; } ); - logger.info("Registered 9 workflow prompts"); + server.prompt( + "ql_lsp_iterative_development", + "Iterative CodeQL query development using LSP tools for completion, navigation, and validation", + qlLspIterativeDevelopmentSchema.shape, + async ({ language, queryPath, workspaceUri }) => { + const template = loadPromptTemplate("ql-lsp-iterative-development.prompt.md"); + let contextSection = "## Your Development Context\n\n"; + if (language) { + contextSection += `- **Language**: ${language} +`; + } + if (queryPath) { + contextSection += `- **Query Path**: ${queryPath} +`; + } + if (workspaceUri) { + contextSection += `- **Workspace URI**: ${workspaceUri} +`; + } + if (language || queryPath || workspaceUri) { + contextSection += "\n"; + } + return { + messages: [ + { + role: "user", + content: { + type: "text", + text: contextSection + template + } + } + ] + }; + } + ); + logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} workflow prompts`); } function buildToolsQueryContext(language, database, sourceFiles, sourceFunction, targetFunction) { const lines = [ @@ -6701,8 +7685,8 @@ function buildWorkshopContext(queryPath, language, workshopName, numStages) { } // src/tools/monitoring-tools.ts -import { z as z34 } from "zod"; -import { randomUUID as randomUUID2 } from "crypto"; +import { z as z35 } from "zod"; +import { randomUUID as randomUUID3 } from "crypto"; // ../node_modules/lowdb/lib/core/Low.js function checkArgs(adapter, defaultData) { @@ -6735,7 +7719,7 @@ var Low = class { }; // ../node_modules/lowdb/lib/adapters/node/TextFile.js -import { readFileSync as readFileSync8, renameSync, writeFileSync as writeFileSync5 } from "node:fs"; +import { readFileSync as readFileSync9, renameSync, writeFileSync as writeFileSync5 } from "node:fs"; import path3 from "node:path"; var TextFileSync = class { #tempFilename; @@ -6748,7 +7732,7 @@ var TextFileSync = class { read() { let data; try { - data = readFileSync8(this.#filename, "utf-8"); + data = readFileSync9(this.#filename, "utf-8"); } catch (e) { if (e.code === "ENOENT") { return null; @@ -6797,136 +7781,136 @@ var JSONFileSync = class extends DataFileSync { }; // src/lib/session-data-manager.ts -import { mkdirSync as mkdirSync7, writeFileSync as writeFileSync6 } from "fs"; -import { join as join13 } from "path"; -import { randomUUID } from "crypto"; +import { mkdirSync as mkdirSync8, writeFileSync as writeFileSync6 } from "fs"; +import { join as join14 } from "path"; +import { randomUUID as randomUUID2 } from "crypto"; // src/types/monitoring.ts -import { z as z33 } from "zod"; -var MCPCallRecordSchema = z33.object({ - callId: z33.string(), - timestamp: z33.string(), +import { z as z34 } from "zod"; +var MCPCallRecordSchema = z34.object({ + callId: z34.string(), + timestamp: z34.string(), // ISO timestamp - toolName: z33.string(), - parameters: z33.record(z33.any()), - result: z33.any(), - success: z33.boolean(), - duration: z33.number(), + toolName: z34.string(), + parameters: z34.record(z34.any()), + result: z34.any(), + success: z34.boolean(), + duration: z34.number(), // milliseconds - nextSuggestedTool: z33.string().optional() + nextSuggestedTool: z34.string().optional() }); -var TestExecutionRecordSchema = z33.object({ - executionId: z33.string(), - timestamp: z33.string(), - type: z33.enum(["compilation", "test_run", "database_build"]), - success: z33.boolean(), - details: z33.record(z33.any()), - metrics: z33.object({ - passRate: z33.number().optional(), - coverage: z33.number().optional(), - performance: z33.number().optional() +var TestExecutionRecordSchema = z34.object({ + executionId: z34.string(), + timestamp: z34.string(), + type: z34.enum(["compilation", "test_run", "database_build"]), + success: z34.boolean(), + details: z34.record(z34.any()), + metrics: z34.object({ + passRate: z34.number().optional(), + coverage: z34.number().optional(), + performance: z34.number().optional() }).optional() }); -var QualityScoreRecordSchema = z33.object({ - scoreId: z33.string(), - timestamp: z33.string(), - overallScore: z33.number().min(0).max(100), +var QualityScoreRecordSchema = z34.object({ + scoreId: z34.string(), + timestamp: z34.string(), + overallScore: z34.number().min(0).max(100), // 0-100 - dimensions: z33.object({ - syntacticCorrectness: z33.number().min(0).max(100), - testCoverageResults: z33.number().min(0).max(100), - documentationQuality: z33.number().min(0).max(100), - functionalCorrectness: z33.number().min(0).max(100) + dimensions: z34.object({ + syntacticCorrectness: z34.number().min(0).max(100), + testCoverageResults: z34.number().min(0).max(100), + documentationQuality: z34.number().min(0).max(100), + functionalCorrectness: z34.number().min(0).max(100) }), - grade: z33.enum(["A", "B", "C", "D", "F"]), - recommendations: z33.array(z33.string()) + grade: z34.enum(["A", "B", "C", "D", "F"]), + recommendations: z34.array(z34.string()) }); -var QueryStateSchema = z33.object({ - filesPresent: z33.array(z33.string()), - compilationStatus: z33.enum(["unknown", "success", "failed"]), - testStatus: z33.enum(["unknown", "passing", "failing", "no_tests"]), - documentationStatus: z33.enum(["unknown", "present", "missing", "incomplete"]), - lastActivity: z33.string() +var QueryStateSchema = z34.object({ + filesPresent: z34.array(z34.string()), + compilationStatus: z34.enum(["unknown", "success", "failed"]), + testStatus: z34.enum(["unknown", "passing", "failing", "no_tests"]), + documentationStatus: z34.enum(["unknown", "present", "missing", "incomplete"]), + lastActivity: z34.string() // ISO timestamp }); -var QueryDevelopmentSessionSchema = z33.object({ +var QueryDevelopmentSessionSchema = z34.object({ // Session Metadata - sessionId: z33.string(), - queryPath: z33.string(), - language: z33.string(), - queryType: z33.string().optional(), - description: z33.string().optional(), - startTime: z33.string(), + sessionId: z34.string(), + queryPath: z34.string(), + language: z34.string(), + queryType: z34.string().optional(), + description: z34.string().optional(), + startTime: z34.string(), // ISO timestamp - endTime: z33.string().optional(), + endTime: z34.string().optional(), // ISO timestamp - status: z33.enum(["active", "completed", "failed", "abandoned"]), + status: z34.enum(["active", "completed", "failed", "abandoned"]), // MCP Call History - mcpCalls: z33.array(MCPCallRecordSchema), + mcpCalls: z34.array(MCPCallRecordSchema), // Test Execution Records - testExecutions: z33.array(TestExecutionRecordSchema), + testExecutions: z34.array(TestExecutionRecordSchema), // Quality Metrics - qualityScores: z33.array(QualityScoreRecordSchema), + qualityScores: z34.array(QualityScoreRecordSchema), // Development State currentState: QueryStateSchema, - recommendations: z33.array(z33.string()), - nextSuggestedTool: z33.string().optional() + recommendations: z34.array(z34.string()), + nextSuggestedTool: z34.string().optional() }); -var SessionFilterSchema = z33.object({ - queryPath: z33.string().optional(), - status: z33.string().optional(), - dateRange: z33.tuple([z33.string(), z33.string()]).optional(), - language: z33.string().optional(), - queryType: z33.string().optional() +var SessionFilterSchema = z34.object({ + queryPath: z34.string().optional(), + status: z34.string().optional(), + dateRange: z34.tuple([z34.string(), z34.string()]).optional(), + language: z34.string().optional(), + queryType: z34.string().optional() }); -var ComparisonReportSchema = z33.object({ - sessionIds: z33.array(z33.string()), - dimensions: z33.array(z33.string()), - timestamp: z33.string(), - results: z33.record(z33.any()) +var ComparisonReportSchema = z34.object({ + sessionIds: z34.array(z34.string()), + dimensions: z34.array(z34.string()), + timestamp: z34.string(), + results: z34.record(z34.any()) }); -var AggregateReportSchema = z33.object({ +var AggregateReportSchema = z34.object({ filters: SessionFilterSchema, - timestamp: z33.string(), - totalSessions: z33.number(), - successRate: z33.number(), - averageQualityScore: z33.number(), - commonPatterns: z33.array(z33.string()), - recommendations: z33.array(z33.string()) + timestamp: z34.string(), + totalSessions: z34.number(), + successRate: z34.number(), + averageQualityScore: z34.number(), + commonPatterns: z34.array(z34.string()), + recommendations: z34.array(z34.string()) }); -var ExportResultSchema = z33.object({ - format: z33.enum(["json", "html", "markdown"]), - filename: z33.string(), - content: z33.string(), - timestamp: z33.string() +var ExportResultSchema = z34.object({ + format: z34.enum(["json", "html", "markdown"]), + filename: z34.string(), + content: z34.string(), + timestamp: z34.string() }); -var FunctionalTestResultSchema = z33.object({ - sessionId: z33.string(), - queryPath: z33.string(), - passed: z33.boolean(), - criteria: z33.record(z33.any()), - details: z33.record(z33.any()), - timestamp: z33.string() +var FunctionalTestResultSchema = z34.object({ + sessionId: z34.string(), + queryPath: z34.string(), + passed: z34.boolean(), + criteria: z34.record(z34.any()), + details: z34.record(z34.any()), + timestamp: z34.string() }); -var TestReportSchema = z33.object({ - sessionIds: z33.array(z33.string()), - criteria: z33.record(z33.any()), - timestamp: z33.string(), - overallPassRate: z33.number(), - results: z33.array(FunctionalTestResultSchema), - summary: z33.record(z33.any()) +var TestReportSchema = z34.object({ + sessionIds: z34.array(z34.string()), + criteria: z34.record(z34.any()), + timestamp: z34.string(), + overallPassRate: z34.number(), + results: z34.array(FunctionalTestResultSchema), + summary: z34.record(z34.any()) }); -var MonitoringConfigSchema = z33.object({ - storageLocation: z33.string().default(".ql-mcp-tracking/"), - autoTrackSessions: z33.boolean().default(true), - retentionDays: z33.number().default(90), - includeCallParameters: z33.boolean().default(true), - includeCallResults: z33.boolean().default(true), - maxActiveSessionsPerQuery: z33.number().default(3), - scoringFrequency: z33.enum(["per_call", "periodic", "manual"]).default("per_call"), - archiveCompletedSessions: z33.boolean().default(true), - enableRecommendations: z33.boolean().default(true), - enableMonitoringTools: z33.boolean().default(false) +var MonitoringConfigSchema = z34.object({ + storageLocation: z34.string().default(".ql-mcp-tracking/"), + autoTrackSessions: z34.boolean().default(true), + retentionDays: z34.number().default(90), + includeCallParameters: z34.boolean().default(true), + includeCallResults: z34.boolean().default(true), + maxActiveSessionsPerQuery: z34.number().default(3), + scoringFrequency: z34.enum(["per_call", "periodic", "manual"]).default("per_call"), + archiveCompletedSessions: z34.boolean().default(true), + enableRecommendations: z34.boolean().default(true), + enableMonitoringTools: z34.boolean().default(false) // Opt-in: session_* tools disabled by default for end-users }); @@ -6943,7 +7927,7 @@ var SessionDataManager = class { }); this.storageDir = this.config.storageLocation; this.ensureStorageDirectory(); - const adapter = new JSONFileSync(join13(this.storageDir, "sessions.json")); + const adapter = new JSONFileSync(join14(this.storageDir, "sessions.json")); this.db = new Low(adapter, { sessions: [] }); @@ -6972,12 +7956,12 @@ var SessionDataManager = class { */ ensureStorageDirectory() { try { - mkdirSync7(this.storageDir, { recursive: true }); + mkdirSync8(this.storageDir, { recursive: true }); const subdirs = ["sessions-archive", "exports"]; for (const subdir of subdirs) { - mkdirSync7(join13(this.storageDir, subdir), { recursive: true }); + mkdirSync8(join14(this.storageDir, subdir), { recursive: true }); } - const configPath = join13(this.storageDir, "config.json"); + const configPath = join14(this.storageDir, "config.json"); try { writeFileSync6(configPath, JSON.stringify(this.config, null, 2), { flag: "wx" }); } catch (e) { @@ -6994,7 +7978,7 @@ var SessionDataManager = class { * Start a new query development session */ async startSession(queryPath, language, queryType, description) { - const sessionId = randomUUID(); + const sessionId = randomUUID2(); const startTime = (/* @__PURE__ */ new Date()).toISOString(); const session = { sessionId, @@ -7156,9 +8140,9 @@ var SessionDataManager = class { if (!session) return; const date = new Date(session.endTime || session.startTime); const monthDir = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}`; - const archiveDir = join13(this.storageDir, "sessions-archive", monthDir); - mkdirSync7(archiveDir, { recursive: true }); - const archiveFile = join13(archiveDir, `${sessionId}.json`); + const archiveDir = join14(this.storageDir, "sessions-archive", monthDir); + mkdirSync8(archiveDir, { recursive: true }); + const archiveFile = join14(archiveDir, `${sessionId}.json`); writeFileSync6(archiveFile, JSON.stringify(session, null, 2)); await this.db.read(); this.db.data.sessions = this.db.data.sessions.filter((s) => s.sessionId !== sessionId); @@ -7210,7 +8194,7 @@ var SessionDataManager = class { ...this.config, ...configUpdate }); - const configPath = join13(this.storageDir, "config.json"); + const configPath = join14(this.storageDir, "config.json"); writeFileSync6(configPath, JSON.stringify(this.config, null, 2)); logger.info("Updated monitoring configuration"); } @@ -7220,7 +8204,7 @@ function parseBoolEnv(envVar, defaultValue) { return envVar.toLowerCase() === "true" || envVar === "1"; } var sessionDataManager = new SessionDataManager({ - storageLocation: process.env.MONITORING_STORAGE_LOCATION || join13(getProjectTmpBase(), ".ql-mcp-tracking"), + storageLocation: process.env.MONITORING_STORAGE_LOCATION || join14(getProjectTmpBase(), ".ql-mcp-tracking"), enableMonitoringTools: parseBoolEnv(process.env.ENABLE_MONITORING_TOOLS, false) }); @@ -7250,8 +8234,8 @@ function registerSessionEndTool(server) { "session_end", "End a query development session with final status", { - sessionId: z34.string().describe("ID of the session to end"), - status: z34.enum(["completed", "failed", "abandoned"]).describe("Final status of the session") + sessionId: z35.string().describe("ID of the session to end"), + status: z35.enum(["completed", "failed", "abandoned"]).describe("Final status of the session") }, async ({ sessionId, status }) => { try { @@ -7295,7 +8279,7 @@ function registerSessionGetTool(server) { "session_get", "Get complete details of a specific query development session", { - sessionId: z34.string().describe("ID of the session to retrieve") + sessionId: z35.string().describe("ID of the session to retrieve") }, async ({ sessionId }) => { try { @@ -7339,11 +8323,11 @@ function registerSessionListTool(server) { "session_list", "List query development sessions with optional filtering", { - queryPath: z34.string().optional().describe("Filter by query path (partial match)"), - status: z34.string().optional().describe("Filter by session status"), - dateRange: z34.array(z34.string()).length(2).optional().describe("Filter by date range [start, end] (ISO timestamps)"), - language: z34.string().optional().describe("Filter by programming language"), - queryType: z34.string().optional().describe("Filter by query type") + queryPath: z35.string().optional().describe("Filter by query path (partial match)"), + status: z35.string().optional().describe("Filter by session status"), + dateRange: z35.array(z35.string()).length(2).optional().describe("Filter by date range [start, end] (ISO timestamps)"), + language: z35.string().optional().describe("Filter by programming language"), + queryType: z35.string().optional().describe("Filter by query type") }, async ({ queryPath, status, dateRange, language, queryType }) => { try { @@ -7399,11 +8383,11 @@ function registerSessionUpdateStateTool(server) { "session_update_state", "Update the current state of a query development session", { - sessionId: z34.string().describe("ID of the session to update"), - filesPresent: z34.array(z34.string()).optional().describe("List of files present in the query development"), - compilationStatus: z34.enum(["unknown", "success", "failed"]).optional().describe("Current compilation status"), - testStatus: z34.enum(["unknown", "passing", "failing", "no_tests"]).optional().describe("Current test status"), - documentationStatus: z34.enum(["unknown", "present", "missing", "incomplete"]).optional().describe("Documentation status") + sessionId: z35.string().describe("ID of the session to update"), + filesPresent: z35.array(z35.string()).optional().describe("List of files present in the query development"), + compilationStatus: z35.enum(["unknown", "success", "failed"]).optional().describe("Current compilation status"), + testStatus: z35.enum(["unknown", "passing", "failing", "no_tests"]).optional().describe("Current test status"), + documentationStatus: z35.enum(["unknown", "present", "missing", "incomplete"]).optional().describe("Documentation status") }, async ({ sessionId, filesPresent, compilationStatus, testStatus, documentationStatus }) => { try { @@ -7453,8 +8437,8 @@ function registerSessionGetCallHistoryTool(server) { "session_get_call_history", "Get MCP call history for a specific session", { - sessionId: z34.string().describe("ID of the session"), - limit: z34.number().optional().describe("Maximum number of calls to return (most recent first)") + sessionId: z35.string().describe("ID of the session"), + limit: z35.number().optional().describe("Maximum number of calls to return (most recent first)") }, async ({ sessionId, limit }) => { try { @@ -7506,8 +8490,8 @@ function registerSessionGetTestHistoryTool(server) { "session_get_test_history", "Get test execution history for a specific session", { - sessionId: z34.string().describe("ID of the session"), - limit: z34.number().optional().describe("Maximum number of test executions to return (most recent first)") + sessionId: z35.string().describe("ID of the session"), + limit: z35.number().optional().describe("Maximum number of test executions to return (most recent first)") }, async ({ sessionId, limit }) => { try { @@ -7559,8 +8543,8 @@ function registerSessionGetScoreHistoryTool(server) { "session_get_score_history", "Get quality score history for a specific session", { - sessionId: z34.string().describe("ID of the session"), - limit: z34.number().optional().describe("Maximum number of scores to return (most recent first)") + sessionId: z35.string().describe("ID of the session"), + limit: z35.number().optional().describe("Maximum number of scores to return (most recent first)") }, async ({ sessionId, limit }) => { try { @@ -7612,7 +8596,7 @@ function registerSessionCalculateCurrentScoreTool(server) { "session_calculate_current_score", "Calculate current quality score for a session based on its state", { - sessionId: z34.string().describe("ID of the session") + sessionId: z35.string().describe("ID of the session") }, async ({ sessionId }) => { try { @@ -7660,8 +8644,8 @@ function registerSessionsCompareTool(server) { "sessions_compare", "Compare multiple query development sessions across specified dimensions", { - sessionIds: z34.array(z34.string()).describe("Array of session IDs to compare"), - dimensions: z34.array(z34.string()).optional().describe("Specific dimensions to compare (default: all)") + sessionIds: z35.array(z35.string()).describe("Array of session IDs to compare"), + dimensions: z35.array(z35.string()).optional().describe("Specific dimensions to compare (default: all)") }, async ({ sessionIds, dimensions }) => { try { @@ -7709,11 +8693,11 @@ function registerSessionsAggregateTool(server) { "sessions_aggregate", "Generate aggregate insights from multiple sessions based on filters", { - queryPath: z34.string().optional().describe("Filter by query path (partial match)"), - status: z34.string().optional().describe("Filter by session status"), - dateRange: z34.array(z34.string()).length(2).optional().describe("Filter by date range [start, end] (ISO timestamps)"), - language: z34.string().optional().describe("Filter by programming language"), - queryType: z34.string().optional().describe("Filter by query type") + queryPath: z35.string().optional().describe("Filter by query path (partial match)"), + status: z35.string().optional().describe("Filter by session status"), + dateRange: z35.array(z35.string()).length(2).optional().describe("Filter by date range [start, end] (ISO timestamps)"), + language: z35.string().optional().describe("Filter by programming language"), + queryType: z35.string().optional().describe("Filter by query type") }, async ({ queryPath, status, dateRange, language, queryType }) => { try { @@ -7755,8 +8739,8 @@ function registerSessionsExportTool(server) { "sessions_export", "Export session data in specified format for external analysis", { - sessionIds: z34.array(z34.string()).describe("Array of session IDs to export"), - format: z34.enum(["json", "html", "markdown"]).optional().default("json").describe("Export format") + sessionIds: z35.array(z35.string()).describe("Array of session IDs to export"), + format: z35.enum(["json", "html", "markdown"]).optional().default("json").describe("Export format") }, async ({ sessionIds, format = "json" }) => { try { @@ -7825,7 +8809,7 @@ function calculateQualityScore(session) { recommendations.push("Improve test pass rate and verify query logic"); } return { - scoreId: randomUUID2(), + scoreId: randomUUID3(), timestamp: timestamp2, overallScore, dimensions: { @@ -8093,7 +9077,7 @@ function generateListRecommendations(sessions) { init_cli_executor(); init_package_paths(); init_logger(); -dotenv.config({ path: resolve10(packageRootDir, ".env") }); +dotenv.config({ path: resolve11(packageRootDir, ".env") }); var PACKAGE_NAME = "codeql-development-mcp-server"; var VERSION = "2.23.9"; async function startServer(mode = "stdio") { @@ -8107,11 +9091,13 @@ async function startServer(mode = "stdio") { version: VERSION }); registerCodeQLTools(server); + registerLSPTools(server); registerCodeQLResources(server); registerLanguageResources(server); registerWorkflowPrompts(server); registerMonitoringTools(server); await sessionDataManager.initialize(); + initServerManager(); if (mode === "stdio") { const transport = new StdioServerTransport(); await server.connect(transport); @@ -8142,10 +9128,10 @@ async function startServer(mode = "stdio") { }); const host = process.env.HTTP_HOST || "localhost"; const port = Number(process.env.HTTP_PORT || process.env.PORT) || 3e3; - return new Promise((resolve11, reject) => { + return new Promise((resolve12, reject) => { const httpServer = app.listen(port, host, () => { logger.info(`HTTP server listening on http://${host}:${port}/mcp`); - resolve11(); + resolve12(); }); httpServer.on("error", (error) => { logger.error("HTTP server error:", error); @@ -8160,6 +9146,7 @@ function setupGracefulShutdown(server) { const shutdown = async () => { logger.info("Shutting down server..."); try { + await shutdownServerManager(); await server.close(); logger.info("McpServer closed gracefully"); process.exit(0); @@ -8181,8 +9168,8 @@ async function main() { process.exit(1); } } -var scriptPath = process.argv[1] ? resolve10(process.argv[1]) : void 0; -if (scriptPath && import.meta.url === pathToFileURL3(scriptPath).href) { +var scriptPath = process.argv[1] ? resolve11(process.argv[1]) : void 0; +if (scriptPath && import.meta.url === pathToFileURL4(scriptPath).href) { main(); } export { diff --git a/server/dist/codeql-development-mcp-server.js.map b/server/dist/codeql-development-mcp-server.js.map index 6cf43fef..386153ed 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 = '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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 { getPackageVersion } from '../utils/package-paths';\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: getPackageVersion()\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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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", "isAbsolute", "resolve", "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"] + "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/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/tools/lsp/lsp-diagnostics.ts", "../src/lib/server-manager.ts", "../src/lib/server-config.ts", "../src/lib/language-server.ts", "../src/lib/query-server.ts", "../src/lib/cli-server.ts", "../src/tools/lsp/lsp-handlers.ts", "../src/tools/lsp/lsp-tools.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 = '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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager\n initServerManager();\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 via the server manager.\n *\n * - Respects `searchPath` and `workspaceUri` on every call\n * - Restarts the server when configuration changes\n * - Uses session-isolated cache directories\n */\nasync function getLanguageServer(\n options: LanguageServerOptions = {},\n workspaceUri?: string,\n): Promise {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const languageServer = await manager.getLanguageServer(config);\n\n const effectiveUri = workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await languageServer.initialize(effectiveUri);\n\n return languageServer;\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getLanguageServer(serverOptions, workspaceUri);\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Register cleanup on server shutdown\n process.on('SIGINT', async () => {\n await shutdownDiagnosticsServer();\n });\n process.on('SIGTERM', async () => {\n await shutdownDiagnosticsServer();\n });\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\n}\n", "/**\n * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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 { getPackageVersion } from '../utils/package-paths';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait briefly for the server to become ready\n await new Promise((resolve) => setTimeout(resolve, 2000));\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n this.sendRaw(message);\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n }, 2000);\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Brief startup delay for JVM init\n await new Promise((resolve) => setTimeout(resolve, 1500));\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n this.stdoutBuffer = '';\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n const str = data.toString();\n\n // Look for NUL byte delimiter\n const nulIndex = str.indexOf('\\0');\n if (nulIndex === -1) {\n // No delimiter yet, accumulate\n this.stdoutBuffer += str;\n return;\n }\n\n // Found delimiter \u2014 command is complete\n this.stdoutBuffer += str.substring(0, nulIndex);\n const result = this.stdoutBuffer;\n this.stdoutBuffer = '';\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n // Handle any remaining data after the NUL byte\n const remainder = str.substring(nulIndex + 1);\n if (remainder.length > 0) {\n this.stdoutBuffer = remainder;\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { readFileSync } from 'fs';\nimport { pathToFileURL } from 'url';\nimport { isAbsolute, resolve } from 'path';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /** Absolute path to the QL file. */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: params.searchPath ?? resolve(pkgRoot, 'ql'),\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n const effectiveUri = params.workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await server.initialize(effectiveUri);\n\n return server;\n}\n\n/**\n * Build TextDocumentPositionParams and ensure the document is open.\n */\nfunction prepareDocumentPosition(\n server: Awaited>,\n params: LSPToolParams,\n): { docUri: string; positionParams: TextDocumentPositionParams } {\n // Resolve relative paths against CWD (supports integration test fixtures)\n const absPath = isAbsolute(params.filePath) ? params.filePath : resolve(process.cwd(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = readFileSync(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n const positionParams: TextDocumentPositionParams = {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n\n return { docUri, positionParams };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Absolute path to the CodeQL (.ql/.qll) file'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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", "isAbsolute", "resolve", "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", "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", "z", "mkdirSync", "join", "type", "setTimeout", "delimiter", "join", "delimiter", "resolve", "setTimeout", "join", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "str", "join", "mkdirSync", "type", "join", "resolve", "pathToFileURL", "z", "readFileSync", "pathToFileURL", "isAbsolute", "resolve", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] } diff --git a/server/src/codeql-development-mcp-server.ts b/server/src/codeql-development-mcp-server.ts index bef00217..f4534011 100644 --- a/server/src/codeql-development-mcp-server.ts +++ b/server/src/codeql-development-mcp-server.ts @@ -12,11 +12,13 @@ import dotenv from 'dotenv'; import { resolve } from 'path'; import { pathToFileURL } from 'url'; import { registerCodeQLTools, registerCodeQLResources } from './tools'; +import { registerLSPTools } from './tools/lsp'; 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, validateCodeQLBinaryReachable } from './lib/cli-executor'; +import { initServerManager, shutdownServerManager } from './lib/server-manager'; import { packageRootDir } from './utils/package-paths'; import { logger } from './utils/logger'; @@ -54,6 +56,9 @@ export async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise { logger.info('Shutting down server...'); try { + // Shut down all CodeQL background servers first + await shutdownServerManager(); await server.close(); logger.info('McpServer closed gracefully'); process.exit(0); diff --git a/server/src/lib/cli-server.ts b/server/src/lib/cli-server.ts new file mode 100644 index 00000000..4ef1f9dc --- /dev/null +++ b/server/src/lib/cli-server.ts @@ -0,0 +1,247 @@ +/** + * CodeQL CLI Server client. + * + * Manages a long-lived `codeql execute cli-server` process that executes CLI + * commands without repeated JVM startup overhead. Commands are serialized as + * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON. + * + * Inspired by the `CodeQLCliServer` class in github/vscode-codeql. + */ + +import { ChildProcess, spawn } from 'child_process'; +import { delimiter } from 'path'; +import { EventEmitter } from 'events'; +import { clearTimeout, setTimeout } from 'timers'; +import { buildCLIServerArgs, CLIServerConfig } from './server-config'; +import { getResolvedCodeQLDir } from './cli-executor'; +import { logger } from '../utils/logger'; + +/** + * A queued command waiting to be sent to the CLI server. + */ +interface QueuedCommand { + args: string[]; + reject: (_error: Error) => void; + resolve: (_value: string) => void; +} + +/** + * Client for the CodeQL CLI Server process. + * + * The cli-server uses a simple NUL-delimited protocol: + * - **Request**: JSON array of command arguments, followed by a NUL byte. + * - **Response**: command stdout, terminated by a NUL byte on stdout. + * stderr is forwarded as-is. + */ +export class CodeQLCLIServer extends EventEmitter { + private commandInProgress = false; + private commandQueue: Array<() => void> = []; + private readonly config: CLIServerConfig; + private currentReject: ((_error: Error) => void) | null = null; + private currentResolve: ((_value: string) => void) | null = null; + private nullBuffer = Buffer.alloc(1); + private process: ChildProcess | null = null; + private stdoutBuffer = ''; + + constructor(config: CLIServerConfig) { + super(); + this.config = config; + } + + /** + * Start the cli-server process. + */ + async start(): Promise { + if (this.process) { + throw new Error('CLI server is already running'); + } + + logger.info('Starting CodeQL CLI Server...'); + + const args = buildCLIServerArgs(this.config); + + const spawnEnv = { ...process.env }; + const codeqlDir = getResolvedCodeQLDir(); + if (codeqlDir && spawnEnv.PATH) { + spawnEnv.PATH = `${codeqlDir}${delimiter}${spawnEnv.PATH}`; + } else if (codeqlDir) { + spawnEnv.PATH = codeqlDir; + } + + this.process = spawn('codeql', args, { + stdio: ['pipe', 'pipe', 'pipe'], + env: spawnEnv, + }); + + this.process.stdout?.on('data', (data: Buffer) => { + this.handleStdout(data); + }); + + this.process.stderr?.on('data', (data: Buffer) => { + logger.debug('CLIServer stderr:', data.toString()); + }); + + this.process.on('error', (error: Error) => { + logger.error('CLI server process error:', error); + if (this.currentReject) { + this.currentReject(error); + this.currentReject = null; + this.currentResolve = null; + } + this.emit('error', error); + }); + + this.process.on('exit', (code: number | null) => { + logger.info(`CLI server exited with code: ${code}`); + if (this.currentReject) { + this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`)); + this.currentReject = null; + this.currentResolve = null; + } + this.process = null; + this.emit('exit', code); + }); + + // Brief startup delay for JVM init + await new Promise((resolve) => setTimeout(resolve, 1500)); + logger.info('CodeQL CLI Server started'); + } + + /** + * Run a CodeQL CLI command through the persistent server. + * + * Commands are serialized and queued; only one command runs at a time. + * + * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`). + * @returns The stdout output from the command. + */ + runCommand(args: string[]): Promise { + return new Promise((resolve, reject) => { + const execute = () => { + this.executeCommand({ args, reject, resolve }); + }; + + if (this.commandInProgress) { + this.commandQueue.push(execute); + } else { + execute(); + } + }); + } + + /** + * Gracefully shut down the CLI server. + */ + async shutdown(): Promise { + if (!this.process) { + return; + } + + logger.info('Shutting down CodeQL CLI Server...'); + + try { + // Send shutdown command + this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8'); + this.process.stdin?.write(this.nullBuffer); + } catch (error) { + logger.warn('Error during CLI server shutdown request:', error); + } + + // Give it a moment, then force kill + await new Promise((resolve) => { + const timer = setTimeout(() => { + if (this.process) { + this.process.kill('SIGTERM'); + this.process = null; + } + resolve(); + }, 2000); + + if (this.process) { + this.process.once('exit', () => { + clearTimeout(timer); + this.process = null; + resolve(); + }); + } else { + clearTimeout(timer); + resolve(); + } + }); + + this.commandInProgress = false; + this.commandQueue = []; + logger.info('CodeQL CLI Server stopped'); + } + + /** + * Whether the CLI server process is running. + */ + isRunning(): boolean { + return this.process !== null && !this.process.killed; + } + + // ---- private helpers ---- + + private executeCommand(cmd: QueuedCommand): void { + if (!this.process?.stdin) { + cmd.reject(new Error('CLI server is not running')); + return; + } + + this.commandInProgress = true; + this.currentResolve = cmd.resolve; + this.currentReject = cmd.reject; + this.stdoutBuffer = ''; + + try { + this.process.stdin.write(JSON.stringify(cmd.args), 'utf8'); + this.process.stdin.write(this.nullBuffer); + } catch (error) { + this.commandInProgress = false; + this.currentResolve = null; + this.currentReject = null; + cmd.reject(error instanceof Error ? error : new Error(String(error))); + this.runNext(); + } + } + + private handleStdout(data: Buffer): void { + const str = data.toString(); + + // Look for NUL byte delimiter + const nulIndex = str.indexOf('\0'); + if (nulIndex === -1) { + // No delimiter yet, accumulate + this.stdoutBuffer += str; + return; + } + + // Found delimiter — command is complete + this.stdoutBuffer += str.substring(0, nulIndex); + const result = this.stdoutBuffer; + this.stdoutBuffer = ''; + + if (this.currentResolve) { + this.currentResolve(result); + this.currentResolve = null; + this.currentReject = null; + } + + this.commandInProgress = false; + this.runNext(); + + // Handle any remaining data after the NUL byte + const remainder = str.substring(nulIndex + 1); + if (remainder.length > 0) { + this.stdoutBuffer = remainder; + } + } + + private runNext(): void { + const next = this.commandQueue.shift(); + if (next) { + next(); + } + } +} diff --git a/server/src/lib/language-server.ts b/server/src/lib/language-server.ts index 77c46694..0b38c2ad 100644 --- a/server/src/lib/language-server.ts +++ b/server/src/lib/language-server.ts @@ -45,9 +45,60 @@ export interface PublishDiagnosticsParams { export interface LanguageServerOptions { searchPath?: string; logdir?: string; - loglevel?: 'OFF' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG' | 'TRACE' | 'ALL'; + loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN'; synchronous?: boolean; - verbosity?: 'errors' | 'warnings' | 'progress' | 'progress+' | 'progress++' | 'progress+++'; + verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings'; +} + +/** + * Position in a text document (0-based line and character). + */ +export interface LSPPosition { + character: number; + line: number; +} + +/** + * A range in a text document. + */ +export interface LSPRange { + end: LSPPosition; + start: LSPPosition; +} + +/** + * A location in a resource (file URI + range). + */ +export interface LSPLocation { + range: LSPRange; + uri: string; +} + +/** + * Identifies a text document by its URI. + */ +export interface TextDocumentIdentifier { + uri: string; +} + +/** + * A text document position (document + position within it). + */ +export interface TextDocumentPositionParams { + position: LSPPosition; + textDocument: TextDocumentIdentifier; +} + +/** + * A completion item returned by the language server. + */ +export interface CompletionItem { + detail?: string; + documentation?: string | { kind: string; value: string }; + insertText?: string; + kind?: number; + label: string; + sortText?: string; } export class CodeQLLanguageServer extends EventEmitter { @@ -55,6 +106,7 @@ export class CodeQLLanguageServer extends EventEmitter { private messageId = 1; private pendingResponses = new Map void; reject: (_error: Error) => void }>(); private isInitialized = false; + private currentWorkspaceUri: string | undefined; private messageBuffer = ''; constructor(private _options: LanguageServerOptions = {}) { @@ -233,8 +285,19 @@ export class CodeQLLanguageServer extends EventEmitter { this.sendMessage(message); } + /** + * Initialize the language server with an optional workspace URI. + * + * If the server is already initialized with a different workspace, a + * `workspace/didChangeWorkspaceFolders` notification is sent to update + * the workspace context instead of requiring a full restart. + */ async initialize(workspaceUri?: string): Promise { if (this.isInitialized) { + // If workspace changed, notify the server + if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) { + await this.updateWorkspace(workspaceUri); + } return; } @@ -248,13 +311,19 @@ export class CodeQLLanguageServer extends EventEmitter { }, capabilities: { textDocument: { + completion: { completionItem: { snippetSupport: false } }, + definition: {}, + publishDiagnostics: {}, + references: {}, synchronization: { - didOpen: true, + didClose: true, didChange: true, - didClose: true + didOpen: true, }, - publishDiagnostics: {} - } + }, + workspace: { + workspaceFolders: true, + }, } }; @@ -267,11 +336,39 @@ export class CodeQLLanguageServer extends EventEmitter { await this.sendRequest('initialize', initParams); this.sendNotification('initialized', {}); - + + this.currentWorkspaceUri = workspaceUri; this.isInitialized = true; logger.info('CodeQL Language Server initialized successfully'); } + /** + * Update the workspace folders on a running, initialized server. + */ + private async updateWorkspace(newUri: string): Promise { + logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`); + + const removed = this.currentWorkspaceUri + ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }] + : []; + + this.sendNotification('workspace/didChangeWorkspaceFolders', { + event: { + added: [{ uri: newUri, name: 'codeql-workspace' }], + removed, + }, + }); + + this.currentWorkspaceUri = newUri; + } + + /** + * Get the current workspace URI. + */ + getWorkspaceUri(): string | undefined { + return this.currentWorkspaceUri; + } + async evaluateQL(qlCode: string, uri?: string): Promise { if (!this.isInitialized) { throw new Error('Language server is not initialized'); @@ -319,6 +416,95 @@ export class CodeQLLanguageServer extends EventEmitter { }); } + // ---- LSP feature methods (issue #1) ---- + + /** + * Get code completions at a position in a document. + */ + async getCompletions(params: TextDocumentPositionParams): Promise { + if (!this.isInitialized) { + throw new Error('Language server is not initialized'); + } + const result = await this.sendRequest('textDocument/completion', params); + // The result may be a CompletionList or CompletionItem[] + if (result && typeof result === 'object' && 'items' in (result as object)) { + return (result as { items: CompletionItem[] }).items; + } + return (result as CompletionItem[]) || []; + } + + /** + * Find the definition(s) of a symbol at a position. + */ + async getDefinition(params: TextDocumentPositionParams): Promise { + if (!this.isInitialized) { + throw new Error('Language server is not initialized'); + } + const result = await this.sendRequest('textDocument/definition', params); + return this.normalizeLocations(result); + } + + /** + * Find all references to a symbol at a position. + */ + async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise { + if (!this.isInitialized) { + throw new Error('Language server is not initialized'); + } + const result = await this.sendRequest('textDocument/references', { + ...params, + context: params.context ?? { includeDeclaration: true }, + }); + return this.normalizeLocations(result); + } + + /** + * Open a text document in the language server. + * The document must be opened before requesting completions, definitions, etc. + */ + openDocument(uri: string, text: string, languageId = 'ql', version = 1): void { + if (!this.isInitialized) { + throw new Error('Language server is not initialized'); + } + this.sendNotification('textDocument/didOpen', { + textDocument: { uri, languageId, version, text }, + }); + } + + /** + * Close a text document in the language server. + */ + closeDocument(uri: string): void { + if (!this.isInitialized) { + throw new Error('Language server is not initialized'); + } + this.sendNotification('textDocument/didClose', { + textDocument: { uri }, + }); + } + + /** + * Normalize a definition/references/implementation result to Location[]. + * The LSP spec allows Location | Location[] | LocationLink[]. + */ + private normalizeLocations(result: unknown): LSPLocation[] { + if (!result) return []; + if (Array.isArray(result)) { + return result.map((item) => { + // LocationLink has targetUri/targetRange + if ('targetUri' in item) { + return { uri: item.targetUri, range: item.targetRange } as LSPLocation; + } + return item as LSPLocation; + }); + } + // Single Location + if (typeof result === 'object' && 'uri' in (result as object)) { + return [result as LSPLocation]; + } + return []; + } + async shutdown(): Promise { if (!this.server) { return; diff --git a/server/src/lib/query-server.ts b/server/src/lib/query-server.ts new file mode 100644 index 00000000..c50fbb53 --- /dev/null +++ b/server/src/lib/query-server.ts @@ -0,0 +1,245 @@ +/** + * CodeQL Query Server (query-server2) client. + * + * Manages a long-lived `codeql execute query-server2` process that evaluates + * queries using a custom JSON-RPC protocol over stdio. Reusing the server + * avoids repeated JVM startup for each query evaluation. + * + * Protocol: The query-server2 uses JSON-RPC with Content-Length headers + * (same framing as LSP) over stdin/stdout. + */ + +import { ChildProcess, spawn } from 'child_process'; +import { delimiter } from 'path'; +import { EventEmitter } from 'events'; +import { clearTimeout, setTimeout } from 'timers'; +import { buildQueryServerArgs, QueryServerConfig } from './server-config'; +import { getResolvedCodeQLDir } from './cli-executor'; +import { logger } from '../utils/logger'; + +/** + * A pending request awaiting a response from the query server. + */ +interface PendingRequest { + reject: (_error: Error) => void; + resolve: (_value: unknown) => void; +} + +/** + * Client for the CodeQL query-server2 process. + * + * Spawns `codeql execute query-server2` and communicates over stdin/stdout + * using JSON-RPC with Content-Length framing. + */ +export class CodeQLQueryServer extends EventEmitter { + private messageBuffer = ''; + private messageId = 1; + private pendingRequests = new Map(); + private process: ChildProcess | null = null; + private readonly config: QueryServerConfig; + + constructor(config: QueryServerConfig) { + super(); + this.config = config; + } + + /** + * Start the query-server2 process. + */ + async start(): Promise { + if (this.process) { + throw new Error('Query server is already running'); + } + + logger.info('Starting CodeQL Query Server (query-server2)...'); + + const args = buildQueryServerArgs(this.config); + + // Build environment with CODEQL_PATH directory prepended to PATH + const spawnEnv = { ...process.env }; + const codeqlDir = getResolvedCodeQLDir(); + if (codeqlDir && spawnEnv.PATH) { + spawnEnv.PATH = `${codeqlDir}${delimiter}${spawnEnv.PATH}`; + } else if (codeqlDir) { + spawnEnv.PATH = codeqlDir; + } + + this.process = spawn('codeql', args, { + stdio: ['pipe', 'pipe', 'pipe'], + env: spawnEnv, + }); + + this.process.stderr?.on('data', (data: Buffer) => { + logger.debug('QueryServer2 stderr:', data.toString()); + }); + + this.process.stdout?.on('data', (data: Buffer) => { + this.handleStdout(data); + }); + + this.process.on('error', (error: Error) => { + logger.error('Query server process error:', error); + this.emit('error', error); + }); + + this.process.on('exit', (code: number | null) => { + logger.info(`Query server exited with code: ${code}`); + this.rejectAllPending(new Error(`Query server exited with code: ${code}`)); + this.process = null; + this.emit('exit', code); + }); + + // Wait briefly for the server to become ready + await new Promise((resolve) => setTimeout(resolve, 2000)); + logger.info('CodeQL Query Server started'); + } + + /** + * Send a request to the query server and await the response. + * + * @param method - The JSON-RPC method name. + * @param params - The method parameters. + * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min). + * @returns The result from the server. + */ + sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise { + const id = this.messageId++; + const message = { + id, + jsonrpc: '2.0' as const, + method, + params, + }; + + return new Promise((resolve, reject) => { + this.pendingRequests.set(id, { reject, resolve }); + this.sendRaw(message); + + const timer = setTimeout(() => { + if (this.pendingRequests.has(id)) { + this.pendingRequests.delete(id); + reject(new Error(`Query server request timeout for method: ${method}`)); + } + }, timeoutMs); + + // Clear the timeout when the promise settles + const originalResolve = resolve; + const originalReject = reject; + const wrapped = { + reject: (err: Error) => { clearTimeout(timer); originalReject(err); }, + resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); }, + }; + this.pendingRequests.set(id, wrapped); + }); + } + + /** + * Gracefully shut down the query server. + */ + async shutdown(): Promise { + if (!this.process) { + return; + } + + logger.info('Shutting down CodeQL Query Server...'); + + try { + await this.sendRequest('shutdown', {}, 5000); + } catch (error) { + logger.warn('Error during query server graceful shutdown:', error); + } + + // Force kill if process lingers + setTimeout(() => { + if (this.process) { + this.process.kill('SIGTERM'); + this.process = null; + } + }, 2000); + } + + /** + * Whether the query server process is running. + */ + isRunning(): boolean { + return this.process !== null && !this.process.killed; + } + + // ---- private helpers ---- + + private handleStdout(data: Buffer): void { + this.messageBuffer += data.toString(); + + let headerEnd = this.messageBuffer.indexOf('\r\n\r\n'); + while (headerEnd !== -1) { + const header = this.messageBuffer.substring(0, headerEnd); + const contentLengthMatch = header.match(/Content-Length: (\d+)/); + + if (contentLengthMatch) { + const contentLength = parseInt(contentLengthMatch[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + + if (this.messageBuffer.length >= messageEnd) { + const messageContent = this.messageBuffer.substring(messageStart, messageEnd); + this.messageBuffer = this.messageBuffer.substring(messageEnd); + + try { + const message = JSON.parse(messageContent); + this.handleMessage(message); + } catch (error) { + logger.error('Failed to parse query server message:', error); + } + + headerEnd = this.messageBuffer.indexOf('\r\n\r\n'); + } else { + break; + } + } else { + logger.error('Invalid query server header:', header); + this.messageBuffer = ''; + break; + } + } + } + + private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void { + logger.debug('QueryServer2 message:', message); + + // Handle responses + if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) { + const pending = this.pendingRequests.get(Number(message.id))!; + this.pendingRequests.delete(Number(message.id)); + + if (message.error) { + pending.reject(new Error(`Query server error: ${message.error.message}`)); + } else { + pending.resolve(message.result); + } + return; + } + + // Handle notifications (progress, etc.) + if (message.method) { + this.emit('notification', { method: message.method, params: message.params }); + } + } + + private rejectAllPending(error: Error): void { + for (const [id, pending] of this.pendingRequests) { + pending.reject(error); + this.pendingRequests.delete(id); + } + } + + private sendRaw(message: object): void { + if (!this.process?.stdin) { + throw new Error('Query server is not running'); + } + + const body = JSON.stringify(message); + const contentLength = Buffer.byteLength(body, 'utf8'); + const frame = `Content-Length: ${contentLength}\r\n\r\n${body}`; + this.process.stdin.write(frame); + } +} diff --git a/server/src/lib/server-config.ts b/server/src/lib/server-config.ts new file mode 100644 index 00000000..d441d6fb --- /dev/null +++ b/server/src/lib/server-config.ts @@ -0,0 +1,188 @@ +/** + * Configuration types for CodeQL background server processes. + * + * CodeQL provides three background server types: + * 1. language-server – LSP-based QL validation (JSON-RPC over stdio) + * 2. query-server2 – Query evaluation (custom protocol over stdio) + * 3. cli-server – JVM reuse for CLI commands (custom protocol over stdio) + * + * Each server type has its own configuration options, but they share common + * settings like searchPath and commonCaches. + */ + +import { createHash } from 'crypto'; + +/** + * Server types supported by CodeQL. + */ +export type CodeQLServerType = 'cli' | 'language' | 'query'; + +/** + * Common configuration shared across all server types. + */ +export interface BaseServerConfig { + /** Path to QL packs (like `codeql query compile --search-path`). */ + searchPath?: string; + /** Location for cached data (compilation plans, downloaded packs). */ + commonCaches?: string; + /** Directory for detailed logs. */ + logdir?: string; +} + +/** + * Configuration for the CodeQL Language Server. + */ +export interface LanguageServerConfig extends BaseServerConfig { + /** Error checking mode. Default: ON_CHANGE */ + checkErrors?: 'EXPLICIT' | 'ON_CHANGE'; + /** Log level for the language server. */ + loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN'; + /** Single-threaded execution. */ + synchronous?: boolean; + /** Verbosity level for progress. */ + verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings'; +} + +/** + * Configuration for the CodeQL Query Server (query-server2). + */ +export interface QueryServerConfig extends BaseServerConfig { + /** Thread count. 0 = one per core, -N = leave N cores free. */ + threads?: number; + /** Query evaluation timeout in seconds. */ + timeout?: number; + /** Maximum disk cache size in MB for intermediate results. */ + maxDiskCache?: number; + /** Path for structured evaluator performance logs. */ + evaluatorLog?: string; + /** Include tuple counts in evaluation logs. */ + tupleCounting?: boolean; + /** Enable debug mode. */ + debug?: boolean; +} + +/** + * Configuration for the CodeQL CLI Server. + */ +export interface CLIServerConfig extends BaseServerConfig { + // cli-server has fewer options — just commonCaches and logdir. +} + +/** + * Union of all server configurations (discriminated by usage context). + */ +export type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig; + +/** + * Compute a deterministic hash for a server configuration. + * Used to detect configuration changes that require a server restart. + * + * @param type - The server type. + * @param config - The server configuration. + * @returns A hex-encoded SHA-256 hash of the canonical JSON representation. + */ +export function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string { + // Deep-sort all keys to ensure deterministic serialization regardless of + // property insertion order. + const sortKeys = (_key: string, value: unknown): unknown => { + if (value && typeof value === 'object' && !Array.isArray(value)) { + const sorted: Record = {}; + for (const k of Object.keys(value as Record).sort()) { + sorted[k] = (value as Record)[k]; + } + return sorted; + } + return value; + }; + const canonical = JSON.stringify({ config, type }, sortKeys); + return createHash('sha256').update(canonical).digest('hex'); +} + +/** + * Build command-line arguments for a language server from its configuration. + */ +export function buildLanguageServerArgs(config: LanguageServerConfig): string[] { + const args: string[] = [ + 'execute', 'language-server', + `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`, + ]; + + if (config.searchPath) { + args.push(`--search-path=${config.searchPath}`); + } + if (config.commonCaches) { + args.push(`--common-caches=${config.commonCaches}`); + } + if (config.logdir) { + args.push(`--logdir=${config.logdir}`); + } + if (config.loglevel) { + args.push(`--loglevel=${config.loglevel}`); + } + if (config.synchronous) { + args.push('--synchronous'); + } + if (config.verbosity) { + args.push(`--verbosity=${config.verbosity}`); + } + + return args; +} + +/** + * Build command-line arguments for a query server from its configuration. + */ +export function buildQueryServerArgs(config: QueryServerConfig): string[] { + const args: string[] = [ + 'execute', 'query-server2', + ]; + + if (config.searchPath) { + args.push(`--search-path=${config.searchPath}`); + } + if (config.commonCaches) { + args.push(`--common-caches=${config.commonCaches}`); + } + if (config.logdir) { + args.push(`--logdir=${config.logdir}`); + } + if (config.threads !== undefined) { + args.push(`--threads=${config.threads}`); + } + if (config.timeout !== undefined) { + args.push(`--timeout=${config.timeout}`); + } + if (config.maxDiskCache !== undefined) { + args.push(`--max-disk-cache=${config.maxDiskCache}`); + } + if (config.evaluatorLog) { + args.push(`--evaluator-log=${config.evaluatorLog}`); + } + if (config.tupleCounting) { + args.push('--tuple-counting'); + } + if (config.debug) { + args.push('--debug'); + args.push('--tuple-counting'); + } + + return args; +} + +/** + * Build command-line arguments for a CLI server from its configuration. + */ +export function buildCLIServerArgs(config: CLIServerConfig): string[] { + const args: string[] = [ + 'execute', 'cli-server', + ]; + + if (config.commonCaches) { + args.push(`--common-caches=${config.commonCaches}`); + } + if (config.logdir) { + args.push(`--logdir=${config.logdir}`); + } + + return args; +} diff --git a/server/src/lib/server-manager.ts b/server/src/lib/server-manager.ts new file mode 100644 index 00000000..dd818421 --- /dev/null +++ b/server/src/lib/server-manager.ts @@ -0,0 +1,312 @@ +/** + * CodeQL Server Manager + * + * Manages the lifecycle of CodeQL background server processes: + * - language-server (LSP-based QL validation) + * - query-server2 (query evaluation) + * - cli-server (JVM reuse for CLI commands) + * + * Servers are keyed by a hash of their configuration. When a caller requests + * a server with a different configuration, the old server is shut down and a + * new one is started. Session-specific cache directories provide isolation. + */ + +import { mkdirSync } from 'fs'; +import { join } from 'path'; +import { randomUUID } from 'crypto'; +import { + CLIServerConfig, + CodeQLServerType, + computeConfigHash, + LanguageServerConfig, + QueryServerConfig, + ServerConfig, +} from './server-config'; +import { CodeQLLanguageServer } from './language-server'; +import { CodeQLQueryServer } from './query-server'; +import { CodeQLCLIServer } from './cli-server'; +import { getProjectTmpDir } from '../utils/temp-dir'; +import { logger } from '../utils/logger'; + +/** + * Entry in the managed servers map. + */ +interface ManagedServer { + configHash: string; + server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer; + sessionId: string; + type: CodeQLServerType; +} + +/** + * Options for creating a session-specific cache layout. + */ +export interface SessionCacheOptions { + /** Override the session ID (defaults to a random UUID). */ + sessionId?: string; +} + +/** + * Manages CodeQL background server processes with config-aware caching. + * + * Callers should use `getLanguageServer()`, `getQueryServer()`, or + * `getCLIServer()` to obtain a running server. If the requested + * configuration differs from the currently running server of that type, the + * old server is stopped and replaced. + */ +export class CodeQLServerManager { + /** Keyed by `CodeQLServerType` — at most one per type at a time. */ + private servers = new Map(); + + /** The session ID used for cache isolation. */ + private sessionId: string; + + /** Root directory for session-specific caches. */ + private sessionCacheDir: string; + + constructor(options?: SessionCacheOptions) { + this.sessionId = options?.sessionId ?? randomUUID(); + this.sessionCacheDir = join( + getProjectTmpDir('codeql-cache'), + this.sessionId, + ); + // Pre-create the cache directory tree + for (const subdir of ['compilation-cache', 'logs', 'query-cache']) { + mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true }); + } + logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`); + } + + // ---- Public API ---- + + /** + * Get the current session ID. + */ + getSessionId(): string { + return this.sessionId; + } + + /** + * Get the session-specific cache directory. + */ + getCacheDir(): string { + return this.sessionCacheDir; + } + + /** + * Return the session-specific log directory. + */ + getLogDir(): string { + return join(this.sessionCacheDir, 'logs'); + } + + /** + * Get or create a Language Server with the given configuration. + * + * If a language server is already running with the same config it is reused. + * If the config has changed the old server is shut down first. + */ + async getLanguageServer(config: LanguageServerConfig): Promise { + const enriched = this.enrichConfig(config) as LanguageServerConfig; + return this.getOrRestart('language', enriched, () => { + // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects + return new CodeQLLanguageServer({ + loglevel: enriched.loglevel, + logdir: enriched.logdir, + searchPath: enriched.searchPath, + synchronous: enriched.synchronous, + verbosity: enriched.verbosity, + }); + }) as Promise; + } + + /** + * Get or create a Query Server with the given configuration. + */ + async getQueryServer(config: QueryServerConfig): Promise { + const enriched = this.enrichConfig(config) as QueryServerConfig; + return this.getOrRestart('query', enriched, () => { + return new CodeQLQueryServer(enriched); + }) as Promise; + } + + /** + * Get or create a CLI Server with the given configuration. + */ + async getCLIServer(config: CLIServerConfig): Promise { + const enriched = this.enrichConfig(config) as CLIServerConfig; + return this.getOrRestart('cli', enriched, () => { + return new CodeQLCLIServer(enriched); + }) as Promise; + } + + /** + * Shut down a specific server type. + */ + async shutdownServer(type: CodeQLServerType): Promise { + const managed = this.servers.get(type); + if (!managed) return; + + logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`); + await this.stopServer(managed); + this.servers.delete(type); + } + + /** + * Shut down all managed servers. + */ + async shutdownAll(): Promise { + logger.info(`Shutting down all servers for session: ${this.sessionId}`); + const shutdownPromises = Array.from(this.servers.entries()).map( + async ([type, managed]) => { + try { + await this.stopServer(managed); + } catch (error) { + logger.error(`Error shutting down ${type} server:`, error); + } + }, + ); + await Promise.all(shutdownPromises); + this.servers.clear(); + logger.info('All servers shut down'); + } + + /** + * Check whether a server of the given type is currently running. + */ + isRunning(type: CodeQLServerType): boolean { + const managed = this.servers.get(type); + if (!managed) return false; + return managed.server.isRunning(); + } + + /** + * Get status information for all managed servers. + */ + getStatus(): Record { + const status: Record = { + cli: null, + language: null, + query: null, + }; + for (const [type, managed] of this.servers) { + status[type] = { + configHash: managed.configHash, + running: managed.server.isRunning(), + sessionId: managed.sessionId, + }; + } + return status as Record; + } + + // ---- Private helpers ---- + + /** + * Enrich a config with session-specific defaults for commonCaches and logdir. + */ + private enrichConfig(config: T): T { + return { + ...config, + commonCaches: config.commonCaches ?? this.sessionCacheDir, + logdir: config.logdir ?? this.getLogDir(), + }; + } + + /** + * Get an existing server if its config matches, otherwise stop the old + * one and start a new server. + */ + private async getOrRestart( + type: CodeQLServerType, + config: ServerConfig, + factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer, + ): Promise { + const hash = computeConfigHash(type, config); + const existing = this.servers.get(type); + + // Reuse if config matches and server is still running + if (existing && existing.configHash === hash && existing.server.isRunning()) { + logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`); + return existing.server; + } + + // Config changed or server died — stop the old one + if (existing) { + logger.info(`${type} server config changed or dead, restarting...`); + await this.stopServer(existing); + this.servers.delete(type); + } + + // Start a new server + const server = factory(); + await server.start(); + + this.servers.set(type, { + configHash: hash, + server, + sessionId: this.sessionId, + type, + }); + + logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`); + return server; + } + + /** + * Stop a managed server, ignoring errors. + */ + private async stopServer(managed: ManagedServer): Promise { + try { + await managed.server.shutdown(); + } catch (error) { + logger.warn(`Error stopping ${managed.type} server:`, error); + // Best-effort — don't propagate + } + } +} + +/** + * Global server manager singleton. + * + * Initialized lazily by `getServerManager()`. The MCP server entry point + * should call `initServerManager()` at startup and `shutdownServerManager()` + * at graceful shutdown. + */ +let globalServerManager: CodeQLServerManager | null = null; + +/** + * Initialize the global server manager (idempotent). + */ +export function initServerManager(options?: SessionCacheOptions): CodeQLServerManager { + if (!globalServerManager) { + globalServerManager = new CodeQLServerManager(options); + } + return globalServerManager; +} + +/** + * Get the global server manager, creating it if needed. + */ +export function getServerManager(): CodeQLServerManager { + if (!globalServerManager) { + globalServerManager = new CodeQLServerManager(); + } + return globalServerManager; +} + +/** + * Shut down the global server manager and all its servers. + */ +export async function shutdownServerManager(): Promise { + if (globalServerManager) { + await globalServerManager.shutdownAll(); + globalServerManager = null; + } +} + +/** + * Reset the global server manager (for testing only). + */ +export function resetServerManager(): void { + globalServerManager = null; +} diff --git a/server/src/prompts/ql-lsp-iterative-development.prompt.md b/server/src/prompts/ql-lsp-iterative-development.prompt.md new file mode 100644 index 00000000..62738cc8 --- /dev/null +++ b/server/src/prompts/ql-lsp-iterative-development.prompt.md @@ -0,0 +1,109 @@ +--- +agent: agent +--- + +# Iterative CodeQL Development with LSP Tools + +Use this workflow to iteratively develop and refine CodeQL queries using the LSP-powered tools. +These tools let you inspect, validate, and navigate QL code at a granular level — working with +specific classes, predicates, and expressions rather than running full queries. + +## When to Use This Workflow + +- Exploring unfamiliar CodeQL libraries to discover available classes and predicates +- Incrementally building a query clause-by-clause with real-time feedback +- Navigating from a class usage to its definition to understand its API +- Finding all usages of a predicate across a codebase +- Validating query fragments before assembling a complete query + +## Prerequisites + +- A CodeQL pack with `codeql-pack.yml` and installed dependencies (`codeql_pack_install`) +- Query files must be on disk (LSP tools operate on files, not inline code) +- The `workspace_uri` parameter should point to the pack root or workspace root + +## Step 1: Discover Available Types + +Use `codeql_lsp_completion` to explore what types are available after an `import` statement. + +**Example**: After writing `import javascript` in a `.ql` file, request completions inside the +`from` clause to see all available classes: + +- Tool: `codeql_lsp_completion` +- Parameters: `file_path` = your query file, `line` = the `from` line, `character` = after the space +- Tip: Set `workspace_uri` to the pack root for dependency resolution + +The completions include class names with documentation, so you can discover types like +`File`, `Function`, `CallExpr`, etc. without leaving the editor. + +## Step 2: Navigate to Definitions + +Once you've chosen a class (e.g., `File`), use `codeql_lsp_definition` to jump to its +definition and understand its member predicates. + +- Tool: `codeql_lsp_definition` +- Parameters: position the cursor on the class name in your query +- Returns: the file URI and line range of the class definition + +This is especially useful for understanding what predicates a class offers +(e.g., `File` has `getBaseName()`, `getExtension()`, `getAbsolutePath()`). + +## Step 3: Find All References + +Use `codeql_lsp_references` to find how a class or predicate is used across the pack. + +- Tool: `codeql_lsp_references` +- Parameters: position the cursor on the symbol +- Returns: all locations where the symbol is used + +This helps you find examples of how experienced query authors use a particular +predicate, which is invaluable for learning patterns. + +## Step 4: Validate Incrementally + +After each modification to your query file: + +1. Save the file to disk +2. Use `codeql_lsp_completion` at the cursor position to verify the language server + understands the context (non-empty completions = good parse state) +3. Use `codeql_query_compile` for a full compilation check +4. Use `codeql_test_run` to validate against expected results + +## Step 5: Quick Evaluate Specific Parts + +Use `find_class_position` and `find_predicate_position` to locate specific +symbols, then use `quick_evaluate` to evaluate just that class or predicate +against a database — without running the full query. + +- Tool: `find_class_position` — find where a class is defined (line/column) +- Tool: `find_predicate_position` — find where a predicate is defined +- Tool: `quick_evaluate` — evaluate just that symbol against a database + +## Iterative Development Loop + +```text +1. Write/modify a clause in the query file + ↓ +2. codeql_lsp_completion → verify context is valid + ↓ +3. codeql_query_compile → check for errors + ↓ +4. codeql_test_run → validate results + ↓ +5. If failing: use codeql_lsp_definition to understand types + ↓ +6. If stuck: use codeql_lsp_references to find usage examples + ↓ +7. Repeat from step 1 +``` + +## Important Notes + +- **`codeql_lsp_diagnostics` works with inline code** but cannot resolve imports + (like `import javascript`) because the inline code isn't associated with a pack. + For import-dependent validation, use `codeql_query_compile` on the actual file. +- **`codeql_lsp_completion` needs `workspace_uri`** pointing to the pack root for + dependency resolution. Without it, completions will be empty. +- **File-based LSP tools** (`completion`, `definition`, `references`) operate on files + that are part of a pack with resolved dependencies. Always run `codeql_pack_install` + first. diff --git a/server/src/prompts/ql-tdd-advanced.prompt.md b/server/src/prompts/ql-tdd-advanced.prompt.md index 855664c7..7de0a88f 100644 --- a/server/src/prompts/ql-tdd-advanced.prompt.md +++ b/server/src/prompts/ql-tdd-advanced.prompt.md @@ -94,7 +94,39 @@ quick_evaluate: { } ``` -### 3. Query File Discovery with `find_codeql_query_files` +### 3. LSP-Powered Code Navigation + +Use the LSP tools for real-time code exploration during query development: + +```typescript +// Discover available types after `import javascript` +codeql_lsp_completion: { + file_path: "/path/to/Query.ql", + line: 5, // line with `from` clause + character: 5, // cursor position + workspace_uri: "file:///path/to/pack-root" // REQUIRED for dependency resolution +} + +// Navigate to a class definition to see its predicates +codeql_lsp_definition: { + file_path: "/path/to/Query.ql", + line: 5, // line containing the class name + character: 10, // cursor on the class name + workspace_uri: "file:///path/to/pack-root" +} + +// Find all usages of a predicate across the pack +codeql_lsp_references: { + file_path: "/path/to/Query.ql", + line: 8, + character: 5, + workspace_uri: "file:///path/to/pack-root" +} +``` + +**Important**: Always set `workspace_uri` to the pack or workspace root. Without it, completions for imported library types will be empty. + +### 4. Query File Discovery with `find_codeql_query_files` Use this tool frequently to understand query dependencies and test structure: diff --git a/server/src/prompts/ql-tdd-basic.prompt.md b/server/src/prompts/ql-tdd-basic.prompt.md index 7ff6f9dd..2e2b618a 100644 --- a/server/src/prompts/ql-tdd-basic.prompt.md +++ b/server/src/prompts/ql-tdd-basic.prompt.md @@ -51,6 +51,16 @@ For detailed guidance, reference the MCP resource: `codeql://learning/test-drive - Use format: "graphtext" for @kind graph queries - Review AST structure and identify relevant classes +- [ ] **Explore Available Classes and Predicates** + - Tool: `codeql_lsp_completion` at cursor position in `from` clause + - Set `workspace_uri` to the pack root for dependency resolution + - Browse completions with documentation to discover relevant types + +- [ ] **Navigate to Type Definitions** + - Tool: `codeql_lsp_definition` on a class or predicate name + - Review the definition to understand available member predicates + - Tool: `codeql_lsp_references` to find usage examples in the pack + - [ ] **Reference Language Documentation** - Resource: `codeql://languages/{language}/ast` - Resource: `codeql://languages/{language}/security` (if applicable) @@ -195,6 +205,7 @@ codeql_test_accept: { - ❌ Accepting test results without verification - ❌ Skipping compilation step - ❌ Not using PrintAST to understand test code +- ❌ Not using `codeql_lsp_completion` to discover available types - ❌ Creating tests that are too complex - ❌ Ignoring false positives in results - ❌ Not refactoring after tests pass diff --git a/server/src/prompts/tools-query-workflow.prompt.md b/server/src/prompts/tools-query-workflow.prompt.md index 59d2fae5..870a7e13 100644 --- a/server/src/prompts/tools-query-workflow.prompt.md +++ b/server/src/prompts/tools-query-workflow.prompt.md @@ -177,10 +177,13 @@ Use the gathered information to inform your query: ## MCP Tools Reference -| Tool | Purpose | -| ------------------------- | ------------------------------------- | -| `codeql_query_run` | Execute tools queries with parameters | -| `codeql_resolve_database` | Validate database before querying | -| `codeql_database_create` | Create database from source code | -| `codeql_bqrs_interpret` | Convert results to different formats | -| `codeql_pack_install` | Install pack dependencies if needed | +| Tool | Purpose | +| ------------------------- | ---------------------------------------------------- | +| `codeql_query_run` | Execute tools queries with parameters | +| `codeql_resolve_database` | Validate database before querying | +| `codeql_database_create` | Create database from source code | +| `codeql_bqrs_interpret` | Convert results to different formats | +| `codeql_pack_install` | Install pack dependencies if needed | +| `codeql_lsp_completion` | Explore available types after seeing AST class names | +| `codeql_lsp_definition` | Navigate to class definitions to see predicates | +| `codeql_lsp_references` | Find usage examples of a class or predicate | diff --git a/server/src/prompts/workflow-prompts.ts b/server/src/prompts/workflow-prompts.ts index a90bc92a..e3ce5f37 100644 --- a/server/src/prompts/workflow-prompts.ts +++ b/server/src/prompts/workflow-prompts.ts @@ -24,9 +24,69 @@ export const SUPPORTED_LANGUAGES = [ 'swift' ] as const; +// ──────────────────────────────────────────────────────────────────────────── +// Exported parameter schemas for each workflow prompt. +// +// Extracting the schemas makes it easy to unit-test required vs optional +// validation independently of the MCP server registration. +// +// **Convention for VS Code UX consistency**: +// Every prompt MUST expose at least one parameter – even if all parameters +// are optional – so that VS Code always displays the parameter input dialog +// and allows the user to customize the prompt before Copilot Chat processes +// it. The `description` field on each Zod schema member doubles as the +// placeholder text shown in the VS Code input box. +// ──────────────────────────────────────────────────────────────────────────── + +/** + * Schema for test_driven_development prompt parameters. + * + * - `language` is **required** – the TDD workflow is language-specific. + * - `queryName` is optional – defaults to '[QueryName]' if omitted. + */ +export const testDrivenDevelopmentSchema = z.object({ + language: z + .enum(SUPPORTED_LANGUAGES) + .describe('Programming language for the query'), + queryName: z + .string() + .optional() + .describe('Name of the query to develop'), +}); + +/** + * Schema for tools_query_workflow prompt parameters. + * + * - `language` and `database` are **required**. + * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context. + */ +export const toolsQueryWorkflowSchema = z.object({ + database: z + .string() + .describe('Path to the CodeQL database'), + language: z + .enum(SUPPORTED_LANGUAGES) + .describe('Programming language for the tools queries'), + sourceFiles: z + .string() + .optional() + .describe('Comma-separated source file names for PrintAST (e.g., "main.js,utils.js")'), + sourceFunction: z + .string() + .optional() + .describe('Function name for PrintCFG or CallGraphFrom (e.g., "processData")'), + targetFunction: z + .string() + .optional() + .describe('Function name for CallGraphTo (e.g., "validate")'), +}); + /** * Schema for workshop_creation_workflow prompt parameters. * Uses z.coerce.number() for numStages to handle string inputs from VSCode slash commands. + * + * - `queryPath` and `language` are **required**. + * - `workshopName` and `numStages` are optional. */ export const workshopCreationWorkflowSchema = z.object({ queryPath: z @@ -42,26 +102,149 @@ export const workshopCreationWorkflowSchema = z.object({ numStages: z .coerce.number() .optional() - .describe('Number of incremental stages (default: 4-8)') + .describe('Number of incremental stages (default: 4-8)'), +}); + +/** + * Schema for ql_tdd_basic prompt parameters. + * + * All parameters are optional – but at least one should be present so the + * VS Code quick-pick dialog appears. + */ +export const qlTddBasicSchema = z.object({ + language: z + .enum(SUPPORTED_LANGUAGES) + .optional() + .describe('Programming language for the query (optional)'), + queryName: z + .string() + .optional() + .describe('Name of the query to develop'), }); +/** + * Schema for ql_tdd_advanced prompt parameters. + * + * All parameters are optional. + */ +export const qlTddAdvancedSchema = z.object({ + database: z + .string() + .optional() + .describe('Path to the CodeQL database for analysis'), + language: z + .enum(SUPPORTED_LANGUAGES) + .optional() + .describe('Programming language for the query (optional)'), + queryName: z + .string() + .optional() + .describe('Name of the query to develop'), +}); + +/** + * Schema for sarif_rank_false_positives / sarif_rank_true_positives. + * + * Both parameters are optional. + */ +export const sarifRankSchema = z.object({ + queryId: z + .string() + .optional() + .describe('CodeQL query/rule identifier'), + sarifPath: z + .string() + .optional() + .describe('Path to the SARIF file to analyze'), +}); + +/** + * Schema for explain_codeql_query prompt parameters. + * + * - `queryPath` and `language` are **required**. + * - `databasePath` is optional. + */ +export const explainCodeqlQuerySchema = z.object({ + databasePath: z + .string() + .optional() + .describe('Optional path to a real CodeQL database for profiling'), + language: z + .enum(SUPPORTED_LANGUAGES) + .describe('Programming language of the query'), + queryPath: z + .string() + .describe('Path to the CodeQL query file (.ql or .qlref)'), +}); + +/** + * Schema for document_codeql_query prompt parameters. + * + * - `queryPath` and `language` are **required**. + */ +export const documentCodeqlQuerySchema = z.object({ + language: z + .enum(SUPPORTED_LANGUAGES) + .describe('Programming language of the query'), + queryPath: z + .string() + .describe('Path to the CodeQL query file (.ql or .qlref)'), +}); + +/** + * Schema for ql_lsp_iterative_development prompt parameters. + * + * All parameters are optional. + */ +export const qlLspIterativeDevelopmentSchema = z.object({ + language: z + .enum(SUPPORTED_LANGUAGES) + .optional() + .describe('Programming language for the query'), + queryPath: z + .string() + .optional() + .describe('Path to the query file being developed'), + workspaceUri: z + .string() + .optional() + .describe('Workspace URI for LSP dependency resolution'), +}); + +// ──────────────────────────────────────────────────────────────────────────── +// Prompt names (exported for testing) +// ──────────────────────────────────────────────────────────────────────────── + +/** Names of every workflow prompt registered with the MCP server. */ +export const WORKFLOW_PROMPT_NAMES = [ + 'document_codeql_query', + 'explain_codeql_query', + 'ql_lsp_iterative_development', + 'ql_tdd_advanced', + 'ql_tdd_basic', + 'sarif_rank_false_positives', + 'sarif_rank_true_positives', + 'test_driven_development', + 'tools_query_workflow', + 'workshop_creation_workflow', +] as const; + /** * Register MCP workflow prompts * * Each prompt loads its content from a corresponding .prompt.md file * and processes any parameter substitutions. + * + * **UX note**: Every prompt schema is passed to `server.prompt()` so that + * VS Code always displays the parameter-input quick-pick before the prompt + * is sent to Copilot Chat. This lets users review and customise the values. */ export function registerWorkflowPrompts(server: McpServer): void { // Test-Driven Development Prompt server.prompt( 'test_driven_development', 'Test-driven development workflow for CodeQL queries using MCP tools', - { - language: z - .enum(SUPPORTED_LANGUAGES) - .describe('Programming language for the query'), - queryName: z.string().optional().describe('Name of the query to develop') - }, + testDrivenDevelopmentSchema.shape, async ({ language, queryName }) => { const template = loadPromptTemplate('ql-tdd-basic.prompt.md'); const content = processPromptTemplate(template, { @@ -87,28 +270,7 @@ export function registerWorkflowPrompts(server: McpServer): void { server.prompt( 'tools_query_workflow', 'Guide for using built-in tools queries (PrintAST, PrintCFG, CallGraphFrom, CallGraphTo) to understand code structure', - { - language: z - .enum(SUPPORTED_LANGUAGES) - .describe('Programming language for the tools queries'), - database: z.string().describe('Path to the CodeQL database'), - sourceFiles: z - .string() - .optional() - .describe( - 'Comma-separated source file names for PrintAST (e.g., "main.js,utils.js")' - ), - sourceFunction: z - .string() - .optional() - .describe( - 'Function name for PrintCFG or CallGraphFrom (e.g., "processData")' - ), - targetFunction: z - .string() - .optional() - .describe('Function name for CallGraphTo (e.g., "validate")') - }, + toolsQueryWorkflowSchema.shape, async ({ language, database, @@ -186,13 +348,7 @@ export function registerWorkflowPrompts(server: McpServer): void { server.prompt( 'ql_tdd_basic', 'Test-driven CodeQL query development checklist - write tests first, implement query, iterate until tests pass', - { - language: z - .enum(SUPPORTED_LANGUAGES) - .optional() - .describe('Programming language for the query (optional)'), - queryName: z.string().optional().describe('Name of the query to develop') - }, + qlTddBasicSchema.shape, async ({ language, queryName }) => { const template = loadPromptTemplate('ql-tdd-basic.prompt.md'); @@ -225,17 +381,7 @@ export function registerWorkflowPrompts(server: McpServer): void { server.prompt( 'ql_tdd_advanced', 'Advanced test-driven CodeQL development with AST visualization, control flow, and call graph analysis', - { - language: z - .enum(SUPPORTED_LANGUAGES) - .optional() - .describe('Programming language for the query (optional)'), - queryName: z.string().optional().describe('Name of the query to develop'), - database: z - .string() - .optional() - .describe('Path to the CodeQL database for analysis') - }, + qlTddAdvancedSchema.shape, async ({ language, queryName, database }) => { const template = loadPromptTemplate('ql-tdd-advanced.prompt.md'); @@ -271,13 +417,7 @@ export function registerWorkflowPrompts(server: McpServer): void { server.prompt( 'sarif_rank_false_positives', 'Analyze SARIF results to identify likely false positives in CodeQL query results', - { - queryId: z.string().optional().describe('CodeQL query/rule identifier'), - sarifPath: z - .string() - .optional() - .describe('Path to the SARIF file to analyze') - }, + sarifRankSchema.shape, async ({ queryId, sarifPath }) => { const template = loadPromptTemplate('sarif-rank-false-positives.prompt.md'); @@ -310,13 +450,7 @@ export function registerWorkflowPrompts(server: McpServer): void { server.prompt( 'sarif_rank_true_positives', 'Analyze SARIF results to identify likely true positives in CodeQL query results', - { - queryId: z.string().optional().describe('CodeQL query/rule identifier'), - sarifPath: z - .string() - .optional() - .describe('Path to the SARIF file to analyze') - }, + sarifRankSchema.shape, async ({ queryId, sarifPath }) => { const template = loadPromptTemplate('sarif-rank-true-positives.prompt.md'); @@ -349,18 +483,7 @@ export function registerWorkflowPrompts(server: McpServer): void { server.prompt( 'explain_codeql_query', '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', - { - queryPath: z - .string() - .describe('Path to the CodeQL query file (.ql or .qlref)'), - language: z - .enum(SUPPORTED_LANGUAGES) - .describe('Programming language of the query'), - databasePath: z - .string() - .optional() - .describe('Optional path to a real CodeQL database for profiling') - }, + explainCodeqlQuerySchema.shape, async ({ queryPath, language, databasePath }) => { const template = loadPromptTemplate('explain-codeql-query.prompt.md'); @@ -390,14 +513,7 @@ export function registerWorkflowPrompts(server: McpServer): void { server.prompt( 'document_codeql_query', 'Create or update documentation for a CodeQL query - generates standardized markdown documentation as a sibling file to the query', - { - queryPath: z - .string() - .describe('Path to the CodeQL query file (.ql or .qlref)'), - language: z - .enum(SUPPORTED_LANGUAGES) - .describe('Programming language of the query') - }, + documentCodeqlQuerySchema.shape, async ({ queryPath, language }) => { const template = loadPromptTemplate('document-codeql-query.prompt.md'); @@ -422,7 +538,43 @@ export function registerWorkflowPrompts(server: McpServer): void { } ); - logger.info('Registered 9 workflow prompts'); + // LSP-powered Iterative Development Prompt + server.prompt( + 'ql_lsp_iterative_development', + 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation', + qlLspIterativeDevelopmentSchema.shape, + async ({ language, queryPath, workspaceUri }) => { + const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md'); + + let contextSection = '## Your Development Context\n\n'; + if (language) { + contextSection += `- **Language**: ${language}\n`; + } + if (queryPath) { + contextSection += `- **Query Path**: ${queryPath}\n`; + } + if (workspaceUri) { + contextSection += `- **Workspace URI**: ${workspaceUri}\n`; + } + if (language || queryPath || workspaceUri) { + contextSection += '\n'; + } + + return { + messages: [ + { + role: 'user', + content: { + type: 'text', + text: contextSection + template, + }, + }, + ], + }; + } + ); + + logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} workflow prompts`); } /** diff --git a/server/src/tools/codeql-tools.ts b/server/src/tools/codeql-tools.ts index 3b3e80c1..f1d91124 100644 --- a/server/src/tools/codeql-tools.ts +++ b/server/src/tools/codeql-tools.ts @@ -34,7 +34,6 @@ import { registerFindClassPositionTool, registerFindCodeQLQueryFilesTool, registerFindPredicatePositionTool, - registerLanguageServerEvalTool, registerProfileCodeQLQueryTool, registerQuickEvaluateTool, registerRegisterDatabaseTool @@ -50,7 +49,7 @@ export function registerCodeQLTools(server: McpServer): void { // Tool: Validate CodeQL Query (heuristic-based) server.tool( 'validate_codeql_query', - '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.', + '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_lsp_diagnostics instead.', { query: z.string().describe('The CodeQL query to validate'), language: z.string().optional().describe('Target programming language'), @@ -159,7 +158,6 @@ export function registerCodeQLTools(server: McpServer): void { registerFindClassPositionTool(server); registerFindCodeQLQueryFilesTool(server); registerFindPredicatePositionTool(server); - registerLanguageServerEvalTool(server); registerProfileCodeQLQueryTool(server); registerQuickEvaluateTool(server); registerRegisterDatabaseTool(server); diff --git a/server/src/tools/codeql/index.ts b/server/src/tools/codeql/index.ts index 415027ac..d8232423 100644 --- a/server/src/tools/codeql/index.ts +++ b/server/src/tools/codeql/index.ts @@ -12,7 +12,7 @@ export { registerFindPredicatePositionTool } from './find-predicate-position'; export { registerFindCodeQLQueryFilesTool } from './find-query-files'; export { codeqlGenerateLogSummaryTool } from './generate-log-summary'; export { codeqlGenerateQueryHelpTool } from './generate-query-help'; -export { registerLanguageServerEvalTool } from './language-server-eval'; +// codeql_lsp_diagnostics has moved to server/src/tools/lsp/lsp-diagnostics.ts export { codeqlPackInstallTool } from './pack-install'; export { codeqlPackLsTool } from './pack-ls'; export { registerProfileCodeQLQueryTool } from './profile-codeql-query'; diff --git a/server/src/tools/lsp/index.ts b/server/src/tools/lsp/index.ts new file mode 100644 index 00000000..87c96b10 --- /dev/null +++ b/server/src/tools/lsp/index.ts @@ -0,0 +1,15 @@ +/** + * LSP tools exports + */ + +export { + lspDiagnostics, + registerLspDiagnosticsTool, + shutdownDiagnosticsServer, +} from './lsp-diagnostics'; +export { + lspCompletion, + lspDefinition, + lspReferences, +} from './lsp-handlers'; +export { registerLSPTools } from './lsp-tools'; diff --git a/server/src/tools/codeql/language-server-eval.ts b/server/src/tools/lsp/lsp-diagnostics.ts similarity index 66% rename from server/src/tools/codeql/language-server-eval.ts rename to server/src/tools/lsp/lsp-diagnostics.ts index d3ba2999..0dcba1f5 100644 --- a/server/src/tools/codeql/language-server-eval.ts +++ b/server/src/tools/lsp/lsp-diagnostics.ts @@ -1,39 +1,41 @@ /** - * CodeQL Language Server Eval tool for MCP server - * Provides real-time QL code validation through LSP communication + * CodeQL LSP Diagnostics tool for MCP server. + * + * Provides real-time QL code validation through LSP communication. + * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics` + * for consistency with the `codeql_lsp_*` tool naming convention. */ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; -import { CodeQLLanguageServer, Diagnostic, LanguageServerOptions } from '../../lib/language-server'; +import { Diagnostic, LanguageServerOptions } from '../../lib/language-server'; +import { LanguageServerConfig } from '../../lib/server-config'; +import { getServerManager } from '../../lib/server-manager'; import { logger } from '../../utils/logger'; import { getProjectTmpDir } from '../../utils/temp-dir'; import { join, resolve } from 'path'; import { pathToFileURL } from 'url'; -// Global language server instance for reuse across evaluations -let globalLanguageServer: CodeQLLanguageServer | null = null; - -export interface LanguageServerEvalParams { +export interface LspDiagnosticsParams { qlCode: string; - workspaceUri?: string; serverOptions?: LanguageServerOptions; + workspaceUri?: string; } -export interface LanguageServerEvalResult { - isValid: boolean; +export interface LspDiagnosticsResult { diagnostics: Diagnostic[]; + formattedOutput: string; + isValid: boolean; summary: { errorCount: number; - warningCount: number; - infoCount: number; hintCount: number; + infoCount: number; + warningCount: number; }; - formattedOutput: string; } /** - * Format diagnostics for human-readable output + * Format diagnostics for human-readable output. */ function formatDiagnostics(diagnostics: Diagnostic[]): string { if (diagnostics.length === 0) { @@ -47,7 +49,7 @@ function formatDiagnostics(diagnostics: Diagnostic[]): string { const severityIcon = getSeverityIcon(diagnostic.severity); const severityName = getSeverityName(diagnostic.severity); const location = `Line ${diagnostic.range.start.line + 1}, Column ${diagnostic.range.start.character + 1}`; - + lines.push(`${index + 1}. ${severityIcon} ${severityName} at ${location}`); lines.push(` ${diagnostic.message}`); if (diagnostic.source) { @@ -83,78 +85,73 @@ function getSeverityName(severity: number): string { } /** - * Initialize or get existing language server instance + * Initialize or get existing language server instance via the server manager. + * + * - Respects `searchPath` and `workspaceUri` on every call + * - Restarts the server when configuration changes + * - Uses session-isolated cache directories */ -async function getLanguageServer(options: LanguageServerOptions = {}): Promise { - if (globalLanguageServer && globalLanguageServer.isRunning()) { - return globalLanguageServer; - } - - // Set default options — use packageRootDir instead of process.cwd() - // so the QL search path works regardless of where the server is launched. +async function getLanguageServer( + options: LanguageServerOptions = {}, + workspaceUri?: string, +): Promise { const { packageRootDir: pkgRoot } = await import('../../utils/package-paths'); - const defaultOptions: LanguageServerOptions = { - searchPath: resolve(pkgRoot, 'ql'), - loglevel: 'WARN', - ...options + + const config: LanguageServerConfig = { + checkErrors: 'ON_CHANGE', + loglevel: options.loglevel ?? 'WARN', + searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'), + synchronous: options.synchronous, + verbosity: options.verbosity, }; - globalLanguageServer = new CodeQLLanguageServer(defaultOptions); - - try { - await globalLanguageServer.start(); - - // Use provided workspace URI or default to ql directory under package root - const workspaceUri = pathToFileURL(resolve(pkgRoot, 'ql')).href; - await globalLanguageServer.initialize(workspaceUri); - - logger.info('CodeQL Language Server started and initialized successfully'); - return globalLanguageServer; - } catch (error) { - logger.error('Failed to start language server:', error); - globalLanguageServer = null; - throw error; - } + const manager = getServerManager(); + const languageServer = await manager.getLanguageServer(config); + + const effectiveUri = workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href; + await languageServer.initialize(effectiveUri); + + return languageServer; } /** - * Evaluate QL code using the CodeQL Language Server + * Evaluate QL code using the CodeQL Language Server and return diagnostics. */ -export async function evaluateQLCode({ +export async function lspDiagnostics({ qlCode, - workspaceUri: _workspaceUri, + workspaceUri, serverOptions = {} -}: LanguageServerEvalParams): Promise { +}: LspDiagnosticsParams): Promise { try { logger.info('Evaluating QL code via Language Server...'); - - const languageServer = await getLanguageServer(serverOptions); - + + const languageServer = await getLanguageServer(serverOptions, workspaceUri); + // Generate unique URI for this evaluation const evalUri = pathToFileURL(join(getProjectTmpDir('lsp-eval'), `eval_${Date.now()}.ql`)).href; - + const diagnostics = await languageServer.evaluateQL(qlCode, evalUri); - + // Count diagnostics by severity const summary = { errorCount: diagnostics.filter(d => d.severity === 1).length, - warningCount: diagnostics.filter(d => d.severity === 2).length, + hintCount: diagnostics.filter(d => d.severity === 4).length, infoCount: diagnostics.filter(d => d.severity === 3).length, - hintCount: diagnostics.filter(d => d.severity === 4).length + warningCount: diagnostics.filter(d => d.severity === 2).length, }; - + const isValid = summary.errorCount === 0; const formattedOutput = formatDiagnostics(diagnostics); - + logger.info(`QL evaluation complete. Valid: ${isValid}, Issues: ${diagnostics.length}`); - + return { - isValid, diagnostics, + formattedOutput, + isValid, summary, - formattedOutput }; - + } catch (error) { logger.error('Error evaluating QL code:', error); throw new Error(`QL evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`); @@ -162,77 +159,74 @@ export async function evaluateQLCode({ } /** - * Shutdown the global language server + * Shutdown the language server via the server manager. */ -export async function shutdownLanguageServer(): Promise { - if (globalLanguageServer) { - logger.info('Shutting down CodeQL Language Server...'); - await globalLanguageServer.shutdown(); - globalLanguageServer = null; - } +export async function shutdownDiagnosticsServer(): Promise { + const manager = getServerManager(); + await manager.shutdownServer('language'); } /** - * Register the language server eval tool with the MCP server + * Register the codeql_lsp_diagnostics tool with the MCP server. */ -export function registerLanguageServerEvalTool(server: McpServer): void { +export function registerLspDiagnosticsTool(server: McpServer): void { server.tool( - 'codeql_language_server_eval', - '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.', + 'codeql_lsp_diagnostics', + '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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.', { + log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'), ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'), - workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'), search_path: z.string().optional().describe('Optional search path for CodeQL libraries'), - log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level') + workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'), }, async ({ ql_code, workspace_uri, search_path, log_level }) => { try { const serverOptions: LanguageServerOptions = {}; - + if (search_path) { serverOptions.searchPath = search_path; } if (log_level) { serverOptions.loglevel = log_level; } - - const result = await evaluateQLCode({ + + const result = await lspDiagnostics({ qlCode: ql_code, + serverOptions, workspaceUri: workspace_uri, - serverOptions }); - + // Return structured result const responseContent = { - isValid: result.isValid, - summary: result.summary, - formattedOutput: result.formattedOutput, diagnostics: result.diagnostics.map(d => ({ - line: d.range.start.line + 1, // Convert to 1-based line numbers + code: d.code, column: d.range.start.character + 1, // Convert to 1-based column numbers - severity: getSeverityName(d.severity), + line: d.range.start.line + 1, // Convert to 1-based line numbers message: d.message, - code: d.code, - source: d.source - })) + severity: getSeverityName(d.severity), + source: d.source, + })), + formattedOutput: result.formattedOutput, + isValid: result.isValid, + summary: result.summary, }; - + return { content: [ - { - type: 'text', - text: JSON.stringify(responseContent, null, 2) + { + text: JSON.stringify(responseContent, null, 2), + type: 'text', } ], }; - + } catch (error) { - logger.error('Error in language server eval tool:', error); + logger.error('Error in codeql_lsp_diagnostics tool:', error); return { content: [ { - type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, + type: 'text', }, ], isError: true, @@ -240,12 +234,12 @@ export function registerLanguageServerEvalTool(server: McpServer): void { } } ); - + // Register cleanup on server shutdown process.on('SIGINT', async () => { - await shutdownLanguageServer(); + await shutdownDiagnosticsServer(); }); process.on('SIGTERM', async () => { - await shutdownLanguageServer(); + await shutdownDiagnosticsServer(); }); -} \ No newline at end of file +} diff --git a/server/src/tools/lsp/lsp-handlers.ts b/server/src/tools/lsp/lsp-handlers.ts new file mode 100644 index 00000000..588d5f7b --- /dev/null +++ b/server/src/tools/lsp/lsp-handlers.ts @@ -0,0 +1,140 @@ +/** + * CodeQL LSP tool handlers. + * + * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server. + * Each handler acquires a language server via the CodeQLServerManager, + * opens the requested document, sends the LSP request, and returns the result. + */ + +import { LanguageServerConfig } from '../../lib/server-config'; +import { getServerManager } from '../../lib/server-manager'; +import { + CompletionItem, + LSPLocation, + TextDocumentPositionParams, +} from '../../lib/language-server'; +import { logger } from '../../utils/logger'; +import { readFileSync } from 'fs'; +import { pathToFileURL } from 'url'; +import { isAbsolute, resolve } from 'path'; + +/** + * Common parameters for LSP tool invocations. + */ +export interface LSPToolParams { + /** 0-based character offset within the line. */ + character: number; + /** Optional override for the file content (if not reading from disk). */ + fileContent?: string; + /** Absolute path to the QL file. */ + filePath: string; + /** 0-based line number in the document. */ + line: number; + /** Optional search path for CodeQL libraries. */ + searchPath?: string; + /** Optional workspace URI for context. */ + workspaceUri?: string; +} + +/** + * Get a running, initialized language server for the given parameters. + */ +async function getInitializedServer(params: LSPToolParams) { + const { packageRootDir: pkgRoot } = await import('../../utils/package-paths'); + + const config: LanguageServerConfig = { + checkErrors: 'ON_CHANGE', + loglevel: 'WARN', + searchPath: params.searchPath ?? resolve(pkgRoot, 'ql'), + }; + + const manager = getServerManager(); + const server = await manager.getLanguageServer(config); + + const effectiveUri = params.workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href; + await server.initialize(effectiveUri); + + return server; +} + +/** + * Build TextDocumentPositionParams and ensure the document is open. + */ +function prepareDocumentPosition( + server: Awaited>, + params: LSPToolParams, +): { docUri: string; positionParams: TextDocumentPositionParams } { + // Resolve relative paths against CWD (supports integration test fixtures) + const absPath = isAbsolute(params.filePath) ? params.filePath : resolve(process.cwd(), params.filePath); + const docUri = pathToFileURL(absPath).href; + + // Read file content from disk or use provided content + let text: string; + if (params.fileContent) { + text = params.fileContent; + } else { + try { + text = readFileSync(absPath, 'utf-8'); + } catch (error) { + throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`); + } + } + + // Open the document so the language server knows about it + server.openDocument(docUri, text); + + const positionParams: TextDocumentPositionParams = { + position: { character: params.character, line: params.line }, + textDocument: { uri: docUri }, + }; + + return { docUri, positionParams }; +} + +/** + * Get code completions at a position. + */ +export async function lspCompletion(params: LSPToolParams): Promise { + logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`); + const server = await getInitializedServer(params); + const { docUri, positionParams } = prepareDocumentPosition(server, params); + + try { + return await server.getCompletions(positionParams); + } finally { + server.closeDocument(docUri); + } +} + +/** + * Go to definition of a symbol at a position. + */ +export async function lspDefinition(params: LSPToolParams): Promise { + logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`); + const server = await getInitializedServer(params); + const { docUri, positionParams } = prepareDocumentPosition(server, params); + + try { + return await server.getDefinition(positionParams); + } finally { + server.closeDocument(docUri); + } +} + +/** + * Find all references to a symbol at a position. + */ +export async function lspReferences(params: LSPToolParams): Promise { + logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`); + const server = await getInitializedServer(params); + const { docUri, positionParams } = prepareDocumentPosition(server, params); + + try { + return await server.getReferences({ + ...positionParams, + context: { includeDeclaration: true }, + }); + } finally { + server.closeDocument(docUri); + } +} diff --git a/server/src/tools/lsp/lsp-tools.ts b/server/src/tools/lsp/lsp-tools.ts new file mode 100644 index 00000000..d6c1f21e --- /dev/null +++ b/server/src/tools/lsp/lsp-tools.ts @@ -0,0 +1,159 @@ +/** + * CodeQL LSP MCP tool definitions. + * + * Registers four LSP-based tools: + * - codeql_lsp_completion – code completions at cursor position + * - codeql_lsp_definition – go to definition + * - codeql_lsp_diagnostics – QL code validation via LSP diagnostics + * - codeql_lsp_references – find all references + */ + +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { z } from 'zod'; +import { registerLspDiagnosticsTool } from './lsp-diagnostics'; +import { + lspCompletion, + lspDefinition, + lspReferences, +} from './lsp-handlers'; +import { logger } from '../../utils/logger'; + +/** + * Shared Zod schema for the common LSP tool parameters. + */ +const lspParamsSchema = { + character: z.number().int().min(0).describe('0-based character offset within the line'), + file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'), + file_path: z.string().describe('Absolute path to the CodeQL (.ql/.qll) file'), + line: z.number().int().min(0).describe('0-based line number in the document'), + search_path: z.string().optional().describe('Optional search path for CodeQL libraries'), + workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'), +}; + +/** + * Helper to build the handler params from the raw MCP tool input. + */ +function toHandlerParams(input: { + character: number; + file_content?: string; + file_path: string; + line: number; + search_path?: string; + workspace_uri?: string; +}) { + return { + character: input.character, + fileContent: input.file_content, + filePath: input.file_path, + line: input.line, + searchPath: input.search_path, + workspaceUri: input.workspace_uri, + }; +} + +/** + * Register all LSP-based tools with the MCP server. + */ +export function registerLSPTools(server: McpServer): void { + // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) --- + registerLspDiagnosticsTool(server); + + // --- codeql_lsp_completion --- + server.tool( + 'codeql_lsp_completion', + 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.', + lspParamsSchema, + async (input) => { + try { + const items = await lspCompletion(toHandlerParams(input)); + return { + content: [{ + text: JSON.stringify({ + completionCount: items.length, + items: items.map((item) => ({ + detail: item.detail, + documentation: item.documentation, + insertText: item.insertText, + kind: item.kind, + label: item.label, + })), + }, null, 2), + type: 'text' as const, + }], + }; + } catch (error) { + logger.error('codeql_lsp_completion error:', error); + return { + content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }], + isError: true, + }; + } + }, + ); + + // --- codeql_lsp_definition --- + server.tool( + 'codeql_lsp_definition', + 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.', + lspParamsSchema, + async (input) => { + try { + const locations = await lspDefinition(toHandlerParams(input)); + return { + content: [{ + text: JSON.stringify({ + definitionCount: locations.length, + locations: locations.map((loc) => ({ + endCharacter: loc.range.end.character, + endLine: loc.range.end.line + 1, + startCharacter: loc.range.start.character, + startLine: loc.range.start.line + 1, + uri: loc.uri, + })), + }, null, 2), + type: 'text' as const, + }], + }; + } catch (error) { + logger.error('codeql_lsp_definition error:', error); + return { + content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }], + isError: true, + }; + } + }, + ); + + // --- codeql_lsp_references --- + server.tool( + 'codeql_lsp_references', + 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.', + lspParamsSchema, + async (input) => { + try { + const locations = await lspReferences(toHandlerParams(input)); + return { + content: [{ + text: JSON.stringify({ + locations: locations.map((loc) => ({ + endCharacter: loc.range.end.character, + endLine: loc.range.end.line + 1, + startCharacter: loc.range.start.character, + startLine: loc.range.start.line + 1, + uri: loc.uri, + })), + referenceCount: locations.length, + }, null, 2), + type: 'text' as const, + }], + }; + } catch (error) { + logger.error('codeql_lsp_references error:', error); + return { + content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }], + isError: true, + }; + } + }, + ); +} diff --git a/server/test/src/lib/cli-server.test.ts b/server/test/src/lib/cli-server.test.ts new file mode 100644 index 00000000..99406cff --- /dev/null +++ b/server/test/src/lib/cli-server.test.ts @@ -0,0 +1,235 @@ +/** + * Tests for CodeQLCLIServer. + */ + +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import { EventEmitter } from 'events'; +import { ChildProcess, spawn } from 'child_process'; +import { CodeQLCLIServer } from '../../../src/lib/cli-server'; + +// Shared mock process factory +function createMockProcess() { + const proc = new EventEmitter() as EventEmitter & { + killed: boolean; + kill: ReturnType; + pid: number; + stderr: EventEmitter; + stdin: { end: ReturnType; write: ReturnType }; + stdout: EventEmitter; + }; + proc.stdin = { end: vi.fn(), write: vi.fn() }; + proc.stdout = new EventEmitter(); + proc.stderr = new EventEmitter(); + proc.killed = false; + proc.kill = vi.fn(() => { (proc as { killed: boolean }).killed = true; }); + proc.pid = 88888; + return proc; +} + +// Mock child_process.spawn +vi.mock('child_process', async (importOriginal) => { + const actual = await importOriginal() as Record; + return { + ...actual, + spawn: vi.fn(() => createMockProcess()), + }; +}); + +describe('CodeQLCLIServer', () => { + let mockProc: ReturnType; + + beforeEach(() => { + vi.clearAllMocks(); + mockProc = createMockProcess(); + vi.mocked(spawn).mockReturnValue(mockProc as unknown as ChildProcess); + }); + + describe('constructor', () => { + it('should create an instance', () => { + const server = new CodeQLCLIServer({}); + expect(server).toBeDefined(); + expect(server.isRunning()).toBe(false); + }); + + it('should accept config with commonCaches and logdir', () => { + const server = new CodeQLCLIServer({ commonCaches: '/cache', logdir: '/logs' }); + expect(server).toBeDefined(); + }); + }); + + describe('isRunning', () => { + it('should return false before start', () => { + const server = new CodeQLCLIServer({}); + expect(server.isRunning()).toBe(false); + }); + + it('should return true after start', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + expect(server.isRunning()).toBe(true); + }); + }); + + describe('start', () => { + it('should spawn a codeql process with cli-server args', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + expect(spawn).toHaveBeenCalledWith( + 'codeql', + expect.arrayContaining(['execute', 'cli-server']), + expect.objectContaining({ stdio: ['pipe', 'pipe', 'pipe'] }), + ); + }); + + it('should throw if already running', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + await expect(server.start()).rejects.toThrow('CLI server is already running'); + }); + + it('should register stdout, stderr, error, and exit handlers', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + expect(mockProc.stdout.listenerCount('data')).toBeGreaterThan(0); + expect(mockProc.stderr.listenerCount('data')).toBeGreaterThan(0); + }); + }); + + describe('shutdown', () => { + it('should not throw when server is not running', async () => { + const server = new CodeQLCLIServer({}); + await expect(server.shutdown()).resolves.toBeUndefined(); + }); + + it('should send shutdown command and clear state', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + // Trigger exit during shutdown to resolve immediately + const shutdownPromise = server.shutdown(); + mockProc.emit('exit', 0); + + await shutdownPromise; + expect(mockProc.stdin.write).toHaveBeenCalled(); + }); + }); + + describe('runCommand', () => { + it('should reject when server is not running', async () => { + const server = new CodeQLCLIServer({}); + await expect(server.runCommand(['test'])).rejects.toThrow('CLI server is not running'); + }); + + it('should write JSON args and NUL byte to stdin', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + const cmdPromise = server.runCommand(['resolve', 'qlpacks']); + + // Simulate NUL-terminated response from server + const response = '{"result": "ok"}\0'; + mockProc.stdout.emit('data', Buffer.from(response)); + + const result = await cmdPromise; + expect(result).toBe('{"result": "ok"}'); + + // Verify args were written to stdin + expect(mockProc.stdin.write).toHaveBeenCalledWith( + JSON.stringify(['resolve', 'qlpacks']), + 'utf8', + ); + }); + + it('should accumulate partial stdout until NUL byte', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + const cmdPromise = server.runCommand(['version']); + + // Send partial data without NUL + mockProc.stdout.emit('data', Buffer.from('part1')); + mockProc.stdout.emit('data', Buffer.from('part2')); + // Now send NUL-terminated completion + mockProc.stdout.emit('data', Buffer.from('part3\0')); + + const result = await cmdPromise; + expect(result).toBe('part1part2part3'); + }); + + it('should queue commands when one is in progress', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + const cmd1Promise = server.runCommand(['cmd1']); + const cmd2Promise = server.runCommand(['cmd2']); + + // Complete first command + mockProc.stdout.emit('data', Buffer.from('result1\0')); + const result1 = await cmd1Promise; + expect(result1).toBe('result1'); + + // Complete second command + mockProc.stdout.emit('data', Buffer.from('result2\0')); + const result2 = await cmd2Promise; + expect(result2).toBe('result2'); + }); + + it('should reject current command on process error event', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + // Must add an error listener to prevent unhandled error event + server.on('error', () => { /* swallow */ }); + + const cmdPromise = server.runCommand(['test']); + mockProc.emit('error', new Error('spawn failed')); + + await expect(cmdPromise).rejects.toThrow('spawn failed'); + }); + + it('should reject current command on unexpected exit', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + const cmdPromise = server.runCommand(['test']); + mockProc.emit('exit', 1); + + await expect(cmdPromise).rejects.toThrow('CLI server exited unexpectedly with code: 1'); + }); + }); + + describe('events', () => { + it('should emit error event on process error', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + const errorHandler = vi.fn(); + server.on('error', errorHandler); + + mockProc.emit('error', new Error('test error')); + expect(errorHandler).toHaveBeenCalledWith(expect.any(Error)); + }); + + it('should emit exit event on process exit', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + const exitHandler = vi.fn(); + server.on('exit', exitHandler); + + mockProc.emit('exit', 0); + expect(exitHandler).toHaveBeenCalledWith(0); + }); + + it('should set process to null after exit', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + expect(server.isRunning()).toBe(true); + + mockProc.emit('exit', 0); + expect(server.isRunning()).toBe(false); + }); + }); +}); diff --git a/server/test/src/lib/language-server.test.ts b/server/test/src/lib/language-server.test.ts index 0ee94b29..f92409a5 100644 --- a/server/test/src/lib/language-server.test.ts +++ b/server/test/src/lib/language-server.test.ts @@ -1,15 +1,238 @@ /** - * Tests for CodeQL Language Server manager + * Tests for CodeQL Language Server manager. + * + * Covers LSP feature methods (getCompletions, getDefinition, getReferences), + * workspace management, openDocument/closeDocument, and normalizeLocations. */ -import { describe, expect, it } from 'vitest'; +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import { EventEmitter } from 'events'; +import { ChildProcess, spawn } from 'child_process'; +import { CodeQLLanguageServer } from '../../../src/lib/language-server'; + +// Shared mock process factory +function createMockProcess() { + const proc = new EventEmitter() as EventEmitter & { + killed: boolean; + kill: ReturnType; + pid: number; + stderr: EventEmitter; + stdin: { end: ReturnType; write: ReturnType }; + stdout: EventEmitter; + }; + proc.stdin = { end: vi.fn(), write: vi.fn() }; + proc.stdout = new EventEmitter(); + proc.stderr = new EventEmitter(); + proc.killed = false; + proc.kill = vi.fn(() => { (proc as { killed: boolean }).killed = true; }); + proc.pid = 77777; + return proc; +} + +vi.mock('child_process', async (importOriginal) => { + const actual = await importOriginal() as Record; + return { + ...actual, + spawn: vi.fn(() => createMockProcess()), + }; +}); + +/** + * Build a Content-Length framed JSON-RPC message to simulate LS output. + */ +function buildLspFrame(payload: object): string { + const body = JSON.stringify(payload); + return `Content-Length: ${Buffer.byteLength(body, 'utf8')}\r\n\r\n${body}`; +} describe('CodeQLLanguageServer', () => { - describe('module structure', () => { - it('should have a placeholder test', () => { - // This is a placeholder test to avoid test file compilation issues - // The actual functionality will be tested via manual verification - expect(true).toBe(true); + let mockProc: ReturnType; + + beforeEach(() => { + vi.clearAllMocks(); + mockProc = createMockProcess(); + vi.mocked(spawn).mockReturnValue(mockProc as unknown as ChildProcess); + }); + + describe('constructor', () => { + it('should create an instance with default options', () => { + const ls = new CodeQLLanguageServer(); + expect(ls).toBeDefined(); + }); + + it('should accept custom options', () => { + const ls = new CodeQLLanguageServer({ + loglevel: 'DEBUG', + searchPath: '/some/path', + synchronous: true, + }); + expect(ls).toBeDefined(); + }); + }); + + describe('start', () => { + it('should spawn a codeql language-server process', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + expect(spawn).toHaveBeenCalledWith( + 'codeql', + expect.arrayContaining(['execute', 'language-server']), + expect.objectContaining({ stdio: ['pipe', 'pipe', 'pipe'] }), + ); + }); + + it('should throw if already running', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + await expect(ls.start()).rejects.toThrow('Language server is already running'); + }); + }); + + describe('initialize', () => { + it('should send initialize request and initialized notification', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + const initPromise = ls.initialize('file:///workspace'); + + // The server sends an initialize request; simulate a response + // The sendRequest will write to stdin; we need to simulate the response + const response = buildLspFrame({ + id: 1, + jsonrpc: '2.0', + result: { capabilities: {} }, + }); + mockProc.stdout.emit('data', Buffer.from(response)); + + await initPromise; + // After initialize, the server should have written two messages (initialize + initialized) + expect(mockProc.stdin.write).toHaveBeenCalled(); + }); + + it('should be idempotent for same workspace', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + // First initialize + const initPromise = ls.initialize('file:///workspace'); + mockProc.stdout.emit('data', Buffer.from(buildLspFrame({ + id: 1, jsonrpc: '2.0', result: { capabilities: {} }, + }))); + await initPromise; + + // Second call with same workspace should return immediately + await ls.initialize('file:///workspace'); + // Only one initialize request should have been sent + }); + + it('should track the workspace URI', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + const initPromise = ls.initialize('file:///test/workspace'); + mockProc.stdout.emit('data', Buffer.from(buildLspFrame({ + id: 1, jsonrpc: '2.0', result: { capabilities: {} }, + }))); + await initPromise; + + expect(ls.getWorkspaceUri()).toBe('file:///test/workspace'); + }); + }); + + describe('getCompletions', () => { + it('should throw if not initialized', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + await expect(ls.getCompletions({ + position: { character: 0, line: 0 }, + textDocument: { uri: 'file:///test.ql' }, + })).rejects.toThrow('Language server is not initialized'); + }); + }); + + describe('getDefinition', () => { + it('should throw if not initialized', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + await expect(ls.getDefinition({ + position: { character: 0, line: 0 }, + textDocument: { uri: 'file:///test.ql' }, + })).rejects.toThrow('Language server is not initialized'); + }); + }); + + describe('getReferences', () => { + it('should throw if not initialized', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + await expect(ls.getReferences({ + position: { character: 0, line: 0 }, + textDocument: { uri: 'file:///test.ql' }, + })).rejects.toThrow('Language server is not initialized'); + }); + }); + + describe('openDocument', () => { + it('should throw if not initialized', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + expect(() => ls.openDocument('file:///test.ql', 'select 1')) + .toThrow('Language server is not initialized'); + }); + }); + + describe('closeDocument', () => { + it('should throw if not initialized', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + expect(() => ls.closeDocument('file:///test.ql')) + .toThrow('Language server is not initialized'); + }); + }); + + describe('evaluateQL', () => { + it('should throw if not initialized', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + await expect(ls.evaluateQL('select 1')) + .rejects.toThrow('Language server is not initialized'); + }); + }); + + describe('getWorkspaceUri', () => { + it('should return undefined before initialization', () => { + const ls = new CodeQLLanguageServer(); + expect(ls.getWorkspaceUri()).toBeUndefined(); + }); + }); + + describe('shutdown', () => { + it('should not throw when server is not running', async () => { + const ls = new CodeQLLanguageServer(); + await expect(ls.shutdown()).resolves.toBeUndefined(); + }); + + it('should send shutdown/exit and clean up', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + const shutdownPromise = ls.shutdown(); + + // Simulate response to shutdown request + mockProc.stdout.emit('data', Buffer.from(buildLspFrame({ + id: 1, jsonrpc: '2.0', result: null, + }))); + mockProc.emit('exit', 0); + + await shutdownPromise; + expect(mockProc.stdin.write).toHaveBeenCalled(); }); }); }); \ No newline at end of file diff --git a/server/test/src/lib/query-server.test.ts b/server/test/src/lib/query-server.test.ts new file mode 100644 index 00000000..09589f7c --- /dev/null +++ b/server/test/src/lib/query-server.test.ts @@ -0,0 +1,267 @@ +/** + * Tests for CodeQLQueryServer. + */ + +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import { EventEmitter } from 'events'; +import { ChildProcess, spawn } from 'child_process'; +import { CodeQLQueryServer } from '../../../src/lib/query-server'; + +// Shared mock process factory +function createMockProcess() { + const proc = new EventEmitter() as EventEmitter & { + killed: boolean; + kill: ReturnType; + pid: number; + stderr: EventEmitter; + stdin: { end: ReturnType; write: ReturnType }; + stdout: EventEmitter; + }; + proc.stdin = { end: vi.fn(), write: vi.fn() }; + proc.stdout = new EventEmitter(); + proc.stderr = new EventEmitter(); + proc.killed = false; + proc.kill = vi.fn(() => { (proc as { killed: boolean }).killed = true; }); + proc.pid = 99999; + return proc; +} + +// Mock child_process.spawn +vi.mock('child_process', async (importOriginal) => { + const actual = await importOriginal() as Record; + return { + ...actual, + spawn: vi.fn(() => createMockProcess()), + }; +}); + +/** + * Build a Content-Length framed JSON-RPC message for simulating query server output. + */ +function buildJsonRpcFrame(payload: object): string { + const body = JSON.stringify(payload); + const contentLength = Buffer.byteLength(body, 'utf8'); + return `Content-Length: ${contentLength}\r\n\r\n${body}`; +} + +describe('CodeQLQueryServer', () => { + let mockProc: ReturnType; + + beforeEach(() => { + vi.clearAllMocks(); + mockProc = createMockProcess(); + vi.mocked(spawn).mockReturnValue(mockProc as unknown as ChildProcess); + }); + + describe('constructor', () => { + it('should create an instance', () => { + const server = new CodeQLQueryServer({}); + expect(server).toBeDefined(); + expect(server.isRunning()).toBe(false); + }); + + it('should accept config with all options', () => { + const server = new CodeQLQueryServer({ + commonCaches: '/cache', + debug: true, + logdir: '/logs', + threads: 4, + timeout: 60, + }); + expect(server).toBeDefined(); + }); + }); + + describe('isRunning', () => { + it('should return false before start', () => { + const server = new CodeQLQueryServer({}); + expect(server.isRunning()).toBe(false); + }); + + it('should return true after start', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + expect(server.isRunning()).toBe(true); + }); + }); + + describe('start', () => { + it('should spawn codeql with query-server2 args', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + + expect(spawn).toHaveBeenCalledWith( + 'codeql', + expect.arrayContaining(['execute', 'query-server2']), + expect.objectContaining({ stdio: ['pipe', 'pipe', 'pipe'] }), + ); + }); + + it('should throw if already running', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + await expect(server.start()).rejects.toThrow('Query server is already running'); + }); + }); + + describe('shutdown', () => { + it('should not throw when server is not running', async () => { + const server = new CodeQLQueryServer({}); + await expect(server.shutdown()).resolves.toBeUndefined(); + }); + + it('should send shutdown request through sendRaw', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + + // Start shutdown - it will wait for the shutdown response + const shutdownPromise = server.shutdown(); + + // Simulate the response to the shutdown request + const responseFrame = buildJsonRpcFrame({ id: 1, jsonrpc: '2.0', result: null }); + mockProc.stdout.emit('data', Buffer.from(responseFrame)); + + await shutdownPromise; + expect(mockProc.stdin.write).toHaveBeenCalled(); + }); + }); + + describe('sendRequest', () => { + it('should reject when server is not running', async () => { + const server = new CodeQLQueryServer({}); + await expect(server.sendRequest('test')).rejects.toThrow('Query server is not running'); + }); + + it('should send JSON-RPC framed message and resolve on response', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + + const reqPromise = server.sendRequest('evaluation/runQuery', { query: 'select 1' }); + + // Simulate response + const responseFrame = buildJsonRpcFrame({ + id: 1, + jsonrpc: '2.0', + result: { resultType: 0 }, + }); + mockProc.stdout.emit('data', Buffer.from(responseFrame)); + + const result = await reqPromise; + expect(result).toEqual({ resultType: 0 }); + }); + + it('should reject on error response', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + + const reqPromise = server.sendRequest('evaluation/runQuery'); + + const responseFrame = buildJsonRpcFrame({ + error: { code: -1, message: 'Compilation failed' }, + id: 1, + jsonrpc: '2.0', + }); + mockProc.stdout.emit('data', Buffer.from(responseFrame)); + + await expect(reqPromise).rejects.toThrow('Query server error: Compilation failed'); + }); + + it('should handle concurrent requests with different IDs', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + + const req1Promise = server.sendRequest('method1'); + const req2Promise = server.sendRequest('method2'); + + // Respond to request 2 first + mockProc.stdout.emit('data', Buffer.from( + buildJsonRpcFrame({ id: 2, jsonrpc: '2.0', result: 'result2' }), + )); + const result2 = await req2Promise; + expect(result2).toBe('result2'); + + // Respond to request 1 + mockProc.stdout.emit('data', Buffer.from( + buildJsonRpcFrame({ id: 1, jsonrpc: '2.0', result: 'result1' }), + )); + const result1 = await req1Promise; + expect(result1).toBe('result1'); + }); + + it('should handle partial Content-Length messages', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + + const reqPromise = server.sendRequest('test'); + + const body = JSON.stringify({ id: 1, jsonrpc: '2.0', result: 'ok' }); + const contentLength = Buffer.byteLength(body, 'utf8'); + const frame = `Content-Length: ${contentLength}\r\n\r\n${body}`; + + // Send frame in two parts + const mid = Math.floor(frame.length / 2); + mockProc.stdout.emit('data', Buffer.from(frame.substring(0, mid))); + mockProc.stdout.emit('data', Buffer.from(frame.substring(mid))); + + const result = await reqPromise; + expect(result).toBe('ok'); + }); + }); + + describe('events', () => { + it('should emit error event on process error', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + + const errorHandler = vi.fn(); + server.on('error', errorHandler); + + mockProc.emit('error', new Error('test error')); + expect(errorHandler).toHaveBeenCalledWith(expect.any(Error)); + }); + + it('should emit exit event on process exit', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + + const exitHandler = vi.fn(); + server.on('exit', exitHandler); + + mockProc.emit('exit', 0); + expect(exitHandler).toHaveBeenCalledWith(0); + }); + + it('should reject all pending requests on exit', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + + const req1 = server.sendRequest('test1'); + const req2 = server.sendRequest('test2'); + + mockProc.emit('exit', 1); + + await expect(req1).rejects.toThrow('Query server exited with code: 1'); + await expect(req2).rejects.toThrow('Query server exited with code: 1'); + }); + + it('should emit notification events for server-pushed messages', async () => { + const server = new CodeQLQueryServer({}); + await server.start(); + + const notifHandler = vi.fn(); + server.on('notification', notifHandler); + + const notifFrame = buildJsonRpcFrame({ + jsonrpc: '2.0', + method: 'ql/progressUpdated', + params: { step: 1 }, + }); + mockProc.stdout.emit('data', Buffer.from(notifFrame)); + + expect(notifHandler).toHaveBeenCalledWith({ + method: 'ql/progressUpdated', + params: { step: 1 }, + }); + }); + }); +}); diff --git a/server/test/src/lib/server-config.test.ts b/server/test/src/lib/server-config.test.ts new file mode 100644 index 00000000..ec29bf52 --- /dev/null +++ b/server/test/src/lib/server-config.test.ts @@ -0,0 +1,150 @@ +/** + * Tests for server configuration types and utilities. + */ + +import { describe, expect, it } from 'vitest'; +import { + buildCLIServerArgs, + buildLanguageServerArgs, + buildQueryServerArgs, + computeConfigHash, + CLIServerConfig, + LanguageServerConfig, + QueryServerConfig, +} from '../../../src/lib/server-config'; + +describe('server-config', () => { + describe('buildCLIServerArgs', () => { + it('should build minimal args', () => { + const config: CLIServerConfig = {}; + const args = buildCLIServerArgs(config); + expect(args).toEqual(['execute', 'cli-server']); + }); + + it('should include commonCaches', () => { + const config: CLIServerConfig = { commonCaches: '/cache' }; + const args = buildCLIServerArgs(config); + expect(args).toContain('--common-caches=/cache'); + }); + + it('should include logdir', () => { + const config: CLIServerConfig = { logdir: '/logs' }; + const args = buildCLIServerArgs(config); + expect(args).toContain('--logdir=/logs'); + }); + }); + + describe('buildLanguageServerArgs', () => { + it('should build args with default check-errors', () => { + const config: LanguageServerConfig = {}; + const args = buildLanguageServerArgs(config); + expect(args).toEqual([ + 'execute', 'language-server', + '--check-errors=ON_CHANGE', + ]); + }); + + it('should include all optional args', () => { + const config: LanguageServerConfig = { + checkErrors: 'EXPLICIT', + commonCaches: '/cache', + logdir: '/logs', + loglevel: 'DEBUG', + searchPath: '/path/to/ql', + synchronous: true, + verbosity: 'progress+', + }; + const args = buildLanguageServerArgs(config); + + expect(args).toContain('--check-errors=EXPLICIT'); + expect(args).toContain('--search-path=/path/to/ql'); + expect(args).toContain('--common-caches=/cache'); + expect(args).toContain('--logdir=/logs'); + expect(args).toContain('--loglevel=DEBUG'); + expect(args).toContain('--synchronous'); + expect(args).toContain('--verbosity=progress+'); + }); + + it('should not include absent optional args', () => { + const config: LanguageServerConfig = { searchPath: '/ql' }; + const args = buildLanguageServerArgs(config); + + expect(args).not.toContain(expect.stringContaining('--logdir')); + expect(args).not.toContain('--synchronous'); + }); + }); + + describe('buildQueryServerArgs', () => { + it('should build minimal args', () => { + const config: QueryServerConfig = {}; + const args = buildQueryServerArgs(config); + expect(args).toEqual(['execute', 'query-server2']); + }); + + it('should include all optional args', () => { + const config: QueryServerConfig = { + commonCaches: '/cache', + evaluatorLog: '/log.json', + logdir: '/logs', + maxDiskCache: 2048, + searchPath: '/path/to/ql', + threads: 4, + timeout: 60, + tupleCounting: true, + }; + const args = buildQueryServerArgs(config); + + expect(args).toContain('--search-path=/path/to/ql'); + expect(args).toContain('--common-caches=/cache'); + expect(args).toContain('--logdir=/logs'); + expect(args).toContain('--threads=4'); + expect(args).toContain('--timeout=60'); + expect(args).toContain('--max-disk-cache=2048'); + expect(args).toContain('--evaluator-log=/log.json'); + expect(args).toContain('--tuple-counting'); + }); + + it('should add debug and tuple-counting for debug mode', () => { + const config: QueryServerConfig = { debug: true }; + const args = buildQueryServerArgs(config); + + expect(args).toContain('--debug'); + expect(args).toContain('--tuple-counting'); + }); + + it('should handle zero threads', () => { + const config: QueryServerConfig = { threads: 0 }; + const args = buildQueryServerArgs(config); + expect(args).toContain('--threads=0'); + }); + }); + + describe('computeConfigHash', () => { + it('should return identical hash for identical config', () => { + const config: LanguageServerConfig = { loglevel: 'WARN', searchPath: '/ql' }; + const hash1 = computeConfigHash('language', config); + const hash2 = computeConfigHash('language', config); + expect(hash1).toBe(hash2); + }); + + it('should return different hash for different config', () => { + const config1: LanguageServerConfig = { loglevel: 'WARN' }; + const config2: LanguageServerConfig = { loglevel: 'DEBUG' }; + const hash1 = computeConfigHash('language', config1); + const hash2 = computeConfigHash('language', config2); + expect(hash1).not.toBe(hash2); + }); + + it('should return different hash for different server types', () => { + const config: LanguageServerConfig = { loglevel: 'WARN' }; + const hash1 = computeConfigHash('language', config); + const hash2 = computeConfigHash('query', config); + expect(hash1).not.toBe(hash2); + }); + + it('should return a 64-character hex string (SHA-256)', () => { + const hash = computeConfigHash('cli', {}); + expect(hash).toMatch(/^[a-f0-9]{64}$/); + }); + }); +}); diff --git a/server/test/src/lib/server-manager.test.ts b/server/test/src/lib/server-manager.test.ts new file mode 100644 index 00000000..8cec9aef --- /dev/null +++ b/server/test/src/lib/server-manager.test.ts @@ -0,0 +1,200 @@ +/** + * Tests for CodeQLServerManager. + */ + +import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest'; +import { EventEmitter } from 'events'; +import { existsSync } from 'fs'; +import { + CodeQLServerManager, + getServerManager, + initServerManager, + resetServerManager, + shutdownServerManager, +} from '../../../src/lib/server-manager'; + +// Mock child_process.spawn to avoid starting real CodeQL processes +vi.mock('child_process', async (importOriginal) => { + const actual = await importOriginal() as Record; + return { + ...actual, + spawn: vi.fn(() => { + const proc = new EventEmitter() as EventEmitter & { + stdin: { write: ReturnType; end: ReturnType }; + stdout: EventEmitter; + stderr: EventEmitter; + killed: boolean; + kill: ReturnType; + pid: number; + }; + proc.stdin = { write: vi.fn(), end: vi.fn() }; + proc.stdout = new EventEmitter(); + proc.stderr = new EventEmitter(); + proc.killed = false; + proc.kill = vi.fn(() => { (proc as { killed: boolean }).killed = true; }); + proc.pid = 12345; + return proc; + }), + }; +}); + +describe('CodeQLServerManager', () => { + beforeEach(() => { + resetServerManager(); + }); + + afterEach(() => { + resetServerManager(); + }); + + describe('constructor', () => { + it('should create session cache directories', () => { + const manager = new CodeQLServerManager({ sessionId: 'test-session-1' }); + const cacheDir = manager.getCacheDir(); + + expect(cacheDir).toContain('test-session-1'); + expect(existsSync(cacheDir)).toBe(true); + }); + + it('should generate a random session ID when none provided', () => { + const manager = new CodeQLServerManager(); + const sessionId = manager.getSessionId(); + + expect(sessionId).toBeDefined(); + expect(sessionId.length).toBeGreaterThan(0); + }); + }); + + describe('getCacheDir', () => { + it('should return a path under codeql-cache/', () => { + const manager = new CodeQLServerManager({ sessionId: 'cache-test' }); + expect(manager.getCacheDir()).toContain('codeql-cache'); + expect(manager.getCacheDir()).toContain('cache-test'); + }); + }); + + describe('getLogDir', () => { + it('should return a logs subdirectory of the cache dir', () => { + const manager = new CodeQLServerManager({ sessionId: 'log-test' }); + expect(manager.getLogDir()).toContain('logs'); + }); + }); + + describe('getStatus', () => { + it('should report all servers as null when none started', () => { + const manager = new CodeQLServerManager(); + const status = manager.getStatus(); + + expect(status.cli).toBeNull(); + expect(status.language).toBeNull(); + expect(status.query).toBeNull(); + }); + }); + + describe('isRunning', () => { + it('should return false for servers that were never started', () => { + const manager = new CodeQLServerManager(); + + expect(manager.isRunning('cli')).toBe(false); + expect(manager.isRunning('language')).toBe(false); + expect(manager.isRunning('query')).toBe(false); + }); + }); + + describe('shutdownAll', () => { + it('should not throw when no servers are running', async () => { + const manager = new CodeQLServerManager(); + await expect(manager.shutdownAll()).resolves.toBeUndefined(); + }); + }); + + describe('shutdownServer', () => { + it('should not throw when shutting down a server that was never started', async () => { + const manager = new CodeQLServerManager(); + await expect(manager.shutdownServer('language')).resolves.toBeUndefined(); + }); + + it('should accept all server type values', async () => { + const manager = new CodeQLServerManager(); + await expect(manager.shutdownServer('cli')).resolves.toBeUndefined(); + await expect(manager.shutdownServer('language')).resolves.toBeUndefined(); + await expect(manager.shutdownServer('query')).resolves.toBeUndefined(); + }); + }); + + describe('enrichConfig', () => { + it('should enrich config with session-specific cache and log dirs', () => { + const manager = new CodeQLServerManager({ sessionId: 'enrich-test' }); + const cacheDir = manager.getCacheDir(); + const logDir = manager.getLogDir(); + + // getCacheDir and getLogDir should be included in enriched configs + expect(cacheDir).toContain('enrich-test'); + expect(logDir).toContain('logs'); + }); + }); + + describe('getStatus after construction', () => { + it('should return consistent status structure', () => { + const manager = new CodeQLServerManager({ sessionId: 'status-test' }); + const status = manager.getStatus(); + + // All three server types should be present as keys + expect(Object.keys(status)).toEqual(expect.arrayContaining(['cli', 'language', 'query'])); + expect(status.cli).toBeNull(); + expect(status.language).toBeNull(); + expect(status.query).toBeNull(); + }); + }); +}); + +describe('global server manager', () => { + beforeEach(() => { + resetServerManager(); + }); + + afterEach(() => { + resetServerManager(); + }); + + describe('getServerManager', () => { + it('should create a manager on first call', () => { + const manager = getServerManager(); + expect(manager).toBeInstanceOf(CodeQLServerManager); + }); + + it('should return the same instance on subsequent calls', () => { + const m1 = getServerManager(); + const m2 = getServerManager(); + expect(m1).toBe(m2); + }); + }); + + describe('initServerManager', () => { + it('should initialize the global manager', () => { + const manager = initServerManager({ sessionId: 'init-test' }); + expect(manager.getSessionId()).toBe('init-test'); + }); + + it('should be idempotent', () => { + const m1 = initServerManager({ sessionId: 'first' }); + const m2 = initServerManager({ sessionId: 'second' }); + expect(m1).toBe(m2); + expect(m1.getSessionId()).toBe('first'); + }); + }); + + describe('shutdownServerManager', () => { + it('should not throw when no manager exists', async () => { + await expect(shutdownServerManager()).resolves.toBeUndefined(); + }); + + it('should clear the global manager', async () => { + initServerManager(); + await shutdownServerManager(); + // After shutdown, getServerManager should create a new instance + const newManager = getServerManager(); + expect(newManager).toBeDefined(); + }); + }); +}); diff --git a/server/test/src/prompts/workflow-prompts.test.ts b/server/test/src/prompts/workflow-prompts.test.ts index aafdaac4..11bcf090 100644 --- a/server/test/src/prompts/workflow-prompts.test.ts +++ b/server/test/src/prompts/workflow-prompts.test.ts @@ -1,16 +1,144 @@ /** - * Tests for workflow prompts context builders and schema validation + * Tests for workflow prompts context builders, schema validation, + * and registerWorkflowPrompts registration consistency. */ -import { describe, it, expect } from 'vitest'; +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { buildToolsQueryContext, buildWorkshopContext, + documentCodeqlQuerySchema, + explainCodeqlQuerySchema, + qlLspIterativeDevelopmentSchema, + qlTddAdvancedSchema, + qlTddBasicSchema, + registerWorkflowPrompts, + sarifRankSchema, SUPPORTED_LANGUAGES, - workshopCreationWorkflowSchema + testDrivenDevelopmentSchema, + toolsQueryWorkflowSchema, + WORKFLOW_PROMPT_NAMES, + workshopCreationWorkflowSchema, } from '../../../src/prompts/workflow-prompts'; +// --------------------------------------------------------------------------- +// Mock prompt-loader so tests never read .prompt.md files from disk. +// --------------------------------------------------------------------------- +vi.mock('../../../src/prompts/prompt-loader', () => ({ + loadPromptTemplate: vi.fn(() => '# mock template\n'), + processPromptTemplate: vi.fn(() => '# processed mock template\n'), +})); + describe('Workflow Prompts', () => { + // ----------------------------------------------------------------------- + // SUPPORTED_LANGUAGES + // ----------------------------------------------------------------------- + describe('SUPPORTED_LANGUAGES', () => { + it('should contain the expected 9 languages', () => { + expect(SUPPORTED_LANGUAGES).toHaveLength(9); + }); + + it.each([ + 'actions', 'cpp', 'csharp', 'go', 'java', + 'javascript', 'python', 'ruby', 'swift', + ] as const)('should include "%s"', (lang) => { + expect(SUPPORTED_LANGUAGES).toContain(lang); + }); + + it('should be sorted alphabetically', () => { + const sorted = [...SUPPORTED_LANGUAGES].sort(); + expect(SUPPORTED_LANGUAGES).toEqual(sorted); + }); + }); + + // ----------------------------------------------------------------------- + // WORKFLOW_PROMPT_NAMES + // ----------------------------------------------------------------------- + describe('WORKFLOW_PROMPT_NAMES', () => { + it('should contain 10 prompt names', () => { + expect(WORKFLOW_PROMPT_NAMES).toHaveLength(10); + }); + + it('should be sorted alphabetically', () => { + const sorted = [...WORKFLOW_PROMPT_NAMES].sort(); + expect(WORKFLOW_PROMPT_NAMES).toEqual(sorted); + }); + }); + + // ----------------------------------------------------------------------- + // testDrivenDevelopmentSchema + // ----------------------------------------------------------------------- + describe('testDrivenDevelopmentSchema', () => { + it('should accept valid required language', () => { + const result = testDrivenDevelopmentSchema.safeParse({ language: 'javascript' }); + expect(result.success).toBe(true); + }); + + it('should accept language with optional queryName', () => { + const result = testDrivenDevelopmentSchema.safeParse({ + language: 'python', + queryName: 'MyQuery', + }); + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.queryName).toBe('MyQuery'); + } + }); + + it('should reject missing language', () => { + const result = testDrivenDevelopmentSchema.safeParse({ queryName: 'Q' }); + expect(result.success).toBe(false); + }); + + it('should reject invalid language', () => { + const result = testDrivenDevelopmentSchema.safeParse({ language: 'rust' }); + expect(result.success).toBe(false); + }); + }); + + // ----------------------------------------------------------------------- + // toolsQueryWorkflowSchema + // ----------------------------------------------------------------------- + describe('toolsQueryWorkflowSchema', () => { + it('should accept required database and language', () => { + const result = toolsQueryWorkflowSchema.safeParse({ + database: '/db', + language: 'go', + }); + expect(result.success).toBe(true); + }); + + it('should reject missing database', () => { + const result = toolsQueryWorkflowSchema.safeParse({ language: 'go' }); + expect(result.success).toBe(false); + }); + + it('should reject missing language', () => { + const result = toolsQueryWorkflowSchema.safeParse({ database: '/db' }); + expect(result.success).toBe(false); + }); + + it('should accept all optional parameters', () => { + const result = toolsQueryWorkflowSchema.safeParse({ + database: '/db', + language: 'cpp', + sourceFiles: 'main.cpp', + sourceFunction: 'init', + targetFunction: 'cleanup', + }); + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.sourceFiles).toBe('main.cpp'); + expect(result.data.sourceFunction).toBe('init'); + expect(result.data.targetFunction).toBe('cleanup'); + } + }); + }); + + // ----------------------------------------------------------------------- + // workshopCreationWorkflowSchema + // ----------------------------------------------------------------------- describe('workshopCreationWorkflowSchema', () => { it('should accept valid parameters with number numStages', () => { const result = workshopCreationWorkflowSchema.safeParse({ @@ -102,6 +230,268 @@ describe('Workflow Prompts', () => { }); }); + // ----------------------------------------------------------------------- + // qlTddBasicSchema + // ----------------------------------------------------------------------- + describe('qlTddBasicSchema', () => { + it('should accept empty object (all optional)', () => { + const result = qlTddBasicSchema.safeParse({}); + expect(result.success).toBe(true); + }); + + it('should accept language only', () => { + const result = qlTddBasicSchema.safeParse({ language: 'java' }); + expect(result.success).toBe(true); + }); + + it('should accept queryName only', () => { + const result = qlTddBasicSchema.safeParse({ queryName: 'TestQ' }); + expect(result.success).toBe(true); + }); + + it('should reject invalid language', () => { + const result = qlTddBasicSchema.safeParse({ language: 'fortran' }); + expect(result.success).toBe(false); + }); + }); + + // ----------------------------------------------------------------------- + // qlTddAdvancedSchema + // ----------------------------------------------------------------------- + describe('qlTddAdvancedSchema', () => { + it('should accept empty object (all optional)', () => { + const result = qlTddAdvancedSchema.safeParse({}); + expect(result.success).toBe(true); + }); + + it('should accept all parameters', () => { + const result = qlTddAdvancedSchema.safeParse({ + database: '/db', + language: 'swift', + queryName: 'AdvancedQ', + }); + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.database).toBe('/db'); + } + }); + + it('should reject invalid language', () => { + const result = qlTddAdvancedSchema.safeParse({ language: 'sql' }); + expect(result.success).toBe(false); + }); + }); + + // ----------------------------------------------------------------------- + // sarifRankSchema + // ----------------------------------------------------------------------- + describe('sarifRankSchema', () => { + it('should accept empty object (all optional)', () => { + const result = sarifRankSchema.safeParse({}); + expect(result.success).toBe(true); + }); + + it('should accept queryId only', () => { + const result = sarifRankSchema.safeParse({ queryId: 'js/xss' }); + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.queryId).toBe('js/xss'); + } + }); + + it('should accept sarifPath only', () => { + const result = sarifRankSchema.safeParse({ sarifPath: '/results.sarif' }); + expect(result.success).toBe(true); + }); + + it('should accept both parameters', () => { + const result = sarifRankSchema.safeParse({ + queryId: 'py/sql-injection', + sarifPath: '/path.sarif', + }); + expect(result.success).toBe(true); + }); + }); + + // ----------------------------------------------------------------------- + // explainCodeqlQuerySchema + // ----------------------------------------------------------------------- + describe('explainCodeqlQuerySchema', () => { + it('should accept required queryPath and language', () => { + const result = explainCodeqlQuerySchema.safeParse({ + language: 'javascript', + queryPath: '/q.ql', + }); + expect(result.success).toBe(true); + }); + + it('should accept optional databasePath', () => { + const result = explainCodeqlQuerySchema.safeParse({ + databasePath: '/db', + language: 'python', + queryPath: '/q.ql', + }); + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.databasePath).toBe('/db'); + } + }); + + it('should reject missing queryPath', () => { + const result = explainCodeqlQuerySchema.safeParse({ language: 'java' }); + expect(result.success).toBe(false); + }); + + it('should reject missing language', () => { + const result = explainCodeqlQuerySchema.safeParse({ queryPath: '/q.ql' }); + expect(result.success).toBe(false); + }); + }); + + // ----------------------------------------------------------------------- + // documentCodeqlQuerySchema + // ----------------------------------------------------------------------- + describe('documentCodeqlQuerySchema', () => { + it('should accept required queryPath and language', () => { + const result = documentCodeqlQuerySchema.safeParse({ + language: 'go', + queryPath: '/q.ql', + }); + expect(result.success).toBe(true); + }); + + it('should reject missing queryPath', () => { + const result = documentCodeqlQuerySchema.safeParse({ language: 'go' }); + expect(result.success).toBe(false); + }); + + it('should reject missing language', () => { + const result = documentCodeqlQuerySchema.safeParse({ queryPath: '/q.ql' }); + expect(result.success).toBe(false); + }); + }); + + // ----------------------------------------------------------------------- + // qlLspIterativeDevelopmentSchema + // ----------------------------------------------------------------------- + describe('qlLspIterativeDevelopmentSchema', () => { + it('should accept empty object (all optional)', () => { + const result = qlLspIterativeDevelopmentSchema.safeParse({}); + expect(result.success).toBe(true); + }); + + it('should accept all parameters', () => { + const result = qlLspIterativeDevelopmentSchema.safeParse({ + language: 'ruby', + queryPath: '/q.ql', + workspaceUri: 'file:///ws', + }); + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.workspaceUri).toBe('file:///ws'); + } + }); + + it('should reject invalid language', () => { + const result = qlLspIterativeDevelopmentSchema.safeParse({ language: 'haskell' }); + expect(result.success).toBe(false); + }); + }); + + // ----------------------------------------------------------------------- + // registerWorkflowPrompts + // ----------------------------------------------------------------------- + describe('registerWorkflowPrompts', () => { + let mockServer: McpServer; + + beforeEach(() => { + vi.clearAllMocks(); + mockServer = { prompt: vi.fn() } as unknown as McpServer; + }); + + it('should register exactly WORKFLOW_PROMPT_NAMES.length prompts', () => { + registerWorkflowPrompts(mockServer); + expect(mockServer.prompt).toHaveBeenCalledTimes(WORKFLOW_PROMPT_NAMES.length); + }); + + it('should register every prompt listed in WORKFLOW_PROMPT_NAMES', () => { + registerWorkflowPrompts(mockServer); + + const registeredNames = (mockServer.prompt as ReturnType) + .mock.calls.map((call: unknown[]) => call[0] as string) + .sort(); + + expect(registeredNames).toEqual([...WORKFLOW_PROMPT_NAMES]); + }); + + it('should register each prompt with a description string', () => { + registerWorkflowPrompts(mockServer); + + for (const call of (mockServer.prompt as ReturnType).mock.calls) { + expect(typeof call[1]).toBe('string'); + expect((call[1] as string).length).toBeGreaterThan(0); + } + }); + + it('should register each prompt with a non-empty schema object', () => { + registerWorkflowPrompts(mockServer); + + for (const call of (mockServer.prompt as ReturnType).mock.calls) { + const schema = call[2]; + expect(schema).toBeDefined(); + expect(typeof schema).toBe('object'); + // Every prompt should have at least one parameter key + expect(Object.keys(schema).length).toBeGreaterThan(0); + } + }); + + it('should register each prompt with an async handler function', () => { + registerWorkflowPrompts(mockServer); + + for (const call of (mockServer.prompt as ReturnType).mock.calls) { + expect(typeof call[3]).toBe('function'); + } + }); + + it('each handler should return { messages: [...] } with a user message', async () => { + registerWorkflowPrompts(mockServer); + + // Build a minimal-valid args map for each prompt to invoke its handler. + const minimalArgs: Record> = { + document_codeql_query: { language: 'java', queryPath: '/q.ql' }, + explain_codeql_query: { language: 'java', queryPath: '/q.ql' }, + ql_lsp_iterative_development: {}, + ql_tdd_advanced: {}, + ql_tdd_basic: {}, + sarif_rank_false_positives: {}, + sarif_rank_true_positives: {}, + test_driven_development: { language: 'javascript' }, + tools_query_workflow: { database: '/db', language: 'javascript' }, + workshop_creation_workflow: { language: 'javascript', queryPath: '/q.ql' }, + }; + + for (const call of (mockServer.prompt as ReturnType).mock.calls) { + const promptName = call[0] as string; + + const handler = call[3] as any; + + const result = (await handler(minimalArgs[promptName] ?? {})) as { + messages: Array<{ content: { text: string; type: string }; role: string }>; + }; + + expect(result).toHaveProperty('messages'); + expect(result.messages.length).toBeGreaterThan(0); + expect(result.messages[0].role).toBe('user'); + expect(result.messages[0].content.type).toBe('text'); + expect(typeof result.messages[0].content.text).toBe('string'); + expect(result.messages[0].content.text.length).toBeGreaterThan(0); + } + }); + }); + + // ----------------------------------------------------------------------- + // buildToolsQueryContext + // ----------------------------------------------------------------------- describe('buildToolsQueryContext', () => { it('should build minimal context with required fields only', () => { const result = buildToolsQueryContext('javascript', '/path/to/db'); @@ -175,6 +565,9 @@ describe('Workflow Prompts', () => { }); }); + // ----------------------------------------------------------------------- + // buildWorkshopContext + // ----------------------------------------------------------------------- describe('buildWorkshopContext', () => { it('should build context with required fields', () => { const result = buildWorkshopContext( @@ -237,4 +630,4 @@ describe('Workflow Prompts', () => { ); }); }); -}); +}); \ No newline at end of file diff --git a/server/test/src/tools/codeql-tools.test.ts b/server/test/src/tools/codeql-tools.test.ts index 8a03e5ea..d6e74b33 100644 --- a/server/test/src/tools/codeql-tools.test.ts +++ b/server/test/src/tools/codeql-tools.test.ts @@ -39,8 +39,9 @@ describe('registerCodeQLTools', () => { // rank_sarif_results has been removed in favor of SARIF prompts expect(toolNames).not.toContain('rank_sarif_results'); - // Total tools registered: 2 high-level helpers + 7 specialized tools + 22 CLI tools = 31 - expect(mockServer.tool).toHaveBeenCalledTimes(31); + // Total tools registered: 2 high-level helpers + 6 specialized tools + 22 CLI tools = 30 + // (codeql_lsp_diagnostics moved to registerLSPTools in tools/lsp/) + expect(mockServer.tool).toHaveBeenCalledTimes(30); }); it('should register validate_codeql_query with correct parameters', () => { diff --git a/server/test/src/tools/codeql/language-server-eval.test.ts b/server/test/src/tools/codeql/language-server-eval.test.ts deleted file mode 100644 index f01cc5e5..00000000 --- a/server/test/src/tools/codeql/language-server-eval.test.ts +++ /dev/null @@ -1,428 +0,0 @@ -/** - * Tests for CodeQL Language Server Eval tool - */ - -import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest'; -import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; - -// Mock the logger -vi.mock('../../../../src/utils/logger', () => ({ - logger: { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }, -})); - -// Create mock language server instance methods -const mockStart = vi.fn(); -const mockInitialize = vi.fn(); -const mockEvaluateQL = vi.fn(); -const mockShutdown = vi.fn(); -const mockIsRunning = vi.fn(); - -// Mock the language-server module with a proper class -vi.mock('../../../../src/lib/language-server', () => ({ - CodeQLLanguageServer: class MockCodeQLLanguageServer { - start = mockStart; - initialize = mockInitialize; - evaluateQL = mockEvaluateQL; - shutdown = mockShutdown; - isRunning = mockIsRunning; - }, -})); - -import { - registerLanguageServerEvalTool, - shutdownLanguageServer, - evaluateQLCode, -} from '../../../../src/tools/codeql/language-server-eval'; - -describe('Language Server Eval Tool', () => { - beforeEach(() => { - vi.clearAllMocks(); - mockIsRunning.mockReturnValue(false); - }); - - afterEach(async () => { - // Reset the global language server state - await shutdownLanguageServer(); - }); - - describe('module structure', () => { - it('should export registerLanguageServerEvalTool function', () => { - expect(typeof registerLanguageServerEvalTool).toBe('function'); - }); - - it('should export shutdownLanguageServer function', () => { - expect(typeof shutdownLanguageServer).toBe('function'); - }); - - it('should export evaluateQLCode function', () => { - expect(typeof evaluateQLCode).toBe('function'); - }); - }); - - describe('registerLanguageServerEvalTool', () => { - it('should register the codeql_language_server_eval tool with the MCP server', () => { - const mockServer = { - tool: vi.fn(), - } as unknown as McpServer; - - registerLanguageServerEvalTool(mockServer); - - expect(mockServer.tool).toHaveBeenCalledOnce(); - // Check the tool was registered with the correct name - const toolCall = (mockServer.tool as any).mock.calls[0]; - expect(toolCall[0]).toBe('codeql_language_server_eval'); - // Check description mentions authoritative validation and compilation - expect(toolCall[1]).toContain('Authoritative'); - expect(toolCall[1]).toContain('Compiles the query'); - expect(toolCall[1]).toContain('validate_codeql_query'); - // Check the schema has the expected parameters - expect(toolCall[2]).toHaveProperty('ql_code'); - expect(toolCall[2]).toHaveProperty('workspace_uri'); - expect(toolCall[2]).toHaveProperty('search_path'); - expect(toolCall[2]).toHaveProperty('log_level'); - // Check there's a handler function - expect(typeof toolCall[3]).toBe('function'); - }); - - it('should define ql_code as a required string parameter', () => { - const mockServer = { - tool: vi.fn(), - } as unknown as McpServer; - - registerLanguageServerEvalTool(mockServer); - - const schema = (mockServer.tool as ReturnType).mock.calls[0][2]; - expect(schema.ql_code).toBeDefined(); - }); - - it('should define optional workspace_uri parameter', () => { - const mockServer = { - tool: vi.fn(), - } as unknown as McpServer; - - registerLanguageServerEvalTool(mockServer); - - const schema = (mockServer.tool as ReturnType).mock.calls[0][2]; - expect(schema.workspace_uri).toBeDefined(); - }); - - it('should define optional log_level parameter with enum values', () => { - const mockServer = { - tool: vi.fn(), - } as unknown as McpServer; - - registerLanguageServerEvalTool(mockServer); - - const schema = (mockServer.tool as ReturnType).mock.calls[0][2]; - expect(schema.log_level).toBeDefined(); - }); - }); - - describe('shutdownLanguageServer', () => { - it('should be safe to call when no server is running', async () => { - // This should not throw - await expect(shutdownLanguageServer()).resolves.toBeUndefined(); - }); - }); - - describe('evaluateQLCode', () => { - it('should return valid result when no diagnostics are found', async () => { - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([]); - - const result = await evaluateQLCode({ - qlCode: 'import javascript\nselect 1', - }); - - expect(result.isValid).toBe(true); - expect(result.diagnostics).toHaveLength(0); - expect(result.summary.errorCount).toBe(0); - expect(result.summary.warningCount).toBe(0); - expect(result.summary.infoCount).toBe(0); - expect(result.summary.hintCount).toBe(0); - expect(result.formattedOutput).toContain('No issues found'); - }); - - it('should return invalid result when errors are found', async () => { - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([ - { - range: { start: { line: 0, character: 0 }, end: { line: 0, character: 10 } }, - severity: 1, // Error - message: 'Syntax error', - source: 'codeql', - }, - ]); - - const result = await evaluateQLCode({ - qlCode: 'invalid code', - }); - - expect(result.isValid).toBe(false); - expect(result.diagnostics).toHaveLength(1); - expect(result.summary.errorCount).toBe(1); - expect(result.formattedOutput).toContain('Syntax error'); - expect(result.formattedOutput).toContain('Error'); - }); - - it('should count warnings separately from errors', async () => { - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([ - { - range: { start: { line: 0, character: 0 }, end: { line: 0, character: 10 } }, - severity: 2, // Warning - message: 'Deprecated syntax', - source: 'codeql', - }, - ]); - - const result = await evaluateQLCode({ - qlCode: 'some code with warnings', - }); - - // Valid because no errors, only warnings - expect(result.isValid).toBe(true); - expect(result.summary.errorCount).toBe(0); - expect(result.summary.warningCount).toBe(1); - expect(result.formattedOutput).toContain('Warning'); - }); - - it('should count info and hint diagnostics', async () => { - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([ - { - range: { start: { line: 0, character: 0 }, end: { line: 0, character: 5 } }, - severity: 3, // Information - message: 'Info message', - }, - { - range: { start: { line: 1, character: 0 }, end: { line: 1, character: 5 } }, - severity: 4, // Hint - message: 'Hint message', - }, - ]); - - const result = await evaluateQLCode({ - qlCode: 'some code', - }); - - expect(result.isValid).toBe(true); - expect(result.summary.infoCount).toBe(1); - expect(result.summary.hintCount).toBe(1); - expect(result.formattedOutput).toContain('Information'); - expect(result.formattedOutput).toContain('Hint'); - }); - - it('should handle multiple diagnostics of different severities', async () => { - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([ - { - range: { start: { line: 0, character: 0 }, end: { line: 0, character: 5 } }, - severity: 1, - message: 'Error 1', - }, - { - range: { start: { line: 1, character: 0 }, end: { line: 1, character: 5 } }, - severity: 1, - message: 'Error 2', - }, - { - range: { start: { line: 2, character: 0 }, end: { line: 2, character: 5 } }, - severity: 2, - message: 'Warning 1', - }, - ]); - - const result = await evaluateQLCode({ - qlCode: 'code with multiple issues', - }); - - expect(result.isValid).toBe(false); - expect(result.diagnostics).toHaveLength(3); - expect(result.summary.errorCount).toBe(2); - expect(result.summary.warningCount).toBe(1); - expect(result.formattedOutput).toContain('3 issue(s)'); - }); - - it('should include diagnostic code when present', async () => { - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([ - { - range: { start: { line: 0, character: 0 }, end: { line: 0, character: 5 } }, - severity: 1, - message: 'Error message', - code: 'ql/syntax-error', - source: 'codeql-ls', - }, - ]); - - const result = await evaluateQLCode({ - qlCode: 'invalid', - }); - - expect(result.formattedOutput).toContain('Code: ql/syntax-error'); - expect(result.formattedOutput).toContain('Source: codeql-ls'); - }); - - it('should throw error when language server fails to start', async () => { - mockStart.mockRejectedValue(new Error('Failed to start server')); - - await expect(evaluateQLCode({ - qlCode: 'some code', - })).rejects.toThrow('QL evaluation failed: Failed to start server'); - }); - - it('should reuse existing language server if running', async () => { - // First call: server not running, will create and start - mockIsRunning.mockReturnValue(false); - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([]); - - await evaluateQLCode({ qlCode: 'code 1' }); - - // start should be called once for the first call - expect(mockStart).toHaveBeenCalledTimes(1); - - // Now simulate server is running - mockIsRunning.mockReturnValue(true); - - await evaluateQLCode({ qlCode: 'code 2' }); - - // start should still only have been called once (reused) - expect(mockStart).toHaveBeenCalledTimes(1); - }); - }); - - describe('tool handler', () => { - it('should return success response for valid code', async () => { - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([]); - - const mockServer = { - tool: vi.fn(), - } as unknown as McpServer; - - registerLanguageServerEvalTool(mockServer); - - const handler = (mockServer.tool as ReturnType).mock.calls[0][3]; - const result = await handler({ - ql_code: 'import javascript\nselect 1', - }); - - expect(result.isError).toBeUndefined(); - expect(result.content).toHaveLength(1); - expect(result.content[0].type).toBe('text'); - - const parsed = JSON.parse(result.content[0].text); - expect(parsed.isValid).toBe(true); - expect(parsed.summary.errorCount).toBe(0); - }); - - it('should return response with diagnostics for invalid code', async () => { - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([ - { - range: { start: { line: 0, character: 0 }, end: { line: 0, character: 10 } }, - severity: 1, - message: 'Parse error', - code: 'ql/parse', - }, - ]); - - const mockServer = { - tool: vi.fn(), - } as unknown as McpServer; - - registerLanguageServerEvalTool(mockServer); - - const handler = (mockServer.tool as ReturnType).mock.calls[0][3]; - const result = await handler({ - ql_code: 'invalid syntax here', - }); - - expect(result.isError).toBeUndefined(); - - const parsed = JSON.parse(result.content[0].text); - expect(parsed.isValid).toBe(false); - expect(parsed.diagnostics).toHaveLength(1); - expect(parsed.diagnostics[0].line).toBe(1); // 1-based - expect(parsed.diagnostics[0].severity).toBe('Error'); - expect(parsed.diagnostics[0].message).toBe('Parse error'); - }); - - it('should return error response when evaluation fails', async () => { - mockStart.mockRejectedValue(new Error('Connection refused')); - - const mockServer = { - tool: vi.fn(), - } as unknown as McpServer; - - registerLanguageServerEvalTool(mockServer); - - const handler = (mockServer.tool as ReturnType).mock.calls[0][3]; - const result = await handler({ - ql_code: 'some code', - }); - - expect(result.isError).toBe(true); - expect(result.content[0].text).toContain('Error'); - expect(result.content[0].text).toContain('Connection refused'); - }); - - it('should pass search_path option to server', async () => { - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([]); - - const mockServer = { - tool: vi.fn(), - } as unknown as McpServer; - - registerLanguageServerEvalTool(mockServer); - - const handler = (mockServer.tool as ReturnType).mock.calls[0][3]; - await handler({ - ql_code: 'import javascript', - search_path: '/custom/ql/path', - }); - - // Verify the server was started and used to evaluate - expect(mockStart).toHaveBeenCalled(); - expect(mockEvaluateQL).toHaveBeenCalled(); - }); - - it('should pass log_level option to server', async () => { - mockStart.mockResolvedValue(undefined); - mockInitialize.mockResolvedValue(undefined); - mockEvaluateQL.mockResolvedValue([]); - - const mockServer = { - tool: vi.fn(), - } as unknown as McpServer; - - registerLanguageServerEvalTool(mockServer); - - const handler = (mockServer.tool as ReturnType).mock.calls[0][3]; - await handler({ - ql_code: 'select 1', - log_level: 'DEBUG', - }); - - expect(mockEvaluateQL).toHaveBeenCalled(); - }); - }); -}); \ No newline at end of file diff --git a/server/test/src/tools/lsp/index.test.ts b/server/test/src/tools/lsp/index.test.ts new file mode 100644 index 00000000..848ca024 --- /dev/null +++ b/server/test/src/tools/lsp/index.test.ts @@ -0,0 +1,66 @@ +/** + * Tests for LSP tools barrel export (index.ts). + * + * Verifies that all public exports are accessible via the index module. + */ + +import { describe, expect, it, vi } from 'vitest'; + +// Mock heavy dependencies so we don't spawn real processes +vi.mock('../../../../src/lib/server-manager', () => ({ + getServerManager: vi.fn(() => ({ + getLanguageServer: vi.fn().mockResolvedValue({}), + shutdownServer: vi.fn().mockResolvedValue(undefined), + })), +})); + +vi.mock('../../../../src/utils/package-paths', () => ({ + getPackageRootDir: vi.fn(() => '/mock/pkg'), + packageRootDir: '/mock/pkg', +})); + +vi.mock('../../../../src/utils/temp-dir', () => ({ + createProjectTempDir: vi.fn((prefix: string) => `/mock/.tmp/${prefix}test`), + getProjectTmpBase: vi.fn(() => '/mock/.tmp'), + getProjectTmpDir: vi.fn((name: string) => `/mock/.tmp/${name}`), +})); + +import { + lspCompletion, + lspDefinition, + lspDiagnostics, + lspReferences, + registerLSPTools, + registerLspDiagnosticsTool, + shutdownDiagnosticsServer, +} from '../../../../src/tools/lsp'; + +describe('lsp/index exports', () => { + it('should export lspCompletion', () => { + expect(typeof lspCompletion).toBe('function'); + }); + + it('should export lspDefinition', () => { + expect(typeof lspDefinition).toBe('function'); + }); + + it('should export lspDiagnostics', () => { + expect(typeof lspDiagnostics).toBe('function'); + }); + + it('should export lspReferences', () => { + expect(typeof lspReferences).toBe('function'); + }); + + it('should export registerLSPTools', () => { + expect(typeof registerLSPTools).toBe('function'); + }); + + it('should export registerLspDiagnosticsTool', () => { + expect(typeof registerLspDiagnosticsTool).toBe('function'); + }); + + it('should export shutdownDiagnosticsServer', () => { + expect(typeof shutdownDiagnosticsServer).toBe('function'); + }); +}); diff --git a/server/test/src/tools/lsp/lsp-diagnostics.test.ts b/server/test/src/tools/lsp/lsp-diagnostics.test.ts new file mode 100644 index 00000000..f77f56de --- /dev/null +++ b/server/test/src/tools/lsp/lsp-diagnostics.test.ts @@ -0,0 +1,332 @@ +/** + * Tests for CodeQL LSP Diagnostics tool (codeql_lsp_diagnostics). + * + * Mocks the CodeQLServerManager to avoid spawning real CodeQL processes. + */ + +import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest'; +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; + +// Mock the logger +vi.mock('../../../../src/utils/logger', () => ({ + logger: { + debug: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, +})); + +// Create mock language server instance methods +const mockEvaluateQL = vi.fn().mockResolvedValue([]); +const mockInitialize = vi.fn().mockResolvedValue(undefined); +const mockIsRunning = vi.fn().mockReturnValue(true); + +const mockLanguageServer = { + evaluateQL: mockEvaluateQL, + initialize: mockInitialize, + isRunning: mockIsRunning, +}; + +const mockGetLanguageServer = vi.fn().mockResolvedValue(mockLanguageServer); +const mockShutdownServer = vi.fn().mockResolvedValue(undefined); + +// Mock the server-manager module +vi.mock('../../../../src/lib/server-manager', () => ({ + getServerManager: vi.fn(() => ({ + getLanguageServer: mockGetLanguageServer, + shutdownServer: mockShutdownServer, + })), +})); + +// Mock package-paths +vi.mock('../../../../src/utils/package-paths', () => ({ + getPackageRootDir: vi.fn(() => '/mock/pkg'), + packageRootDir: '/mock/pkg', +})); + +// Mock temp-dir to avoid filesystem operations against /mock/pkg/.tmp +vi.mock('../../../../src/utils/temp-dir', () => ({ + createProjectTempDir: vi.fn((prefix: string) => `/mock/pkg/.tmp/${prefix}test`), + getProjectTmpBase: vi.fn(() => '/mock/pkg/.tmp'), + getProjectTmpDir: vi.fn((name: string) => `/mock/pkg/.tmp/${name}`), +})); + +import { + lspDiagnostics, + registerLspDiagnosticsTool, + shutdownDiagnosticsServer, +} from '../../../../src/tools/lsp/lsp-diagnostics'; + +describe('LSP Diagnostics Tool', () => { + beforeEach(() => { + vi.clearAllMocks(); + mockIsRunning.mockReturnValue(true); + mockEvaluateQL.mockResolvedValue([]); + mockInitialize.mockResolvedValue(undefined); + mockGetLanguageServer.mockResolvedValue(mockLanguageServer); + }); + + afterEach(async () => { + await shutdownDiagnosticsServer(); + }); + + describe('module structure', () => { + it('should export lspDiagnostics function', () => { + expect(typeof lspDiagnostics).toBe('function'); + }); + + it('should export registerLspDiagnosticsTool function', () => { + expect(typeof registerLspDiagnosticsTool).toBe('function'); + }); + + it('should export shutdownDiagnosticsServer function', () => { + expect(typeof shutdownDiagnosticsServer).toBe('function'); + }); + }); + + describe('registerLspDiagnosticsTool', () => { + it('should register the codeql_lsp_diagnostics tool with the MCP server', () => { + const mockServer = { tool: vi.fn() } as unknown as McpServer; + + registerLspDiagnosticsTool(mockServer); + + expect(mockServer.tool).toHaveBeenCalledOnce(); + const toolCall = (mockServer.tool as ReturnType).mock.calls[0]; + expect(toolCall[0]).toBe('codeql_lsp_diagnostics'); + expect(toolCall[1]).toContain('Authoritative'); + expect(toolCall[1]).toContain('Compiles the query'); + expect(toolCall[1]).toContain('validate_codeql_query'); + expect(toolCall[2]).toHaveProperty('ql_code'); + expect(toolCall[2]).toHaveProperty('workspace_uri'); + expect(toolCall[2]).toHaveProperty('search_path'); + expect(toolCall[2]).toHaveProperty('log_level'); + expect(typeof toolCall[3]).toBe('function'); + }); + + it('should define optional log_level parameter', () => { + const mockServer = { tool: vi.fn() } as unknown as McpServer; + registerLspDiagnosticsTool(mockServer); + const schema = (mockServer.tool as ReturnType).mock.calls[0][2]; + expect(schema.log_level).toBeDefined(); + }); + + it('should define optional workspace_uri parameter', () => { + const mockServer = { tool: vi.fn() } as unknown as McpServer; + registerLspDiagnosticsTool(mockServer); + const schema = (mockServer.tool as ReturnType).mock.calls[0][2]; + expect(schema.workspace_uri).toBeDefined(); + }); + + it('should define ql_code as a required string parameter', () => { + const mockServer = { tool: vi.fn() } as unknown as McpServer; + registerLspDiagnosticsTool(mockServer); + const schema = (mockServer.tool as ReturnType).mock.calls[0][2]; + expect(schema.ql_code).toBeDefined(); + }); + }); + + describe('shutdownDiagnosticsServer', () => { + it('should delegate to server manager shutdownServer', async () => { + await shutdownDiagnosticsServer(); + expect(mockShutdownServer).toHaveBeenCalledWith('language'); + }); + + it('should be safe to call multiple times', async () => { + await expect(shutdownDiagnosticsServer()).resolves.toBeUndefined(); + await expect(shutdownDiagnosticsServer()).resolves.toBeUndefined(); + }); + }); + + describe('lspDiagnostics', () => { + it('should return valid result when no diagnostics are found', async () => { + mockEvaluateQL.mockResolvedValue([]); + + const result = await lspDiagnostics({ qlCode: 'import javascript\nselect 1' }); + + expect(result.isValid).toBe(true); + expect(result.diagnostics).toHaveLength(0); + expect(result.summary.errorCount).toBe(0); + expect(result.summary.warningCount).toBe(0); + expect(result.summary.infoCount).toBe(0); + expect(result.summary.hintCount).toBe(0); + expect(result.formattedOutput).toContain('No issues found'); + }); + + it('should return invalid result when errors are found', async () => { + mockEvaluateQL.mockResolvedValue([{ + range: { start: { line: 0, character: 0 }, end: { line: 0, character: 10 } }, + severity: 1, + message: 'Syntax error', + source: 'codeql', + }]); + + const result = await lspDiagnostics({ qlCode: 'invalid code' }); + + expect(result.isValid).toBe(false); + expect(result.diagnostics).toHaveLength(1); + expect(result.summary.errorCount).toBe(1); + expect(result.formattedOutput).toContain('Syntax error'); + }); + + it('should count warnings separately from errors', async () => { + mockEvaluateQL.mockResolvedValue([{ + range: { start: { line: 0, character: 0 }, end: { line: 0, character: 10 } }, + severity: 2, + message: 'Deprecated syntax', + source: 'codeql', + }]); + + const result = await lspDiagnostics({ qlCode: 'some code' }); + + expect(result.isValid).toBe(true); + expect(result.summary.errorCount).toBe(0); + expect(result.summary.warningCount).toBe(1); + expect(result.formattedOutput).toContain('Warning'); + }); + + it('should count info and hint diagnostics', async () => { + mockEvaluateQL.mockResolvedValue([ + { range: { start: { line: 0, character: 0 }, end: { line: 0, character: 5 } }, severity: 3, message: 'Info' }, + { range: { start: { line: 1, character: 0 }, end: { line: 1, character: 5 } }, severity: 4, message: 'Hint' }, + ]); + + const result = await lspDiagnostics({ qlCode: 'some code' }); + + expect(result.isValid).toBe(true); + expect(result.summary.infoCount).toBe(1); + expect(result.summary.hintCount).toBe(1); + }); + + it('should handle multiple diagnostics of different severities', async () => { + mockEvaluateQL.mockResolvedValue([ + { range: { start: { line: 0, character: 0 }, end: { line: 0, character: 5 } }, severity: 1, message: 'Error 1' }, + { range: { start: { line: 1, character: 0 }, end: { line: 1, character: 5 } }, severity: 1, message: 'Error 2' }, + { range: { start: { line: 2, character: 0 }, end: { line: 2, character: 5 } }, severity: 2, message: 'Warning 1' }, + ]); + + const result = await lspDiagnostics({ qlCode: 'code' }); + + expect(result.isValid).toBe(false); + expect(result.diagnostics).toHaveLength(3); + expect(result.summary.errorCount).toBe(2); + expect(result.summary.warningCount).toBe(1); + expect(result.formattedOutput).toContain('3 issue(s)'); + }); + + it('should include diagnostic code when present', async () => { + mockEvaluateQL.mockResolvedValue([{ + range: { start: { line: 0, character: 0 }, end: { line: 0, character: 5 } }, + severity: 1, + message: 'Error message', + code: 'ql/syntax-error', + source: 'codeql-ls', + }]); + + const result = await lspDiagnostics({ qlCode: 'invalid' }); + + expect(result.formattedOutput).toContain('Code: ql/syntax-error'); + expect(result.formattedOutput).toContain('Source: codeql-ls'); + }); + + it('should throw error when server manager fails', async () => { + mockGetLanguageServer.mockRejectedValue(new Error('Failed to start server')); + + await expect(lspDiagnostics({ qlCode: 'some code' })) + .rejects.toThrow('QL evaluation failed: Failed to start server'); + }); + + it('should pass workspaceUri to the language server initialize', async () => { + await lspDiagnostics({ qlCode: 'select 1', workspaceUri: 'file:///custom/workspace' }); + expect(mockInitialize).toHaveBeenCalledWith('file:///custom/workspace'); + }); + + it('should reuse server via manager', async () => { + await lspDiagnostics({ qlCode: 'code 1' }); + await lspDiagnostics({ qlCode: 'code 2' }); + + expect(mockGetLanguageServer).toHaveBeenCalledTimes(2); + expect(mockEvaluateQL).toHaveBeenCalledTimes(2); + }); + }); + + describe('tool handler', () => { + it('should return success response for valid code', async () => { + mockEvaluateQL.mockResolvedValue([]); + + const mockServer = { tool: vi.fn() } as unknown as McpServer; + registerLspDiagnosticsTool(mockServer); + + const handler = (mockServer.tool as ReturnType).mock.calls[0][3]; + const result = await handler({ ql_code: 'import javascript\nselect 1' }); + + expect(result.isError).toBeUndefined(); + expect(result.content).toHaveLength(1); + expect(result.content[0].type).toBe('text'); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed.isValid).toBe(true); + expect(parsed.summary.errorCount).toBe(0); + }); + + it('should return response with diagnostics for invalid code', async () => { + mockEvaluateQL.mockResolvedValue([{ + range: { start: { line: 0, character: 0 }, end: { line: 0, character: 10 } }, + severity: 1, + message: 'Parse error', + code: 'ql/parse', + }]); + + const mockServer = { tool: vi.fn() } as unknown as McpServer; + registerLspDiagnosticsTool(mockServer); + + const handler = (mockServer.tool as ReturnType).mock.calls[0][3]; + const result = await handler({ ql_code: 'invalid syntax here' }); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed.isValid).toBe(false); + expect(parsed.diagnostics).toHaveLength(1); + expect(parsed.diagnostics[0].line).toBe(1); + expect(parsed.diagnostics[0].severity).toBe('Error'); + expect(parsed.diagnostics[0].message).toBe('Parse error'); + }); + + it('should return error response when evaluation fails', async () => { + mockGetLanguageServer.mockRejectedValue(new Error('Connection refused')); + + const mockServer = { tool: vi.fn() } as unknown as McpServer; + registerLspDiagnosticsTool(mockServer); + + const handler = (mockServer.tool as ReturnType).mock.calls[0][3]; + const result = await handler({ ql_code: 'some code' }); + + expect(result.isError).toBe(true); + expect(result.content[0].text).toContain('Error'); + expect(result.content[0].text).toContain('Connection refused'); + }); + + it('should pass search_path option to server config', async () => { + const mockServer = { tool: vi.fn() } as unknown as McpServer; + registerLspDiagnosticsTool(mockServer); + + const handler = (mockServer.tool as ReturnType).mock.calls[0][3]; + await handler({ ql_code: 'import javascript', search_path: '/custom/ql/path' }); + + expect(mockGetLanguageServer).toHaveBeenCalledWith( + expect.objectContaining({ searchPath: '/custom/ql/path' }), + ); + }); + + it('should pass log_level option to server config', async () => { + const mockServer = { tool: vi.fn() } as unknown as McpServer; + registerLspDiagnosticsTool(mockServer); + + const handler = (mockServer.tool as ReturnType).mock.calls[0][3]; + await handler({ ql_code: 'select 1', log_level: 'DEBUG' }); + + expect(mockGetLanguageServer).toHaveBeenCalledWith( + expect.objectContaining({ loglevel: 'DEBUG' }), + ); + }); + }); +}); diff --git a/server/test/src/tools/lsp/lsp-handlers.test.ts b/server/test/src/tools/lsp/lsp-handlers.test.ts new file mode 100644 index 00000000..4f63e667 --- /dev/null +++ b/server/test/src/tools/lsp/lsp-handlers.test.ts @@ -0,0 +1,258 @@ +/** + * Tests for LSP tool handlers. + */ + +import { describe, expect, it, vi, beforeEach } from 'vitest'; + +// Mock the server manager before importing handlers +const mockGetCompletions = vi.fn().mockResolvedValue([]); +const mockGetDefinition = vi.fn().mockResolvedValue([]); +const mockGetReferences = vi.fn().mockResolvedValue([]); +const mockOpenDocument = vi.fn(); +const mockCloseDocument = vi.fn(); +const mockInitialize = vi.fn().mockResolvedValue(undefined); + +const mockLanguageServer = { + closeDocument: mockCloseDocument, + getCompletions: mockGetCompletions, + getDefinition: mockGetDefinition, + getReferences: mockGetReferences, + initialize: mockInitialize, + openDocument: mockOpenDocument, +}; + +vi.mock('../../../../src/lib/server-manager', () => ({ + getServerManager: vi.fn(() => ({ + getLanguageServer: vi.fn().mockResolvedValue(mockLanguageServer), + })), +})); + +vi.mock('../../../../src/utils/package-paths', () => ({ + getPackageRootDir: vi.fn(() => '/mock/pkg'), + packageRootDir: '/mock/pkg', +})); + +vi.mock('fs', async (importOriginal) => { + const actual = await importOriginal() as Record; + return { + ...actual, + readFileSync: vi.fn(() => 'import ql\nselect 1'), + }; +}); + +import { + lspCompletion, + lspDefinition, + lspReferences, +} from '../../../../src/tools/lsp/lsp-handlers'; + +describe('lsp-handlers', () => { + const baseParams = { + character: 5, + filePath: '/test/query.ql', + line: 0, + }; + + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('lspCompletion', () => { + it('should return completion items', async () => { + mockGetCompletions.mockResolvedValueOnce([ + { label: 'exists', kind: 1 }, + { label: 'forall', kind: 1 }, + ]); + + const result = await lspCompletion(baseParams); + + expect(result).toHaveLength(2); + expect(result[0].label).toBe('exists'); + expect(mockOpenDocument).toHaveBeenCalled(); + expect(mockCloseDocument).toHaveBeenCalled(); + }); + + it('should return empty array when no completions', async () => { + mockGetCompletions.mockResolvedValueOnce([]); + + const result = await lspCompletion(baseParams); + expect(result).toEqual([]); + }); + + it('should close document even if getCompletions throws', async () => { + mockGetCompletions.mockRejectedValueOnce(new Error('completion error')); + + await expect(lspCompletion(baseParams)).rejects.toThrow('completion error'); + expect(mockCloseDocument).toHaveBeenCalled(); + }); + + it('should pass workspace_uri through to initialize', async () => { + mockGetCompletions.mockResolvedValueOnce([]); + + await lspCompletion({ + ...baseParams, + workspaceUri: 'file:///custom/workspace', + }); + + expect(mockInitialize).toHaveBeenCalledWith('file:///custom/workspace'); + }); + + it('should pass search_path through to server config', async () => { + mockGetCompletions.mockResolvedValueOnce([]); + + await lspCompletion({ + ...baseParams, + searchPath: '/custom/ql/path', + }); + + // Verify that the handler reached getCompletions + expect(mockGetCompletions).toHaveBeenCalled(); + }); + }); + + describe('lspDefinition', () => { + it('should return definition locations', async () => { + const mockLocation = { + range: { end: { character: 10, line: 5 }, start: { character: 0, line: 5 } }, + uri: 'file:///test/def.ql', + }; + mockGetDefinition.mockResolvedValueOnce([mockLocation]); + + const result = await lspDefinition(baseParams); + + expect(result).toHaveLength(1); + expect(result[0].uri).toBe('file:///test/def.ql'); + }); + + it('should return empty array when no definitions found', async () => { + mockGetDefinition.mockResolvedValueOnce([]); + + const result = await lspDefinition(baseParams); + expect(result).toEqual([]); + }); + + it('should return multiple definitions when available', async () => { + const mockLocations = [ + { range: { end: { character: 10, line: 5 }, start: { character: 0, line: 5 } }, uri: 'file:///def1.ql' }, + { range: { end: { character: 8, line: 12 }, start: { character: 0, line: 12 } }, uri: 'file:///def2.qll' }, + ]; + mockGetDefinition.mockResolvedValueOnce(mockLocations); + + const result = await lspDefinition(baseParams); + expect(result).toHaveLength(2); + expect(result[0].uri).toBe('file:///def1.ql'); + expect(result[1].uri).toBe('file:///def2.qll'); + }); + + it('should close document even if getDefinition throws', async () => { + mockGetDefinition.mockRejectedValueOnce(new Error('definition error')); + + await expect(lspDefinition(baseParams)).rejects.toThrow('definition error'); + expect(mockCloseDocument).toHaveBeenCalled(); + }); + }); + + describe('lspReferences', () => { + it('should return reference locations', async () => { + const mockLocations = [ + { range: { end: { character: 5, line: 1 }, start: { character: 0, line: 1 } }, uri: 'file:///a.ql' }, + { range: { end: { character: 5, line: 3 }, start: { character: 0, line: 3 } }, uri: 'file:///b.ql' }, + ]; + mockGetReferences.mockResolvedValueOnce(mockLocations); + + const result = await lspReferences(baseParams); + + expect(result).toHaveLength(2); + expect(mockGetReferences).toHaveBeenCalledWith( + expect.objectContaining({ + context: { includeDeclaration: true }, + }), + ); + }); + + it('should return empty array when no references found', async () => { + mockGetReferences.mockResolvedValueOnce([]); + + const result = await lspReferences(baseParams); + expect(result).toEqual([]); + }); + + it('should always include declaration in references', async () => { + mockGetReferences.mockResolvedValueOnce([]); + + await lspReferences(baseParams); + + expect(mockGetReferences).toHaveBeenCalledWith( + expect.objectContaining({ + context: { includeDeclaration: true }, + }), + ); + }); + + it('should close document even if getReferences throws', async () => { + mockGetReferences.mockRejectedValueOnce(new Error('references error')); + + await expect(lspReferences(baseParams)).rejects.toThrow('references error'); + expect(mockCloseDocument).toHaveBeenCalled(); + }); + }); + + describe('file content', () => { + it('should use provided fileContent instead of reading from disk', async () => { + mockGetCompletions.mockResolvedValueOnce([]); + + await lspCompletion({ + ...baseParams, + fileContent: 'select 42', + }); + + expect(mockOpenDocument).toHaveBeenCalledWith( + expect.any(String), + 'select 42', + ); + }); + + it('should read from disk when fileContent not provided', async () => { + mockGetCompletions.mockResolvedValueOnce([]); + + await lspCompletion(baseParams); + + // readFileSync is mocked to return 'import ql\nselect 1' + expect(mockOpenDocument).toHaveBeenCalledWith( + expect.any(String), + 'import ql\nselect 1', + ); + }); + }); + + describe('document URI handling', () => { + it('should convert absolute file paths to file:// URIs', async () => { + mockGetCompletions.mockResolvedValueOnce([]); + + await lspCompletion({ + ...baseParams, + filePath: '/absolute/path/query.ql', + }); + + const uri = mockOpenDocument.mock.calls[0][0]; + expect(uri).toMatch(/^file:\/\//); + expect(uri).toContain('query.ql'); + }); + + it('should pass correct position params', async () => { + mockGetDefinition.mockResolvedValueOnce([]); + + await lspDefinition({ + character: 42, + filePath: '/test/file.ql', + line: 10, + }); + + expect(mockGetDefinition).toHaveBeenCalledWith( + expect.objectContaining({ + position: { character: 42, line: 10 }, + }), + ); + }); + }); +}); diff --git a/server/test/src/tools/lsp/lsp-tools.test.ts b/server/test/src/tools/lsp/lsp-tools.test.ts new file mode 100644 index 00000000..75d32369 --- /dev/null +++ b/server/test/src/tools/lsp/lsp-tools.test.ts @@ -0,0 +1,152 @@ +/** + * Tests for LSP tool registration (lsp-tools.ts). + * + * Verifies that registerLSPTools registers all 5 LSP tools with correct + * names, descriptions, schemas, and handler functions. + */ + +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; + +// Mock logger +vi.mock('../../../../src/utils/logger', () => ({ + logger: { + debug: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, +})); + +// Mock lsp-diagnostics registration +vi.mock('../../../../src/tools/lsp/lsp-diagnostics', () => ({ + registerLspDiagnosticsTool: vi.fn(), +})); + +// Mock lsp-handlers +vi.mock('../../../../src/tools/lsp/lsp-handlers', () => ({ + lspCompletion: vi.fn().mockResolvedValue([]), + lspDefinition: vi.fn().mockResolvedValue([]), + lspReferences: vi.fn().mockResolvedValue([]), +})); + +import { registerLSPTools } from '../../../../src/tools/lsp/lsp-tools'; +import { registerLspDiagnosticsTool } from '../../../../src/tools/lsp/lsp-diagnostics'; + +describe('registerLSPTools', () => { + let mockServer: McpServer; + + beforeEach(() => { + vi.clearAllMocks(); + mockServer = { tool: vi.fn() } as unknown as McpServer; + }); + + it('should register codeql_lsp_diagnostics via registerLspDiagnosticsTool', () => { + registerLSPTools(mockServer); + expect(registerLspDiagnosticsTool).toHaveBeenCalledWith(mockServer); + }); + + it('should register 3 file-based LSP tools directly', () => { + registerLSPTools(mockServer); + // 3 tools registered directly via server.tool (diagnostics is registered via delegate) + expect(mockServer.tool).toHaveBeenCalledTimes(3); + }); + + it('should register codeql_lsp_completion', () => { + registerLSPTools(mockServer); + const calls = (mockServer.tool as ReturnType).mock.calls; + const completionCall = calls.find((c: unknown[]) => c[0] === 'codeql_lsp_completion'); + expect(completionCall).toBeDefined(); + expect(completionCall![1]).toContain('completions'); + expect(completionCall![2]).toHaveProperty('file_path'); + expect(completionCall![2]).toHaveProperty('line'); + expect(completionCall![2]).toHaveProperty('character'); + expect(typeof completionCall![3]).toBe('function'); + }); + + it('should register codeql_lsp_definition', () => { + registerLSPTools(mockServer); + const calls = (mockServer.tool as ReturnType).mock.calls; + const defCall = calls.find((c: unknown[]) => c[0] === 'codeql_lsp_definition'); + expect(defCall).toBeDefined(); + expect(defCall![1]).toContain('definition'); + expect(defCall![2]).toHaveProperty('file_path'); + expect(typeof defCall![3]).toBe('function'); + }); + + it('should register codeql_lsp_references', () => { + registerLSPTools(mockServer); + const calls = (mockServer.tool as ReturnType).mock.calls; + const refsCall = calls.find((c: unknown[]) => c[0] === 'codeql_lsp_references'); + expect(refsCall).toBeDefined(); + expect(refsCall![1]).toContain('references'); + expect(refsCall![2]).toHaveProperty('file_path'); + expect(typeof refsCall![3]).toBe('function'); + }); + + it('should include optional parameters in all file-based schemas', () => { + registerLSPTools(mockServer); + const calls = (mockServer.tool as ReturnType).mock.calls; + + for (const call of calls) { + const schema = call[2]; + expect(schema).toHaveProperty('file_content'); + expect(schema).toHaveProperty('search_path'); + expect(schema).toHaveProperty('workspace_uri'); + } + }); + + describe('tool handlers', () => { + it('codeql_lsp_completion handler should return JSON with completionCount', async () => { + registerLSPTools(mockServer); + const calls = (mockServer.tool as ReturnType).mock.calls; + const handler = calls.find((c: unknown[]) => c[0] === 'codeql_lsp_completion')![3]; + + const result = await handler({ file_path: '/test.ql', line: 0, character: 0 }); + + expect(result.content).toHaveLength(1); + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toHaveProperty('completionCount'); + expect(parsed).toHaveProperty('items'); + }); + + it('codeql_lsp_definition handler should return JSON with definitionCount', async () => { + registerLSPTools(mockServer); + const calls = (mockServer.tool as ReturnType).mock.calls; + const handler = calls.find((c: unknown[]) => c[0] === 'codeql_lsp_definition')![3]; + + const result = await handler({ file_path: '/test.ql', line: 0, character: 0 }); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toHaveProperty('definitionCount'); + expect(parsed).toHaveProperty('locations'); + }); + + it('codeql_lsp_references handler should return JSON with referenceCount', async () => { + registerLSPTools(mockServer); + const calls = (mockServer.tool as ReturnType).mock.calls; + const handler = calls.find((c: unknown[]) => c[0] === 'codeql_lsp_references')![3]; + + const result = await handler({ file_path: '/test.ql', line: 0, character: 0 }); + + const parsed = JSON.parse(result.content[0].text); + expect(parsed).toHaveProperty('referenceCount'); + expect(parsed).toHaveProperty('locations'); + }); + + it('handler should return isError on failure', async () => { + // Re-mock to throw + const { lspCompletion } = await import('../../../../src/tools/lsp/lsp-handlers'); + vi.mocked(lspCompletion).mockRejectedValueOnce(new Error('LSP failure')); + + registerLSPTools(mockServer); + const calls = (mockServer.tool as ReturnType).mock.calls; + const handler = calls.find((c: unknown[]) => c[0] === 'codeql_lsp_completion')![3]; + + const result = await handler({ file_path: '/test.ql', line: 0, character: 0 }); + + expect(result.isError).toBe(true); + expect(result.content[0].text).toContain('LSP failure'); + }); + }); +}); From 0202522975ab8afff5e6fe8ce377033d04b3372c Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sun, 8 Feb 2026 19:23:21 -0700 Subject: [PATCH 2/7] Fix server lifecycle bugs and replace hard-coded startup delays - Fix duplicate --tuple-counting flag when both debug and tupleCounting are set in buildQueryServerArgs - Fix non-awaited force-kill timers in query-server and language-server shutdown methods (process could outlive caller) - Remove redundant process.on SIGINT/SIGTERM handlers from lsp-diagnostics (already handled by shutdownServerManager) - Replace hard-coded setTimeout delays (1.5-2s) in server start() methods with waitForProcessReady utility that resolves on first stderr/stdout output or rejects on spawn failure - Add comprehensive tests for process-ready utility --- server/dist/codeql-development-mcp-server.js | 140 +++++++++++++---- .../dist/codeql-development-mcp-server.js.map | 8 +- server/src/lib/cli-server.ts | 5 +- server/src/lib/language-server.ts | 25 ++- server/src/lib/query-server.ts | 27 +++- server/src/lib/server-config.ts | 3 +- server/src/tools/lsp/lsp-diagnostics.ts | 11 +- server/src/utils/process-ready.ts | 112 ++++++++++++++ server/test/src/lib/cli-server.test.ts | 7 + server/test/src/lib/language-server.test.ts | 7 + server/test/src/lib/query-server.test.ts | 7 + server/test/src/lib/server-config.test.ts | 9 ++ server/test/src/lib/server-manager.test.ts | 7 + server/test/src/utils/process-ready.test.ts | 145 ++++++++++++++++++ 14 files changed, 453 insertions(+), 60 deletions(-) create mode 100644 server/src/utils/process-ready.ts create mode 100644 server/test/src/utils/process-ready.test.ts diff --git a/server/dist/codeql-development-mcp-server.js b/server/dist/codeql-development-mcp-server.js index bf38b654..de8bd224 100755 --- a/server/dist/codeql-development-mcp-server.js +++ b/server/dist/codeql-development-mcp-server.js @@ -5698,12 +5698,11 @@ function buildQueryServerArgs(config) { if (config.evaluatorLog) { args.push(`--evaluator-log=${config.evaluatorLog}`); } - if (config.tupleCounting) { + if (config.tupleCounting || config.debug) { args.push("--tuple-counting"); } if (config.debug) { args.push("--debug"); - args.push("--tuple-counting"); } return args; } @@ -5726,10 +5725,67 @@ init_logger(); init_package_paths(); import { spawn } from "child_process"; import { EventEmitter } from "events"; -import { setTimeout as setTimeout2, clearTimeout } from "timers"; +import { setTimeout as setTimeout3, clearTimeout as clearTimeout2 } from "timers"; import { pathToFileURL } from "url"; import { delimiter as delimiter2, join as join9 } from "path"; init_cli_executor(); + +// src/utils/process-ready.ts +init_logger(); +import { clearTimeout, setTimeout as setTimeout2 } from "timers"; +var DEFAULT_READY_TIMEOUT_MS = 3e4; +function waitForProcessReady(child, name, opts) { + const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS; + return new Promise((resolve12, reject) => { + let settled = false; + const cleanup = () => { + settled = true; + child.stderr?.removeListener("data", onStderr); + child.stdout?.removeListener("data", onStdout); + child.removeListener("error", onError); + child.removeListener("exit", onExit); + clearTimeout(timer); + }; + const onStderr = () => { + if (settled) return; + logger.debug(`${name}: ready (stderr output detected)`); + cleanup(); + resolve12(); + }; + const onStdout = () => { + if (settled) return; + logger.debug(`${name}: ready (stdout output detected)`); + cleanup(); + resolve12(); + }; + const onError = (error) => { + if (settled) return; + cleanup(); + reject(new Error(`${name} failed to start: ${error.message}`)); + }; + const onExit = (code) => { + if (settled) return; + cleanup(); + reject(new Error(`${name} exited before becoming ready (code: ${code})`)); + }; + const timer = setTimeout2(() => { + if (settled) return; + logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`); + cleanup(); + resolve12(); + }, timeoutMs); + child.stderr?.on("data", onStderr); + child.stdout?.on("data", onStdout); + child.on("error", onError); + child.on("exit", onExit); + if (child.killed || child.exitCode !== null) { + cleanup(); + reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`)); + } + }); +} + +// src/lib/language-server.ts var CodeQLLanguageServer = class extends EventEmitter { constructor(_options = {}) { super(); @@ -5793,7 +5849,7 @@ var CodeQLLanguageServer = class extends EventEmitter { this.isInitialized = false; this.emit("exit", code); }); - await new Promise((resolve12) => setTimeout2(resolve12, 2e3)); + await waitForProcessReady(this.server, "CodeQL Language Server"); } handleStdout(data) { this.messageBuffer += data.toString(); @@ -5865,7 +5921,7 @@ var CodeQLLanguageServer = class extends EventEmitter { return new Promise((resolve12, reject) => { this.pendingResponses.set(id, { resolve: resolve12, reject }); this.sendMessage(message); - setTimeout2(() => { + setTimeout3(() => { if (this.pendingResponses.has(id)) { this.pendingResponses.delete(id); reject(new Error(`LSP request timeout for method: ${method}`)); @@ -5958,7 +6014,7 @@ var CodeQLLanguageServer = class extends EventEmitter { const documentUri = uri || pathToFileURL(join9(getProjectTmpDir("lsp-eval"), "eval.ql")).href; return new Promise((resolve12, reject) => { let diagnosticsReceived = false; - const timeout = setTimeout2(() => { + const timeout = setTimeout3(() => { if (!diagnosticsReceived) { this.removeAllListeners("diagnostics"); reject(new Error("Timeout waiting for diagnostics")); @@ -5967,7 +6023,7 @@ var CodeQLLanguageServer = class extends EventEmitter { const diagnosticsHandler = (params) => { if (params.uri === documentUri) { diagnosticsReceived = true; - clearTimeout(timeout); + clearTimeout2(timeout); this.removeListener("diagnostics", diagnosticsHandler); this.sendNotification("textDocument/didClose", { textDocument: { uri: documentUri } @@ -6076,11 +6132,24 @@ var CodeQLLanguageServer = class extends EventEmitter { } catch (error) { logger.warn("Error during graceful shutdown:", error); } - setTimeout2(() => { + await new Promise((resolve12) => { + const timer = setTimeout3(() => { + if (this.server) { + this.server.kill("SIGTERM"); + } + resolve12(); + }, 1e3); if (this.server) { - this.server.kill("SIGTERM"); + this.server.once("exit", () => { + clearTimeout2(timer); + this.server = null; + resolve12(); + }); + } else { + clearTimeout2(timer); + resolve12(); } - }, 1e3); + }); this.isInitialized = false; } isRunning() { @@ -6092,7 +6161,7 @@ var CodeQLLanguageServer = class extends EventEmitter { import { spawn as spawn2 } from "child_process"; import { delimiter as delimiter3 } from "path"; import { EventEmitter as EventEmitter2 } from "events"; -import { clearTimeout as clearTimeout2, setTimeout as setTimeout3 } from "timers"; +import { clearTimeout as clearTimeout3, setTimeout as setTimeout4 } from "timers"; init_cli_executor(); init_logger(); var CodeQLQueryServer = class extends EventEmitter2 { @@ -6141,7 +6210,7 @@ var CodeQLQueryServer = class extends EventEmitter2 { this.process = null; this.emit("exit", code); }); - await new Promise((resolve12) => setTimeout3(resolve12, 2e3)); + await waitForProcessReady(this.process, "CodeQL Query Server"); logger.info("CodeQL Query Server started"); } /** @@ -6163,7 +6232,7 @@ var CodeQLQueryServer = class extends EventEmitter2 { return new Promise((resolve12, reject) => { this.pendingRequests.set(id, { reject, resolve: resolve12 }); this.sendRaw(message); - const timer = setTimeout3(() => { + const timer = setTimeout4(() => { if (this.pendingRequests.has(id)) { this.pendingRequests.delete(id); reject(new Error(`Query server request timeout for method: ${method}`)); @@ -6173,11 +6242,11 @@ var CodeQLQueryServer = class extends EventEmitter2 { const originalReject = reject; const wrapped = { reject: (err) => { - clearTimeout2(timer); + clearTimeout3(timer); originalReject(err); }, resolve: (val) => { - clearTimeout2(timer); + clearTimeout3(timer); originalResolve(val); } }; @@ -6197,12 +6266,25 @@ var CodeQLQueryServer = class extends EventEmitter2 { } catch (error) { logger.warn("Error during query server graceful shutdown:", error); } - setTimeout3(() => { + await new Promise((resolve12) => { + const timer = setTimeout4(() => { + if (this.process) { + this.process.kill("SIGTERM"); + this.process = null; + } + resolve12(); + }, 2e3); if (this.process) { - this.process.kill("SIGTERM"); - this.process = null; + this.process.once("exit", () => { + clearTimeout3(timer); + this.process = null; + resolve12(); + }); + } else { + clearTimeout3(timer); + resolve12(); } - }, 2e3); + }); } /** * Whether the query server process is running. @@ -6280,7 +6362,7 @@ ${body}`; import { spawn as spawn3 } from "child_process"; import { delimiter as delimiter4 } from "path"; import { EventEmitter as EventEmitter3 } from "events"; -import { clearTimeout as clearTimeout3, setTimeout as setTimeout4 } from "timers"; +import { clearTimeout as clearTimeout4, setTimeout as setTimeout5 } from "timers"; init_cli_executor(); init_logger(); var CodeQLCLIServer = class extends EventEmitter3 { @@ -6341,7 +6423,7 @@ var CodeQLCLIServer = class extends EventEmitter3 { this.process = null; this.emit("exit", code); }); - await new Promise((resolve12) => setTimeout4(resolve12, 1500)); + await waitForProcessReady(this.process, "CodeQL CLI Server"); logger.info("CodeQL CLI Server started"); } /** @@ -6379,7 +6461,7 @@ var CodeQLCLIServer = class extends EventEmitter3 { logger.warn("Error during CLI server shutdown request:", error); } await new Promise((resolve12) => { - const timer = setTimeout4(() => { + const timer = setTimeout5(() => { if (this.process) { this.process.kill("SIGTERM"); this.process = null; @@ -6388,12 +6470,12 @@ var CodeQLCLIServer = class extends EventEmitter3 { }, 2e3); if (this.process) { this.process.once("exit", () => { - clearTimeout3(timer); + clearTimeout4(timer); this.process = null; resolve12(); }); } else { - clearTimeout3(timer); + clearTimeout4(timer); resolve12(); } }); @@ -6760,10 +6842,6 @@ async function lspDiagnostics({ throw new Error(`QL evaluation failed: ${error instanceof Error ? error.message : "Unknown error"}`); } } -async function shutdownDiagnosticsServer() { - const manager = getServerManager(); - await manager.shutdownServer("language"); -} function registerLspDiagnosticsTool(server) { server.tool( "codeql_lsp_diagnostics", @@ -6825,12 +6903,6 @@ function registerLspDiagnosticsTool(server) { } } ); - process.on("SIGINT", async () => { - await shutdownDiagnosticsServer(); - }); - process.on("SIGTERM", async () => { - await shutdownDiagnosticsServer(); - }); } // src/tools/lsp/lsp-handlers.ts diff --git a/server/dist/codeql-development-mcp-server.js.map b/server/dist/codeql-development-mcp-server.js.map index 386153ed..5466c1d2 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/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/tools/lsp/lsp-diagnostics.ts", "../src/lib/server-manager.ts", "../src/lib/server-config.ts", "../src/lib/language-server.ts", "../src/lib/query-server.ts", "../src/lib/cli-server.ts", "../src/tools/lsp/lsp-handlers.ts", "../src/tools/lsp/lsp-tools.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 = '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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager\n initServerManager();\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 via the server manager.\n *\n * - Respects `searchPath` and `workspaceUri` on every call\n * - Restarts the server when configuration changes\n * - Uses session-isolated cache directories\n */\nasync function getLanguageServer(\n options: LanguageServerOptions = {},\n workspaceUri?: string,\n): Promise {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const languageServer = await manager.getLanguageServer(config);\n\n const effectiveUri = workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await languageServer.initialize(effectiveUri);\n\n return languageServer;\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getLanguageServer(serverOptions, workspaceUri);\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Register cleanup on server shutdown\n process.on('SIGINT', async () => {\n await shutdownDiagnosticsServer();\n });\n process.on('SIGTERM', async () => {\n await shutdownDiagnosticsServer();\n });\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\n}\n", "/**\n * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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 { getPackageVersion } from '../utils/package-paths';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait briefly for the server to become ready\n await new Promise((resolve) => setTimeout(resolve, 2000));\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n this.sendRaw(message);\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n }, 2000);\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Brief startup delay for JVM init\n await new Promise((resolve) => setTimeout(resolve, 1500));\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n this.stdoutBuffer = '';\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n const str = data.toString();\n\n // Look for NUL byte delimiter\n const nulIndex = str.indexOf('\\0');\n if (nulIndex === -1) {\n // No delimiter yet, accumulate\n this.stdoutBuffer += str;\n return;\n }\n\n // Found delimiter \u2014 command is complete\n this.stdoutBuffer += str.substring(0, nulIndex);\n const result = this.stdoutBuffer;\n this.stdoutBuffer = '';\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n // Handle any remaining data after the NUL byte\n const remainder = str.substring(nulIndex + 1);\n if (remainder.length > 0) {\n this.stdoutBuffer = remainder;\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { readFileSync } from 'fs';\nimport { pathToFileURL } from 'url';\nimport { isAbsolute, resolve } from 'path';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /** Absolute path to the QL file. */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: params.searchPath ?? resolve(pkgRoot, 'ql'),\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n const effectiveUri = params.workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await server.initialize(effectiveUri);\n\n return server;\n}\n\n/**\n * Build TextDocumentPositionParams and ensure the document is open.\n */\nfunction prepareDocumentPosition(\n server: Awaited>,\n params: LSPToolParams,\n): { docUri: string; positionParams: TextDocumentPositionParams } {\n // Resolve relative paths against CWD (supports integration test fixtures)\n const absPath = isAbsolute(params.filePath) ? params.filePath : resolve(process.cwd(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = readFileSync(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n const positionParams: TextDocumentPositionParams = {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n\n return { docUri, positionParams };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Absolute path to the CodeQL (.ql/.qll) file'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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", "isAbsolute", "resolve", "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", "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", "z", "mkdirSync", "join", "type", "setTimeout", "delimiter", "join", "delimiter", "resolve", "setTimeout", "join", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "str", "join", "mkdirSync", "type", "join", "resolve", "pathToFileURL", "z", "readFileSync", "pathToFileURL", "isAbsolute", "resolve", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] + "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/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/tools/lsp/lsp-diagnostics.ts", "../src/lib/server-manager.ts", "../src/lib/server-config.ts", "../src/lib/language-server.ts", "../src/utils/process-ready.ts", "../src/lib/query-server.ts", "../src/lib/cli-server.ts", "../src/tools/lsp/lsp-handlers.ts", "../src/tools/lsp/lsp-tools.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 = '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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager\n initServerManager();\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 via the server manager.\n *\n * - Respects `searchPath` and `workspaceUri` on every call\n * - Restarts the server when configuration changes\n * - Uses session-isolated cache directories\n */\nasync function getLanguageServer(\n options: LanguageServerOptions = {},\n workspaceUri?: string,\n): Promise {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const languageServer = await manager.getLanguageServer(config);\n\n const effectiveUri = workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await languageServer.initialize(effectiveUri);\n\n return languageServer;\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getLanguageServer(serverOptions, workspaceUri);\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\n}\n", "/**\n * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.tupleCounting || config.debug) {\n args.push('--tuple-counting');\n }\n if (config.debug) {\n args.push('--debug');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\n}\n", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n this.sendRaw(message);\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n this.stdoutBuffer = '';\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n const str = data.toString();\n\n // Look for NUL byte delimiter\n const nulIndex = str.indexOf('\\0');\n if (nulIndex === -1) {\n // No delimiter yet, accumulate\n this.stdoutBuffer += str;\n return;\n }\n\n // Found delimiter \u2014 command is complete\n this.stdoutBuffer += str.substring(0, nulIndex);\n const result = this.stdoutBuffer;\n this.stdoutBuffer = '';\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n // Handle any remaining data after the NUL byte\n const remainder = str.substring(nulIndex + 1);\n if (remainder.length > 0) {\n this.stdoutBuffer = remainder;\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { readFileSync } from 'fs';\nimport { pathToFileURL } from 'url';\nimport { isAbsolute, resolve } from 'path';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /** Absolute path to the QL file. */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: params.searchPath ?? resolve(pkgRoot, 'ql'),\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n const effectiveUri = params.workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await server.initialize(effectiveUri);\n\n return server;\n}\n\n/**\n * Build TextDocumentPositionParams and ensure the document is open.\n */\nfunction prepareDocumentPosition(\n server: Awaited>,\n params: LSPToolParams,\n): { docUri: string; positionParams: TextDocumentPositionParams } {\n // Resolve relative paths against CWD (supports integration test fixtures)\n const absPath = isAbsolute(params.filePath) ? params.filePath : resolve(process.cwd(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = readFileSync(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n const positionParams: TextDocumentPositionParams = {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n\n return { docUri, positionParams };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Absolute path to the CodeQL (.ql/.qll) file'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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", "isAbsolute", "resolve", "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", "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", "z", "mkdirSync", "join", "type", "setTimeout", "clearTimeout", "delimiter", "join", "setTimeout", "resolve", "delimiter", "resolve", "setTimeout", "join", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "str", "join", "mkdirSync", "type", "join", "resolve", "pathToFileURL", "z", "readFileSync", "pathToFileURL", "isAbsolute", "resolve", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] } diff --git a/server/src/lib/cli-server.ts b/server/src/lib/cli-server.ts index 4ef1f9dc..385fa19a 100644 --- a/server/src/lib/cli-server.ts +++ b/server/src/lib/cli-server.ts @@ -15,6 +15,7 @@ import { clearTimeout, setTimeout } from 'timers'; import { buildCLIServerArgs, CLIServerConfig } from './server-config'; import { getResolvedCodeQLDir } from './cli-executor'; import { logger } from '../utils/logger'; +import { waitForProcessReady } from '../utils/process-ready'; /** * A queued command waiting to be sent to the CLI server. @@ -102,8 +103,8 @@ export class CodeQLCLIServer extends EventEmitter { this.emit('exit', code); }); - // Brief startup delay for JVM init - await new Promise((resolve) => setTimeout(resolve, 1500)); + // Wait for the JVM to initialise (resolves on first stderr/stdout output) + await waitForProcessReady(this.process, 'CodeQL CLI Server'); logger.info('CodeQL CLI Server started'); } diff --git a/server/src/lib/language-server.ts b/server/src/lib/language-server.ts index 0b38c2ad..8b6c9bef 100644 --- a/server/src/lib/language-server.ts +++ b/server/src/lib/language-server.ts @@ -12,6 +12,7 @@ import { logger } from '../utils/logger'; import { getPackageVersion } from '../utils/package-paths'; import { getProjectTmpDir } from '../utils/temp-dir'; import { getResolvedCodeQLDir } from './cli-executor'; +import { waitForProcessReady } from '../utils/process-ready'; export interface LSPMessage { jsonrpc: '2.0'; @@ -177,8 +178,8 @@ export class CodeQLLanguageServer extends EventEmitter { this.emit('exit', code); }); - // Wait for server to be ready - await new Promise((resolve) => setTimeout(resolve, 2000)); + // Wait for the JVM to initialise (resolves on first stderr/stdout output) + await waitForProcessReady(this.server, 'CodeQL Language Server'); } private handleStdout(data: Buffer): void { @@ -520,11 +521,25 @@ export class CodeQLLanguageServer extends EventEmitter { } // Force kill if needed - setTimeout(() => { + await new Promise((resolve) => { + const timer = setTimeout(() => { + if (this.server) { + this.server.kill('SIGTERM'); + } + resolve(); + }, 1000); + if (this.server) { - this.server.kill('SIGTERM'); + this.server.once('exit', () => { + clearTimeout(timer); + this.server = null; + resolve(); + }); + } else { + clearTimeout(timer); + resolve(); } - }, 1000); + }); this.isInitialized = false; } diff --git a/server/src/lib/query-server.ts b/server/src/lib/query-server.ts index c50fbb53..3f4a5587 100644 --- a/server/src/lib/query-server.ts +++ b/server/src/lib/query-server.ts @@ -16,6 +16,7 @@ import { clearTimeout, setTimeout } from 'timers'; import { buildQueryServerArgs, QueryServerConfig } from './server-config'; import { getResolvedCodeQLDir } from './cli-executor'; import { logger } from '../utils/logger'; +import { waitForProcessReady } from '../utils/process-ready'; /** * A pending request awaiting a response from the query server. @@ -89,8 +90,8 @@ export class CodeQLQueryServer extends EventEmitter { this.emit('exit', code); }); - // Wait briefly for the server to become ready - await new Promise((resolve) => setTimeout(resolve, 2000)); + // Wait for the JVM to initialise (resolves on first stderr/stdout output) + await waitForProcessReady(this.process, 'CodeQL Query Server'); logger.info('CodeQL Query Server started'); } @@ -150,12 +151,26 @@ export class CodeQLQueryServer extends EventEmitter { } // Force kill if process lingers - setTimeout(() => { + await new Promise((resolve) => { + const timer = setTimeout(() => { + if (this.process) { + this.process.kill('SIGTERM'); + this.process = null; + } + resolve(); + }, 2000); + if (this.process) { - this.process.kill('SIGTERM'); - this.process = null; + this.process.once('exit', () => { + clearTimeout(timer); + this.process = null; + resolve(); + }); + } else { + clearTimeout(timer); + resolve(); } - }, 2000); + }); } /** diff --git a/server/src/lib/server-config.ts b/server/src/lib/server-config.ts index d441d6fb..996b6016 100644 --- a/server/src/lib/server-config.ts +++ b/server/src/lib/server-config.ts @@ -158,12 +158,11 @@ export function buildQueryServerArgs(config: QueryServerConfig): string[] { if (config.evaluatorLog) { args.push(`--evaluator-log=${config.evaluatorLog}`); } - if (config.tupleCounting) { + if (config.tupleCounting || config.debug) { args.push('--tuple-counting'); } if (config.debug) { args.push('--debug'); - args.push('--tuple-counting'); } return args; diff --git a/server/src/tools/lsp/lsp-diagnostics.ts b/server/src/tools/lsp/lsp-diagnostics.ts index 0dcba1f5..a1503203 100644 --- a/server/src/tools/lsp/lsp-diagnostics.ts +++ b/server/src/tools/lsp/lsp-diagnostics.ts @@ -235,11 +235,8 @@ export function registerLspDiagnosticsTool(server: McpServer): void { } ); - // Register cleanup on server shutdown - process.on('SIGINT', async () => { - await shutdownDiagnosticsServer(); - }); - process.on('SIGTERM', async () => { - await shutdownDiagnosticsServer(); - }); + // NOTE: Cleanup is handled centrally by shutdownServerManager() in + // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering + // additional process.on('SIGINT'/'SIGTERM') handlers here would + // accumulate on repeated calls and is unnecessary. } diff --git a/server/src/utils/process-ready.ts b/server/src/utils/process-ready.ts new file mode 100644 index 00000000..4e31f6fe --- /dev/null +++ b/server/src/utils/process-ready.ts @@ -0,0 +1,112 @@ +/** + * Utility for waiting until a spawned child process is ready. + * + * CodeQL background servers (cli-server, query-server2, language-server) run + * on the JVM and emit stderr log output once the JVM has initialised. Rather + * than sleeping for a hard-coded duration — which is fragile on both fast and + * slow machines — this helper resolves as soon as the first stderr output + * arrives (indicating the JVM is alive), or when the maximum timeout expires. + * It also rejects immediately if the process exits or errors before becoming + * ready, giving callers a clear error instead of a silent hang. + */ + +import { ChildProcess } from 'child_process'; +import { clearTimeout, setTimeout } from 'timers'; +import { logger } from './logger'; + +/** Default maximum wait for a CodeQL server to become ready (30 s). */ +const DEFAULT_READY_TIMEOUT_MS = 30_000; + +/** + * Options for {@link waitForProcessReady}. + */ +export interface ProcessReadyOptions { + /** + * Maximum time in milliseconds to wait for the process to emit its first + * stderr output. If the timeout is reached without a signal the promise + * still resolves (best-effort) so the caller can attempt communication. + * + * Default: 30 000 ms. + */ + timeoutMs?: number; +} + +/** + * Wait until a child process signals readiness. + * + * "Ready" is defined as any of: + * 1. The process emits data on **stderr** (JVM startup log line). + * 2. The process emits data on **stdout** (initial protocol message). + * 3. The maximum timeout elapses (best-effort resolve). + * + * The promise **rejects** if the process emits an `error` event or exits + * before any of the above conditions are met. + * + * @param child - The spawned child process. + * @param name - A human-readable label for log messages. + * @param opts - Optional configuration. + */ +export function waitForProcessReady( + child: ChildProcess, + name: string, + opts?: ProcessReadyOptions, +): Promise { + const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS; + + return new Promise((resolve, reject) => { + let settled = false; + + const cleanup = () => { + settled = true; + child.stderr?.removeListener('data', onStderr); + child.stdout?.removeListener('data', onStdout); + child.removeListener('error', onError); + child.removeListener('exit', onExit); + clearTimeout(timer); + }; + + const onStderr = () => { + if (settled) return; + logger.debug(`${name}: ready (stderr output detected)`); + cleanup(); + resolve(); + }; + + const onStdout = () => { + if (settled) return; + logger.debug(`${name}: ready (stdout output detected)`); + cleanup(); + resolve(); + }; + + const onError = (error: Error) => { + if (settled) return; + cleanup(); + reject(new Error(`${name} failed to start: ${error.message}`)); + }; + + const onExit = (code: number | null) => { + if (settled) return; + cleanup(); + reject(new Error(`${name} exited before becoming ready (code: ${code})`)); + }; + + const timer = setTimeout(() => { + if (settled) return; + logger.warn(`${name}: readiness timeout (${timeoutMs} ms) — proceeding anyway`); + cleanup(); + resolve(); // best-effort: let the caller attempt communication + }, timeoutMs); + + child.stderr?.on('data', onStderr); + child.stdout?.on('data', onStdout); + child.on('error', onError); + child.on('exit', onExit); + + // If the process was dead before we even attached listeners, reject now + if (child.killed || child.exitCode !== null) { + cleanup(); + reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`)); + } + }); +} diff --git a/server/test/src/lib/cli-server.test.ts b/server/test/src/lib/cli-server.test.ts index 99406cff..40282c3f 100644 --- a/server/test/src/lib/cli-server.test.ts +++ b/server/test/src/lib/cli-server.test.ts @@ -7,9 +7,15 @@ import { EventEmitter } from 'events'; import { ChildProcess, spawn } from 'child_process'; import { CodeQLCLIServer } from '../../../src/lib/cli-server'; +// Mock waitForProcessReady so start() resolves immediately in tests +vi.mock('../../../src/utils/process-ready', () => ({ + waitForProcessReady: vi.fn().mockResolvedValue(undefined), +})); + // Shared mock process factory function createMockProcess() { const proc = new EventEmitter() as EventEmitter & { + exitCode: number | null; killed: boolean; kill: ReturnType; pid: number; @@ -21,6 +27,7 @@ function createMockProcess() { proc.stdout = new EventEmitter(); proc.stderr = new EventEmitter(); proc.killed = false; + proc.exitCode = null; proc.kill = vi.fn(() => { (proc as { killed: boolean }).killed = true; }); proc.pid = 88888; return proc; diff --git a/server/test/src/lib/language-server.test.ts b/server/test/src/lib/language-server.test.ts index f92409a5..73c7d357 100644 --- a/server/test/src/lib/language-server.test.ts +++ b/server/test/src/lib/language-server.test.ts @@ -10,9 +10,15 @@ import { EventEmitter } from 'events'; import { ChildProcess, spawn } from 'child_process'; import { CodeQLLanguageServer } from '../../../src/lib/language-server'; +// Mock waitForProcessReady so start() resolves immediately in tests +vi.mock('../../../src/utils/process-ready', () => ({ + waitForProcessReady: vi.fn().mockResolvedValue(undefined), +})); + // Shared mock process factory function createMockProcess() { const proc = new EventEmitter() as EventEmitter & { + exitCode: number | null; killed: boolean; kill: ReturnType; pid: number; @@ -24,6 +30,7 @@ function createMockProcess() { proc.stdout = new EventEmitter(); proc.stderr = new EventEmitter(); proc.killed = false; + proc.exitCode = null; proc.kill = vi.fn(() => { (proc as { killed: boolean }).killed = true; }); proc.pid = 77777; return proc; diff --git a/server/test/src/lib/query-server.test.ts b/server/test/src/lib/query-server.test.ts index 09589f7c..b8068295 100644 --- a/server/test/src/lib/query-server.test.ts +++ b/server/test/src/lib/query-server.test.ts @@ -7,9 +7,15 @@ import { EventEmitter } from 'events'; import { ChildProcess, spawn } from 'child_process'; import { CodeQLQueryServer } from '../../../src/lib/query-server'; +// Mock waitForProcessReady so start() resolves immediately in tests +vi.mock('../../../src/utils/process-ready', () => ({ + waitForProcessReady: vi.fn().mockResolvedValue(undefined), +})); + // Shared mock process factory function createMockProcess() { const proc = new EventEmitter() as EventEmitter & { + exitCode: number | null; killed: boolean; kill: ReturnType; pid: number; @@ -21,6 +27,7 @@ function createMockProcess() { proc.stdout = new EventEmitter(); proc.stderr = new EventEmitter(); proc.killed = false; + proc.exitCode = null; proc.kill = vi.fn(() => { (proc as { killed: boolean }).killed = true; }); proc.pid = 99999; return proc; diff --git a/server/test/src/lib/server-config.test.ts b/server/test/src/lib/server-config.test.ts index ec29bf52..15ad4527 100644 --- a/server/test/src/lib/server-config.test.ts +++ b/server/test/src/lib/server-config.test.ts @@ -112,6 +112,15 @@ describe('server-config', () => { expect(args).toContain('--tuple-counting'); }); + it('should not duplicate --tuple-counting when both debug and tupleCounting are set', () => { + const config: QueryServerConfig = { debug: true, tupleCounting: true }; + const args = buildQueryServerArgs(config); + + const tupleCountingOccurrences = args.filter(a => a === '--tuple-counting').length; + expect(tupleCountingOccurrences).toBe(1); + expect(args).toContain('--debug'); + }); + it('should handle zero threads', () => { const config: QueryServerConfig = { threads: 0 }; const args = buildQueryServerArgs(config); diff --git a/server/test/src/lib/server-manager.test.ts b/server/test/src/lib/server-manager.test.ts index 8cec9aef..22b31263 100644 --- a/server/test/src/lib/server-manager.test.ts +++ b/server/test/src/lib/server-manager.test.ts @@ -13,6 +13,11 @@ import { shutdownServerManager, } from '../../../src/lib/server-manager'; +// Mock waitForProcessReady so server start() resolves immediately in tests +vi.mock('../../../src/utils/process-ready', () => ({ + waitForProcessReady: vi.fn().mockResolvedValue(undefined), +})); + // Mock child_process.spawn to avoid starting real CodeQL processes vi.mock('child_process', async (importOriginal) => { const actual = await importOriginal() as Record; @@ -23,6 +28,7 @@ vi.mock('child_process', async (importOriginal) => { stdin: { write: ReturnType; end: ReturnType }; stdout: EventEmitter; stderr: EventEmitter; + exitCode: number | null; killed: boolean; kill: ReturnType; pid: number; @@ -30,6 +36,7 @@ vi.mock('child_process', async (importOriginal) => { proc.stdin = { write: vi.fn(), end: vi.fn() }; proc.stdout = new EventEmitter(); proc.stderr = new EventEmitter(); + proc.exitCode = null; proc.killed = false; proc.kill = vi.fn(() => { (proc as { killed: boolean }).killed = true; }); proc.pid = 12345; diff --git a/server/test/src/utils/process-ready.test.ts b/server/test/src/utils/process-ready.test.ts new file mode 100644 index 00000000..fa8597b4 --- /dev/null +++ b/server/test/src/utils/process-ready.test.ts @@ -0,0 +1,145 @@ +/** + * Tests for the waitForProcessReady utility. + */ + +import { describe, expect, it, vi, beforeEach } from 'vitest'; +import { EventEmitter } from 'events'; +import { ChildProcess } from 'child_process'; +import { waitForProcessReady } from '../../../src/utils/process-ready'; + +/** + * Create a fake ChildProcess-like object with controllable streams. + */ +function createFakeProcess(options?: { exitCode?: number | null; killed?: boolean }) { + const proc = new EventEmitter() as EventEmitter & { + exitCode: number | null; + killed: boolean; + pid: number; + stderr: EventEmitter; + stdout: EventEmitter; + }; + proc.stdout = new EventEmitter(); + proc.stderr = new EventEmitter(); + proc.killed = options?.killed ?? false; + proc.exitCode = options?.exitCode ?? null; + proc.pid = 42; + return proc; +} + +describe('waitForProcessReady', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('should resolve when stderr emits data', async () => { + const proc = createFakeProcess(); + const promise = waitForProcessReady(proc as unknown as ChildProcess, 'TestServer'); + + proc.stderr.emit('data', Buffer.from('JVM starting...')); + + await expect(promise).resolves.toBeUndefined(); + }); + + it('should resolve when stdout emits data', async () => { + const proc = createFakeProcess(); + const promise = waitForProcessReady(proc as unknown as ChildProcess, 'TestServer'); + + proc.stdout.emit('data', Buffer.from('Content-Length: 42\r\n\r\n')); + + await expect(promise).resolves.toBeUndefined(); + }); + + it('should reject when process emits error before readiness', async () => { + const proc = createFakeProcess(); + const promise = waitForProcessReady(proc as unknown as ChildProcess, 'TestServer'); + + proc.emit('error', new Error('spawn ENOENT')); + + await expect(promise).rejects.toThrow('TestServer failed to start: spawn ENOENT'); + }); + + it('should reject when process exits before readiness', async () => { + const proc = createFakeProcess(); + const promise = waitForProcessReady(proc as unknown as ChildProcess, 'TestServer'); + + proc.emit('exit', 1); + + await expect(promise).rejects.toThrow('TestServer exited before becoming ready (code: 1)'); + }); + + it('should reject immediately if process is already killed', async () => { + const proc = createFakeProcess({ killed: true, exitCode: 137 }); + + await expect( + waitForProcessReady(proc as unknown as ChildProcess, 'DeadServer'), + ).rejects.toThrow('DeadServer is not running'); + }); + + it('should reject immediately if process has already exited', async () => { + const proc = createFakeProcess({ exitCode: 0 }); + + await expect( + waitForProcessReady(proc as unknown as ChildProcess, 'ExitedServer'), + ).rejects.toThrow('ExitedServer is not running'); + }); + + it('should resolve on timeout (best-effort) when no output arrives', async () => { + vi.useFakeTimers(); + + const proc = createFakeProcess(); + const promise = waitForProcessReady(proc as unknown as ChildProcess, 'SlowServer', { + timeoutMs: 100, + }); + + await vi.advanceTimersByTimeAsync(100); + + await expect(promise).resolves.toBeUndefined(); + + vi.useRealTimers(); + }); + + it('should clean up listeners after resolving via stderr', async () => { + const proc = createFakeProcess(); + const promise = waitForProcessReady(proc as unknown as ChildProcess, 'CleanupTest'); + + const stderrListenersBefore = proc.stderr.listenerCount('data'); + expect(stderrListenersBefore).toBeGreaterThan(0); + + proc.stderr.emit('data', Buffer.from('ready')); + await promise; + + // The utility should have removed its listeners + expect(proc.stderr.listenerCount('data')).toBe(stderrListenersBefore - 1); + expect(proc.stdout.listenerCount('data')).toBe(0); + expect(proc.listenerCount('error')).toBe(0); + expect(proc.listenerCount('exit')).toBe(0); + }); + + it('should not settle twice if stderr fires after timeout', async () => { + vi.useFakeTimers(); + + const proc = createFakeProcess(); + const promise = waitForProcessReady(proc as unknown as ChildProcess, 'DoubleSettle', { + timeoutMs: 50, + }); + + await vi.advanceTimersByTimeAsync(50); + await promise; + + // This should be harmless (no uncaught rejections) + proc.stderr.emit('data', Buffer.from('late output')); + + vi.useRealTimers(); + }); + + it('should use default timeout when none specified', async () => { + const proc = createFakeProcess(); + // Just verify it doesn't throw with undefined opts + const promise = waitForProcessReady(proc as unknown as ChildProcess, 'DefaultTimeout'); + + // Immediately resolve via stderr to avoid waiting 30s + proc.stderr.emit('data', Buffer.from('ready')); + + await expect(promise).resolves.toBeUndefined(); + }); +}); From b20db0ba00db5c010644e6968b2c1d5fe576a785 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sun, 8 Feb 2026 20:25:17 -0700 Subject: [PATCH 3/7] Fix CI failures and improve LSP tool reliability - Add LSP tools to longRunningTools (300s timeout) in integration test runner to prevent CI timeouts during JVM startup - Convert relative workspace_uri to file:// URIs in lsp-handlers - Replace synchronous readFileSync with async readFile - Add isRunning() guards to LSP feature methods - Guard exit notification in shutdown to prevent "not running" error - Fix semantic_validation test to use resolvable QL code - Centralize logger mock in test/setup.ts (removes 16 per-file mocks) - Add server-manager getLanguageServer/getQueryServer/getCLIServer tests - Clarify --debug/--tuple-counting arg ordering in server-config - Add missing README.md files to integration test directories --- .../basic_completion/README.md | 17 ++++++ .../basic_definition/README.md | 17 ++++++ .../semantic_validation/README.md | 17 ++++++ .../before/monitoring-state.json | 5 +- .../syntax_validation/README.md | 15 +++++ .../basic_references/README.md | 17 ++++++ client/src/lib/integration-test-runner.js | 10 +++- server/dist/codeql-development-mcp-server.js | 59 ++++++++++++------ .../dist/codeql-development-mcp-server.js.map | 6 +- server/package.json | 2 +- server/src/lib/language-server.ts | 13 +++- server/src/lib/server-config.ts | 6 +- server/src/tools/lsp/lsp-handlers.ts | 44 ++++++++++---- server/test/setup.ts | 21 +++++++ server/test/src/lib/cli-executor.test.ts | 11 +--- server/test/src/lib/language-server.test.ts | 56 +++++++++++++++++ server/test/src/lib/metadata-resolver.test.ts | 10 ---- .../src/lib/query-results-evaluator.test.ts | 10 ---- server/test/src/lib/server-config.test.ts | 2 + server/test/src/lib/server-manager.test.ts | 60 +++++++++++++++++++ .../tools/codeql/profile-codeql-query.test.ts | 10 ---- .../src/tools/codeql/quick-evaluate.test.ts | 10 ---- .../tools/codeql/register-database.test.ts | 10 ---- .../src/tools/lsp/lsp-diagnostics.test.ts | 10 ---- .../test/src/tools/lsp/lsp-handlers.test.ts | 31 +++++++++- server/test/src/tools/lsp/lsp-tools.test.ts | 12 +--- .../test/src/tools/monitoring-tools.test.ts | 10 ---- server/test/src/utils/logger.test.ts | 4 ++ server/test/src/utils/process-ready.test.ts | 1 + server/vitest.config.ts | 1 + 30 files changed, 361 insertions(+), 136 deletions(-) create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/README.md create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/README.md create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/README.md create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/README.md create mode 100644 client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/README.md create mode 100644 server/test/setup.ts diff --git a/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/README.md b/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/README.md new file mode 100644 index 00000000..870f5455 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/README.md @@ -0,0 +1,17 @@ +# `codeql_lsp_completion/basic_completion` + +## PURPOSE + +Tests that `codeql_lsp_completion` returns completion items when the cursor is +positioned on a type name in a `from` clause of a CodeQL query. + +## INPUTS + +- **file_path**: `server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql` +- **line**: 12 (on the type name in the `from` clause) +- **character**: 7 (cursor on the type name) + +## EXPECTED OUTPUTS + +- A list of completion items (may be empty if no workspace URI is set). +- Monitoring state updated to record a successful `codeql_lsp_completion` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/README.md b/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/README.md new file mode 100644 index 00000000..17f9fe8a --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/README.md @@ -0,0 +1,17 @@ +# `codeql_lsp_definition/basic_definition` + +## PURPOSE + +Tests that `codeql_lsp_definition` returns definition locations when the cursor +is on a variable name in a `where` clause of a CodeQL query. + +## INPUTS + +- **file_path**: `server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql` +- **line**: 13 (on a variable reference in the `where` clause) +- **character**: 6 (cursor on the variable name) + +## EXPECTED OUTPUTS + +- One or more definition locations, or an empty list if the symbol is not resolvable. +- Monitoring state updated to record a successful `codeql_lsp_definition` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/README.md b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/README.md new file mode 100644 index 00000000..e424a7b3 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/README.md @@ -0,0 +1,17 @@ +# `codeql_lsp_diagnostics/semantic_validation` + +## PURPOSE + +Tests that `codeql_lsp_diagnostics` detects semantic errors in QL code that +references undefined types (e.g., `UndefinedType`). + +## INPUTS + +- **ql_code**: A QL query fragment referencing `UndefinedType` which does not + exist, triggering a semantic "could not resolve type" diagnostic. + +## EXPECTED OUTPUTS + +- `isValid` is `false` with semantic diagnostics about unresolvable types. +- The `semantic_query.ql` file remains unchanged (identical in before/ and after/). +- Monitoring state updated to record a successful `codeql_lsp_diagnostics` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/before/monitoring-state.json index 8f527366..02fcec85 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/before/monitoring-state.json +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/before/monitoring-state.json @@ -1,3 +1,6 @@ { - "sessions": [] + "sessions": [], + "parameters": { + "ql_code": "from UndefinedType x\nwhere x = \"test\"\nselect x, \"semantic error: undefined type\"" + } } \ No newline at end of file diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/README.md b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/README.md new file mode 100644 index 00000000..45f330ed --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/README.md @@ -0,0 +1,15 @@ +# `codeql_lsp_diagnostics/syntax_validation` + +## PURPOSE + +Tests that `codeql_lsp_diagnostics` detects syntax errors in invalid QL code. + +## INPUTS + +- **ql_code**: Invalid QL snippet with syntax errors (`invalid_type x\nwhere x = "test"\nselect x, "This has syntax errors"`). + +## EXPECTED OUTPUTS + +- `isValid` is `false` with one or more error diagnostics. +- The `test_query.ql` file remains unchanged (identical in before/ and after/). +- Monitoring state updated to record a successful `codeql_lsp_diagnostics` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/README.md b/client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/README.md new file mode 100644 index 00000000..8c021adb --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_lsp_references/basic_references/README.md @@ -0,0 +1,17 @@ +# `codeql_lsp_references/basic_references` + +## PURPOSE + +Tests that `codeql_lsp_references` returns reference locations when the cursor +is on a variable name used in a `where` clause of a CodeQL query. + +## INPUTS + +- **file_path**: `server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql` +- **line**: 13 (on a variable reference in the `where` clause) +- **character**: 6 (cursor on the variable name) + +## EXPECTED OUTPUTS + +- One or more reference locations, including the declaration. +- Monitoring state updated to record a successful `codeql_lsp_references` call. diff --git a/client/src/lib/integration-test-runner.js b/client/src/lib/integration-test-runner.js index 5ed86e57..40dd029e 100644 --- a/client/src/lib/integration-test-runner.js +++ b/client/src/lib/integration-test-runner.js @@ -737,10 +737,14 @@ export class IntegrationTestRunner { // Call the tool with appropriate parameters // Set extended timeout for long-running operations const longRunningTools = [ - "codeql_query_run", - "codeql_test_run", "codeql_database_analyze", - "codeql_database_create" + "codeql_database_create", + "codeql_lsp_completion", + "codeql_lsp_definition", + "codeql_lsp_diagnostics", + "codeql_lsp_references", + "codeql_query_run", + "codeql_test_run" ]; const requestOptions = longRunningTools.includes(toolName) diff --git a/server/dist/codeql-development-mcp-server.js b/server/dist/codeql-development-mcp-server.js index de8bd224..9fd37586 100755 --- a/server/dist/codeql-development-mcp-server.js +++ b/server/dist/codeql-development-mcp-server.js @@ -5698,11 +5698,11 @@ function buildQueryServerArgs(config) { if (config.evaluatorLog) { args.push(`--evaluator-log=${config.evaluatorLog}`); } - if (config.tupleCounting || config.debug) { - args.push("--tuple-counting"); - } if (config.debug) { args.push("--debug"); + args.push("--tuple-counting"); + } else if (config.tupleCounting) { + args.push("--tuple-counting"); } return args; } @@ -6050,6 +6050,9 @@ var CodeQLLanguageServer = class extends EventEmitter { if (!this.isInitialized) { throw new Error("Language server is not initialized"); } + if (!this.isRunning()) { + throw new Error("Language server process is not running"); + } const result = await this.sendRequest("textDocument/completion", params); if (result && typeof result === "object" && "items" in result) { return result.items; @@ -6063,6 +6066,9 @@ var CodeQLLanguageServer = class extends EventEmitter { if (!this.isInitialized) { throw new Error("Language server is not initialized"); } + if (!this.isRunning()) { + throw new Error("Language server process is not running"); + } const result = await this.sendRequest("textDocument/definition", params); return this.normalizeLocations(result); } @@ -6073,6 +6079,9 @@ var CodeQLLanguageServer = class extends EventEmitter { if (!this.isInitialized) { throw new Error("Language server is not initialized"); } + if (!this.isRunning()) { + throw new Error("Language server process is not running"); + } const result = await this.sendRequest("textDocument/references", { ...params, context: params.context ?? { includeDeclaration: true } @@ -6128,7 +6137,9 @@ var CodeQLLanguageServer = class extends EventEmitter { logger.info("Shutting down CodeQL Language Server..."); try { await this.sendRequest("shutdown", {}); - this.sendNotification("exit", {}); + if (this.server) { + this.sendNotification("exit", {}); + } } catch (error) { logger.warn("Error during graceful shutdown:", error); } @@ -6907,7 +6918,7 @@ function registerLspDiagnosticsTool(server) { // src/tools/lsp/lsp-handlers.ts init_logger(); -import { readFileSync as readFileSync6 } from "fs"; +import { readFile as readFile3 } from "fs/promises"; import { pathToFileURL as pathToFileURL3 } from "url"; import { isAbsolute as isAbsolute5, resolve as resolve10 } from "path"; async function getInitializedServer(params) { @@ -6919,34 +6930,42 @@ async function getInitializedServer(params) { }; const manager = getServerManager(); const server = await manager.getLanguageServer(config); - const effectiveUri = params.workspaceUri ?? pathToFileURL3(resolve10(pkgRoot, "ql")).href; + let effectiveUri = params.workspaceUri; + if (effectiveUri && !effectiveUri.startsWith("file://")) { + const absWorkspace = isAbsolute5(effectiveUri) ? effectiveUri : resolve10(process.cwd(), effectiveUri); + effectiveUri = pathToFileURL3(absWorkspace).href; + } + effectiveUri = effectiveUri ?? pathToFileURL3(resolve10(pkgRoot, "ql")).href; await server.initialize(effectiveUri); return server; } -function prepareDocumentPosition(server, params) { +function prepareDocumentPosition(params) { const absPath = isAbsolute5(params.filePath) ? params.filePath : resolve10(process.cwd(), params.filePath); const docUri = pathToFileURL3(absPath).href; + return { absPath, docUri }; +} +async function openDocumentForPosition(server, params, absPath, docUri) { let text; if (params.fileContent) { text = params.fileContent; } else { try { - text = readFileSync6(absPath, "utf-8"); + text = await readFile3(absPath, "utf-8"); } catch (error) { throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`); } } server.openDocument(docUri, text); - const positionParams = { + return { position: { character: params.character, line: params.line }, textDocument: { uri: docUri } }; - return { docUri, positionParams }; } async function lspCompletion(params) { logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`); const server = await getInitializedServer(params); - const { docUri, positionParams } = prepareDocumentPosition(server, params); + const { absPath, docUri } = prepareDocumentPosition(params); + const positionParams = await openDocumentForPosition(server, params, absPath, docUri); try { return await server.getCompletions(positionParams); } finally { @@ -6956,7 +6975,8 @@ async function lspCompletion(params) { async function lspDefinition(params) { logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`); const server = await getInitializedServer(params); - const { docUri, positionParams } = prepareDocumentPosition(server, params); + const { absPath, docUri } = prepareDocumentPosition(params); + const positionParams = await openDocumentForPosition(server, params, absPath, docUri); try { return await server.getDefinition(positionParams); } finally { @@ -6966,7 +6986,8 @@ async function lspDefinition(params) { async function lspReferences(params) { logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`); const server = await getInitializedServer(params); - const { docUri, positionParams } = prepareDocumentPosition(server, params); + const { absPath, docUri } = prepareDocumentPosition(params); + const positionParams = await openDocumentForPosition(server, params, absPath, docUri); try { return await server.getReferences({ ...positionParams, @@ -7096,7 +7117,7 @@ function registerLSPTools(server) { } // src/resources/language-resources.ts -import { readFileSync as readFileSync7, existsSync as existsSync7 } from "fs"; +import { readFileSync as readFileSync6, existsSync as existsSync7 } from "fs"; import { join as join12 } from "path"; // src/types/language-types.ts @@ -7162,7 +7183,7 @@ function loadResourceContent(relativePath) { logger.warn(`Resource file not found: ${fullPath}`); return null; } - return readFileSync7(fullPath, "utf-8"); + return readFileSync6(fullPath, "utf-8"); } catch (error) { logger.error(`Error loading resource file ${relativePath}:`, error); return null; @@ -7288,7 +7309,7 @@ import { z as z33 } from "zod"; import { basename as basename5 } from "path"; // src/prompts/prompt-loader.ts -import { readFileSync as readFileSync8 } from "fs"; +import { readFileSync as readFileSync7 } from "fs"; import { join as join13, dirname as dirname8 } from "path"; import { fileURLToPath as fileURLToPath3 } from "url"; var __filename3 = fileURLToPath3(import.meta.url); @@ -7296,7 +7317,7 @@ var __dirname3 = dirname8(__filename3); function loadPromptTemplate(promptFileName) { try { const promptPath = join13(__dirname3, promptFileName); - return readFileSync8(promptPath, "utf-8"); + return readFileSync7(promptPath, "utf-8"); } catch (error) { return `Prompt template '${promptFileName}' not available: ${error instanceof Error ? error.message : "Unknown error"}`; } @@ -7791,7 +7812,7 @@ var Low = class { }; // ../node_modules/lowdb/lib/adapters/node/TextFile.js -import { readFileSync as readFileSync9, 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; @@ -7804,7 +7825,7 @@ var TextFileSync = class { read() { let data; try { - data = readFileSync9(this.#filename, "utf-8"); + data = readFileSync8(this.#filename, "utf-8"); } catch (e) { if (e.code === "ENOENT") { return null; diff --git a/server/dist/codeql-development-mcp-server.js.map b/server/dist/codeql-development-mcp-server.js.map index 5466c1d2..e62f24dc 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/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/tools/lsp/lsp-diagnostics.ts", "../src/lib/server-manager.ts", "../src/lib/server-config.ts", "../src/lib/language-server.ts", "../src/utils/process-ready.ts", "../src/lib/query-server.ts", "../src/lib/cli-server.ts", "../src/tools/lsp/lsp-handlers.ts", "../src/tools/lsp/lsp-tools.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 = '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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager\n initServerManager();\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 via the server manager.\n *\n * - Respects `searchPath` and `workspaceUri` on every call\n * - Restarts the server when configuration changes\n * - Uses session-isolated cache directories\n */\nasync function getLanguageServer(\n options: LanguageServerOptions = {},\n workspaceUri?: string,\n): Promise {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const languageServer = await manager.getLanguageServer(config);\n\n const effectiveUri = workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await languageServer.initialize(effectiveUri);\n\n return languageServer;\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getLanguageServer(serverOptions, workspaceUri);\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\n}\n", "/**\n * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.tupleCounting || config.debug) {\n args.push('--tuple-counting');\n }\n if (config.debug) {\n args.push('--debug');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\n}\n", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n this.sendRaw(message);\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n this.stdoutBuffer = '';\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n const str = data.toString();\n\n // Look for NUL byte delimiter\n const nulIndex = str.indexOf('\\0');\n if (nulIndex === -1) {\n // No delimiter yet, accumulate\n this.stdoutBuffer += str;\n return;\n }\n\n // Found delimiter \u2014 command is complete\n this.stdoutBuffer += str.substring(0, nulIndex);\n const result = this.stdoutBuffer;\n this.stdoutBuffer = '';\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n // Handle any remaining data after the NUL byte\n const remainder = str.substring(nulIndex + 1);\n if (remainder.length > 0) {\n this.stdoutBuffer = remainder;\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { readFileSync } from 'fs';\nimport { pathToFileURL } from 'url';\nimport { isAbsolute, resolve } from 'path';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /** Absolute path to the QL file. */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: params.searchPath ?? resolve(pkgRoot, 'ql'),\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n const effectiveUri = params.workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await server.initialize(effectiveUri);\n\n return server;\n}\n\n/**\n * Build TextDocumentPositionParams and ensure the document is open.\n */\nfunction prepareDocumentPosition(\n server: Awaited>,\n params: LSPToolParams,\n): { docUri: string; positionParams: TextDocumentPositionParams } {\n // Resolve relative paths against CWD (supports integration test fixtures)\n const absPath = isAbsolute(params.filePath) ? params.filePath : resolve(process.cwd(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = readFileSync(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n const positionParams: TextDocumentPositionParams = {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n\n return { docUri, positionParams };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { docUri, positionParams } = prepareDocumentPosition(server, params);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Absolute path to the CodeQL (.ql/.qll) file'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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", "isAbsolute", "resolve", "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", "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", "z", "mkdirSync", "join", "type", "setTimeout", "clearTimeout", "delimiter", "join", "setTimeout", "resolve", "delimiter", "resolve", "setTimeout", "join", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "str", "join", "mkdirSync", "type", "join", "resolve", "pathToFileURL", "z", "readFileSync", "pathToFileURL", "isAbsolute", "resolve", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "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 = '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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager\n initServerManager();\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 via the server manager.\n *\n * - Respects `searchPath` and `workspaceUri` on every call\n * - Restarts the server when configuration changes\n * - Uses session-isolated cache directories\n */\nasync function getLanguageServer(\n options: LanguageServerOptions = {},\n workspaceUri?: string,\n): Promise {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const languageServer = await manager.getLanguageServer(config);\n\n const effectiveUri = workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await languageServer.initialize(effectiveUri);\n\n return languageServer;\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getLanguageServer(serverOptions, workspaceUri);\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\n}\n", "/**\n * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n } else if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 if (this.server) {\n this.sendNotification('exit', {});\n }\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\n}\n", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n this.sendRaw(message);\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n this.stdoutBuffer = '';\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n const str = data.toString();\n\n // Look for NUL byte delimiter\n const nulIndex = str.indexOf('\\0');\n if (nulIndex === -1) {\n // No delimiter yet, accumulate\n this.stdoutBuffer += str;\n return;\n }\n\n // Found delimiter \u2014 command is complete\n this.stdoutBuffer += str.substring(0, nulIndex);\n const result = this.stdoutBuffer;\n this.stdoutBuffer = '';\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n // Handle any remaining data after the NUL byte\n const remainder = str.substring(nulIndex + 1);\n if (remainder.length > 0) {\n this.stdoutBuffer = remainder;\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { readFile } from 'fs/promises';\nimport { pathToFileURL } from 'url';\nimport { isAbsolute, resolve } from 'path';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /** Absolute path to the QL file. */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: params.searchPath ?? resolve(pkgRoot, 'ql'),\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n // Resolve workspace URI: convert relative paths to absolute file:// URIs\n let effectiveUri = params.workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(process.cwd(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await server.initialize(effectiveUri);\n\n return server;\n}\n\n/**\n * Resolve the file path to an absolute path and file:// URI.\n */\nfunction prepareDocumentPosition(\n params: LSPToolParams,\n): { absPath: string; docUri: string } {\n // Resolve relative paths against CWD (supports integration test fixtures)\n const absPath = isAbsolute(params.filePath) ? params.filePath : resolve(process.cwd(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n return { absPath, docUri };\n}\n\n/**\n * Read file content and open the document in the language server.\n */\nasync function openDocumentForPosition(\n server: Awaited>,\n params: LSPToolParams,\n absPath: string,\n docUri: string,\n): Promise {\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = await readFile(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n return {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Absolute path to the CodeQL (.ql/.qll) file'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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", "isAbsolute", "resolve", "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", "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", "z", "mkdirSync", "join", "type", "setTimeout", "clearTimeout", "delimiter", "join", "setTimeout", "resolve", "delimiter", "resolve", "setTimeout", "join", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "str", "join", "mkdirSync", "type", "join", "resolve", "pathToFileURL", "z", "readFile", "pathToFileURL", "isAbsolute", "resolve", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] } diff --git a/server/package.json b/server/package.json index 7e3bba79..945f8716 100644 --- a/server/package.json +++ b/server/package.json @@ -81,7 +81,7 @@ "build": "npm run clean && npm run lint && npm run bundle", "build:all": "npm run build && npm run test:ql:fail-fast", "bundle": "node esbuild.config.js", - "clean": "rm -rf dist", + "clean": "rm -rf dist .tmp", "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'", diff --git a/server/src/lib/language-server.ts b/server/src/lib/language-server.ts index 8b6c9bef..8f7c1927 100644 --- a/server/src/lib/language-server.ts +++ b/server/src/lib/language-server.ts @@ -426,6 +426,9 @@ export class CodeQLLanguageServer extends EventEmitter { if (!this.isInitialized) { throw new Error('Language server is not initialized'); } + if (!this.isRunning()) { + throw new Error('Language server process is not running'); + } const result = await this.sendRequest('textDocument/completion', params); // The result may be a CompletionList or CompletionItem[] if (result && typeof result === 'object' && 'items' in (result as object)) { @@ -441,6 +444,9 @@ export class CodeQLLanguageServer extends EventEmitter { if (!this.isInitialized) { throw new Error('Language server is not initialized'); } + if (!this.isRunning()) { + throw new Error('Language server process is not running'); + } const result = await this.sendRequest('textDocument/definition', params); return this.normalizeLocations(result); } @@ -452,6 +458,9 @@ export class CodeQLLanguageServer extends EventEmitter { if (!this.isInitialized) { throw new Error('Language server is not initialized'); } + if (!this.isRunning()) { + throw new Error('Language server process is not running'); + } const result = await this.sendRequest('textDocument/references', { ...params, context: params.context ?? { includeDeclaration: true }, @@ -515,7 +524,9 @@ export class CodeQLLanguageServer extends EventEmitter { try { await this.sendRequest('shutdown', {}); - this.sendNotification('exit', {}); + if (this.server) { + this.sendNotification('exit', {}); + } } catch (error) { logger.warn('Error during graceful shutdown:', error); } diff --git a/server/src/lib/server-config.ts b/server/src/lib/server-config.ts index 996b6016..35dfc594 100644 --- a/server/src/lib/server-config.ts +++ b/server/src/lib/server-config.ts @@ -158,11 +158,11 @@ export function buildQueryServerArgs(config: QueryServerConfig): string[] { if (config.evaluatorLog) { args.push(`--evaluator-log=${config.evaluatorLog}`); } - if (config.tupleCounting || config.debug) { - args.push('--tuple-counting'); - } if (config.debug) { args.push('--debug'); + args.push('--tuple-counting'); + } else if (config.tupleCounting) { + args.push('--tuple-counting'); } return args; diff --git a/server/src/tools/lsp/lsp-handlers.ts b/server/src/tools/lsp/lsp-handlers.ts index 588d5f7b..0cd96e0b 100644 --- a/server/src/tools/lsp/lsp-handlers.ts +++ b/server/src/tools/lsp/lsp-handlers.ts @@ -14,7 +14,7 @@ import { TextDocumentPositionParams, } from '../../lib/language-server'; import { logger } from '../../utils/logger'; -import { readFileSync } from 'fs'; +import { readFile } from 'fs/promises'; import { pathToFileURL } from 'url'; import { isAbsolute, resolve } from 'path'; @@ -51,30 +51,49 @@ async function getInitializedServer(params: LSPToolParams) { const manager = getServerManager(); const server = await manager.getLanguageServer(config); - const effectiveUri = params.workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href; + // Resolve workspace URI: convert relative paths to absolute file:// URIs + let effectiveUri = params.workspaceUri; + if (effectiveUri && !effectiveUri.startsWith('file://')) { + const absWorkspace = isAbsolute(effectiveUri) + ? effectiveUri + : resolve(process.cwd(), effectiveUri); + effectiveUri = pathToFileURL(absWorkspace).href; + } + effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href; await server.initialize(effectiveUri); return server; } /** - * Build TextDocumentPositionParams and ensure the document is open. + * Resolve the file path to an absolute path and file:// URI. */ function prepareDocumentPosition( - server: Awaited>, params: LSPToolParams, -): { docUri: string; positionParams: TextDocumentPositionParams } { +): { absPath: string; docUri: string } { // Resolve relative paths against CWD (supports integration test fixtures) const absPath = isAbsolute(params.filePath) ? params.filePath : resolve(process.cwd(), params.filePath); const docUri = pathToFileURL(absPath).href; + return { absPath, docUri }; +} + +/** + * Read file content and open the document in the language server. + */ +async function openDocumentForPosition( + server: Awaited>, + params: LSPToolParams, + absPath: string, + docUri: string, +): Promise { // Read file content from disk or use provided content let text: string; if (params.fileContent) { text = params.fileContent; } else { try { - text = readFileSync(absPath, 'utf-8'); + text = await readFile(absPath, 'utf-8'); } catch (error) { throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`); } @@ -83,12 +102,10 @@ function prepareDocumentPosition( // Open the document so the language server knows about it server.openDocument(docUri, text); - const positionParams: TextDocumentPositionParams = { + return { position: { character: params.character, line: params.line }, textDocument: { uri: docUri }, }; - - return { docUri, positionParams }; } /** @@ -97,7 +114,8 @@ function prepareDocumentPosition( export async function lspCompletion(params: LSPToolParams): Promise { logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`); const server = await getInitializedServer(params); - const { docUri, positionParams } = prepareDocumentPosition(server, params); + const { absPath, docUri } = prepareDocumentPosition(params); + const positionParams = await openDocumentForPosition(server, params, absPath, docUri); try { return await server.getCompletions(positionParams); @@ -112,7 +130,8 @@ export async function lspCompletion(params: LSPToolParams): Promise { logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`); const server = await getInitializedServer(params); - const { docUri, positionParams } = prepareDocumentPosition(server, params); + const { absPath, docUri } = prepareDocumentPosition(params); + const positionParams = await openDocumentForPosition(server, params, absPath, docUri); try { return await server.getDefinition(positionParams); @@ -127,7 +146,8 @@ export async function lspDefinition(params: LSPToolParams): Promise { logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`); const server = await getInitializedServer(params); - const { docUri, positionParams } = prepareDocumentPosition(server, params); + const { absPath, docUri } = prepareDocumentPosition(params); + const positionParams = await openDocumentForPosition(server, params, absPath, docUri); try { return await server.getReferences({ diff --git a/server/test/setup.ts b/server/test/setup.ts new file mode 100644 index 00000000..ef020f18 --- /dev/null +++ b/server/test/setup.ts @@ -0,0 +1,21 @@ +/** + * Global test setup for Vitest. + * + * Runs before every test file. Mocks shared infrastructure (like the + * logger) so individual test files don't need to repeat the same + * `vi.mock(...)` boilerplate and tests don't emit noisy log output. + */ + +import { vi } from 'vitest'; + +// Suppress all logger output during unit tests. +// Individual tests that need to assert on log calls can import +// `logger` and use `vi.mocked(logger.info)` etc. +vi.mock('../src/utils/logger', () => ({ + logger: { + debug: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, +})); diff --git a/server/test/src/lib/cli-executor.test.ts b/server/test/src/lib/cli-executor.test.ts index 50d70717..e7432b48 100644 --- a/server/test/src/lib/cli-executor.test.ts +++ b/server/test/src/lib/cli-executor.test.ts @@ -2,7 +2,7 @@ * Tests for CLI executor utilities */ -import { describe, it, expect, beforeAll, afterAll, afterEach, vi } from 'vitest'; +import { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest'; import { writeFileSync, rmSync, chmodSync } from 'fs'; import { execFileSync } from 'child_process'; import { join } from 'path'; @@ -21,15 +21,6 @@ import { validateCodeQLBinaryReachable } from '../../../src/lib/cli-executor'; -// Mock the logger to suppress expected error output -vi.mock('../../../src/utils/logger', () => ({ - logger: { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }, -})); // Enable test commands for all tests in this file beforeAll(() => { diff --git a/server/test/src/lib/language-server.test.ts b/server/test/src/lib/language-server.test.ts index 73c7d357..1b1af5b5 100644 --- a/server/test/src/lib/language-server.test.ts +++ b/server/test/src/lib/language-server.test.ts @@ -157,6 +157,26 @@ describe('CodeQLLanguageServer', () => { textDocument: { uri: 'file:///test.ql' }, })).rejects.toThrow('Language server is not initialized'); }); + + it('should throw if process is not running', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + // Initialize first + const initPromise = ls.initialize('file:///workspace'); + mockProc.stdout.emit('data', Buffer.from(buildLspFrame({ + id: 1, jsonrpc: '2.0', result: { capabilities: {} }, + }))); + await initPromise; + + // Kill the process + mockProc.killed = true; + + await expect(ls.getCompletions({ + position: { character: 0, line: 0 }, + textDocument: { uri: 'file:///test.ql' }, + })).rejects.toThrow('Language server process is not running'); + }); }); describe('getDefinition', () => { @@ -169,6 +189,24 @@ describe('CodeQLLanguageServer', () => { textDocument: { uri: 'file:///test.ql' }, })).rejects.toThrow('Language server is not initialized'); }); + + it('should throw if process is not running', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + const initPromise = ls.initialize('file:///workspace'); + mockProc.stdout.emit('data', Buffer.from(buildLspFrame({ + id: 1, jsonrpc: '2.0', result: { capabilities: {} }, + }))); + await initPromise; + + mockProc.killed = true; + + await expect(ls.getDefinition({ + position: { character: 0, line: 0 }, + textDocument: { uri: 'file:///test.ql' }, + })).rejects.toThrow('Language server process is not running'); + }); }); describe('getReferences', () => { @@ -181,6 +219,24 @@ describe('CodeQLLanguageServer', () => { textDocument: { uri: 'file:///test.ql' }, })).rejects.toThrow('Language server is not initialized'); }); + + it('should throw if process is not running', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + const initPromise = ls.initialize('file:///workspace'); + mockProc.stdout.emit('data', Buffer.from(buildLspFrame({ + id: 1, jsonrpc: '2.0', result: { capabilities: {} }, + }))); + await initPromise; + + mockProc.killed = true; + + await expect(ls.getReferences({ + position: { character: 0, line: 0 }, + textDocument: { uri: 'file:///test.ql' }, + })).rejects.toThrow('Language server process is not running'); + }); }); describe('openDocument', () => { diff --git a/server/test/src/lib/metadata-resolver.test.ts b/server/test/src/lib/metadata-resolver.test.ts index dfae1a35..cd83f1df 100644 --- a/server/test/src/lib/metadata-resolver.test.ts +++ b/server/test/src/lib/metadata-resolver.test.ts @@ -6,16 +6,6 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { resolveQueryMetadata } from '../../../src/lib/metadata-resolver.js'; import * as cliExecutor from '../../../src/lib/cli-executor.js'; -// Mock the logger to suppress expected error output -vi.mock('../../../src/utils/logger', () => ({ - logger: { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }, -})); - // Mock the cli-executor module vi.mock('../../../src/lib/cli-executor.js', () => ({ executeCodeQLCommand: vi.fn() diff --git a/server/test/src/lib/query-results-evaluator.test.ts b/server/test/src/lib/query-results-evaluator.test.ts index 35090bce..57bdedfb 100644 --- a/server/test/src/lib/query-results-evaluator.test.ts +++ b/server/test/src/lib/query-results-evaluator.test.ts @@ -7,16 +7,6 @@ import { existsSync, mkdirSync, writeFileSync, readFileSync, rmSync } from 'fs'; import { join } from 'path'; import { createTestTempDir, cleanupTestTempDir } from '../../utils/temp-dir'; -// Mock the logger to suppress expected error output -vi.mock('../../../src/utils/logger', () => ({ - logger: { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }, -})); - // Mock CLI executor at the top level vi.mock('../../../src/lib/cli-executor', () => ({ executeCodeQLCommand: vi.fn() diff --git a/server/test/src/lib/server-config.test.ts b/server/test/src/lib/server-config.test.ts index 15ad4527..ca5e5256 100644 --- a/server/test/src/lib/server-config.test.ts +++ b/server/test/src/lib/server-config.test.ts @@ -110,6 +110,8 @@ describe('server-config', () => { expect(args).toContain('--debug'); expect(args).toContain('--tuple-counting'); + // --debug should appear before --tuple-counting + expect(args.indexOf('--debug')).toBeLessThan(args.indexOf('--tuple-counting')); }); it('should not duplicate --tuple-counting when both debug and tupleCounting are set', () => { diff --git a/server/test/src/lib/server-manager.test.ts b/server/test/src/lib/server-manager.test.ts index 22b31263..6d9232ef 100644 --- a/server/test/src/lib/server-manager.test.ts +++ b/server/test/src/lib/server-manager.test.ts @@ -129,6 +129,66 @@ describe('CodeQLServerManager', () => { }); }); + describe('getLanguageServer', () => { + it('should return a running language server', async () => { + const manager = new CodeQLServerManager({ sessionId: 'ls-test' }); + const server = await manager.getLanguageServer({ searchPath: '/ql' }); + + expect(server).toBeDefined(); + expect(server.isRunning()).toBe(true); + expect(manager.isRunning('language')).toBe(true); + }); + + it('should reuse the same server for identical config', async () => { + const manager = new CodeQLServerManager({ sessionId: 'ls-reuse' }); + const config = { searchPath: '/ql' }; + + const server1 = await manager.getLanguageServer(config); + const server2 = await manager.getLanguageServer(config); + + expect(server1).toBe(server2); + }); + + it('should restart server when config changes', async () => { + const manager = new CodeQLServerManager({ sessionId: 'ls-restart' }); + + const server1 = await manager.getLanguageServer({ searchPath: '/ql1' }); + + // Spy on shutdown to avoid waiting for the mock process to respond + // (the mock process does not implement the JSON-RPC shutdown protocol) + vi.spyOn(server1, 'shutdown').mockResolvedValue(undefined); + + const server2 = await manager.getLanguageServer({ searchPath: '/ql2' }); + + // Different config means different server instance + expect(server1).not.toBe(server2); + expect(manager.isRunning('language')).toBe(true); + expect(server1.shutdown).toHaveBeenCalled(); + }); + }); + + describe('getQueryServer', () => { + it('should return a running query server', async () => { + const manager = new CodeQLServerManager({ sessionId: 'qs-test' }); + const server = await manager.getQueryServer({ threads: 2 }); + + expect(server).toBeDefined(); + expect(server.isRunning()).toBe(true); + expect(manager.isRunning('query')).toBe(true); + }); + }); + + describe('getCLIServer', () => { + it('should return a running CLI server', async () => { + const manager = new CodeQLServerManager({ sessionId: 'cli-test' }); + const server = await manager.getCLIServer({}); + + expect(server).toBeDefined(); + expect(server.isRunning()).toBe(true); + expect(manager.isRunning('cli')).toBe(true); + }); + }); + describe('enrichConfig', () => { it('should enrich config with session-specific cache and log dirs', () => { const manager = new CodeQLServerManager({ sessionId: 'enrich-test' }); diff --git a/server/test/src/tools/codeql/profile-codeql-query.test.ts b/server/test/src/tools/codeql/profile-codeql-query.test.ts index 7047f4d8..109cca35 100644 --- a/server/test/src/tools/codeql/profile-codeql-query.test.ts +++ b/server/test/src/tools/codeql/profile-codeql-query.test.ts @@ -9,16 +9,6 @@ import { join } from 'path'; import { createTestTempDir, cleanupTestTempDir } from '../../../utils/temp-dir'; import { registerProfileCodeQLQueryTool } from '../../../../src/tools/codeql/profile-codeql-query'; -// Mock the logger to suppress expected error output -vi.mock('../../../../src/utils/logger', () => ({ - logger: { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }, -})); - // We'll test the parsing and formatting functions by importing them // Since they're not exported, we'll need to test via the file output describe('Profile CodeQL Query Tool', () => { diff --git a/server/test/src/tools/codeql/quick-evaluate.test.ts b/server/test/src/tools/codeql/quick-evaluate.test.ts index f55eba31..bef300a0 100644 --- a/server/test/src/tools/codeql/quick-evaluate.test.ts +++ b/server/test/src/tools/codeql/quick-evaluate.test.ts @@ -9,16 +9,6 @@ import { join } from 'path'; import { quickEvaluate, registerQuickEvaluateTool } from '../../../../src/tools/codeql/quick-evaluate'; import { createTestTempDir } from '../../../utils/temp-dir'; -// Mock the logger to suppress expected error output -vi.mock('../../../../src/utils/logger', () => ({ - logger: { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }, -})); - // Helper function to create unique temp files and ensure cleanup // eslint-disable-next-line no-unused-vars async function withTempFile(content: string, testName: string, fn: (filePath: string) => Promise): Promise { diff --git a/server/test/src/tools/codeql/register-database.test.ts b/server/test/src/tools/codeql/register-database.test.ts index 401180dd..58231387 100644 --- a/server/test/src/tools/codeql/register-database.test.ts +++ b/server/test/src/tools/codeql/register-database.test.ts @@ -9,16 +9,6 @@ import { basename, join } from 'path'; import { registerDatabase, registerRegisterDatabaseTool } from '../../../../src/tools/codeql/register-database'; import { createTestTempDir } from '../../../utils/temp-dir'; -// Mock the logger to suppress expected error output -vi.mock('../../../../src/utils/logger', () => ({ - logger: { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }, -})); - describe('registerDatabase', () => { it('should successfully register a valid database', async () => { // Arrange diff --git a/server/test/src/tools/lsp/lsp-diagnostics.test.ts b/server/test/src/tools/lsp/lsp-diagnostics.test.ts index f77f56de..17dee40f 100644 --- a/server/test/src/tools/lsp/lsp-diagnostics.test.ts +++ b/server/test/src/tools/lsp/lsp-diagnostics.test.ts @@ -7,16 +7,6 @@ import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -// Mock the logger -vi.mock('../../../../src/utils/logger', () => ({ - logger: { - debug: vi.fn(), - error: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - }, -})); - // Create mock language server instance methods const mockEvaluateQL = vi.fn().mockResolvedValue([]); const mockInitialize = vi.fn().mockResolvedValue(undefined); diff --git a/server/test/src/tools/lsp/lsp-handlers.test.ts b/server/test/src/tools/lsp/lsp-handlers.test.ts index 4f63e667..b674bd2d 100644 --- a/server/test/src/tools/lsp/lsp-handlers.test.ts +++ b/server/test/src/tools/lsp/lsp-handlers.test.ts @@ -32,11 +32,11 @@ vi.mock('../../../../src/utils/package-paths', () => ({ packageRootDir: '/mock/pkg', })); -vi.mock('fs', async (importOriginal) => { +vi.mock('fs/promises', async (importOriginal) => { const actual = await importOriginal() as Record; return { ...actual, - readFileSync: vi.fn(() => 'import ql\nselect 1'), + readFile: vi.fn(async () => 'import ql\nselect 1'), }; }); @@ -255,4 +255,31 @@ describe('lsp-handlers', () => { ); }); }); + + describe('workspace URI handling', () => { + it('should convert relative workspace_uri to file:// URI', async () => { + mockGetCompletions.mockResolvedValueOnce([]); + + await lspCompletion({ + ...baseParams, + workspaceUri: 'server/ql/javascript/examples', + }); + + // The initialize call should receive a file:// URI, not a relative path + expect(mockInitialize).toHaveBeenCalledWith( + expect.stringMatching(/^file:\/\//), + ); + }); + + it('should pass through workspace_uri that is already a file:// URI', async () => { + mockGetCompletions.mockResolvedValueOnce([]); + + await lspCompletion({ + ...baseParams, + workspaceUri: 'file:///absolute/workspace', + }); + + expect(mockInitialize).toHaveBeenCalledWith('file:///absolute/workspace'); + }); + }); }); diff --git a/server/test/src/tools/lsp/lsp-tools.test.ts b/server/test/src/tools/lsp/lsp-tools.test.ts index 75d32369..f9743c28 100644 --- a/server/test/src/tools/lsp/lsp-tools.test.ts +++ b/server/test/src/tools/lsp/lsp-tools.test.ts @@ -1,23 +1,13 @@ /** * Tests for LSP tool registration (lsp-tools.ts). * - * Verifies that registerLSPTools registers all 5 LSP tools with correct + * Verifies that registerLSPTools registers all 4 LSP tools with correct * names, descriptions, schemas, and handler functions. */ import { describe, expect, it, vi, beforeEach } from 'vitest'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; -// Mock logger -vi.mock('../../../../src/utils/logger', () => ({ - logger: { - debug: vi.fn(), - error: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - }, -})); - // Mock lsp-diagnostics registration vi.mock('../../../../src/tools/lsp/lsp-diagnostics', () => ({ registerLspDiagnosticsTool: vi.fn(), diff --git a/server/test/src/tools/monitoring-tools.test.ts b/server/test/src/tools/monitoring-tools.test.ts index b9d9c13d..2ccc7923 100644 --- a/server/test/src/tools/monitoring-tools.test.ts +++ b/server/test/src/tools/monitoring-tools.test.ts @@ -8,16 +8,6 @@ import { registerMonitoringTools } from '../../../src/tools/monitoring-tools'; import { sessionDataManager } from '../../../src/lib/session-data-manager'; import { existsSync, rmSync } from 'fs'; -// Mock the logger to suppress expected error output -vi.mock('../../../src/utils/logger', () => ({ - logger: { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }, -})); - describe('Monitoring Tools', () => { let mockServer: McpServer; const testStorageDir = '.ql-mcp-tracking-test'; diff --git a/server/test/src/utils/logger.test.ts b/server/test/src/utils/logger.test.ts index 0fc9dcda..b5c6ce20 100644 --- a/server/test/src/utils/logger.test.ts +++ b/server/test/src/utils/logger.test.ts @@ -6,6 +6,10 @@ */ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; + +// Undo the global logger mock from test/setup.ts so we can test the real logger +vi.unmock('../../../src/utils/logger'); + import { logger } from '../../../src/utils/logger'; describe('Logger', () => { diff --git a/server/test/src/utils/process-ready.test.ts b/server/test/src/utils/process-ready.test.ts index fa8597b4..5da6005e 100644 --- a/server/test/src/utils/process-ready.test.ts +++ b/server/test/src/utils/process-ready.test.ts @@ -5,6 +5,7 @@ import { describe, expect, it, vi, beforeEach } from 'vitest'; import { EventEmitter } from 'events'; import { ChildProcess } from 'child_process'; + import { waitForProcessReady } from '../../../src/utils/process-ready'; /** diff --git a/server/vitest.config.ts b/server/vitest.config.ts index 5887299b..1cd919e2 100644 --- a/server/vitest.config.ts +++ b/server/vitest.config.ts @@ -5,6 +5,7 @@ export default defineConfig({ globals: true, environment: 'node', include: ['test/**/*.{test,spec}.{js,ts}'], + setupFiles: ['test/setup.ts'], watch: false, // Disable watch mode by default testTimeout: 10000, // 10 second timeout for tests // Enhanced test isolation From e561fa4f2ebeb4b97648e2927993da80b8ce1f2f Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Sun, 8 Feb 2026 21:13:01 -0700 Subject: [PATCH 4/7] Address PR review comments & fix integration tests --- client/src/lib/integration-test-runner.js | 11 ++++- .../lib/monitoring-integration-test-runner.js | 3 +- docs/tools-reference.md | 48 +++++++++---------- server/dist/codeql-development-mcp-server.js | 33 +++++++++---- .../dist/codeql-development-mcp-server.js.map | 6 +-- server/src/lib/language-server.ts | 6 +-- server/src/lib/query-server.ts | 10 +++- server/src/tools/lsp/lsp-diagnostics.ts | 14 +++++- server/src/tools/lsp/lsp-handlers.ts | 25 ++++++---- server/src/tools/lsp/lsp-tools.ts | 2 +- .../test/src/tools/lsp/lsp-handlers.test.ts | 3 +- 11 files changed, 104 insertions(+), 57 deletions(-) diff --git a/client/src/lib/integration-test-runner.js b/client/src/lib/integration-test-runner.js index 40dd029e..bbcf6d1e 100644 --- a/client/src/lib/integration-test-runner.js +++ b/client/src/lib/integration-test-runner.js @@ -832,7 +832,16 @@ export class IntegrationTestRunner { if (success) { this.logger.log(`✅ ${toolName}/${testCase} - Tool executed successfully`); - this.logger.log(` Result: ${result.content?.[0]?.text || "No content"}`); + // Truncate long results to avoid excessive CI log output + const resultText = result.content?.[0]?.text || "No content"; + const MAX_LOG_LENGTH = 500; + if (resultText.length > MAX_LOG_LENGTH) { + this.logger.log( + ` Result: ${resultText.substring(0, MAX_LOG_LENGTH)}... (truncated, ${resultText.length} chars total)` + ); + } else { + this.logger.log(` Result: ${resultText}`); + } } else { this.logger.log(`❌ ${toolName}/${testCase} - Tool execution failed`); const errorText = result.content?.[0]?.text || "Unknown error"; diff --git a/client/src/lib/monitoring-integration-test-runner.js b/client/src/lib/monitoring-integration-test-runner.js index f0c1ed1a..96d5ea77 100644 --- a/client/src/lib/monitoring-integration-test-runner.js +++ b/client/src/lib/monitoring-integration-test-runner.js @@ -330,8 +330,7 @@ export class MonitoringIntegrationTestRunner { const params = {}; if (toolName === "codeql_lsp_diagnostics") { - params.query = "from DataFlow::Configuration cfg select cfg"; - params.language = "javascript"; + params.ql_code = "from DataFlow::Configuration cfg select cfg"; } else if (toolName === "codeql_query_format") { // Look for .ql files in the before directory const beforeDir = path.join(testCaseDir, "before"); diff --git a/docs/tools-reference.md b/docs/tools-reference.md index ef330f0f..1a4aa75b 100644 --- a/docs/tools-reference.md +++ b/docs/tools-reference.md @@ -181,14 +181,14 @@ Get code completions at a cursor position in a CodeQL file. **Parameters:** -| Parameter | Type | Required | Description | -| --------------- | ------ | -------- | --------------------------------------------- | -| `file_path` | string | Yes | Absolute path to the `.ql`/`.qll` file | -| `line` | number | Yes | 0-based line number | -| `character` | number | Yes | 0-based character offset | -| `file_content` | string | No | File content override (reads disk if omitted) | -| `search_path` | string | No | Search path for CodeQL libraries | -| `workspace_uri` | string | No | Workspace URI for context | +| Parameter | Type | Required | Description | +| --------------- | ------ | -------- | ------------------------------------------------------------------------------ | +| `file_path` | string | Yes | Path to the `.ql`/`.qll` file (relative paths resolved against user workspace) | +| `line` | number | Yes | 0-based line number | +| `character` | number | Yes | 0-based character offset | +| `file_content` | string | No | File content override (reads disk if omitted) | +| `search_path` | string | No | Search path for CodeQL libraries | +| `workspace_uri` | string | No | Workspace URI for context | ### codeql_lsp_definition @@ -196,14 +196,14 @@ Go to the definition of a CodeQL symbol at a given position. **Parameters:** -| Parameter | Type | Required | Description | -| --------------- | ------ | -------- | --------------------------------------------- | -| `file_path` | string | Yes | Absolute path to the `.ql`/`.qll` file | -| `line` | number | Yes | 0-based line number | -| `character` | number | Yes | 0-based character offset | -| `file_content` | string | No | File content override (reads disk if omitted) | -| `search_path` | string | No | Search path for CodeQL libraries | -| `workspace_uri` | string | No | Workspace URI for context | +| Parameter | Type | Required | Description | +| --------------- | ------ | -------- | ------------------------------------------------------------------------------ | +| `file_path` | string | Yes | Path to the `.ql`/`.qll` file (relative paths resolved against user workspace) | +| `line` | number | Yes | 0-based line number | +| `character` | number | Yes | 0-based character offset | +| `file_content` | string | No | File content override (reads disk if omitted) | +| `search_path` | string | No | Search path for CodeQL libraries | +| `workspace_uri` | string | No | Workspace URI for context | ### codeql_lsp_references @@ -211,14 +211,14 @@ Find all references to a CodeQL symbol at a given position. **Parameters:** -| Parameter | Type | Required | Description | -| --------------- | ------ | -------- | --------------------------------------------- | -| `file_path` | string | Yes | Absolute path to the `.ql`/`.qll` file | -| `line` | number | Yes | 0-based line number | -| `character` | number | Yes | 0-based character offset | -| `file_content` | string | No | File content override (reads disk if omitted) | -| `search_path` | string | No | Search path for CodeQL libraries | -| `workspace_uri` | string | No | Workspace URI for context | +| Parameter | Type | Required | Description | +| --------------- | ------ | -------- | ------------------------------------------------------------------------------ | +| `file_path` | string | Yes | Path to the `.ql`/`.qll` file (relative paths resolved against user workspace) | +| `line` | number | Yes | 0-based line number | +| `character` | number | Yes | 0-based character offset | +| `file_content` | string | No | File content override (reads disk if omitted) | +| `search_path` | string | No | Search path for CodeQL libraries | +| `workspace_uri` | string | No | Workspace URI for context | ## Testing Tools diff --git a/server/dist/codeql-development-mcp-server.js b/server/dist/codeql-development-mcp-server.js index 9fd37586..94795c92 100755 --- a/server/dist/codeql-development-mcp-server.js +++ b/server/dist/codeql-development-mcp-server.js @@ -5926,7 +5926,7 @@ var CodeQLLanguageServer = class extends EventEmitter { this.pendingResponses.delete(id); reject(new Error(`LSP request timeout for method: ${method}`)); } - }, 1e4); + }, 3e4); }); } sendNotification(method, params) { @@ -6019,7 +6019,7 @@ var CodeQLLanguageServer = class extends EventEmitter { this.removeAllListeners("diagnostics"); reject(new Error("Timeout waiting for diagnostics")); } - }, 5e3); + }, 3e4); const diagnosticsHandler = (params) => { if (params.uri === documentUri) { diagnosticsReceived = true; @@ -6242,7 +6242,13 @@ var CodeQLQueryServer = class extends EventEmitter2 { }; return new Promise((resolve12, reject) => { this.pendingRequests.set(id, { reject, resolve: resolve12 }); - this.sendRaw(message); + try { + this.sendRaw(message); + } catch (error) { + this.pendingRequests.delete(id); + reject(error instanceof Error ? error : new Error(String(error))); + return; + } const timer = setTimeout4(() => { if (this.pendingRequests.has(id)) { this.pendingRequests.delete(id); @@ -6751,7 +6757,7 @@ async function shutdownServerManager() { // src/tools/lsp/lsp-diagnostics.ts init_logger(); -import { join as join11, resolve as resolve9 } from "path"; +import { join as join11, isAbsolute as isAbsolute5, resolve as resolve9 } from "path"; import { pathToFileURL as pathToFileURL2 } from "url"; function formatDiagnostics(diagnostics) { if (diagnostics.length === 0) { @@ -6819,7 +6825,13 @@ async function getLanguageServer(options = {}, workspaceUri) { }; const manager = getServerManager(); const languageServer = await manager.getLanguageServer(config); - const effectiveUri = workspaceUri ?? pathToFileURL2(resolve9(pkgRoot, "ql")).href; + let effectiveUri = workspaceUri; + if (effectiveUri && !effectiveUri.startsWith("file://")) { + const { getUserWorkspaceDir: getUserWorkspaceDir2 } = await Promise.resolve().then(() => (init_package_paths(), package_paths_exports)); + const absWorkspace = isAbsolute5(effectiveUri) ? effectiveUri : resolve9(getUserWorkspaceDir2(), effectiveUri); + effectiveUri = pathToFileURL2(absWorkspace).href; + } + effectiveUri = effectiveUri ?? pathToFileURL2(resolve9(pkgRoot, "ql")).href; await languageServer.initialize(effectiveUri); return languageServer; } @@ -6917,10 +6929,11 @@ function registerLspDiagnosticsTool(server) { } // src/tools/lsp/lsp-handlers.ts -init_logger(); import { readFile as readFile3 } from "fs/promises"; +import { isAbsolute as isAbsolute6, resolve as resolve10 } from "path"; import { pathToFileURL as pathToFileURL3 } from "url"; -import { isAbsolute as isAbsolute5, resolve as resolve10 } from "path"; +init_logger(); +init_package_paths(); async function getInitializedServer(params) { const { packageRootDir: pkgRoot } = await Promise.resolve().then(() => (init_package_paths(), package_paths_exports)); const config = { @@ -6932,7 +6945,7 @@ async function getInitializedServer(params) { const server = await manager.getLanguageServer(config); let effectiveUri = params.workspaceUri; if (effectiveUri && !effectiveUri.startsWith("file://")) { - const absWorkspace = isAbsolute5(effectiveUri) ? effectiveUri : resolve10(process.cwd(), effectiveUri); + const absWorkspace = isAbsolute6(effectiveUri) ? effectiveUri : resolve10(getUserWorkspaceDir(), effectiveUri); effectiveUri = pathToFileURL3(absWorkspace).href; } effectiveUri = effectiveUri ?? pathToFileURL3(resolve10(pkgRoot, "ql")).href; @@ -6940,7 +6953,7 @@ async function getInitializedServer(params) { return server; } function prepareDocumentPosition(params) { - const absPath = isAbsolute5(params.filePath) ? params.filePath : resolve10(process.cwd(), params.filePath); + const absPath = isAbsolute6(params.filePath) ? params.filePath : resolve10(getUserWorkspaceDir(), params.filePath); const docUri = pathToFileURL3(absPath).href; return { absPath, docUri }; } @@ -7004,7 +7017,7 @@ init_logger(); var lspParamsSchema = { character: z32.number().int().min(0).describe("0-based character offset within the line"), file_content: z32.string().optional().describe("Optional file content override (reads from disk if omitted)"), - file_path: z32.string().describe("Absolute path to the CodeQL (.ql/.qll) file"), + file_path: z32.string().describe("Path to the CodeQL (.ql/.qll) file. Relative paths are resolved against the user workspace directory (see CODEQL_MCP_WORKSPACE)."), line: z32.number().int().min(0).describe("0-based line number in the document"), search_path: z32.string().optional().describe("Optional search path for CodeQL libraries"), workspace_uri: z32.string().optional().describe("Optional workspace URI for context (defaults to ./ql directory)") diff --git a/server/dist/codeql-development-mcp-server.js.map b/server/dist/codeql-development-mcp-server.js.map index e62f24dc..aafa8beb 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/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/tools/lsp/lsp-diagnostics.ts", "../src/lib/server-manager.ts", "../src/lib/server-config.ts", "../src/lib/language-server.ts", "../src/utils/process-ready.ts", "../src/lib/query-server.ts", "../src/lib/cli-server.ts", "../src/tools/lsp/lsp-handlers.ts", "../src/tools/lsp/lsp-tools.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 = '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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager\n initServerManager();\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 via the server manager.\n *\n * - Respects `searchPath` and `workspaceUri` on every call\n * - Restarts the server when configuration changes\n * - Uses session-isolated cache directories\n */\nasync function getLanguageServer(\n options: LanguageServerOptions = {},\n workspaceUri?: string,\n): Promise {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const languageServer = await manager.getLanguageServer(config);\n\n const effectiveUri = workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await languageServer.initialize(effectiveUri);\n\n return languageServer;\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getLanguageServer(serverOptions, workspaceUri);\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\n}\n", "/**\n * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n } else if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 if (this.server) {\n this.sendNotification('exit', {});\n }\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\n}\n", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n this.sendRaw(message);\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n this.stdoutBuffer = '';\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n const str = data.toString();\n\n // Look for NUL byte delimiter\n const nulIndex = str.indexOf('\\0');\n if (nulIndex === -1) {\n // No delimiter yet, accumulate\n this.stdoutBuffer += str;\n return;\n }\n\n // Found delimiter \u2014 command is complete\n this.stdoutBuffer += str.substring(0, nulIndex);\n const result = this.stdoutBuffer;\n this.stdoutBuffer = '';\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n // Handle any remaining data after the NUL byte\n const remainder = str.substring(nulIndex + 1);\n if (remainder.length > 0) {\n this.stdoutBuffer = remainder;\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { readFile } from 'fs/promises';\nimport { pathToFileURL } from 'url';\nimport { isAbsolute, resolve } from 'path';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /** Absolute path to the QL file. */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: params.searchPath ?? resolve(pkgRoot, 'ql'),\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n // Resolve workspace URI: convert relative paths to absolute file:// URIs\n let effectiveUri = params.workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(process.cwd(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await server.initialize(effectiveUri);\n\n return server;\n}\n\n/**\n * Resolve the file path to an absolute path and file:// URI.\n */\nfunction prepareDocumentPosition(\n params: LSPToolParams,\n): { absPath: string; docUri: string } {\n // Resolve relative paths against CWD (supports integration test fixtures)\n const absPath = isAbsolute(params.filePath) ? params.filePath : resolve(process.cwd(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n return { absPath, docUri };\n}\n\n/**\n * Read file content and open the document in the language server.\n */\nasync function openDocumentForPosition(\n server: Awaited>,\n params: LSPToolParams,\n absPath: string,\n docUri: string,\n): Promise {\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = await readFile(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n return {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Absolute path to the CodeQL (.ql/.qll) file'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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": ";;;;;;;;;;;;AAAA,IAOa;AAPb;AAAA;AAAA;AAOO,IAAM,SAAS;AAAA,MACpB,MAAM,CAAC,YAAoB,SAAoB;AAC7C,gBAAQ,MAAM,WAAU,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,OAAO,IAAI,GAAG,IAAI;AAAA,MACxE;AAAA,MACA,OAAO,CAAC,YAAoB,SAAoB;AAC9C,gBAAQ,MAAM,YAAW,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,OAAO,IAAI,GAAG,IAAI;AAAA,MACzE;AAAA,MACA,MAAM,CAAC,YAAoB,SAAoB;AAC7C,gBAAQ,MAAM,WAAU,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,OAAO,IAAI,GAAG,IAAI;AAAA,MACxE;AAAA,MACA,OAAO,CAAC,YAAoB,SAAoB;AAC9C,YAAI,QAAQ,IAAI,OAAO;AACrB,kBAAQ,MAAM,YAAW,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,OAAO,IAAI,GAAG,IAAI;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACtBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,UAAU,WAAW,SAAS,kBAAkB;AACzD,SAAS,iBAAiB;AA4EnB,SAAS,qBAA2B;AACzC,iBAAe,oBAAI,IAAI;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAKO,SAAS,sBAA4B;AAC1C,iBAAe;AACjB;AAKA,SAAS,iBAAiB,SAA0B;AAClD,SAAO,iBAAiB,IAAI,OAAO,KAAM,iBAAiB,QAAQ,aAAa,IAAI,OAAO;AAC5F;AAyBO,SAAS,sBAA8B;AAE5C,MAAI,yBAAyB,QAAW;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,IAAI;AAE5B,MAAI,CAAC,SAAS;AACZ,wBAAoB;AACpB,2BAAuB;AACvB,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,SAAS,OAAO,EAAE,YAAY;AAC3C,QAAM,iBAAiB,CAAC,UAAU,cAAc,YAAY;AAC5D,MAAI,CAAC,eAAe,SAAS,IAAI,GAAG;AAClC,UAAM,IAAI;AAAA,MACR,mFAAmF,IAAI;AAAA,IACzF;AAAA,EACF;AAGA,MAAI,CAAC,WAAW,OAAO,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,8CAA8C,OAAO;AAAA,IACvD;AAAA,EACF;AAGA,MAAI,CAAC,WAAW,OAAO,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,qDAAqD,OAAO;AAAA,IAC9D;AAAA,EACF;AAEA,sBAAoB,QAAQ,OAAO;AACnC,yBAAuB;AACvB,SAAO,KAAK,wCAAwC,OAAO,UAAU,iBAAiB,GAAG;AACzF,SAAO;AACT;AAKO,SAAS,uBAAsC;AACpD,SAAO;AACT;AAKO,SAAS,4BAAkC;AAChD,sBAAoB;AACpB,yBAAuB;AACzB;AAaA,eAAsB,gCAAiD;AACrE,QAAMA,UAAS,wBAAwB;AACvC,QAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;AAC7B,MAAI,mBAAmB;AACrB,QAAI,OAAO,oBAAoB,aAAa,IAAI,QAAQ;AAAA,EAC1D;AAEA,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAcA,SAAQ,CAAC,WAAW,gBAAgB,GAAG;AAAA,MAC5E;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,WAAO,OAAO,KAAK;AAAA,EACrB,SAAS,KAAc;AACrB,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAM,IAAI;AAAA,MACR,wCAAwCA,OAAM,mIAEa,OAAO;AAAA,IACpE;AAAA,EACF;AACF;AAeO,SAAS,oBAAoB,KAAqB;AAGvD,MAAI,IAAI,SAAS,IAAI,GAAG;AACtB,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAGA,MAAI,wBAAwB,KAAK,GAAG,GAAG;AAErC,UAAM,IAAI,MAAM,0EAA0E;AAAA,EAC5F;AAEA,SAAO;AACT;AAQO,SAAS,qBAAqB,MAA0B;AAC7D,SAAO,KAAK,IAAI,mBAAmB;AACrC;AAMA,SAAS,mBAAmB,eAAgE;AAC1F,QAAM,UAAkC,CAAC;AAGzC,aAAW,OAAO,eAAe;AAC/B,QAAI,QAAQ,IAAI,GAAG,MAAM,QAAW;AAClC,cAAQ,GAAG,IAAI,QAAQ,IAAI,GAAG;AAAA,IAChC;AAAA,EACF;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AACtD,QAAI,UAAU,UAAa,kBAAkB,KAAK,YAAU,IAAI,WAAW,MAAM,CAAC,GAAG;AACnF,cAAQ,GAAG,IAAI;AAAA,IACjB;AAAA,EACF;AAOA,MAAI,qBAAqB,QAAQ,MAAM;AACrC,YAAQ,OAAO,GAAG,iBAAiB,GAAG,SAAS,GAAG,QAAQ,IAAI;AAAA,EAChE,WAAW,mBAAmB;AAC5B,YAAQ,OAAO;AAAA,EACjB;AAIA,MAAI,eAAe;AACjB,WAAO,OAAO,SAAS,aAAa;AAAA,EACtC;AAEA,SAAO;AACT;AAaA,eAAsB,kBAAkB,SAA2D;AACjG,MAAI;AACF,UAAM,EAAE,SAAS,MAAM,KAAK,UAAU,KAAQ,IAAI,IAAI;AAGtD,QAAI,CAAC,iBAAiB,OAAO,GAAG;AAC9B,YAAM,IAAI,MAAM,wBAAwB,OAAO,8CAA8C;AAAA,IAC/F;AAGA,QAAI,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KACtE,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,IAAI,KACvE,QAAQ,SAAS,IAAI,GAAG;AAC1B,YAAM,IAAI,MAAM,mDAAmD,OAAO,EAAE;AAAA,IAC9E;AAIA,UAAM,gBAAgB,qBAAqB,IAAI;AAE/C,WAAO,KAAK,0BAA0B,OAAO,IAAI,EAAE,MAAM,eAAe,KAAK,QAAQ,CAAC;AAEtF,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA,KAAK,mBAAmB,GAAG;AAAA,IAC7B;AAIA,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,cAAc,SAAS,eAAe,WAAW;AAElF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EAEF,SAAS,OAAgB;AACvB,WAAO,MAAM,iCAAiC,KAAK;AAEnD,UAAM,MAAM;AACZ,UAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,KAAK;AACtE,UAAM,WAAW,IAAI,QAAQ;AAE7B,WAAO;AAAA,MACL,QAAQ,IAAI,UAAU;AAAA,MACtB,QAAQ,IAAI,UAAU;AAAA,MACtB,SAAS;AAAA,MACT,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,gBAAgB,YAAoB,SAA4C;AAC9F,QAAM,OAAO,CAAC,UAAU;AAIxB,QAAM,qBAAqB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAEjE,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,IACF;AAEA,UAAM,iBAAiB,IAAI,WAAW,KAAK,mBAAmB,IAAI,GAAG;AAErE,QAAI,OAAO,UAAU,WAAW;AAC9B,UAAI,OAAO;AACT,aAAK,KAAK,iBAAiB,IAAI,GAAG,KAAK,KAAK,GAAG,EAAE;AAAA,MACnD;AAAA,IACF,WAAW,MAAM,QAAQ,KAAK,GAAG;AAE/B,iBAAW,QAAQ,OAAO;AACxB,YAAI,gBAAgB;AAElB,eAAK,KAAK,IAAI,GAAG,IAAI,OAAO,IAAI,CAAC,EAAE;AAAA,QACrC,OAAO;AAEL,eAAK,KAAK,KAAK,GAAG,IAAI,OAAO,IAAI,CAAC,EAAE;AAAA,QACtC;AAAA,MACF;AAAA,IACF,OAAO;AAEL,UAAI,gBAAgB;AAElB,aAAK,KAAK,IAAI,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE;AAAA,MACtC,OAAO;AACL,aAAK,KAAK,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,aAAa,YAAoB,SAA4C;AAC3F,QAAM,OAAO,CAAC,UAAU;AAExB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,WAAW;AAC9B,UAAI,OAAO;AACT,aAAK,KAAK,KAAK,GAAG,EAAE;AAAA,MACtB;AAAA,IACF,WAAW,MAAM,QAAQ,KAAK,GAAG;AAE/B,iBAAW,QAAQ,OAAO;AACxB,aAAK,KAAK,KAAK,GAAG,IAAI,OAAO,IAAI,CAAC;AAAA,MACpC;AAAA,IACF,OAAO;AAEL,WAAK,KAAK,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AAQA,eAAsB,qBACpB,YACA,SACA,iBAA2B,CAAC,GAC5B,KAC6B;AAC7B,QAAM,OAAO,gBAAgB,YAAY,OAAO;AAChD,OAAK,KAAK,GAAG,cAAc;AAE3B,SAAO,kBAAkB;AAAA,IACvB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAKA,eAAsB,kBACpB,YACA,SACA,iBAA2B,CAAC,GACC;AAC7B,QAAM,OAAO,aAAa,YAAY,OAAO;AAC7C,OAAK,KAAK,GAAG,cAAc;AAE3B,SAAO,kBAAkB;AAAA,IACvB,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAKA,eAAsB,eAAe,SAAiB,YAAsC;AAC1F,QAAM,OAAO,aAAa,CAAC,YAAY,QAAQ,IAAI,CAAC,QAAQ;AAE5D,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,OAAO,UAAU,OAAO,UAAU;AAC3C;AAKA,eAAsB,sBAAsB,SAAmC;AAC7E,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB;AAAA,MACrC,SAAS;AAAA,MACT,MAAM,CAAC,OAAO;AAAA,IAChB,CAAC;AACD,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA9fA,IAUM,eAmBA,kBAUF,cAIE,eAiBA,mBAiBA,yBAoCF,mBAGA;AApHJ;AAAA;AAAA;AAQA;AAEA,IAAM,gBAAgB,UAAU,QAAQ;AAmBxC,IAAM,mBAAmB,oBAAI,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,IAAI,eAAmC;AAIvC,IAAM,gBAAgB;AAAA,MACpB;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAIA,IAAM,oBAAoB;AAAA,MACxB;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAcA,IAAM,0BAA0B;AAoChC,IAAI,oBAAmC;AAAA;AAAA;;;ACjHvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,SAAS,WAAAC,UAAS,eAAe;AACjC,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,qBAAqB;AAa9B,SAAS,oBAAoB,KAAsB;AACjD,QAAM,aAAa,IAAI,QAAQ,OAAO,GAAG;AACzC,SAAO,mBAAmB,KAAK,UAAU;AAC3C;AAQO,SAAS,kBAAkB,aAAqB,WAAmB;AACxE,SAAO,oBAAoB,UAAU,IACjC,QAAQ,YAAY,MAAM,IAAI,IAC9B,QAAQ,YAAY,IAAI;AAC9B;AASO,SAAS,oBAAoB,aAA8B;AAChE,QAAM,UAAU,eAAe,kBAAkB;AACjD,QAAM,YAAY,QAAQ,SAAS,IAAI;AAGvC,MAAI;AACF,UAAM,gBAAgB,QAAQ,WAAW,cAAc;AACvD,QAAID,YAAW,aAAa,GAAG;AAC7B,YAAM,YAAY,KAAK,MAAMC,cAAa,eAAe,MAAM,CAAC;AAChE,UAAI,UAAU,YAAY;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AASO,SAAS,yBAAyB,UAAkB,aAA8B;AACvF,QAAM,UAAU,eAAe,kBAAkB;AACjD,SAAO,QAAQ,SAAS,MAAM,UAAU,SAAS,KAAK;AACxD;AAQO,SAAS,oBAA4B;AAC1C,MAAI,mBAAmB,OAAW,QAAO;AACzC,MAAI;AACF,UAAM,UAAU,QAAQ,kBAAkB,GAAG,cAAc;AAC3D,UAAM,MAAM,KAAK,MAAMA,cAAa,SAAS,MAAM,CAAC;AACpD,qBAAiB,IAAI,WAAW;AAAA,EAClC,QAAQ;AACN,qBAAiB;AAAA,EACnB;AACA,SAAO;AACT;AAcO,SAAS,sBAA8B;AAC5C,MAAI,QAAQ,IAAI,sBAAsB;AACpC,WAAO,QAAQ,IAAI;AAAA,EACrB;AAGA,MAAI,qBAAqB,gBAAgB;AACvC,WAAO,QAAQ,IAAI;AAAA,EACrB;AACA,SAAO;AACT;AAhIA,IAqBM,YACA,WAuEF,gBAsCS,gBACA;AApIb;AAAA;AAAA;AAqBA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAYF,SAAQ,UAAU;AA6G7B,IAAM,iBAAiB,kBAAkB;AACzC,IAAM,mBAAmB,oBAAoB,cAAc;AAAA;AAAA;;;AC/HlE,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,qCAAqC;AAC9C,OAAO,aAAa;AACpB,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,SAAS,WAAAG,iBAAe;AACxB,SAAS,iBAAAC,sBAAqB;;;ACR9B,SAAS,KAAAC,UAAS;;;ACElB;AACA;AAFA,SAAS,SAAS;;;ACDlB;AACA;AACA,SAAS,eAAe,oBAAoB;AAC5C,SAAS,WAAAC,UAAS,cAAAC,mBAAkB;AACpC,SAAS,iBAAiB;AAoBnB,IAAM,sBAAsB;AAAA,EACjC,eAAe;AAAA,EACf,cAAc;AAAA,EACd,iBAAiB;AACnB;AAOA,eAAsB,qBAAqB,WAA2C;AACpF,MAAI;AACF,UAAM,eAAe,aAAa,WAAW,OAAO;AACpD,UAAM,WAA0B,CAAC;AAGjC,UAAM,YAAY,aAAa,MAAM,kBAAkB;AACvD,QAAI,UAAW,UAAS,OAAO,UAAU,CAAC;AAE1C,UAAM,YAAY,aAAa,MAAM,cAAc;AACnD,QAAI,UAAW,UAAS,OAAO,UAAU,CAAC,EAAE,KAAK;AAEjD,UAAM,YAAY,aAAa,MAAM,qBAAqB;AAC1D,QAAI,UAAW,UAAS,cAAc,UAAU,CAAC,EAAE,KAAK;AAExD,UAAM,UAAU,aAAa,MAAM,YAAY;AAC/C,QAAI,QAAS,UAAS,KAAK,QAAQ,CAAC,EAAE,KAAK;AAE3C,UAAM,YAAY,aAAa,MAAM,cAAc;AACnD,QAAI,WAAW;AACb,eAAS,OAAO,UAAU,CAAC,EAAE,MAAM,KAAK,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAAA,IACpE;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,MAAM,qCAAqC,KAAK;AACvD,WAAO,CAAC;AAAA,EACV;AACF;AAKA,eAAsB,wBACpB,UACA,YACgC;AAChC,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,EAAE,QAAQ,OAAO;AAAA,MACjB,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,+BAA+B,OAAO,UAAU,OAAO,KAAK;AAAA,MACrE;AAAA,IACF;AAEA,UAAM,oBAAoB,cAAc,SAAS,QAAQ,SAAS,OAAO;AAGzE,cAAUD,SAAQ,iBAAiB,GAAG,EAAE,WAAW,KAAK,CAAC;AAGzD,kBAAc,mBAAmB,OAAO,MAAM;AAE9C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS,OAAO;AAAA,IAClB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,2BAA2B,KAAK;AAAA,IACzC;AAAA,EACF;AACF;AAKA,eAAsB,uBACpB,UACA,YACgC;AAChC,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,EAAE,QAAQ,MAAM;AAAA,MAChB,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,+BAA+B,OAAO,UAAU,OAAO,KAAK;AAAA,MACrE;AAAA,IACF;AAEA,UAAM,oBAAoB,cAAc,SAAS,QAAQ,SAAS,MAAM;AAGxE,cAAUA,SAAQ,iBAAiB,GAAG,EAAE,WAAW,KAAK,CAAC;AAGzD,kBAAc,mBAAmB,OAAO,MAAM;AAE9C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS,OAAO;AAAA,IAClB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,0BAA0B,KAAK;AAAA,IACxC;AAAA,EACF;AACF;AAKA,eAAsB,yBACpB,UACA,WACA,YACgC;AAChC,MAAI;AAEF,UAAM,WAAW,MAAM,qBAAqB,SAAS;AAErD,QAAI,SAAS,SAAS,SAAS;AAC7B,aAAO,MAAM,qCAAqC,SAAS,IAAI,6DAA6D;AAC5H,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,qCAAqC,SAAS,IAAI;AAAA,MAC3D;AAAA,IACF;AAGA,UAAM,aAAa,MAAM;AAAA,MACvB;AAAA,MACA,EAAE,QAAQ,OAAO;AAAA,MACjB,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,+BAA+B,WAAW,UAAU,WAAW,KAAK;AAAA,MAC7E;AAAA,IACF;AAGA,QAAI;AACJ,QAAI;AACF,qBAAe,KAAK,MAAM,WAAW,MAAM;AAAA,IAC7C,SAAS,YAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,uCAAuC,UAAU;AAAA,MAC1D;AAAA,IACF;AAGA,UAAM,iBAAiB,gCAAgC,cAAc,QAAQ;AAE7E,UAAM,oBAAoB,cAAc,SAAS,QAAQ,SAAS,KAAK;AAGvE,cAAUA,SAAQ,iBAAiB,GAAG,EAAE,WAAW,KAAK,CAAC;AAGzD,kBAAc,mBAAmB,cAAc;AAE/C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,oCAAoC,KAAK;AAAA,IAClD;AAAA,EACF;AACF;AAKA,SAAS,gCAAgC,cAAuB,UAAiC;AAC/F,QAAM,YAAY,iBAAiB,SAAS,QAAQ,sBAAsB;AAC1E,QAAM,YAAY,iBAAiB,SAAS,eAAe,6CAA6C;AAExG,MAAI,iBAAiB,KAAK,SAAS;AAAA;AAAA,EAAO,SAAS;AAAA;AAAA;AAGnD,MAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAAU;AACrD,sBAAkB;AAClB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,aAAa,UAAU;AAEtC,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,sBAAkB;AAClB,WAAO;AAAA,EACT;AAEA,oBAAkB;AAGlB,QAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAM,QAAQ,oBAAI,IAAY;AAG9B,SAAO,QAAQ,CAAC,OAAgB,UAAkB;AAChD,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,GAAG;AAE7C,YAAM,SAAS,eAAe,MAAM,CAAC,GAAG,SAAS,KAAK,QAAQ,KAAK,IAAI;AACvE,YAAM,SAAS,eAAe,MAAM,CAAC,GAAG,SAAS,KAAK,QAAQ,KAAK,IAAI;AACvE,YAAM,QAAQ,MAAM,CAAC,GAAG,SAAS,KAAK;AAGtC,YAAM,IAAI,MAAM;AAChB,YAAM,IAAI,MAAM;AAGhB,YAAM,SAAS,GAAG,MAAM,IAAI,MAAM;AAClC,UAAI,CAAC,MAAM,IAAI,MAAM,GAAG;AACtB,YAAI,OAAO;AACT,4BAAkB,OAAO,MAAM,QAAQ,cAAc,KAAK,CAAC,KAAK,MAAM;AAAA;AAAA,QACxE,OAAO;AACL,4BAAkB,OAAO,MAAM,QAAQ,MAAM;AAAA;AAAA,QAC/C;AACA,cAAM,IAAI,MAAM;AAAA,MAClB;AAAA,IACF,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AAEtD,YAAM,SAAS,eAAe,MAAM,QAAQ,SAAS,KAAK,MAAM,MAAM,SAAS,KAAK,QAAQ,KAAK,MAAM;AACvG,YAAM,SAAS,eAAe,MAAM,QAAQ,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ,KAAK,MAAM;AACrG,YAAM,QAAQ,MAAM,OAAO,SAAS,KAAK,MAAM,UAAU,SAAS,KAAK;AAEvE,YAAM,IAAI,MAAM;AAChB,YAAM,IAAI,MAAM;AAEhB,YAAM,SAAS,GAAG,MAAM,IAAI,MAAM;AAClC,UAAI,CAAC,MAAM,IAAI,MAAM,GAAG;AACtB,YAAI,OAAO;AACT,4BAAkB,OAAO,MAAM,QAAQ,cAAc,KAAK,CAAC,KAAK,MAAM;AAAA;AAAA,QACxE,OAAO;AACL,4BAAkB,OAAO,MAAM,QAAQ,MAAM;AAAA;AAAA,QAC/C;AACA,cAAM,IAAI,MAAM;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAC;AAGD,MAAI,MAAM,SAAS,KAAK,MAAM,OAAO,GAAG;AACtC,UAAM,YAAY,MAAM,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE;AAC/C,cAAU,QAAQ,CAAC,MAAM,UAAU;AACjC,UAAI,UAAU,GAAG;AACf,0BAAkB,OAAO,IAAI,IAAI,cAAc,IAAI,CAAC;AAAA;AAAA,MACtD,OAAO;AACL,0BAAkB,OAAO,UAAU,CAAC,CAAC,QAAQ,IAAI;AAAA;AAAA,MACnD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,oBAAkB;AAGlB,oBAAkB;AAAA;AAAA;AAClB,oBAAkB,kBAAkB,MAAM,IAAI;AAAA;AAC9C,oBAAkB,kBAAkB,MAAM,IAAI;AAAA;AAC9C,oBAAkB,6BAA6B,OAAO,MAAM;AAAA;AAE5D,SAAO;AACT;AAKA,SAAS,eAAe,IAAoB;AAC1C,SAAO,GACJ,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,SAAS,KAAK,EACtB,UAAU,GAAG,EAAE;AACpB;AAKA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MACJ,QAAQ,kBAAkB,EAAE,EAC5B,QAAQ,QAAQ,GAAG,EACnB,KAAK,EACL,UAAU,GAAG,EAAE;AACpB;AAKA,SAAS,iBAAiB,SAAyB;AACjD,SAAO,QACJ,QAAQ,WAAW,EAAE,EACrB,QAAQ,OAAO,GAAG,EAClB,QAAQ,QAAQ,GAAG,EACnB,KAAK,EACL,UAAU,GAAG,GAAG;AACrB;AAKA,eAAsB,qBACpB,UACA,WACA,oBACA,YACgC;AAChC,MAAI;AAEF,UAAM,WAAW,sBAAsB;AAEvC,WAAO,KAAK,2CAA2C,QAAQ,EAAE;AAGjE,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO,MAAM,wBAAwB,UAAU,UAAU;AAAA,MAE3D,KAAK;AACH,eAAO,MAAM,uBAAuB,UAAU,UAAU;AAAA,MAE1D,KAAK;AACH,eAAO,MAAM,yBAAyB,UAAU,WAAW,UAAU;AAAA,MAEvE;AAEE,YAAIC,YAAW,QAAQ,GAAG;AACxB,iBAAO,MAAM,yBAAyB,UAAU,WAAW,UAAU,UAAU;AAAA,QACjF,OAAO;AACL,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,OAAO,gCAAgC,QAAQ,mCAAmC,OAAO,KAAK,mBAAmB,EAAE,KAAK,IAAI,CAAC;AAAA,UAC/H;AAAA,QACF;AAAA,IACJ;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,4BAA4B,KAAK;AAAA,IAC1C;AAAA,EACF;AACF;AAKA,eAAe,yBACb,WACA,YACA,aACA,aACgC;AAIhC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;;;ACvZA,SAAS,aAAAC,YAAW,cAAAC,mBAAkB;AACtC,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,mBAAmB;;;ACK5B;AAFA,SAAS,aAAAC,YAAW,mBAAmB;AACvC,SAAS,cAAAC,aAAY,MAAM,WAAAC,gBAAe;AAY1C,IAAM,mBAAmB,QAAQ,IAAI,qBAChCD,YAAW,QAAQ,IAAI,kBAAkB,IACtC,QAAQ,IAAI,qBACZC,SAAQ,QAAQ,IAAI,GAAG,QAAQ,IAAI,kBAAkB,IACzD,KAAK,kBAAkB,GAAG,MAAM;AAK7B,SAAS,oBAA4B;AAC1C,EAAAF,WAAU,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAC/C,SAAO;AACT;AAWO,SAAS,qBAAqB,QAAwB;AAC3D,QAAM,OAAO,kBAAkB;AAC/B,SAAO,YAAY,KAAK,MAAM,MAAM,CAAC;AACvC;AAWO,SAAS,iBAAiB,MAAsB;AACrD,QAAM,MAAM,KAAK,kBAAkB,GAAG,IAAI;AAC1C,EAAAA,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,SAAO;AACT;;;ADlDA,SAAS,qBAAqB,SAAiB,YAA4B;AACzE,QAAM,UAAUG,SAAQ,OAAO;AAC/B,QAAM,YAAYA,SAAQ,UAAU;AACpC,MAAI,CAAC,UAAU,WAAW,UAAU,GAAG,KAAK,cAAc,SAAS;AACjE,UAAM,IAAI,MAAM,iEAAiE,OAAO,EAAE;AAAA,EAC5F;AACA,SAAO;AACT;AAQO,SAAS,wBAAwB,QAAyB;AAE/D,QAAM,aAAa,QAAQ,IAAI,wBAAwB,iBAAiB,YAAY;AAGpF,MAAI,QAAQ;AACV,UAAM,YAAY,qBAAqB,YAAY,MAAM;AACzD,QAAI,CAACC,YAAW,SAAS,GAAG;AAC1B,MAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAKA,MAAI,CAACD,YAAW,UAAU,GAAG;AAC3B,IAAAC,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AAGA,QAAMC,cAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,WAAW,YAAY,CAAC,EAAE,SAAS,KAAK;AAC9C,QAAM,eAAeC,MAAK,YAAY,aAAaD,UAAS,IAAI,QAAQ,EAAE;AAE1E,EAAAD,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAE3C,SAAO;AACT;;;AF9CA;AACA,SAAS,iBAAAG,gBAAe,QAAQ,cAAAC,aAAY,aAAAC,kBAAiB;AAC7D,SAAS,YAAAC,WAAU,WAAAC,UAAS,cAAAC,aAAY,QAAAC,OAAM,WAAAC,gBAAe;AAkBtD,IAAM,4BAA4B,CACvC,QACA,YACW;AACX,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,6BAA6B,OAAO,YAAY,SAAS;AAAA,EAAO,OAAO,SAAS,OAAO,MAAM;AAAA,EACtG;AAEA,MAAI,SAAS;AAEb,MAAI,OAAO,QAAQ;AACjB,cAAU,OAAO;AAAA,EACnB;AAEA,MAAI,OAAO,QAAQ;AACjB,QAAI,QAAQ;AACV,gBAAU;AAAA,IACZ;AACA,cAAU,OAAO;AAAA,EACnB;AAEA,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAKO,SAAS,gBAAgB,QAAmB,YAAqC;AACtF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EACpB,IAAI;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,WAAoC;AAEzC,YAAM,oBAA8B,CAAC;AAErC,UAAI;AACF,eAAO,KAAK,uBAAuB,IAAI,IAAI,EAAE,SAAS,YAAY,OAAO,CAAC;AAM1E,cAAM,4BAA4B,SAAS,2BAA2B,SAAS,wBAAwB,SAAS,gCAAgC,SAAS;AAEzJ,cAAM,kBAAkB,4BACpB;AAAA,UACE,aAAa,OAAO,eAAe,CAAC;AAAA,UACpC,OAAO,OAAO;AAAA,UACd,MAAM,OAAO;AAAA,UACb,KAAK,OAAO;AAAA,UACZ,SAAS,OAAO;AAAA,UAChB,OAAO,OAAO;AAAA,UACd,OAAO,OAAO;AAAA,UACd,WAAW,OAAO;AAAA,UAClB,eAAe,OAAO;AAAA,UACtB,WAAW,OAAO;AAAA,UAClB,aAAa,OAAO;AAAA,UACpB,gBAAgB,OAAO;AAAA,UACvB,gBAAgB,OAAO;AAAA,UACvB,mBAAmB,OAAO;AAAA,UAC1B,oBAAoB,OAAO;AAAA,UAC3B,kBAAkB,OAAO;AAAA,UACzB,WAAW,OAAO;AAAA,UAClB,QAAQ,OAAO;AAAA,UACf,OAAO,OAAO;AAAA,QAChB,IACA;AAAA,UACE,aAAa,OAAO,eAAe,CAAC;AAAA,UACpC,OAAO,OAAO;AAAA,UACd,MAAM,OAAO;AAAA,UACb,KAAK,OAAO;AAAA,UACZ,SAAS,OAAO;AAAA,UAChB,OAAO,OAAO;AAAA,UACd,OAAO,OAAO;AAAA,UACd,WAAW,OAAO;AAAA,UAClB,eAAe,OAAO;AAAA,UACtB,WAAW,OAAO;AAAA,UAClB,aAAa,OAAO;AAAA,UACpB,gBAAgB,OAAO;AAAA,UACvB,gBAAgB,OAAO;AAAA,UACvB,QAAQ,OAAO;AAAA,UACf,mBAAmB,OAAO;AAAA,UAC1B,oBAAoB,OAAO;AAAA,UAC3B,kBAAkB,OAAO;AAAA,UACzB,WAAW,OAAO;AAAA,UAClB,QAAQ,OAAO;AAAA,UACf,OAAO,OAAO;AAAA,QAChB;AAEJ,cAAM;AAAA,UACJ,cAAc,CAAC;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,mBAAmB;AAAA,UACnB,oBAAoB;AAAA,UACpB,kBAAkB;AAAA,UAClB;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,QACF,IAAI;AAGJ,cAAM,UAAU,EAAC,GAAG,OAAM;AAC1B,eAAO,KAAK,eAAe,EAAE,QAAQ,SAAO,OAAO,QAAQ,GAAG,CAAC;AAC/D,YAAI,iBAAiB,MAAM,QAAQ,WAAW,IAAI,cAA0B,CAAC,WAAqB;AAGlG,YAAI,SAAS,MAAM,QAAQ,KAAK,GAAG;AACjC,2BAAiB,CAAC,GAAG,gBAAgB,GAAG,KAAiB;AAAA,QAC3D;AAGA,YAAI,QAAQ,KAAK,WAAW,cAAc,GAAG;AAC3C,2BAAiB,CAAC,GAAG,gBAAgB,IAAc;AAAA,QACrD;AAGA,YAAI,SAAS,SAAS,wBAAwB;AAC5C,2BAAiB,CAAC,GAAG,gBAAgB,KAAe;AAAA,QACtD;AAGA,YAAI,QAAQ,YAAY,SAAS,2BAA2B;AAC1D,2BAAiB,CAAC,GAAG,gBAAgB,QAAQ,QAAkB;AAC/D,iBAAO,QAAQ;AAAA,QACjB;AAGA,YAAI,QAAQ,YAAY,SAAS,0BAA0B;AACzD,2BAAiB,CAAC,GAAG,gBAAgB,QAAQ,QAAkB;AAC/D,iBAAO,QAAQ;AAAA,QACjB;AAGA,YAAI,SAAS,2BAA2B;AACtC,cAAI,QAAQ,UAAU;AACpB,6BAAiB,CAAC,GAAG,gBAAgB,QAAQ,QAAkB;AAC/D,mBAAO,QAAQ;AAAA,UACjB;AACA,cAAI,QAAQ,SAAS;AACnB,6BAAiB,CAAC,GAAG,gBAAgB,QAAQ,OAAiB;AAC9D,mBAAO,QAAQ;AAAA,UACjB;AAAA,QACF;AAGA,YAAI,SAAS,SAAS,8BAA8B;AAClD,2BAAiB,CAAC,GAAG,gBAAgB,KAAe;AAAA,QACtD;AAGA,YAAI,OAAQ,SAAS,kBAAmB;AACtC,2BAAiB,CAAC,GAAG,gBAAgB,GAAa;AAAA,QACpD;AAGA,gBAAQ,MAAM;AAAA,UACZ,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAKH,gBAAI,SAAS,MAAM,QAAQ,KAAK,GAAG;AACjC,oBAAM,UAAU,oBAAoB;AACpC,+BAAiB,CAAC,GAAG,gBAAgB,GAAI,MAAmB;AAAA,gBAC1D,OAAKC,YAAW,CAAC,IAAI,IAAIC,SAAQ,SAAS,CAAC;AAAA,cAC7C,CAAC;AAAA,YACH;AACA;AAAA,UAEF,KAAK,oBAAoB;AAEvB,gBAAI,QAAQ,YAAY,OAAO,QAAQ,aAAa,YAAY,CAACD,YAAW,QAAQ,QAAQ,GAAG;AAC7F,sBAAQ,WAAWC,SAAQ,oBAAoB,GAAG,QAAQ,QAAQ;AAClE,qBAAO,KAAK,8BAA8B,QAAQ,QAAQ,EAAE;AAAA,YAC9D;AAGA,kBAAM,gBAAgB,MAAM,iBAAiB,QAAQ,MAAM;AAC3D,gBAAI,eAAe;AACjB,+BAAiB,CAAC,GAAG,gBAAgB,aAAa;AAAA,YACpD,WAAW,OAAO;AAChB,+BAAiB,CAAC,GAAG,gBAAgB,KAAe;AAAA,YACtD;AAGA,gBAAI,cAAc,cAAc,aAAa;AAG3C,oBAAM,YAAa,YAAuB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAChF,kBAAI;AACJ,kBAAI;AACJ,kBAAI;AACF,0BAAU,qBAAqB,kBAAkB;AACjD,kCAAkB,KAAK,OAAO;AAC9B,0BAAUC,MAAK,SAAS,yBAAyB;AAGjD,sBAAM,aAAa,UAAU,KAAK,IAAI,IAAI;AAE1C,gBAAAC,eAAc,SAAS,YAAY,MAAM;AAAA,cAC3C,SAAS,KAAK;AACZ,uBAAO,MAAM,sEAAsE,WAAW,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAChK,sBAAM;AAAA,cACR;AAGA,oBAAM,kBAAkB,QAAQ,YAAY,CAAC;AAC7C,oBAAM,gBAAgB,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC,eAAe;AACzF,4BAAc,KAAK,uBAAuB,OAAO,EAAE;AACnD,sBAAQ,WAAW;AAEnB,qBAAO,KAAK,qCAAqC,OAAO,eAAe,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,YAC/F;AAGA,gBAAI,cAAc,mBAAmB,gBAAgB;AACnD,oBAAM,gBAAiB,eAA0B,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AACvF,kBAAI;AACJ,kBAAI;AACJ,kBAAI;AACF,0BAAU,qBAAqB,kBAAkB;AACjD,kCAAkB,KAAK,OAAO;AAC9B,0BAAUD,MAAK,SAAS,oBAAoB;AAG5C,sBAAM,aAAa,cAAc,KAAK,IAAI,IAAI;AAE9C,gBAAAC,eAAc,SAAS,YAAY,MAAM;AAAA,cAC3C,SAAS,KAAK;AACZ,uBAAO,MAAM,2EAA2E,WAAW,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACrK,sBAAM;AAAA,cACR;AAGA,oBAAM,kBAAkB,QAAQ,YAAY,CAAC;AAC7C,oBAAM,gBAAgB,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC,eAAe;AACzF,4BAAc,KAAK,kBAAkB,OAAO,EAAE;AAC9C,sBAAQ,WAAW;AAEnB,qBAAO,KAAK,qCAAqC,OAAO,mBAAmB,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,YACvG;AAGA,gBAAI,cAAc,iBAAiB,gBAAgB;AACjD,oBAAM,gBAAiB,eAA0B,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AACvF,kBAAI;AACJ,kBAAI;AACJ,kBAAI;AACF,0BAAU,qBAAqB,kBAAkB;AACjD,kCAAkB,KAAK,OAAO;AAC9B,0BAAUD,MAAK,SAAS,oBAAoB;AAG5C,sBAAM,aAAa,cAAc,KAAK,IAAI,IAAI;AAE9C,gBAAAC,eAAc,SAAS,YAAY,MAAM;AAAA,cAC3C,SAAS,KAAK;AACZ,uBAAO,MAAM,yEAAyE,WAAW,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACnK,sBAAM;AAAA,cACR;AAGA,oBAAM,kBAAkB,QAAQ,YAAY,CAAC;AAC7C,oBAAM,gBAAgB,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC,eAAe;AACzF,4BAAc,KAAK,kBAAkB,OAAO,EAAE;AAC9C,sBAAQ,WAAW;AAEnB,qBAAO,KAAK,qCAAqC,OAAO,mBAAmB,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,YACvG;AACA;AAAA,UACF;AAAA,UAEA,KAAK;AAAA,UACL,KAAK;AAEH,gBAAI,OAAO;AACT,+BAAiB,CAAC,GAAG,gBAAgB,KAAe;AAAA,YACtD;AACA;AAAA,UAEF,KAAK;AAEH,gBAAI,WAAW;AACb,+BAAiB,CAAC,GAAG,gBAAgB,SAAmB;AAAA,YAC1D;AACA;AAAA,UAEF;AAEE;AAAA,QACJ;AAGA,YAAI;AACJ,YAAI,SAAS,sBAAsB,SAAS,mBAAmB;AAC7D,wBAAc,wBAAwB,YAAkC;AACxE,iBAAO,KAAK,2BAA2B,IAAI,KAAK,WAAW,EAAE;AAG7D,gBAAM,gBAAgBD,MAAK,aAAa,WAAW;AACnD,UAAAC,eAAc,eAAe,KAAK,IAAI,EAAE,SAAS,GAAG,MAAM;AAG1D,kBAAQ,SAAS;AAGjB,cAAI,CAAC,QAAQ,WAAW;AACtB,oBAAQ,YAAY;AAAA,UACtB;AAGA,cAAI,SAAS,oBAAoB;AAG/B,gBAAI,CAAC,QAAQ,eAAe,GAAG;AAC7B,sBAAQ,eAAe,IAAID,MAAK,aAAa,qBAAqB;AAAA,YACpE;AAGA,gBAAI,CAAC,QAAQ,QAAQ;AACnB,sBAAQ,SAASA,MAAK,aAAa,cAAc;AAAA,YACnD;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AAEJ,YAAI,YAAY,UAAU;AAIxB,cAAI;AACJ,eAAK,SAAS,yBAAyB,SAAS,sBAAsB,OAAO,UAAU;AACrF,kBAAM,SAAU,OAAO;AAGvB,kBAAMF,YAAW,MAAM,IAAI,SAASC,SAAQ,oBAAoB,GAAG,MAAM;AAAA,UAC3E;AAMA,gBAAM,sBAAsBA,SAAQ,gBAAgB,MAAM,cAAc,UAAU;AAClF,gBAAM,sBAAsB,QAAQ,IAAI,4BAClCG,YAAW,mBAAmB,IAAI,sBAAsB;AAC9D,cAAI,wBAAwB,SAAS,qBAAqB,SAAS,sBAAsB,SAAS,yBAAyB;AACzH,oBAAQ,kBAAkB,IAAI;AAAA,UAChC;AAGA,cAAI,SAAS,mBAAmB;AAC9B,oBAAQ,gBAAgB,IAAI;AAAA,UAC9B;AAEA,mBAAS,MAAM,qBAAqB,YAAY,SAAS,gBAAgB,GAAG;AAAA,QAC9E,WAAW,YAAY,OAAO;AAC5B,mBAAS,MAAM,kBAAkB,YAAY,SAAS,cAAc;AAAA,QACtE,OAAO;AACL,gBAAM,IAAI,MAAM,wBAAwB,OAAO,EAAE;AAAA,QACnD;AAGA,YAAI,SAAS,sBAAsB,OAAO,WAAW,aAAa;AAEhE,gBAAM,WAAW,QAAQ;AACzB,gBAAM,YAAYF,MAAK,aAAa,eAAe;AAEnD,cAAIE,YAAW,QAAQ,GAAG;AACxB,gBAAI;AACF,oBAAM,cAAc,MAAM;AAAA,gBACxB;AAAA,gBACA,EAAE,QAAQ,gBAAgB,QAAQ,UAAU;AAAA,gBAC5C,CAAC,QAAQ;AAAA,cACX;AAEA,kBAAI,YAAY,SAAS;AACvB,uBAAO,KAAK,qCAAqC,SAAS,EAAE;AAAA,cAC9D;AAAA,YACF,SAAS,OAAO;AACd,qBAAO,KAAK,4CAA4C,KAAK,EAAE;AAAA,YACjE;AAAA,UACF;AAGA,mBAAS,MAAM,uBAAuB,QAAQ,QAAQ,MAAM;AAAA,QAC9D;AAGA,cAAM,kBAAkB,gBAAgB,QAAQ,MAAM;AAEtD,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,UACD,SAAS,CAAC,OAAO;AAAA,QACnB;AAAA,MAEF,SAAS,OAAO;AACd,eAAO,MAAM,qBAAqB,IAAI,KAAK,KAAK;AAEhD,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC7F,CAAC;AAAA,UACD,SAAS;AAAA,QACX;AAAA,MACF,UAAE;AAEA,mBAAW,WAAW,mBAAmB;AACvC,cAAI;AACF,mBAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAChD,mBAAO,KAAK,mCAAmC,OAAO,EAAE;AAAA,UAC1D,SAAS,cAAc;AACrB,mBAAO,MAAM,0CAA0C,OAAO,KAAK,YAAY;AAAA,UACjF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,sBAAsB;AAAA,EACjC,UAAU,MAAM,EAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,EAEjE,OAAO,MAAM,EAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,EAEtE,QAAQ,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,EAE/D,cAAc,MAAM,EAAE,KAAK,CAAC,OAAO,QAAQ,QAAQ,gBAAgB,aAAa,CAAC,EAAE,SAAS,EACzF,SAAS,2BAA2B;AAAA,EAEvC,UAAU,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,EAErE,SAAS,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,EAExE,KAAK,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,EAErE,SAAS,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oBAAoB;AAAA,EAElE,SAAS,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,EAEtE,gBAAgB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAEjG,gBAAgB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,sBAAsB,EACjF,UAAU,CAAC,SAAS,EAAE,aAAa,IAAI,EAAE;AAC9C;AA0BO,IAAM,4BAA4B,MAAM,CAC7C,QACA,WACW;AACX,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,0BAA0B,QAAQ,MAAM;AAAA,EACjD;AAGA,MAAI,SAAS,OAAO;AAEpB,MAAI,OAAO,QAAQ;AACjB,cAAU;AAAA;AAAA,oBAAyB,OAAO,MAAM;AAAA,EAClD;AAEA,MAAI,OAAO,QAAQ;AACjB,cAAU;AAAA;AAAA;AAAA,EAAgC,OAAO,MAAM;AAAA,EACzD;AAEA,SAAO;AACT;AAKO,IAAM,gCAAgC,MAAM,CACjD,QACA,WACW;AACX,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,0BAA0B,QAAQ,MAAM;AAAA,EACjD;AAEA,MAAI,SAAS;AAEb,MAAI,OAAO,YAAY,OAAO,aAAa;AACzC,UAAM,SAAS,OAAO,aAAa,MAAM,QAAQ,OAAO,WAAW,IAAI,OAAO,YAAY,CAAC,IAAI,OAAO;AACtG,cAAU;AAAA;AAAA,qBAA0B,MAAM;AAAA,EAC5C;AAEA,MAAI,OAAO,QAAQ;AACjB,cAAU;AAAA;AAAA;AAAA,EAAgB,OAAO,MAAM;AAAA,EACzC;AAEA,MAAI,OAAO,QAAQ;AACjB,cAAU;AAAA;AAAA;AAAA,EAAgC,OAAO,MAAM;AAAA,EACzD;AAEA,SAAO;AACT;AAMA,eAAe,iBACb,QACAC,SACwB;AACxB,QAAM,EAAE,WAAW,eAAe,WAAW,MAAM,IAAI;AAGvD,MAAI,aAAa,OAAO;AACtB,IAAAA,QAAO,MAAM,+JAA+J;AAC5K,UAAM,IAAI,MAAM,+JAA+J;AAAA,EACjL;AAGA,MAAI,CAAC,WAAW;AACd,WAAO,SAAmB;AAAA,EAC5B;AAGA,MAAI,CAAC,eAAe;AAClB,IAAAA,QAAO,MAAM,gJAAgJ;AAC7J,UAAM,IAAI,MAAM,gJAAgJ;AAAA,EAClK;AAEA,MAAI;AAEF,UAAM,kBAAkB,yBAAyB,aAAuB;AACxE,UAAM,WAAW,aAAuB;AAExC,IAAAA,QAAO,KAAK,oBAAoB,SAAS,kBAAkB,aAAa,aAAa,QAAQ,EAAE;AAG/F,UAAM,EAAE,sBAAAC,sBAAqB,IAAI,MAAM;AACvC,UAAM,gBAAgB,MAAMA;AAAA,MAC1B;AAAA,MACA,EAAE,QAAQ,OAAO;AAAA,MACjB,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,CAAC,cAAc,SAAS;AAC1B,MAAAD,QAAO,MAAM,8BAA8B,cAAc,UAAU,cAAc,KAAK;AACtF,YAAM,IAAI,MAAM,8BAA8B,cAAc,UAAU,cAAc,KAAK,EAAE;AAAA,IAC7F;AAGA,QAAI;AACJ,QAAI;AACF,wBAAkB,KAAK,MAAM,cAAc,MAAM;AAAA,IACnD,SAAS,YAAY;AACnB,MAAAA,QAAO,MAAM,2CAA2C,UAAU;AAClE,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAGA,UAAM,gBAAgB,gBAAgB,KAAK,eAAa;AACtD,YAAM,WAAWE,UAAS,SAAS;AAEnC,aAAO,aAAa,GAAG,SAAS;AAAA,IAClC,CAAC;AAED,QAAI,CAAC,eAAe;AAClB,MAAAF,QAAO,MAAM,UAAU,SAAS,2BAA2B,QAAQ,yBAAyB,gBAAgB,IAAI,OAAKE,UAAS,CAAC,CAAC,CAAC;AACjI,YAAM,IAAI,MAAM,UAAU,SAAS,2BAA2B,QAAQ,GAAG;AAAA,IAC3E;AAEA,IAAAF,QAAO,KAAK,mBAAmB,SAAS,SAAS,aAAa,EAAE;AAChE,WAAO;AAAA,EAET,SAAS,OAAO;AACd,IAAAA,QAAO,MAAM,+BAA+B,KAAK;AACjD,UAAM;AAAA,EACR;AACF;AAKA,eAAe,kBACb,UACA,WACA,QACA,YACAA,SAC6B;AAC7B,MAAI;AAEF,UAAM,WAAW,MAAM,qBAAqB,SAAS;AAGrD,UAAM,gBAAgB,CAAC;AACvB,QAAI,CAAC,SAAS,GAAI,eAAc,KAAK,IAAI;AACzC,QAAI,CAAC,SAAS,KAAM,eAAc,KAAK,MAAM;AAE7C,QAAI,cAAc,SAAS,GAAG;AAC5B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO,4DAA4D,cAAc,KAAK,IAAI,CAAC;AAAA,MAC7F;AAAA,IACF;AAGA,UAAM,iBAAiB,SAAS,QAAQ,IAAI,QAAQ,mBAAmB,EAAE;AACzE,UAAM,eAAe,SAAS,MAAM,IAAI,QAAQ,qBAAqB,EAAE;AAGvE,UAAM,eAAe,CAAC,aAAa,QAAQ,KAAK;AAChD,QAAI,aAAa,SAAS,MAAM,KAAK,SAAS,SAAS,SAAS;AAC9D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO,WAAW,MAAM,2EAA2E,SAAS,IAAI;AAAA,MAClH;AAAA,IACF;AAGA,IAAAG,WAAUC,SAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAGlD,UAAM,SAAkC;AAAA,MACtC;AAAA,MACA,QAAQ;AAAA,MACR,GAAG,CAAC,QAAQ,aAAa,IAAI,MAAM,WAAW,EAAE;AAAA,IAClD;AAEA,IAAAJ,QAAO,KAAK,0BAA0B,QAAQ,gBAAgB,MAAM,OAAO,UAAU,EAAE;AAGvF,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO,kCAAkC,KAAK;AAAA,IAChD;AAAA,EACF;AACF;AAKA,SAAS,oBAAoB,QAAwB;AACnD,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAKA,eAAe,uBACb,QACA,QACAA,SAC6B;AAC7B,MAAI;AACF,UAAM,EAAE,QAAQ,mBAAmB,oBAAoB,kBAAkB,QAAQ,OAAO,WAAW,cAAc,IAAI;AAGrH,QAAI,CAAC,UAAU,CAAC,oBAAoB;AAClC,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,UAAM,WAAW;AAGjB,QAAI,YAA2B;AAE/B,QAAI,OAAO;AACT,kBAAY;AAAA,IACd,WAAW,aAAa,eAAe;AAErC,kBAAY,MAAM,iBAAiB,QAAQA,OAAM;AAAA,IACnD;AAEA,QAAI,CAAC,WAAW;AACd,MAAAA,QAAO,MAAM,2DAA2D;AACxE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ,OAAO,SAAS;AAAA,MAC1B;AAAA,IACF;AAGA,QAAI,QAAQ;AACV,YAAM,eAAe;AAGrB,UAAI,iBAAiB;AACrB,UAAI,CAAC,gBAAgB;AACnB,cAAM,MAAM,oBAAoB,YAAY;AAC5C,yBAAiB,SAAS,QAAQ,SAAS,GAAG;AAAA,MAChD;AAEA,MAAAA,QAAO,KAAK,mCAAmC,QAAQ,iBAAiB,YAAY,EAAE;AAGtF,YAAM,kBAAkB,MAAM;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAA;AAAA,MACF;AAEA,UAAI,gBAAgB,SAAS;AAC3B,YAAI,iBAAiB,OAAO;AAC5B,0BAAkB;AAAA;AAAA,sDAA2D,YAAY;AACzF,0BAAkB;AAAA,+BAAkC,cAAc;AAElE,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,QACV;AAAA,MACF,OAAO;AACL,QAAAA,QAAO,MAAM,gCAAgC,gBAAgB,KAAK;AAClE,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ,OAAO,SAAS;AAAA;AAAA,yCAA8C,gBAAgB,SAAS,gBAAgB,MAAM;AAAA,QACvH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,oBAAoB;AACtB,MAAAA,QAAO,KAAK,yFAAyF;AACrG,MAAAA,QAAO,KAAK,iCAAiC,QAAQ,oBAAoB,kBAAkB,EAAE;AAG7F,YAAM,mBAA0C,MAAM;AAAA,QACpD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,iBAAiB,SAAS;AAE5B,YAAI,iBAAiB,OAAO;AAE5B,YAAI,iBAAiB,YAAY;AAC/B,4BAAkB;AAAA;AAAA;AAClB,4BAAkB;AAAA,8BAAiC,iBAAiB,UAAU;AAAA,QAChF;AAEA,YAAI,iBAAiB,SAAS;AAC5B,4BAAkB;AAAA;AAAA;AAAA;AAClB,4BAAkB,iBAAiB;AAAA,QACrC;AAEA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,QACV;AAAA,MACF,OAAO;AAEL,QAAAA,QAAO,MAAM,4BAA4B,iBAAiB,KAAK;AAC/D,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ,OAAO,SAAS;AAAA;AAAA,qCAA0C,iBAAiB,KAAK;AAAA,QAC1F;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,IAAAA,QAAO,MAAM,sCAAsC,KAAK;AACxD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,OAAO,SAAS;AAAA;AAAA,oCAAyC,KAAK;AAAA,IACxE;AAAA,EACF;AACF;;;ADp3BO,IAAM,uBAA0C;AAAA,EACrD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOK,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,wBAAwB;AAAA,IAC5D,QAAQ,oBAAoB,OAAO;AAAA,IACnC,QAAQA,GAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,eAAe;AAAA,IACnE,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,IAC/E,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,IAC1E,eAAeA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,IACzE,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB,0BAA0B;AAC7C;;;AKvBA,SAAS,KAAAC,UAAS;AAGX,IAAM,qBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,yBAAyB;AAAA,IAC7D,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB,0BAA0B;AAC7C;;;AClBA,SAAS,KAAAC,UAAS;AAGX,IAAM,0BAA6C;AAAA,EACxD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,MAAMC,GAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,IACtD,QAAQA,GAAE,KAAK,CAAC,OAAO,gBAAgB,eAAe,aAAa,QAAQ,KAAK,CAAC,EAC9E,SAAS,0IAA0I;AAAA,IACtJ,QAAQ,oBAAoB,OAAO;AAAA,IACnC,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAClB,SAAS,sHAAsH;AAAA,IAClI,aAAaA,GAAE,OAAO,EAAE,SAAS,EAC9B,SAAS,2EAA2E;AAAA,IACvF,2BAA2BA,GAAE,QAAQ,EAAE,SAAS,EAC7C,SAAS,6EAA6E;AAAA,IACzF,sBAAsBA,GAAE,QAAQ,EAAE,SAAS,EACxC,SAAS,mEAAmE;AAAA,IAC/E,6BAA6BA,GAAE,QAAQ,EAAE,SAAS,EAC/C,SAAS,iFAAiF;AAAA,IAC7F,6BAA6BA,GAAE,QAAQ,EAAE,SAAS,EAC/C,SAAS,qEAAqE;AAAA,IACjF,kBAAkBA,GAAE,OAAO,EAAE,SAAS,EACnC,SAAS,wFAAwF;AAAA,IACpG,uBAAuBA,GAAE,KAAK,CAAC,OAAO,eAAe,eAAe,CAAC,EAAE,SAAS,EAC7E,SAAS,sEAAsE;AAAA,IAClF,2BAA2BA,GAAE,OAAO,EAAE,SAAS,EAC5C,SAAS,oJAAoJ;AAAA,IAChK,SAASA,GAAE,OAAO,EAAE,SAAS,EAC1B,SAAS,qFAAqF;AAAA,IACjG,eAAeA,GAAE,KAAK,CAAC,QAAQ,SAAS,SAAS,OAAO,CAAC,EAAE,SAAS,EACjE,SAAS,4DAA4D;AAAA,IACxE,qBAAqBA,GAAE,QAAQ,EAAE,SAAS,EACvC,SAAS,mFAAmF;AAAA,IAC/F,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB,0BAA0B;AAC7C;;;AChDA,SAAS,KAAAC,UAAS;AAGX,IAAM,4BAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,UAAUA,GAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,IAC3D,SAASA,GAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,IAC5D,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,IACzD,QAAQA,GAAE,KAAK,CAAC,OAAO,QAAQ,gBAAgB,aAAa,CAAC,EAAE,SAAS,EACrE,SAAS,2BAA2B;AAAA,IACvC,qBAAqBA,GAAE,OAAO,EAAE,SAAS,EACtC,SAAS,2CAA2C;AAAA,IACvD,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,IAClE,KAAKA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,IAC/D,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oBAAoB;AAAA,IAC5D,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;;;AC1BA,SAAS,KAAAC,UAAS;AAGX,IAAM,2BAA8C;AAAA,EACzD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,UAAUC,GAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,IAC5D,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,IAC7E,eAAeA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,IAC7E,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,IAC9E,cAAcA,GAAE,KAAK,CAAC,QAAQ,aAAa,QAAQ,CAAC,EAAE,SAAS,EAC5D,SAAS,4DAA4D;AAAA,IACxE,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,IAClE,KAAKA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,IAC/D,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,WAAWA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,IACrF,cAAcA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,IACxF,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB,8BAA8B;AACjD;;;ACrBA;AAFA,SAAS,KAAAC,UAAS;AAClB,SAAS,gBAAgB;AAczB,eAAsB,kBAAkB,UAAkB,WAA2C;AACnG,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AAEpB,YAAM,iBAAiB,IAAI,OAAO,gBAAgB,UAAU,QAAQ,uBAAuB,MAAM,CAAC,MAAM;AACxG,YAAM,QAAQ,eAAe,KAAK,IAAI;AAEtC,UAAI,OAAO;AACT,cAAM,aAAa,IAAI;AAEvB,cAAM,iBAAiB,MAAM,QAAQ,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAC9D,cAAM,YAAY,iBAAiB;AACnC,cAAM,UAAU,YAAY,UAAU,SAAS;AAE/C,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,eAAe,SAAS,wBAAwB,QAAQ,EAAE;AAAA,EAC5E,SAAS,OAAO;AACd,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,mBAAmB,GAAG;AACzE,YAAM;AAAA,IACR;AACA,UAAM,IAAI,MAAM,gCAAgC,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACzH;AACF;AAKO,SAAS,8BAA8B,QAAyB;AACrE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAMA,GAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,MAC1D,MAAMA,GAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,IACvD;AAAA,IACA,OAAO,EAAE,MAAM,KAAK,MAAM;AACxB,UAAI;AACF,cAAM,WAAW,MAAM,kBAAkB,MAAM,IAAI;AACnD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,CAAC;AAAA,QACrE;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,iCAAiC,KAAK;AACnD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AChFA;AAFA,SAAS,KAAAC,UAAS;AAClB,SAAS,YAAAC,iBAAgB;AAkBzB,eAAsB,sBAAsB,UAAkB,eAAmD;AAC/G,MAAI;AACF,UAAM,UAAU,MAAMA,UAAS,UAAU,OAAO;AAChD,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAM,cAAc,cAAc,QAAQ,uBAAuB,MAAM;AAEvE,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AAIpB,YAAM,wBAAwB,IAAI,OAAO,oBAAoB,WAAW,UAAU;AAClF,UAAI,QAAQ,sBAAsB,KAAK,IAAI;AAK3C,UAAI,CAAC,OAAO;AACV,cAAM,kBAAkB,IAAI,OAAO,4FAA4F,WAAW,UAAU;AACpJ,gBAAQ,gBAAgB,KAAK,IAAI;AAAA,MACnC;AAEA,UAAI,OAAO;AACT,cAAM,aAAa,IAAI;AAEvB,cAAM,qBAAqB,MAAM,QAAQ,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAClE,cAAM,YAAY,qBAAqB;AACvC,cAAM,UAAU,YAAY,cAAc,SAAS;AAEnD,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,mBAAmB,aAAa,wBAAwB,QAAQ,EAAE;AAAA,EACpF,SAAS,OAAO;AACd,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,mBAAmB,GAAG;AACzE,YAAM;AAAA,IACR;AACA,UAAM,IAAI,MAAM,gCAAgC,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACzH;AACF;AAKO,SAAS,kCAAkC,QAAyB;AACzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAMD,GAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,MAC1D,MAAMA,GAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,IAC3D;AAAA,IACA,OAAO,EAAE,MAAM,KAAK,MAAM;AACxB,UAAI;AACF,cAAM,WAAW,MAAM,sBAAsB,MAAM,IAAI;AACvD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,CAAC;AAAA,QACrE;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,qCAAqC,KAAK;AACvD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrGA,SAAS,KAAAE,UAAS;;;ACAlB,YAAY,QAAQ;AACpB,YAAY,UAAU;;;ACJtB,SAAS,UAAU,SAAS;AAC1B,SAAQ,OAAO,YAAY,eAAiB,YAAY;AAC1D;AAGA,SAAS,SAAS,SAAS;AACzB,SAAQ,OAAO,YAAY,YAAc,YAAY;AACvD;AAGA,SAAS,QAAQ,UAAU;AACzB,MAAI,MAAM,QAAQ,QAAQ,EAAG,QAAO;AAAA,WAC3B,UAAU,QAAQ,EAAG,QAAO,CAAC;AAEtC,SAAO,CAAE,QAAS;AACpB;AAGA,SAAS,OAAO,QAAQ,QAAQ;AAC9B,MAAI,OAAO,QAAQ,KAAK;AAExB,MAAI,QAAQ;AACV,iBAAa,OAAO,KAAK,MAAM;AAE/B,SAAK,QAAQ,GAAG,SAAS,WAAW,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtE,YAAM,WAAW,KAAK;AACtB,aAAO,GAAG,IAAI,OAAO,GAAG;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,OAAO,QAAQ,OAAO;AAC7B,MAAI,SAAS,IAAI;AAEjB,OAAK,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;AACzC,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAGA,SAAS,eAAe,QAAQ;AAC9B,SAAQ,WAAW,KAAO,OAAO,sBAAsB,IAAI;AAC7D;AAGA,IAAI,cAAmB;AACvB,IAAI,aAAmB;AACvB,IAAI,YAAmB;AACvB,IAAI,WAAmB;AACvB,IAAI,mBAAmB;AACvB,IAAI,WAAmB;AAEvB,IAAI,SAAS;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,QAAQ;AACT;AAKA,SAAS,YAAYC,YAAW,SAAS;AACvC,MAAI,QAAQ,IAAI,UAAUA,WAAU,UAAU;AAE9C,MAAI,CAACA,WAAU,KAAM,QAAO;AAE5B,MAAIA,WAAU,KAAK,MAAM;AACvB,aAAS,SAASA,WAAU,KAAK,OAAO;AAAA,EAC1C;AAEA,WAAS,OAAOA,WAAU,KAAK,OAAO,KAAK,OAAOA,WAAU,KAAK,SAAS,KAAK;AAE/E,MAAI,CAAC,WAAWA,WAAU,KAAK,SAAS;AACtC,aAAS,SAASA,WAAU,KAAK;AAAA,EACnC;AAEA,SAAO,UAAU,MAAM;AACzB;AAGA,SAAS,gBAAgB,QAAQ,MAAM;AAErC,QAAM,KAAK,IAAI;AAEf,OAAK,OAAO;AACZ,OAAK,SAAS;AACd,OAAK,OAAO;AACZ,OAAK,UAAU,YAAY,MAAM,KAAK;AAGtC,MAAI,MAAM,mBAAmB;AAE3B,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,EAChD,OAAO;AAEL,SAAK,QAAS,IAAI,MAAM,EAAG,SAAS;AAAA,EACtC;AACF;AAIA,gBAAgB,YAAY,OAAO,OAAO,MAAM,SAAS;AACzD,gBAAgB,UAAU,cAAc;AAGxC,gBAAgB,UAAU,WAAW,SAAS,SAAS,SAAS;AAC9D,SAAO,KAAK,OAAO,OAAO,YAAY,MAAM,OAAO;AACrD;AAGA,IAAI,YAAY;AAGhB,SAAS,QAAQ,QAAQ,WAAW,SAAS,UAAU,eAAe;AACpE,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,gBAAgB,KAAK,MAAM,gBAAgB,CAAC,IAAI;AAEpD,MAAI,WAAW,YAAY,eAAe;AACxC,WAAO;AACP,gBAAY,WAAW,gBAAgB,KAAK;AAAA,EAC9C;AAEA,MAAI,UAAU,WAAW,eAAe;AACtC,WAAO;AACP,cAAU,WAAW,gBAAgB,KAAK;AAAA,EAC5C;AAEA,SAAO;AAAA,IACL,KAAK,OAAO,OAAO,MAAM,WAAW,OAAO,EAAE,QAAQ,OAAO,QAAG,IAAI;AAAA,IACnE,KAAK,WAAW,YAAY,KAAK;AAAA;AAAA,EACnC;AACF;AAGA,SAAS,SAAS,QAAQ,KAAK;AAC7B,SAAO,OAAO,OAAO,KAAK,MAAM,OAAO,MAAM,IAAI;AACnD;AAGA,SAAS,YAAY,MAAM,SAAS;AAClC,YAAU,OAAO,OAAO,WAAW,IAAI;AAEvC,MAAI,CAAC,KAAK,OAAQ,QAAO;AAEzB,MAAI,CAAC,QAAQ,UAAW,SAAQ,YAAY;AAC5C,MAAI,OAAO,QAAQ,WAAgB,SAAU,SAAQ,SAAc;AACnE,MAAI,OAAO,QAAQ,gBAAgB,SAAU,SAAQ,cAAc;AACnE,MAAI,OAAO,QAAQ,eAAgB,SAAU,SAAQ,aAAc;AAEnE,MAAI,KAAK;AACT,MAAI,aAAa,CAAE,CAAE;AACrB,MAAI,WAAW,CAAC;AAChB,MAAI;AACJ,MAAI,cAAc;AAElB,SAAQ,QAAQ,GAAG,KAAK,KAAK,MAAM,GAAI;AACrC,aAAS,KAAK,MAAM,KAAK;AACzB,eAAW,KAAK,MAAM,QAAQ,MAAM,CAAC,EAAE,MAAM;AAE7C,QAAI,KAAK,YAAY,MAAM,SAAS,cAAc,GAAG;AACnD,oBAAc,WAAW,SAAS;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,cAAc,EAAG,eAAc,WAAW,SAAS;AAEvD,MAAI,SAAS,IAAI,GAAG;AACpB,MAAI,eAAe,KAAK,IAAI,KAAK,OAAO,QAAQ,YAAY,SAAS,MAAM,EAAE,SAAS,EAAE;AACxF,MAAI,gBAAgB,QAAQ,aAAa,QAAQ,SAAS,eAAe;AAEzE,OAAK,IAAI,GAAG,KAAK,QAAQ,aAAa,KAAK;AACzC,QAAI,cAAc,IAAI,EAAG;AACzB,WAAO;AAAA,MACL,KAAK;AAAA,MACL,WAAW,cAAc,CAAC;AAAA,MAC1B,SAAS,cAAc,CAAC;AAAA,MACxB,KAAK,YAAY,WAAW,WAAW,IAAI,WAAW,cAAc,CAAC;AAAA,MACrE;AAAA,IACF;AACA,aAAS,OAAO,OAAO,KAAK,QAAQ,MAAM,IAAI,UAAU,KAAK,OAAO,IAAI,GAAG,SAAS,GAAG,YAAY,IACjG,QAAQ,KAAK,MAAM,OAAO;AAAA,EAC9B;AAEA,SAAO,QAAQ,KAAK,QAAQ,WAAW,WAAW,GAAG,SAAS,WAAW,GAAG,KAAK,UAAU,aAAa;AACxG,YAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,IAAI,UAAU,KAAK,OAAO,GAAG,SAAS,GAAG,YAAY,IAC9F,QAAQ,KAAK,MAAM;AACrB,YAAU,OAAO,OAAO,KAAK,QAAQ,SAAS,eAAe,IAAI,KAAK,GAAG,IAAI;AAE7E,OAAK,IAAI,GAAG,KAAK,QAAQ,YAAY,KAAK;AACxC,QAAI,cAAc,KAAK,SAAS,OAAQ;AACxC,WAAO;AAAA,MACL,KAAK;AAAA,MACL,WAAW,cAAc,CAAC;AAAA,MAC1B,SAAS,cAAc,CAAC;AAAA,MACxB,KAAK,YAAY,WAAW,WAAW,IAAI,WAAW,cAAc,CAAC;AAAA,MACrE;AAAA,IACF;AACA,cAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,IAAI,UAAU,KAAK,OAAO,IAAI,GAAG,SAAS,GAAG,YAAY,IAClG,QAAQ,KAAK,MAAM;AAAA,EACvB;AAEA,SAAO,OAAO,QAAQ,OAAO,EAAE;AACjC;AAGA,IAAI,UAAU;AAEd,IAAI,2BAA2B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAI,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,oBAAoBC,MAAK;AAChC,MAAI,SAAS,CAAC;AAEd,MAAIA,SAAQ,MAAM;AAChB,WAAO,KAAKA,IAAG,EAAE,QAAQ,SAAU,OAAO;AACxC,MAAAA,KAAI,KAAK,EAAE,QAAQ,SAAU,OAAO;AAClC,eAAO,OAAO,KAAK,CAAC,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,OAAO,KAAK,SAAS;AAC5B,YAAU,WAAW,CAAC;AAEtB,SAAO,KAAK,OAAO,EAAE,QAAQ,SAAU,MAAM;AAC3C,QAAI,yBAAyB,QAAQ,IAAI,MAAM,IAAI;AACjD,YAAM,IAAI,UAAU,qBAAqB,OAAO,gCAAgC,MAAM,cAAc;AAAA,IACtG;AAAA,EACF,CAAC;AAGD,OAAK,UAAgB;AACrB,OAAK,MAAgB;AACrB,OAAK,OAAgB,QAAQ,MAAM,KAAc;AACjD,OAAK,UAAgB,QAAQ,SAAS,KAAW,WAAY;AAAE,WAAO;AAAA,EAAM;AAC5E,OAAK,YAAgB,QAAQ,WAAW,KAAS,SAAU,MAAM;AAAE,WAAO;AAAA,EAAM;AAChF,OAAK,aAAgB,QAAQ,YAAY,KAAQ;AACjD,OAAK,YAAgB,QAAQ,WAAW,KAAS;AACjD,OAAK,YAAgB,QAAQ,WAAW,KAAS;AACjD,OAAK,gBAAgB,QAAQ,eAAe,KAAK;AACjD,OAAK,eAAgB,QAAQ,cAAc,KAAM;AACjD,OAAK,QAAgB,QAAQ,OAAO,KAAa;AACjD,OAAK,eAAgB,oBAAoB,QAAQ,cAAc,KAAK,IAAI;AAExE,MAAI,gBAAgB,QAAQ,KAAK,IAAI,MAAM,IAAI;AAC7C,UAAM,IAAI,UAAU,mBAAmB,KAAK,OAAO,yBAAyB,MAAM,cAAc;AAAA,EAClG;AACF;AAEA,IAAI,OAAO;AAQX,SAAS,YAAYC,SAAQ,MAAM;AACjC,MAAI,SAAS,CAAC;AAEd,EAAAA,QAAO,IAAI,EAAE,QAAQ,SAAU,aAAa;AAC1C,QAAI,WAAW,OAAO;AAEtB,WAAO,QAAQ,SAAU,cAAc,eAAe;AACpD,UAAI,aAAa,QAAQ,YAAY,OACjC,aAAa,SAAS,YAAY,QAClC,aAAa,UAAU,YAAY,OAAO;AAE5C,mBAAW;AAAA,MACb;AAAA,IACF,CAAC;AAED,WAAO,QAAQ,IAAI;AAAA,EACrB,CAAC;AAED,SAAO;AACT;AAGA,SAAS,aAA2B;AAClC,MAAI,SAAS;AAAA,IACP,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,IACV,UAAU,CAAC;AAAA,IACX,OAAO;AAAA,MACL,QAAQ,CAAC;AAAA,MACT,UAAU,CAAC;AAAA,MACX,SAAS,CAAC;AAAA,MACV,UAAU,CAAC;AAAA,IACb;AAAA,EACF,GAAG,OAAO;AAEd,WAAS,YAAYC,OAAM;AACzB,QAAIA,MAAK,OAAO;AACd,aAAO,MAAMA,MAAK,IAAI,EAAE,KAAKA,KAAI;AACjC,aAAO,MAAM,UAAU,EAAE,KAAKA,KAAI;AAAA,IACpC,OAAO;AACL,aAAOA,MAAK,IAAI,EAAEA,MAAK,GAAG,IAAI,OAAO,UAAU,EAAEA,MAAK,GAAG,IAAIA;AAAA,IAC/D;AAAA,EACF;AAEA,OAAK,QAAQ,GAAG,SAAS,UAAU,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACrE,cAAU,KAAK,EAAE,QAAQ,WAAW;AAAA,EACtC;AACA,SAAO;AACT;AAGA,SAAS,SAAS,YAAY;AAC5B,SAAO,KAAK,OAAO,UAAU;AAC/B;AAGA,SAAS,UAAU,SAAS,SAASC,QAAO,YAAY;AACtD,MAAI,WAAW,CAAC;AAChB,MAAI,WAAW,CAAC;AAEhB,MAAI,sBAAsB,MAAM;AAE9B,aAAS,KAAK,UAAU;AAAA,EAE1B,WAAW,MAAM,QAAQ,UAAU,GAAG;AAEpC,eAAW,SAAS,OAAO,UAAU;AAAA,EAEvC,WAAW,eAAe,MAAM,QAAQ,WAAW,QAAQ,KAAK,MAAM,QAAQ,WAAW,QAAQ,IAAI;AAEnG,QAAI,WAAW,SAAU,YAAW,SAAS,OAAO,WAAW,QAAQ;AACvE,QAAI,WAAW,SAAU,YAAW,SAAS,OAAO,WAAW,QAAQ;AAAA,EAEzE,OAAO;AACL,UAAM,IAAI,UAAU,kHAC6C;AAAA,EACnE;AAEA,WAAS,QAAQ,SAAU,QAAQ;AACjC,QAAI,EAAE,kBAAkB,OAAO;AAC7B,YAAM,IAAI,UAAU,oFAAoF;AAAA,IAC1G;AAEA,QAAI,OAAO,YAAY,OAAO,aAAa,UAAU;AACnD,YAAM,IAAI,UAAU,iHAAiH;AAAA,IACvI;AAEA,QAAI,OAAO,OAAO;AAChB,YAAM,IAAI,UAAU,oGAAoG;AAAA,IAC1H;AAAA,EACF,CAAC;AAED,WAAS,QAAQ,SAAU,QAAQ;AACjC,QAAI,EAAE,kBAAkB,OAAO;AAC7B,YAAM,IAAI,UAAU,oFAAoF;AAAA,IAC1G;AAAA,EACF,CAAC;AAED,MAAI,SAAS,OAAO,OAAO,SAAS,SAAS;AAE7C,SAAO,YAAY,KAAK,YAAY,CAAC,GAAG,OAAO,QAAQ;AACvD,SAAO,YAAY,KAAK,YAAY,CAAC,GAAG,OAAO,QAAQ;AAEvD,SAAO,mBAAmB,YAAY,QAAQ,UAAU;AACxD,SAAO,mBAAmB,YAAY,QAAQ,UAAU;AACxD,SAAO,kBAAmB,WAAW,OAAO,kBAAkB,OAAO,gBAAgB;AAErF,SAAO;AACT;AAGA,IAAI,SAAS;AAEb,IAAI,MAAM,IAAI,KAAK,yBAAyB;AAAA,EAC1C,MAAM;AAAA,EACN,WAAW,SAAU,MAAM;AAAE,WAAO,SAAS,OAAO,OAAO;AAAA,EAAI;AACjE,CAAC;AAED,IAAI,MAAM,IAAI,KAAK,yBAAyB;AAAA,EAC1C,MAAM;AAAA,EACN,WAAW,SAAU,MAAM;AAAE,WAAO,SAAS,OAAO,OAAO,CAAC;AAAA,EAAG;AACjE,CAAC;AAED,IAAI,MAAM,IAAI,KAAK,yBAAyB;AAAA,EAC1C,MAAM;AAAA,EACN,WAAW,SAAU,MAAM;AAAE,WAAO,SAAS,OAAO,OAAO,CAAC;AAAA,EAAG;AACjE,CAAC;AAED,IAAI,WAAW,IAAI,OAAO;AAAA,EACxB,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,SAAS,gBAAgB,MAAM;AAC7B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,MAAM,KAAK;AAEf,SAAQ,QAAQ,KAAK,SAAS,OACtB,QAAQ,MAAM,SAAS,UAAU,SAAS,UAAU,SAAS;AACvE;AAEA,SAAS,oBAAoB;AAC3B,SAAO;AACT;AAEA,SAAS,OAAO,QAAQ;AACtB,SAAO,WAAW;AACpB;AAEA,IAAI,QAAQ,IAAI,KAAK,0BAA0B;AAAA,EAC7C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,IACT,WAAW,WAAY;AAAE,aAAO;AAAA,IAAQ;AAAA,IACxC,WAAW,WAAY;AAAE,aAAO;AAAA,IAAQ;AAAA,IACxC,WAAW,WAAY;AAAE,aAAO;AAAA,IAAQ;AAAA,IACxC,WAAW,WAAY;AAAE,aAAO;AAAA,IAAQ;AAAA,IACxC,OAAW,WAAY;AAAE,aAAO;AAAA,IAAQ;AAAA,EAC1C;AAAA,EACA,cAAc;AAChB,CAAC;AAED,SAAS,mBAAmB,MAAM;AAChC,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,MAAM,KAAK;AAEf,SAAQ,QAAQ,MAAM,SAAS,UAAU,SAAS,UAAU,SAAS,WAC7D,QAAQ,MAAM,SAAS,WAAW,SAAS,WAAW,SAAS;AACzE;AAEA,SAAS,qBAAqB,MAAM;AAClC,SAAO,SAAS,UACT,SAAS,UACT,SAAS;AAClB;AAEA,SAAS,UAAU,QAAQ;AACzB,SAAO,OAAO,UAAU,SAAS,KAAK,MAAM,MAAM;AACpD;AAEA,IAAI,OAAO,IAAI,KAAK,0BAA0B;AAAA,EAC5C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,IACT,WAAW,SAAU,QAAQ;AAAE,aAAO,SAAS,SAAS;AAAA,IAAS;AAAA,IACjE,WAAW,SAAU,QAAQ;AAAE,aAAO,SAAS,SAAS;AAAA,IAAS;AAAA,IACjE,WAAW,SAAU,QAAQ;AAAE,aAAO,SAAS,SAAS;AAAA,IAAS;AAAA,EACnE;AAAA,EACA,cAAc;AAChB,CAAC;AAED,SAAS,UAAU,GAAG;AACpB,SAAS,MAAe,KAAO,KAAK,MAC3B,MAAe,KAAO,KAAK,MAC3B,MAAe,KAAO,KAAK;AACtC;AAEA,SAAS,UAAU,GAAG;AACpB,SAAS,MAAe,KAAO,KAAK;AACtC;AAEA,SAAS,UAAU,GAAG;AACpB,SAAS,MAAe,KAAO,KAAK;AACtC;AAEA,SAAS,mBAAmB,MAAM;AAChC,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,MAAM,KAAK,QACX,QAAQ,GACR,YAAY,OACZ;AAEJ,MAAI,CAAC,IAAK,QAAO;AAEjB,OAAK,KAAK,KAAK;AAGf,MAAI,OAAO,OAAO,OAAO,KAAK;AAC5B,SAAK,KAAK,EAAE,KAAK;AAAA,EACnB;AAEA,MAAI,OAAO,KAAK;AAEd,QAAI,QAAQ,MAAM,IAAK,QAAO;AAC9B,SAAK,KAAK,EAAE,KAAK;AAIjB,QAAI,OAAO,KAAK;AAEd;AAEA,aAAO,QAAQ,KAAK,SAAS;AAC3B,aAAK,KAAK,KAAK;AACf,YAAI,OAAO,IAAK;AAChB,YAAI,OAAO,OAAO,OAAO,IAAK,QAAO;AACrC,oBAAY;AAAA,MACd;AACA,aAAO,aAAa,OAAO;AAAA,IAC7B;AAGA,QAAI,OAAO,KAAK;AAEd;AAEA,aAAO,QAAQ,KAAK,SAAS;AAC3B,aAAK,KAAK,KAAK;AACf,YAAI,OAAO,IAAK;AAChB,YAAI,CAAC,UAAU,KAAK,WAAW,KAAK,CAAC,EAAG,QAAO;AAC/C,oBAAY;AAAA,MACd;AACA,aAAO,aAAa,OAAO;AAAA,IAC7B;AAGA,QAAI,OAAO,KAAK;AAEd;AAEA,aAAO,QAAQ,KAAK,SAAS;AAC3B,aAAK,KAAK,KAAK;AACf,YAAI,OAAO,IAAK;AAChB,YAAI,CAAC,UAAU,KAAK,WAAW,KAAK,CAAC,EAAG,QAAO;AAC/C,oBAAY;AAAA,MACd;AACA,aAAO,aAAa,OAAO;AAAA,IAC7B;AAAA,EACF;AAKA,MAAI,OAAO,IAAK,QAAO;AAEvB,SAAO,QAAQ,KAAK,SAAS;AAC3B,SAAK,KAAK,KAAK;AACf,QAAI,OAAO,IAAK;AAChB,QAAI,CAAC,UAAU,KAAK,WAAW,KAAK,CAAC,GAAG;AACtC,aAAO;AAAA,IACT;AACA,gBAAY;AAAA,EACd;AAGA,MAAI,CAAC,aAAa,OAAO,IAAK,QAAO;AAErC,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAM;AAClC,MAAI,QAAQ,MAAM,OAAO,GAAG;AAE5B,MAAI,MAAM,QAAQ,GAAG,MAAM,IAAI;AAC7B,YAAQ,MAAM,QAAQ,MAAM,EAAE;AAAA,EAChC;AAEA,OAAK,MAAM,CAAC;AAEZ,MAAI,OAAO,OAAO,OAAO,KAAK;AAC5B,QAAI,OAAO,IAAK,QAAO;AACvB,YAAQ,MAAM,MAAM,CAAC;AACrB,SAAK,MAAM,CAAC;AAAA,EACd;AAEA,MAAI,UAAU,IAAK,QAAO;AAE1B,MAAI,OAAO,KAAK;AACd,QAAI,MAAM,CAAC,MAAM,IAAK,QAAO,OAAO,SAAS,MAAM,MAAM,CAAC,GAAG,CAAC;AAC9D,QAAI,MAAM,CAAC,MAAM,IAAK,QAAO,OAAO,SAAS,MAAM,MAAM,CAAC,GAAG,EAAE;AAC/D,QAAI,MAAM,CAAC,MAAM,IAAK,QAAO,OAAO,SAAS,MAAM,MAAM,CAAC,GAAG,CAAC;AAAA,EAChE;AAEA,SAAO,OAAO,SAAS,OAAO,EAAE;AAClC;AAEA,SAAS,UAAU,QAAQ;AACzB,SAAQ,OAAO,UAAU,SAAS,KAAK,MAAM,MAAO,sBAC5C,SAAS,MAAM,KAAK,CAAC,OAAO,eAAe,MAAM;AAC3D;AAEA,IAAI,MAAM,IAAI,KAAK,yBAAyB;AAAA,EAC1C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,IACT,QAAa,SAAU,KAAK;AAAE,aAAO,OAAO,IAAI,OAAO,IAAI,SAAS,CAAC,IAAI,QAAQ,IAAI,SAAS,CAAC,EAAE,MAAM,CAAC;AAAA,IAAG;AAAA,IAC3G,OAAa,SAAU,KAAK;AAAE,aAAO,OAAO,IAAI,OAAQ,IAAI,SAAS,CAAC,IAAI,QAAS,IAAI,SAAS,CAAC,EAAE,MAAM,CAAC;AAAA,IAAG;AAAA,IAC7G,SAAa,SAAU,KAAK;AAAE,aAAO,IAAI,SAAS,EAAE;AAAA,IAAG;AAAA;AAAA,IAEvD,aAAa,SAAU,KAAK;AAAE,aAAO,OAAO,IAAI,OAAO,IAAI,SAAS,EAAE,EAAE,YAAY,IAAK,QAAQ,IAAI,SAAS,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC;AAAA,IAAG;AAAA,EAC5I;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,IACZ,QAAa,CAAE,GAAI,KAAM;AAAA,IACzB,OAAa,CAAE,GAAI,KAAM;AAAA,IACzB,SAAa,CAAE,IAAI,KAAM;AAAA,IACzB,aAAa,CAAE,IAAI,KAAM;AAAA,EAC3B;AACF,CAAC;AAED,IAAI,qBAAqB,IAAI;AAAA;AAAA,EAE3B;AAOuB;AAEzB,SAAS,iBAAiB,MAAM;AAC9B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,CAAC,mBAAmB,KAAK,IAAI;AAAA;AAAA,EAG7B,KAAK,KAAK,SAAS,CAAC,MAAM,KAAK;AACjC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAM;AAChC,MAAI,OAAO;AAEX,UAAS,KAAK,QAAQ,MAAM,EAAE,EAAE,YAAY;AAC5C,SAAS,MAAM,CAAC,MAAM,MAAM,KAAK;AAEjC,MAAI,KAAK,QAAQ,MAAM,CAAC,CAAC,KAAK,GAAG;AAC/B,YAAQ,MAAM,MAAM,CAAC;AAAA,EACvB;AAEA,MAAI,UAAU,QAAQ;AACpB,WAAQ,SAAS,IAAK,OAAO,oBAAoB,OAAO;AAAA,EAE1D,WAAW,UAAU,QAAQ;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,OAAO,WAAW,OAAO,EAAE;AACpC;AAGA,IAAI,yBAAyB;AAE7B,SAAS,mBAAmB,QAAQ,OAAO;AACzC,MAAI;AAEJ,MAAI,MAAM,MAAM,GAAG;AACjB,YAAQ,OAAO;AAAA,MACb,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,IAC3B;AAAA,EACF,WAAW,OAAO,sBAAsB,QAAQ;AAC9C,YAAQ,OAAO;AAAA,MACb,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,IAC3B;AAAA,EACF,WAAW,OAAO,sBAAsB,QAAQ;AAC9C,YAAQ,OAAO;AAAA,MACb,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,IAC3B;AAAA,EACF,WAAW,OAAO,eAAe,MAAM,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,SAAS,EAAE;AAKxB,SAAO,uBAAuB,KAAK,GAAG,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI;AACrE;AAEA,SAAS,QAAQ,QAAQ;AACvB,SAAQ,OAAO,UAAU,SAAS,KAAK,MAAM,MAAM,sBAC3C,SAAS,MAAM,KAAK,OAAO,eAAe,MAAM;AAC1D;AAEA,IAAI,QAAQ,IAAI,KAAK,2BAA2B;AAAA,EAC9C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAChB,CAAC;AAED,IAAI,OAAO,SAAS,OAAO;AAAA,EACzB,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,IAAI,OAAO;AAEX,IAAI,mBAAmB,IAAI;AAAA,EACzB;AAEgB;AAElB,IAAI,wBAAwB,IAAI;AAAA,EAC9B;AASwB;AAE1B,SAAS,qBAAqB,MAAM;AAClC,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,iBAAiB,KAAK,IAAI,MAAM,KAAM,QAAO;AACjD,MAAI,sBAAsB,KAAK,IAAI,MAAM,KAAM,QAAO;AACtD,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAM;AACpC,MAAI,OAAO,MAAM,OAAO,KAAK,MAAM,QAAQ,QAAQ,WAAW,GAC1D,QAAQ,MAAM,SAAS,WAAW;AAEtC,UAAQ,iBAAiB,KAAK,IAAI;AAClC,MAAI,UAAU,KAAM,SAAQ,sBAAsB,KAAK,IAAI;AAE3D,MAAI,UAAU,KAAM,OAAM,IAAI,MAAM,oBAAoB;AAIxD,SAAO,CAAE,MAAM,CAAC;AAChB,UAAQ,CAAE,MAAM,CAAC,IAAK;AACtB,QAAM,CAAE,MAAM,CAAC;AAEf,MAAI,CAAC,MAAM,CAAC,GAAG;AACb,WAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,EAC5C;AAIA,SAAO,CAAE,MAAM,CAAC;AAChB,WAAS,CAAE,MAAM,CAAC;AAClB,WAAS,CAAE,MAAM,CAAC;AAElB,MAAI,MAAM,CAAC,GAAG;AACZ,eAAW,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC;AAC9B,WAAO,SAAS,SAAS,GAAG;AAC1B,kBAAY;AAAA,IACd;AACA,eAAW,CAAC;AAAA,EACd;AAIA,MAAI,MAAM,CAAC,GAAG;AACZ,cAAU,CAAE,MAAM,EAAE;AACpB,gBAAY,EAAE,MAAM,EAAE,KAAK;AAC3B,aAAS,UAAU,KAAK,aAAa;AACrC,QAAI,MAAM,CAAC,MAAM,IAAK,SAAQ,CAAC;AAAA,EACjC;AAEA,SAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM,QAAQ,QAAQ,QAAQ,CAAC;AAE1E,MAAI,MAAO,MAAK,QAAQ,KAAK,QAAQ,IAAI,KAAK;AAE9C,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAoB;AAClD,SAAO,OAAO,YAAY;AAC5B;AAEA,IAAI,YAAY,IAAI,KAAK,+BAA+B;AAAA,EACtD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AACb,CAAC;AAED,SAAS,iBAAiB,MAAM;AAC9B,SAAO,SAAS,QAAQ,SAAS;AACnC;AAEA,IAAI,QAAQ,IAAI,KAAK,2BAA2B;AAAA,EAC9C,MAAM;AAAA,EACN,SAAS;AACX,CAAC;AASD,IAAI,aAAa;AAGjB,SAAS,kBAAkB,MAAM;AAC/B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,MAAM,KAAK,SAAS,GAAG,MAAM,KAAK,QAAQH,OAAM;AAGpD,OAAK,MAAM,GAAG,MAAM,KAAK,OAAO;AAC9B,WAAOA,KAAI,QAAQ,KAAK,OAAO,GAAG,CAAC;AAGnC,QAAI,OAAO,GAAI;AAGf,QAAI,OAAO,EAAG,QAAO;AAErB,cAAU;AAAA,EACZ;AAGA,SAAQ,SAAS,MAAO;AAC1B;AAEA,SAAS,oBAAoB,MAAM;AACjC,MAAI,KAAK,UACL,QAAQ,KAAK,QAAQ,YAAY,EAAE,GACnC,MAAM,MAAM,QACZA,OAAM,YACN,OAAO,GACP,SAAS,CAAC;AAId,OAAK,MAAM,GAAG,MAAM,KAAK,OAAO;AAC9B,QAAK,MAAM,MAAM,KAAM,KAAK;AAC1B,aAAO,KAAM,QAAQ,KAAM,GAAI;AAC/B,aAAO,KAAM,QAAQ,IAAK,GAAI;AAC9B,aAAO,KAAK,OAAO,GAAI;AAAA,IACzB;AAEA,WAAQ,QAAQ,IAAKA,KAAI,QAAQ,MAAM,OAAO,GAAG,CAAC;AAAA,EACpD;AAIA,aAAY,MAAM,IAAK;AAEvB,MAAI,aAAa,GAAG;AAClB,WAAO,KAAM,QAAQ,KAAM,GAAI;AAC/B,WAAO,KAAM,QAAQ,IAAK,GAAI;AAC9B,WAAO,KAAK,OAAO,GAAI;AAAA,EACzB,WAAW,aAAa,IAAI;AAC1B,WAAO,KAAM,QAAQ,KAAM,GAAI;AAC/B,WAAO,KAAM,QAAQ,IAAK,GAAI;AAAA,EAChC,WAAW,aAAa,IAAI;AAC1B,WAAO,KAAM,QAAQ,IAAK,GAAI;AAAA,EAChC;AAEA,SAAO,IAAI,WAAW,MAAM;AAC9B;AAEA,SAAS,oBAAoB,QAAoB;AAC/C,MAAI,SAAS,IAAI,OAAO,GAAG,KAAK,MAC5B,MAAM,OAAO,QACbA,OAAM;AAIV,OAAK,MAAM,GAAG,MAAM,KAAK,OAAO;AAC9B,QAAK,MAAM,MAAM,KAAM,KAAK;AAC1B,gBAAUA,KAAK,QAAQ,KAAM,EAAI;AACjC,gBAAUA,KAAK,QAAQ,KAAM,EAAI;AACjC,gBAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,gBAAUA,KAAI,OAAO,EAAI;AAAA,IAC3B;AAEA,YAAQ,QAAQ,KAAK,OAAO,GAAG;AAAA,EACjC;AAIA,SAAO,MAAM;AAEb,MAAI,SAAS,GAAG;AACd,cAAUA,KAAK,QAAQ,KAAM,EAAI;AACjC,cAAUA,KAAK,QAAQ,KAAM,EAAI;AACjC,cAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,cAAUA,KAAI,OAAO,EAAI;AAAA,EAC3B,WAAW,SAAS,GAAG;AACrB,cAAUA,KAAK,QAAQ,KAAM,EAAI;AACjC,cAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,cAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,cAAUA,KAAI,EAAE;AAAA,EAClB,WAAW,SAAS,GAAG;AACrB,cAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,cAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,cAAUA,KAAI,EAAE;AAChB,cAAUA,KAAI,EAAE;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,KAAK;AACrB,SAAO,OAAO,UAAU,SAAS,KAAK,GAAG,MAAO;AAClD;AAEA,IAAI,SAAS,IAAI,KAAK,4BAA4B;AAAA,EAChD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb,CAAC;AAED,IAAI,oBAAoB,OAAO,UAAU;AACzC,IAAI,cAAoB,OAAO,UAAU;AAEzC,SAAS,gBAAgB,MAAM;AAC7B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,aAAa,CAAC,GAAG,OAAO,QAAQ,MAAM,SAAS,YAC/C,SAAS;AAEb,OAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,WAAO,OAAO,KAAK;AACnB,iBAAa;AAEb,QAAI,YAAY,KAAK,IAAI,MAAM,kBAAmB,QAAO;AAEzD,SAAK,WAAW,MAAM;AACpB,UAAI,kBAAkB,KAAK,MAAM,OAAO,GAAG;AACzC,YAAI,CAAC,WAAY,cAAa;AAAA,YACzB,QAAO;AAAA,MACd;AAAA,IACF;AAEA,QAAI,CAAC,WAAY,QAAO;AAExB,QAAI,WAAW,QAAQ,OAAO,MAAM,GAAI,YAAW,KAAK,OAAO;AAAA,QAC1D,QAAO;AAAA,EACd;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAM;AAC/B,SAAO,SAAS,OAAO,OAAO,CAAC;AACjC;AAEA,IAAI,OAAO,IAAI,KAAK,0BAA0B;AAAA,EAC5C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AACb,CAAC;AAED,IAAI,cAAc,OAAO,UAAU;AAEnC,SAAS,iBAAiB,MAAM;AAC9B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,OAAO,QAAQ,MAAM,MAAM,QAC3B,SAAS;AAEb,WAAS,IAAI,MAAM,OAAO,MAAM;AAEhC,OAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,WAAO,OAAO,KAAK;AAEnB,QAAI,YAAY,KAAK,IAAI,MAAM,kBAAmB,QAAO;AAEzD,WAAO,OAAO,KAAK,IAAI;AAEvB,QAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,WAAO,KAAK,IAAI,CAAE,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAE;AAAA,EAC3C;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAM;AAChC,MAAI,SAAS,KAAM,QAAO,CAAC;AAE3B,MAAI,OAAO,QAAQ,MAAM,MAAM,QAC3B,SAAS;AAEb,WAAS,IAAI,MAAM,OAAO,MAAM;AAEhC,OAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,WAAO,OAAO,KAAK;AAEnB,WAAO,OAAO,KAAK,IAAI;AAEvB,WAAO,KAAK,IAAI,CAAE,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAE;AAAA,EAC3C;AAEA,SAAO;AACT;AAEA,IAAI,QAAQ,IAAI,KAAK,2BAA2B;AAAA,EAC9C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AACb,CAAC;AAED,IAAI,oBAAoB,OAAO,UAAU;AAEzC,SAAS,eAAe,MAAM;AAC5B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,KAAK,SAAS;AAElB,OAAK,OAAO,QAAQ;AAClB,QAAI,kBAAkB,KAAK,QAAQ,GAAG,GAAG;AACvC,UAAI,OAAO,GAAG,MAAM,KAAM,QAAO;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAM;AAC9B,SAAO,SAAS,OAAO,OAAO,CAAC;AACjC;AAEA,IAAI,MAAM,IAAI,KAAK,yBAAyB;AAAA,EAC1C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AACb,CAAC;AAED,IAAI,WAAW,KAAK,OAAO;AAAA,EACzB,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAUD,IAAI,oBAAoB,OAAO,UAAU;AAGzC,IAAI,kBAAoB;AACxB,IAAI,mBAAoB;AACxB,IAAI,mBAAoB;AACxB,IAAI,oBAAoB;AAGxB,IAAI,gBAAiB;AACrB,IAAI,iBAAiB;AACrB,IAAI,gBAAiB;AAGrB,IAAI,wBAAgC;AACpC,IAAI,gCAAgC;AACpC,IAAI,0BAAgC;AACpC,IAAI,qBAAgC;AACpC,IAAI,kBAAgC;AAGpC,SAAS,OAAO,KAAK;AAAE,SAAO,OAAO,UAAU,SAAS,KAAK,GAAG;AAAG;AAEnE,SAAS,OAAO,GAAG;AACjB,SAAQ,MAAM,MAAkB,MAAM;AACxC;AAEA,SAAS,eAAe,GAAG;AACzB,SAAQ,MAAM,KAAmB,MAAM;AACzC;AAEA,SAAS,aAAa,GAAG;AACvB,SAAQ,MAAM,KACN,MAAM,MACN,MAAM,MACN,MAAM;AAChB;AAEA,SAAS,kBAAkB,GAAG;AAC5B,SAAO,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,OACN,MAAM;AACf;AAEA,SAAS,YAAY,GAAG;AACtB,MAAI;AAEJ,MAAK,MAAe,KAAO,KAAK,IAAc;AAC5C,WAAO,IAAI;AAAA,EACb;AAGA,OAAK,IAAI;AAET,MAAK,MAAe,MAAQ,MAAM,KAAc;AAC9C,WAAO,KAAK,KAAO;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,GAAG;AACxB,MAAI,MAAM,KAAa;AAAE,WAAO;AAAA,EAAG;AACnC,MAAI,MAAM,KAAa;AAAE,WAAO;AAAA,EAAG;AACnC,MAAI,MAAM,IAAa;AAAE,WAAO;AAAA,EAAG;AACnC,SAAO;AACT;AAEA,SAAS,gBAAgB,GAAG;AAC1B,MAAK,MAAe,KAAO,KAAK,IAAc;AAC5C,WAAO,IAAI;AAAA,EACb;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,GAAG;AAE/B,SAAQ,MAAM,KAAe,OACtB,MAAM,KAAe,SACrB,MAAM,KAAe,OACrB,MAAM,MAAe,MACrB,MAAM,IAAiB,MACvB,MAAM,MAAe,OACrB,MAAM,MAAe,OACrB,MAAM,MAAe,OACrB,MAAM,MAAe,OACrB,MAAM,MAAe,SACrB,MAAM,KAAmB,MACzB,MAAM,KAAe,MACrB,MAAM,KAAe,MACrB,MAAM,KAAe,OACrB,MAAM,KAAe,SACrB,MAAM,KAAe,SACrB,MAAM,KAAe,WACrB,MAAM,KAAe,WAAW;AACzC;AAEA,SAAS,kBAAkB,GAAG;AAC5B,MAAI,KAAK,OAAQ;AACf,WAAO,OAAO,aAAa,CAAC;AAAA,EAC9B;AAGA,SAAO,OAAO;AAAA,KACV,IAAI,SAAa,MAAM;AAAA,KACvB,IAAI,QAAY,QAAU;AAAA,EAC9B;AACF;AAIA,SAAS,YAAY,QAAQ,KAAK,OAAO;AAEvC,MAAI,QAAQ,aAAa;AACvB,WAAO,eAAe,QAAQ,KAAK;AAAA,MACjC,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,GAAG,IAAI;AAAA,EAChB;AACF;AAEA,IAAI,oBAAoB,IAAI,MAAM,GAAG;AACrC,IAAI,kBAAkB,IAAI,MAAM,GAAG;AACnC,KAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,oBAAkB,CAAC,IAAI,qBAAqB,CAAC,IAAI,IAAI;AACrD,kBAAgB,CAAC,IAAI,qBAAqB,CAAC;AAC7C;AAHS;AAMT,SAAS,QAAQ,OAAO,SAAS;AAC/B,OAAK,QAAQ;AAEb,OAAK,WAAY,QAAQ,UAAU,KAAM;AACzC,OAAK,SAAY,QAAQ,QAAQ,KAAQ;AACzC,OAAK,YAAY,QAAQ,WAAW,KAAK;AAGzC,OAAK,SAAY,QAAQ,QAAQ,KAAQ;AAEzC,OAAK,OAAY,QAAQ,MAAM,KAAU;AACzC,OAAK,WAAY,QAAQ,UAAU,KAAM;AAEzC,OAAK,gBAAgB,KAAK,OAAO;AACjC,OAAK,UAAgB,KAAK,OAAO;AAEjC,OAAK,SAAa,MAAM;AACxB,OAAK,WAAa;AAClB,OAAK,OAAa;AAClB,OAAK,YAAa;AAClB,OAAK,aAAa;AAIlB,OAAK,iBAAiB;AAEtB,OAAK,YAAY,CAAC;AAYpB;AAGA,SAAS,cAAc,OAAO,SAAS;AACrC,MAAI,OAAO;AAAA,IACT,MAAU,MAAM;AAAA,IAChB,QAAU,MAAM,MAAM,MAAM,GAAG,EAAE;AAAA;AAAA,IACjC,UAAU,MAAM;AAAA,IAChB,MAAU,MAAM;AAAA,IAChB,QAAU,MAAM,WAAW,MAAM;AAAA,EACnC;AAEA,OAAK,UAAU,QAAQ,IAAI;AAE3B,SAAO,IAAI,UAAU,SAAS,IAAI;AACpC;AAEA,SAAS,WAAW,OAAO,SAAS;AAClC,QAAM,cAAc,OAAO,OAAO;AACpC;AAEA,SAAS,aAAa,OAAO,SAAS;AACpC,MAAI,MAAM,WAAW;AACnB,UAAM,UAAU,KAAK,MAAM,cAAc,OAAO,OAAO,CAAC;AAAA,EAC1D;AACF;AAGA,IAAI,oBAAoB;AAAA,EAEtB,MAAM,SAAS,oBAAoB,OAAO,MAAM,MAAM;AAEpD,QAAI,OAAO,OAAO;AAElB,QAAI,MAAM,YAAY,MAAM;AAC1B,iBAAW,OAAO,gCAAgC;AAAA,IACpD;AAEA,QAAI,KAAK,WAAW,GAAG;AACrB,iBAAW,OAAO,6CAA6C;AAAA,IACjE;AAEA,YAAQ,uBAAuB,KAAK,KAAK,CAAC,CAAC;AAE3C,QAAI,UAAU,MAAM;AAClB,iBAAW,OAAO,2CAA2C;AAAA,IAC/D;AAEA,YAAQ,SAAS,MAAM,CAAC,GAAG,EAAE;AAC7B,YAAQ,SAAS,MAAM,CAAC,GAAG,EAAE;AAE7B,QAAI,UAAU,GAAG;AACf,iBAAW,OAAO,2CAA2C;AAAA,IAC/D;AAEA,UAAM,UAAU,KAAK,CAAC;AACtB,UAAM,kBAAmB,QAAQ;AAEjC,QAAI,UAAU,KAAK,UAAU,GAAG;AAC9B,mBAAa,OAAO,0CAA0C;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,KAAK,SAAS,mBAAmB,OAAO,MAAM,MAAM;AAElD,QAAI,QAAQ;AAEZ,QAAI,KAAK,WAAW,GAAG;AACrB,iBAAW,OAAO,6CAA6C;AAAA,IACjE;AAEA,aAAS,KAAK,CAAC;AACf,aAAS,KAAK,CAAC;AAEf,QAAI,CAAC,mBAAmB,KAAK,MAAM,GAAG;AACpC,iBAAW,OAAO,6DAA6D;AAAA,IACjF;AAEA,QAAI,kBAAkB,KAAK,MAAM,QAAQ,MAAM,GAAG;AAChD,iBAAW,OAAO,gDAAgD,SAAS,cAAc;AAAA,IAC3F;AAEA,QAAI,CAAC,gBAAgB,KAAK,MAAM,GAAG;AACjC,iBAAW,OAAO,8DAA8D;AAAA,IAClF;AAEA,QAAI;AACF,eAAS,mBAAmB,MAAM;AAAA,IACpC,SAAS,KAAK;AACZ,iBAAW,OAAO,8BAA8B,MAAM;AAAA,IACxD;AAEA,UAAM,OAAO,MAAM,IAAI;AAAA,EACzB;AACF;AAGA,SAAS,eAAe,OAAO,OAAO,KAAK,WAAW;AACpD,MAAI,WAAW,SAAS,YAAY;AAEpC,MAAI,QAAQ,KAAK;AACf,cAAU,MAAM,MAAM,MAAM,OAAO,GAAG;AAEtC,QAAI,WAAW;AACb,WAAK,YAAY,GAAG,UAAU,QAAQ,QAAQ,YAAY,SAAS,aAAa,GAAG;AACjF,qBAAa,QAAQ,WAAW,SAAS;AACzC,YAAI,EAAE,eAAe,KACd,MAAQ,cAAc,cAAc,UAAY;AACrD,qBAAW,OAAO,+BAA+B;AAAA,QACnD;AAAA,MACF;AAAA,IACF,WAAW,sBAAsB,KAAK,OAAO,GAAG;AAC9C,iBAAW,OAAO,8CAA8C;AAAA,IAClE;AAEA,UAAM,UAAU;AAAA,EAClB;AACF;AAEA,SAAS,cAAc,OAAO,aAAa,QAAQ,iBAAiB;AAClE,MAAI,YAAY,KAAK,OAAO;AAE5B,MAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,eAAW,OAAO,mEAAmE;AAAA,EACvF;AAEA,eAAa,OAAO,KAAK,MAAM;AAE/B,OAAK,QAAQ,GAAG,WAAW,WAAW,QAAQ,QAAQ,UAAU,SAAS,GAAG;AAC1E,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC,kBAAkB,KAAK,aAAa,GAAG,GAAG;AAC7C,kBAAY,aAAa,KAAK,OAAO,GAAG,CAAC;AACzC,sBAAgB,GAAG,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,WAC1E,WAAW,gBAAgB,UAAU;AAErC,MAAI,OAAO;AAKX,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,cAAU,MAAM,UAAU,MAAM,KAAK,OAAO;AAE5C,SAAK,QAAQ,GAAG,WAAW,QAAQ,QAAQ,QAAQ,UAAU,SAAS,GAAG;AACvE,UAAI,MAAM,QAAQ,QAAQ,KAAK,CAAC,GAAG;AACjC,mBAAW,OAAO,6CAA6C;AAAA,MACjE;AAEA,UAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,KAAK,CAAC,MAAM,mBAAmB;AAC/E,gBAAQ,KAAK,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAKA,MAAI,OAAO,YAAY,YAAY,OAAO,OAAO,MAAM,mBAAmB;AACxE,cAAU;AAAA,EACZ;AAGA,YAAU,OAAO,OAAO;AAExB,MAAI,YAAY,MAAM;AACpB,cAAU,CAAC;AAAA,EACb;AAEA,MAAI,WAAW,2BAA2B;AACxC,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,WAAK,QAAQ,GAAG,WAAW,UAAU,QAAQ,QAAQ,UAAU,SAAS,GAAG;AACzE,sBAAc,OAAO,SAAS,UAAU,KAAK,GAAG,eAAe;AAAA,MACjE;AAAA,IACF,OAAO;AACL,oBAAc,OAAO,SAAS,WAAW,eAAe;AAAA,IAC1D;AAAA,EACF,OAAO;AACL,QAAI,CAAC,MAAM,QACP,CAAC,kBAAkB,KAAK,iBAAiB,OAAO,KAChD,kBAAkB,KAAK,SAAS,OAAO,GAAG;AAC5C,YAAM,OAAO,aAAa,MAAM;AAChC,YAAM,YAAY,kBAAkB,MAAM;AAC1C,YAAM,WAAW,YAAY,MAAM;AACnC,iBAAW,OAAO,wBAAwB;AAAA,IAC5C;AAEA,gBAAY,SAAS,SAAS,SAAS;AACvC,WAAO,gBAAgB,OAAO;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAO;AAC5B,MAAI;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,IAAc;AACvB,UAAM;AAAA,EACR,WAAW,OAAO,IAAc;AAC9B,UAAM;AACN,QAAI,MAAM,MAAM,WAAW,MAAM,QAAQ,MAAM,IAAc;AAC3D,YAAM;AAAA,IACR;AAAA,EACF,OAAO;AACL,eAAW,OAAO,0BAA0B;AAAA,EAC9C;AAEA,QAAM,QAAQ;AACd,QAAM,YAAY,MAAM;AACxB,QAAM,iBAAiB;AACzB;AAEA,SAAS,oBAAoB,OAAO,eAAe,aAAa;AAC9D,MAAI,aAAa,GACb,KAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE9C,SAAO,OAAO,GAAG;AACf,WAAO,eAAe,EAAE,GAAG;AACzB,UAAI,OAAO,KAAiB,MAAM,mBAAmB,IAAI;AACvD,cAAM,iBAAiB,MAAM;AAAA,MAC/B;AACA,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C;AAEA,QAAI,iBAAiB,OAAO,IAAa;AACvC,SAAG;AACD,aAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,MAC9C,SAAS,OAAO,MAAgB,OAAO,MAAgB,OAAO;AAAA,IAChE;AAEA,QAAI,OAAO,EAAE,GAAG;AACd,oBAAc,KAAK;AAEnB,WAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC1C;AACA,YAAM,aAAa;AAEnB,aAAO,OAAO,IAAiB;AAC7B,cAAM;AACN,aAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,MAC9C;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,MAAM,eAAe,KAAK,MAAM,aAAa,aAAa;AAC5E,iBAAa,OAAO,uBAAuB;AAAA,EAC7C;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAO;AACpC,MAAI,YAAY,MAAM,UAClB;AAEJ,OAAK,MAAM,MAAM,WAAW,SAAS;AAIrC,OAAK,OAAO,MAAe,OAAO,OAC9B,OAAO,MAAM,MAAM,WAAW,YAAY,CAAC,KAC3C,OAAO,MAAM,MAAM,WAAW,YAAY,CAAC,GAAG;AAEhD,iBAAa;AAEb,SAAK,MAAM,MAAM,WAAW,SAAS;AAErC,QAAI,OAAO,KAAK,aAAa,EAAE,GAAG;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAO,OAAO;AACtC,MAAI,UAAU,GAAG;AACf,UAAM,UAAU;AAAA,EAClB,WAAW,QAAQ,GAAG;AACpB,UAAM,UAAU,OAAO,OAAO,MAAM,QAAQ,CAAC;AAAA,EAC/C;AACF;AAGA,SAAS,gBAAgB,OAAO,YAAY,sBAAsB;AAChE,MAAI,WACA,WACA,cACA,YACA,mBACA,OACA,YACA,aACA,QAAQ,MAAM,MACd,UAAU,MAAM,QAChB;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,aAAa,EAAE,KACf,kBAAkB,EAAE,KACpB,OAAO,MACP,OAAO,MACP,OAAO,MACP,OAAO,MACP,OAAO,OACP,OAAO,MACP,OAAO,MACP,OAAO,MACP,OAAO,MACP,OAAO,MACP,OAAO,IAAa;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,MAAe,OAAO,IAAa;AAC5C,gBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AAErD,QAAI,aAAa,SAAS,KACtB,wBAAwB,kBAAkB,SAAS,GAAG;AACxD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,OAAO;AACb,QAAM,SAAS;AACf,iBAAe,aAAa,MAAM;AAClC,sBAAoB;AAEpB,SAAO,OAAO,GAAG;AACf,QAAI,OAAO,IAAa;AACtB,kBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AAErD,UAAI,aAAa,SAAS,KACtB,wBAAwB,kBAAkB,SAAS,GAAG;AACxD;AAAA,MACF;AAAA,IAEF,WAAW,OAAO,IAAa;AAC7B,kBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AAErD,UAAI,aAAa,SAAS,GAAG;AAC3B;AAAA,MACF;AAAA,IAEF,WAAY,MAAM,aAAa,MAAM,aAAa,sBAAsB,KAAK,KAClE,wBAAwB,kBAAkB,EAAE,GAAG;AACxD;AAAA,IAEF,WAAW,OAAO,EAAE,GAAG;AACrB,cAAQ,MAAM;AACd,mBAAa,MAAM;AACnB,oBAAc,MAAM;AACpB,0BAAoB,OAAO,OAAO,EAAE;AAEpC,UAAI,MAAM,cAAc,YAAY;AAClC,4BAAoB;AACpB,aAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC1C;AAAA,MACF,OAAO;AACL,cAAM,WAAW;AACjB,cAAM,OAAO;AACb,cAAM,YAAY;AAClB,cAAM,aAAa;AACnB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,mBAAmB;AACrB,qBAAe,OAAO,cAAc,YAAY,KAAK;AACrD,uBAAiB,OAAO,MAAM,OAAO,KAAK;AAC1C,qBAAe,aAAa,MAAM;AAClC,0BAAoB;AAAA,IACtB;AAEA,QAAI,CAAC,eAAe,EAAE,GAAG;AACvB,mBAAa,MAAM,WAAW;AAAA,IAChC;AAEA,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,EAC9C;AAEA,iBAAe,OAAO,cAAc,YAAY,KAAK;AAErD,MAAI,MAAM,QAAQ;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO;AACb,QAAM,SAAS;AACf,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAO,YAAY;AACjD,MAAI,IACA,cAAc;AAElB,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,IAAa;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO;AACb,QAAM,SAAS;AACf,QAAM;AACN,iBAAe,aAAa,MAAM;AAElC,UAAQ,KAAK,MAAM,MAAM,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC1D,QAAI,OAAO,IAAa;AACtB,qBAAe,OAAO,cAAc,MAAM,UAAU,IAAI;AACxD,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,UAAI,OAAO,IAAa;AACtB,uBAAe,MAAM;AACrB,cAAM;AACN,qBAAa,MAAM;AAAA,MACrB,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IAEF,WAAW,OAAO,EAAE,GAAG;AACrB,qBAAe,OAAO,cAAc,YAAY,IAAI;AACpD,uBAAiB,OAAO,oBAAoB,OAAO,OAAO,UAAU,CAAC;AACrE,qBAAe,aAAa,MAAM;AAAA,IAEpC,WAAW,MAAM,aAAa,MAAM,aAAa,sBAAsB,KAAK,GAAG;AAC7E,iBAAW,OAAO,8DAA8D;AAAA,IAElF,OAAO;AACL,YAAM;AACN,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,aAAW,OAAO,4DAA4D;AAChF;AAEA,SAAS,uBAAuB,OAAO,YAAY;AACjD,MAAI,cACA,YACA,WACA,WACA,KACA;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,IAAa;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO;AACb,QAAM,SAAS;AACf,QAAM;AACN,iBAAe,aAAa,MAAM;AAElC,UAAQ,KAAK,MAAM,MAAM,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC1D,QAAI,OAAO,IAAa;AACtB,qBAAe,OAAO,cAAc,MAAM,UAAU,IAAI;AACxD,YAAM;AACN,aAAO;AAAA,IAET,WAAW,OAAO,IAAa;AAC7B,qBAAe,OAAO,cAAc,MAAM,UAAU,IAAI;AACxD,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,UAAI,OAAO,EAAE,GAAG;AACd,4BAAoB,OAAO,OAAO,UAAU;AAAA,MAG9C,WAAW,KAAK,OAAO,kBAAkB,EAAE,GAAG;AAC5C,cAAM,UAAU,gBAAgB,EAAE;AAClC,cAAM;AAAA,MAER,YAAY,MAAM,cAAc,EAAE,KAAK,GAAG;AACxC,oBAAY;AACZ,oBAAY;AAEZ,eAAO,YAAY,GAAG,aAAa;AACjC,eAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,eAAK,MAAM,YAAY,EAAE,MAAM,GAAG;AAChC,yBAAa,aAAa,KAAK;AAAA,UAEjC,OAAO;AACL,uBAAW,OAAO,gCAAgC;AAAA,UACpD;AAAA,QACF;AAEA,cAAM,UAAU,kBAAkB,SAAS;AAE3C,cAAM;AAAA,MAER,OAAO;AACL,mBAAW,OAAO,yBAAyB;AAAA,MAC7C;AAEA,qBAAe,aAAa,MAAM;AAAA,IAEpC,WAAW,OAAO,EAAE,GAAG;AACrB,qBAAe,OAAO,cAAc,YAAY,IAAI;AACpD,uBAAiB,OAAO,oBAAoB,OAAO,OAAO,UAAU,CAAC;AACrE,qBAAe,aAAa,MAAM;AAAA,IAEpC,WAAW,MAAM,aAAa,MAAM,aAAa,sBAAsB,KAAK,GAAG;AAC7E,iBAAW,OAAO,8DAA8D;AAAA,IAElF,OAAO;AACL,YAAM;AACN,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,aAAW,OAAO,4DAA4D;AAChF;AAEA,SAAS,mBAAmB,OAAO,YAAY;AAC7C,MAAI,WAAW,MACX,OACA,YACA,MACA,OAAW,MAAM,KACjB,SACA,UAAW,MAAM,QACjB,WACA,YACA,QACA,gBACA,WACA,kBAAkB,uBAAO,OAAO,IAAI,GACpC,SACA,QACA,WACA;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,IAAa;AACtB,iBAAa;AACb,gBAAY;AACZ,cAAU,CAAC;AAAA,EACb,WAAW,OAAO,KAAa;AAC7B,iBAAa;AACb,gBAAY;AACZ,cAAU,CAAC;AAAA,EACb,OAAO;AACL,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,WAAW,MAAM;AACzB,UAAM,UAAU,MAAM,MAAM,IAAI;AAAA,EAClC;AAEA,OAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,SAAO,OAAO,GAAG;AACf,wBAAoB,OAAO,MAAM,UAAU;AAE3C,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,QAAI,OAAO,YAAY;AACrB,YAAM;AACN,YAAM,MAAM;AACZ,YAAM,SAAS;AACf,YAAM,OAAO,YAAY,YAAY;AACrC,YAAM,SAAS;AACf,aAAO;AAAA,IACT,WAAW,CAAC,UAAU;AACpB,iBAAW,OAAO,8CAA8C;AAAA,IAClE,WAAW,OAAO,IAAa;AAE7B,iBAAW,OAAO,0CAA0C;AAAA,IAC9D;AAEA,aAAS,UAAU,YAAY;AAC/B,aAAS,iBAAiB;AAE1B,QAAI,OAAO,IAAa;AACtB,kBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AAErD,UAAI,aAAa,SAAS,GAAG;AAC3B,iBAAS,iBAAiB;AAC1B,cAAM;AACN,4BAAoB,OAAO,MAAM,UAAU;AAAA,MAC7C;AAAA,IACF;AAEA,YAAQ,MAAM;AACd,iBAAa,MAAM;AACnB,WAAO,MAAM;AACb,gBAAY,OAAO,YAAY,iBAAiB,OAAO,IAAI;AAC3D,aAAS,MAAM;AACf,cAAU,MAAM;AAChB,wBAAoB,OAAO,MAAM,UAAU;AAE3C,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,SAAK,kBAAkB,MAAM,SAAS,UAAU,OAAO,IAAa;AAClE,eAAS;AACT,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAC5C,0BAAoB,OAAO,MAAM,UAAU;AAC3C,kBAAY,OAAO,YAAY,iBAAiB,OAAO,IAAI;AAC3D,kBAAY,MAAM;AAAA,IACpB;AAEA,QAAI,WAAW;AACb,uBAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,WAAW,OAAO,YAAY,IAAI;AAAA,IACvG,WAAW,QAAQ;AACjB,cAAQ,KAAK,iBAAiB,OAAO,MAAM,iBAAiB,QAAQ,SAAS,WAAW,OAAO,YAAY,IAAI,CAAC;AAAA,IAClH,OAAO;AACL,cAAQ,KAAK,OAAO;AAAA,IACtB;AAEA,wBAAoB,OAAO,MAAM,UAAU;AAE3C,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,QAAI,OAAO,IAAa;AACtB,iBAAW;AACX,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C,OAAO;AACL,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,aAAW,OAAO,uDAAuD;AAC3E;AAEA,SAAS,gBAAgB,OAAO,YAAY;AAC1C,MAAI,cACA,SACA,WAAiB,eACjB,iBAAiB,OACjB,iBAAiB,OACjB,aAAiB,YACjB,aAAiB,GACjB,iBAAiB,OACjB,KACA;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,KAAa;AACtB,cAAU;AAAA,EACZ,WAAW,OAAO,IAAa;AAC7B,cAAU;AAAA,EACZ,OAAO;AACL,WAAO;AAAA,EACT;AAEA,QAAM,OAAO;AACb,QAAM,SAAS;AAEf,SAAO,OAAO,GAAG;AACf,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,QAAI,OAAO,MAAe,OAAO,IAAa;AAC5C,UAAI,kBAAkB,UAAU;AAC9B,mBAAY,OAAO,KAAe,gBAAgB;AAAA,MACpD,OAAO;AACL,mBAAW,OAAO,sCAAsC;AAAA,MAC1D;AAAA,IAEF,YAAY,MAAM,gBAAgB,EAAE,MAAM,GAAG;AAC3C,UAAI,QAAQ,GAAG;AACb,mBAAW,OAAO,8EAA8E;AAAA,MAClG,WAAW,CAAC,gBAAgB;AAC1B,qBAAa,aAAa,MAAM;AAChC,yBAAiB;AAAA,MACnB,OAAO;AACL,mBAAW,OAAO,2CAA2C;AAAA,MAC/D;AAAA,IAEF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,EAAE,GAAG;AACtB,OAAG;AAAE,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAAG,SAC7C,eAAe,EAAE;AAExB,QAAI,OAAO,IAAa;AACtB,SAAG;AAAE,aAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,MAAG,SAC7C,CAAC,OAAO,EAAE,KAAM,OAAO;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,OAAO,GAAG;AACf,kBAAc,KAAK;AACnB,UAAM,aAAa;AAEnB,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,YAAQ,CAAC,kBAAkB,MAAM,aAAa,eACtC,OAAO,IAAkB;AAC/B,YAAM;AACN,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C;AAEA,QAAI,CAAC,kBAAkB,MAAM,aAAa,YAAY;AACpD,mBAAa,MAAM;AAAA,IACrB;AAEA,QAAI,OAAO,EAAE,GAAG;AACd;AACA;AAAA,IACF;AAGA,QAAI,MAAM,aAAa,YAAY;AAGjC,UAAI,aAAa,eAAe;AAC9B,cAAM,UAAU,OAAO,OAAO,MAAM,iBAAiB,IAAI,aAAa,UAAU;AAAA,MAClF,WAAW,aAAa,eAAe;AACrC,YAAI,gBAAgB;AAClB,gBAAM,UAAU;AAAA,QAClB;AAAA,MACF;AAGA;AAAA,IACF;AAGA,QAAI,SAAS;AAGX,UAAI,eAAe,EAAE,GAAG;AACtB,yBAAiB;AAEjB,cAAM,UAAU,OAAO,OAAO,MAAM,iBAAiB,IAAI,aAAa,UAAU;AAAA,MAGlF,WAAW,gBAAgB;AACzB,yBAAiB;AACjB,cAAM,UAAU,OAAO,OAAO,MAAM,aAAa,CAAC;AAAA,MAGpD,WAAW,eAAe,GAAG;AAC3B,YAAI,gBAAgB;AAClB,gBAAM,UAAU;AAAA,QAClB;AAAA,MAGF,OAAO;AACL,cAAM,UAAU,OAAO,OAAO,MAAM,UAAU;AAAA,MAChD;AAAA,IAGF,OAAO;AAEL,YAAM,UAAU,OAAO,OAAO,MAAM,iBAAiB,IAAI,aAAa,UAAU;AAAA,IAClF;AAEA,qBAAiB;AACjB,qBAAiB;AACjB,iBAAa;AACb,mBAAe,MAAM;AAErB,WAAO,CAAC,OAAO,EAAE,KAAM,OAAO,GAAI;AAChC,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C;AAEA,mBAAe,OAAO,cAAc,MAAM,UAAU,KAAK;AAAA,EAC3D;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAO,YAAY;AAC5C,MAAI,OACA,OAAY,MAAM,KAClB,UAAY,MAAM,QAClB,UAAY,CAAC,GACb,WACA,WAAY,OACZ;AAIJ,MAAI,MAAM,mBAAmB,GAAI,QAAO;AAExC,MAAI,MAAM,WAAW,MAAM;AACzB,UAAM,UAAU,MAAM,MAAM,IAAI;AAAA,EAClC;AAEA,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,SAAO,OAAO,GAAG;AACf,QAAI,MAAM,mBAAmB,IAAI;AAC/B,YAAM,WAAW,MAAM;AACvB,iBAAW,OAAO,gDAAgD;AAAA,IACpE;AAEA,QAAI,OAAO,IAAa;AACtB;AAAA,IACF;AAEA,gBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AAErD,QAAI,CAAC,aAAa,SAAS,GAAG;AAC5B;AAAA,IACF;AAEA,eAAW;AACX,UAAM;AAEN,QAAI,oBAAoB,OAAO,MAAM,EAAE,GAAG;AACxC,UAAI,MAAM,cAAc,YAAY;AAClC,gBAAQ,KAAK,IAAI;AACjB,aAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC1C;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,MAAM;AACd,gBAAY,OAAO,YAAY,kBAAkB,OAAO,IAAI;AAC5D,YAAQ,KAAK,MAAM,MAAM;AACzB,wBAAoB,OAAO,MAAM,EAAE;AAEnC,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,SAAK,MAAM,SAAS,SAAS,MAAM,aAAa,eAAgB,OAAO,GAAI;AACzE,iBAAW,OAAO,qCAAqC;AAAA,IACzD,WAAW,MAAM,aAAa,YAAY;AACxC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,UAAM,MAAM;AACZ,UAAM,SAAS;AACf,UAAM,OAAO;AACb,UAAM,SAAS;AACf,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAO,YAAY,YAAY;AACvD,MAAI,WACA,cACA,OACA,UACA,eACA,SACA,OAAgB,MAAM,KACtB,UAAgB,MAAM,QACtB,UAAgB,CAAC,GACjB,kBAAkB,uBAAO,OAAO,IAAI,GACpC,SAAgB,MAChB,UAAgB,MAChB,YAAgB,MAChB,gBAAgB,OAChB,WAAgB,OAChB;AAIJ,MAAI,MAAM,mBAAmB,GAAI,QAAO;AAExC,MAAI,MAAM,WAAW,MAAM;AACzB,UAAM,UAAU,MAAM,MAAM,IAAI;AAAA,EAClC;AAEA,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,SAAO,OAAO,GAAG;AACf,QAAI,CAAC,iBAAiB,MAAM,mBAAmB,IAAI;AACjD,YAAM,WAAW,MAAM;AACvB,iBAAW,OAAO,gDAAgD;AAAA,IACpE;AAEA,gBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AACrD,YAAQ,MAAM;AAMd,SAAK,OAAO,MAAe,OAAO,OAAgB,aAAa,SAAS,GAAG;AAEzE,UAAI,OAAO,IAAa;AACtB,YAAI,eAAe;AACjB,2BAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,MAAM,UAAU,eAAe,OAAO;AACzG,mBAAS,UAAU,YAAY;AAAA,QACjC;AAEA,mBAAW;AACX,wBAAgB;AAChB,uBAAe;AAAA,MAEjB,WAAW,eAAe;AAExB,wBAAgB;AAChB,uBAAe;AAAA,MAEjB,OAAO;AACL,mBAAW,OAAO,mGAAmG;AAAA,MACvH;AAEA,YAAM,YAAY;AAClB,WAAK;AAAA,IAKP,OAAO;AACL,iBAAW,MAAM;AACjB,sBAAgB,MAAM;AACtB,gBAAU,MAAM;AAEhB,UAAI,CAAC,YAAY,OAAO,YAAY,kBAAkB,OAAO,IAAI,GAAG;AAGlE;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,OAAO;AACxB,aAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,eAAO,eAAe,EAAE,GAAG;AACzB,eAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,QAC9C;AAEA,YAAI,OAAO,IAAa;AACtB,eAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,cAAI,CAAC,aAAa,EAAE,GAAG;AACrB,uBAAW,OAAO,yFAAyF;AAAA,UAC7G;AAEA,cAAI,eAAe;AACjB,6BAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,MAAM,UAAU,eAAe,OAAO;AACzG,qBAAS,UAAU,YAAY;AAAA,UACjC;AAEA,qBAAW;AACX,0BAAgB;AAChB,yBAAe;AACf,mBAAS,MAAM;AACf,oBAAU,MAAM;AAAA,QAElB,WAAW,UAAU;AACnB,qBAAW,OAAO,0DAA0D;AAAA,QAE9E,OAAO;AACL,gBAAM,MAAM;AACZ,gBAAM,SAAS;AACf,iBAAO;AAAA,QACT;AAAA,MAEF,WAAW,UAAU;AACnB,mBAAW,OAAO,gFAAgF;AAAA,MAEpG,OAAO;AACL,cAAM,MAAM;AACZ,cAAM,SAAS;AACf,eAAO;AAAA,MACT;AAAA,IACF;AAKA,QAAI,MAAM,SAAS,SAAS,MAAM,aAAa,YAAY;AACzD,UAAI,eAAe;AACjB,mBAAW,MAAM;AACjB,wBAAgB,MAAM;AACtB,kBAAU,MAAM;AAAA,MAClB;AAEA,UAAI,YAAY,OAAO,YAAY,mBAAmB,MAAM,YAAY,GAAG;AACzE,YAAI,eAAe;AACjB,oBAAU,MAAM;AAAA,QAClB,OAAO;AACL,sBAAY,MAAM;AAAA,QACpB;AAAA,MACF;AAEA,UAAI,CAAC,eAAe;AAClB,yBAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,WAAW,UAAU,eAAe,OAAO;AAC9G,iBAAS,UAAU,YAAY;AAAA,MACjC;AAEA,0BAAoB,OAAO,MAAM,EAAE;AACnC,WAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAAA,IAC5C;AAEA,SAAK,MAAM,SAAS,SAAS,MAAM,aAAa,eAAgB,OAAO,GAAI;AACzE,iBAAW,OAAO,oCAAoC;AAAA,IACxD,WAAW,MAAM,aAAa,YAAY;AACxC;AAAA,IACF;AAAA,EACF;AAOA,MAAI,eAAe;AACjB,qBAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,MAAM,UAAU,eAAe,OAAO;AAAA,EAC3G;AAGA,MAAI,UAAU;AACZ,UAAM,MAAM;AACZ,UAAM,SAAS;AACf,UAAM,OAAO;AACb,UAAM,SAAS;AAAA,EACjB;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAO;AAC9B,MAAI,WACA,aAAa,OACb,UAAa,OACb,WACA,SACA;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,GAAa,QAAO;AAE/B,MAAI,MAAM,QAAQ,MAAM;AACtB,eAAW,OAAO,+BAA+B;AAAA,EACnD;AAEA,OAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,MAAI,OAAO,IAAa;AACtB,iBAAa;AACb,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,EAE9C,WAAW,OAAO,IAAa;AAC7B,cAAU;AACV,gBAAY;AACZ,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,EAE9C,OAAO;AACL,gBAAY;AAAA,EACd;AAEA,cAAY,MAAM;AAElB,MAAI,YAAY;AACd,OAAG;AAAE,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAAG,SAC7C,OAAO,KAAK,OAAO;AAE1B,QAAI,MAAM,WAAW,MAAM,QAAQ;AACjC,gBAAU,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ;AACrD,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C,OAAO;AACL,iBAAW,OAAO,oDAAoD;AAAA,IACxE;AAAA,EACF,OAAO;AACL,WAAO,OAAO,KAAK,CAAC,aAAa,EAAE,GAAG;AAEpC,UAAI,OAAO,IAAa;AACtB,YAAI,CAAC,SAAS;AACZ,sBAAY,MAAM,MAAM,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC;AAE/D,cAAI,CAAC,mBAAmB,KAAK,SAAS,GAAG;AACvC,uBAAW,OAAO,iDAAiD;AAAA,UACrE;AAEA,oBAAU;AACV,sBAAY,MAAM,WAAW;AAAA,QAC/B,OAAO;AACL,qBAAW,OAAO,6CAA6C;AAAA,QACjE;AAAA,MACF;AAEA,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C;AAEA,cAAU,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ;AAErD,QAAI,wBAAwB,KAAK,OAAO,GAAG;AACzC,iBAAW,OAAO,qDAAqD;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,WAAW,CAAC,gBAAgB,KAAK,OAAO,GAAG;AAC7C,eAAW,OAAO,8CAA8C,OAAO;AAAA,EACzE;AAEA,MAAI;AACF,cAAU,mBAAmB,OAAO;AAAA,EACtC,SAAS,KAAK;AACZ,eAAW,OAAO,4BAA4B,OAAO;AAAA,EACvD;AAEA,MAAI,YAAY;AACd,UAAM,MAAM;AAAA,EAEd,WAAW,kBAAkB,KAAK,MAAM,QAAQ,SAAS,GAAG;AAC1D,UAAM,MAAM,MAAM,OAAO,SAAS,IAAI;AAAA,EAExC,WAAW,cAAc,KAAK;AAC5B,UAAM,MAAM,MAAM;AAAA,EAEpB,WAAW,cAAc,MAAM;AAC7B,UAAM,MAAM,uBAAuB;AAAA,EAErC,OAAO;AACL,eAAW,OAAO,4BAA4B,YAAY,GAAG;AAAA,EAC/D;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAO;AACjC,MAAI,WACA;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,GAAa,QAAO;AAE/B,MAAI,MAAM,WAAW,MAAM;AACzB,eAAW,OAAO,mCAAmC;AAAA,EACvD;AAEA,OAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAC5C,cAAY,MAAM;AAElB,SAAO,OAAO,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,kBAAkB,EAAE,GAAG;AAC9D,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,EAC9C;AAEA,MAAI,MAAM,aAAa,WAAW;AAChC,eAAW,OAAO,4DAA4D;AAAA,EAChF;AAEA,QAAM,SAAS,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC1D,SAAO;AACT;AAEA,SAAS,UAAU,OAAO;AACxB,MAAI,WAAW,OACX;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,GAAa,QAAO;AAE/B,OAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAC5C,cAAY,MAAM;AAElB,SAAO,OAAO,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,kBAAkB,EAAE,GAAG;AAC9D,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,EAC9C;AAEA,MAAI,MAAM,aAAa,WAAW;AAChC,eAAW,OAAO,2DAA2D;AAAA,EAC/E;AAEA,UAAQ,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ;AAEnD,MAAI,CAAC,kBAAkB,KAAK,MAAM,WAAW,KAAK,GAAG;AACnD,eAAW,OAAO,yBAAyB,QAAQ,GAAG;AAAA,EACxD;AAEA,QAAM,SAAS,MAAM,UAAU,KAAK;AACpC,sBAAoB,OAAO,MAAM,EAAE;AACnC,SAAO;AACT;AAEA,SAAS,YAAY,OAAO,cAAc,aAAa,aAAa,cAAc;AAChF,MAAI,kBACA,mBACA,uBACA,eAAe,GACf,YAAa,OACb,aAAa,OACb,WACA,cACA,UACAE,OACA,YACA;AAEJ,MAAI,MAAM,aAAa,MAAM;AAC3B,UAAM,SAAS,QAAQ,KAAK;AAAA,EAC9B;AAEA,QAAM,MAAS;AACf,QAAM,SAAS;AACf,QAAM,OAAS;AACf,QAAM,SAAS;AAEf,qBAAmB,oBAAoB,wBACrC,sBAAsB,eACtB,qBAAsB;AAExB,MAAI,aAAa;AACf,QAAI,oBAAoB,OAAO,MAAM,EAAE,GAAG;AACxC,kBAAY;AAEZ,UAAI,MAAM,aAAa,cAAc;AACnC,uBAAe;AAAA,MACjB,WAAW,MAAM,eAAe,cAAc;AAC5C,uBAAe;AAAA,MACjB,WAAW,MAAM,aAAa,cAAc;AAC1C,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB,GAAG;AACtB,WAAO,gBAAgB,KAAK,KAAK,mBAAmB,KAAK,GAAG;AAC1D,UAAI,oBAAoB,OAAO,MAAM,EAAE,GAAG;AACxC,oBAAY;AACZ,gCAAwB;AAExB,YAAI,MAAM,aAAa,cAAc;AACnC,yBAAe;AAAA,QACjB,WAAW,MAAM,eAAe,cAAc;AAC5C,yBAAe;AAAA,QACjB,WAAW,MAAM,aAAa,cAAc;AAC1C,yBAAe;AAAA,QACjB;AAAA,MACF,OAAO;AACL,gCAAwB;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,uBAAuB;AACzB,4BAAwB,aAAa;AAAA,EACvC;AAEA,MAAI,iBAAiB,KAAK,sBAAsB,aAAa;AAC3D,QAAI,oBAAoB,eAAe,qBAAqB,aAAa;AACvE,mBAAa;AAAA,IACf,OAAO;AACL,mBAAa,eAAe;AAAA,IAC9B;AAEA,kBAAc,MAAM,WAAW,MAAM;AAErC,QAAI,iBAAiB,GAAG;AACtB,UAAI,0BACC,kBAAkB,OAAO,WAAW,KACpC,iBAAiB,OAAO,aAAa,UAAU,MAChD,mBAAmB,OAAO,UAAU,GAAG;AACzC,qBAAa;AAAA,MACf,OAAO;AACL,YAAK,qBAAqB,gBAAgB,OAAO,UAAU,KACvD,uBAAuB,OAAO,UAAU,KACxC,uBAAuB,OAAO,UAAU,GAAG;AAC7C,uBAAa;AAAA,QAEf,WAAW,UAAU,KAAK,GAAG;AAC3B,uBAAa;AAEb,cAAI,MAAM,QAAQ,QAAQ,MAAM,WAAW,MAAM;AAC/C,uBAAW,OAAO,2CAA2C;AAAA,UAC/D;AAAA,QAEF,WAAW,gBAAgB,OAAO,YAAY,oBAAoB,WAAW,GAAG;AAC9E,uBAAa;AAEb,cAAI,MAAM,QAAQ,MAAM;AACtB,kBAAM,MAAM;AAAA,UACd;AAAA,QACF;AAEA,YAAI,MAAM,WAAW,MAAM;AACzB,gBAAM,UAAU,MAAM,MAAM,IAAI,MAAM;AAAA,QACxC;AAAA,MACF;AAAA,IACF,WAAW,iBAAiB,GAAG;AAG7B,mBAAa,yBAAyB,kBAAkB,OAAO,WAAW;AAAA,IAC5E;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,MAAM;AACtB,QAAI,MAAM,WAAW,MAAM;AACzB,YAAM,UAAU,MAAM,MAAM,IAAI,MAAM;AAAA,IACxC;AAAA,EAEF,WAAW,MAAM,QAAQ,KAAK;AAO5B,QAAI,MAAM,WAAW,QAAQ,MAAM,SAAS,UAAU;AACpD,iBAAW,OAAO,sEAAsE,MAAM,OAAO,GAAG;AAAA,IAC1G;AAEA,SAAK,YAAY,GAAG,eAAe,MAAM,cAAc,QAAQ,YAAY,cAAc,aAAa,GAAG;AACvG,MAAAA,QAAO,MAAM,cAAc,SAAS;AAEpC,UAAIA,MAAK,QAAQ,MAAM,MAAM,GAAG;AAC9B,cAAM,SAASA,MAAK,UAAU,MAAM,MAAM;AAC1C,cAAM,MAAMA,MAAK;AACjB,YAAI,MAAM,WAAW,MAAM;AACzB,gBAAM,UAAU,MAAM,MAAM,IAAI,MAAM;AAAA,QACxC;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,MAAM,QAAQ,KAAK;AAC5B,QAAI,kBAAkB,KAAK,MAAM,QAAQ,MAAM,QAAQ,UAAU,GAAG,MAAM,GAAG,GAAG;AAC9E,MAAAA,QAAO,MAAM,QAAQ,MAAM,QAAQ,UAAU,EAAE,MAAM,GAAG;AAAA,IAC1D,OAAO;AAEL,MAAAA,QAAO;AACP,iBAAW,MAAM,QAAQ,MAAM,MAAM,QAAQ,UAAU;AAEvD,WAAK,YAAY,GAAG,eAAe,SAAS,QAAQ,YAAY,cAAc,aAAa,GAAG;AAC5F,YAAI,MAAM,IAAI,MAAM,GAAG,SAAS,SAAS,EAAE,IAAI,MAAM,MAAM,SAAS,SAAS,EAAE,KAAK;AAClF,UAAAA,QAAO,SAAS,SAAS;AACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAACA,OAAM;AACT,iBAAW,OAAO,mBAAmB,MAAM,MAAM,GAAG;AAAA,IACtD;AAEA,QAAI,MAAM,WAAW,QAAQA,MAAK,SAAS,MAAM,MAAM;AACrD,iBAAW,OAAO,kCAAkC,MAAM,MAAM,0BAA0BA,MAAK,OAAO,aAAa,MAAM,OAAO,GAAG;AAAA,IACrI;AAEA,QAAI,CAACA,MAAK,QAAQ,MAAM,QAAQ,MAAM,GAAG,GAAG;AAC1C,iBAAW,OAAO,kCAAkC,MAAM,MAAM,gBAAgB;AAAA,IAClF,OAAO;AACL,YAAM,SAASA,MAAK,UAAU,MAAM,QAAQ,MAAM,GAAG;AACrD,UAAI,MAAM,WAAW,MAAM;AACzB,cAAM,UAAU,MAAM,MAAM,IAAI,MAAM;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,aAAa,MAAM;AAC3B,UAAM,SAAS,SAAS,KAAK;AAAA,EAC/B;AACA,SAAO,MAAM,QAAQ,QAAS,MAAM,WAAW,QAAQ;AACzD;AAEA,SAAS,aAAa,OAAO;AAC3B,MAAI,gBAAgB,MAAM,UACtB,WACA,eACA,eACA,gBAAgB,OAChB;AAEJ,QAAM,UAAU;AAChB,QAAM,kBAAkB,MAAM;AAC9B,QAAM,SAAS,uBAAO,OAAO,IAAI;AACjC,QAAM,YAAY,uBAAO,OAAO,IAAI;AAEpC,UAAQ,KAAK,MAAM,MAAM,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC1D,wBAAoB,OAAO,MAAM,EAAE;AAEnC,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,QAAI,MAAM,aAAa,KAAK,OAAO,IAAa;AAC9C;AAAA,IACF;AAEA,oBAAgB;AAChB,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAC5C,gBAAY,MAAM;AAElB,WAAO,OAAO,KAAK,CAAC,aAAa,EAAE,GAAG;AACpC,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C;AAEA,oBAAgB,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC3D,oBAAgB,CAAC;AAEjB,QAAI,cAAc,SAAS,GAAG;AAC5B,iBAAW,OAAO,8DAA8D;AAAA,IAClF;AAEA,WAAO,OAAO,GAAG;AACf,aAAO,eAAe,EAAE,GAAG;AACzB,aAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,MAC9C;AAEA,UAAI,OAAO,IAAa;AACtB,WAAG;AAAE,eAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,QAAG,SAC7C,OAAO,KAAK,CAAC,OAAO,EAAE;AAC7B;AAAA,MACF;AAEA,UAAI,OAAO,EAAE,EAAG;AAEhB,kBAAY,MAAM;AAElB,aAAO,OAAO,KAAK,CAAC,aAAa,EAAE,GAAG;AACpC,aAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,MAC9C;AAEA,oBAAc,KAAK,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ,CAAC;AAAA,IACjE;AAEA,QAAI,OAAO,EAAG,eAAc,KAAK;AAEjC,QAAI,kBAAkB,KAAK,mBAAmB,aAAa,GAAG;AAC5D,wBAAkB,aAAa,EAAE,OAAO,eAAe,aAAa;AAAA,IACtE,OAAO;AACL,mBAAa,OAAO,iCAAiC,gBAAgB,GAAG;AAAA,IAC1E;AAAA,EACF;AAEA,sBAAoB,OAAO,MAAM,EAAE;AAEnC,MAAI,MAAM,eAAe,KACrB,MAAM,MAAM,WAAW,MAAM,QAAQ,MAAU,MAC/C,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC,MAAM,MAC/C,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC,MAAM,IAAa;AAC9D,UAAM,YAAY;AAClB,wBAAoB,OAAO,MAAM,EAAE;AAAA,EAErC,WAAW,eAAe;AACxB,eAAW,OAAO,iCAAiC;AAAA,EACrD;AAEA,cAAY,OAAO,MAAM,aAAa,GAAG,mBAAmB,OAAO,IAAI;AACvE,sBAAoB,OAAO,MAAM,EAAE;AAEnC,MAAI,MAAM,mBACN,8BAA8B,KAAK,MAAM,MAAM,MAAM,eAAe,MAAM,QAAQ,CAAC,GAAG;AACxF,iBAAa,OAAO,kDAAkD;AAAA,EACxE;AAEA,QAAM,UAAU,KAAK,MAAM,MAAM;AAEjC,MAAI,MAAM,aAAa,MAAM,aAAa,sBAAsB,KAAK,GAAG;AAEtE,QAAI,MAAM,MAAM,WAAW,MAAM,QAAQ,MAAM,IAAa;AAC1D,YAAM,YAAY;AAClB,0BAAoB,OAAO,MAAM,EAAE;AAAA,IACrC;AACA;AAAA,EACF;AAEA,MAAI,MAAM,WAAY,MAAM,SAAS,GAAI;AACvC,eAAW,OAAO,uDAAuD;AAAA,EAC3E,OAAO;AACL;AAAA,EACF;AACF;AAGA,SAAS,cAAc,OAAO,SAAS;AACrC,UAAQ,OAAO,KAAK;AACpB,YAAU,WAAW,CAAC;AAEtB,MAAI,MAAM,WAAW,GAAG;AAGtB,QAAI,MAAM,WAAW,MAAM,SAAS,CAAC,MAAM,MACvC,MAAM,WAAW,MAAM,SAAS,CAAC,MAAM,IAAc;AACvD,eAAS;AAAA,IACX;AAGA,QAAI,MAAM,WAAW,CAAC,MAAM,OAAQ;AAClC,cAAQ,MAAM,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,QAAQ,IAAI,QAAQ,OAAO,OAAO;AAEtC,MAAI,UAAU,MAAM,QAAQ,IAAI;AAEhC,MAAI,YAAY,IAAI;AAClB,UAAM,WAAW;AACjB,eAAW,OAAO,mCAAmC;AAAA,EACvD;AAGA,QAAM,SAAS;AAEf,SAAO,MAAM,MAAM,WAAW,MAAM,QAAQ,MAAM,IAAiB;AACjE,UAAM,cAAc;AACpB,UAAM,YAAY;AAAA,EACpB;AAEA,SAAO,MAAM,WAAY,MAAM,SAAS,GAAI;AAC1C,iBAAa,KAAK;AAAA,EACpB;AAEA,SAAO,MAAM;AACf;AAGA,SAAS,UAAU,OAAO,UAAU,SAAS;AAC3C,MAAI,aAAa,QAAQ,OAAO,aAAa,YAAY,OAAO,YAAY,aAAa;AACvF,cAAU;AACV,eAAW;AAAA,EACb;AAEA,MAAI,YAAY,cAAc,OAAO,OAAO;AAE5C,MAAI,OAAO,aAAa,YAAY;AAClC,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,GAAG,SAAS,UAAU,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACzE,aAAS,UAAU,KAAK,CAAC;AAAA,EAC3B;AACF;AAGA,SAAS,OAAO,OAAO,SAAS;AAC9B,MAAI,YAAY,cAAc,OAAO,OAAO;AAE5C,MAAI,UAAU,WAAW,GAAG;AAE1B,WAAO;AAAA,EACT,WAAW,UAAU,WAAW,GAAG;AACjC,WAAO,UAAU,CAAC;AAAA,EACpB;AACA,QAAM,IAAI,UAAU,0DAA0D;AAChF;AAGA,IAAI,YAAY;AAChB,IAAI,SAAY;AAEhB,IAAI,SAAS;AAAA,EACZ,SAAS;AAAA,EACT,MAAM;AACP;AAQA,IAAI,YAAkB,OAAO,UAAU;AACvC,IAAI,kBAAkB,OAAO,UAAU;AAEvC,IAAI,WAA4B;AAChC,IAAI,WAA4B;AAChC,IAAI,iBAA4B;AAChC,IAAI,uBAA4B;AAChC,IAAI,aAA4B;AAChC,IAAI,mBAA4B;AAChC,IAAI,oBAA4B;AAChC,IAAI,aAA4B;AAChC,IAAI,eAA4B;AAChC,IAAI,iBAA4B;AAChC,IAAI,oBAA4B;AAChC,IAAI,gBAA4B;AAChC,IAAI,aAA4B;AAChC,IAAI,aAA4B;AAChC,IAAI,aAA4B;AAChC,IAAI,cAA4B;AAChC,IAAI,oBAA4B;AAChC,IAAI,gBAA4B;AAChC,IAAI,qBAA4B;AAChC,IAAI,2BAA4B;AAChC,IAAI,4BAA4B;AAChC,IAAI,oBAA4B;AAChC,IAAI,0BAA4B;AAChC,IAAI,qBAA4B;AAChC,IAAI,2BAA4B;AAEhC,IAAI,mBAAmB,CAAC;AAExB,iBAAiB,CAAI,IAAM;AAC3B,iBAAiB,CAAI,IAAM;AAC3B,iBAAiB,CAAI,IAAM;AAC3B,iBAAiB,CAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,GAAI,IAAM;AAC3B,iBAAiB,GAAI,IAAM;AAC3B,iBAAiB,IAAM,IAAI;AAC3B,iBAAiB,IAAM,IAAI;AAE3B,IAAI,6BAA6B;AAAA,EAC/B;AAAA,EAAK;AAAA,EAAK;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAM;AAAA,EAC3C;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAC5C;AAEA,IAAI,2BAA2B;AAE/B,SAAS,gBAAgBD,SAAQD,MAAK;AACpC,MAAI,QAAQ,MAAM,OAAO,QAAQ,KAAK,OAAOE;AAE7C,MAAIF,SAAQ,KAAM,QAAO,CAAC;AAE1B,WAAS,CAAC;AACV,SAAO,OAAO,KAAKA,IAAG;AAEtB,OAAK,QAAQ,GAAG,SAAS,KAAK,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAChE,UAAM,KAAK,KAAK;AAChB,YAAQ,OAAOA,KAAI,GAAG,CAAC;AAEvB,QAAI,IAAI,MAAM,GAAG,CAAC,MAAM,MAAM;AAC5B,YAAM,uBAAuB,IAAI,MAAM,CAAC;AAAA,IAC1C;AACA,IAAAE,QAAOD,QAAO,gBAAgB,UAAU,EAAE,GAAG;AAE7C,QAAIC,SAAQ,gBAAgB,KAAKA,MAAK,cAAc,KAAK,GAAG;AAC1D,cAAQA,MAAK,aAAa,KAAK;AAAA,IACjC;AAEA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,WAAW;AAC5B,MAAI,QAAQ,QAAQ;AAEpB,WAAS,UAAU,SAAS,EAAE,EAAE,YAAY;AAE5C,MAAI,aAAa,KAAM;AACrB,aAAS;AACT,aAAS;AAAA,EACX,WAAW,aAAa,OAAQ;AAC9B,aAAS;AACT,aAAS;AAAA,EACX,WAAW,aAAa,YAAY;AAClC,aAAS;AACT,aAAS;AAAA,EACX,OAAO;AACL,UAAM,IAAI,UAAU,+DAA+D;AAAA,EACrF;AAEA,SAAO,OAAO,SAAS,OAAO,OAAO,KAAK,SAAS,OAAO,MAAM,IAAI;AACtE;AAGA,IAAI,sBAAsB;AAA1B,IACI,sBAAsB;AAE1B,SAAS,MAAM,SAAS;AACtB,OAAK,SAAgB,QAAQ,QAAQ,KAAK;AAC1C,OAAK,SAAgB,KAAK,IAAI,GAAI,QAAQ,QAAQ,KAAK,CAAE;AACzD,OAAK,gBAAgB,QAAQ,eAAe,KAAK;AACjD,OAAK,cAAgB,QAAQ,aAAa,KAAK;AAC/C,OAAK,YAAiB,OAAO,UAAU,QAAQ,WAAW,CAAC,IAAI,KAAK,QAAQ,WAAW;AACvF,OAAK,WAAgB,gBAAgB,KAAK,QAAQ,QAAQ,QAAQ,KAAK,IAAI;AAC3E,OAAK,WAAgB,QAAQ,UAAU,KAAK;AAC5C,OAAK,YAAgB,QAAQ,WAAW,KAAK;AAC7C,OAAK,SAAgB,QAAQ,QAAQ,KAAK;AAC1C,OAAK,eAAgB,QAAQ,cAAc,KAAK;AAChD,OAAK,eAAgB,QAAQ,cAAc,KAAK;AAChD,OAAK,cAAgB,QAAQ,aAAa,MAAM,MAAM,sBAAsB;AAC5E,OAAK,cAAgB,QAAQ,aAAa,KAAK;AAC/C,OAAK,WAAgB,OAAO,QAAQ,UAAU,MAAM,aAAa,QAAQ,UAAU,IAAI;AAEvF,OAAK,gBAAgB,KAAK,OAAO;AACjC,OAAK,gBAAgB,KAAK,OAAO;AAEjC,OAAK,MAAM;AACX,OAAK,SAAS;AAEd,OAAK,aAAa,CAAC;AACnB,OAAK,iBAAiB;AACxB;AAGA,SAAS,aAAa,QAAQ,QAAQ;AACpC,MAAI,MAAM,OAAO,OAAO,KAAK,MAAM,GAC/B,WAAW,GACX,OAAO,IACP,SAAS,IACT,MACA,SAAS,OAAO;AAEpB,SAAO,WAAW,QAAQ;AACxB,WAAO,OAAO,QAAQ,MAAM,QAAQ;AACpC,QAAI,SAAS,IAAI;AACf,aAAO,OAAO,MAAM,QAAQ;AAC5B,iBAAW;AAAA,IACb,OAAO;AACL,aAAO,OAAO,MAAM,UAAU,OAAO,CAAC;AACtC,iBAAW,OAAO;AAAA,IACpB;AAEA,QAAI,KAAK,UAAU,SAAS,KAAM,WAAU;AAE5C,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAO,OAAO;AACtC,SAAO,OAAO,OAAO,OAAO,KAAK,MAAM,SAAS,KAAK;AACvD;AAEA,SAAS,sBAAsB,OAAOE,MAAK;AACzC,MAAI,OAAO,QAAQF;AAEnB,OAAK,QAAQ,GAAG,SAAS,MAAM,cAAc,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAC/E,IAAAA,QAAO,MAAM,cAAc,KAAK;AAEhC,QAAIA,MAAK,QAAQE,IAAG,GAAG;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,aAAa,GAAG;AACvB,SAAO,MAAM,cAAc,MAAM;AACnC;AAMA,SAAS,YAAY,GAAG;AACtB,SAAS,MAAW,KAAK,KAAK,OACrB,OAAW,KAAK,KAAK,SAAa,MAAM,QAAU,MAAM,QACxD,SAAW,KAAK,KAAK,SAAa,MAAM,YACxC,SAAW,KAAK,KAAK;AAChC;AAOA,SAAS,qBAAqB,GAAG;AAC/B,SAAO,YAAY,CAAC,KACf,MAAM,YAEN,MAAM,wBACN,MAAM;AACb;AAWA,SAAS,YAAY,GAAG,MAAM,SAAS;AACrC,MAAI,wBAAwB,qBAAqB,CAAC;AAClD,MAAI,YAAY,yBAAyB,CAAC,aAAa,CAAC;AACxD;AAAA;AAAA,KAEE;AAAA;AAAA,MACE;AAAA,QACE,yBAEG,MAAM,cACN,MAAM,4BACN,MAAM,6BACN,MAAM,2BACN,MAAM,6BAGV,MAAM,cACN,EAAE,SAAS,cAAc,CAAC,cACzB,qBAAqB,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,MAAM,cAC3D,SAAS,cAAc;AAAA;AAC/B;AAGA,SAAS,iBAAiB,GAAG;AAI3B,SAAO,YAAY,CAAC,KAAK,MAAM,YAC1B,CAAC,aAAa,CAAC,KAGf,MAAM,cACN,MAAM,iBACN,MAAM,cACN,MAAM,cACN,MAAM,4BACN,MAAM,6BACN,MAAM,2BACN,MAAM,4BAEN,MAAM,cACN,MAAM,kBACN,MAAM,iBACN,MAAM,oBACN,MAAM,sBACN,MAAM,eACN,MAAM,qBACN,MAAM,qBACN,MAAM,qBAEN,MAAM,gBACN,MAAM,sBACN,MAAM;AACb;AAGA,SAAS,gBAAgB,GAAG;AAE1B,SAAO,CAAC,aAAa,CAAC,KAAK,MAAM;AACnC;AAGA,SAAS,YAAY,QAAQ,KAAK;AAChC,MAAI,QAAQ,OAAO,WAAW,GAAG,GAAG;AACpC,MAAI,SAAS,SAAU,SAAS,SAAU,MAAM,IAAI,OAAO,QAAQ;AACjE,aAAS,OAAO,WAAW,MAAM,CAAC;AAClC,QAAI,UAAU,SAAU,UAAU,OAAQ;AAExC,cAAQ,QAAQ,SAAU,OAAQ,SAAS,QAAS;AAAA,IACtD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,oBAAoB,QAAQ;AACnC,MAAI,iBAAiB;AACrB,SAAO,eAAe,KAAK,MAAM;AACnC;AAEA,IAAI,cAAgB;AAApB,IACI,eAAgB;AADpB,IAEI,gBAAgB;AAFpB,IAGI,eAAgB;AAHpB,IAII,eAAgB;AASpB,SAAS,kBAAkB,QAAQ,gBAAgB,gBAAgB,WACjE,mBAAmB,aAAa,aAAa,SAAS;AAEtD,MAAI;AACJ,MAAI,OAAO;AACX,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,MAAI,kBAAkB;AACtB,MAAI,mBAAmB,cAAc;AACrC,MAAI,oBAAoB;AACxB,MAAI,QAAQ,iBAAiB,YAAY,QAAQ,CAAC,CAAC,KACxC,gBAAgB,YAAY,QAAQ,OAAO,SAAS,CAAC,CAAC;AAEjE,MAAI,kBAAkB,aAAa;AAGjC,SAAK,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,QAAU,KAAK,IAAI,KAAK;AAC7D,aAAO,YAAY,QAAQ,CAAC;AAC5B,UAAI,CAAC,YAAY,IAAI,GAAG;AACtB,eAAO;AAAA,MACT;AACA,cAAQ,SAAS,YAAY,MAAM,UAAU,OAAO;AACpD,iBAAW;AAAA,IACb;AAAA,EACF,OAAO;AAEL,SAAK,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,QAAU,KAAK,IAAI,KAAK;AAC7D,aAAO,YAAY,QAAQ,CAAC;AAC5B,UAAI,SAAS,gBAAgB;AAC3B,uBAAe;AAEf,YAAI,kBAAkB;AACpB,4BAAkB;AAAA,UAEf,IAAI,oBAAoB,IAAI,aAC5B,OAAO,oBAAoB,CAAC,MAAM;AACrC,8BAAoB;AAAA,QACtB;AAAA,MACF,WAAW,CAAC,YAAY,IAAI,GAAG;AAC7B,eAAO;AAAA,MACT;AACA,cAAQ,SAAS,YAAY,MAAM,UAAU,OAAO;AACpD,iBAAW;AAAA,IACb;AAEA,sBAAkB,mBAAoB,qBACnC,IAAI,oBAAoB,IAAI,aAC5B,OAAO,oBAAoB,CAAC,MAAM;AAAA,EACvC;AAIA,MAAI,CAAC,gBAAgB,CAAC,iBAAiB;AAGrC,QAAI,SAAS,CAAC,eAAe,CAAC,kBAAkB,MAAM,GAAG;AACvD,aAAO;AAAA,IACT;AACA,WAAO,gBAAgB,sBAAsB,eAAe;AAAA,EAC9D;AAEA,MAAI,iBAAiB,KAAK,oBAAoB,MAAM,GAAG;AACrD,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,aAAa;AAChB,WAAO,kBAAkB,eAAe;AAAA,EAC1C;AACA,SAAO,gBAAgB,sBAAsB,eAAe;AAC9D;AAQA,SAAS,YAAY,OAAO,QAAQ,OAAO,OAAO,SAAS;AACzD,QAAM,QAAQ,WAAY;AACxB,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,MAAM,gBAAgB,sBAAsB,OAAO;AAAA,IAC5D;AACA,QAAI,CAAC,MAAM,cAAc;AACvB,UAAI,2BAA2B,QAAQ,MAAM,MAAM,MAAM,yBAAyB,KAAK,MAAM,GAAG;AAC9F,eAAO,MAAM,gBAAgB,sBAAuB,MAAM,SAAS,MAAQ,MAAM,SAAS;AAAA,MAC5F;AAAA,IACF;AAEA,QAAI,SAAS,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK;AAQ7C,QAAI,YAAY,MAAM,cAAc,KAChC,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,WAAW,EAAE,GAAG,MAAM,YAAY,MAAM;AAGzE,QAAI,iBAAiB,SAEf,MAAM,YAAY,MAAM,SAAS,MAAM;AAC7C,aAAS,cAAcC,SAAQ;AAC7B,aAAO,sBAAsB,OAAOA,OAAM;AAAA,IAC5C;AAEA,YAAQ;AAAA,MAAkB;AAAA,MAAQ;AAAA,MAAgB,MAAM;AAAA,MAAQ;AAAA,MAC9D;AAAA,MAAe,MAAM;AAAA,MAAa,MAAM,eAAe,CAAC;AAAA,MAAO;AAAA,IAAO,GAAG;AAAA,MAEzE,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,MAAM,OAAO,QAAQ,MAAM,IAAI,IAAI;AAAA,MAC5C,KAAK;AACH,eAAO,MAAM,YAAY,QAAQ,MAAM,MAAM,IACzC,kBAAkB,aAAa,QAAQ,MAAM,CAAC;AAAA,MACpD,KAAK;AACH,eAAO,MAAM,YAAY,QAAQ,MAAM,MAAM,IACzC,kBAAkB,aAAa,WAAW,QAAQ,SAAS,GAAG,MAAM,CAAC;AAAA,MAC3E,KAAK;AACH,eAAO,MAAM,aAAa,MAAM,IAAI;AAAA,MACtC;AACE,cAAM,IAAI,UAAU,wCAAwC;AAAA,IAChE;AAAA,EACF,GAAE;AACJ;AAGA,SAAS,YAAY,QAAQ,gBAAgB;AAC3C,MAAI,kBAAkB,oBAAoB,MAAM,IAAI,OAAO,cAAc,IAAI;AAG7E,MAAI,OAAgB,OAAO,OAAO,SAAS,CAAC,MAAM;AAClD,MAAI,OAAO,SAAS,OAAO,OAAO,SAAS,CAAC,MAAM,QAAQ,WAAW;AACrE,MAAI,QAAQ,OAAO,MAAO,OAAO,KAAK;AAEtC,SAAO,kBAAkB,QAAQ;AACnC;AAGA,SAAS,kBAAkB,QAAQ;AACjC,SAAO,OAAO,OAAO,SAAS,CAAC,MAAM,OAAO,OAAO,MAAM,GAAG,EAAE,IAAI;AACpE;AAIA,SAAS,WAAW,QAAQ,OAAO;AAKjC,MAAI,SAAS;AAGb,MAAI,UAAU,WAAY;AACxB,QAAI,SAAS,OAAO,QAAQ,IAAI;AAChC,aAAS,WAAW,KAAK,SAAS,OAAO;AACzC,WAAO,YAAY;AACnB,WAAO,SAAS,OAAO,MAAM,GAAG,MAAM,GAAG,KAAK;AAAA,EAChD,GAAE;AAEF,MAAI,mBAAmB,OAAO,CAAC,MAAM,QAAQ,OAAO,CAAC,MAAM;AAC3D,MAAI;AAGJ,MAAI;AACJ,SAAQ,QAAQ,OAAO,KAAK,MAAM,GAAI;AACpC,QAAI,SAAS,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC;AACrC,mBAAgB,KAAK,CAAC,MAAM;AAC5B,cAAU,UACL,CAAC,oBAAoB,CAAC,gBAAgB,SAAS,KAC9C,OAAO,MACT,SAAS,MAAM,KAAK;AACxB,uBAAmB;AAAA,EACrB;AAEA,SAAO;AACT;AAMA,SAAS,SAAS,MAAM,OAAO;AAC7B,MAAI,SAAS,MAAM,KAAK,CAAC,MAAM,IAAK,QAAO;AAG3C,MAAI,UAAU;AACd,MAAI;AAEJ,MAAI,QAAQ,GAAG,KAAK,OAAO,GAAG,OAAO;AACrC,MAAI,SAAS;AAMb,SAAQ,QAAQ,QAAQ,KAAK,IAAI,GAAI;AACnC,WAAO,MAAM;AAEb,QAAI,OAAO,QAAQ,OAAO;AACxB,YAAO,OAAO,QAAS,OAAO;AAC9B,gBAAU,OAAO,KAAK,MAAM,OAAO,GAAG;AAEtC,cAAQ,MAAM;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAIA,YAAU;AAEV,MAAI,KAAK,SAAS,QAAQ,SAAS,OAAO,OAAO;AAC/C,cAAU,KAAK,MAAM,OAAO,IAAI,IAAI,OAAO,KAAK,MAAM,OAAO,CAAC;AAAA,EAChE,OAAO;AACL,cAAU,KAAK,MAAM,KAAK;AAAA,EAC5B;AAEA,SAAO,OAAO,MAAM,CAAC;AACvB;AAGA,SAAS,aAAa,QAAQ;AAC5B,MAAI,SAAS;AACb,MAAI,OAAO;AACX,MAAI;AAEJ,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,QAAU,KAAK,IAAI,KAAK;AACjE,WAAO,YAAY,QAAQ,CAAC;AAC5B,gBAAY,iBAAiB,IAAI;AAEjC,QAAI,CAAC,aAAa,YAAY,IAAI,GAAG;AACnC,gBAAU,OAAO,CAAC;AAClB,UAAI,QAAQ,MAAS,WAAU,OAAO,IAAI,CAAC;AAAA,IAC7C,OAAO;AACL,gBAAU,aAAa,UAAU,IAAI;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAO,OAAO,QAAQ;AAC/C,MAAI,UAAU,IACV,OAAU,MAAM,KAChB,OACA,QACA;AAEJ,OAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,YAAQ,OAAO,KAAK;AAEpB,QAAI,MAAM,UAAU;AAClB,cAAQ,MAAM,SAAS,KAAK,QAAQ,OAAO,KAAK,GAAG,KAAK;AAAA,IAC1D;AAGA,QAAI,UAAU,OAAO,OAAO,OAAO,OAAO,KAAK,KAC1C,OAAO,UAAU,eACjB,UAAU,OAAO,OAAO,MAAM,OAAO,KAAK,GAAI;AAEjD,UAAI,YAAY,GAAI,YAAW,OAAO,CAAC,MAAM,eAAe,MAAM;AAClE,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,MAAM;AACZ,QAAM,OAAO,MAAM,UAAU;AAC/B;AAEA,SAAS,mBAAmB,OAAO,OAAO,QAAQ,SAAS;AACzD,MAAI,UAAU,IACV,OAAU,MAAM,KAChB,OACA,QACA;AAEJ,OAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,YAAQ,OAAO,KAAK;AAEpB,QAAI,MAAM,UAAU;AAClB,cAAQ,MAAM,SAAS,KAAK,QAAQ,OAAO,KAAK,GAAG,KAAK;AAAA,IAC1D;AAGA,QAAI,UAAU,OAAO,QAAQ,GAAG,OAAO,MAAM,MAAM,OAAO,IAAI,KACzD,OAAO,UAAU,eACjB,UAAU,OAAO,QAAQ,GAAG,MAAM,MAAM,MAAM,OAAO,IAAI,GAAI;AAEhE,UAAI,CAAC,WAAW,YAAY,IAAI;AAC9B,mBAAW,iBAAiB,OAAO,KAAK;AAAA,MAC1C;AAEA,UAAI,MAAM,QAAQ,mBAAmB,MAAM,KAAK,WAAW,CAAC,GAAG;AAC7D,mBAAW;AAAA,MACb,OAAO;AACL,mBAAW;AAAA,MACb;AAEA,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,MAAM;AACZ,QAAM,OAAO,WAAW;AAC1B;AAEA,SAAS,iBAAiB,OAAO,OAAO,QAAQ;AAC9C,MAAI,UAAgB,IAChB,OAAgB,MAAM,KACtB,gBAAgB,OAAO,KAAK,MAAM,GAClC,OACA,QACA,WACA,aACA;AAEJ,OAAK,QAAQ,GAAG,SAAS,cAAc,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAEzE,iBAAa;AACb,QAAI,YAAY,GAAI,eAAc;AAElC,QAAI,MAAM,aAAc,eAAc;AAEtC,gBAAY,cAAc,KAAK;AAC/B,kBAAc,OAAO,SAAS;AAE9B,QAAI,MAAM,UAAU;AAClB,oBAAc,MAAM,SAAS,KAAK,QAAQ,WAAW,WAAW;AAAA,IAClE;AAEA,QAAI,CAAC,UAAU,OAAO,OAAO,WAAW,OAAO,KAAK,GAAG;AACrD;AAAA,IACF;AAEA,QAAI,MAAM,KAAK,SAAS,KAAM,eAAc;AAE5C,kBAAc,MAAM,QAAQ,MAAM,eAAe,MAAM,MAAM,OAAO,MAAM,eAAe,KAAK;AAE9F,QAAI,CAAC,UAAU,OAAO,OAAO,aAAa,OAAO,KAAK,GAAG;AACvD;AAAA,IACF;AAEA,kBAAc,MAAM;AAGpB,eAAW;AAAA,EACb;AAEA,QAAM,MAAM;AACZ,QAAM,OAAO,MAAM,UAAU;AAC/B;AAEA,SAAS,kBAAkB,OAAO,OAAO,QAAQ,SAAS;AACxD,MAAI,UAAgB,IAChB,OAAgB,MAAM,KACtB,gBAAgB,OAAO,KAAK,MAAM,GAClC,OACA,QACA,WACA,aACA,cACA;AAGJ,MAAI,MAAM,aAAa,MAAM;AAE3B,kBAAc,KAAK;AAAA,EACrB,WAAW,OAAO,MAAM,aAAa,YAAY;AAE/C,kBAAc,KAAK,MAAM,QAAQ;AAAA,EACnC,WAAW,MAAM,UAAU;AAEzB,UAAM,IAAI,UAAU,0CAA0C;AAAA,EAChE;AAEA,OAAK,QAAQ,GAAG,SAAS,cAAc,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACzE,iBAAa;AAEb,QAAI,CAAC,WAAW,YAAY,IAAI;AAC9B,oBAAc,iBAAiB,OAAO,KAAK;AAAA,IAC7C;AAEA,gBAAY,cAAc,KAAK;AAC/B,kBAAc,OAAO,SAAS;AAE9B,QAAI,MAAM,UAAU;AAClB,oBAAc,MAAM,SAAS,KAAK,QAAQ,WAAW,WAAW;AAAA,IAClE;AAEA,QAAI,CAAC,UAAU,OAAO,QAAQ,GAAG,WAAW,MAAM,MAAM,IAAI,GAAG;AAC7D;AAAA,IACF;AAEA,mBAAgB,MAAM,QAAQ,QAAQ,MAAM,QAAQ,OACpC,MAAM,QAAQ,MAAM,KAAK,SAAS;AAElD,QAAI,cAAc;AAChB,UAAI,MAAM,QAAQ,mBAAmB,MAAM,KAAK,WAAW,CAAC,GAAG;AAC7D,sBAAc;AAAA,MAChB,OAAO;AACL,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,kBAAc,MAAM;AAEpB,QAAI,cAAc;AAChB,oBAAc,iBAAiB,OAAO,KAAK;AAAA,IAC7C;AAEA,QAAI,CAAC,UAAU,OAAO,QAAQ,GAAG,aAAa,MAAM,YAAY,GAAG;AACjE;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,mBAAmB,MAAM,KAAK,WAAW,CAAC,GAAG;AAC7D,oBAAc;AAAA,IAChB,OAAO;AACL,oBAAc;AAAA,IAChB;AAEA,kBAAc,MAAM;AAGpB,eAAW;AAAA,EACb;AAEA,QAAM,MAAM;AACZ,QAAM,OAAO,WAAW;AAC1B;AAEA,SAAS,WAAW,OAAO,QAAQ,UAAU;AAC3C,MAAI,SAAS,UAAU,OAAO,QAAQH,OAAM;AAE5C,aAAW,WAAW,MAAM,gBAAgB,MAAM;AAElD,OAAK,QAAQ,GAAG,SAAS,SAAS,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACpE,IAAAA,QAAO,SAAS,KAAK;AAErB,SAAKA,MAAK,cAAeA,MAAK,eACzB,CAACA,MAAK,cAAgB,OAAO,WAAW,YAAc,kBAAkBA,MAAK,gBAC7E,CAACA,MAAK,aAAcA,MAAK,UAAU,MAAM,IAAI;AAEhD,UAAI,UAAU;AACZ,YAAIA,MAAK,SAASA,MAAK,eAAe;AACpC,gBAAM,MAAMA,MAAK,cAAc,MAAM;AAAA,QACvC,OAAO;AACL,gBAAM,MAAMA,MAAK;AAAA,QACnB;AAAA,MACF,OAAO;AACL,cAAM,MAAM;AAAA,MACd;AAEA,UAAIA,MAAK,WAAW;AAClB,gBAAQ,MAAM,SAASA,MAAK,GAAG,KAAKA,MAAK;AAEzC,YAAI,UAAU,KAAKA,MAAK,SAAS,MAAM,qBAAqB;AAC1D,oBAAUA,MAAK,UAAU,QAAQ,KAAK;AAAA,QACxC,WAAW,gBAAgB,KAAKA,MAAK,WAAW,KAAK,GAAG;AACtD,oBAAUA,MAAK,UAAU,KAAK,EAAE,QAAQ,KAAK;AAAA,QAC/C,OAAO;AACL,gBAAM,IAAI,UAAU,OAAOA,MAAK,MAAM,iCAAiC,QAAQ,SAAS;AAAA,QAC1F;AAEA,cAAM,OAAO;AAAA,MACf;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,UAAU,OAAO,OAAO,QAAQ,OAAO,SAAS,OAAO,YAAY;AAC1E,QAAM,MAAM;AACZ,QAAM,OAAO;AAEb,MAAI,CAAC,WAAW,OAAO,QAAQ,KAAK,GAAG;AACrC,eAAW,OAAO,QAAQ,IAAI;AAAA,EAChC;AAEA,MAAIA,QAAO,UAAU,KAAK,MAAM,IAAI;AACpC,MAAI,UAAU;AACd,MAAI;AAEJ,MAAI,OAAO;AACT,YAAS,MAAM,YAAY,KAAK,MAAM,YAAY;AAAA,EACpD;AAEA,MAAI,gBAAgBA,UAAS,qBAAqBA,UAAS,kBACvD,gBACA;AAEJ,MAAI,eAAe;AACjB,qBAAiB,MAAM,WAAW,QAAQ,MAAM;AAChD,gBAAY,mBAAmB;AAAA,EACjC;AAEA,MAAK,MAAM,QAAQ,QAAQ,MAAM,QAAQ,OAAQ,aAAc,MAAM,WAAW,KAAK,QAAQ,GAAI;AAC/F,cAAU;AAAA,EACZ;AAEA,MAAI,aAAa,MAAM,eAAe,cAAc,GAAG;AACrD,UAAM,OAAO,UAAU;AAAA,EACzB,OAAO;AACL,QAAI,iBAAiB,aAAa,CAAC,MAAM,eAAe,cAAc,GAAG;AACvE,YAAM,eAAe,cAAc,IAAI;AAAA,IACzC;AACA,QAAIA,UAAS,mBAAmB;AAC9B,UAAI,SAAU,OAAO,KAAK,MAAM,IAAI,EAAE,WAAW,GAAI;AACnD,0BAAkB,OAAO,OAAO,MAAM,MAAM,OAAO;AACnD,YAAI,WAAW;AACb,gBAAM,OAAO,UAAU,iBAAiB,MAAM;AAAA,QAChD;AAAA,MACF,OAAO;AACL,yBAAiB,OAAO,OAAO,MAAM,IAAI;AACzC,YAAI,WAAW;AACb,gBAAM,OAAO,UAAU,iBAAiB,MAAM,MAAM;AAAA,QACtD;AAAA,MACF;AAAA,IACF,WAAWA,UAAS,kBAAkB;AACpC,UAAI,SAAU,MAAM,KAAK,WAAW,GAAI;AACtC,YAAI,MAAM,iBAAiB,CAAC,cAAc,QAAQ,GAAG;AACnD,6BAAmB,OAAO,QAAQ,GAAG,MAAM,MAAM,OAAO;AAAA,QAC1D,OAAO;AACL,6BAAmB,OAAO,OAAO,MAAM,MAAM,OAAO;AAAA,QACtD;AACA,YAAI,WAAW;AACb,gBAAM,OAAO,UAAU,iBAAiB,MAAM;AAAA,QAChD;AAAA,MACF,OAAO;AACL,0BAAkB,OAAO,OAAO,MAAM,IAAI;AAC1C,YAAI,WAAW;AACb,gBAAM,OAAO,UAAU,iBAAiB,MAAM,MAAM;AAAA,QACtD;AAAA,MACF;AAAA,IACF,WAAWA,UAAS,mBAAmB;AACrC,UAAI,MAAM,QAAQ,KAAK;AACrB,oBAAY,OAAO,MAAM,MAAM,OAAO,OAAO,OAAO;AAAA,MACtD;AAAA,IACF,WAAWA,UAAS,sBAAsB;AACxC,aAAO;AAAA,IACT,OAAO;AACL,UAAI,MAAM,YAAa,QAAO;AAC9B,YAAM,IAAI,UAAU,4CAA4CA,KAAI;AAAA,IACtE;AAEA,QAAI,MAAM,QAAQ,QAAQ,MAAM,QAAQ,KAAK;AAc3C,eAAS;AAAA,QACP,MAAM,IAAI,CAAC,MAAM,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM;AAAA,MACpD,EAAE,QAAQ,MAAM,KAAK;AAErB,UAAI,MAAM,IAAI,CAAC,MAAM,KAAK;AACxB,iBAAS,MAAM;AAAA,MACjB,WAAW,OAAO,MAAM,GAAG,EAAE,MAAM,sBAAsB;AACvD,iBAAS,OAAO,OAAO,MAAM,EAAE;AAAA,MACjC,OAAO;AACL,iBAAS,OAAO,SAAS;AAAA,MAC3B;AAEA,YAAM,OAAO,SAAS,MAAM,MAAM;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAQ,OAAO;AAC7C,MAAI,UAAU,CAAC,GACX,oBAAoB,CAAC,GACrB,OACA;AAEJ,cAAY,QAAQ,SAAS,iBAAiB;AAE9C,OAAK,QAAQ,GAAG,SAAS,kBAAkB,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAC7E,UAAM,WAAW,KAAK,QAAQ,kBAAkB,KAAK,CAAC,CAAC;AAAA,EACzD;AACA,QAAM,iBAAiB,IAAI,MAAM,MAAM;AACzC;AAEA,SAAS,YAAY,QAAQ,SAAS,mBAAmB;AACvD,MAAI,eACA,OACA;AAEJ,MAAI,WAAW,QAAQ,OAAO,WAAW,UAAU;AACjD,YAAQ,QAAQ,QAAQ,MAAM;AAC9B,QAAI,UAAU,IAAI;AAChB,UAAI,kBAAkB,QAAQ,KAAK,MAAM,IAAI;AAC3C,0BAAkB,KAAK,KAAK;AAAA,MAC9B;AAAA,IACF,OAAO;AACL,cAAQ,KAAK,MAAM;AAEnB,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,sBAAY,OAAO,KAAK,GAAG,SAAS,iBAAiB;AAAA,QACvD;AAAA,MACF,OAAO;AACL,wBAAgB,OAAO,KAAK,MAAM;AAElC,aAAK,QAAQ,GAAG,SAAS,cAAc,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACzE,sBAAY,OAAO,cAAc,KAAK,CAAC,GAAG,SAAS,iBAAiB;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,OAAO,OAAO,SAAS;AAC9B,YAAU,WAAW,CAAC;AAEtB,MAAI,QAAQ,IAAI,MAAM,OAAO;AAE7B,MAAI,CAAC,MAAM,OAAQ,wBAAuB,OAAO,KAAK;AAEtD,MAAI,QAAQ;AAEZ,MAAI,MAAM,UAAU;AAClB,YAAQ,MAAM,SAAS,KAAK,EAAE,IAAI,MAAM,GAAG,IAAI,KAAK;AAAA,EACtD;AAEA,MAAI,UAAU,OAAO,GAAG,OAAO,MAAM,IAAI,EAAG,QAAO,MAAM,OAAO;AAEhE,SAAO;AACT;AAEA,IAAI,SAAS;AAEb,IAAI,SAAS;AAAA,EACZ,MAAM;AACP;AAEA,SAAS,QAAQ,MAAM,IAAI;AACzB,SAAO,WAAY;AACjB,UAAM,IAAI,MAAM,mBAAmB,OAAO,wCAC1B,KAAK,yCAAyC;AAAA,EAChE;AACF;AASA,IAAI,OAAsB,OAAO;AACjC,IAAI,UAAsB,OAAO;AACjC,IAAI,OAAsB,OAAO;AAqBjC,IAAI,WAAsB,QAAQ,YAAY,MAAM;AACpD,IAAI,cAAsB,QAAQ,eAAe,SAAS;AAC1D,IAAI,WAAsB,QAAQ,YAAY,MAAM;;;ACvvHpD;AACA;AAcA,eAAsB,qBAAqB,WAAkD;AAC3F,MAAI;AACF,WAAO,KAAK,iCAAiC,SAAS,EAAE;AAExD,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,EAAE,QAAQ,OAAO;AAAA,MACjB,CAAC,SAAS;AAAA,IACZ;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,MAAM,kCAAkC,SAAS,KAAK,OAAO,UAAU,OAAO,KAAK;AAC1F,aAAO;AAAA,IACT;AAGA,QAAI;AACF,YAAM,WAAW,KAAK,MAAM,OAAO,MAAM;AACzC,aAAO;AAAA,IACT,SAAS,YAAY;AACnB,aAAO,MAAM,qCAAqC,SAAS,KAAK,UAAU;AAC1E,aAAO;AAAA,IACT;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,gCAAgC,SAAS,KAAK,KAAK;AAChE,WAAO;AAAA,EACT;AACF;;;AFnCA,IAAM,sBAA8C;AAAA,EAClD,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AACd;AAEA,IAAM,kBAAkB,OAAO,KAAK,mBAAmB;AAKvD,SAAS,qBAAqB,UAA0B;AACtD,SAAO,oBAAoB,SAAS,YAAY,CAAC,KAAK;AACxD;AAKA,SAAS,sBAAsB,WAA2B;AACxD,QAAM,QAAQ,UAAU,MAAW,QAAG;AAEtC,aAAW,QAAQ,OAAO;AACxB,QAAI,gBAAgB,SAAS,KAAK,YAAY,CAAC,GAAG;AAChD,aAAO,KAAK,YAAY;AAAA,IAC1B;AAAA,EACF;AAGA,SAAO;AACT;AAKA,SAAS,kBAAkB,WAAkC;AAC3D,MAAI,cAAc;AAClB,QAAM,OAAY,WAAM,WAAW,EAAE;AAErC,SAAO,gBAAgB,MAAM;AAE3B,eAAW,YAAY,CAAC,mBAAmB,YAAY,GAAG;AACxD,YAAM,WAAgB,UAAK,aAAa,QAAQ;AAChD,UAAO,cAAW,QAAQ,KAAQ,YAAS,QAAQ,EAAE,OAAO,GAAG;AAC7D,eAAO;AAAA,MACT;AAAA,IACF;AACA,kBAAmB,aAAQ,WAAW;AAAA,EACxC;AAEA,SAAO;AACT;AAKA,SAAS,mBAAmB,YAAoD;AAC9E,MAAI;AACF,UAAM,UAAa,gBAAa,YAAY,OAAO;AACnD,UAAM,SAAc,KAAK,OAAO;AAChC,WAAO;AAAA,EACT,SAAS,QAAQ;AAEf,WAAO;AAAA,EACT;AACF;AAKA,SAAS,UAAU,UAAiC;AAClD,MAAI;AACF,UAAM,SAAY,cAAW,QAAQ,KAAQ,YAAS,QAAQ,EAAE,OAAO;AACvE,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA;AAAA,IACR;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA;AAAA,IACR;AAAA,EACF;AACF;AAKA,SAAS,eAAe,SAAgC;AACtD,MAAI;AACF,UAAM,SAAY,cAAW,OAAO,KAAQ,YAAS,OAAO,EAAE,YAAY;AAC1E,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA;AAAA,IACR;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA;AAAA,IACR;AAAA,EACF;AACF;AAKA,SAAS,kBAAkB,SAAiB,WAAmB,UAA4B;AACzF,MAAI,CAAI,cAAW,OAAO,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,QAAW,eAAY,OAAO;AACpC,UAAM,cAAc,qBAAqB,QAAQ;AACjD,UAAM,YAAsB,CAAC;AAG7B,UAAM,qBAAqB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,OAAO,mBAAmB,GAAG,MAAM,CAAC,CAAC;AAEvF,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAgB,UAAK,SAAS,IAAI;AACxC,YAAM,OAAU,YAAS,QAAQ;AAEjC,UAAI,KAAK,OAAO,GAAG;AAEjB,YAAI,SAAS,GAAG,SAAS,IAAI,WAAW,IAAI;AAC1C,oBAAU,KAAK,QAAQ;AAAA,QACzB,WAES,CAAC,KAAK,SAAS,QAAQ,KAAK,CAAC,KAAK,SAAS,WAAW,KAAK,CAAC,KAAK,SAAS,SAAS,GAAG;AAC7F,gBAAM,MAAW,aAAQ,IAAI,EAAE,MAAM,CAAC;AACtC,cAAI,QAAQ,eAAe,mBAAmB,SAAS,GAAG,GAAG;AAC3D,sBAAU,KAAK,QAAQ;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAMA,eAAsB,qBACpB,eACA,UACA,kBAA2B,MACA;AAE3B,QAAM,oBAAyB,aAAQ,aAAa;AAGpD,QAAM,YAAiB,cAAS,mBAAmB,KAAK;AACxD,QAAM,WAAgB,aAAQ,iBAAiB;AAG/C,QAAM,mBAAmB,YAAY,sBAAsB,iBAAiB;AAG5E,QAAM,YAAY,UAAU,iBAAiB;AAC7C,QAAM,iBAAiB,eAAe,QAAQ;AAG9C,QAAM,SAAc,UAAK,UAAU,GAAG,SAAS,KAAK;AACpD,QAAM,YAAiB,UAAK,UAAU,GAAG,SAAS,QAAQ;AAC1D,QAAM,SAAS,UAAU,MAAM;AAC/B,QAAM,YAAY,UAAU,SAAS;AAErC,QAAM,oBAAmC,OAAO,SAAS,SAAU,UAAU,SAAS,YAAY;AAAA,IAChG,QAAQ;AAAA,IACR,MAAM;AAAA;AAAA,EACR;AAGA,QAAM,YAAiB,UAAK,UAAU,GAAG,SAAS,QAAQ;AAC1D,QAAM,oBAAoB,UAAU,SAAS;AAI7C,MAAI;AACJ,MAAI,SAAS,SAAS,GAAQ,QAAG,MAAW,QAAG,EAAE,GAAG;AAElD,UAAM,QAAQ,SAAS,MAAW,QAAG;AACrC,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,QAAI,aAAa,IAAI;AACnB,YAAM,QAAQ,IAAI;AAClB,gBAAU,MAAM,KAAU,QAAG;AAAA,IAC/B,OAAO;AAEL,gBAAe,UAAU,aAAQ,QAAQ,GAAG,QAAQ,SAAS;AAAA,IAC/D;AAAA,EACF,OAAO;AAEL,cAAe,UAAU,aAAQ,QAAQ,GAAG,QAAQ,SAAS;AAAA,EAC/D;AACA,QAAM,gBAAgB,eAAe,OAAO;AAG5C,QAAM,YAAiB,UAAK,SAAS,GAAG,SAAS,QAAQ;AACzD,QAAM,YAAY,UAAU,SAAS;AAGrC,QAAM,gBAAgB,kBAAkB,SAAS,WAAW,gBAAgB;AAG5E,QAAM,eAAoB,UAAK,SAAS,GAAG,SAAS,WAAW;AAC/D,QAAM,sBAAsB,UAAU,YAAY;AAGlD,QAAM,aAAkB,UAAK,SAAS,GAAG,SAAS,SAAS;AAC3D,QAAM,oBAAoB,UAAU,UAAU;AAG9C,QAAM,eAAoB,UAAK,SAAS,GAAG,SAAS,WAAW;AAC/D,QAAM,mBAAmB,eAAe,YAAY;AAGpD,QAAM,eAAyB,CAAC;AAChC,MAAI,CAAC,UAAU,OAAQ,cAAa,KAAK,UAAU,IAAI;AACvD,MAAI,CAAC,kBAAkB,OAAQ,cAAa,KAAK,kBAAkB,IAAI;AACvE,MAAI,CAAC,kBAAkB,OAAQ,cAAa,KAAK,kBAAkB,IAAI;AACvE,MAAI,CAAC,cAAc,OAAQ,cAAa,KAAK,cAAc,IAAI;AAC/D,MAAI,CAAC,UAAU,OAAQ,cAAa,KAAK,UAAU,IAAI;AACvD,MAAI,cAAc,WAAW,EAAG,cAAa,KAAU,UAAK,SAAS,GAAG,SAAS,IAAI,qBAAqB,gBAAgB,CAAC,EAAE,CAAC;AAC9H,MAAI,CAAC,oBAAoB,OAAQ,cAAa,KAAK,oBAAoB,IAAI;AAE3E,QAAM,gBAAgB,aAAa,WAAW;AAG9C,MAAI;AACJ,MAAI,mBAAmB,UAAU,QAAQ;AACvC,UAAM,mBAAmB,MAAM,qBAAqB,iBAAiB;AACrE,QAAI,kBAAkB;AACpB,iBAAW;AAAA,IACb;AAAA,EACF;AAGA,MAAI;AACJ,QAAM,gBAAgB,kBAAkB,QAAQ;AAChD,QAAM,eAAe,gBAAqB,aAAQ,aAAa,IAAI;AACnE,MAAI,eAAe;AACjB,UAAM,SAAS,mBAAmB,aAAa;AAC/C,QAAI,QAAQ;AACV,qBAAe;AAAA,IACjB;AAAA,EACF;AAGA,QAAM,eAAe,kBAAkB,OAAO;AAC9C,QAAM,cAAc,eAAoB,aAAQ,YAAY,IAAI;AAEhE,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IAEV;AAAA,IAEA,OAAO;AAAA,MACL,OAAO;AAAA,QACL,KAAK,eAAe;AAAA,QACpB,KAAU,cAAS,kBAAkB,IAAI;AAAA,QACzC,SAAS;AAAA,QACT,OAAY,cAAS,UAAU,IAAI;AAAA,QACnC,MAAW,cAAS,kBAAkB,IAAI;AAAA,MAC5C;AAAA,MACA,MAAM;AAAA,QACJ,QAAa,cAAS,kBAAkB,IAAI;AAAA,QAC5C,KAAK,cAAc;AAAA,QACnB,UAAe,cAAS,oBAAoB,IAAI;AAAA,QAChD,SAAS;AAAA,QACT,OAAY,cAAS,UAAU,IAAI;AAAA,QACnC,UAAU;AAAA,QACV,iBAAiB,iBAAiB;AAAA,MACpC;AAAA,IACF;AAAA,IAEA;AAAA,IAEA;AAAA,IAEA;AAAA,IAEA,QAAQ;AAAA,MACN,oBAAoB,kBAAkB;AAAA,MACtC,qBAAqB,kBAAkB;AAAA,MACvC,sBAAsB,oBAAoB;AAAA,MAC1C,aAAa,cAAc,SAAS;AAAA,MACpC,aAAa,UAAU;AAAA,MACvB,aAAa,UAAU;AAAA,MACvB,qBAAqB,kBAAkB;AAAA,MACvC,uBAAuB,iBAAiB;AAAA,MACxC,qBAAqB,cAAc;AAAA,IACrC;AAAA,EACF;AACF;;;ADtTA;AAKO,SAAS,iCAAiC,QAAyB;AACxE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWI,GAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,MACpE,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mEAAmE;AAAA,MAC5G,iBAAiBA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,mDAAmD;AAAA,IACtG;AAAA,IACA,OAAO,EAAE,WAAW,UAAU,gBAAgB,MAAM;AAClD,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA;AAAA,UACA,oBAAoB;AAAA;AAAA,QACtB;AAEA,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,QACnE;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,qCAAqC,KAAK;AACvD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AI3CA,SAAS,KAAAC,WAAS;AAGX,IAAM,+BAAkD;AAAA,EAC7D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,UAAUC,IAAE,OAAO,EAAE,SAAS,6CAA6C;AAAA,IAC3E,YAAYA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,IACrG,QAAQA,IAAE,KAAK,CAAC,QAAQ,cAAc,SAAS,CAAC,EAAE,SAAS,EACxD,SAAS,6EAA6E;AAAA,IACzF,iBAAiBA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,oBAAoB;AAAA,IACrE,KAAKA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,IAC3D,+BAA+BA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,IAC5F,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACzBA,SAAS,KAAAC,WAAS;AAGX,IAAM,8BAAiD;AAAA,EAC5D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,OAAO,EAAE,SAAS,6CAA6C;AAAA,IACxE,YAAYA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,IACjF,QAAQA,IAAE,KAAK,CAAC,YAAY,QAAQ,MAAM,CAAC,EAAE,SAAS,EACnD,SAAS,0CAA0C;AAAA,IACtD,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACtBA,SAAS,KAAAC,WAAS;AAGX,IAAM,wBAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,SAASC,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,IAC5F,OAAOA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,iCAAiC;AAAA,IACxE,kBAAkBA,IAAE,QAAQ,EAAE,SAAS,EACpC,SAAS,wCAAwC;AAAA,IACpD,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACrBA,SAAS,KAAAC,WAAS;AAGX,IAAM,mBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,KAAKC,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2FAA2F;AAAA,IAC/H,QAAQA,IAAE,KAAK,CAAC,QAAQ,MAAM,CAAC,EAAE,SAAS,EACvC,SAAS,uCAAuC;AAAA,IACnD,QAAQA,IAAE,OAAO,EAAE,SAAS,EACzB,SAAS,kDAAkD;AAAA,IAC9D,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA;AACA;AAFA,SAAS,KAAAC,WAAS;AAGlB,SAAS,iBAAAC,gBAAe,gBAAAC,eAAc,cAAAC,mBAAkB;AACxD,SAAS,QAAAC,OAAM,WAAAC,UAAS,YAAAC,iBAAgB;AACxC,SAAS,aAAAC,kBAAiB;AAkC1B,SAAS,kBAAkB,SAA8B;AACvD,QAAM,aAAaL,cAAa,SAAS,OAAO;AAGhD,QAAM,cAAc,WAAW,MAAM,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AACnE,QAAM,SAA8B,YACjC,IAAI,CAAC,QAAQ;AACZ,QAAI;AACF,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB,SAAS,QAAQ;AACf,aAAO,KAAK,yCAAyC,IAAI,UAAU,GAAG,GAAG,CAAC,KAAK;AAC/E,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EACA,OAAO,CAAC,UAAsC,UAAU,IAAI;AAG/D,QAAM,cAAc,oBAAI,IAAmC;AAE3D,QAAM,yBAAyB,oBAAI,IAAoB;AAEvD,MAAI,YAAY;AAChB,MAAI,iBAAiB;AACrB,MAAI,eAAe;AAEnB,aAAW,SAAS,QAAQ;AAC1B,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,oBAAa,MAAM,aAAwB;AAC3C,yBAAiB,MAAM;AACvB;AAAA,MAEF,KAAK;AACH,uBAAe,MAAM;AACrB;AAAA,MAEF,KAAK,qBAAqB;AACxB,cAAM,gBAAgB,MAAM;AAC5B,cAAM,WAAW,MAAM;AACvB,cAAM,gBAAgB,MAAM;AAC5B,cAAM,eAAe,MAAM;AAG3B,+BAAuB,IAAI,eAAe,MAAM,OAAO;AAGvD,cAAM,qBAA+B,CAAC;AACtC,cAAM,kBAA4B,CAAC;AACnC,YAAI,cAAc;AAChB,qBAAW,WAAW,OAAO,KAAK,YAAY,GAAG;AAC/C,4BAAgB,KAAK,OAAO;AAC5B,kBAAM,aAAa,uBAAuB,IAAI,OAAO;AACrD,gBAAI,eAAe,QAAW;AAC5B,iCAAmB,KAAK,UAAU;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAEA,oBAAY,IAAI,MAAM,SAAS;AAAA,UAC7B,SAAS,MAAM;AAAA,UACf,MAAM;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN,WAAW,MAAM;AAAA,UACjB,cAAc;AAAA,UACd;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,eAAe,MAAM;AAC3B,cAAM,eAAe,YAAY,IAAI,YAAY;AACjD,YAAI,cAAc;AAChB,gBAAM,aAAa,OAAO,KAAK,CAAC,MAAM,EAAE,YAAY,YAAY;AAChE,cAAI,YAAY;AACd,kBAAM,YAAY,MAAM,WAAW,WAAW,YAAY;AAC1D,yBAAa,UAAU,MAAM;AAC7B,yBAAa,WAAW;AACxB,yBAAa,aAAa,MAAM;AAChC,yBAAa,aAAa,MAAM;AAAA,UAClC;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAA4B,MAAM,KAAK,YAAY,OAAO,CAAC,EAC9D,OAAO,CAAC,MAAyB,EAAE,aAAa,MAAS,EACzD,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAEvC,QAAM,gBAAgB,eAAe,KAAK,eAAe,kBAAkB,MAAY;AAEvF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,OAAO;AAAA,IACpB;AAAA,EACF;AACF;AAKA,SAAS,aAAa,SAA8B;AAClD,SAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AACxC;AAOA,SAAS,gBAAgB,SAA8B;AACrD,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,YAAY;AACvB,QAAM,KAAK,UAAU;AACrB,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,YAAYI,UAAS,QAAQ,SAAS,CAAC,eAAe,QAAQ,cAAc,QAAQ,CAAC,CAAC,MAAM;AACvG,QAAM,KAAK,EAAE;AAGb,UAAQ,UAAU,QAAQ,CAAC,aAAa;AACtC,UAAM,SAAS,IAAI,SAAS,OAAO;AACnC,UAAM,WAAW,SAAS,SAAS,QAAQ,CAAC;AAC5C,UAAM,aAAa,SAAS,eAAe,SAAY,SAAS,aAAa;AAE7E,UAAM,OAAO,SAAS,KAAK,QAAQ,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAC/D,UAAM,KAAK,KAAK,MAAM,KAAK,IAAI,QAAQ,QAAQ,QAAQ,UAAU,YAAY;AAAA,EAC/E,CAAC;AAED,QAAM,KAAK,EAAE;AAGb,QAAM,gBAAgB,QAAQ,UAAU,OAAO,CAAC,MAAM,EAAE,aAAa,WAAW,CAAC;AAEjF,gBAAc,QAAQ,CAAC,aAAa;AAClC,UAAM,KAAK,gBAAgB,SAAS,OAAO,EAAE;AAAA,EAC/C,CAAC;AAED,QAAM,KAAK,EAAE;AAGb,UAAQ,UAAU,QAAQ,CAAC,aAAa;AACtC,aAAS,mBAAmB,QAAQ,CAAC,eAAe;AAClD,YAAM,WAAW,SAAS,SAAS,QAAQ,CAAC;AAC5C,YAAM,KAAK,MAAM,UAAU,SAAS,QAAQ,SAAS,SAAS,OAAO,EAAE;AAAA,IACzE,CAAC;AAAA,EACH,CAAC;AAED,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,8DAA8D;AACzE,QAAM,KAAK,4DAA4D;AACvE,QAAM,KAAK,qBAAqB;AAChC,QAAM,KAAK,KAAK;AAEhB,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,SAAS,+BAA+B,QAAyB;AACtE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAON,IAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,MACvD,UAAUA,IAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,MACrE,cAAcA,IACX,OAAO,EACP,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,uFAAuF;AAAA,IACrG;AAAA,IACA,OAAO,WAAW;AAChB,UAAI;AACF,cAAM,EAAE,OAAO,UAAU,cAAc,UAAU,IAAI;AACrD,YAAI,UAAU;AACd,YAAI;AACJ,YAAI;AAGJ,YAAI,CAAC,SAAS;AACZ,iBAAO,KAAK,0DAA0D;AAGtE,gBAAM,mBAAmB,aAAaI,MAAKC,SAAQ,KAAe,GAAG,gBAAgB;AACrF,UAAAE,WAAU,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAE/C,oBAAUH,MAAK,kBAAkB,qBAAqB;AACtD,qBAAWA,MAAK,kBAAkB,oBAAoB;AACtD,sBAAYA,MAAK,kBAAkB,qBAAqB;AAGxD,gBAAM,cAAc,MAAM;AAAA,YACxB;AAAA,YACA;AAAA,cACE;AAAA,cACA,QAAQ;AAAA,cACR,iBAAiB;AAAA,cACjB,kBAAkB;AAAA,cAClB,uBAAuB;AAAA,YACzB;AAAA,YACA,CAAC,KAAe;AAAA,UAClB;AAEA,cAAI,CAAC,YAAY,SAAS;AACxB,mBAAO;AAAA,cACL,SAAS;AAAA,gBACP;AAAA,kBACE,MAAM;AAAA,kBACN,MAAM,wBAAwB,YAAY,UAAU,YAAY,KAAK;AAAA,gBACvE;AAAA,cACF;AAAA,cACA,SAAS;AAAA,YACX;AAAA,UACF;AAGA,cAAID,YAAW,QAAQ,GAAG;AACxB,gBAAI;AACF,oBAAM,cAAc,MAAM;AAAA,gBACxB;AAAA,gBACA,EAAE,QAAQ,gBAAgB,QAAQ,UAAU;AAAA,gBAC5C,CAAC,QAAQ;AAAA,cACX;AAEA,kBAAI,YAAY,SAAS;AACvB,uBAAO,KAAK,qCAAqC,SAAS,EAAE;AAAA,cAC9D;AAAA,YACF,SAAS,OAAO;AACd,qBAAO,KAAK,4CAA4C,KAAK,EAAE;AAAA,YACjE;AAAA,UACF;AAAA,QACF;AAGA,YAAI,CAACA,YAAW,OAAO,GAAG;AACxB,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,+BAA+B,OAAO;AAAA,cAC9C;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAGA,eAAO,KAAK,+BAA+B,OAAO,EAAE;AACpD,cAAM,UAAU,kBAAkB,OAAO;AAGzC,cAAM,mBAAmB,aAAaE,SAAQ,OAAO;AACrD,QAAAE,WAAU,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAG/C,cAAM,WAAWH,MAAK,kBAAkB,+BAA+B;AACvE,cAAM,cAAc,aAAa,OAAO;AACxC,QAAAH,eAAc,UAAU,WAAW;AACnC,eAAO,KAAK,4BAA4B,QAAQ,EAAE;AAGlD,cAAM,SAASG,MAAK,kBAAkB,6BAA6B;AACnE,cAAM,YAAY,gBAAgB,OAAO;AACzC,QAAAH,eAAc,QAAQ,SAAS;AAC/B,eAAO,KAAK,uCAAuC,MAAM,EAAE;AAG3D,cAAM,cAAwB;AAAA,UAC5B,iBAAiB,QAAQ;AAAA,UACzB,oBAAoB,MAAM;AAAA,UAC1B,kBAAkB,OAAO;AAAA,QAC3B;AAEA,YAAI,UAAU;AACZ,sBAAY,KAAK,yBAAyB,QAAQ,EAAE;AAAA,QACtD;AAEA,YAAI,aAAaE,YAAW,SAAS,GAAG;AACtC,sBAAY,KAAK,0BAA0B,SAAS,EAAE;AAAA,QACxD;AAEA,cAAM,eAAe;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG,YAAY,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE;AAAA,UACpC;AAAA,UACA;AAAA,UACA,cAAcG,UAAS,QAAQ,SAAS,CAAC;AAAA,UACzC,uBAAuB,QAAQ,cAAc,QAAQ,CAAC,CAAC;AAAA,UACvD,wBAAwB,QAAQ,UAAU,MAAM;AAAA,UAChD,qBAAqB,QAAQ,WAAW;AAAA,UACxC;AAAA,UACA;AAAA,UACA,GAAG,QAAQ,UAAU,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,QAAQ;AAC/C,mBAAO,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,EAAE,SAAS,QAAQ,CAAC,CAAC,QAAQ,EAAE,cAAc,GAAG;AAAA,UACrF,CAAC;AAAA,QACH,EAAE,KAAK,IAAI;AAEX,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,iCAAiC,KAAK;AAEnD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YAC1F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACxXA,SAAS,KAAAE,WAAS;AAGX,IAAM,yBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOA,IAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,IAChE,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,IACtE,SAASA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAC/D,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,IACzD,UAAUA,IAAE,KAAK,CAAC,QAAQ,QAAQ,OAAO,CAAC,EAAE,SAAS,EAClD,SAAS,oCAAoC;AAAA,IAChD,SAASA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;;;ACtBA,SAAS,KAAAC,WAAS;AAOlB,SAAS,sBAAsB,QAA4B,QAAyC;AAClG,QAAM,cAAc,OAAO,YAAY;AACvC,QAAM,mBAAmB,OAAO,aAAa;AAE7C,MAAI,eAAe,kBAAkB;AAEnC,WAAO,UAAU;AACjB,WAAO,OAAO,UAAU,OAAO,UAAU;AAAA,EAC3C;AAEA,SAAO,0BAA0B,QAAQ,MAAM;AACjD;AAEO,IAAM,wBAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,gDAAgD;AAAA,IACpF,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qDAAqD;AAAA,IAC5F,YAAYA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,IAC9F,cAAcA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,yCAAyC;AAAA,IACvF,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,IACzF,oBAAoBA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,IACxG,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACzCA,SAAS,KAAAC,WAAS;AAGX,IAAM,qBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qEAAqE;AAAA,IAC3G,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8GAA8G;AAAA,IACxJ,eAAeA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+GAA+G;AAAA,IAC7J,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gFAAgF;AAAA,IAC1H,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qHAAqH;AAAA,IACjK,gBAAgBA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oGAAoG;AAAA,IACnJ,gBAAgBA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sGAAsG;AAAA,IACrJ,UAAU,oBAAoB,SAAS;AAAA,IACvC,QAAQ,oBAAoB,OAAO;AAAA,IACnC,UAAUA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EACpC,SAAS,6CAA6C;AAAA,IACzD,SAAS,oBAAoB,QAAQ;AAAA,IACrC,QAAQA,IAAE,OAAO,EAAE,SAAS,EACzB,SAAS,wLAAwL;AAAA,IACpM,iBAAiBA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,IAC7G,wBAAwBA,IAAE,QAAQ,EAAE,SAAS,EAC1C,SAAS,yCAAyC;AAAA,IACrD,uBAAuBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EACtD,SAAS,gDAAgD;AAAA,IAC5D,kBAAkBA,IAAE,QAAQ,EAAE,SAAS,EACpC,SAAS,iEAAiE;AAAA,IAC7E,QAAQA,IAAE,KAAK,CAAC,gBAAgB,eAAe,OAAO,aAAa,QAAQ,KAAK,CAAC,EAAE,SAAS,EACzF,SAAS,yOAAyO;AAAA,IACrP,mBAAmBA,IAAE,OAAO,EAAE,SAAS,EACpC,SAAS,2LAA2L;AAAA,IACvM,oBAAoBA,IAAE,OAAO,EAAE,SAAS,EACrC,SAAS,qLAAqL;AAAA,IACjM,kBAAkBA,IAAE,OAAO,EAAE,SAAS,EACnC,SAAS,2FAA2F;AAAA,IACvG,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC5CA,SAAS,KAAAC,WAAS;AAClB,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAG9B;AAcA,eAAsB,cAAc;AAAA,EAClC;AAAA,EACA,IAAI;AAAA,EACJ;AAAA,EACA;AACF,GAAyC;AACvC,MAAI;AAEF,QAAI;AACF,YAAM,kBAAkB,MAAM,MAAM;AAAA,IACtC,QAAQ;AACN,UAAI;AACF,cAAM,sBAAsB,MAAM,MAAM;AAAA,MAC1C,QAAQ;AACN,cAAM,IAAI,MAAM,WAAW,MAAM,8CAA8C,IAAI,EAAE;AAAA,MACvF;AAAA,IACF;AAEA,UAAM,iBAAiBC,SAAQ,eAAeC,MAAK,iBAAiB,WAAW,GAAG,gBAAgB,CAAC;AAKnG,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACzG;AACF;AAKO,SAAS,0BAA0B,QAAyB;AACjE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAMC,IAAE,OAAO,EAAE,SAAS,4CAA4C;AAAA,MACtE,IAAIA,IAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,MACrD,QAAQA,IAAE,OAAO,EAAE,SAAS,4CAA4C;AAAA,MACxE,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qEAAqE;AAAA,IACnH;AAAA,IACA,OAAO,EAAE,MAAM,IAAI,QAAQ,YAAY,MAAM;AAC3C,UAAI;AACF,cAAM,SAAS,MAAM,cAAc,EAAE,MAAM,IAAI,QAAQ,YAAY,CAAC;AACpE,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QAC1C;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,4BAA4B,KAAK;AAC9C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC7EA;AAHA,SAAS,KAAAC,WAAS;AAClB,SAAS,QAAQ,iBAAiB;AAClC,SAAS,WAAAC,gBAAe;AAgBxB,eAAsB,iBAAiB,QAAiC;AACtE,MAAI;AACF,UAAM,eAAeA,SAAQ,MAAM;AAGnC,UAAM,OAAO,cAAc,UAAU,IAAI;AAGzC,UAAM,YAAYA,SAAQ,cAAc,qBAAqB;AAC7D,UAAM,OAAO,WAAW,UAAU,IAAI;AAGtC,UAAM,aAAaA,SAAQ,cAAc,SAAS;AAClD,UAAM,aAAaA,SAAQ,cAAc,KAAK;AAE9C,QAAI,YAAY;AAChB,QAAI,YAAY;AAEhB,QAAI;AACF,YAAM,OAAO,YAAY,UAAU,IAAI;AACvC,kBAAY;AAAA,IACd,QAAQ;AAAA,IAER;AAEA,QAAI,CAAC,WAAW;AACd,UAAI;AACF,cAAM,OAAO,YAAY,UAAU,IAAI;AACvC,oBAAY;AAAA,MACd,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,QAAI,CAAC,aAAa,CAAC,WAAW;AAC5B,YAAM,IAAI,MAAM,4EAA4E,MAAM,EAAE;AAAA,IACtG;AAIA,UAAM,aAAa,YAAY,YAAY;AAC3C,WAAO,wBAAwB,MAAM,aAAa,UAAU;AAAA,EAC9D,SAAS,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,YAAa,MAA4B;AAC/C,UAAI,cAAc,UAAU;AAC1B,YAAI,MAAM,QAAQ,SAAS,qBAAqB,GAAG;AACjD,gBAAM,IAAI,MAAM,4CAA4C,MAAM,EAAE;AAAA,QACtE;AACA,cAAM,IAAI,MAAM,iCAAiC,MAAM,EAAE;AAAA,MAC3D;AACA,UAAI,cAAc,UAAU;AAC1B,cAAM,IAAI,MAAM,iCAAiC,MAAM,EAAE;AAAA,MAC3D;AAAA,IACF;AACA,UAAM,IAAI,MAAM,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EAC5G;AACF;AAKO,SAAS,6BAA6B,QAAyB;AACpE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAASD,IAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,IACtE;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM;AACrB,UAAI;AACF,cAAM,SAAS,MAAM,iBAAiB,OAAO;AAC7C,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QAC1C;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,+BAA+B,KAAK;AACjD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AChHA,SAAS,KAAAE,WAAS;AAGX,IAAM,4BAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,UAAUC,IAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,IACxD,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,YAAY,CAAC,EAAE,SAAS,EACrD,SAAS,wCAAwC;AAAA,IACpD,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA,SAAS,KAAAC,WAAS;AAGX,IAAM,6BAAgD;AAAA,EAC3D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,QAAQC,IAAE,KAAK,CAAC,QAAQ,QAAQ,YAAY,CAAC,EAAE,SAAS,EACrD,SAAS,wCAAwC;AAAA,IACpD,SAASA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACpBA,SAAS,KAAAC,WAAS;AAGX,IAAM,+BAAkD;AAAA,EAC7D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,UAAUC,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,IAC3F,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,YAAY,CAAC,EAAE,SAAS,EACrD,SAAS,4CAA4C;AAAA,IACxD,SAASA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA,SAAS,KAAAC,WAAS;AAGX,IAAM,4BAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,IAC/D,QAAQA,IAAE,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAC/B,SAAS,yFAAyF;AAAA,IACrG,SAASA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACpBA,SAAS,KAAAC,WAAS;AAGX,IAAM,yBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,IAC/D,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,YAAY,CAAC,EAAE,SAAS,EACrD,SAAS,oCAAoC;AAAA,IAChD,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA,SAAS,KAAAC,WAAS;AAOlB,IAAM,0BAA0B,CAC9B,QACA,WACW;AACX,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,6BAA6B,OAAO,YAAY,SAAS;AAAA,EAAO,OAAO,SAAS,OAAO,MAAM;AAAA,EACtG;AAGA,MAAI,OAAO,WAAW,UAAU,OAAO,WAAW,gBAAgB,OAAO,WAAW,cAAc;AAChG,WAAO,OAAO,UAAU;AAAA,EAC1B;AAGA,MAAI,SAAS;AAEb,MAAI,OAAO,QAAQ;AACjB,cAAU,OAAO;AAAA,EACnB;AAEA,MAAI,OAAO,QAAQ;AACjB,QAAI,QAAQ;AACV,gBAAU;AAAA,IACZ;AACA,cAAU,OAAO;AAAA,EACnB;AAEA,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEO,IAAM,2BAA8C;AAAA,EACzD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,WAAWC,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iCAAiC;AAAA,IAC3E,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,IACjF,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,cAAc,YAAY,CAAC,EAAE,SAAS,EACnE,SAAS,8BAA8B;AAAA,IAC1C,oBAAoBA,IAAE,MAAM,CAACA,IAAE,OAAO,GAAGA,IAAE,MAAMA,IAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EACrE,SAAS,wDAAwD;AAAA,IACpE,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;AC/DA,SAAS,KAAAC,WAAS;AAGX,IAAM,yBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,4DAA4D;AAAA,IAC3G,QAAQA,IAAE,KAAK,CAAC,QAAQ,MAAM,CAAC,EAAE,SAAS,EACvC,SAAS,6BAA6B;AAAA,IACzC,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA,SAAS,KAAAC,WAAS;AAGX,IAAM,uBAA0C;AAAA,EACrD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,4DAA4D;AAAA,IAChG,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACnBA,SAAS,KAAAC,WAAS;AAGX,IAAM,wBAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,uCAAuC;AAAA,IAC3E,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,IAC9E,SAAS,oBAAoB,QAAQ;AAAA,IACrC,KAAK,oBAAoB,IAAI;AAAA,IAC7B,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA,SAAS,KAAAC,WAAS;AAEX,IAAM,oBAAuC;AAAA,EAClD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,4DAA4D;AAAA,IAChG,yBAAyBA,IAAE,QAAQ,EAAE,SAAS,EAC3C,SAAS,mDAAmD;AAAA,IAC/D,kBAAkBA,IAAE,QAAQ,EAAE,SAAS,EACpC,SAAS,yCAAyC;AAAA,IACrD,SAASA,IAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,qDAAqD;AAAA,IACjE,QAAQA,IAAE,OAAO,EAAE,SAAS,EACzB,SAAS,uLAAuL;AAAA,IACnM,SAAS,oBAAoB,QAAQ;AAAA,IACrC,KAAK,oBAAoB,IAAI;AAAA,IAC7B,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC3BA,SAAS,KAAAC,WAAS;;;ACUX,SAAS,qBAAqB,OAAe,WAA4C;AAC9F,QAAM,aAAqC;AAAA,IACzC,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,aAAa,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,MAAM,KAAK,GAAG;AACjB,eAAW,UAAU;AACrB,eAAW,OAAO,KAAK,uBAAuB;AAC9C,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,SAAS,MAAM,KAAK,CAAC,MAAM,SAAS,QAAQ,GAAG;AACxD,eAAW,SAAS,KAAK,4DAA4D;AAAA,EACvF;AAEA,MAAI,CAAC,MAAM,SAAS,OAAO,KAAK,CAAC,MAAM,SAAS,cAAc,GAAG;AAC/D,eAAW,YAAY,KAAK,iDAAiD;AAAA,EAC/E;AAEA,SAAO;AACT;;;AClCA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AAqBtB,SAASC,sBAAqB,UAA0B;AACtD,QAAM,aAAqC;AAAA,IACzC,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACA,SAAO,WAAW,SAAS,YAAY,CAAC,KAAK;AAC/C;AAKA,SAAS,sBACP,WACA,UACA,aACA,SACQ;AACR,QAAM,OAAO,eAAe,GAAG,SAAS;AACxC,QAAM,KAAK,WAAW,GAAG,QAAQ,YAAY,UAAU,YAAY,CAAC;AAEpE,SAAO;AAAA,SACA,EAAE;AAAA,WACA,SAAS;AAAA,kBACF,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAMb,QAAQ;AAAA;AAAA;AAAA;AAAA,2BAIU,SAAS,IAAIA,sBAAqB,QAAQ,CAAC;AAAA;AAAA;AAGtE;AAKO,SAAS,kBAAkB,SAA0D;AAC1F,QAAM,EAAE,UAAU,WAAW,UAAU,aAAa,QAAQ,IAAI;AAGhE,QAAM,mBAAwB,cAAQ,QAAQ;AAG9C,QAAM,SAAc,WAAK,kBAAkB,OAAO,SAAS;AAC3D,QAAM,UAAe,WAAK,kBAAkB,QAAQ,SAAS;AAE7D,QAAM,YAAiB,WAAK,QAAQ,GAAG,SAAS,KAAK;AACrD,QAAM,YAAiB,WAAK,SAAS,GAAG,SAAS,QAAQ;AACzD,QAAM,eAAoB,WAAK,SAAS,GAAG,SAAS,IAAIA,sBAAqB,QAAQ,CAAC,EAAE;AAExF,QAAM,eAAyB,CAAC;AAEhC,MAAI;AAEF,IAAG,cAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACxC,IAAG,cAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAKzC,QAAI;AACF,YAAM,eAAe,sBAAsB,WAAW,UAAU,aAAa,OAAO;AACpF,MAAG,kBAAc,WAAW,cAAc,EAAE,UAAU,QAAQ,MAAM,KAAK,CAAC;AAC1E,mBAAa,KAAK,SAAS;AAAA,IAC7B,SAAS,GAAY;AACnB,YAAM,MAAM;AACZ,UAAI,IAAI,SAAS,SAAU,OAAM;AAAA,IACnC;AAEA,QAAI;AACF,YAAM,eAAe,GAAG,SAAS,IAAI,SAAS;AAAA;AAC9C,MAAG,kBAAc,WAAW,cAAc,EAAE,UAAU,QAAQ,MAAM,KAAK,CAAC;AAC1E,mBAAa,KAAK,SAAS;AAAA,IAC7B,SAAS,GAAY;AACnB,YAAM,MAAM;AACZ,UAAI,IAAI,SAAS,SAAU,OAAM;AAAA,IACnC;AAEA,QAAI;AACF,YAAM,kBAAkB,oBAAoB,SAAS;AAAA;AAAA;AACrD,MAAG,kBAAc,cAAc,iBAAiB,EAAE,UAAU,QAAQ,MAAM,KAAK,CAAC;AAChF,mBAAa,KAAK,YAAY;AAAA,IAChC,SAAS,GAAY;AACnB,YAAM,MAAM;AACZ,UAAI,IAAI,SAAS,SAAU,OAAM;AAAA,IACnC;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,uCAAuC,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACnH;AACF;;;AFhGA;AAKO,SAAS,oBAAoB,QAAyB;AAI3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAOC,IAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,MACzD,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,IACxE;AAAA,IACA,OAAO,EAAE,OAAO,SAAS,MAAM;AAC7B,UAAI;AACF,cAAM,aAAa,qBAAqB,OAAO,QAAQ;AACvD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,YAAY,MAAM,CAAC,EAAE,CAAC;AAAA,QACvE;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,kCAAkC,KAAK;AACpD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,UAAUA,IAAE,OAAO,EAAE,SAAS,4DAA4D;AAAA,MAC1F,WAAWA,IAAE,OAAO,EAAE,SAAS,2CAA2C;AAAA,MAC1E,UAAUA,IAAE,OAAO,EAAE,SAAS,8DAA8D;AAAA,MAC5F,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,MAChF,SAASA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,IACpG;AAAA,IACA,OAAO,EAAE,UAAU,WAAW,UAAU,aAAa,QAAQ,MAAM;AACjE,UAAI;AACF,cAAM,SAAS,kBAAkB;AAAA,UAC/B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,UAAU;AAAA,UACd,SAAS;AAAA,UACT,WAAW,OAAO;AAAA,UAClB,UAAU,OAAO;AAAA,UACjB,WAAW,OAAO;AAAA,UAClB,cAAc,OAAO;AAAA,UACrB,cAAc,OAAO;AAAA,UACrB,WAAW;AAAA,YACT,kDAAkD,OAAO;AAAA,YACzD,wBAAwB,OAAO;AAAA,YAC/B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE,CAAC;AAAA,QACpE;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,gCAAgC,KAAK;AAClD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,kBAAgB,QAAQ,oBAAoB;AAC5C,kBAAgB,QAAQ,kBAAkB;AAC1C,kBAAgB,QAAQ,uBAAuB;AAC/C,kBAAgB,QAAQ,yBAAyB;AACjD,kBAAgB,QAAQ,wBAAwB;AAChD,kBAAgB,QAAQ,4BAA4B;AACpD,kBAAgB,QAAQ,2BAA2B;AACnD,kBAAgB,QAAQ,qBAAqB;AAC7C,kBAAgB,QAAQ,gBAAgB;AACxC,kBAAgB,QAAQ,sBAAsB;AAC9C,kBAAgB,QAAQ,qBAAqB;AAC7C,kBAAgB,QAAQ,kBAAkB;AAC1C,kBAAgB,QAAQ,yBAAyB;AACjD,kBAAgB,QAAQ,0BAA0B;AAClD,kBAAgB,QAAQ,4BAA4B;AACpD,kBAAgB,QAAQ,yBAAyB;AACjD,kBAAgB,QAAQ,sBAAsB;AAC9C,kBAAgB,QAAQ,wBAAwB;AAChD,kBAAgB,QAAQ,sBAAsB;AAC9C,kBAAgB,QAAQ,oBAAoB;AAC5C,kBAAgB,QAAQ,qBAAqB;AAC7C,kBAAgB,QAAQ,iBAAiB;AAGzC,gCAA8B,MAAM;AACpC,mCAAiC,MAAM;AACvC,oCAAkC,MAAM;AACxC,iCAA+B,MAAM;AACrC,4BAA0B,MAAM;AAChC,+BAA6B,MAAM;AACrC;;;AG/JA,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,iBAAAC,sBAAqB;AAE9B,IAAMC,cAAaD,eAAc,YAAY,GAAG;AAChD,IAAME,aAAYH,SAAQE,WAAU;AAK7B,SAAS,yBAAiC;AAC/C,MAAI;AACF,WAAOJ,cAAaC,MAAKI,YAAW,iCAAiC,GAAG,OAAO;AAAA,EACjF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,sBAA8B;AAC5C,MAAI;AACF,WAAOL,cAAaC,MAAKI,YAAW,8BAA8B,GAAG,OAAO;AAAA,EAC9E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,uBAA+B;AAC7C,MAAI;AACF,WAAOL,cAAaC,MAAKI,YAAW,oCAAoC,GAAG,OAAO;AAAA,EACpF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,yBAAiC;AAC/C,MAAI;AACF,WAAOL,cAAaC,MAAKI,YAAW,sCAAsC,GAAG,OAAO;AAAA,EACtF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACtCO,SAAS,wBAAwB,QAAyB;AAE/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AACV,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM,uBAAuB;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AACV,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM,oBAAoB;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AACV,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM,qBAAqB;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AACV,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM,uBAAuB;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC1FA,SAAS,KAAAC,WAAS;;;ACIlB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,QAAAC,cAAY;AACrB,SAAS,kBAAkB;;;ACH3B,SAAS,kBAAkB;AAuEpB,SAAS,kBAAkBC,OAAwB,QAA8B;AAGtF,QAAM,WAAW,CAAC,MAAc,UAA4B;AAC1D,QAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,YAAM,SAAkC,CAAC;AACzC,iBAAW,KAAK,OAAO,KAAK,KAAgC,EAAE,KAAK,GAAG;AACpE,eAAO,CAAC,IAAK,MAAkC,CAAC;AAAA,MAClD;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,QAAM,YAAY,KAAK,UAAU,EAAE,QAAQ,MAAAA,MAAK,GAAG,QAAQ;AAC3D,SAAO,WAAW,QAAQ,EAAE,OAAO,SAAS,EAAE,OAAO,KAAK;AAC5D;AAoCO,SAAS,qBAAqB,QAAqC;AACxE,QAAM,OAAiB;AAAA,IACrB;AAAA,IAAW;AAAA,EACb;AAEA,MAAI,OAAO,YAAY;AACrB,SAAK,KAAK,iBAAiB,OAAO,UAAU,EAAE;AAAA,EAChD;AACA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE;AAAA,EACpD;AACA,MAAI,OAAO,QAAQ;AACjB,SAAK,KAAK,YAAY,OAAO,MAAM,EAAE;AAAA,EACvC;AACA,MAAI,OAAO,YAAY,QAAW;AAChC,SAAK,KAAK,aAAa,OAAO,OAAO,EAAE;AAAA,EACzC;AACA,MAAI,OAAO,YAAY,QAAW;AAChC,SAAK,KAAK,aAAa,OAAO,OAAO,EAAE;AAAA,EACzC;AACA,MAAI,OAAO,iBAAiB,QAAW;AACrC,SAAK,KAAK,oBAAoB,OAAO,YAAY,EAAE;AAAA,EACrD;AACA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE;AAAA,EACpD;AACA,MAAI,OAAO,OAAO;AAChB,SAAK,KAAK,SAAS;AACnB,SAAK,KAAK,kBAAkB;AAAA,EAC9B,WAAW,OAAO,eAAe;AAC/B,SAAK,KAAK,kBAAkB;AAAA,EAC9B;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,QAAmC;AACpE,QAAM,OAAiB;AAAA,IACrB;AAAA,IAAW;AAAA,EACb;AAEA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE;AAAA,EACpD;AACA,MAAI,OAAO,QAAQ;AACjB,SAAK,KAAK,YAAY,OAAO,MAAM,EAAE;AAAA,EACvC;AAEA,SAAO;AACT;;;AChLA;AACA;AANA,SAAS,aAA2B;AACpC,SAAS,oBAAoB;AAC7B,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,qBAAqB;AAC9B,SAAS,aAAAC,YAAW,QAAAC,aAAY;AAIhC;;;ACCA;AADA,SAAS,cAAc,cAAAC,mBAAkB;AAIzC,IAAM,2BAA2B;AA+B1B,SAAS,oBACd,OACA,MACA,MACe;AACf,QAAM,YAAY,MAAM,aAAa;AAErC,SAAO,IAAI,QAAc,CAACC,WAAS,WAAW;AAC5C,QAAI,UAAU;AAEd,UAAM,UAAU,MAAM;AACpB,gBAAU;AACV,YAAM,QAAQ,eAAe,QAAQ,QAAQ;AAC7C,YAAM,QAAQ,eAAe,QAAQ,QAAQ;AAC7C,YAAM,eAAe,SAAS,OAAO;AACrC,YAAM,eAAe,QAAQ,MAAM;AACnC,mBAAa,KAAK;AAAA,IACpB;AAEA,UAAM,WAAW,MAAM;AACrB,UAAI,QAAS;AACb,aAAO,MAAM,GAAG,IAAI,kCAAkC;AACtD,cAAQ;AACR,MAAAA,UAAQ;AAAA,IACV;AAEA,UAAM,WAAW,MAAM;AACrB,UAAI,QAAS;AACb,aAAO,MAAM,GAAG,IAAI,kCAAkC;AACtD,cAAQ;AACR,MAAAA,UAAQ;AAAA,IACV;AAEA,UAAM,UAAU,CAAC,UAAiB;AAChC,UAAI,QAAS;AACb,cAAQ;AACR,aAAO,IAAI,MAAM,GAAG,IAAI,qBAAqB,MAAM,OAAO,EAAE,CAAC;AAAA,IAC/D;AAEA,UAAM,SAAS,CAAC,SAAwB;AACtC,UAAI,QAAS;AACb,cAAQ;AACR,aAAO,IAAI,MAAM,GAAG,IAAI,wCAAwC,IAAI,GAAG,CAAC;AAAA,IAC1E;AAEA,UAAM,QAAQD,YAAW,MAAM;AAC7B,UAAI,QAAS;AACb,aAAO,KAAK,GAAG,IAAI,wBAAwB,SAAS,+BAA0B;AAC9E,cAAQ;AACR,MAAAC,UAAQ;AAAA,IACV,GAAG,SAAS;AAEZ,UAAM,QAAQ,GAAG,QAAQ,QAAQ;AACjC,UAAM,QAAQ,GAAG,QAAQ,QAAQ;AACjC,UAAM,GAAG,SAAS,OAAO;AACzB,UAAM,GAAG,QAAQ,MAAM;AAGvB,QAAI,MAAM,UAAU,MAAM,aAAa,MAAM;AAC3C,cAAQ;AACR,aAAO,IAAI,MAAM,GAAG,IAAI,8BAA8B,MAAM,QAAQ,GAAG,CAAC;AAAA,IAC1E;AAAA,EACF,CAAC;AACH;;;ADPO,IAAM,uBAAN,cAAmC,aAAa;AAAA,EAQrD,YAAoB,WAAkC,CAAC,GAAG;AACxD,UAAM;AADY;AAAA,EAEpB;AAAA,EATQ,SAA8B;AAAA,EAC9B,YAAY;AAAA,EACZ,mBAAmB,oBAAI,IAAqF;AAAA,EAC5G,gBAAgB;AAAA,EAChB;AAAA,EACA,gBAAgB;AAAA,EAMxB,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAQ;AACf,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,WAAO,KAAK,oCAAoC;AAEhD,UAAM,OAAO;AAAA,MACX;AAAA,MAAW;AAAA,MACX;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,YAAY;AAC5B,WAAK,KAAK,iBAAiB,KAAK,SAAS,UAAU,EAAE;AAAA,IACvD;AACA,QAAI,KAAK,SAAS,QAAQ;AACxB,WAAK,KAAK,YAAY,KAAK,SAAS,MAAM,EAAE;AAAA,IAC9C;AACA,QAAI,KAAK,SAAS,UAAU;AAC1B,WAAK,KAAK,cAAc,KAAK,SAAS,QAAQ,EAAE;AAAA,IAClD;AACA,QAAI,KAAK,SAAS,aAAa;AAC7B,WAAK,KAAK,eAAe;AAAA,IAC3B;AACA,QAAI,KAAK,SAAS,WAAW;AAC3B,WAAK,KAAK,eAAe,KAAK,SAAS,SAAS,EAAE;AAAA,IACpD;AAIA,UAAM,WAAW,EAAE,GAAG,QAAQ,IAAI;AAClC,UAAM,YAAY,qBAAqB;AACvC,QAAI,aAAa,SAAS,MAAM;AAC9B,eAAS,OAAO,GAAG,SAAS,GAAGC,UAAS,GAAG,SAAS,IAAI;AAAA,IAC1D,WAAW,WAAW;AACpB,eAAS,OAAO;AAAA,IAClB;AAEA,SAAK,SAAS,MAAM,UAAU,MAAM;AAAA,MAClC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,KAAK;AAAA,IACP,CAAC;AAED,SAAK,OAAO,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACvC,aAAO,MAAM,qBAAqB,KAAK,SAAS,CAAC;AAAA,IACnD,CAAC;AAED,SAAK,OAAO,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACvC,WAAK,aAAa,IAAI;AAAA,IACxB,CAAC;AAED,SAAK,OAAO,GAAG,SAAS,CAAC,UAAU;AACjC,aAAO,MAAM,iCAAiC,KAAK;AACnD,WAAK,KAAK,SAAS,KAAK;AAAA,IAC1B,CAAC;AAED,SAAK,OAAO,GAAG,QAAQ,CAAC,SAAS;AAC/B,aAAO,KAAK,4CAA4C,IAAI;AAC5D,WAAK,SAAS;AACd,WAAK,gBAAgB;AACrB,WAAK,KAAK,QAAQ,IAAI;AAAA,IACxB,CAAC;AAGD,UAAM,oBAAoB,KAAK,QAAQ,wBAAwB;AAAA,EACjE;AAAA,EAEQ,aAAa,MAAoB;AACvC,SAAK,iBAAiB,KAAK,SAAS;AAEpC,QAAI,YAAY,KAAK,cAAc,QAAQ,UAAU;AACrD,WAAO,cAAc,IAAI;AACvB,YAAM,SAAS,KAAK,cAAc,UAAU,GAAG,SAAS;AACxD,YAAM,qBAAqB,OAAO,MAAM,uBAAuB;AAE/D,UAAI,oBAAoB;AACtB,cAAM,gBAAgB,SAAS,mBAAmB,CAAC,CAAC;AACpD,cAAM,eAAe,YAAY;AACjC,cAAM,aAAa,eAAe;AAElC,YAAI,KAAK,cAAc,UAAU,YAAY;AAC3C,gBAAM,iBAAiB,KAAK,cAAc,UAAU,cAAc,UAAU;AAC5E,eAAK,gBAAgB,KAAK,cAAc,UAAU,UAAU;AAE5D,cAAI;AACF,kBAAM,UAAsB,KAAK,MAAM,cAAc;AACrD,iBAAK,cAAc,OAAO;AAAA,UAC5B,SAAS,OAAO;AACd,mBAAO,MAAM,gCAAgC,OAAO,cAAc;AAAA,UACpE;AAEA,sBAAY,KAAK,cAAc,QAAQ,UAAU;AAAA,QACnD,OAAO;AACL;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO,MAAM,uBAAuB,MAAM;AAC1C,aAAK,gBAAgB;AACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,SAA2B;AAC/C,WAAO,MAAM,yBAAyB,OAAO;AAG7C,QAAI,QAAQ,OAAO,UAAa,KAAK,iBAAiB,IAAI,OAAO,QAAQ,EAAE,CAAC,GAAG;AAC7E,YAAM,UAAU,KAAK,iBAAiB,IAAI,OAAO,QAAQ,EAAE,CAAC;AAC5D,WAAK,iBAAiB,OAAO,OAAO,QAAQ,EAAE,CAAC;AAE/C,UAAI,QAAQ,OAAO;AACjB,gBAAQ,OAAO,IAAI,MAAM,cAAc,QAAQ,MAAM,OAAO,EAAE,CAAC;AAAA,MACjE,OAAO;AACL,gBAAQ,QAAQ,QAAQ,MAAM;AAAA,MAChC;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,mCAAmC;AACxD,WAAK,KAAK,eAAe,QAAQ,MAAkC;AAAA,IACrE;AAAA,EACF;AAAA,EAEQ,YAAY,SAA2B;AAC7C,QAAI,CAAC,KAAK,QAAQ,OAAO;AACvB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,aAAa,KAAK,UAAU,OAAO;AACzC,UAAM,gBAAgB,OAAO,WAAW,YAAY,MAAM;AAC1D,UAAM,SAAS,mBAAmB,aAAa;AAAA;AAAA;AAC/C,UAAM,cAAc,SAAS;AAE7B,WAAO,MAAM,wBAAwB,WAAW;AAChD,SAAK,OAAO,MAAM,MAAM,WAAW;AAAA,EACrC;AAAA,EAEQ,YAAY,QAAgB,QAAoC;AACtE,UAAM,KAAK,KAAK;AAChB,UAAM,UAAsB;AAAA,MAC1B,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,IAAI,QAAQ,CAACC,WAAS,WAAW;AACtC,WAAK,iBAAiB,IAAI,IAAI,EAAE,SAAAA,WAAS,OAAO,CAAC;AACjD,WAAK,YAAY,OAAO;AAGxB,MAAAC,YAAW,MAAM;AACf,YAAI,KAAK,iBAAiB,IAAI,EAAE,GAAG;AACjC,eAAK,iBAAiB,OAAO,EAAE;AAC/B,iBAAO,IAAI,MAAM,mCAAmC,MAAM,EAAE,CAAC;AAAA,QAC/D;AAAA,MACF,GAAG,GAAK;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,QAAgB,QAAwB;AAC/D,UAAM,UAAsB;AAAA,MAC1B,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AACA,SAAK,YAAY,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,cAAsC;AACrD,QAAI,KAAK,eAAe;AAEtB,UAAI,gBAAgB,iBAAiB,KAAK,qBAAqB;AAC7D,cAAM,KAAK,gBAAgB,YAAY;AAAA,MACzC;AACA;AAAA,IACF;AAEA,WAAO,KAAK,wCAAwC;AAEpD,UAAM,aAAa;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,YAAY;AAAA,QACV,MAAM;AAAA,QACN,SAAS,kBAAkB;AAAA,MAC7B;AAAA,MACA,cAAc;AAAA,QACZ,cAAc;AAAA,UACZ,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,MAAM,EAAE;AAAA,UACxD,YAAY,CAAC;AAAA,UACb,oBAAoB,CAAC;AAAA,UACrB,YAAY,CAAC;AAAA,UACb,iBAAiB;AAAA,YACf,UAAU;AAAA,YACV,WAAW;AAAA,YACX,SAAS;AAAA,UACX;AAAA,QACF;AAAA,QACA,WAAW;AAAA,UACT,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc;AAChB,MAAC,WAA0D,mBAAmB,CAAC;AAAA,QAC7E,KAAK;AAAA,QACL,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,YAAY,cAAc,UAAU;AAC/C,SAAK,iBAAiB,eAAe,CAAC,CAAC;AAEvC,SAAK,sBAAsB;AAC3B,SAAK,gBAAgB;AACrB,WAAO,KAAK,iDAAiD;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,QAA+B;AAC3D,WAAO,KAAK,2BAA2B,KAAK,mBAAmB,OAAO,MAAM,EAAE;AAE9E,UAAM,UAAU,KAAK,sBACjB,CAAC,EAAE,KAAK,KAAK,qBAAqB,MAAM,mBAAmB,CAAC,IAC5D,CAAC;AAEL,SAAK,iBAAiB,uCAAuC;AAAA,MAC3D,OAAO;AAAA,QACL,OAAO,CAAC,EAAE,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAAA,QACjD;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,sBAAsB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAsC;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,WAAW,QAAgB,KAAqC;AACpE,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAGA,UAAM,cAAc,OAAO,cAAcC,MAAK,iBAAiB,UAAU,GAAG,SAAS,CAAC,EAAE;AAExF,WAAO,IAAI,QAAQ,CAACF,WAAS,WAAW;AACtC,UAAI,sBAAsB;AAC1B,YAAM,UAAUC,YAAW,MAAM;AAC/B,YAAI,CAAC,qBAAqB;AACxB,eAAK,mBAAmB,aAAa;AACrC,iBAAO,IAAI,MAAM,iCAAiC,CAAC;AAAA,QACrD;AAAA,MACF,GAAG,GAAI;AAGP,YAAM,qBAAqB,CAAC,WAAqC;AAC/D,YAAI,OAAO,QAAQ,aAAa;AAC9B,gCAAsB;AACtB,UAAAE,cAAa,OAAO;AACpB,eAAK,eAAe,eAAe,kBAAkB;AAGrD,eAAK,iBAAiB,yBAAyB;AAAA,YAC7C,cAAc,EAAE,KAAK,YAAY;AAAA,UACnC,CAAC;AAED,UAAAH,UAAQ,OAAO,WAAW;AAAA,QAC5B;AAAA,MACF;AAEA,WAAK,GAAG,eAAe,kBAAkB;AAGzC,WAAK,iBAAiB,wBAAwB;AAAA,QAC5C,cAAc;AAAA,UACZ,KAAK;AAAA,UACL,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,QAA+D;AAClF,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,QAAI,CAAC,KAAK,UAAU,GAAG;AACrB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,UAAM,SAAS,MAAM,KAAK,YAAY,2BAA2B,MAAM;AAEvE,QAAI,UAAU,OAAO,WAAW,YAAY,WAAY,QAAmB;AACzE,aAAQ,OAAuC;AAAA,IACjD;AACA,WAAQ,UAA+B,CAAC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAA4D;AAC9E,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,QAAI,CAAC,KAAK,UAAU,GAAG;AACrB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,UAAM,SAAS,MAAM,KAAK,YAAY,2BAA2B,MAAM;AACvE,WAAO,KAAK,mBAAmB,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAA4G;AAC9H,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,QAAI,CAAC,KAAK,UAAU,GAAG;AACrB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,UAAM,SAAS,MAAM,KAAK,YAAY,2BAA2B;AAAA,MAC/D,GAAG;AAAA,MACH,SAAS,OAAO,WAAW,EAAE,oBAAoB,KAAK;AAAA,IACxD,CAAC;AACD,WAAO,KAAK,mBAAmB,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,KAAa,MAAc,aAAa,MAAM,UAAU,GAAS;AAC5E,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,SAAK,iBAAiB,wBAAwB;AAAA,MAC5C,cAAc,EAAE,KAAK,YAAY,SAAS,KAAK;AAAA,IACjD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAmB;AAC/B,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,SAAK,iBAAiB,yBAAyB;AAAA,MAC7C,cAAc,EAAE,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,QAAgC;AACzD,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO,OAAO,IAAI,CAAC,SAAS;AAE1B,YAAI,eAAe,MAAM;AACvB,iBAAO,EAAE,KAAK,KAAK,WAAW,OAAO,KAAK,YAAY;AAAA,QACxD;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,WAAW,YAAY,SAAU,QAAmB;AAC7D,aAAO,CAAC,MAAqB;AAAA,IAC/B;AACA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,WAA0B;AAC9B,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAEA,WAAO,KAAK,yCAAyC;AAErD,QAAI;AACF,YAAM,KAAK,YAAY,YAAY,CAAC,CAAC;AACrC,UAAI,KAAK,QAAQ;AACf,aAAK,iBAAiB,QAAQ,CAAC,CAAC;AAAA,MAClC;AAAA,IACF,SAAS,OAAO;AACd,aAAO,KAAK,mCAAmC,KAAK;AAAA,IACtD;AAGA,UAAM,IAAI,QAAc,CAACA,cAAY;AACnC,YAAM,QAAQC,YAAW,MAAM;AAC7B,YAAI,KAAK,QAAQ;AACf,eAAK,OAAO,KAAK,SAAS;AAAA,QAC5B;AACA,QAAAD,UAAQ;AAAA,MACV,GAAG,GAAI;AAEP,UAAI,KAAK,QAAQ;AACf,aAAK,OAAO,KAAK,QAAQ,MAAM;AAC7B,UAAAG,cAAa,KAAK;AAClB,eAAK,SAAS;AACd,UAAAH,UAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,QAAAG,cAAa,KAAK;AAClB,QAAAH,UAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAED,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK,WAAW,QAAQ,CAAC,KAAK,OAAO;AAAA,EAC9C;AACF;;;AEriBA,SAAuB,SAAAI,cAAa;AACpC,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AAEzC;AACA;AAiBO,IAAM,oBAAN,cAAgCC,cAAa;AAAA,EAC1C,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,kBAAkB,oBAAI,IAA4B;AAAA,EAClD,UAA+B;AAAA,EACtB;AAAA,EAEjB,YAAY,QAA2B;AACrC,UAAM;AACN,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,WAAO,KAAK,iDAAiD;AAE7D,UAAM,OAAO,qBAAqB,KAAK,MAAM;AAG7C,UAAM,WAAW,EAAE,GAAG,QAAQ,IAAI;AAClC,UAAM,YAAY,qBAAqB;AACvC,QAAI,aAAa,SAAS,MAAM;AAC9B,eAAS,OAAO,GAAG,SAAS,GAAGC,UAAS,GAAG,SAAS,IAAI;AAAA,IAC1D,WAAW,WAAW;AACpB,eAAS,OAAO;AAAA,IAClB;AAEA,SAAK,UAAUC,OAAM,UAAU,MAAM;AAAA,MACnC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,KAAK;AAAA,IACP,CAAC;AAED,SAAK,QAAQ,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAChD,aAAO,MAAM,wBAAwB,KAAK,SAAS,CAAC;AAAA,IACtD,CAAC;AAED,SAAK,QAAQ,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAChD,WAAK,aAAa,IAAI;AAAA,IACxB,CAAC;AAED,SAAK,QAAQ,GAAG,SAAS,CAAC,UAAiB;AACzC,aAAO,MAAM,+BAA+B,KAAK;AACjD,WAAK,KAAK,SAAS,KAAK;AAAA,IAC1B,CAAC;AAED,SAAK,QAAQ,GAAG,QAAQ,CAAC,SAAwB;AAC/C,aAAO,KAAK,kCAAkC,IAAI,EAAE;AACpD,WAAK,iBAAiB,IAAI,MAAM,kCAAkC,IAAI,EAAE,CAAC;AACzE,WAAK,UAAU;AACf,WAAK,KAAK,QAAQ,IAAI;AAAA,IACxB,CAAC;AAGD,UAAM,oBAAoB,KAAK,SAAS,qBAAqB;AAC7D,WAAO,KAAK,6BAA6B;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,QAAgB,QAAkB,YAAY,KAA2B;AACnF,UAAM,KAAK,KAAK;AAChB,UAAM,UAAU;AAAA,MACd;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAEA,WAAO,IAAI,QAAQ,CAACC,WAAS,WAAW;AACtC,WAAK,gBAAgB,IAAI,IAAI,EAAE,QAAQ,SAAAA,UAAQ,CAAC;AAChD,WAAK,QAAQ,OAAO;AAEpB,YAAM,QAAQC,YAAW,MAAM;AAC7B,YAAI,KAAK,gBAAgB,IAAI,EAAE,GAAG;AAChC,eAAK,gBAAgB,OAAO,EAAE;AAC9B,iBAAO,IAAI,MAAM,4CAA4C,MAAM,EAAE,CAAC;AAAA,QACxE;AAAA,MACF,GAAG,SAAS;AAGZ,YAAM,kBAAkBD;AACxB,YAAM,iBAAiB;AACvB,YAAM,UAAU;AAAA,QACd,QAAQ,CAAC,QAAe;AAAE,UAAAE,cAAa,KAAK;AAAG,yBAAe,GAAG;AAAA,QAAG;AAAA,QACpE,SAAS,CAAC,QAAiB;AAAE,UAAAA,cAAa,KAAK;AAAG,0BAAgB,GAAG;AAAA,QAAG;AAAA,MAC1E;AACA,WAAK,gBAAgB,IAAI,IAAI,OAAO;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA0B;AAC9B,QAAI,CAAC,KAAK,SAAS;AACjB;AAAA,IACF;AAEA,WAAO,KAAK,sCAAsC;AAElD,QAAI;AACF,YAAM,KAAK,YAAY,YAAY,CAAC,GAAG,GAAI;AAAA,IAC7C,SAAS,OAAO;AACd,aAAO,KAAK,gDAAgD,KAAK;AAAA,IACnE;AAGA,UAAM,IAAI,QAAc,CAACF,cAAY;AACnC,YAAM,QAAQC,YAAW,MAAM;AAC7B,YAAI,KAAK,SAAS;AAChB,eAAK,QAAQ,KAAK,SAAS;AAC3B,eAAK,UAAU;AAAA,QACjB;AACA,QAAAD,UAAQ;AAAA,MACV,GAAG,GAAI;AAEP,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ,KAAK,QAAQ,MAAM;AAC9B,UAAAE,cAAa,KAAK;AAClB,eAAK,UAAU;AACf,UAAAF,UAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,QAAAE,cAAa,KAAK;AAClB,QAAAF,UAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,KAAK,YAAY,QAAQ,CAAC,KAAK,QAAQ;AAAA,EAChD;AAAA;AAAA,EAIQ,aAAa,MAAoB;AACvC,SAAK,iBAAiB,KAAK,SAAS;AAEpC,QAAI,YAAY,KAAK,cAAc,QAAQ,UAAU;AACrD,WAAO,cAAc,IAAI;AACvB,YAAM,SAAS,KAAK,cAAc,UAAU,GAAG,SAAS;AACxD,YAAM,qBAAqB,OAAO,MAAM,uBAAuB;AAE/D,UAAI,oBAAoB;AACtB,cAAM,gBAAgB,SAAS,mBAAmB,CAAC,CAAC;AACpD,cAAM,eAAe,YAAY;AACjC,cAAM,aAAa,eAAe;AAElC,YAAI,KAAK,cAAc,UAAU,YAAY;AAC3C,gBAAM,iBAAiB,KAAK,cAAc,UAAU,cAAc,UAAU;AAC5E,eAAK,gBAAgB,KAAK,cAAc,UAAU,UAAU;AAE5D,cAAI;AACF,kBAAM,UAAU,KAAK,MAAM,cAAc;AACzC,iBAAK,cAAc,OAAO;AAAA,UAC5B,SAAS,OAAO;AACd,mBAAO,MAAM,yCAAyC,KAAK;AAAA,UAC7D;AAEA,sBAAY,KAAK,cAAc,QAAQ,UAAU;AAAA,QACnD,OAAO;AACL;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO,MAAM,gCAAgC,MAAM;AACnD,aAAK,gBAAgB;AACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,SAAkH;AACtI,WAAO,MAAM,yBAAyB,OAAO;AAG7C,QAAI,QAAQ,OAAO,UAAa,KAAK,gBAAgB,IAAI,OAAO,QAAQ,EAAE,CAAC,GAAG;AAC5E,YAAM,UAAU,KAAK,gBAAgB,IAAI,OAAO,QAAQ,EAAE,CAAC;AAC3D,WAAK,gBAAgB,OAAO,OAAO,QAAQ,EAAE,CAAC;AAE9C,UAAI,QAAQ,OAAO;AACjB,gBAAQ,OAAO,IAAI,MAAM,uBAAuB,QAAQ,MAAM,OAAO,EAAE,CAAC;AAAA,MAC1E,OAAO;AACL,gBAAQ,QAAQ,QAAQ,MAAM;AAAA,MAChC;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ;AAClB,WAAK,KAAK,gBAAgB,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,CAAC;AAAA,IAC9E;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAAoB;AAC3C,eAAW,CAAC,IAAI,OAAO,KAAK,KAAK,iBAAiB;AAChD,cAAQ,OAAO,KAAK;AACpB,WAAK,gBAAgB,OAAO,EAAE;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,QAAQ,SAAuB;AACrC,QAAI,CAAC,KAAK,SAAS,OAAO;AACxB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAEA,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,UAAM,gBAAgB,OAAO,WAAW,MAAM,MAAM;AACpD,UAAM,QAAQ,mBAAmB,aAAa;AAAA;AAAA,EAAW,IAAI;AAC7D,SAAK,QAAQ,MAAM,MAAM,KAAK;AAAA,EAChC;AACF;;;ACzPA,SAAuB,SAAAG,cAAa;AACpC,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AAEzC;AACA;AAoBO,IAAM,kBAAN,cAA8BC,cAAa;AAAA,EACxC,oBAAoB;AAAA,EACpB,eAAkC,CAAC;AAAA,EAC1B;AAAA,EACT,gBAAkD;AAAA,EAClD,iBAAoD;AAAA,EACpD,aAAa,OAAO,MAAM,CAAC;AAAA,EAC3B,UAA+B;AAAA,EAC/B,eAAe;AAAA,EAEvB,YAAY,QAAyB;AACnC,UAAM;AACN,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,WAAO,KAAK,+BAA+B;AAE3C,UAAM,OAAO,mBAAmB,KAAK,MAAM;AAE3C,UAAM,WAAW,EAAE,GAAG,QAAQ,IAAI;AAClC,UAAM,YAAY,qBAAqB;AACvC,QAAI,aAAa,SAAS,MAAM;AAC9B,eAAS,OAAO,GAAG,SAAS,GAAGC,UAAS,GAAG,SAAS,IAAI;AAAA,IAC1D,WAAW,WAAW;AACpB,eAAS,OAAO;AAAA,IAClB;AAEA,SAAK,UAAUC,OAAM,UAAU,MAAM;AAAA,MACnC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,KAAK;AAAA,IACP,CAAC;AAED,SAAK,QAAQ,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAChD,WAAK,aAAa,IAAI;AAAA,IACxB,CAAC;AAED,SAAK,QAAQ,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAChD,aAAO,MAAM,qBAAqB,KAAK,SAAS,CAAC;AAAA,IACnD,CAAC;AAED,SAAK,QAAQ,GAAG,SAAS,CAAC,UAAiB;AACzC,aAAO,MAAM,6BAA6B,KAAK;AAC/C,UAAI,KAAK,eAAe;AACtB,aAAK,cAAc,KAAK;AACxB,aAAK,gBAAgB;AACrB,aAAK,iBAAiB;AAAA,MACxB;AACA,WAAK,KAAK,SAAS,KAAK;AAAA,IAC1B,CAAC;AAED,SAAK,QAAQ,GAAG,QAAQ,CAAC,SAAwB;AAC/C,aAAO,KAAK,gCAAgC,IAAI,EAAE;AAClD,UAAI,KAAK,eAAe;AACtB,aAAK,cAAc,IAAI,MAAM,6CAA6C,IAAI,EAAE,CAAC;AACjF,aAAK,gBAAgB;AACrB,aAAK,iBAAiB;AAAA,MACxB;AACA,WAAK,UAAU;AACf,WAAK,KAAK,QAAQ,IAAI;AAAA,IACxB,CAAC;AAGD,UAAM,oBAAoB,KAAK,SAAS,mBAAmB;AAC3D,WAAO,KAAK,2BAA2B;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAW,MAAiC;AAC1C,WAAO,IAAI,QAAQ,CAACC,WAAS,WAAW;AACtC,YAAM,UAAU,MAAM;AACpB,aAAK,eAAe,EAAE,MAAM,QAAQ,SAAAA,UAAQ,CAAC;AAAA,MAC/C;AAEA,UAAI,KAAK,mBAAmB;AAC1B,aAAK,aAAa,KAAK,OAAO;AAAA,MAChC,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA0B;AAC9B,QAAI,CAAC,KAAK,SAAS;AACjB;AAAA,IACF;AAEA,WAAO,KAAK,oCAAoC;AAEhD,QAAI;AAEF,WAAK,QAAQ,OAAO,MAAM,KAAK,UAAU,CAAC,UAAU,CAAC,GAAG,MAAM;AAC9D,WAAK,QAAQ,OAAO,MAAM,KAAK,UAAU;AAAA,IAC3C,SAAS,OAAO;AACd,aAAO,KAAK,6CAA6C,KAAK;AAAA,IAChE;AAGA,UAAM,IAAI,QAAc,CAACA,cAAY;AACnC,YAAM,QAAQC,YAAW,MAAM;AAC7B,YAAI,KAAK,SAAS;AAChB,eAAK,QAAQ,KAAK,SAAS;AAC3B,eAAK,UAAU;AAAA,QACjB;AACA,QAAAD,UAAQ;AAAA,MACV,GAAG,GAAI;AAEP,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ,KAAK,QAAQ,MAAM;AAC9B,UAAAE,cAAa,KAAK;AAClB,eAAK,UAAU;AACf,UAAAF,UAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,QAAAE,cAAa,KAAK;AAClB,QAAAF,UAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAED,SAAK,oBAAoB;AACzB,SAAK,eAAe,CAAC;AACrB,WAAO,KAAK,2BAA2B;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,KAAK,YAAY,QAAQ,CAAC,KAAK,QAAQ;AAAA,EAChD;AAAA;AAAA,EAIQ,eAAe,KAA0B;AAC/C,QAAI,CAAC,KAAK,SAAS,OAAO;AACxB,UAAI,OAAO,IAAI,MAAM,2BAA2B,CAAC;AACjD;AAAA,IACF;AAEA,SAAK,oBAAoB;AACzB,SAAK,iBAAiB,IAAI;AAC1B,SAAK,gBAAgB,IAAI;AACzB,SAAK,eAAe;AAEpB,QAAI;AACF,WAAK,QAAQ,MAAM,MAAM,KAAK,UAAU,IAAI,IAAI,GAAG,MAAM;AACzD,WAAK,QAAQ,MAAM,MAAM,KAAK,UAAU;AAAA,IAC1C,SAAS,OAAO;AACd,WAAK,oBAAoB;AACzB,WAAK,iBAAiB;AACtB,WAAK,gBAAgB;AACrB,UAAI,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AACpE,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,aAAa,MAAoB;AACvC,UAAMG,OAAM,KAAK,SAAS;AAG1B,UAAM,WAAWA,KAAI,QAAQ,IAAI;AACjC,QAAI,aAAa,IAAI;AAEnB,WAAK,gBAAgBA;AACrB;AAAA,IACF;AAGA,SAAK,gBAAgBA,KAAI,UAAU,GAAG,QAAQ;AAC9C,UAAM,SAAS,KAAK;AACpB,SAAK,eAAe;AAEpB,QAAI,KAAK,gBAAgB;AACvB,WAAK,eAAe,MAAM;AAC1B,WAAK,iBAAiB;AACtB,WAAK,gBAAgB;AAAA,IACvB;AAEA,SAAK,oBAAoB;AACzB,SAAK,QAAQ;AAGb,UAAM,YAAYA,KAAI,UAAU,WAAW,CAAC;AAC5C,QAAI,UAAU,SAAS,GAAG;AACxB,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,UAAgB;AACtB,UAAM,OAAO,KAAK,aAAa,MAAM;AACrC,QAAI,MAAM;AACR,WAAK;AAAA,IACP;AAAA,EACF;AACF;;;AL3NA;AA4BO,IAAM,sBAAN,MAA0B;AAAA;AAAA,EAEvB,UAAU,oBAAI,IAAqC;AAAA;AAAA,EAGnD;AAAA;AAAA,EAGA;AAAA,EAER,YAAY,SAA+B;AACzC,SAAK,YAAY,SAAS,aAAa,WAAW;AAClD,SAAK,kBAAkBC;AAAA,MACrB,iBAAiB,cAAc;AAAA,MAC/B,KAAK;AAAA,IACP;AAEA,eAAW,UAAU,CAAC,qBAAqB,QAAQ,aAAa,GAAG;AACjE,MAAAC,WAAUD,OAAK,KAAK,iBAAiB,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IACnE;AACA,WAAO,KAAK,6CAA6C,KAAK,SAAS,GAAG;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAoB;AAClB,WAAOA,OAAK,KAAK,iBAAiB,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,kBAAkB,QAA6D;AACnF,UAAM,WAAW,KAAK,aAAa,MAAM;AACzC,WAAO,KAAK,aAAa,YAAY,UAAU,MAAM;AAEnD,aAAO,IAAI,qBAAqB;AAAA,QAC9B,UAAU,SAAS;AAAA,QACnB,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB,aAAa,SAAS;AAAA,QACtB,WAAW,SAAS;AAAA,MACtB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,QAAuD;AAC1E,UAAM,WAAW,KAAK,aAAa,MAAM;AACzC,WAAO,KAAK,aAAa,SAAS,UAAU,MAAM;AAChD,aAAO,IAAI,kBAAkB,QAAQ;AAAA,IACvC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAmD;AACpE,UAAM,WAAW,KAAK,aAAa,MAAM;AACzC,WAAO,KAAK,aAAa,OAAO,UAAU,MAAM;AAC9C,aAAO,IAAI,gBAAgB,QAAQ;AAAA,IACrC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAeE,OAAuC;AAC1D,UAAM,UAAU,KAAK,QAAQ,IAAIA,KAAI;AACrC,QAAI,CAAC,QAAS;AAEd,WAAO,KAAK,iBAAiBA,KAAI,qBAAqB,QAAQ,SAAS,GAAG;AAC1E,UAAM,KAAK,WAAW,OAAO;AAC7B,SAAK,QAAQ,OAAOA,KAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAA6B;AACjC,WAAO,KAAK,0CAA0C,KAAK,SAAS,EAAE;AACtE,UAAM,mBAAmB,MAAM,KAAK,KAAK,QAAQ,QAAQ,CAAC,EAAE;AAAA,MAC1D,OAAO,CAACA,OAAM,OAAO,MAAM;AACzB,YAAI;AACF,gBAAM,KAAK,WAAW,OAAO;AAAA,QAC/B,SAAS,OAAO;AACd,iBAAO,MAAM,uBAAuBA,KAAI,YAAY,KAAK;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,gBAAgB;AAClC,SAAK,QAAQ,MAAM;AACnB,WAAO,KAAK,uBAAuB;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAUA,OAAiC;AACzC,UAAM,UAAU,KAAK,QAAQ,IAAIA,KAAI;AACrC,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,QAAQ,OAAO,UAAU;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,YAA0G;AACxG,UAAM,SAA6F;AAAA,MACjG,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AACA,eAAW,CAACA,OAAM,OAAO,KAAK,KAAK,SAAS;AAC1C,aAAOA,KAAI,IAAI;AAAA,QACb,YAAY,QAAQ;AAAA,QACpB,SAAS,QAAQ,OAAO,UAAU;AAAA,QAClC,WAAW,QAAQ;AAAA,MACrB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAqC,QAAc;AACzD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,cAAc,OAAO,gBAAgB,KAAK;AAAA,MAC1C,QAAQ,OAAO,UAAU,KAAK,UAAU;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aACZA,OACA,QACA,SACqE;AACrE,UAAM,OAAO,kBAAkBA,OAAM,MAAM;AAC3C,UAAM,WAAW,KAAK,QAAQ,IAAIA,KAAI;AAGtC,QAAI,YAAY,SAAS,eAAe,QAAQ,SAAS,OAAO,UAAU,GAAG;AAC3E,aAAO,MAAM,oBAAoBA,KAAI,kBAAkB,KAAK,UAAU,GAAG,CAAC,CAAC,GAAG;AAC9E,aAAO,SAAS;AAAA,IAClB;AAGA,QAAI,UAAU;AACZ,aAAO,KAAK,GAAGA,KAAI,+CAA+C;AAClE,YAAM,KAAK,WAAW,QAAQ;AAC9B,WAAK,QAAQ,OAAOA,KAAI;AAAA,IAC1B;AAGA,UAAM,SAAS,QAAQ;AACvB,UAAM,OAAO,MAAM;AAEnB,SAAK,QAAQ,IAAIA,OAAM;AAAA,MACrB,YAAY;AAAA,MACZ;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,MAAAA;AAAA,IACF,CAAC;AAED,WAAO,KAAK,GAAGA,KAAI,0BAA0B,KAAK,UAAU,GAAG,CAAC,CAAC,GAAG;AACpE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,SAAuC;AAC9D,QAAI;AACF,YAAM,QAAQ,OAAO,SAAS;AAAA,IAChC,SAAS,OAAO;AACd,aAAO,KAAK,kBAAkB,QAAQ,IAAI,YAAY,KAAK;AAAA,IAE7D;AAAA,EACF;AACF;AASA,IAAI,sBAAkD;AAK/C,SAAS,kBAAkB,SAAoD;AACpF,MAAI,CAAC,qBAAqB;AACxB,0BAAsB,IAAI,oBAAoB,OAAO;AAAA,EACvD;AACA,SAAO;AACT;AAKO,SAAS,mBAAwC;AACtD,MAAI,CAAC,qBAAqB;AACxB,0BAAsB,IAAI,oBAAoB;AAAA,EAChD;AACA,SAAO;AACT;AAKA,eAAsB,wBAAuC;AAC3D,MAAI,qBAAqB;AACvB,UAAM,oBAAoB,YAAY;AACtC,0BAAsB;AAAA,EACxB;AACF;;;ADnSA;AAEA,SAAS,QAAAC,QAAM,WAAAC,gBAAe;AAC9B,SAAS,iBAAAC,sBAAqB;AAuB9B,SAAS,kBAAkB,aAAmC;AAC5D,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,SAAS,YAAY,MAAM;AAAA,CAAc;AAEpD,cAAY,QAAQ,CAAC,YAAY,UAAU;AACzC,UAAM,eAAe,gBAAgB,WAAW,QAAQ;AACxD,UAAM,eAAe,gBAAgB,WAAW,QAAQ;AACxD,UAAM,WAAW,QAAQ,WAAW,MAAM,MAAM,OAAO,CAAC,YAAY,WAAW,MAAM,MAAM,YAAY,CAAC;AAExG,UAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,YAAY,IAAI,YAAY,OAAO,QAAQ,EAAE;AACzE,UAAM,KAAK,MAAM,WAAW,OAAO,EAAE;AACrC,QAAI,WAAW,QAAQ;AACrB,YAAM,KAAK,cAAc,WAAW,MAAM,EAAE;AAAA,IAC9C;AACA,QAAI,WAAW,MAAM;AACnB,YAAM,KAAK,YAAY,WAAW,IAAI,EAAE;AAAA,IAC1C;AACA,UAAM,KAAK,EAAE;AAAA,EACf,CAAC;AAED,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,gBAAgB,UAA0B;AACjD,UAAQ,UAAU;AAAA,IAChB,KAAK;AAAG,aAAO;AAAA;AAAA,IACf,KAAK;AAAG,aAAO;AAAA;AAAA,IACf,KAAK;AAAG,aAAO;AAAA;AAAA,IACf,KAAK;AAAG,aAAO;AAAA;AAAA,IACf;AAAS,aAAO;AAAA,EAClB;AACF;AAEA,SAAS,gBAAgB,UAA0B;AACjD,UAAQ,UAAU;AAAA,IAChB,KAAK;AAAG,aAAO;AAAA,IACf,KAAK;AAAG,aAAO;AAAA,IACf,KAAK;AAAG,aAAO;AAAA,IACf,KAAK;AAAG,aAAO;AAAA,IACf;AAAS,aAAO;AAAA,EAClB;AACF;AASA,eAAe,kBACb,UAAiC,CAAC,GAClC,cACmE;AACnE,QAAM,EAAE,gBAAgB,QAAQ,IAAI,MAAM;AAE1C,QAAM,SAA+B;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,QAAQ,YAAY;AAAA,IAC9B,YAAY,QAAQ,cAAcD,SAAQ,SAAS,IAAI;AAAA,IACvD,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,EACrB;AAEA,QAAM,UAAU,iBAAiB;AACjC,QAAM,iBAAiB,MAAM,QAAQ,kBAAkB,MAAM;AAE7D,QAAM,eAAe,gBAAgBC,eAAcD,SAAQ,SAAS,IAAI,CAAC,EAAE;AAC3E,QAAM,eAAe,WAAW,YAAY;AAE5C,SAAO;AACT;AAKA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AAAA,EACA,gBAAgB,CAAC;AACnB,GAAwD;AACtD,MAAI;AACF,WAAO,KAAK,2CAA2C;AAEvD,UAAM,iBAAiB,MAAM,kBAAkB,eAAe,YAAY;AAG1E,UAAM,UAAUC,eAAcF,OAAK,iBAAiB,UAAU,GAAG,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;AAE3F,UAAM,cAAc,MAAM,eAAe,WAAW,QAAQ,OAAO;AAGnE,UAAM,UAAU;AAAA,MACd,YAAY,YAAY,OAAO,OAAK,EAAE,aAAa,CAAC,EAAE;AAAA,MACtD,WAAW,YAAY,OAAO,OAAK,EAAE,aAAa,CAAC,EAAE;AAAA,MACrD,WAAW,YAAY,OAAO,OAAK,EAAE,aAAa,CAAC,EAAE;AAAA,MACrD,cAAc,YAAY,OAAO,OAAK,EAAE,aAAa,CAAC,EAAE;AAAA,IAC1D;AAEA,UAAM,UAAU,QAAQ,eAAe;AACvC,UAAM,kBAAkB,kBAAkB,WAAW;AAErD,WAAO,KAAK,kCAAkC,OAAO,aAAa,YAAY,MAAM,EAAE;AAEtF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EAEF,SAAS,OAAO;AACd,WAAO,MAAM,6BAA6B,KAAK;AAC/C,UAAM,IAAI,MAAM,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACrG;AACF;AAaO,SAAS,2BAA2B,QAAyB;AAClE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWG,IAAE,KAAK,CAAC,OAAO,SAAS,QAAQ,QAAQ,SAAS,SAAS,KAAK,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC5H,SAASA,IAAE,OAAO,EAAE,SAAS,iEAAiE;AAAA,MAC9F,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,MACvF,eAAeA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iEAAiE;AAAA,IACjH;AAAA,IACA,OAAO,EAAE,SAAS,eAAe,aAAa,UAAU,MAAM;AAC5D,UAAI;AACF,cAAM,gBAAuC,CAAC;AAE9C,YAAI,aAAa;AACf,wBAAc,aAAa;AAAA,QAC7B;AACA,YAAI,WAAW;AACb,wBAAc,WAAW;AAAA,QAC3B;AAEA,cAAM,SAAS,MAAM,eAAe;AAAA,UAClC,QAAQ;AAAA,UACR;AAAA,UACA,cAAc;AAAA,QAChB,CAAC;AAGD,cAAM,kBAAkB;AAAA,UACtB,aAAa,OAAO,YAAY,IAAI,QAAM;AAAA,YACxC,MAAM,EAAE;AAAA,YACR,QAAQ,EAAE,MAAM,MAAM,YAAY;AAAA;AAAA,YAClC,MAAM,EAAE,MAAM,MAAM,OAAO;AAAA;AAAA,YAC3B,SAAS,EAAE;AAAA,YACX,UAAU,gBAAgB,EAAE,QAAQ;AAAA,YACpC,QAAQ,EAAE;AAAA,UACZ,EAAE;AAAA,UACF,iBAAiB,OAAO;AAAA,UACxB,SAAS,OAAO;AAAA,UAChB,SAAS,OAAO;AAAA,QAClB;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM,KAAK,UAAU,iBAAiB,MAAM,CAAC;AAAA,cAC7C,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MAEF,SAAS,OAAO;AACd,eAAO,MAAM,yCAAyC,KAAK;AAC3D,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,cACxE,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAMF;;;AOlOA;AACA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,cAAAC,aAAY,WAAAC,iBAAe;AAuBpC,eAAe,qBAAqB,QAAuB;AACzD,QAAM,EAAE,gBAAgB,QAAQ,IAAI,MAAM;AAE1C,QAAM,SAA+B;AAAA,IACnC,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY,OAAO,cAAcA,UAAQ,SAAS,IAAI;AAAA,EACxD;AAEA,QAAM,UAAU,iBAAiB;AACjC,QAAM,SAAS,MAAM,QAAQ,kBAAkB,MAAM;AAGrD,MAAI,eAAe,OAAO;AAC1B,MAAI,gBAAgB,CAAC,aAAa,WAAW,SAAS,GAAG;AACvD,UAAM,eAAeD,YAAW,YAAY,IACxC,eACAC,UAAQ,QAAQ,IAAI,GAAG,YAAY;AACvC,mBAAeF,eAAc,YAAY,EAAE;AAAA,EAC7C;AACA,iBAAe,gBAAgBA,eAAcE,UAAQ,SAAS,IAAI,CAAC,EAAE;AACrE,QAAM,OAAO,WAAW,YAAY;AAEpC,SAAO;AACT;AAKA,SAAS,wBACP,QACqC;AAErC,QAAM,UAAUD,YAAW,OAAO,QAAQ,IAAI,OAAO,WAAWC,UAAQ,QAAQ,IAAI,GAAG,OAAO,QAAQ;AACtG,QAAM,SAASF,eAAc,OAAO,EAAE;AAEtC,SAAO,EAAE,SAAS,OAAO;AAC3B;AAKA,eAAe,wBACb,QACA,QACA,SACA,QACqC;AAErC,MAAI;AACJ,MAAI,OAAO,aAAa;AACtB,WAAO,OAAO;AAAA,EAChB,OAAO;AACL,QAAI;AACF,aAAO,MAAMD,UAAS,SAAS,OAAO;AAAA,IACxC,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,qBAAqB,OAAO,KAAK,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE;AAAA,IACnG;AAAA,EACF;AAGA,SAAO,aAAa,QAAQ,IAAI;AAEhC,SAAO;AAAA,IACL,UAAU,EAAE,WAAW,OAAO,WAAW,MAAM,OAAO,KAAK;AAAA,IAC3D,cAAc,EAAE,KAAK,OAAO;AAAA,EAC9B;AACF;AAKA,eAAsB,cAAc,QAAkD;AACpF,SAAO,KAAK,qBAAqB,OAAO,QAAQ,IAAI,OAAO,IAAI,IAAI,OAAO,SAAS,EAAE;AACrF,QAAM,SAAS,MAAM,qBAAqB,MAAM;AAChD,QAAM,EAAE,SAAS,OAAO,IAAI,wBAAwB,MAAM;AAC1D,QAAM,iBAAiB,MAAM,wBAAwB,QAAQ,QAAQ,SAAS,MAAM;AAEpF,MAAI;AACF,WAAO,MAAM,OAAO,eAAe,cAAc;AAAA,EACnD,UAAE;AACA,WAAO,cAAc,MAAM;AAAA,EAC7B;AACF;AAKA,eAAsB,cAAc,QAA+C;AACjF,SAAO,KAAK,qBAAqB,OAAO,QAAQ,IAAI,OAAO,IAAI,IAAI,OAAO,SAAS,EAAE;AACrF,QAAM,SAAS,MAAM,qBAAqB,MAAM;AAChD,QAAM,EAAE,SAAS,OAAO,IAAI,wBAAwB,MAAM;AAC1D,QAAM,iBAAiB,MAAM,wBAAwB,QAAQ,QAAQ,SAAS,MAAM;AAEpF,MAAI;AACF,WAAO,MAAM,OAAO,cAAc,cAAc;AAAA,EAClD,UAAE;AACA,WAAO,cAAc,MAAM;AAAA,EAC7B;AACF;AAKA,eAAsB,cAAc,QAA+C;AACjF,SAAO,KAAK,qBAAqB,OAAO,QAAQ,IAAI,OAAO,IAAI,IAAI,OAAO,SAAS,EAAE;AACrF,QAAM,SAAS,MAAM,qBAAqB,MAAM;AAChD,QAAM,EAAE,SAAS,OAAO,IAAI,wBAAwB,MAAM;AAC1D,QAAM,iBAAiB,MAAM,wBAAwB,QAAQ,QAAQ,SAAS,MAAM;AAEpF,MAAI;AACF,WAAO,MAAM,OAAO,cAAc;AAAA,MAChC,GAAG;AAAA,MACH,SAAS,EAAE,oBAAoB,KAAK;AAAA,IACtC,CAAC;AAAA,EACH,UAAE;AACA,WAAO,cAAc,MAAM;AAAA,EAC7B;AACF;;;ACpJA,SAAS,KAAAI,WAAS;AAOlB;AAKA,IAAM,kBAAkB;AAAA,EACtB,WAAWC,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EACtF,cAAcA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,EAC1G,WAAWA,IAAE,OAAO,EAAE,SAAS,6CAA6C;AAAA,EAC5E,MAAMA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,qCAAqC;AAAA,EAC5E,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACvF,eAAeA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iEAAiE;AACjH;AAKA,SAAS,gBAAgB,OAOtB;AACD,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM;AAAA,IACZ,YAAY,MAAM;AAAA,IAClB,cAAc,MAAM;AAAA,EACtB;AACF;AAKO,SAAS,iBAAiB,QAAyB;AAExD,6BAA2B,MAAM;AAGjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAU;AACf,UAAI;AACF,cAAM,QAAQ,MAAM,cAAc,gBAAgB,KAAK,CAAC;AACxD,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM,KAAK,UAAU;AAAA,cACnB,iBAAiB,MAAM;AAAA,cACvB,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,gBAC1B,QAAQ,KAAK;AAAA,gBACb,eAAe,KAAK;AAAA,gBACpB,YAAY,KAAK;AAAA,gBACjB,MAAM,KAAK;AAAA,gBACX,OAAO,KAAK;AAAA,cACd,EAAE;AAAA,YACJ,GAAG,MAAM,CAAC;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,gCAAgC,KAAK;AAClD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,IAAI,MAAM,OAAgB,CAAC;AAAA,UAC/G,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAU;AACf,UAAI;AACF,cAAM,YAAY,MAAM,cAAc,gBAAgB,KAAK,CAAC;AAC5D,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM,KAAK,UAAU;AAAA,cACnB,iBAAiB,UAAU;AAAA,cAC3B,WAAW,UAAU,IAAI,CAAC,SAAS;AAAA,gBACjC,cAAc,IAAI,MAAM,IAAI;AAAA,gBAC5B,SAAS,IAAI,MAAM,IAAI,OAAO;AAAA,gBAC9B,gBAAgB,IAAI,MAAM,MAAM;AAAA,gBAChC,WAAW,IAAI,MAAM,MAAM,OAAO;AAAA,gBAClC,KAAK,IAAI;AAAA,cACX,EAAE;AAAA,YACJ,GAAG,MAAM,CAAC;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,gCAAgC,KAAK;AAClD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,IAAI,MAAM,OAAgB,CAAC;AAAA,UAC/G,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAU;AACf,UAAI;AACF,cAAM,YAAY,MAAM,cAAc,gBAAgB,KAAK,CAAC;AAC5D,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM,KAAK,UAAU;AAAA,cACnB,WAAW,UAAU,IAAI,CAAC,SAAS;AAAA,gBACjC,cAAc,IAAI,MAAM,IAAI;AAAA,gBAC5B,SAAS,IAAI,MAAM,IAAI,OAAO;AAAA,gBAC9B,gBAAgB,IAAI,MAAM,MAAM;AAAA,gBAChC,WAAW,IAAI,MAAM,MAAM,OAAO;AAAA,gBAClC,KAAK,IAAI;AAAA,cACX,EAAE;AAAA,cACF,gBAAgB,UAAU;AAAA,YAC5B,GAAG,MAAM,CAAC;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,gCAAgC,KAAK;AAClD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,IAAI,MAAM,OAAgB,CAAC;AAAA,UAC/G,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACxJA,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AACzC,SAAS,QAAAC,cAAY;;;ACKd,IAAM,qBAAyC;AAAA,EACpD;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,IACd,iBAAiB;AAAA,MACf,YAAY;AAAA,MACZ,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AACF;;;ADlDA;AACA;AAOA,SAAS,gBAAwB;AAC/B,SAAO;AACT;AAKA,SAAS,oBAAoB,cAAqC;AAChE,MAAI;AACF,UAAM,WAAWC,OAAK,cAAc,GAAG,YAAY;AAEnD,QAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,aAAO,KAAK,4BAA4B,QAAQ,EAAE;AAClD,aAAO;AAAA,IACT;AAEA,WAAOC,cAAa,UAAU,OAAO;AAAA,EACvC,SAAS,OAAO;AACd,WAAO,MAAM,+BAA+B,YAAY,KAAK,KAAK;AAClE,WAAO;AAAA,EACT;AACF;AAKO,SAAS,6BAA6B,QAAyB;AACpE,aAAW,gBAAgB,oBAAoB;AAC7C,QAAI,CAAC,aAAa,QAAS;AAE3B,UAAM,cAAc,sBAAsB,aAAa,QAAQ;AAE/D,WAAO;AAAA,MACL,GAAG,aAAa,SAAS,YAAY,CAAC;AAAA,MACtC;AAAA,MACA;AAAA,QACE,aAAa,kCAAkC,aAAa,QAAQ;AAAA,QACpE,UAAU;AAAA,MACZ;AAAA,MACA,YAAY;AACV,cAAM,UAAU,oBAAoB,aAAa,OAAQ;AAEzD,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,UAAU,CAAC;AAAA,cACT,KAAK;AAAA,cACL,UAAU;AAAA,cACV,MAAM,KAAK,aAAa,SAAS,YAAY,CAAC;AAAA;AAAA;AAAA,YAChD,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO;AAAA,UACL,UAAU,CAAC;AAAA,YACT,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,kCAAkC,QAAyB;AACzE,aAAW,gBAAgB,oBAAoB;AAC7C,QAAI,CAAC,aAAa,aAAc;AAEhC,UAAM,cAAc,sBAAsB,aAAa,QAAQ;AAE/D,WAAO;AAAA,MACL,GAAG,aAAa,SAAS,YAAY,CAAC;AAAA,MACtC;AAAA,MACA;AAAA,QACE,aAAa,6DAA6D,aAAa,QAAQ;AAAA,QAC/F,UAAU;AAAA,MACZ;AAAA,MACA,YAAY;AACV,cAAM,UAAU,oBAAoB,aAAa,YAAa;AAE9D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,UAAU,CAAC;AAAA,cACT,KAAK;AAAA,cACL,UAAU;AAAA,cACV,MAAM,KAAK,aAAa,SAAS,YAAY,CAAC;AAAA;AAAA;AAAA,YAChD,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO;AAAA,UACL,UAAU,CAAC;AAAA,YACT,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,oCAAoC,QAAyB;AAC3E,aAAW,gBAAgB,oBAAoB;AAC7C,QAAI,CAAC,aAAa,gBAAiB;AAEnC,eAAW,CAAC,cAAc,QAAQ,KAAK,OAAO,QAAQ,aAAa,eAAe,GAAG;AACnF,YAAM,cAAc,sBAAsB,aAAa,QAAQ,IAAI,YAAY;AAE/E,aAAO;AAAA,QACL,GAAG,aAAa,SAAS,YAAY,CAAC,IAAI,aAAa,QAAQ,KAAK,GAAG,EAAE,QAAQ,SAAS,OAAK,EAAE,YAAY,CAAC,CAAC;AAAA,QAC/G;AAAA,QACA;AAAA,UACE,aAAa,UAAU,aAAa,QAAQ,KAAK,GAAG,CAAC,cAAc,aAAa,QAAQ;AAAA,UACxF,UAAU;AAAA,QACZ;AAAA,QACA,YAAY;AACV,gBAAM,UAAU,oBAAoB,QAAQ;AAE5C,cAAI,CAAC,SAAS;AACZ,mBAAO;AAAA,cACL,UAAU,CAAC;AAAA,gBACT,KAAK;AAAA,gBACL,UAAU;AAAA,gBACV,MAAM,KAAK,aAAa,SAAS,YAAY,CAAC,IAAI,aAAa,QAAQ,KAAK,GAAG,EAAE,QAAQ,SAAS,OAAK,EAAE,YAAY,CAAC,CAAC;AAAA;AAAA;AAAA,cACzH,CAAC;AAAA,YACH;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,UAAU,CAAC;AAAA,cACT,KAAK;AAAA,cACL,UAAU;AAAA,cACV,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,0BAA0B,QAAyB;AACjE,SAAO,KAAK,4CAA4C;AAGxD,+BAA6B,MAAM;AAGnC,oCAAkC,MAAM;AAGxC,sCAAoC,MAAM;AAE1C,SAAO,KAAK,4BAA4B,mBAAmB,MAAM,YAAY;AAC/E;;;AE7KA,SAAS,KAAAC,WAAS;AAClB,SAAS,YAAAC,iBAAgB;;;ACLzB,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,QAAAC,QAAM,WAAAC,gBAAe;AAC9B,SAAS,iBAAAC,sBAAqB;AAE9B,IAAMC,cAAaD,eAAc,YAAY,GAAG;AAChD,IAAME,aAAYH,SAAQE,WAAU;AAK7B,SAAS,mBAAmB,gBAAgC;AACjE,MAAI;AACF,UAAM,aAAaH,OAAKI,YAAW,cAAc;AACjD,WAAOL,cAAa,YAAY,OAAO;AAAA,EACzC,SAAS,OAAO;AACd,WAAO,oBAAoB,cAAc,oBAAoB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,EACvH;AACF;AAKO,SAAS,sBAAsB,UAAkB,WAA2C;AACjG,MAAI,YAAY;AAGhB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,UAAM,WAAW;AAAA,MACf,IAAI,OAAO,SAAS,GAAG,UAAU,GAAG;AAAA,MACpC,IAAI,OAAO,MAAM,GAAG,OAAO,GAAG;AAAA,IAChC;AAEA,eAAW,WAAW,UAAU;AAC9B,kBAAY,UAAU,QAAQ,SAAS,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;;;AD/BA;AAGO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAsBO,IAAM,8BAA8BM,IAAE,OAAO;AAAA,EAClD,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,oCAAoC;AAAA,EAChD,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,8BAA8B;AAC5C,CAAC;AAQM,IAAM,2BAA2BA,IAAE,OAAO;AAAA,EAC/C,UAAUA,IACP,OAAO,EACP,SAAS,6BAA6B;AAAA,EACzC,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,4CAA4C;AAAA,EACxD,aAAaA,IACV,OAAO,EACP,SAAS,EACT,SAAS,2EAA2E;AAAA,EACvF,gBAAgBA,IACb,OAAO,EACP,SAAS,EACT,SAAS,mEAAmE;AAAA,EAC/E,gBAAgBA,IACb,OAAO,EACP,SAAS,EACT,SAAS,kDAAkD;AAChE,CAAC;AASM,IAAM,iCAAiCA,IAAE,OAAO;AAAA,EACrD,WAAWA,IACR,OAAO,EACP,SAAS,2DAA2D;AAAA,EACvE,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,mCAAmC;AAAA,EAC/C,cAAcA,IACX,OAAO,EACP,SAAS,EACT,SAAS,iCAAiC;AAAA,EAC7C,WAAWA,IACR,OAAO,OAAO,EACd,SAAS,EACT,SAAS,6CAA6C;AAC3D,CAAC;AAQM,IAAM,mBAAmBA,IAAE,OAAO;AAAA,EACvC,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,EACT,SAAS,+CAA+C;AAAA,EAC3D,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,8BAA8B;AAC5C,CAAC;AAOM,IAAM,sBAAsBA,IAAE,OAAO;AAAA,EAC1C,UAAUA,IACP,OAAO,EACP,SAAS,EACT,SAAS,0CAA0C;AAAA,EACtD,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,EACT,SAAS,+CAA+C;AAAA,EAC3D,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,8BAA8B;AAC5C,CAAC;AAOM,IAAM,kBAAkBA,IAAE,OAAO;AAAA,EACtC,SAASA,IACN,OAAO,EACP,SAAS,EACT,SAAS,8BAA8B;AAAA,EAC1C,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,mCAAmC;AACjD,CAAC;AAQM,IAAM,2BAA2BA,IAAE,OAAO;AAAA,EAC/C,cAAcA,IACX,OAAO,EACP,SAAS,EACT,SAAS,uDAAuD;AAAA,EACnE,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,mCAAmC;AAAA,EAC/C,WAAWA,IACR,OAAO,EACP,SAAS,+CAA+C;AAC7D,CAAC;AAOM,IAAM,4BAA4BA,IAAE,OAAO;AAAA,EAChD,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,mCAAmC;AAAA,EAC/C,WAAWA,IACR,OAAO,EACP,SAAS,+CAA+C;AAC7D,CAAC;AAOM,IAAM,kCAAkCA,IAAE,OAAO;AAAA,EACtD,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,EACT,SAAS,oCAAoC;AAAA,EAChD,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,wCAAwC;AAAA,EACpD,cAAcA,IACX,OAAO,EACP,SAAS,EACT,SAAS,6CAA6C;AAC3D,CAAC;AAOM,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAYO,SAAS,wBAAwB,QAAyB;AAE/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,4BAA4B;AAAA,IAC5B,OAAO,EAAE,UAAU,UAAU,MAAM;AACjC,YAAM,WAAW,mBAAmB,wBAAwB;AAC5D,YAAM,UAAU,sBAAsB,UAAU;AAAA,QAC9C;AAAA,QACA,WAAW,aAAa;AAAA,MAC1B,CAAC;AAED,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM;AAAA;AAAA,kBAAiC,QAAQ;AAAA,EAAK,YAAY,qBAAqB,SAAS;AAAA,IAAO,EAAE;AAAA,EAAK,OAAO;AAAA,YACrH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,yBAAyB;AAAA,IACzB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,YAAM,WAAW,mBAAmB,gCAAgC;AACpE,YAAM,UAAU,sBAAsB,UAAU;AAAA,QAC9C;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,+BAA+B;AAAA,IAC/B,OAAO,EAAE,WAAW,UAAU,cAAc,UAAU,MAAM;AAC1D,YAAM,WAAW,mBAAmB,sCAAsC;AAG1E,YAAM,cACJ,gBACAC,UAAS,SAAS,EACf,QAAQ,iBAAiB,EAAE,EAC3B,YAAY,EACZ,QAAQ,eAAe,GAAG,KAC7B;AAEF,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,OAAO,EAAE,UAAU,UAAU,MAAM;AACjC,YAAM,WAAW,mBAAmB,wBAAwB;AAE5D,UAAI,iBAAiB;AACrB,UAAI,UAAU;AACZ,0BAAkB,mBAAmB,QAAQ;AAAA;AAAA,MAC/C;AACA,UAAI,WAAW;AACb,0BAAkB,qBAAqB,SAAS;AAAA;AAAA,MAClD;AACA,UAAI,YAAY,WAAW;AACzB,0BAAkB;AAAA,MACpB;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB,OAAO,EAAE,UAAU,WAAW,SAAS,MAAM;AAC3C,YAAM,WAAW,mBAAmB,2BAA2B;AAE/D,UAAI,iBAAiB;AACrB,UAAI,UAAU;AACZ,0BAAkB,mBAAmB,QAAQ;AAAA;AAAA,MAC/C;AACA,UAAI,WAAW;AACb,0BAAkB,qBAAqB,SAAS;AAAA;AAAA,MAClD;AACA,UAAI,UAAU;AACZ,0BAAkB,mBAAmB,QAAQ;AAAA;AAAA,MAC/C;AACA,UAAI,YAAY,aAAa,UAAU;AACrC,0BAAkB;AAAA,MACpB;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO,EAAE,SAAS,UAAU,MAAM;AAChC,YAAM,WAAW,mBAAmB,sCAAsC;AAE1E,UAAI,iBAAiB;AACrB,UAAI,SAAS;AACX,0BAAkB,mBAAmB,OAAO;AAAA;AAAA,MAC9C;AACA,UAAI,WAAW;AACb,0BAAkB,qBAAqB,SAAS;AAAA;AAAA,MAClD;AACA,UAAI,WAAW,WAAW;AACxB,0BAAkB;AAAA,MACpB;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO,EAAE,SAAS,UAAU,MAAM;AAChC,YAAM,WAAW,mBAAmB,qCAAqC;AAEzE,UAAI,iBAAiB;AACrB,UAAI,SAAS;AACX,0BAAkB,mBAAmB,OAAO;AAAA;AAAA,MAC9C;AACA,UAAI,WAAW;AACb,0BAAkB,qBAAqB,SAAS;AAAA;AAAA,MAClD;AACA,UAAI,WAAW,WAAW;AACxB,0BAAkB;AAAA,MACpB;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,yBAAyB;AAAA,IACzB,OAAO,EAAE,WAAW,UAAU,aAAa,MAAM;AAC/C,YAAM,WAAW,mBAAmB,gCAAgC;AAEpE,UAAI,iBAAiB;AACrB,wBAAkB,qBAAqB,SAAS;AAAA;AAChD,wBAAkB,mBAAmB,QAAQ;AAAA;AAC7C,UAAI,cAAc;AAChB,0BAAkB,wBAAwB,YAAY;AAAA;AAAA,MACxD;AACA,wBAAkB;AAElB,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,0BAA0B;AAAA,IAC1B,OAAO,EAAE,WAAW,SAAS,MAAM;AACjC,YAAM,WAAW,mBAAmB,iCAAiC;AAErE,YAAM,iBAAiB;AAAA;AAAA,oBAET,SAAS;AAAA,kBACX,QAAQ;AAAA;AAAA;AAIpB,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gCAAgC;AAAA,IAChC,OAAO,EAAE,UAAU,WAAW,aAAa,MAAM;AAC/C,YAAM,WAAW,mBAAmB,wCAAwC;AAE5E,UAAI,iBAAiB;AACrB,UAAI,UAAU;AACZ,0BAAkB,mBAAmB,QAAQ;AAAA;AAAA,MAC/C;AACA,UAAI,WAAW;AACb,0BAAkB,qBAAqB,SAAS;AAAA;AAAA,MAClD;AACA,UAAI,cAAc;AAChB,0BAAkB,wBAAwB,YAAY;AAAA;AAAA,MACxD;AACA,UAAI,YAAY,aAAa,cAAc;AACzC,0BAAkB;AAAA,MACpB;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK,cAAc,sBAAsB,MAAM,mBAAmB;AAC3E;AAKO,SAAS,uBACd,UACA,UACA,aACA,gBACA,gBACQ;AACR,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,mBAAmB,QAAQ;AAAA,IAC3B,mBAAmB,QAAQ;AAAA,EAC7B;AAEA,MAAI,aAAa;AACf,UAAM,KAAK,uBAAuB,WAAW,EAAE;AAAA,EACjD;AACA,MAAI,gBAAgB;AAClB,UAAM,KAAK,0BAA0B,cAAc,EAAE;AAAA,EACvD;AACA,MAAI,gBAAgB;AAClB,UAAM,KAAK,0BAA0B,cAAc,EAAE;AAAA,EACvD;AAEA,QAAM,KAAK,IAAI,6BAA6B,EAAE;AAE9C,MAAI,aAAa;AACf,UAAM;AAAA,MACJ,uEAAuE,WAAW;AAAA,IACpF;AAAA,EACF,OAAO;AACL,UAAM,KAAK,mDAAmD;AAAA,EAChE;AAEA,MAAI,gBAAgB;AAClB,UAAM;AAAA,MACJ,6FAA6F,cAAc;AAAA,IAC7G;AAAA,EACF,OAAO;AACL,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB;AAClB,UAAM;AAAA,MACJ,6EAA6E,cAAc;AAAA,IAC7F;AAAA,EACF,OAAO;AACL,UAAM,KAAK,8CAA8C;AAAA,EAC3D;AAEA,QAAM,KAAK,IAAI,EAAE;AACjB,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,SAAS,qBACd,WACA,UACA,cACA,WACQ;AACR,SAAO;AAAA;AAAA,sBAEa,SAAS;AAAA,kBACb,QAAQ;AAAA,uBACH,YAAY;AAAA,0BACT,aAAa,6CAA6C;AAAA;AAAA;AAAA;AAAA,6EAIP,SAAS;AAAA,wGACkB,SAAS,mBAAmB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAM5I;;;AEjpBA,SAAS,KAAAC,WAAS;AAClB,SAAS,cAAAC,mBAAkB;;;ACP3B,SAAS,UAAU,SAAS,aAAa;AACrC,MAAI,YAAY;AACZ,UAAM,IAAI,MAAM,wBAAwB;AAC5C,MAAI,gBAAgB;AAChB,UAAM,IAAI,MAAM,6BAA6B;AACrD;AACO,IAAM,MAAN,MAAU;AAAA,EACb;AAAA,EACA;AAAA,EACA,YAAY,SAAS,aAAa;AAC9B,cAAU,SAAS,WAAW;AAC9B,SAAK,UAAU;AACf,SAAK,OAAO;AAAA,EAChB;AAAA,EACA,MAAM,OAAO;AACT,UAAM,OAAO,MAAM,KAAK,QAAQ,KAAK;AACrC,QAAI;AACA,WAAK,OAAO;AAAA,EACpB;AAAA,EACA,MAAM,QAAQ;AACV,QAAI,KAAK;AACL,YAAM,KAAK,QAAQ,MAAM,KAAK,IAAI;AAAA,EAC1C;AAAA,EACA,MAAM,OAAO,IAAI;AACb,OAAG,KAAK,IAAI;AACZ,UAAM,KAAK,MAAM;AAAA,EACrB;AACJ;;;AC3BA,SAAS,gBAAAC,eAAc,YAAY,iBAAAC,sBAAqB;AAExD,OAAOC,WAAU;AA0BV,IAAM,eAAN,MAAmB;AAAA,EACtB;AAAA,EACA;AAAA,EACA,YAAY,UAAU;AAClB,SAAK,YAAY;AACjB,UAAM,IAAI,SAAS,SAAS;AAC5B,SAAK,gBAAgBC,MAAK,KAAKA,MAAK,QAAQ,CAAC,GAAG,IAAIA,MAAK,SAAS,CAAC,CAAC,MAAM;AAAA,EAC9E;AAAA,EACA,OAAO;AACH,QAAI;AACJ,QAAI;AACA,aAAOC,cAAa,KAAK,WAAW,OAAO;AAAA,IAC/C,SACO,GAAG;AACN,UAAI,EAAE,SAAS,UAAU;AACrB,eAAO;AAAA,MACX;AACA,YAAM;AAAA,IACV;AACA,WAAO;AAAA,EACX;AAAA,EACA,MAAMC,MAAK;AACP,IAAAC,eAAc,KAAK,eAAeD,IAAG;AACrC,eAAW,KAAK,eAAe,KAAK,SAAS;AAAA,EACjD;AACJ;;;AC9BO,IAAM,eAAN,MAAmB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,UAAU,EAAE,OAAAE,QAAO,UAAW,GAAG;AACzC,SAAK,WAAW,IAAI,aAAa,QAAQ;AACzC,SAAK,SAASA;AACd,SAAK,aAAa;AAAA,EACtB;AAAA,EACA,OAAO;AACH,UAAM,OAAO,KAAK,SAAS,KAAK;AAChC,QAAI,SAAS,MAAM;AACf,aAAO;AAAA,IACX,OACK;AACD,aAAO,KAAK,OAAO,IAAI;AAAA,IAC3B;AAAA,EACJ;AAAA,EACA,MAAM,KAAK;AACP,SAAK,SAAS,MAAM,KAAK,WAAW,GAAG,CAAC;AAAA,EAC5C;AACJ;;;ACnCO,IAAM,eAAN,cAA2B,aAAa;AAAA,EAC3C,YAAY,UAAU;AAClB,UAAM,UAAU;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,WAAW,CAAC,SAAS,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,IACrD,CAAC;AAAA,EACL;AACJ;;;ACTA,SAAS,aAAAC,YAAW,iBAAAC,sBAAqB;AACzC,SAAS,QAAAC,cAAY;AACrB,SAAS,cAAAC,mBAAkB;;;ACT3B,SAAS,KAAAC,WAAS;AAUX,IAAM,sBAAsBA,IAAE,OAAO;AAAA,EAC1C,QAAQA,IAAE,OAAO;AAAA,EACjB,WAAWA,IAAE,OAAO;AAAA;AAAA,EACpB,UAAUA,IAAE,OAAO;AAAA,EACnB,YAAYA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAAA,EAC5B,QAAQA,IAAE,IAAI;AAAA,EACd,SAASA,IAAE,QAAQ;AAAA,EACnB,UAAUA,IAAE,OAAO;AAAA;AAAA,EACnB,mBAAmBA,IAAE,OAAO,EAAE,SAAS;AACzC,CAAC;AAOM,IAAM,4BAA4BA,IAAE,OAAO;AAAA,EAChD,aAAaA,IAAE,OAAO;AAAA,EACtB,WAAWA,IAAE,OAAO;AAAA,EACpB,MAAMA,IAAE,KAAK,CAAC,eAAe,YAAY,gBAAgB,CAAC;AAAA,EAC1D,SAASA,IAAE,QAAQ;AAAA,EACnB,SAASA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAAA,EACzB,SAASA,IAAE,OAAO;AAAA,IAChB,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACnC,CAAC,EAAE,SAAS;AACd,CAAC;AAOM,IAAM,2BAA2BA,IAAE,OAAO;AAAA,EAC/C,SAASA,IAAE,OAAO;AAAA,EAClB,WAAWA,IAAE,OAAO;AAAA,EACpB,cAAcA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA;AAAA,EACvC,YAAYA,IAAE,OAAO;AAAA,IACnB,sBAAsBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC/C,qBAAqBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC9C,sBAAsBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC/C,uBAAuBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAClD,CAAC;AAAA,EACD,OAAOA,IAAE,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA,EACvC,iBAAiBA,IAAE,MAAMA,IAAE,OAAO,CAAC;AACrC,CAAC;AAOM,IAAM,mBAAmBA,IAAE,OAAO;AAAA,EACvC,cAAcA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EAChC,mBAAmBA,IAAE,KAAK,CAAC,WAAW,WAAW,QAAQ,CAAC;AAAA,EAC1D,YAAYA,IAAE,KAAK,CAAC,WAAW,WAAW,WAAW,UAAU,CAAC;AAAA,EAChE,qBAAqBA,IAAE,KAAK,CAAC,WAAW,WAAW,WAAW,YAAY,CAAC;AAAA,EAC3E,cAAcA,IAAE,OAAO;AAAA;AACzB,CAAC;AAOM,IAAM,gCAAgCA,IAAE,OAAO;AAAA;AAAA,EAEpD,WAAWA,IAAE,OAAO;AAAA,EACpB,WAAWA,IAAE,OAAO;AAAA,EACpB,UAAUA,IAAE,OAAO;AAAA,EACnB,WAAWA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,WAAWA,IAAE,OAAO;AAAA;AAAA,EACpB,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,QAAQA,IAAE,KAAK,CAAC,UAAU,aAAa,UAAU,WAAW,CAAC;AAAA;AAAA,EAG7D,UAAUA,IAAE,MAAM,mBAAmB;AAAA;AAAA,EAGrC,gBAAgBA,IAAE,MAAM,yBAAyB;AAAA;AAAA,EAGjD,eAAeA,IAAE,MAAM,wBAAwB;AAAA;AAAA,EAG/C,cAAc;AAAA,EACd,iBAAiBA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EACnC,mBAAmBA,IAAE,OAAO,EAAE,SAAS;AACzC,CAAC;AAOM,IAAM,sBAAsBA,IAAE,OAAO;AAAA,EAC1C,WAAWA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,WAAWA,IAAE,MAAM,CAACA,IAAE,OAAO,GAAGA,IAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,EACtD,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAWA,IAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAOM,IAAM,yBAAyBA,IAAE,OAAO;AAAA,EAC7C,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EAC9B,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EAC9B,WAAWA,IAAE,OAAO;AAAA,EACpB,SAASA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAC3B,CAAC;AAOM,IAAM,wBAAwBA,IAAE,OAAO;AAAA,EAC5C,SAAS;AAAA,EACT,WAAWA,IAAE,OAAO;AAAA,EACpB,eAAeA,IAAE,OAAO;AAAA,EACxB,aAAaA,IAAE,OAAO;AAAA,EACtB,qBAAqBA,IAAE,OAAO;AAAA,EAC9B,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EAClC,iBAAiBA,IAAE,MAAMA,IAAE,OAAO,CAAC;AACrC,CAAC;AAOM,IAAM,qBAAqBA,IAAE,OAAO;AAAA,EACzC,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,CAAC;AAAA,EAC3C,UAAUA,IAAE,OAAO;AAAA,EACnB,SAASA,IAAE,OAAO;AAAA,EAClB,WAAWA,IAAE,OAAO;AACtB,CAAC;AAOM,IAAM,6BAA6BA,IAAE,OAAO;AAAA,EACjD,WAAWA,IAAE,OAAO;AAAA,EACpB,WAAWA,IAAE,OAAO;AAAA,EACpB,QAAQA,IAAE,QAAQ;AAAA,EAClB,UAAUA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAAA,EAC1B,SAASA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAAA,EACzB,WAAWA,IAAE,OAAO;AACtB,CAAC;AAOM,IAAM,mBAAmBA,IAAE,OAAO;AAAA,EACvC,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EAC9B,UAAUA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAAA,EAC1B,WAAWA,IAAE,OAAO;AAAA,EACpB,iBAAiBA,IAAE,OAAO;AAAA,EAC1B,SAASA,IAAE,MAAM,0BAA0B;AAAA,EAC3C,SAASA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAC3B,CAAC;AAOM,IAAM,yBAAyBA,IAAE,OAAO;AAAA,EAC7C,iBAAiBA,IAAE,OAAO,EAAE,QAAQ,mBAAmB;AAAA,EACvD,mBAAmBA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC3C,eAAeA,IAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACpC,uBAAuBA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC/C,oBAAoBA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC5C,2BAA2BA,IAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC/C,kBAAkBA,IAAE,KAAK,CAAC,YAAY,YAAY,QAAQ,CAAC,EAAE,QAAQ,UAAU;AAAA,EAC/E,0BAA0BA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAClD,uBAAuBA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC/C,uBAAuBA,IAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAClD,CAAC;;;ADjLD;AAYO,IAAM,qBAAN,MAAyB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,kBAA6C,CAAC,GAAG;AAC3D,SAAK,SAAS,uBAAuB,MAAM;AAAA,MACzC,GAAG,uBAAuB,MAAM,CAAC,CAAC;AAAA,MAClC,GAAG;AAAA,IACL,CAAC;AAED,SAAK,aAAa,KAAK,OAAO;AAC9B,SAAK,uBAAuB;AAE5B,UAAM,UAAU,IAAI,aAA8BC,OAAK,KAAK,YAAY,eAAe,CAAC;AACxF,SAAK,KAAK,IAAI,IAAI,SAAS;AAAA,MACzB,UAAU,CAAC;AAAA,IACb,CAAC;AAED,SAAK,mBAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,UAAM,KAAK,mBAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAoC;AAChD,QAAI;AACF,YAAM,KAAK,GAAG,KAAK;AAEnB,aAAO,KAAK,yCAAyC,KAAK,GAAG,KAAK,SAAS,MAAM,WAAW;AAAA,IAC9F,SAAS,OAAO;AACd,aAAO,MAAM,0CAA0C,KAAK;AAC5D,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAA+B;AACrC,QAAI;AAEF,MAAAC,WAAU,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAG9C,YAAM,UAAU,CAAC,oBAAoB,SAAS;AAC9C,iBAAW,UAAU,SAAS;AAC5B,QAAAA,WAAUD,OAAK,KAAK,YAAY,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MAC9D;AAIA,YAAM,aAAaA,OAAK,KAAK,YAAY,aAAa;AACtD,UAAI;AACF,QAAAE,eAAc,YAAY,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,MAChF,SAAS,GAAY;AACnB,cAAM,MAAM;AACZ,YAAI,IAAI,SAAS,SAAU,OAAM;AAAA,MACnC;AAEA,aAAO,MAAM,kCAAkC,KAAK,UAAU,EAAE;AAAA,IAClE,SAAS,OAAO;AACd,aAAO,MAAM,uCAAuC,KAAK;AACzD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,WACA,UACA,WACA,aACiB;AACjB,UAAM,YAAYC,YAAW;AAC7B,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,UAAM,UAAmC;AAAA,MACvC;AAAA,MACA;AAAA,MACA,UAAU,YAAY;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,gBAAgB,CAAC;AAAA,MACjB,eAAe,CAAC;AAAA,MAChB,cAAc;AAAA,QACZ,cAAc,CAAC;AAAA,QACf,mBAAmB;AAAA,QACnB,YAAY;AAAA,QACZ,qBAAqB;AAAA,QACrB,cAAc;AAAA,MAChB;AAAA,MACA,iBAAiB,CAAC;AAAA,IACpB;AAEA,UAAM,KAAK,GAAG,KAAK;AACnB,SAAK,GAAG,KAAK,SAAS,KAAK,OAAO;AAClC,UAAM,KAAK,GAAG,MAAM;AAEpB,WAAO,KAAK,wBAAwB,SAAS,eAAe,SAAS,EAAE;AACvE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,WACA,QACyC;AACzC,UAAM,KAAK,GAAG,KAAK;AAEnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,sBAAsB,SAAS,EAAE;AAC7C,aAAO;AAAA,IACT;AAEA,YAAQ,SAAS;AACjB,YAAQ,WAAU,oBAAI,KAAK,GAAE,YAAY;AACzC,YAAQ,aAAa,eAAe,QAAQ;AAE5C,UAAM,KAAK,GAAG,MAAM;AAGpB,QAAI,KAAK,OAAO,4BAA4B,WAAW,aAAa;AAClE,YAAM,KAAK,eAAe,SAAS;AAAA,IACrC;AAEA,WAAO,KAAK,kBAAkB,SAAS,iBAAiB,MAAM,EAAE;AAChE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,WAA4D;AAC3E,UAAM,KAAK,GAAG,KAAK;AACnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,WAAO,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAA6D;AAC9E,UAAM,KAAK,GAAG,KAAK;AACnB,QAAI,WAAW,CAAC,GAAG,KAAK,GAAG,KAAK,QAAQ;AAExC,QAAI,SAAS;AACX,UAAI,QAAQ,WAAW;AACrB,mBAAW,SAAS,OAAO,OAAK,EAAE,UAAU,SAAS,QAAQ,SAAU,CAAC;AAAA,MAC1E;AACA,UAAI,QAAQ,QAAQ;AAClB,mBAAW,SAAS,OAAO,OAAK,EAAE,WAAW,QAAQ,MAAM;AAAA,MAC7D;AACA,UAAI,QAAQ,UAAU;AACpB,mBAAW,SAAS,OAAO,OAAK,EAAE,aAAa,QAAQ,QAAQ;AAAA,MACjE;AACA,UAAI,QAAQ,WAAW;AACrB,mBAAW,SAAS,OAAO,OAAK,EAAE,cAAc,QAAQ,SAAS;AAAA,MACnE;AACA,UAAI,QAAQ,WAAW;AACrB,cAAM,CAAC,OAAO,GAAG,IAAI,QAAQ;AAC7B,mBAAW,SAAS;AAAA,UAAO,OACzB,EAAE,aAAa,SAAS,EAAE,aAAa;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACJ,WACA,aACyC;AACzC,UAAM,KAAK,GAAG,KAAK;AAEnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,sBAAsB,SAAS,EAAE;AAC7C,aAAO;AAAA,IACT;AAEA,YAAQ,eAAe;AAAA,MACrB,GAAG,QAAQ;AAAA,MACX,GAAG;AAAA,MACH,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACvC;AAEA,UAAM,KAAK,GAAG,MAAM;AACpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,WAAmB,YAA0C;AAC5E,UAAM,KAAK,GAAG,KAAK;AAEnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,mCAAmC,SAAS,EAAE;AAC1D;AAAA,IACF;AAEA,YAAQ,SAAS,KAAK,UAAU;AAChC,YAAQ,aAAa,eAAe,WAAW;AAG/C,QAAI,WAAW,mBAAmB;AAChC,cAAQ,oBAAoB,WAAW;AAAA,IACzC;AAEA,UAAM,KAAK,GAAG,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,WAAmB,YAAgD;AACxF,UAAM,KAAK,GAAG,KAAK;AAEnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,yCAAyC,SAAS,EAAE;AAChE;AAAA,IACF;AAEA,YAAQ,eAAe,KAAK,UAAU;AACtC,YAAQ,aAAa,eAAe,WAAW;AAG/C,QAAI,WAAW,SAAS,eAAe;AACrC,cAAQ,aAAa,oBAAoB,WAAW,UAAU,YAAY;AAAA,IAC5E,WAAW,WAAW,SAAS,YAAY;AACzC,cAAQ,aAAa,aAAa,WAAW,UAAU,YAAY;AAAA,IACrE;AAEA,UAAM,KAAK,GAAG,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,WAAmB,aAAgD;AACvF,UAAM,KAAK,GAAG,KAAK;AAEnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,wCAAwC,SAAS,EAAE;AAC/D;AAAA,IACF;AAEA,YAAQ,cAAc,KAAK,WAAW;AACtC,YAAQ,aAAa,eAAe,YAAY;AAChD,YAAQ,kBAAkB,YAAY;AAEtC,UAAM,KAAK,GAAG,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,WAAkC;AAC7D,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAW,SAAS;AAC/C,UAAI,CAAC,QAAS;AAEd,YAAM,OAAO,IAAI,KAAK,QAAQ,WAAW,QAAQ,SAAS;AAC1D,YAAM,WAAW,GAAG,KAAK,YAAY,CAAC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AACtF,YAAM,aAAaH,OAAK,KAAK,YAAY,oBAAoB,QAAQ;AAErE,MAAAC,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAEzC,YAAM,cAAcD,OAAK,YAAY,GAAG,SAAS,OAAO;AACxD,MAAAE,eAAc,aAAa,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAG3D,YAAM,KAAK,GAAG,KAAK;AACnB,WAAK,GAAG,KAAK,WAAW,KAAK,GAAG,KAAK,SAAS,OAAO,OAAK,EAAE,cAAc,SAAS;AACnF,YAAM,KAAK,GAAG,MAAM;AAEpB,aAAO,KAAK,qBAAqB,SAAS,OAAO,WAAW,EAAE;AAAA,IAChE,SAAS,OAAO;AACd,aAAO,MAAM,6BAA6B,SAAS,KAAK,KAAK;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,WAAuD;AACrF,UAAM,KAAK,GAAG,KAAK;AACnB,WAAO,KAAK,GAAG,KAAK,SAAS;AAAA,MAAO,OAClC,EAAE,cAAc,aAAa,EAAE,WAAW;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAoC;AACxC,UAAM,aAAa,oBAAI,KAAK;AAC5B,eAAW,QAAQ,WAAW,QAAQ,IAAI,KAAK,OAAO,aAAa;AACnE,UAAM,kBAAkB,WAAW,YAAY;AAE/C,UAAM,KAAK,GAAG,KAAK;AACnB,UAAM,mBAAmB,KAAK,GAAG,KAAK,SAAS;AAAA,MAAO,OACpD,EAAE,WAAW,EAAE,UAAU;AAAA,IAC3B;AAEA,QAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAK,GAAG,KAAK,WAAW,KAAK,GAAG,KAAK,SAAS;AAAA,QAAO,OACnD,CAAC,EAAE,WAAW,EAAE,WAAW;AAAA,MAC7B;AACA,YAAM,KAAK,GAAG,MAAM;AAEpB,aAAO,KAAK,cAAc,iBAAiB,MAAM,eAAe;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,cAAwD;AACzE,SAAK,SAAS,uBAAuB,MAAM;AAAA,MACzC,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL,CAAC;AAGD,UAAM,aAAaF,OAAK,KAAK,YAAY,aAAa;AACtD,IAAAE,eAAc,YAAY,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,CAAC;AAE9D,WAAO,KAAK,kCAAkC;AAAA,EAChD;AACF;AAKA,SAAS,aAAa,QAA4B,cAAgC;AAChF,MAAI,WAAW,OAAW,QAAO;AACjC,SAAO,OAAO,YAAY,MAAM,UAAU,WAAW;AACvD;AAGO,IAAM,qBAAqB,IAAI,mBAAmB;AAAA,EACvD,iBAAiB,QAAQ,IAAI,+BAA+BF,OAAK,kBAAkB,GAAG,kBAAkB;AAAA,EACxG,uBAAuB,aAAa,QAAQ,IAAI,yBAAyB,KAAK;AAChF,CAAC;;;ALrYD;AAOO,SAAS,wBAAwB,QAAyB;AAC/D,QAAM,SAAS,mBAAmB,UAAU;AAG5C,MAAI,CAAC,OAAO,uBAAuB;AACjC,WAAO,KAAK,oGAAoG;AAChH;AAAA,EACF;AAGA,yBAAuB,MAAM;AAC7B,yBAAuB,MAAM;AAC7B,0BAAwB,MAAM;AAC9B,iCAA+B,MAAM;AAGrC,oCAAkC,MAAM;AACxC,oCAAkC,MAAM;AACxC,qCAAmC,MAAM;AACzC,2CAAyC,MAAM;AAG/C,8BAA4B,MAAM;AAClC,gCAA8B,MAAM;AACpC,6BAA2B,MAAM;AAIjC,SAAO,KAAK,2CAA2C;AACzD;AAUA,SAAS,uBAAuB,QAAyB;AACvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWI,IAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,MACzD,QAAQA,IAAE,KAAK,CAAC,aAAa,UAAU,WAAW,CAAC,EAAE,SAAS,6BAA6B;AAAA,IAC7F;AAAA,IACA,OAAO,EAAE,WAAW,OAAO,MAAM;AAC/B,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,WAAW,MAAM;AAErE,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,YACvC;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,yBAAyB,KAAK;AAC3C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACzF;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,QAAyB;AACvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,IAChE;AAAA,IACA,OAAO,EAAE,UAAU,MAAM;AACvB,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,YACvC;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,0BAA0B,KAAK;AAC5C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,QAAyB;AACxD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,MAChF,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,MACjE,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,MACjH,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,MACzE,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,IAClE;AAAA,IACA,OAAO,EAAE,WAAW,QAAQ,WAAW,UAAU,UAAU,MAAM;AAC/D,UAAI;AACF,cAAM,UAAyB,CAAC;AAChC,YAAI,UAAW,SAAQ,YAAY;AACnC,YAAI,OAAQ,SAAQ,SAAS;AAC7B,YAAI,UAAW,SAAQ,YAAY,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AAC9D,YAAI,SAAU,SAAQ,WAAW;AACjC,YAAI,UAAW,SAAQ,YAAY;AAEnC,cAAM,WAAW,MAAM,mBAAmB;AAAA,UACxC,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AAAA,QAC9C;AAEA,cAAM,cAAc;AAAA,UAClB,eAAe,SAAS;AAAA,UACxB,UAAU,SAAS,IAAI,QAAM;AAAA,YAC3B,WAAW,EAAE;AAAA,YACb,WAAW,EAAE;AAAA,YACb,UAAU,EAAE;AAAA,YACZ,QAAQ,EAAE;AAAA,YACV,WAAW,EAAE;AAAA,YACb,SAAS,EAAE;AAAA,YACX,eAAe,EAAE,SAAS;AAAA,YAC1B,qBAAqB,EAAE,eAAe;AAAA,YACtC,cAAc,EAAE,cAAc,SAAS,IACnC,EAAE,cAAc,EAAE,cAAc,SAAS,CAAC,EAAE,eAC5C;AAAA,UACN,EAAE;AAAA,QACJ;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,YAC3C;AAAA,UACF;AAAA,UACA,iBAAiB,4BAA4B,QAAQ;AAAA,QACvD;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,2BAA2B,KAAK;AAC7C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC3F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,+BAA+B,QAAyB;AAC/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,MAC5D,cAAcA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,gDAAgD;AAAA,MACtG,mBAAmBA,IAAE,KAAK,CAAC,WAAW,WAAW,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,MAC5G,YAAYA,IAAE,KAAK,CAAC,WAAW,WAAW,WAAW,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,MAC3G,qBAAqBA,IAAE,KAAK,CAAC,WAAW,WAAW,WAAW,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,IACzH;AAAA,IACA,OAAO,EAAE,WAAW,cAAc,mBAAmB,YAAY,oBAAoB,MAAM;AACzF,UAAI;AACF,cAAM,cAAuC,CAAC;AAC9C,YAAI,iBAAiB,OAAW,aAAY,eAAe;AAC3D,YAAI,sBAAsB,OAAW,aAAY,oBAAoB;AACrE,YAAI,eAAe,OAAW,aAAY,aAAa;AACvD,YAAI,wBAAwB,OAAW,aAAY,sBAAsB;AAEzE,cAAM,UAAU,MAAM,mBAAmB,mBAAmB,WAAW,WAAW;AAElF,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,YACvC;AAAA,UACF;AAAA,UACA,iBAAiB,wBAAwB,SAAS,sBAAsB;AAAA,QAC1E;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,iCAAiC,KAAK;AACnD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACjG;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,kCAAkC,QAAyB;AAClE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,MAClD,OAAOA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uDAAuD;AAAA,IAC/F;AAAA,IACA,OAAO,EAAE,WAAW,MAAM,MAAM;AAC9B,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,YAAI,QAAQ,CAAC,GAAG,QAAQ,QAAQ,EAAE,QAAQ;AAC1C,YAAI,SAAS,QAAQ,GAAG;AACtB,kBAAQ,MAAM,MAAM,GAAG,KAAK;AAAA,QAC9B;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB;AAAA,gBACA,YAAY,QAAQ,SAAS;AAAA,gBAC7B,aAAa;AAAA,cACf,GAAG,MAAM,CAAC;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,+BAA+B,KAAK;AACjD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC/F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kCAAkC,QAAyB;AAClE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,MAClD,OAAOA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iEAAiE;AAAA,IACzG;AAAA,IACA,OAAO,EAAE,WAAW,MAAM,MAAM;AAC9B,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,YAAI,QAAQ,CAAC,GAAG,QAAQ,cAAc,EAAE,QAAQ;AAChD,YAAI,SAAS,QAAQ,GAAG;AACtB,kBAAQ,MAAM,MAAM,GAAG,KAAK;AAAA,QAC9B;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB;AAAA,gBACA,YAAY,QAAQ,eAAe;AAAA,gBACnC,aAAa;AAAA,cACf,GAAG,MAAM,CAAC;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,+BAA+B,KAAK;AACjD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC/F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mCAAmC,QAAyB;AACnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,MAClD,OAAOA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wDAAwD;AAAA,IAChG;AAAA,IACA,OAAO,EAAE,WAAW,MAAM,MAAM;AAC9B,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,YAAI,SAAS,CAAC,GAAG,QAAQ,aAAa,EAAE,QAAQ;AAChD,YAAI,SAAS,QAAQ,GAAG;AACtB,mBAAS,OAAO,MAAM,GAAG,KAAK;AAAA,QAChC;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB;AAAA,gBACA,aAAa,QAAQ,cAAc;AAAA,gBACnC,cAAc;AAAA,cAChB,GAAG,MAAM,CAAC;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,gCAAgC,KAAK;AAClD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAChG;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,yCAAyC,QAAyB;AACzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,IACpD;AAAA,IACA,OAAO,EAAE,UAAU,MAAM;AACvB,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAGA,cAAM,cAAc,sBAAsB,OAAO;AAGjD,cAAM,mBAAmB,gBAAgB,WAAW,WAAW;AAG/D,cAAM,iBAAiB,MAAM,mBAAmB,WAAW,SAAS;AAEpE,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,YAC3C;AAAA,UACF;AAAA,UACA,iBAAiB,wBAAwB,gBAAgB,iCAAiC;AAAA,QAC5F;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,oCAAoC,KAAK;AACtD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,oCAAoC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACpG;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,4BAA4B,QAAyB;AAC5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,iCAAiC;AAAA,MAC1E,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,IACrG;AAAA,IACA,OAAO,EAAE,YAAY,WAAW,MAAM;AACpC,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ;AAAA,UAC7B,WAAW,IAAI,QAAM,mBAAmB,WAAW,EAAE,CAAC;AAAA,QACxD;AAEA,cAAM,gBAAgB,SAAS,OAAO,OAAK,MAAM,IAAI;AAErD,YAAI,cAAc,WAAW,GAAG;AAC9B,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,aAAa,MAAM,gBAAgB,eAAe,UAAU;AAElE,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,YAAY,MAAM,CAAC;AAAA,YAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,6BAA6B,KAAK;AAC/C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC7F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,8BAA8B,QAAyB;AAC9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,MAChF,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,MACjE,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,MACjH,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,MACzE,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,IAClE;AAAA,IACA,OAAO,EAAE,WAAW,QAAQ,WAAW,UAAU,UAAU,MAAM;AAC/D,UAAI;AACF,cAAM,UAAyB,CAAC;AAChC,YAAI,UAAW,SAAQ,YAAY;AACnC,YAAI,OAAQ,SAAQ,SAAS;AAC7B,YAAI,UAAW,SAAQ,YAAY,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AAC9D,YAAI,SAAU,SAAQ,WAAW;AACjC,YAAI,UAAW,SAAQ,YAAY;AAEnC,cAAM,WAAW,MAAM,mBAAmB;AAAA,UACxC,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AAAA,QAC9C;AAEA,cAAM,YAAY,MAAM,kBAAkB,UAAU,OAAO;AAE3D,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC;AAAA,YACzC;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,+BAA+B,KAAK;AACjD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC/F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,QAAyB;AAC3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,gCAAgC;AAAA,MACzE,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,MAAM,EAAE,SAAS,eAAe;AAAA,IAClG;AAAA,IACA,OAAO,EAAE,YAAY,SAAS,OAAO,MAAM;AACzC,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ;AAAA,UAC7B,WAAW,IAAI,QAAM,mBAAmB,WAAW,EAAE,CAAC;AAAA,QACxD;AAEA,cAAM,gBAAgB,SAAS,OAAO,OAAK,MAAM,IAAI;AAErD,YAAI,cAAc,WAAW,GAAG;AAC9B,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,eAAe,MAAM,eAAe,eAAe,MAAM;AAE/D,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,cAAc,MAAM,CAAC;AAAA,YAC5C;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,6BAA6B,KAAK;AAC/C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC7F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AASA,SAAS,sBAAsB,SAAsD;AACnF,QAAMC,cAAY,oBAAI,KAAK,GAAE,YAAY;AAGzC,QAAM,uBAAuB,QAAQ,aAAa,sBAAsB,YAAY,MAClF,QAAQ,aAAa,sBAAsB,WAAW,IAAI;AAG5D,QAAM,sBAAsB,QAAQ,aAAa,eAAe,YAAY,MAC1E,QAAQ,aAAa,eAAe,YAAY,KAChD,QAAQ,aAAa,eAAe,aAAa,IAAI;AAGvD,QAAM,uBAAuB,QAAQ,aAAa,wBAAwB,YAAY,MACpF,QAAQ,aAAa,wBAAwB,eAAe,KAC5D,QAAQ,aAAa,wBAAwB,YAAY,IAAI;AAG/D,QAAM,kBAAkB,QAAQ,eAAe,OAAO,OAAK,EAAE,WAAW,EAAE,SAAS,UAAU,EAAE;AAC/F,QAAM,aAAa,QAAQ,eAAe,OAAO,OAAK,EAAE,SAAS,UAAU,EAAE;AAC7E,QAAM,wBAAwB,aAAa,IAAK,kBAAkB,aAAc,MAAM;AAGtF,QAAM,eAAe,KAAK;AAAA,IACvB,uBAAuB,OACvB,sBAAsB,MACtB,uBAAuB,MACvB,wBAAwB;AAAA,EAC3B;AAGA,QAAM,QAAQ,gBAAgB,KAAK,MACjC,gBAAgB,KAAK,MACrB,gBAAgB,KAAK,MACrB,gBAAgB,KAAK,MAAM;AAG7B,QAAM,kBAA4B,CAAC;AACnC,MAAI,uBAAuB,KAAK;AAC9B,oBAAgB,KAAK,yDAAyD;AAAA,EAChF;AACA,MAAI,sBAAsB,IAAI;AAC5B,oBAAgB,KAAK,8CAA8C;AAAA,EACrE;AACA,MAAI,uBAAuB,IAAI;AAC7B,oBAAgB,KAAK,kDAAkD;AAAA,EACzE;AACA,MAAI,wBAAwB,IAAI;AAC9B,oBAAgB,KAAK,+CAA+C;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,SAASC,YAAW;AAAA,IACpB,WAAAD;AAAA,IACA;AAAA,IACA,YAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,gBACb,UACA,YAC2B;AAC3B,QAAMA,cAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,aAAa,SAAS,IAAI,OAAK,EAAE,SAAS;AAEhD,QAAM,UAAmC;AAAA,IACvC,cAAc,SAAS;AAAA,IACvB,iBAAiB,SAAS,IAAI,QAAM;AAAA,MAClC,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,QAAQ,EAAE;AAAA,MACV,eAAe,EAAE,SAAS;AAAA,MAC1B,UAAU,EAAE,UACV,IAAI,KAAK,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,KAC9D,oBAAI,KAAK,GAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,MACvD,cAAc,EAAE,cAAc,SAAS,IACrC,EAAE,cAAc,EAAE,cAAc,SAAS,CAAC,EAAE,eAAe;AAAA,IAC/D,EAAE;AAAA,EACJ;AAEA,MAAI,CAAC,cAAc,WAAW,SAAS,SAAS,GAAG;AACjD,UAAM,gBAAgB,SAAS;AAAA,MAAI,OACjC,EAAE,cAAc,SAAS,IAAI,EAAE,cAAc,EAAE,cAAc,SAAS,CAAC,IAAI;AAAA,IAC7E;AACA,YAAQ,oBAAoB;AAAA,MAC1B,cAAc,cACX,OAAO,OAAK,MAAM,IAAI,EACtB,OAAO,CAAC,KAAK,MAAM,MAAM,EAAG,cAAc,CAAC,IAAI,cAAc,OAAO,OAAK,MAAM,IAAI,EAAE;AAAA,MACxF,YAAY;AAAA,QACV,KAAK,KAAK,IAAI,GAAG,cAAc,OAAO,OAAK,MAAM,IAAI,EAAE,IAAI,OAAK,EAAG,YAAY,CAAC;AAAA,QAChF,KAAK,KAAK,IAAI,GAAG,cAAc,OAAO,OAAK,MAAM,IAAI,EAAE,IAAI,OAAK,EAAG,YAAY,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,WAAW,SAAS,UAAU,GAAG;AAClD,YAAQ,qBAAqB;AAAA,MAC3B,eAAe,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ,CAAC;AAAA,MACrE,wBAAwB,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ,CAAC,IAAI,SAAS;AAAA,MAC3F,gBAAgB,gBAAgB,QAAQ;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,YAAY,cAAc,CAAC,KAAK;AAAA,IAChC,WAAAA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,kBACb,UACA,SAC0B;AAC1B,QAAMA,cAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,QAAM,oBAAoB,SAAS,OAAO,OAAK,EAAE,WAAW,WAAW;AACvE,QAAM,cAAc,SAAS,SAAS,IAAI,kBAAkB,SAAS,SAAS,SAAS;AAEvF,QAAM,gBAAgB,SACnB,IAAI,OAAK,EAAE,cAAc,SAAS,IAAI,EAAE,cAAc,EAAE,cAAc,SAAS,CAAC,EAAE,eAAe,IAAI,EACrG,OAAO,WAAS,UAAU,IAAI;AAEjC,QAAM,sBAAsB,cAAc,SAAS,IACjD,cAAc,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,cAAc,SAAS;AAEhF,QAAM,iBAAiB,uBAAuB,QAAQ;AACtD,QAAM,kBAAkB,iCAAiC,QAAQ;AAEjE,SAAO;AAAA,IACL;AAAA,IACA,WAAAA;AAAA,IACA,eAAe,SAAS;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,eACb,UACA,QACuB;AACvB,QAAMA,cAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,WAAW,kBAAkBA,WAAU,QAAQ,SAAS,GAAG,CAAC,IAAI,MAAM;AAE5E,MAAI;AAEJ,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,gBAAU,KAAK,UAAU,UAAU,MAAM,CAAC;AAC1C;AAAA,IACF,KAAK;AACH,gBAAU,mBAAmB,QAAQ;AACrC;AAAA,IACF,KAAK;AACH,gBAAU,uBAAuB,QAAQ;AACzC;AAAA,EACJ;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAAA;AAAA,EACF;AACF;AAMA,SAAS,gBAAgB,UAA6C;AACpE,QAAM,aAAqC,CAAC;AAE5C,WAAS,QAAQ,aAAW;AAC1B,YAAQ,SAAS,QAAQ,UAAQ;AAC/B,iBAAW,KAAK,QAAQ,KAAK,WAAW,KAAK,QAAQ,KAAK,KAAK;AAAA,IACjE,CAAC;AAAA,EACH,CAAC;AAED,SAAO,OAAO,QAAQ,UAAU,EAC7B,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;AAC9C;AAEA,SAAS,uBAAuB,UAA+C;AAC7E,QAAM,WAAqB,CAAC;AAE5B,QAAM,cAAc,gBAAgB,QAAQ;AAC5C,MAAI,eAAe,gBAAgB,QAAQ;AACzC,aAAS,KAAK,4BAA4B,WAAW,EAAE;AAAA,EACzD;AAEA,QAAM,iBAAiB,SAAS,OAAO,OAAK,EAAE,WAAW,WAAW,EAAE,SAAS,SAAS;AACxF,MAAI,iBAAiB,KAAK;AACxB,aAAS,KAAK,mDAAmD;AAAA,EACnE,WAAW,iBAAiB,KAAK;AAC/B,aAAS,KAAK,8CAA8C;AAAA,EAC9D;AAEA,SAAO;AACT;AAEA,SAAS,iCAAiC,UAA+C;AACvF,QAAM,kBAA4B,CAAC;AAEnC,QAAM,iBAAiB,SAAS,OAAO,OAAK,EAAE,WAAW,QAAQ;AACjE,MAAI,eAAe,SAAS,SAAS,SAAS,KAAK;AACjD,oBAAgB,KAAK,oEAAoE;AAAA,EAC3F;AAEA,QAAM,yBAAyB,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ,CAAC,IAAI,SAAS;AAClG,MAAI,yBAAyB,IAAI;AAC/B,oBAAgB,KAAK,uEAAuE;AAAA,EAC9F;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,UAA6C;AACvE,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAeK,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,yBACnB,SAAS,MAAM;AAAA;AAAA,MAElC,SAAS,IAAI,aAAW;AAAA;AAAA,uBAEP,QAAQ,SAAS;AAAA,0CACE,QAAQ,SAAS;AAAA,sCACrB,QAAQ,MAAM;AAAA,wCACZ,QAAQ,QAAQ;AAAA,0CACd,QAAQ,SAAS;AAAA,yCAClB,QAAQ,SAAS,MAAM;AAAA,+CACjB,QAAQ,eAAe,MAAM;AAAA,8CAC9B,QAAQ,cAAc,MAAM;AAAA;AAAA,KAErE,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAIb,SAAO;AACT;AAEA,SAAS,uBAAuB,UAA6C;AAC3E,QAAM,KAAK;AAAA;AAAA,cAEA,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,kBACnB,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,SAAS;AAAA,IAAI,aACb,KAAK,QAAQ,SAAS,MAAM,QAAQ,SAAS,MAAM,QAAQ,MAAM,MAAM,QAAQ,QAAQ,MAAM,QAAQ,SAAS,MAAM,MAAM,QAAQ,eAAe,MAAM;AAAA,EACzJ,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,EAIV,SAAS,IAAI,aAAW;AAAA,eACX,QAAQ,SAAS;AAAA;AAAA,oBAEZ,QAAQ,SAAS;AAAA,gBACrB,QAAQ,MAAM;AAAA,kBACZ,QAAQ,QAAQ;AAAA,oBACd,QAAQ,SAAS;AAAA,kBACnB,QAAQ,WAAW,KAAK;AAAA,mBACvB,QAAQ,SAAS,MAAM;AAAA,yBACjB,QAAQ,eAAe,MAAM;AAAA,wBAC9B,QAAQ,cAAc,MAAM;AAAA;AAAA,EAElD,QAAQ,gBAAgB,SAAS,IAAI;AAAA;AAAA,EAErC,QAAQ,gBAAgB,IAAI,SAAO,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACvD,EAAE;AAAA,CACL,EAAE,KAAK,IAAI,CAAC;AAEX,SAAO;AACT;AAkCA,SAAS,wBACP,SACA,aACwB;AACxB,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,kBAA0C,CAAC;AAGjD,MAAI,QAAQ,aAAa,sBAAsB,UAAU;AACvD,oBAAgB,qBAAqB,IAAI;AACzC,oBAAgB,sBAAsB,IAAI;AAAA,EAC5C,WAAW,QAAQ,aAAa,sBAAsB,WAAW;AAC/D,QAAI,QAAQ,aAAa,eAAe,aAAa,QAAQ,aAAa,eAAe,YAAY;AACnG,sBAAgB,iBAAiB,IAAI;AAAA,IACvC,WAAW,QAAQ,aAAa,eAAe,WAAW;AACxD,sBAAgB,0BAA0B,IAAI;AAC9C,sBAAgB,sBAAsB,IAAI;AAAA,IAC5C,WAAW,QAAQ,aAAa,eAAe,WAAW;AACxD,sBAAgB,iCAAiC,IAAI;AAAA,IACvD;AAAA,EACF;AAGA,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,UAAI,QAAQ,SAAS,WAAW,GAAG;AACjC,wBAAgB,sBAAsB,IAAI;AAAA,MAC5C;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,WAAW,aAAa;AAClC,wBAAgB,iBAAiB,IAAI;AAAA,MACvC;AACA;AAAA,IACF,KAAK,mCAAmC;AACtC,YAAM,cAAc,QAAQ,cAAc,QAAQ,cAAc,SAAS,CAAC;AAC1E,UAAI,eAAe,YAAY,eAAe,IAAI;AAChD,YAAI,YAAY,WAAW,uBAAuB,KAAK;AACrD,0BAAgB,qBAAqB,IAAI;AAAA,QAC3C;AACA,YAAI,YAAY,WAAW,sBAAsB,IAAI;AACnD,0BAAgB,iBAAiB,IAAI;AAAA,QACvC;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK;AAEH,UAAI,QAAQ,aAAa,sBAAsB,aAAa,QAAQ,aAAa,eAAe,WAAW;AACzG,wBAAgB,iBAAiB,IAAI;AAAA,MACvC;AACA;AAAA,EACJ;AAEA,SAAO;AACT;AAKA,SAAS,4BAA4B,UAA6D;AAChG,QAAM,kBAA0C,CAAC;AAEjD,QAAM,iBAAiB,SAAS,OAAO,OAAK,EAAE,WAAW,QAAQ;AACjE,QAAM,oBAAoB,SAAS,OAAO,OAAK,EAAE,WAAW,WAAW;AAEvE,MAAI,eAAe,SAAS,GAAG;AAC7B,oBAAgB,aAAa,IAAI,qBAAqB,eAAe,MAAM;AAAA,EAC7E;AAEA,MAAI,kBAAkB,SAAS,GAAG;AAChC,oBAAgB,kBAAkB,IAAI;AACtC,oBAAgB,oBAAoB,IAAI;AAAA,EAC1C;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,oBAAgB,iBAAiB,IAAI;AAAA,EACvC;AAEA,SAAO;AACT;;;AtDpkCA;AAEA;AACA;AAKA,OAAO,OAAO,EAAE,MAAME,UAAQ,gBAAgB,MAAM,EAAE,CAAC;AAEvD,IAAM,eAAe;AACrB,IAAM,UAAU;AAKhB,eAAsB,YAAY,OAAyB,SAA6B;AACtF,SAAO,KAAK,8CAA8C,OAAO,OAAO,IAAI,OAAO;AAKnF,QAAM,eAAe,oBAAoB;AACzC,SAAO,KAAK,sBAAsB,YAAY,EAAE;AAKhD,QAAM,gBAAgB,MAAM,8BAA8B;AAC1D,SAAO,KAAK,uBAAuB,aAAa,EAAE;AAElD,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAGD,sBAAoB,MAAM;AAG1B,mBAAiB,MAAM;AAGvB,0BAAwB,MAAM;AAG9B,4BAA0B,MAAM;AAGhC,0BAAwB,MAAM;AAG9B,0BAAwB,MAAM;AAG9B,QAAM,mBAAmB,WAAW;AAGpC,oBAAkB;AAElB,MAAI,SAAS,SAAS;AACpB,UAAM,YAAY,IAAI,qBAAqB;AAC3C,UAAM,OAAO,QAAQ,SAAS;AAC9B,WAAO,KAAK,mDAAmD;AAAA,EACjE,OAAO;AAEL,UAAM,MAAM,QAAQ;AACpB,QAAI,IAAI,KAAK,CAAC;AACd,QAAI,IAAI,QAAQ,KAAK,CAAC;AAEtB,UAAM,YAAY,IAAI,8BAA8B;AAAA,MAClD,oBAAoB,MAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC;AAAA,IAClE,CAAC;AACD,UAAM,OAAO,QAAQ,SAAS;AAE9B,QAAI,IAAI,QAAQ,CAAC,KAAK,QAAQ;AAC5B,gBAAU,cAAc,KAAK,KAAK,IAAI,IAAI,EAAE,MAAM,CAAC,QAAQ;AACzD,eAAO,MAAM,+BAA+B,GAAG;AAC/C,YAAI,CAAC,IAAI,aAAa;AACpB,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,2BAA2B,CAAC;AAAA,QAC5D;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,IAAI,KAAK,CAAC,MAAM,QAAQ;AAC1B,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,QACb,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAED,UAAM,OAAO,QAAQ,IAAI,aAAa;AACtC,UAAM,OAAO,OAAO,QAAQ,IAAI,aAAa,QAAQ,IAAI,IAAI,KAAK;AAGlE,WAAO,IAAI,QAAc,CAACA,WAAS,WAAW;AAC5C,YAAM,aAAa,IAAI,OAAO,MAAM,MAAM,MAAM;AAC9C,eAAO,KAAK,mCAAmC,IAAI,IAAI,IAAI,MAAM;AACjE,QAAAA,UAAQ;AAAA,MACV,CAAC;AAED,iBAAW,GAAG,SAAS,CAAC,UAAU;AAChC,eAAO,MAAM,sBAAsB,KAAK;AACxC,eAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,wBAAsB,MAAM;AAC5B,SAAO;AACT;AAKA,SAAS,sBAAsB,QAAyB;AACtD,QAAM,WAAW,YAAY;AAC3B,WAAO,KAAK,yBAAyB;AACrC,QAAI;AAEF,YAAM,sBAAsB;AAC5B,YAAM,OAAO,MAAM;AACnB,aAAO,KAAK,6BAA6B;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB,SAAS,OAAO;AACd,aAAO,MAAM,0BAA0B,KAAK;AAC5C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;AAKA,eAAe,OAAsB;AACnC,MAAI;AACF,UAAM,iBAAiB,QAAQ,IAAI,kBAAkB,SAAS,YAAY;AAC1E,UAAM,OAAyB,kBAAkB,SAAS,SAAS;AACnE,UAAM,YAAY,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,WAAO,MAAM,2BAA2B,KAAK;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGA,IAAM,aAAa,QAAQ,KAAK,CAAC,IAAIA,UAAQ,QAAQ,KAAK,CAAC,CAAC,IAAI;AAChE,IAAI,cAAc,YAAY,QAAQC,eAAc,UAAU,EAAE,MAAM;AACpE,OAAK;AACP;", - "names": ["binary", "dirname", "existsSync", "readFileSync", "resolve", "pathToFileURL", "z", "dirname", "isAbsolute", "mkdirSync", "existsSync", "join", "resolve", "mkdirSync", "isAbsolute", "resolve", "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", "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", "z", "mkdirSync", "join", "type", "setTimeout", "clearTimeout", "delimiter", "join", "setTimeout", "resolve", "delimiter", "resolve", "setTimeout", "join", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "str", "join", "mkdirSync", "type", "join", "resolve", "pathToFileURL", "z", "readFile", "pathToFileURL", "isAbsolute", "resolve", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "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 = '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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager\n initServerManager();\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 via the server manager.\n *\n * - Respects `searchPath` and `workspaceUri` on every call\n * - Restarts the server when configuration changes\n * - Uses session-isolated cache directories\n */\nasync function getLanguageServer(\n options: LanguageServerOptions = {},\n workspaceUri?: string,\n): Promise {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const languageServer = await manager.getLanguageServer(config);\n\n // Normalize workspace URI: resolve relative / bare directory paths to\n // file:// URIs against getUserWorkspaceDir() (respects CODEQL_MCP_WORKSPACE).\n let effectiveUri = workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const { getUserWorkspaceDir } = await import('../../utils/package-paths');\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(getUserWorkspaceDir(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await languageServer.initialize(effectiveUri);\n\n return languageServer;\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getLanguageServer(serverOptions, workspaceUri);\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\n}\n", "/**\n * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n } else if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 \u2014 CI environments may need longer for initial JVM warm-up\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 }, 30_000); // 30 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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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 }, 30_000); // 30s \u2014 CI environments need longer for JVM warm-up\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 if (this.server) {\n this.sendNotification('exit', {});\n }\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\n}\n", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n\n try {\n this.sendRaw(message);\n } catch (error) {\n // Clean up immediately \u2014 sendRaw() failed so no response will arrive.\n this.pendingRequests.delete(id);\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n this.stdoutBuffer = '';\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n const str = data.toString();\n\n // Look for NUL byte delimiter\n const nulIndex = str.indexOf('\\0');\n if (nulIndex === -1) {\n // No delimiter yet, accumulate\n this.stdoutBuffer += str;\n return;\n }\n\n // Found delimiter \u2014 command is complete\n this.stdoutBuffer += str.substring(0, nulIndex);\n const result = this.stdoutBuffer;\n this.stdoutBuffer = '';\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n // Handle any remaining data after the NUL byte\n const remainder = str.substring(nulIndex + 1);\n if (remainder.length > 0) {\n this.stdoutBuffer = remainder;\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { readFile } from 'fs/promises';\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\nimport { getUserWorkspaceDir } from '../../utils/package-paths';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /** Absolute path to the QL file. */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: params.searchPath ?? resolve(pkgRoot, 'ql'),\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n // Resolve workspace URI: convert relative paths to absolute file:// URIs.\n // Relative paths resolve against getUserWorkspaceDir() so that\n // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools.\n let effectiveUri = params.workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(getUserWorkspaceDir(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await server.initialize(effectiveUri);\n\n return server;\n}\n\n/**\n * Resolve the file path to an absolute path and file:// URI.\n */\nfunction prepareDocumentPosition(\n params: LSPToolParams,\n): { absPath: string; docUri: string } {\n // Resolve relative paths against getUserWorkspaceDir() so that\n // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools.\n const absPath = isAbsolute(params.filePath)\n ? params.filePath\n : resolve(getUserWorkspaceDir(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n return { absPath, docUri };\n}\n\n/**\n * Read file content and open the document in the language server.\n */\nasync function openDocumentForPosition(\n server: Awaited>,\n params: LSPToolParams,\n absPath: string,\n docUri: string,\n): Promise {\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = await readFile(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n return {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Path to the CodeQL (.ql/.qll) file. Relative paths are resolved against the user workspace directory (see CODEQL_MCP_WORKSPACE).'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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", "isAbsolute", "resolve", "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", "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", "z", "mkdirSync", "join", "type", "setTimeout", "clearTimeout", "delimiter", "join", "setTimeout", "resolve", "delimiter", "resolve", "setTimeout", "join", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "str", "join", "mkdirSync", "type", "join", "isAbsolute", "resolve", "pathToFileURL", "getUserWorkspaceDir", "z", "readFile", "isAbsolute", "resolve", "pathToFileURL", "resolve", "isAbsolute", "pathToFileURL", "readFile", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] } diff --git a/server/src/lib/language-server.ts b/server/src/lib/language-server.ts index 8f7c1927..ade7ff5b 100644 --- a/server/src/lib/language-server.ts +++ b/server/src/lib/language-server.ts @@ -267,13 +267,13 @@ export class CodeQLLanguageServer extends EventEmitter { this.pendingResponses.set(id, { resolve, reject }); this.sendMessage(message); - // Add timeout + // Add timeout — CI environments may need longer for initial JVM warm-up setTimeout(() => { if (this.pendingResponses.has(id)) { this.pendingResponses.delete(id); reject(new Error(`LSP request timeout for method: ${method}`)); } - }, 10000); // 10 second timeout + }, 30_000); // 30 second timeout }); } @@ -385,7 +385,7 @@ export class CodeQLLanguageServer extends EventEmitter { this.removeAllListeners('diagnostics'); reject(new Error('Timeout waiting for diagnostics')); } - }, 5000); + }, 30_000); // 30s — CI environments need longer for JVM warm-up // Listen for diagnostics const diagnosticsHandler = (params: PublishDiagnosticsParams) => { diff --git a/server/src/lib/query-server.ts b/server/src/lib/query-server.ts index 3f4a5587..52a4ef3d 100644 --- a/server/src/lib/query-server.ts +++ b/server/src/lib/query-server.ts @@ -114,7 +114,15 @@ export class CodeQLQueryServer extends EventEmitter { return new Promise((resolve, reject) => { this.pendingRequests.set(id, { reject, resolve }); - this.sendRaw(message); + + try { + this.sendRaw(message); + } catch (error) { + // Clean up immediately — sendRaw() failed so no response will arrive. + this.pendingRequests.delete(id); + reject(error instanceof Error ? error : new Error(String(error))); + return; + } const timer = setTimeout(() => { if (this.pendingRequests.has(id)) { diff --git a/server/src/tools/lsp/lsp-diagnostics.ts b/server/src/tools/lsp/lsp-diagnostics.ts index a1503203..4ffdc6ce 100644 --- a/server/src/tools/lsp/lsp-diagnostics.ts +++ b/server/src/tools/lsp/lsp-diagnostics.ts @@ -13,7 +13,7 @@ import { LanguageServerConfig } from '../../lib/server-config'; import { getServerManager } from '../../lib/server-manager'; import { logger } from '../../utils/logger'; import { getProjectTmpDir } from '../../utils/temp-dir'; -import { join, resolve } from 'path'; +import { join, isAbsolute, resolve } from 'path'; import { pathToFileURL } from 'url'; export interface LspDiagnosticsParams { @@ -108,7 +108,17 @@ async function getLanguageServer( const manager = getServerManager(); const languageServer = await manager.getLanguageServer(config); - const effectiveUri = workspaceUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href; + // Normalize workspace URI: resolve relative / bare directory paths to + // file:// URIs against getUserWorkspaceDir() (respects CODEQL_MCP_WORKSPACE). + let effectiveUri = workspaceUri; + if (effectiveUri && !effectiveUri.startsWith('file://')) { + const { getUserWorkspaceDir } = await import('../../utils/package-paths'); + const absWorkspace = isAbsolute(effectiveUri) + ? effectiveUri + : resolve(getUserWorkspaceDir(), effectiveUri); + effectiveUri = pathToFileURL(absWorkspace).href; + } + effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href; await languageServer.initialize(effectiveUri); return languageServer; diff --git a/server/src/tools/lsp/lsp-handlers.ts b/server/src/tools/lsp/lsp-handlers.ts index 0cd96e0b..b178622e 100644 --- a/server/src/tools/lsp/lsp-handlers.ts +++ b/server/src/tools/lsp/lsp-handlers.ts @@ -6,17 +6,19 @@ * opens the requested document, sends the LSP request, and returns the result. */ -import { LanguageServerConfig } from '../../lib/server-config'; -import { getServerManager } from '../../lib/server-manager'; +import { readFile } from 'fs/promises'; +import { isAbsolute, resolve } from 'path'; +import { pathToFileURL } from 'url'; + import { CompletionItem, LSPLocation, TextDocumentPositionParams, } from '../../lib/language-server'; +import { LanguageServerConfig } from '../../lib/server-config'; +import { getServerManager } from '../../lib/server-manager'; import { logger } from '../../utils/logger'; -import { readFile } from 'fs/promises'; -import { pathToFileURL } from 'url'; -import { isAbsolute, resolve } from 'path'; +import { getUserWorkspaceDir } from '../../utils/package-paths'; /** * Common parameters for LSP tool invocations. @@ -51,12 +53,14 @@ async function getInitializedServer(params: LSPToolParams) { const manager = getServerManager(); const server = await manager.getLanguageServer(config); - // Resolve workspace URI: convert relative paths to absolute file:// URIs + // Resolve workspace URI: convert relative paths to absolute file:// URIs. + // Relative paths resolve against getUserWorkspaceDir() so that + // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools. let effectiveUri = params.workspaceUri; if (effectiveUri && !effectiveUri.startsWith('file://')) { const absWorkspace = isAbsolute(effectiveUri) ? effectiveUri - : resolve(process.cwd(), effectiveUri); + : resolve(getUserWorkspaceDir(), effectiveUri); effectiveUri = pathToFileURL(absWorkspace).href; } effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href; @@ -71,8 +75,11 @@ async function getInitializedServer(params: LSPToolParams) { function prepareDocumentPosition( params: LSPToolParams, ): { absPath: string; docUri: string } { - // Resolve relative paths against CWD (supports integration test fixtures) - const absPath = isAbsolute(params.filePath) ? params.filePath : resolve(process.cwd(), params.filePath); + // Resolve relative paths against getUserWorkspaceDir() so that + // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools. + const absPath = isAbsolute(params.filePath) + ? params.filePath + : resolve(getUserWorkspaceDir(), params.filePath); const docUri = pathToFileURL(absPath).href; return { absPath, docUri }; diff --git a/server/src/tools/lsp/lsp-tools.ts b/server/src/tools/lsp/lsp-tools.ts index d6c1f21e..bd49d150 100644 --- a/server/src/tools/lsp/lsp-tools.ts +++ b/server/src/tools/lsp/lsp-tools.ts @@ -24,7 +24,7 @@ import { logger } from '../../utils/logger'; const lspParamsSchema = { character: z.number().int().min(0).describe('0-based character offset within the line'), file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'), - file_path: z.string().describe('Absolute path to the CodeQL (.ql/.qll) file'), + file_path: z.string().describe('Path to the CodeQL (.ql/.qll) file. Relative paths are resolved against the user workspace directory (see CODEQL_MCP_WORKSPACE).'), line: z.number().int().min(0).describe('0-based line number in the document'), search_path: z.string().optional().describe('Optional search path for CodeQL libraries'), workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'), diff --git a/server/test/src/tools/lsp/lsp-handlers.test.ts b/server/test/src/tools/lsp/lsp-handlers.test.ts index b674bd2d..7861a828 100644 --- a/server/test/src/tools/lsp/lsp-handlers.test.ts +++ b/server/test/src/tools/lsp/lsp-handlers.test.ts @@ -29,6 +29,7 @@ vi.mock('../../../../src/lib/server-manager', () => ({ vi.mock('../../../../src/utils/package-paths', () => ({ getPackageRootDir: vi.fn(() => '/mock/pkg'), + getUserWorkspaceDir: vi.fn(() => '/mock/workspace'), packageRootDir: '/mock/pkg', })); @@ -217,7 +218,7 @@ describe('lsp-handlers', () => { await lspCompletion(baseParams); - // readFileSync is mocked to return 'import ql\nselect 1' + // readFile from fs/promises is mocked to return 'import ql\nselect 1' expect(mockOpenDocument).toHaveBeenCalledWith( expect.any(String), 'import ql\nselect 1', From d375e4174b6ea5da569f43ca719ef7153efc6320 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Mon, 9 Feb 2026 05:23:17 -0700 Subject: [PATCH 5/7] Fixes for codeql_lsp_* tool integration tests --- .../basic_completion/README.md | 15 +- .../before/monitoring-state.json | 6 +- .../from_clause_completion/README.md | 14 +- .../before/monitoring-state.json | 5 +- .../basic_definition/README.md | 14 +- .../before/monitoring-state.json | 6 +- .../class_definition/README.md | 12 +- .../before/monitoring-state.json | 5 +- client/package.json | 2 +- client/src/lib/integration-test-runner.js | 9 +- .../lib/monitoring-integration-test-runner.js | 2 +- package.json | 2 +- server/dist/codeql-development-mcp-server.js | 12650 ++++++++-------- .../dist/codeql-development-mcp-server.js.map | 8 +- server/src/codeql-development-mcp-server.ts | 10 +- server/src/lib/cli-executor.ts | 103 +- server/src/lib/cli-server.ts | 39 +- server/src/lib/language-server.ts | 19 +- server/src/lib/server-manager.ts | 49 + server/src/tools/lsp/index.ts | 1 + server/src/tools/lsp/lsp-diagnostics.ts | 51 +- server/src/tools/lsp/lsp-handlers.ts | 32 +- server/src/tools/lsp/lsp-server-helper.ts | 73 + server/test/src/lib/cli-executor.test.ts | 44 + server/test/src/lib/cli-server.test.ts | 37 + server/test/src/lib/language-server.test.ts | 68 + server/test/src/lib/server-manager.test.ts | 44 + .../src/tools/lsp/lsp-diagnostics.test.ts | 1 + 28 files changed, 6925 insertions(+), 6396 deletions(-) create mode 100644 server/src/tools/lsp/lsp-server-helper.ts diff --git a/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/README.md b/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/README.md index 870f5455..d032f5e6 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/README.md +++ b/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/README.md @@ -2,16 +2,21 @@ ## PURPOSE -Tests that `codeql_lsp_completion` returns completion items when the cursor is -positioned on a type name in a `from` clause of a CodeQL query. +Tests that `codeql_lsp_completion` returns targeted completion items for a +member-access expression. The cursor is positioned after `f.getBa` so the +language server should return completions matching the prefix (e.g. +`getBaseName`). Uses `file_content` to provide inline query text, which +avoids disk I/O and produces a small, focused result set. ## INPUTS +- **file_content**: Inline QL with cursor after `f.getBa` - **file_path**: `server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql` -- **line**: 12 (on the type name in the `from` clause) -- **character**: 7 (cursor on the type name) +- **line**: 3 (`where f.getBa`) +- **character**: 13 (end of `getBa` prefix) +- **workspace_uri**: `server/ql/javascript/examples` ## EXPECTED OUTPUTS -- A list of completion items (may be empty if no workspace URI is set). +- A list of completion items matching the `getBa` prefix (e.g. `getBaseName`). - Monitoring state updated to record a successful `codeql_lsp_completion` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/before/monitoring-state.json index 7b65d02f..d4056e1d 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/before/monitoring-state.json +++ b/client/integration-tests/primitives/tools/codeql_lsp_completion/basic_completion/before/monitoring-state.json @@ -1,8 +1,10 @@ { "sessions": [], "parameters": { + "file_content": "import javascript\n\nfrom File f\nwhere f.getBa\nselect f", "file_path": "server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql", - "line": 12, - "character": 7 + "line": 3, + "character": 13, + "workspace_uri": "server/ql/javascript/examples" } } diff --git a/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/README.md b/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/README.md index 72886520..d8b3d26f 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/README.md +++ b/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/README.md @@ -2,16 +2,20 @@ ## PURPOSE -Tests that `codeql_lsp_completion` returns completion items when the cursor is -positioned inside a `from` clause after an `import` statement. +Tests that `codeql_lsp_completion` returns keyword completions when the cursor +is positioned after a partial keyword `wh` following a `from` clause. Uses +`file_content` to provide inline query text, producing a small set of +completions (e.g. `where`) rather than an exhaustive type list. ## INPUTS +- **file_content**: Inline QL with cursor after `wh` prefix - **file_path**: `server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql` -- **line**: 11 (inside the `from` clause) -- **character**: 5 (after keyword prefix) +- **line**: 3 (after `wh`) +- **character**: 2 (end of `wh` prefix) +- **workspace_uri**: `server/ql/javascript/examples` ## EXPECTED OUTPUTS -- A non-empty list of completion items with labels, documentation, and kind. +- A list of completion items matching the `wh` prefix (e.g. `where`). - Monitoring state updated to record a successful `codeql_lsp_completion` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/before/monitoring-state.json index 1f0e222d..4b5e3212 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/before/monitoring-state.json +++ b/client/integration-tests/primitives/tools/codeql_lsp_completion/from_clause_completion/before/monitoring-state.json @@ -1,9 +1,10 @@ { "sessions": [], "parameters": { + "file_content": "import javascript\n\nfrom File f\nwh", "file_path": "server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql", - "line": 11, - "character": 5, + "line": 3, + "character": 2, "workspace_uri": "server/ql/javascript/examples" } } diff --git a/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/README.md b/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/README.md index 17f9fe8a..7c67c32f 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/README.md +++ b/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/README.md @@ -2,16 +2,20 @@ ## PURPOSE -Tests that `codeql_lsp_definition` returns definition locations when the cursor -is on a variable name in a `where` clause of a CodeQL query. +Tests that `codeql_lsp_definition` resolves the definition of a type used in a +`from` clause. The cursor is on `File` (line 2, character 7) which should +resolve to the `File` class definition in the JavaScript CodeQL library. +Uses `file_content` to provide inline query text. ## INPUTS +- **file_content**: Inline QL with `from File f` clause - **file_path**: `server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql` -- **line**: 13 (on a variable reference in the `where` clause) -- **character**: 6 (cursor on the variable name) +- **line**: 2 (on the `File` type in `from File f`) +- **character**: 7 (cursor on `File`) +- **workspace_uri**: `server/ql/javascript/examples` ## EXPECTED OUTPUTS -- One or more definition locations, or an empty list if the symbol is not resolvable. +- One or more definition locations with URIs pointing to `.qll` library files. - Monitoring state updated to record a successful `codeql_lsp_definition` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/before/monitoring-state.json index 91ccb74a..03ad413c 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/before/monitoring-state.json +++ b/client/integration-tests/primitives/tools/codeql_lsp_definition/basic_definition/before/monitoring-state.json @@ -1,8 +1,10 @@ { "sessions": [], "parameters": { + "file_content": "import javascript\n\nfrom File f\nwhere f.getBaseName() = \"test.js\"\nselect f, \"found\"", "file_path": "server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql", - "line": 13, - "character": 6 + "line": 2, + "character": 7, + "workspace_uri": "server/ql/javascript/examples" } } diff --git a/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/README.md b/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/README.md index e7511899..3c9bd076 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/README.md +++ b/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/README.md @@ -2,14 +2,18 @@ ## PURPOSE -Tests that `codeql_lsp_definition` returns definition locations when the cursor -is on a class name used in a `from` clause. +Tests that `codeql_lsp_definition` resolves the definition of the `javascript` +library module from an `import` statement. The cursor is on `javascript` +(line 0, character 10) which should resolve to the library module definition. +Uses `file_content` to provide inline query text. ## INPUTS +- **file_content**: Inline QL with `import javascript` statement - **file_path**: `server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql` -- **line**: 12 (on the class name in the `from` clause) -- **character**: 5 (cursor on the class name) +- **line**: 0 (on the `import javascript` statement) +- **character**: 10 (cursor on `javascript`) +- **workspace_uri**: `server/ql/javascript/examples` ## EXPECTED OUTPUTS diff --git a/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/before/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/before/monitoring-state.json index 3244d196..ea6ec4cd 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/before/monitoring-state.json +++ b/client/integration-tests/primitives/tools/codeql_lsp_definition/class_definition/before/monitoring-state.json @@ -1,9 +1,10 @@ { "sessions": [], "parameters": { + "file_content": "import javascript\n\nfrom File f\nwhere f.getBaseName() = \"test.js\"\nselect f, \"found\"", "file_path": "server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.ql", - "line": 12, - "character": 5, + "line": 0, + "character": 10, "workspace_uri": "server/ql/javascript/examples" } } diff --git a/client/package.json b/client/package.json index 2d34cc34..37648c38 100644 --- a/client/package.json +++ b/client/package.json @@ -54,7 +54,7 @@ "test": "npm run test:integration", "test:coverage": "echo 'NOOP client test:coverage'", "test:integration": "scripts/run-integration-tests.sh --no-install-packs", - "test:integration:default": "ENABLE_MONITORING_TOOLS=false scripts/run-integration-tests.sh", + "test:integration:default": "ENABLE_MONITORING_TOOLS=false scripts/run-integration-tests.sh --no-install-packs", "test:integration:install-packs": "scripts/run-integration-tests.sh", "test:integration:monitoring": "ENABLE_MONITORING_TOOLS=true scripts/run-integration-tests.sh", "tidy": "npm run lint && npm run format" diff --git a/client/src/lib/integration-test-runner.js b/client/src/lib/integration-test-runner.js index bbcf6d1e..6166f30d 100644 --- a/client/src/lib/integration-test-runner.js +++ b/client/src/lib/integration-test-runner.js @@ -148,7 +148,12 @@ export class IntegrationTestRunner { codeql_bqrs_decode: 3, codeql_bqrs_info: 3, codeql_database_analyze: 3, - codeql_resolve_database: 3 + codeql_resolve_database: 3, + + // Priority 3.5: LSP diagnostics runs before other LSP tools to warm up + // the language server JVM. Subsequent codeql_lsp_* tools reuse the + // running server and avoid the cold-start penalty. + codeql_lsp_diagnostics: 3.5 // Priority 4: All other tools (default priority) // These tools don't have specific database dependencies @@ -896,7 +901,7 @@ export class IntegrationTestRunner { const staticPath = this.getStaticFilesPath(); if (toolName === "codeql_lsp_diagnostics") { - params.ql_code = "from DataFlow::Configuration cfg select cfg"; + params.ql_code = 'from UndefinedType x where x = "test" select x, "semantic error"'; // Skip workspace_uri for now as it's not needed for basic validation } else if (toolName === "codeql_bqrs_decode") { // Use static BQRS file diff --git a/client/src/lib/monitoring-integration-test-runner.js b/client/src/lib/monitoring-integration-test-runner.js index 96d5ea77..8634dbaf 100644 --- a/client/src/lib/monitoring-integration-test-runner.js +++ b/client/src/lib/monitoring-integration-test-runner.js @@ -330,7 +330,7 @@ export class MonitoringIntegrationTestRunner { const params = {}; if (toolName === "codeql_lsp_diagnostics") { - params.ql_code = "from DataFlow::Configuration cfg select cfg"; + params.ql_code = 'from UndefinedType x where x = "test" select x, "semantic error"'; } else if (toolName === "codeql_query_format") { // Look for .ql files in the before directory const beforeDir = path.join(testCaseDir, "before"); diff --git a/package.json b/package.json index 82811073..e46fd65e 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "start": "npm run start -w server", "test": "npm run test:server && npm run test:client", "test:all": "npm run test:server && npm run test:client", - "test:client": "npm run test -w client", + "test:client": "npm run test:integration:default -w client", "test:server": "npm run test -w server", "tidy": "npm run lint:fix && npm run format", "tidy:check": "npm run lint && npm run format:check", diff --git a/server/dist/codeql-development-mcp-server.js b/server/dist/codeql-development-mcp-server.js index 94795c92..0d00fa52 100755 --- a/server/dist/codeql-development-mcp-server.js +++ b/server/dist/codeql-development-mcp-server.js @@ -33,5413 +33,5698 @@ var init_logger = __esm({ } }); -// src/lib/cli-executor.ts -var cli_executor_exports = {}; -__export(cli_executor_exports, { - buildCodeQLArgs: () => buildCodeQLArgs, - buildQLTArgs: () => buildQLTArgs, - disableTestCommands: () => disableTestCommands, - enableTestCommands: () => enableTestCommands, - executeCLICommand: () => executeCLICommand, - executeCodeQLCommand: () => executeCodeQLCommand, - executeQLTCommand: () => executeQLTCommand, - getCommandHelp: () => getCommandHelp, - getResolvedCodeQLDir: () => getResolvedCodeQLDir, - resetResolvedCodeQLBinary: () => resetResolvedCodeQLBinary, - resolveCodeQLBinary: () => resolveCodeQLBinary, - sanitizeCLIArgument: () => sanitizeCLIArgument, - sanitizeCLIArguments: () => sanitizeCLIArguments, - validateCodeQLBinaryReachable: () => validateCodeQLBinaryReachable, - 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([ - "cat", - "echo", - "ls", - "sh", - "sleep" - ]); -} -function disableTestCommands() { - testCommands = null; -} -function isCommandAllowed(command) { - return ALLOWED_COMMANDS.has(command) || testCommands !== null && testCommands.has(command); +// src/lib/server-config.ts +import { createHash } from "crypto"; +function computeConfigHash(type2, config) { + const sortKeys = (_key, value) => { + if (value && typeof value === "object" && !Array.isArray(value)) { + const sorted = {}; + for (const k of Object.keys(value).sort()) { + sorted[k] = value[k]; + } + return sorted; + } + return value; + }; + const canonical = JSON.stringify({ config, type: type2 }, sortKeys); + return createHash("sha256").update(canonical).digest("hex"); } -function resolveCodeQLBinary() { - if (resolvedBinaryResult !== void 0) { - return resolvedBinaryResult; +function buildQueryServerArgs(config) { + const args = [ + "execute", + "query-server2" + ]; + if (config.searchPath) { + args.push(`--search-path=${config.searchPath}`); } - const envPath = process.env.CODEQL_PATH; - if (!envPath) { - resolvedCodeQLDir = null; - resolvedBinaryResult = "codeql"; - return resolvedBinaryResult; + if (config.commonCaches) { + args.push(`--common-caches=${config.commonCaches}`); } - 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 (config.logdir) { + args.push(`--logdir=${config.logdir}`); } - if (!isAbsolute(envPath)) { - throw new Error( - `CODEQL_PATH must be an absolute path, got: ${envPath}` - ); + if (config.threads !== void 0) { + args.push(`--threads=${config.threads}`); } - if (!existsSync(envPath)) { - throw new Error( - `CODEQL_PATH points to a file that does not exist: ${envPath}` - ); + if (config.timeout !== void 0) { + args.push(`--timeout=${config.timeout}`); } - resolvedCodeQLDir = dirname(envPath); - resolvedBinaryResult = "codeql"; - logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`); - 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 || ""); + if (config.maxDiskCache !== void 0) { + args.push(`--max-disk-cache=${config.maxDiskCache}`); } - 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}` - ); + if (config.evaluatorLog) { + args.push(`--evaluator-log=${config.evaluatorLog}`); + } + if (config.debug) { + args.push("--debug"); + args.push("--tuple-counting"); + } else if (config.tupleCounting) { + args.push("--tuple-counting"); } + return args; } -function sanitizeCLIArgument(arg) { - if (arg.includes("\0")) { - throw new Error(`CLI argument contains null byte: argument rejected for security`); +function buildCLIServerArgs(config) { + const args = [ + "execute", + "cli-server" + ]; + if (config.commonCaches) { + args.push(`--common-caches=${config.commonCaches}`); } - if (DANGEROUS_CONTROL_CHARS.test(arg)) { - throw new Error(`CLI argument contains control characters: argument rejected for security`); + if (config.logdir) { + args.push(`--logdir=${config.logdir}`); } - return arg; + return args; } -function sanitizeCLIArguments(args) { - return args.map(sanitizeCLIArgument); +var init_server_config = __esm({ + "src/lib/server-config.ts"() { + "use strict"; + } +}); + +// src/utils/package-paths.ts +var package_paths_exports = {}; +__export(package_paths_exports, { + getPackageRootDir: () => getPackageRootDir, + getPackageVersion: () => getPackageVersion, + getUserWorkspaceDir: () => getUserWorkspaceDir, + getWorkspaceRootDir: () => getWorkspaceRootDir, + packageRootDir: () => packageRootDir, + resolveToolQueryPackPath: () => resolveToolQueryPackPath, + workspaceRootDir: () => workspaceRootDir +}); +import { dirname, resolve } from "path"; +import { existsSync, readFileSync } from "fs"; +import { fileURLToPath } from "url"; +function isRunningFromSource(dir) { + const normalized = dir.replace(/\\/g, "/"); + return /\/src(\/[^/]+)?$/.test(normalized); } -function getSafeEnvironment(additionalEnv) { - const safeEnv = {}; - for (const key of SAFE_ENV_VARS) { - if (process.env[key] !== void 0) { - safeEnv[key] = process.env[key]; +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 (existsSync(parentPkgPath)) { + const parentPkg = JSON.parse(readFileSync(parentPkgPath, "utf8")); + if (parentPkg.workspaces) { + return parentDir; + } } + } catch { } - for (const [key, value] of Object.entries(process.env)) { - if (value !== void 0 && SAFE_ENV_PREFIXES.some((prefix) => key.startsWith(prefix))) { - safeEnv[key] = value; - } + return pkgRoot; +} +function resolveToolQueryPackPath(language, packageRoot) { + const pkgRoot = packageRoot ?? getPackageRootDir(); + return resolve(pkgRoot, "ql", language, "tools", "src"); +} +function getPackageVersion() { + if (_cachedVersion !== void 0) return _cachedVersion; + try { + const pkgPath = resolve(getPackageRootDir(), "package.json"); + const pkg = JSON.parse(readFileSync(pkgPath, "utf8")); + _cachedVersion = pkg.version ?? "0.0.0"; + } catch { + _cachedVersion = "0.0.0"; } - if (resolvedCodeQLDir && safeEnv.PATH) { - safeEnv.PATH = `${resolvedCodeQLDir}${delimiter}${safeEnv.PATH}`; - } else if (resolvedCodeQLDir) { - safeEnv.PATH = resolvedCodeQLDir; + return _cachedVersion; +} +function getUserWorkspaceDir() { + if (process.env.CODEQL_MCP_WORKSPACE) { + return process.env.CODEQL_MCP_WORKSPACE; } - if (additionalEnv) { - Object.assign(safeEnv, additionalEnv); + if (workspaceRootDir === packageRootDir) { + return process.cwd(); } - return safeEnv; + return workspaceRootDir; } -async function executeCLICommand(options) { - try { - const { command, args, cwd, timeout = 3e5, env } = options; - if (!isCommandAllowed(command)) { - throw new Error(`Command not allowed: ${command}. Only whitelisted commands can be executed.`); - } - if (command.includes(";") || command.includes("|") || command.includes("&") || command.includes("$") || command.includes("`") || command.includes("\n") || command.includes("\r")) { - throw new Error(`Invalid command: contains shell metacharacters: ${command}`); - } - const sanitizedArgs = sanitizeCLIArguments(args); - logger.info(`Executing CLI command: ${command}`, { args: sanitizedArgs, cwd, timeout }); - const execOptions = { - cwd, - timeout, - env: getSafeEnvironment(env) - }; - const { stdout, stderr } = await execFileAsync(command, sanitizedArgs, execOptions); - return { - stdout, - stderr, - success: true, - exitCode: 0 - }; - } catch (error) { - logger.error("CLI command execution failed:", error); - const err = error; - const errorMessage = err instanceof Error ? err.message : String(error); - const exitCode = err.code || 1; - return { - stdout: err.stdout || "", - stderr: err.stderr || errorMessage, - success: false, - error: errorMessage, - exitCode - }; +var __filename, __dirname, _cachedVersion, packageRootDir, workspaceRootDir; +var init_package_paths = __esm({ + "src/utils/package-paths.ts"() { + "use strict"; + __filename = fileURLToPath(import.meta.url); + __dirname = dirname(__filename); + packageRootDir = getPackageRootDir(); + workspaceRootDir = getWorkspaceRootDir(packageRootDir); } +}); + +// src/utils/temp-dir.ts +import { mkdirSync, mkdtempSync } from "fs"; +import { isAbsolute, join, resolve as resolve2 } from "path"; +function getProjectTmpBase() { + mkdirSync(PROJECT_TMP_BASE, { recursive: true }); + return PROJECT_TMP_BASE; } -function buildCodeQLArgs(subcommand, options) { - const args = [subcommand]; - const singleLetterParams = /* @__PURE__ */ new Set(["t", "o", "v", "q", "h", "J"]); - for (const [key, value] of Object.entries(options)) { - if (value === void 0 || value === null) { - continue; - } - const isSingleLetter = key.length === 1 && singleLetterParams.has(key); - if (typeof value === "boolean") { - if (value) { - args.push(isSingleLetter ? `-${key}` : `--${key}`); - } - } else if (Array.isArray(value)) { - for (const item of value) { - if (isSingleLetter) { - args.push(`-${key}=${String(item)}`); - } else { - args.push(`--${key}=${String(item)}`); - } - } - } else { - if (isSingleLetter) { - args.push(`-${key}=${String(value)}`); - } else { - args.push(`--${key}=${String(value)}`); - } - } - } - return args; -} -function buildQLTArgs(subcommand, options) { - const args = [subcommand]; - for (const [key, value] of Object.entries(options)) { - if (value === void 0 || value === null) { - continue; - } - if (typeof value === "boolean") { - if (value) { - args.push(`--${key}`); - } - } else if (Array.isArray(value)) { - for (const item of value) { - args.push(`--${key}`, String(item)); - } - } else { - args.push(`--${key}`, String(value)); - } - } - return args; -} -async function executeCodeQLCommand(subcommand, options, additionalArgs = [], cwd) { - const args = buildCodeQLArgs(subcommand, options); - args.push(...additionalArgs); - return executeCLICommand({ - command: "codeql", - args, - cwd - }); -} -async function executeQLTCommand(subcommand, options, additionalArgs = []) { - const args = buildQLTArgs(subcommand, options); - args.push(...additionalArgs); - return executeCLICommand({ - command: "qlt", - args - }); -} -async function getCommandHelp(command, subcommand) { - const args = subcommand ? [subcommand, "--help"] : ["--help"]; - const result = await executeCLICommand({ - command, - args - }); - return result.stdout || result.stderr || "No help available"; +function createProjectTempDir(prefix) { + const base = getProjectTmpBase(); + return mkdtempSync(join(base, prefix)); } -async function validateCommandExists(command) { - try { - const result = await executeCLICommand({ - command: "which", - args: [command] - }); - return result.success; - } catch { - return false; - } +function getProjectTmpDir(name) { + const dir = join(getProjectTmpBase(), name); + mkdirSync(dir, { recursive: true }); + return dir; } -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"() { +var PROJECT_TMP_BASE; +var init_temp_dir = __esm({ + "src/utils/temp-dir.ts"() { "use strict"; - init_logger(); - execFileAsync = promisify(execFile); - ALLOWED_COMMANDS = /* @__PURE__ */ new Set([ - "codeql", - "git", - "node", - "npm", - "qlt", - "which" - ]); - testCommands = null; - SAFE_ENV_VARS = [ - "HOME", - // User home directory - "LANG", - // Locale setting - "LC_ALL", - // Locale setting - "LC_CTYPE", - // Locale setting - "PATH", - // Required to find executables - "SHELL", - // User's shell (Unix) - "TEMP", - // Temporary directory (Windows) - "TERM", - // Terminal type (Unix) - "TMP", - // Temporary directory (Windows) - "TMPDIR", - // Temporary directory (Unix) - "USER", - // Current user (Unix) - "USERNAME" - // Current user (Windows) - ]; - SAFE_ENV_PREFIXES = [ - "CODEQL_", - // CodeQL-specific variables - "NODE_" - // Node.js-specific variables (for npm, etc.) - ]; - DANGEROUS_CONTROL_CHARS = /[\x01-\x08\x0B\x0C\x0E-\x1F]/; - resolvedCodeQLDir = null; + init_package_paths(); + PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR ? isAbsolute(process.env.CODEQL_MCP_TMP_DIR) ? process.env.CODEQL_MCP_TMP_DIR : resolve2(process.cwd(), process.env.CODEQL_MCP_TMP_DIR) : join(getPackageRootDir(), ".tmp"); } }); -// src/utils/package-paths.ts -var package_paths_exports = {}; -__export(package_paths_exports, { - getPackageRootDir: () => getPackageRootDir, - getPackageVersion: () => getPackageVersion, - getUserWorkspaceDir: () => getUserWorkspaceDir, - 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 /\/src(\/[^/]+)?$/.test(normalized); -} -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; - } +// src/utils/process-ready.ts +import { clearTimeout, setTimeout as setTimeout2 } from "timers"; +function waitForProcessReady(child, name, opts) { + const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS; + return new Promise((resolve12, reject) => { + let settled = false; + const cleanup = () => { + settled = true; + child.stderr?.removeListener("data", onStderr); + child.stdout?.removeListener("data", onStdout); + child.removeListener("error", onError); + child.removeListener("exit", onExit); + clearTimeout(timer); + }; + const onStderr = () => { + if (settled) return; + logger.debug(`${name}: ready (stderr output detected)`); + cleanup(); + resolve12(); + }; + const onStdout = () => { + if (settled) return; + logger.debug(`${name}: ready (stdout output detected)`); + cleanup(); + resolve12(); + }; + const onError = (error) => { + if (settled) return; + cleanup(); + reject(new Error(`${name} failed to start: ${error.message}`)); + }; + const onExit = (code) => { + if (settled) return; + cleanup(); + reject(new Error(`${name} exited before becoming ready (code: ${code})`)); + }; + const timer = setTimeout2(() => { + if (settled) return; + logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`); + cleanup(); + resolve12(); + }, timeoutMs); + child.stderr?.on("data", onStderr); + child.stdout?.on("data", onStdout); + child.on("error", onError); + child.on("exit", onExit); + if (child.killed || child.exitCode !== null) { + cleanup(); + reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`)); } - } catch { - } - return pkgRoot; -} -function resolveToolQueryPackPath(language, packageRoot) { - const pkgRoot = packageRoot ?? getPackageRootDir(); - return resolve(pkgRoot, "ql", language, "tools", "src"); -} -function getPackageVersion() { - if (_cachedVersion !== void 0) return _cachedVersion; - try { - const pkgPath = resolve(getPackageRootDir(), "package.json"); - const pkg = JSON.parse(readFileSync2(pkgPath, "utf8")); - _cachedVersion = pkg.version ?? "0.0.0"; - } catch { - _cachedVersion = "0.0.0"; - } - return _cachedVersion; -} -function getUserWorkspaceDir() { - if (process.env.CODEQL_MCP_WORKSPACE) { - return process.env.CODEQL_MCP_WORKSPACE; - } - if (workspaceRootDir === packageRootDir) { - return process.cwd(); - } - return workspaceRootDir; + }); } -var __filename, __dirname, _cachedVersion, packageRootDir, workspaceRootDir; -var init_package_paths = __esm({ - "src/utils/package-paths.ts"() { +var DEFAULT_READY_TIMEOUT_MS; +var init_process_ready = __esm({ + "src/utils/process-ready.ts"() { "use strict"; - __filename = fileURLToPath(import.meta.url); - __dirname = dirname3(__filename); - packageRootDir = getPackageRootDir(); - workspaceRootDir = getWorkspaceRootDir(packageRootDir); + init_logger(); + DEFAULT_READY_TIMEOUT_MS = 3e4; } }); -// 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"; -import express from "express"; -import cors from "cors"; -import dotenv from "dotenv"; -import { resolve as resolve11 } from "path"; -import { pathToFileURL as pathToFileURL4 } from "url"; - -// src/tools/codeql/bqrs-decode.ts -import { z as z2 } from "zod"; - -// src/lib/cli-tool-registry.ts -init_cli_executor(); -init_logger(); -import { z } from "zod"; - -// src/lib/query-results-evaluator.ts -init_cli_executor(); -init_logger(); -import { writeFileSync, readFileSync } from "fs"; -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", - "csv-decode": "CSV format decoder for query results", - "mermaid-graph": "Mermaid diagram generator for @kind graph queries (like PrintAST)" -}; -async function extractQueryMetadata(queryPath) { - try { - const queryContent = readFileSync(queryPath, "utf-8"); - const metadata = {}; - const kindMatch = queryContent.match(/@kind\s+([^\s]+)/); - if (kindMatch) metadata.kind = kindMatch[1]; - const nameMatch = queryContent.match(/@name\s+(.+)/); - if (nameMatch) metadata.name = nameMatch[1].trim(); - const descMatch = queryContent.match(/@description\s+(.+)/); - if (descMatch) metadata.description = descMatch[1].trim(); - const idMatch = queryContent.match(/@id\s+(.+)/); - if (idMatch) metadata.id = idMatch[1].trim(); - const tagsMatch = queryContent.match(/@tags\s+(.+)/); - if (tagsMatch) { - metadata.tags = tagsMatch[1].split(/\s+/).filter((t) => t.length > 0); - } - return metadata; - } catch (error) { - logger.error("Failed to extract query metadata:", error); - return {}; - } -} -async function evaluateWithJsonDecoder(bqrsPath, outputPath) { - try { - const result = await executeCodeQLCommand( - "bqrs decode", - { format: "json" }, - [bqrsPath] - ); - if (!result.success) { - return { - success: false, - error: `Failed to decode BQRS file: ${result.stderr || result.error}` - }; - } - const defaultOutputPath = outputPath || bqrsPath.replace(".bqrs", ".json"); - mkdirSync(dirname2(defaultOutputPath), { recursive: true }); - writeFileSync(defaultOutputPath, result.stdout); - return { - success: true, - outputPath: defaultOutputPath, - content: result.stdout - }; - } catch (error) { - return { - success: false, - error: `JSON evaluation failed: ${error}` - }; - } -} -async function evaluateWithCsvDecoder(bqrsPath, outputPath) { - try { - const result = await executeCodeQLCommand( - "bqrs decode", - { format: "csv" }, - [bqrsPath] - ); - if (!result.success) { - return { - success: false, - error: `Failed to decode BQRS file: ${result.stderr || result.error}` - }; - } - const defaultOutputPath = outputPath || bqrsPath.replace(".bqrs", ".csv"); - mkdirSync(dirname2(defaultOutputPath), { recursive: true }); - writeFileSync(defaultOutputPath, result.stdout); - return { - success: true, - outputPath: defaultOutputPath, - content: result.stdout - }; - } catch (error) { - return { - success: false, - error: `CSV evaluation failed: ${error}` - }; - } -} -async function evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath) { - try { - const metadata = await extractQueryMetadata(queryPath); - if (metadata.kind !== "graph") { - logger.error(`Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`); - return { - success: false, - error: `Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries` - }; - } - const jsonResult = await executeCodeQLCommand( - "bqrs decode", - { format: "json" }, - [bqrsPath] - ); - if (!jsonResult.success) { - return { - success: false, - error: `Failed to decode BQRS file: ${jsonResult.stderr || jsonResult.error}` - }; - } - let queryResults; - try { - queryResults = JSON.parse(jsonResult.stdout); - } catch (parseError) { - return { - success: false, - error: `Failed to parse query results JSON: ${parseError}` - }; - } - const mermaidContent = generateMermaidFromGraphResults(queryResults, metadata); - const defaultOutputPath = outputPath || bqrsPath.replace(".bqrs", ".md"); - mkdirSync(dirname2(defaultOutputPath), { recursive: true }); - writeFileSync(defaultOutputPath, mermaidContent); - return { - success: true, - outputPath: defaultOutputPath, - content: mermaidContent - }; - } catch (error) { - return { - success: false, - error: `Mermaid graph evaluation failed: ${error}` - }; - } -} -function generateMermaidFromGraphResults(queryResults, metadata) { - const queryName = sanitizeMarkdown(metadata.name || "CodeQL Query Results"); - const queryDesc = sanitizeMarkdown(metadata.description || "Graph visualization of CodeQL query results"); - let mermaidContent = `# ${queryName} - -${queryDesc} - -`; - if (!queryResults || typeof queryResults !== "object") { - mermaidContent += "```mermaid\ngraph TD\n A[No Results]\n```\n"; - return mermaidContent; - } - const tuples = queryResults.tuples || queryResults; - if (!Array.isArray(tuples) || tuples.length === 0) { - mermaidContent += "```mermaid\ngraph TD\n A[No Graph Data]\n```\n"; - return mermaidContent; - } - mermaidContent += "```mermaid\ngraph TD\n"; - const nodes = /* @__PURE__ */ new Set(); - const edges = /* @__PURE__ */ new Set(); - tuples.forEach((tuple, index) => { - if (Array.isArray(tuple) && tuple.length >= 2) { - const source = sanitizeNodeId(tuple[0]?.toString() || `node_${index}_0`); - const target = sanitizeNodeId(tuple[1]?.toString() || `node_${index}_1`); - const label = tuple[2]?.toString() || ""; - nodes.add(source); - nodes.add(target); - const edgeId = `${source}_${target}`; - if (!edges.has(edgeId)) { - if (label) { - mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target} -`; - } else { - mermaidContent += ` ${source} --> ${target} -`; +// src/lib/language-server.ts +import { spawn } from "child_process"; +import { EventEmitter } from "events"; +import { setTimeout as setTimeout3, clearTimeout as clearTimeout2 } from "timers"; +import { pathToFileURL } from "url"; +import { delimiter, join as join2 } from "path"; +var CodeQLLanguageServer; +var init_language_server = __esm({ + "src/lib/language-server.ts"() { + "use strict"; + init_logger(); + init_package_paths(); + init_temp_dir(); + init_cli_executor(); + init_process_ready(); + CodeQLLanguageServer = class extends EventEmitter { + constructor(_options = {}) { + super(); + this._options = _options; + } + server = null; + messageId = 1; + pendingResponses = /* @__PURE__ */ new Map(); + isInitialized = false; + currentWorkspaceUri; + messageBuffer = ""; + async start() { + if (this.server) { + throw new Error("Language server is already running"); + } + logger.info("Starting CodeQL Language Server..."); + const args = [ + "execute", + "language-server", + "--check-errors=ON_CHANGE" + ]; + if (this._options.searchPath) { + args.push(`--search-path=${this._options.searchPath}`); + } + if (this._options.logdir) { + args.push(`--logdir=${this._options.logdir}`); + } + if (this._options.loglevel) { + args.push(`--loglevel=${this._options.loglevel}`); + } + if (this._options.synchronous) { + args.push("--synchronous"); + } + if (this._options.verbosity) { + args.push(`--verbosity=${this._options.verbosity}`); + } + 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"], + env: spawnEnv + }); + this.server.stderr?.on("data", (data) => { + logger.debug("CodeQL LS stderr:", data.toString()); + }); + this.server.stdout?.on("data", (data) => { + this.handleStdout(data); + }); + this.server.on("error", (error) => { + logger.error("CodeQL Language Server error:", error); + this.emit("error", error); + }); + this.server.on("exit", (code) => { + logger.info("CodeQL Language Server exited with code:", code); + this.server = null; + this.isInitialized = false; + this.emit("exit", code); + }); + await waitForProcessReady(this.server, "CodeQL Language Server"); + } + handleStdout(data) { + this.messageBuffer += data.toString(); + let headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); + while (headerEnd !== -1) { + const header = this.messageBuffer.substring(0, headerEnd); + const contentLengthMatch = header.match(/Content-Length: (\d+)/); + if (contentLengthMatch) { + const contentLength = parseInt(contentLengthMatch[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + if (this.messageBuffer.length >= messageEnd) { + const messageContent = this.messageBuffer.substring(messageStart, messageEnd); + this.messageBuffer = this.messageBuffer.substring(messageEnd); + try { + const message = JSON.parse(messageContent); + this.handleMessage(message); + } catch (error) { + logger.error("Failed to parse LSP message:", error, messageContent); + } + headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); + } else { + break; + } + } else { + logger.error("Invalid LSP header:", header); + this.messageBuffer = ""; + break; + } } - edges.add(edgeId); } - } else if (typeof tuple === "object" && tuple !== null) { - const source = sanitizeNodeId(tuple.source?.toString() || tuple.from?.toString() || `node_${index}_src`); - const target = sanitizeNodeId(tuple.target?.toString() || tuple.to?.toString() || `node_${index}_tgt`); - const label = tuple.label?.toString() || tuple.relation?.toString() || ""; - nodes.add(source); - nodes.add(target); - const edgeId = `${source}_${target}`; - if (!edges.has(edgeId)) { - if (label) { - mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target} -`; - } else { - mermaidContent += ` ${source} --> ${target} -`; + handleMessage(message) { + logger.debug("Received LSP message:", message); + if (message.id !== void 0 && this.pendingResponses.has(Number(message.id))) { + const pending = this.pendingResponses.get(Number(message.id)); + this.pendingResponses.delete(Number(message.id)); + if (message.error) { + pending.reject(new Error(`LSP Error: ${message.error.message}`)); + } else { + pending.resolve(message.result); + } + return; + } + if (message.method === "textDocument/publishDiagnostics") { + this.emit("diagnostics", message.params); } - edges.add(edgeId); } - } - }); - if (edges.size === 0 && nodes.size > 0) { - const nodeArray = Array.from(nodes).slice(0, 10); - nodeArray.forEach((node, index) => { - if (index === 0) { - mermaidContent += ` ${node}[${sanitizeLabel(node)}] -`; - } else { - mermaidContent += ` ${nodeArray[0]} --> ${node} + sendMessage(message) { + if (!this.server?.stdin) { + throw new Error("Language server is not running"); + } + const messageStr = JSON.stringify(message); + const contentLength = Buffer.byteLength(messageStr, "utf8"); + const header = `Content-Length: ${contentLength}\r +\r `; + const fullMessage = header + messageStr; + logger.debug("Sending LSP message:", fullMessage); + this.server.stdin.write(fullMessage); + } + sendRequest(method, params) { + const id = this.messageId++; + const message = { + jsonrpc: "2.0", + id, + method, + params + }; + return new Promise((resolve12, reject) => { + const timer = setTimeout3(() => { + if (this.pendingResponses.has(id)) { + this.pendingResponses.delete(id); + reject(new Error(`LSP request timeout for method: ${method}`)); + } + }, 6e4); + this.pendingResponses.set(id, { + reject: (err) => { + clearTimeout2(timer); + reject(err); + }, + resolve: (val) => { + clearTimeout2(timer); + resolve12(val); + } + }); + this.sendMessage(message); + }); } - }); - } - mermaidContent += "```\n\n"; - mermaidContent += `## Query Statistics - -`; - mermaidContent += `- Total nodes: ${nodes.size} -`; - mermaidContent += `- Total edges: ${edges.size} -`; - mermaidContent += `- Total tuples processed: ${tuples.length} -`; - return mermaidContent; -} -function sanitizeNodeId(id) { - return id.replace(/[^a-zA-Z0-9_]/g, "_").replace(/^(\d)/, "n$1").substring(0, 50); -} -function sanitizeLabel(label) { - return label.replace(/[|"`<>\n\r\t]/g, "").replace(/\s+/g, " ").trim().substring(0, 30); -} -function sanitizeMarkdown(content) { - return content.replace(/[<>"`]/g, "").replace(/\n/g, " ").replace(/\s+/g, " ").trim().substring(0, 100); -} -async function evaluateQueryResults(bqrsPath, queryPath, evaluationFunction, outputPath) { - try { - const evalFunc = evaluationFunction || "json-decode"; - logger.info(`Evaluating query results with function: ${evalFunc}`); - switch (evalFunc) { - case "json-decode": - return await evaluateWithJsonDecoder(bqrsPath, outputPath); - case "csv-decode": - return await evaluateWithCsvDecoder(bqrsPath, outputPath); - case "mermaid-graph": - return await evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath); - default: - if (isAbsolute2(evalFunc)) { - return await evaluateWithCustomScript(bqrsPath, queryPath, evalFunc, outputPath); - } else { - return { - success: false, - error: `Unknown evaluation function: ${evalFunc}. Available built-in functions: ${Object.keys(BUILT_IN_EVALUATORS).join(", ")}` - }; + sendNotification(method, params) { + const message = { + jsonrpc: "2.0", + method, + params + }; + this.sendMessage(message); + } + /** + * Initialize the language server with an optional workspace URI. + * + * If the server is already initialized with a different workspace, a + * `workspace/didChangeWorkspaceFolders` notification is sent to update + * the workspace context instead of requiring a full restart. + */ + async initialize(workspaceUri) { + if (this.isInitialized) { + if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) { + await this.updateWorkspace(workspaceUri); + } + return; } - } - } catch (error) { - return { - success: false, - error: `Query evaluation failed: ${error}` - }; - } -} -async function evaluateWithCustomScript(_bqrsPath, _queryPath, _scriptPath, _outputPath) { - return { - success: false, - error: "Custom evaluation scripts are not yet implemented" - }; -} - -// src/lib/log-directory-manager.ts -import { mkdirSync as mkdirSync3, existsSync as existsSync3 } from "fs"; -import { join as join2, resolve as resolve3 } from "path"; -import { randomBytes } from "crypto"; - -// src/utils/temp-dir.ts -init_package_paths(); -import { mkdirSync as mkdirSync2, mkdtempSync } from "fs"; -import { isAbsolute as isAbsolute3, join, resolve as resolve2 } from "path"; -var PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR ? isAbsolute3(process.env.CODEQL_MCP_TMP_DIR) ? process.env.CODEQL_MCP_TMP_DIR : resolve2(process.cwd(), process.env.CODEQL_MCP_TMP_DIR) : join(getPackageRootDir(), ".tmp"); -function getProjectTmpBase() { - mkdirSync2(PROJECT_TMP_BASE, { recursive: true }); - return PROJECT_TMP_BASE; -} -function createProjectTempDir(prefix) { - const base = getProjectTmpBase(); - return mkdtempSync(join(base, prefix)); -} -function getProjectTmpDir(name) { - const dir = join(getProjectTmpBase(), name); - mkdirSync2(dir, { recursive: true }); - return dir; -} - -// src/lib/log-directory-manager.ts -function ensurePathWithinBase(baseDir, targetPath) { - const absBase = resolve3(baseDir); - const absTarget = resolve3(targetPath); - if (!absTarget.startsWith(absBase + "/") && absTarget !== absBase) { - throw new Error(`Provided log directory is outside the allowed base directory: ${absBase}`); - } - return absTarget; -} -function getOrCreateLogDirectory(logDir) { - const baseLogDir = process.env.CODEQL_QUERY_LOG_DIR || getProjectTmpDir("query-logs"); - if (logDir) { - const absLogDir = ensurePathWithinBase(baseLogDir, logDir); - if (!existsSync3(absLogDir)) { - mkdirSync3(absLogDir, { recursive: true }); - } - return absLogDir; - } - if (!existsSync3(baseLogDir)) { - mkdirSync3(baseLogDir, { recursive: true }); - } - const timestamp2 = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-"); - const uniqueId = randomBytes(4).toString("hex"); - const uniqueLogDir = join2(baseLogDir, `query-run-${timestamp2}-${uniqueId}`); - mkdirSync3(uniqueLogDir, { recursive: true }); - return uniqueLogDir; -} - -// src/lib/cli-tool-registry.ts -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 isAbsolute4, join as join3, resolve as resolve4 } from "path"; -var defaultCLIResultProcessor = (result, _params) => { - if (!result.success) { - return `Command failed (exit code ${result.exitCode || "unknown"}): -${result.error || result.stderr}`; - } - let output = ""; - if (result.stdout) { - output += result.stdout; - } - if (result.stderr) { - if (output) { - output += "\n\nWarnings/Info:\n"; - } - output += result.stderr; - } - if (!output) { - output = "Command executed successfully (no output)"; - } - return output; -}; -function registerCLITool(server, definition) { - const { - name, - description, - command, - subcommand, - inputSchema, - resultProcessor = defaultCLIResultProcessor - } = definition; - server.tool( - name, - description, - inputSchema, - async (params) => { - const tempDirsToCleanup = []; - try { - logger.info(`Executing CLI tool: ${name}`, { command, subcommand, params }); - const formatShouldBePassedToCLI = name === "codeql_bqrs_interpret" || name === "codeql_bqrs_decode" || name === "codeql_generate_query-help" || name === "codeql_database_analyze"; - const extractedParams = formatShouldBePassedToCLI ? { - _positional: params._positional || [], - files: params.files, - file: params.file, - dir: params.dir, - packDir: params.packDir, - tests: params.tests, - query: params.query, - queryName: params.queryName, - queryLanguage: params.queryLanguage, - queryPack: params.queryPack, - sourceFiles: params.sourceFiles, - sourceFunction: params.sourceFunction, - targetFunction: params.targetFunction, - interpretedOutput: params.interpretedOutput, - evaluationFunction: params.evaluationFunction, - evaluationOutput: params.evaluationOutput, - directory: params.directory, - logDir: params.logDir, - qlref: params.qlref - } : { - _positional: params._positional || [], - files: params.files, - file: params.file, - dir: params.dir, - packDir: params.packDir, - tests: params.tests, - query: params.query, - queryName: params.queryName, - queryLanguage: params.queryLanguage, - queryPack: params.queryPack, - sourceFiles: params.sourceFiles, - sourceFunction: params.sourceFunction, - targetFunction: params.targetFunction, - format: params.format, - interpretedOutput: params.interpretedOutput, - evaluationFunction: params.evaluationFunction, - evaluationOutput: params.evaluationOutput, - directory: params.directory, - logDir: params.logDir, - qlref: params.qlref + logger.info("Initializing CodeQL Language Server..."); + const initParams = { + processId: process.pid, + clientInfo: { + name: "codeql-development-mcp-server", + version: getPackageVersion() + }, + capabilities: { + textDocument: { + completion: { completionItem: { snippetSupport: false } }, + definition: {}, + publishDiagnostics: {}, + references: {}, + synchronization: { + didClose: true, + didChange: true, + didOpen: true + } + }, + workspace: { + workspaceFolders: true + } + } }; - const { - _positional = [], - files, - file, - dir, - packDir, - tests, - query, - queryName, - queryLanguage: _queryLanguage, - queryPack: _queryPack, - sourceFiles, - sourceFunction, - targetFunction, - format: _format, - interpretedOutput: _interpretedOutput, - evaluationFunction: _evaluationFunction, - evaluationOutput: _evaluationOutput, - directory, - logDir: customLogDir, - qlref - } = extractedParams; - const options = { ...params }; - Object.keys(extractedParams).forEach((key) => delete options[key]); - let positionalArgs = Array.isArray(_positional) ? _positional : [_positional]; - if (files && Array.isArray(files)) { - positionalArgs = [...positionalArgs, ...files]; + if (workspaceUri) { + initParams.workspaceFolders = [{ + uri: workspaceUri, + name: "codeql-workspace" + }]; } - if (file && name.startsWith("codeql_bqrs_")) { - positionalArgs = [...positionalArgs, file]; + await this.sendRequest("initialize", initParams); + this.sendNotification("initialized", {}); + this.currentWorkspaceUri = workspaceUri; + this.isInitialized = true; + logger.info("CodeQL Language Server initialized successfully"); + } + /** + * Update the workspace folders on a running, initialized server. + */ + async updateWorkspace(newUri) { + logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`); + const removed = this.currentWorkspaceUri ? [{ uri: this.currentWorkspaceUri, name: "codeql-workspace" }] : []; + this.sendNotification("workspace/didChangeWorkspaceFolders", { + event: { + added: [{ uri: newUri, name: "codeql-workspace" }], + removed + } + }); + this.currentWorkspaceUri = newUri; + } + /** + * Get the current workspace URI. + */ + getWorkspaceUri() { + return this.currentWorkspaceUri; + } + async evaluateQL(qlCode, uri) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); } - if (qlref && name === "codeql_resolve_qlref") { - positionalArgs = [...positionalArgs, qlref]; + const documentUri = uri || pathToFileURL(join2(getProjectTmpDir("lsp-eval"), "eval.ql")).href; + return new Promise((resolve12, reject) => { + let diagnosticsReceived = false; + const timeout = setTimeout3(() => { + if (!diagnosticsReceived) { + this.removeListener("diagnostics", diagnosticsHandler); + reject(new Error("Timeout waiting for diagnostics")); + } + }, 9e4); + const diagnosticsHandler = (params) => { + if (params.uri === documentUri) { + diagnosticsReceived = true; + clearTimeout2(timeout); + this.removeListener("diagnostics", diagnosticsHandler); + this.sendNotification("textDocument/didClose", { + textDocument: { uri: documentUri } + }); + resolve12(params.diagnostics); + } + }; + this.on("diagnostics", diagnosticsHandler); + this.sendNotification("textDocument/didOpen", { + textDocument: { + uri: documentUri, + languageId: "ql", + version: 1, + text: qlCode + } + }); + }); + } + // ---- LSP feature methods (issue #1) ---- + /** + * Get code completions at a position in a document. + */ + async getCompletions(params) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); } - if (options.database && name === "codeql_resolve_database") { - positionalArgs = [...positionalArgs, options.database]; - delete options.database; + if (!this.isRunning()) { + throw new Error("Language server process is not running"); } - if (options.database && name === "codeql_database_create") { - positionalArgs = [...positionalArgs, options.database]; - delete options.database; + const result = await this.sendRequest("textDocument/completion", params); + if (result && typeof result === "object" && "items" in result) { + return result.items; } - if (name === "codeql_database_analyze") { - if (options.database) { - positionalArgs = [...positionalArgs, options.database]; - delete options.database; - } - if (options.queries) { - positionalArgs = [...positionalArgs, options.queries]; - delete options.queries; - } + return result || []; + } + /** + * Find the definition(s) of a symbol at a position. + */ + async getDefinition(params) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); } - if (query && name === "codeql_generate_query-help") { - positionalArgs = [...positionalArgs, query]; + if (!this.isRunning()) { + throw new Error("Language server process is not running"); } - if (dir && name === "codeql_pack_ls") { - positionalArgs = [...positionalArgs, dir]; + const result = await this.sendRequest("textDocument/definition", params); + return this.normalizeLocations(result); + } + /** + * Find all references to a symbol at a position. + */ + async getReferences(params) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); } - switch (name) { - case "codeql_test_accept": - case "codeql_test_extract": - case "codeql_test_run": - case "codeql_resolve_tests": - if (tests && Array.isArray(tests)) { - const userDir = getUserWorkspaceDir(); - positionalArgs = [...positionalArgs, ...tests.map( - (t) => isAbsolute4(t) ? t : resolve4(userDir, t) - )]; + if (!this.isRunning()) { + throw new Error("Language server process is not running"); + } + const result = await this.sendRequest("textDocument/references", { + ...params, + context: params.context ?? { includeDeclaration: true } + }); + return this.normalizeLocations(result); + } + /** + * Open a text document in the language server. + * The document must be opened before requesting completions, definitions, etc. + */ + openDocument(uri, text, languageId = "ql", version = 1) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); + } + this.sendNotification("textDocument/didOpen", { + textDocument: { uri, languageId, version, text } + }); + } + /** + * Close a text document in the language server. + */ + closeDocument(uri) { + if (!this.isInitialized) { + throw new Error("Language server is not initialized"); + } + this.sendNotification("textDocument/didClose", { + textDocument: { uri } + }); + } + /** + * Normalize a definition/references/implementation result to Location[]. + * The LSP spec allows Location | Location[] | LocationLink[]. + */ + normalizeLocations(result) { + if (!result) return []; + if (Array.isArray(result)) { + return result.map((item) => { + if ("targetUri" in item) { + return { uri: item.targetUri, range: item.targetRange }; } - break; - case "codeql_query_run": { - if (options.database && typeof options.database === "string" && !isAbsolute4(options.database)) { - options.database = resolve4(getUserWorkspaceDir(), options.database); - logger.info(`Resolved database path to: ${options.database}`); + return item; + }); + } + if (typeof result === "object" && "uri" in result) { + return [result]; + } + return []; + } + async shutdown() { + if (!this.server) { + return; + } + logger.info("Shutting down CodeQL Language Server..."); + try { + await this.sendRequest("shutdown", {}); + if (this.server) { + this.sendNotification("exit", {}); + } + } catch (error) { + logger.warn("Error during graceful shutdown:", error); + } + await new Promise((resolve12) => { + const timer = setTimeout3(() => { + if (this.server) { + this.server.kill("SIGTERM"); } - const resolvedQuery = await resolveQueryPath(params, logger); - if (resolvedQuery) { - positionalArgs = [...positionalArgs, resolvedQuery]; - } else if (query) { - positionalArgs = [...positionalArgs, query]; + resolve12(); + }, 1e3); + if (this.server) { + this.server.once("exit", () => { + clearTimeout2(timer); + this.server = null; + resolve12(); + }); + } else { + clearTimeout2(timer); + resolve12(); + } + }); + this.isInitialized = false; + } + isRunning() { + return this.server !== null && !this.server.killed; + } + }; + } +}); + +// src/lib/query-server.ts +import { spawn as spawn2 } from "child_process"; +import { delimiter as delimiter2 } from "path"; +import { EventEmitter as EventEmitter2 } from "events"; +import { clearTimeout as clearTimeout3, setTimeout as setTimeout4 } from "timers"; +var CodeQLQueryServer; +var init_query_server = __esm({ + "src/lib/query-server.ts"() { + "use strict"; + init_server_config(); + init_cli_executor(); + init_logger(); + init_process_ready(); + CodeQLQueryServer = class extends EventEmitter2 { + messageBuffer = ""; + messageId = 1; + pendingRequests = /* @__PURE__ */ new Map(); + process = null; + config; + constructor(config) { + super(); + this.config = config; + } + /** + * Start the query-server2 process. + */ + async start() { + if (this.process) { + throw new Error("Query server is already running"); + } + logger.info("Starting CodeQL Query Server (query-server2)..."); + const args = buildQueryServerArgs(this.config); + const spawnEnv = { ...process.env }; + const codeqlDir = getResolvedCodeQLDir(); + if (codeqlDir && spawnEnv.PATH) { + spawnEnv.PATH = `${codeqlDir}${delimiter2}${spawnEnv.PATH}`; + } else if (codeqlDir) { + spawnEnv.PATH = codeqlDir; + } + this.process = spawn2("codeql", args, { + stdio: ["pipe", "pipe", "pipe"], + env: spawnEnv + }); + this.process.stderr?.on("data", (data) => { + logger.debug("QueryServer2 stderr:", data.toString()); + }); + this.process.stdout?.on("data", (data) => { + this.handleStdout(data); + }); + this.process.on("error", (error) => { + logger.error("Query server process error:", error); + this.emit("error", error); + }); + this.process.on("exit", (code) => { + logger.info(`Query server exited with code: ${code}`); + this.rejectAllPending(new Error(`Query server exited with code: ${code}`)); + this.process = null; + this.emit("exit", code); + }); + await waitForProcessReady(this.process, "CodeQL Query Server"); + logger.info("CodeQL Query Server started"); + } + /** + * Send a request to the query server and await the response. + * + * @param method - The JSON-RPC method name. + * @param params - The method parameters. + * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min). + * @returns The result from the server. + */ + sendRequest(method, params, timeoutMs = 3e5) { + const id = this.messageId++; + const message = { + id, + jsonrpc: "2.0", + method, + params + }; + return new Promise((resolve12, reject) => { + this.pendingRequests.set(id, { reject, resolve: resolve12 }); + try { + this.sendRaw(message); + } catch (error) { + this.pendingRequests.delete(id); + reject(error instanceof Error ? error : new Error(String(error))); + return; + } + const timer = setTimeout4(() => { + if (this.pendingRequests.has(id)) { + this.pendingRequests.delete(id); + reject(new Error(`Query server request timeout for method: ${method}`)); } - if (queryName === "PrintAST" && sourceFiles) { - const filePaths = sourceFiles.split(",").map((f) => f.trim()); - let tempDir; - let csvPath; - try { - tempDir = createProjectTempDir("codeql-external-"); - tempDirsToCleanup.push(tempDir); - csvPath = join3(tempDir, "selectedSourceFiles.csv"); - const csvContent = filePaths.join("\n") + "\n"; - writeFileSync2(csvPath, csvContent, "utf8"); - } catch (err) { - logger.error(`Failed to create external predicate CSV for PrintAST query at path ${csvPath || "[unknown]"}: ${err instanceof Error ? err.message : String(err)}`); - throw err; - } - const currentExternal = options.external || []; - const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal]; - externalArray.push(`selectedSourceFiles=${csvPath}`); - options.external = externalArray; - logger.info(`Created external predicate CSV at ${csvPath} for files: ${filePaths.join(", ")}`); + }, timeoutMs); + const originalResolve = resolve12; + const originalReject = reject; + const wrapped = { + reject: (err) => { + clearTimeout3(timer); + originalReject(err); + }, + resolve: (val) => { + clearTimeout3(timer); + originalResolve(val); } - if (queryName === "CallGraphFrom" && sourceFunction) { - const functionNames = sourceFunction.split(",").map((f) => f.trim()); - let tempDir; - let csvPath; - try { - tempDir = createProjectTempDir("codeql-external-"); - tempDirsToCleanup.push(tempDir); - csvPath = join3(tempDir, "sourceFunction.csv"); - const csvContent = functionNames.join("\n") + "\n"; - writeFileSync2(csvPath, csvContent, "utf8"); - } catch (err) { - logger.error(`Failed to create external predicate CSV for CallGraphFrom query at path ${csvPath || "[unknown]"}: ${err instanceof Error ? err.message : String(err)}`); - throw err; - } - const currentExternal = options.external || []; - const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal]; - externalArray.push(`sourceFunction=${csvPath}`); - options.external = externalArray; - logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(", ")}`); + }; + this.pendingRequests.set(id, wrapped); + }); + } + /** + * Gracefully shut down the query server. + */ + async shutdown() { + if (!this.process) { + return; + } + logger.info("Shutting down CodeQL Query Server..."); + try { + await this.sendRequest("shutdown", {}, 5e3); + } catch (error) { + logger.warn("Error during query server graceful shutdown:", error); + } + await new Promise((resolve12) => { + const timer = setTimeout4(() => { + if (this.process) { + this.process.kill("SIGTERM"); + this.process = null; } - if (queryName === "CallGraphTo" && targetFunction) { - const functionNames = targetFunction.split(",").map((f) => f.trim()); - let tempDir; - let csvPath; + resolve12(); + }, 2e3); + if (this.process) { + this.process.once("exit", () => { + clearTimeout3(timer); + this.process = null; + resolve12(); + }); + } else { + clearTimeout3(timer); + resolve12(); + } + }); + } + /** + * Whether the query server process is running. + */ + isRunning() { + return this.process !== null && !this.process.killed; + } + // ---- private helpers ---- + handleStdout(data) { + this.messageBuffer += data.toString(); + let headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); + while (headerEnd !== -1) { + const header = this.messageBuffer.substring(0, headerEnd); + const contentLengthMatch = header.match(/Content-Length: (\d+)/); + if (contentLengthMatch) { + const contentLength = parseInt(contentLengthMatch[1]); + const messageStart = headerEnd + 4; + const messageEnd = messageStart + contentLength; + if (this.messageBuffer.length >= messageEnd) { + const messageContent = this.messageBuffer.substring(messageStart, messageEnd); + this.messageBuffer = this.messageBuffer.substring(messageEnd); try { - tempDir = createProjectTempDir("codeql-external-"); - tempDirsToCleanup.push(tempDir); - csvPath = join3(tempDir, "targetFunction.csv"); - const csvContent = functionNames.join("\n") + "\n"; - writeFileSync2(csvPath, csvContent, "utf8"); - } catch (err) { - logger.error(`Failed to create external predicate CSV for CallGraphTo query at path ${csvPath || "[unknown]"}: ${err instanceof Error ? err.message : String(err)}`); - throw err; + const message = JSON.parse(messageContent); + this.handleMessage(message); + } catch (error) { + logger.error("Failed to parse query server message:", error); } - const currentExternal = options.external || []; - const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal]; - externalArray.push(`targetFunction=${csvPath}`); - options.external = externalArray; - logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(", ")}`); + headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); + } else { + break; } + } else { + logger.error("Invalid query server header:", header); + this.messageBuffer = ""; break; } - case "codeql_query_compile": - case "codeql_resolve_metadata": - if (query) { - positionalArgs = [...positionalArgs, query]; - } - break; - case "codeql_resolve_queries": - if (directory) { - positionalArgs = [...positionalArgs, directory]; - } - break; - default: - break; } - let queryLogDir; - if (name === "codeql_query_run" || name === "codeql_test_run") { - queryLogDir = getOrCreateLogDirectory(customLogDir); - logger.info(`Using log directory for ${name}: ${queryLogDir}`); - const timestampPath = join3(queryLogDir, "timestamp"); - writeFileSync2(timestampPath, Date.now().toString(), "utf8"); - options.logdir = queryLogDir; - if (!options.verbosity) { - options.verbosity = "progress+"; - } - if (name === "codeql_query_run") { - if (!options["evaluator-log"]) { - options["evaluator-log"] = join3(queryLogDir, "evaluator-log.jsonl"); - } - if (!options.output) { - options.output = join3(queryLogDir, "results.bqrs"); - } + } + handleMessage(message) { + logger.debug("QueryServer2 message:", message); + if (message.id !== void 0 && this.pendingRequests.has(Number(message.id))) { + const pending = this.pendingRequests.get(Number(message.id)); + this.pendingRequests.delete(Number(message.id)); + if (message.error) { + pending.reject(new Error(`Query server error: ${message.error.message}`)); + } else { + pending.resolve(message.result); } + return; } - let result; - if (command === "codeql") { - let cwd; - if ((name === "codeql_pack_install" || name === "codeql_pack_ls") && (dir || packDir)) { - const rawCwd = dir || packDir; - cwd = isAbsolute4(rawCwd) ? rawCwd : resolve4(getUserWorkspaceDir(), rawCwd); + if (message.method) { + this.emit("notification", { method: message.method, params: message.params }); + } + } + rejectAllPending(error) { + for (const [id, pending] of this.pendingRequests) { + pending.reject(error); + this.pendingRequests.delete(id); + } + } + sendRaw(message) { + if (!this.process?.stdin) { + throw new Error("Query server is not running"); + } + const body = JSON.stringify(message); + const contentLength = Buffer.byteLength(body, "utf8"); + const frame = `Content-Length: ${contentLength}\r +\r +${body}`; + this.process.stdin.write(frame); + } + }; + } +}); + +// src/lib/cli-server.ts +import { spawn as spawn3 } from "child_process"; +import { delimiter as delimiter3 } from "path"; +import { EventEmitter as EventEmitter3 } from "events"; +import { clearTimeout as clearTimeout4, setTimeout as setTimeout5 } from "timers"; +var CodeQLCLIServer; +var init_cli_server = __esm({ + "src/lib/cli-server.ts"() { + "use strict"; + init_server_config(); + init_cli_executor(); + init_logger(); + init_process_ready(); + CodeQLCLIServer = class extends EventEmitter3 { + commandInProgress = false; + commandQueue = []; + config; + currentReject = null; + currentResolve = null; + nullBuffer = Buffer.alloc(1); + process = null; + stdoutBuffer = ""; + constructor(config) { + super(); + this.config = config; + } + /** + * Start the cli-server process. + */ + async start() { + if (this.process) { + throw new Error("CLI server is already running"); + } + logger.info("Starting CodeQL CLI Server..."); + const args = buildCLIServerArgs(this.config); + const spawnEnv = { ...process.env }; + const codeqlDir = getResolvedCodeQLDir(); + if (codeqlDir && spawnEnv.PATH) { + spawnEnv.PATH = `${codeqlDir}${delimiter3}${spawnEnv.PATH}`; + } else if (codeqlDir) { + spawnEnv.PATH = codeqlDir; + } + this.process = spawn3("codeql", args, { + stdio: ["pipe", "pipe", "pipe"], + env: spawnEnv + }); + this.process.stdout?.on("data", (data) => { + this.handleStdout(data); + }); + this.process.stderr?.on("data", (data) => { + logger.debug("CLIServer stderr:", data.toString()); + }); + this.process.on("error", (error) => { + logger.error("CLI server process error:", error); + if (this.currentReject) { + this.currentReject(error); + this.currentReject = null; + this.currentResolve = null; } - const defaultExamplesPath = resolve4(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; + this.emit("error", error); + }); + this.process.on("exit", (code) => { + logger.info(`CLI server exited with code: ${code}`); + if (this.currentReject) { + this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`)); + this.currentReject = null; + this.currentResolve = null; } - if (name === "codeql_test_run") { - options["keep-databases"] = true; + this.process = null; + this.emit("exit", code); + }); + await waitForProcessReady(this.process, "CodeQL CLI Server"); + logger.info("CodeQL CLI Server started"); + } + /** + * Run a CodeQL CLI command through the persistent server. + * + * Commands are serialized and queued; only one command runs at a time. + * + * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`). + * @returns The stdout output from the command. + */ + runCommand(args) { + return new Promise((resolve12, reject) => { + const execute = () => { + this.executeCommand({ args, reject, resolve: resolve12 }); + }; + if (this.commandInProgress) { + this.commandQueue.push(execute); + } else { + execute(); } - result = await executeCodeQLCommand(subcommand, options, positionalArgs, cwd); - } else if (command === "qlt") { - result = await executeQLTCommand(subcommand, options, positionalArgs); - } else { - throw new Error(`Unsupported command: ${command}`); + }); + } + /** + * Gracefully shut down the CLI server. + */ + async shutdown() { + if (!this.process) { + return; } - if (name === "codeql_query_run" && result.success && queryLogDir) { - const bqrsPath = options.output; - const sarifPath = join3(queryLogDir, "results.sarif"); - if (existsSync4(bqrsPath)) { - try { - const sarifResult = await executeCodeQLCommand( - "bqrs interpret", - { format: "sarif-latest", output: sarifPath }, - [bqrsPath] - ); - if (sarifResult.success) { - logger.info(`Generated SARIF interpretation at ${sarifPath}`); - } - } catch (error) { - logger.warn(`Failed to generate SARIF interpretation: ${error}`); + logger.info("Shutting down CodeQL CLI Server..."); + try { + this.process.stdin?.write(JSON.stringify(["shutdown"]), "utf8"); + this.process.stdin?.write(this.nullBuffer); + } catch (error) { + logger.warn("Error during CLI server shutdown request:", error); + } + await new Promise((resolve12) => { + const timer = setTimeout5(() => { + if (this.process) { + this.process.kill("SIGTERM"); + this.process = null; } + resolve12(); + }, 2e3); + if (this.process) { + this.process.once("exit", () => { + clearTimeout4(timer); + this.process = null; + resolve12(); + }); + } else { + clearTimeout4(timer); + resolve12(); } - result = await processQueryRunResults(result, params, logger); + }); + this.commandInProgress = false; + this.commandQueue = []; + logger.info("CodeQL CLI Server stopped"); + } + /** + * Whether the CLI server process is running. + */ + isRunning() { + return this.process !== null && !this.process.killed; + } + // ---- private helpers ---- + executeCommand(cmd) { + if (!this.process?.stdin) { + cmd.reject(new Error("CLI server is not running")); + return; } - const processedResult = resultProcessor(result, params); - return { - content: [{ - type: "text", - text: processedResult - }], - isError: !result.success - }; - } catch (error) { - logger.error(`Error in CLI tool ${name}:`, error); - return { - content: [{ - type: "text", - text: `Failed to execute CLI tool: ${error instanceof Error ? error.message : String(error)}` - }], - isError: true - }; - } finally { - for (const tempDir of tempDirsToCleanup) { - try { - rmSync(tempDir, { recursive: true, force: true }); - logger.info(`Cleaned up temporary directory: ${tempDir}`); - } catch (cleanupError) { - logger.error(`Failed to clean up temporary directory ${tempDir}:`, cleanupError); + this.commandInProgress = true; + this.currentResolve = cmd.resolve; + this.currentReject = cmd.reject; + try { + this.process.stdin.write(JSON.stringify(cmd.args), "utf8"); + this.process.stdin.write(this.nullBuffer); + } catch (error) { + this.commandInProgress = false; + this.currentResolve = null; + this.currentReject = null; + cmd.reject(error instanceof Error ? error : new Error(String(error))); + this.runNext(); + } + } + handleStdout(data) { + this.stdoutBuffer += data.toString(); + let nulIndex = this.stdoutBuffer.indexOf("\0"); + while (nulIndex !== -1) { + const result = this.stdoutBuffer.substring(0, nulIndex); + this.stdoutBuffer = this.stdoutBuffer.substring(nulIndex + 1); + if (this.currentResolve) { + this.currentResolve(result); + this.currentResolve = null; + this.currentReject = null; } + this.commandInProgress = false; + this.runNext(); + nulIndex = this.stdoutBuffer.indexOf("\0"); } } - } - ); -} -var createCodeQLSchemas = { - database: () => z.string().describe("Path to the CodeQL database"), - query: () => z.string().describe("Path to the CodeQL query file (.ql)"), - output: () => z.string().optional().describe("Output file path"), - outputFormat: () => z.enum(["csv", "json", "bqrs", "sarif-latest", "sarifv2.1.0"]).optional().describe("Output format for results"), - language: () => z.string().optional().describe("Programming language"), - threads: () => z.number().optional().describe("Number of threads to use"), - ram: () => z.number().optional().describe("Amount of RAM to use (MB)"), - timeout: () => z.number().optional().describe("Timeout in seconds"), - verbose: () => z.boolean().optional().describe("Enable verbose output"), - additionalArgs: () => z.array(z.string()).optional().describe("Additional command-line arguments"), - positionalArgs: () => z.array(z.string()).optional().describe("Positional arguments").transform((val) => ({ _positional: val })) -}; -var createBQRSResultProcessor = () => (result, params) => { - if (!result.success) { - return defaultCLIResultProcessor(result, params); - } - let output = result.stdout; - if (params.output) { - output += ` - -Results saved to: ${params.output}`; + runNext() { + const next = this.commandQueue.shift(); + if (next) { + next(); + } + } + }; } - if (result.stderr) { - output += ` +}); -Additional information: -${result.stderr}`; +// src/lib/server-manager.ts +var server_manager_exports = {}; +__export(server_manager_exports, { + CodeQLServerManager: () => CodeQLServerManager, + getServerManager: () => getServerManager, + initServerManager: () => initServerManager, + resetServerManager: () => resetServerManager, + shutdownServerManager: () => shutdownServerManager +}); +import { mkdirSync as mkdirSync2 } from "fs"; +import { join as join3 } from "path"; +import { randomUUID } from "crypto"; +function initServerManager(options) { + if (!globalServerManager) { + globalServerManager = new CodeQLServerManager(options); } - return output; -}; -var createDatabaseResultProcessor = () => (result, params) => { - if (!result.success) { - return defaultCLIResultProcessor(result, params); + return globalServerManager; +} +function getServerManager() { + if (!globalServerManager) { + globalServerManager = new CodeQLServerManager(); } - let output = "Database creation completed successfully"; - if (params.database || params._positional) { - const dbPath = params.database || (Array.isArray(params._positional) ? params._positional[0] : params._positional); - output += ` - -Database location: ${dbPath}`; + return globalServerManager; +} +async function shutdownServerManager() { + if (globalServerManager) { + await globalServerManager.shutdownAll(); + globalServerManager = null; } - if (result.stdout) { - output += ` - -Output: -${result.stdout}`; +} +function resetServerManager() { + globalServerManager = null; +} +var CodeQLServerManager, globalServerManager; +var init_server_manager = __esm({ + "src/lib/server-manager.ts"() { + "use strict"; + init_server_config(); + init_language_server(); + init_query_server(); + init_cli_server(); + init_temp_dir(); + init_logger(); + CodeQLServerManager = class { + /** Keyed by `CodeQLServerType` — at most one per type at a time. */ + servers = /* @__PURE__ */ new Map(); + /** The session ID used for cache isolation. */ + sessionId; + /** Root directory for session-specific caches. */ + sessionCacheDir; + constructor(options) { + this.sessionId = options?.sessionId ?? randomUUID(); + this.sessionCacheDir = join3( + getProjectTmpDir("codeql-cache"), + this.sessionId + ); + for (const subdir of ["compilation-cache", "logs", "query-cache"]) { + mkdirSync2(join3(this.sessionCacheDir, subdir), { recursive: true }); + } + logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`); + } + // ---- Public API ---- + /** + * Get the current session ID. + */ + getSessionId() { + return this.sessionId; + } + /** + * Get the session-specific cache directory. + */ + getCacheDir() { + return this.sessionCacheDir; + } + /** + * Return the session-specific log directory. + */ + getLogDir() { + return join3(this.sessionCacheDir, "logs"); + } + /** + * Get or create a Language Server with the given configuration. + * + * If a language server is already running with the same config it is reused. + * If the config has changed the old server is shut down first. + */ + async getLanguageServer(config) { + const enriched = this.enrichConfig(config); + return this.getOrRestart("language", enriched, () => { + return new CodeQLLanguageServer({ + loglevel: enriched.loglevel, + logdir: enriched.logdir, + searchPath: enriched.searchPath, + synchronous: enriched.synchronous, + verbosity: enriched.verbosity + }); + }); + } + /** + * Get or create a Query Server with the given configuration. + */ + async getQueryServer(config) { + const enriched = this.enrichConfig(config); + return this.getOrRestart("query", enriched, () => { + return new CodeQLQueryServer(enriched); + }); + } + /** + * Get or create a CLI Server with the given configuration. + */ + async getCLIServer(config) { + const enriched = this.enrichConfig(config); + return this.getOrRestart("cli", enriched, () => { + return new CodeQLCLIServer(enriched); + }); + } + /** + * Shut down a specific server type. + */ + async shutdownServer(type2) { + const managed = this.servers.get(type2); + if (!managed) return; + logger.info(`Shutting down ${type2} server (session: ${managed.sessionId})`); + await this.stopServer(managed); + this.servers.delete(type2); + } + /** + * Shut down all managed servers. + */ + async shutdownAll() { + logger.info(`Shutting down all servers for session: ${this.sessionId}`); + const shutdownPromises = Array.from(this.servers.entries()).map( + async ([type2, managed]) => { + try { + await this.stopServer(managed); + } catch (error) { + logger.error(`Error shutting down ${type2} server:`, error); + } + } + ); + await Promise.all(shutdownPromises); + this.servers.clear(); + logger.info("All servers shut down"); + } + /** + * Check whether a server of the given type is currently running. + */ + isRunning(type2) { + const managed = this.servers.get(type2); + if (!managed) return false; + return managed.server.isRunning(); + } + /** + * Get status information for all managed servers. + */ + getStatus() { + const status = { + cli: null, + language: null, + query: null + }; + for (const [type2, managed] of this.servers) { + status[type2] = { + configHash: managed.configHash, + running: managed.server.isRunning(), + sessionId: managed.sessionId + }; + } + return status; + } + // ---- Private helpers ---- + /** + * Eagerly start the language server so the JVM is warm when the first + * LSP tool call arrives. Uses the default configuration that + * `lsp-handlers.ts` / `lsp-diagnostics.ts` would create on the first + * `getLanguageServer()` call. The server is stored in the managed-servers + * map and reused by subsequent tool invocations. + * + * This is fire-and-forget: errors are logged but do not prevent the MCP + * server from starting. + */ + async warmUpLanguageServer() { + try { + const { packageRootDir: packageRootDir2 } = await Promise.resolve().then(() => (init_package_paths(), package_paths_exports)); + const { resolve: resolve12 } = await import("path"); + const config = { + checkErrors: "ON_CHANGE", + loglevel: "WARN", + searchPath: resolve12(packageRootDir2, "ql") + }; + logger.info("Warming up language server (background JVM start)..."); + await this.getLanguageServer(config); + logger.info("Language server warm-up complete"); + } catch (error) { + logger.warn("Language server warm-up failed (will retry on first tool call):", error); + } + } + /** + * Eagerly start the CLI server so the JVM is warm when the first + * `executeCodeQLCommand()` call routes through it. + * + * The CLI server uses only session-scoped `commonCaches` and `logdir`, + * both injected by `enrichConfig()`. Passing an empty config is + * intentional — it matches what `executeCodeQLCommand()` will request. + * + * Fire-and-forget: errors are logged but do not block startup. + */ + async warmUpCLIServer() { + try { + logger.info("Warming up CLI server (background JVM start)..."); + await this.getCLIServer({}); + logger.info("CLI server warm-up complete"); + } catch (error) { + logger.warn("CLI server warm-up failed (will retry on first tool call):", error); + } + } + /** + * Enrich a config with session-specific defaults for commonCaches and logdir. + */ + enrichConfig(config) { + return { + ...config, + commonCaches: config.commonCaches ?? this.sessionCacheDir, + logdir: config.logdir ?? this.getLogDir() + }; + } + /** + * Get an existing server if its config matches, otherwise stop the old + * one and start a new server. + */ + async getOrRestart(type2, config, factory) { + const hash = computeConfigHash(type2, config); + const existing = this.servers.get(type2); + if (existing && existing.configHash === hash && existing.server.isRunning()) { + logger.debug(`Reusing existing ${type2} server (hash: ${hash.substring(0, 8)})`); + return existing.server; + } + if (existing) { + logger.info(`${type2} server config changed or dead, restarting...`); + await this.stopServer(existing); + this.servers.delete(type2); + } + const server = factory(); + await server.start(); + this.servers.set(type2, { + configHash: hash, + server, + sessionId: this.sessionId, + type: type2 + }); + logger.info(`${type2} server started (hash: ${hash.substring(0, 8)})`); + return server; + } + /** + * Stop a managed server, ignoring errors. + */ + async stopServer(managed) { + try { + await managed.server.shutdown(); + } catch (error) { + logger.warn(`Error stopping ${managed.type} server:`, error); + } + } + }; + globalServerManager = null; } - if (result.stderr) { - output += ` +}); -Additional information: -${result.stderr}`; +// src/lib/cli-executor.ts +var cli_executor_exports = {}; +__export(cli_executor_exports, { + buildCodeQLArgs: () => buildCodeQLArgs, + buildQLTArgs: () => buildQLTArgs, + disableTestCommands: () => disableTestCommands, + enableTestCommands: () => enableTestCommands, + executeCLICommand: () => executeCLICommand, + executeCodeQLCommand: () => executeCodeQLCommand, + executeQLTCommand: () => executeQLTCommand, + getCommandHelp: () => getCommandHelp, + getResolvedCodeQLDir: () => getResolvedCodeQLDir, + resetResolvedCodeQLBinary: () => resetResolvedCodeQLBinary, + resolveCodeQLBinary: () => resolveCodeQLBinary, + sanitizeCLIArgument: () => sanitizeCLIArgument, + sanitizeCLIArguments: () => sanitizeCLIArguments, + validateCodeQLBinaryReachable: () => validateCodeQLBinaryReachable, + validateCommandExists: () => validateCommandExists +}); +import { execFile } from "child_process"; +import { existsSync as existsSync2 } from "fs"; +import { basename, delimiter as delimiter4, dirname as dirname2, isAbsolute as isAbsolute2 } from "path"; +import { promisify } from "util"; +function enableTestCommands() { + testCommands = /* @__PURE__ */ new Set([ + "cat", + "echo", + "ls", + "sh", + "sleep" + ]); +} +function disableTestCommands() { + testCommands = null; +} +function isCommandAllowed(command) { + return ALLOWED_COMMANDS.has(command) || testCommands !== null && testCommands.has(command); +} +function resolveCodeQLBinary() { + if (resolvedBinaryResult !== void 0) { + return resolvedBinaryResult; } - return output; -}; -async function resolveQueryPath(params, logger2) { - const { queryName, queryLanguage, queryPack, query } = params; - if (queryName && query) { - logger2.error('Cannot use both "query" and "queryName" parameters simultaneously. Use either "query" for direct file path OR "queryName" + "queryLanguage" for tool queries.'); - throw new Error('Cannot use both "query" and "queryName" parameters simultaneously. Use either "query" for direct file path OR "queryName" + "queryLanguage" for tool queries.'); + const envPath = process.env.CODEQL_PATH; + if (!envPath) { + resolvedCodeQLDir = null; + resolvedBinaryResult = "codeql"; + return resolvedBinaryResult; } - if (!queryName) { - return query || null; + 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 (!queryLanguage) { - logger2.error("queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift"); - throw new Error("queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift"); + if (!isAbsolute2(envPath)) { + throw new Error( + `CODEQL_PATH must be an absolute path, got: ${envPath}` + ); + } + if (!existsSync2(envPath)) { + throw new Error( + `CODEQL_PATH points to a file that does not exist: ${envPath}` + ); + } + resolvedCodeQLDir = dirname2(envPath); + resolvedBinaryResult = "codeql"; + logger.info(`CodeQL CLI resolved via CODEQL_PATH: ${envPath} (dir: ${resolvedCodeQLDir})`); + 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 + delimiter4 + (env.PATH || ""); } try { - 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)); - const resolveResult = await executeCodeQLCommand2( - "resolve queries", - { format: "json" }, - [packPath] + 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}` ); - if (!resolveResult.success) { - logger2.error("Failed to resolve queries:", resolveResult.stderr || resolveResult.error); - throw new Error(`Failed to resolve queries: ${resolveResult.stderr || resolveResult.error}`); - } - let resolvedQueries; - try { - resolvedQueries = JSON.parse(resolveResult.stdout); - } catch (parseError) { - logger2.error("Failed to parse resolve queries output:", parseError); - throw new Error("Failed to parse resolve queries output"); + } +} +function sanitizeCLIArgument(arg) { + if (arg.includes("\0")) { + throw new Error(`CLI argument contains null byte: argument rejected for security`); + } + if (DANGEROUS_CONTROL_CHARS.test(arg)) { + throw new Error(`CLI argument contains control characters: argument rejected for security`); + } + return arg; +} +function sanitizeCLIArguments(args) { + return args.map(sanitizeCLIArgument); +} +function getSafeEnvironment(additionalEnv) { + const safeEnv = {}; + for (const key of SAFE_ENV_VARS) { + if (process.env[key] !== void 0) { + safeEnv[key] = process.env[key]; } - const matchingQuery = resolvedQueries.find((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) => basename2(q))); - throw new Error(`Query "${queryName}.ql" not found in pack "${packPath}"`); + } + for (const [key, value] of Object.entries(process.env)) { + if (value !== void 0 && SAFE_ENV_PREFIXES.some((prefix) => key.startsWith(prefix))) { + safeEnv[key] = value; } - logger2.info(`Resolved query "${queryName}" to: ${matchingQuery}`); - return matchingQuery; - } catch (error) { - logger2.error("Error resolving query path:", error); - throw error; } + if (resolvedCodeQLDir && safeEnv.PATH) { + safeEnv.PATH = `${resolvedCodeQLDir}${delimiter4}${safeEnv.PATH}`; + } else if (resolvedCodeQLDir) { + safeEnv.PATH = resolvedCodeQLDir; + } + if (additionalEnv) { + Object.assign(safeEnv, additionalEnv); + } + return safeEnv; } -async function interpretBQRSFile(bqrsPath, queryPath, format, outputPath, logger2) { +async function executeCLICommand(options) { try { - const metadata = await extractQueryMetadata(queryPath); - const missingFields = []; - if (!metadata.id) missingFields.push("id"); - if (!metadata.kind) missingFields.push("kind"); - if (missingFields.length > 0) { - return { - success: false, - exitCode: 1, - stdout: "", - stderr: "", - error: `Query metadata is incomplete. Missing required field(s): ${missingFields.join(", ")}. Ensure the query file contains @id and @kind metadata.` - }; + const { command, args, cwd, timeout = 3e5, env } = options; + if (!isCommandAllowed(command)) { + throw new Error(`Command not allowed: ${command}. Only whitelisted commands can be executed.`); } - const sanitizedKind = (metadata.kind || "").replace(/[^a-zA-Z0-9_-]/g, ""); - const sanitizedId = (metadata.id || "").replace(/[^a-zA-Z0-9_/:-]/g, ""); - const graphFormats = ["graphtext", "dgml", "dot"]; - if (graphFormats.includes(format) && metadata.kind !== "graph") { - return { - success: false, - exitCode: 1, - stdout: "", - stderr: "", - error: `Format '${format}' is only compatible with @kind graph queries, but this query has @kind ${metadata.kind}` - }; + if (command.includes(";") || command.includes("|") || command.includes("&") || command.includes("$") || command.includes("`") || command.includes("\n") || command.includes("\r")) { + throw new Error(`Invalid command: contains shell metacharacters: ${command}`); } - mkdirSync4(dirname4(outputPath), { recursive: true }); - const params = { - format, - output: outputPath, - t: [`kind=${sanitizedKind}`, `id=${sanitizedId}`] + const sanitizedArgs = sanitizeCLIArguments(args); + logger.info(`Executing CLI command: ${command}`, { args: sanitizedArgs, cwd, timeout }); + const execOptions = { + cwd, + timeout, + env: getSafeEnvironment(env) + }; + const { stdout, stderr } = await execFileAsync(command, sanitizedArgs, execOptions); + return { + stdout, + stderr, + success: true, + exitCode: 0 }; - logger2.info(`Interpreting BQRS file ${bqrsPath} with format ${format} to ${outputPath}`); - const result = await executeCodeQLCommand( - "bqrs interpret", - params, - [bqrsPath] - ); - return result; } catch (error) { + logger.error("CLI command execution failed:", error); + const err = error; + const errorMessage = err instanceof Error ? err.message : String(error); + const exitCode = err.code || 1; return { + stdout: err.stdout || "", + stderr: err.stderr || errorMessage, success: false, - exitCode: 1, - stdout: "", - stderr: "", - error: `Failed to interpret BQRS file: ${error}` + error: errorMessage, + exitCode }; } } -function getDefaultExtension(format) { - switch (format) { - case "sarif-latest": - case "sarifv2.1.0": - return ".sarif"; - case "csv": - return ".csv"; - case "graphtext": - return ".txt"; - case "dgml": - return ".dgml"; - case "dot": - return ".dot"; - default: - return ".txt"; - } -} -async function processQueryRunResults(result, params, logger2) { - try { - const { format, interpretedOutput, evaluationFunction, evaluationOutput, output, query, queryName, queryLanguage } = params; - if (!format && !evaluationFunction) { - return result; - } - if (!output) { - return result; +function buildCodeQLArgs(subcommand, options) { + const args = [subcommand]; + const singleLetterParams = /* @__PURE__ */ new Set(["t", "o", "v", "q", "h", "J"]); + for (const [key, value] of Object.entries(options)) { + if (value === void 0 || value === null) { + continue; } - const bqrsPath = output; - let queryPath = null; - if (query) { - queryPath = query; - } else if (queryName && queryLanguage) { - queryPath = await resolveQueryPath(params, logger2); + const isSingleLetter = key.length === 1 && singleLetterParams.has(key); + if (typeof value === "boolean") { + if (value) { + args.push(isSingleLetter ? `-${key}` : `--${key}`); + } + } else if (Array.isArray(value)) { + for (const item of value) { + if (isSingleLetter) { + args.push(`-${key}=${String(item)}`); + } else { + args.push(`--${key}=${String(item)}`); + } + } + } else { + if (isSingleLetter) { + args.push(`-${key}=${String(value)}`); + } else { + args.push(`--${key}=${String(value)}`); + } } - if (!queryPath) { - logger2.error("Cannot determine query path for interpretation/evaluation"); - return { - ...result, - stdout: result.stdout + "\n\nWarning: Query interpretation skipped - could not determine query path" - }; + } + return args; +} +function buildQLTArgs(subcommand, options) { + const args = [subcommand]; + for (const [key, value] of Object.entries(options)) { + if (value === void 0 || value === null) { + continue; } - if (format) { - const outputFormat = format; - let outputFilePath = interpretedOutput; - if (!outputFilePath) { - const ext = getDefaultExtension(outputFormat); - outputFilePath = bqrsPath.replace(".bqrs", ext); + if (typeof value === "boolean") { + if (value) { + args.push(`--${key}`); } - logger2.info(`Interpreting query results from ${bqrsPath} with format: ${outputFormat}`); - const interpretResult = await interpretBQRSFile( - bqrsPath, - queryPath, - outputFormat, - outputFilePath, - logger2 - ); - if (interpretResult.success) { - let enhancedOutput = result.stdout; - enhancedOutput += ` - -Query results interpreted successfully with format: ${outputFormat}`; - enhancedOutput += ` -Interpreted output saved to: ${outputFilePath}`; - return { - ...result, - stdout: enhancedOutput - }; - } else { - logger2.error("Query interpretation failed:", interpretResult.error); - return { - ...result, - stdout: result.stdout + ` - -Warning: Query interpretation failed - ${interpretResult.error || interpretResult.stderr}` - }; + } else if (Array.isArray(value)) { + for (const item of value) { + args.push(`--${key}`, String(item)); } + } else { + args.push(`--${key}`, String(value)); } - if (evaluationFunction) { - logger2.info(`Using deprecated evaluationFunction parameter. Consider using format parameter instead.`); - logger2.info(`Evaluating query results from ${bqrsPath} using function: ${evaluationFunction}`); - const evaluationResult = await evaluateQueryResults( - bqrsPath, - queryPath, - evaluationFunction, - evaluationOutput - ); - if (evaluationResult.success) { - let enhancedOutput = result.stdout; - if (evaluationResult.outputPath) { - enhancedOutput += ` - -Query evaluation completed successfully.`; - enhancedOutput += ` -Evaluation output saved to: ${evaluationResult.outputPath}`; - } - if (evaluationResult.content) { - enhancedOutput += ` - -=== Query Results Evaluation === -`; - enhancedOutput += evaluationResult.content; - } + } + return args; +} +async function executeCodeQLCommand(subcommand, options, additionalArgs = [], cwd) { + const args = buildCodeQLArgs(subcommand, options); + args.push(...additionalArgs); + const canUseCLIServer = !FRESH_PROCESS_SUBCOMMANDS.has(subcommand) && !cwd; + if (canUseCLIServer) { + try { + const { getServerManager: getServerManager2 } = await Promise.resolve().then(() => (init_server_manager(), server_manager_exports)); + const manager = getServerManager2(); + if (manager.isRunning("cli")) { + const cliServer = await manager.getCLIServer({}); + const sanitizedArgs = sanitizeCLIArguments(args); + logger.info(`Executing CodeQL command via cli-server: ${subcommand}`, { args: sanitizedArgs }); + const stdout = await cliServer.runCommand(sanitizedArgs); return { - ...result, - stdout: enhancedOutput + stdout, + stderr: "", + success: true, + exitCode: 0 }; } else { - logger2.error("Query evaluation failed:", evaluationResult.error); + logger.debug(`cli-server not yet running for "${subcommand}", using fresh process`); + } + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + if (message.includes("CLI server is not running") || message.includes("CLI server exited") || message.includes("failed to start")) { + logger.warn(`cli-server unavailable for "${subcommand}", falling back to fresh process: ${message}`); + } else { + logger.error(`cli-server command failed for "${subcommand}": ${message}`); return { - ...result, - stdout: result.stdout + ` - -Warning: Query evaluation failed - ${evaluationResult.error}` + stdout: "", + stderr: message, + success: false, + error: message, + exitCode: 1 }; } } - return result; - } catch (error) { - logger2.error("Error in query results processing:", error); - return { - ...result, - stdout: result.stdout + ` - -Warning: Query processing error - ${error}` - }; } + return executeCLICommand({ + command: "codeql", + args, + cwd + }); } +async function executeQLTCommand(subcommand, options, additionalArgs = []) { + const args = buildQLTArgs(subcommand, options); + args.push(...additionalArgs); + return executeCLICommand({ + command: "qlt", + args + }); +} +async function getCommandHelp(command, subcommand) { + const args = subcommand ? [subcommand, "--help"] : ["--help"]; + const result = await executeCLICommand({ + command, + args + }); + return result.stdout || result.stderr || "No help available"; +} +async function validateCommandExists(command) { + try { + const result = await executeCLICommand({ + command: "which", + args: [command] + }); + return result.success; + } catch { + return false; + } +} +var execFileAsync, ALLOWED_COMMANDS, testCommands, SAFE_ENV_VARS, SAFE_ENV_PREFIXES, DANGEROUS_CONTROL_CHARS, resolvedCodeQLDir, resolvedBinaryResult, FRESH_PROCESS_SUBCOMMANDS; +var init_cli_executor = __esm({ + "src/lib/cli-executor.ts"() { + "use strict"; + init_logger(); + execFileAsync = promisify(execFile); + ALLOWED_COMMANDS = /* @__PURE__ */ new Set([ + "codeql", + "git", + "node", + "npm", + "qlt", + "which" + ]); + testCommands = null; + SAFE_ENV_VARS = [ + "HOME", + // User home directory + "LANG", + // Locale setting + "LC_ALL", + // Locale setting + "LC_CTYPE", + // Locale setting + "PATH", + // Required to find executables + "SHELL", + // User's shell (Unix) + "TEMP", + // Temporary directory (Windows) + "TERM", + // Terminal type (Unix) + "TMP", + // Temporary directory (Windows) + "TMPDIR", + // Temporary directory (Unix) + "USER", + // Current user (Unix) + "USERNAME" + // Current user (Windows) + ]; + SAFE_ENV_PREFIXES = [ + "CODEQL_", + // CodeQL-specific variables + "NODE_" + // Node.js-specific variables (for npm, etc.) + ]; + DANGEROUS_CONTROL_CHARS = /[\x01-\x08\x0B\x0C\x0E-\x1F]/; + resolvedCodeQLDir = null; + FRESH_PROCESS_SUBCOMMANDS = /* @__PURE__ */ new Set([ + "database analyze", + "database create", + "test extract", + "test run" + ]); + } +}); -// src/tools/codeql/bqrs-decode.ts -var codeqlBqrsDecodeTool = { - name: "codeql_bqrs_decode", - description: "Decode BQRS result files to human-readable formats", - command: "codeql", - subcommand: "bqrs decode", - inputSchema: { - files: z2.array(z2.string()).describe("BQRS file(s) to decode"), - output: createCodeQLSchemas.output(), - format: z2.enum(["csv", "json"]).optional().describe("Output format"), - "max-paths": z2.number().optional().describe("Maximum number of paths to output"), - "start-at": z2.number().optional().describe("Start output at result number"), - "max-results": z2.number().optional().describe("Maximum number of results"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql bqrs decode --format=csv --output=results.csv results.bqrs", - "codeql bqrs decode --format=json --max-results=100 results.bqrs" - ], - resultProcessor: createBQRSResultProcessor() -}; - -// src/tools/codeql/bqrs-info.ts -import { z as z3 } from "zod"; -var codeqlBqrsInfoTool = { - name: "codeql_bqrs_info", - description: "Get metadata and information about BQRS result files", - command: "codeql", - subcommand: "bqrs info", - inputSchema: { - files: z3.array(z3.string()).describe("BQRS file(s) to examine"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql bqrs info results.bqrs", - "codeql bqrs info --verbose results.bqrs" - ], - resultProcessor: createBQRSResultProcessor() -}; - -// src/tools/codeql/bqrs-interpret.ts -import { z as z4 } from "zod"; -var codeqlBqrsInterpretTool = { - name: "codeql_bqrs_interpret", - description: "Interpret BQRS result files according to query metadata and generate output in specified formats (CSV, SARIF, graph formats)", - command: "codeql", - subcommand: "bqrs interpret", - inputSchema: { - file: z4.string().describe("The BQRS file to interpret"), - format: z4.enum(["csv", "sarif-latest", "sarifv2.1.0", "graphtext", "dgml", "dot"]).describe("Output format: csv (comma-separated), sarif-latest/sarifv2.1.0 (SARIF), graphtext/dgml/dot (graph formats, only for @kind graph queries)"), - output: createCodeQLSchemas.output(), - t: z4.array(z4.string()).describe('Query metadata key=value pairs. At least "kind" and "id" must be specified (e.g., ["kind=graph", "id=js/print-ast"])'), - "max-paths": z4.number().optional().describe("Maximum number of paths to produce for each alert with paths (default: 4)"), - "sarif-add-file-contents": z4.boolean().optional().describe("[SARIF only] Include full file contents for all files referenced in results"), - "sarif-add-snippets": z4.boolean().optional().describe("[SARIF only] Include code snippets for each location with context"), - "sarif-group-rules-by-pack": z4.boolean().optional().describe("[SARIF only] Place rule objects under their QL pack in tool.extensions property"), - "sarif-multicause-markdown": z4.boolean().optional().describe("[SARIF only] Include multi-cause alerts as Markdown-formatted lists"), - "sarif-category": z4.string().optional().describe("[SARIF only] Category for this analysis (distinguishes multiple analyses on same code)"), - "csv-location-format": z4.enum(["uri", "line-column", "offset-length"]).optional().describe("[CSV only] Format for locations in CSV output (default: line-column)"), - "dot-location-url-format": z4.string().optional().describe("[DOT only] Format string for file location URLs (placeholders: {path}, {start:line}, {start:column}, {end:line}, {end:column}, {offset}, {length})"), - threads: z4.number().optional().describe("Number of threads for computing paths (0 = one per core, -N = leave N cores unused)"), - "column-kind": z4.enum(["utf8", "utf16", "utf32", "bytes"]).optional().describe("[SARIF only] Column kind for interpreting location columns"), - "unicode-new-lines": z4.boolean().optional().describe("[SARIF only] Whether unicode newlines (U+2028, U+2029) are considered as newlines"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql bqrs interpret --format=sarif-latest --output=results.sarif -t kind=problem -t id=js/sql-injection results.bqrs", - "codeql bqrs interpret --format=graphtext --output=ast.txt -t kind=graph -t id=js/print-ast results.bqrs", - "codeql bqrs interpret --format=csv --csv-location-format=line-column --output=results.csv -t kind=problem -t id=js/xss results.bqrs", - "codeql bqrs interpret --format=dot --output=graph.dot -t kind=graph -t id=java/call-graph results.bqrs", - "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" - ], - resultProcessor: createBQRSResultProcessor() -}; +// 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"; +import express from "express"; +import cors from "cors"; +import dotenv from "dotenv"; +import { resolve as resolve11 } from "path"; +import { pathToFileURL as pathToFileURL5 } from "url"; -// src/tools/codeql/database-analyze.ts -import { z as z5 } from "zod"; -var codeqlDatabaseAnalyzeTool = { - name: "codeql_database_analyze", - description: "Run queries or query suites against CodeQL databases", - command: "codeql", - subcommand: "database analyze", - inputSchema: { - database: z5.string().describe("Path to the CodeQL database"), - queries: z5.string().describe("Queries or query suite to run"), - output: z5.string().optional().describe("Output file path"), - format: z5.enum(["csv", "json", "sarif-latest", "sarifv2.1.0"]).optional().describe("Output format for results"), - "download-location": z5.string().optional().describe("Location to download missing dependencies"), - threads: z5.number().optional().describe("Number of threads to use"), - ram: z5.number().optional().describe("Amount of RAM to use (MB)"), - timeout: z5.number().optional().describe("Timeout in seconds"), - verbose: z5.boolean().optional().describe("Enable verbose output"), - additionalArgs: z5.array(z5.string()).optional().describe("Additional command-line arguments") - }, - examples: [ - "codeql database analyze mydb queries.qls --format=sarif-latest --output=results.sarif", - "codeql database analyze mydb codeql/java-queries --format=csv" - ] -}; +// src/tools/codeql/bqrs-decode.ts +import { z as z2 } from "zod"; -// src/tools/codeql/database-create.ts -import { z as z6 } from "zod"; -var codeqlDatabaseCreateTool = { - name: "codeql_database_create", - description: "Create a CodeQL database from source code", - command: "codeql", - subcommand: "database create", - inputSchema: { - database: z6.string().describe("Database path/name to create"), - language: z6.string().optional().describe("Programming language(s) to extract"), - "source-root": z6.string().optional().describe("Root directory of source code"), - command: z6.string().optional().describe("Build command for compiled languages"), - "build-mode": z6.enum(["none", "autobuild", "manual"]).optional().describe("Build mode: none (interpreted langs), autobuild, or manual"), - threads: z6.number().optional().describe("Number of threads to use"), - ram: z6.number().optional().describe("Amount of RAM to use (MB)"), - verbose: z6.boolean().optional().describe("Enable verbose output"), - overwrite: z6.boolean().optional().describe("Overwrite existing database if it exists"), - "no-cleanup": z6.boolean().optional().describe("Skip database cleanup after finalization"), - additionalArgs: z6.array(z6.string()).optional().describe("Additional command-line arguments") - }, - examples: [ - "codeql database create --language=java --source-root=/path/to/project mydb", - 'codeql database create --language=cpp --command="make all" mydb', - "codeql database create --language=python,javascript mydb" - ], - resultProcessor: createDatabaseResultProcessor() -}; +// src/lib/cli-tool-registry.ts +init_cli_executor(); +init_logger(); +import { z } from "zod"; -// src/tools/codeql/find-class-position.ts +// src/lib/query-results-evaluator.ts +init_cli_executor(); init_logger(); -import { z as z7 } from "zod"; -import { readFile } from "fs/promises"; -async function findClassPosition(filepath, className) { +import { writeFileSync, readFileSync as readFileSync2 } from "fs"; +import { dirname as dirname3, isAbsolute as isAbsolute3 } from "path"; +import { mkdirSync as mkdirSync3 } from "fs"; +var BUILT_IN_EVALUATORS = { + "json-decode": "JSON format decoder for query results", + "csv-decode": "CSV format decoder for query results", + "mermaid-graph": "Mermaid diagram generator for @kind graph queries (like PrintAST)" +}; +async function extractQueryMetadata(queryPath) { try { - const content = await readFile(filepath, "utf-8"); - const lines = content.split("\n"); - for (let i = 0; i < lines.length; i++) { - const line = lines[i]; - const classNameRegex = new RegExp(`\\bclass\\s+(${className.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")})\\b`); - const match = classNameRegex.exec(line); - if (match) { - const start_line = i + 1; - const classNameStart = match.index + match[0].indexOf(match[1]); - const start_col = classNameStart + 1; - const end_col = start_col + className.length - 1; - return { - start_line, - start_col, - end_line: start_line, - end_col - }; - } + const queryContent = readFileSync2(queryPath, "utf-8"); + const metadata = {}; + const kindMatch = queryContent.match(/@kind\s+([^\s]+)/); + if (kindMatch) metadata.kind = kindMatch[1]; + const nameMatch = queryContent.match(/@name\s+(.+)/); + if (nameMatch) metadata.name = nameMatch[1].trim(); + const descMatch = queryContent.match(/@description\s+(.+)/); + if (descMatch) metadata.description = descMatch[1].trim(); + const idMatch = queryContent.match(/@id\s+(.+)/); + if (idMatch) metadata.id = idMatch[1].trim(); + const tagsMatch = queryContent.match(/@tags\s+(.+)/); + if (tagsMatch) { + metadata.tags = tagsMatch[1].split(/\s+/).filter((t) => t.length > 0); } - throw new Error(`Class name '${className}' not found in file: ${filepath}`); + return metadata; } catch (error) { - if (error instanceof Error && error.message.includes("not found in file")) { - throw error; + logger.error("Failed to extract query metadata:", error); + return {}; + } +} +async function evaluateWithJsonDecoder(bqrsPath, outputPath) { + try { + const result = await executeCodeQLCommand( + "bqrs decode", + { format: "json" }, + [bqrsPath] + ); + if (!result.success) { + return { + success: false, + error: `Failed to decode BQRS file: ${result.stderr || result.error}` + }; } - throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : "Unknown error"}`); + const defaultOutputPath = outputPath || bqrsPath.replace(".bqrs", ".json"); + mkdirSync3(dirname3(defaultOutputPath), { recursive: true }); + writeFileSync(defaultOutputPath, result.stdout); + return { + success: true, + outputPath: defaultOutputPath, + content: result.stdout + }; + } catch (error) { + return { + success: false, + error: `JSON evaluation failed: ${error}` + }; } } -function registerFindClassPositionTool(server) { - server.tool( - "find_class_position", - "Finds startline, startcol, endline endcol of a class for quickeval", - { - file: z7.string().describe("Path to the .ql file to search"), - name: z7.string().describe("Name of the class to find") - }, - async ({ file, name }) => { - try { - const position = await findClassPosition(file, name); - return { - content: [{ type: "text", text: JSON.stringify(position, null, 2) }] - }; - } catch (error) { - logger.error("Error finding class position:", error); - return { - content: [ - { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` - } - ], - isError: true - }; - } - } - ); -} - -// src/tools/codeql/find-predicate-position.ts -init_logger(); -import { z as z8 } from "zod"; -import { readFile as readFile2 } from "fs/promises"; -async function findPredicatePosition(filepath, predicateName) { +async function evaluateWithCsvDecoder(bqrsPath, outputPath) { try { - const content = await readFile2(filepath, "utf-8"); - const lines = content.split("\n"); - const escapedName = predicateName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - for (let i = 0; i < lines.length; i++) { - const line = lines[i]; - const predicateKeywordRegex = new RegExp(`\\bpredicate\\s+(${escapedName})\\s*\\(`); - let match = predicateKeywordRegex.exec(line); - if (!match) { - const returnTypeRegex = new RegExp(`(?:^|\\s)(?:abstract\\s+)?(?:cached\\s+)?(?:private\\s+)?(?:deprecated\\s+)?(?:\\w+)\\s+(${escapedName})\\s*\\(`); - match = returnTypeRegex.exec(line); - } - if (match) { - const start_line = i + 1; - const predicateNameStart = match.index + match[0].indexOf(match[1]); - const start_col = predicateNameStart + 1; - const end_col = start_col + predicateName.length - 1; - return { - start_line, - start_col, - end_line: start_line, - end_col - }; - } + const result = await executeCodeQLCommand( + "bqrs decode", + { format: "csv" }, + [bqrsPath] + ); + if (!result.success) { + return { + success: false, + error: `Failed to decode BQRS file: ${result.stderr || result.error}` + }; } - throw new Error(`Predicate name '${predicateName}' not found in file: ${filepath}`); + const defaultOutputPath = outputPath || bqrsPath.replace(".bqrs", ".csv"); + mkdirSync3(dirname3(defaultOutputPath), { recursive: true }); + writeFileSync(defaultOutputPath, result.stdout); + return { + success: true, + outputPath: defaultOutputPath, + content: result.stdout + }; } catch (error) { - if (error instanceof Error && error.message.includes("not found in file")) { - throw error; - } - throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : "Unknown error"}`); + return { + success: false, + error: `CSV evaluation failed: ${error}` + }; } } -function registerFindPredicatePositionTool(server) { - server.tool( - "find_predicate_position", - "Finds startline, startcol, endline endcol of a predicate for quickeval", - { - file: z8.string().describe("Path to the .ql file to search"), - name: z8.string().describe("Name of the predicate to find") - }, - async ({ file, name }) => { - try { - const position = await findPredicatePosition(file, name); - return { - content: [{ type: "text", text: JSON.stringify(position, null, 2) }] - }; - } catch (error) { - logger.error("Error finding predicate position:", error); - return { - content: [ - { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` - } - ], - isError: true - }; - } +async function evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath) { + try { + const metadata = await extractQueryMetadata(queryPath); + if (metadata.kind !== "graph") { + logger.error(`Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries`); + return { + success: false, + error: `Query is not a graph query (kind: ${metadata.kind}), mermaid-graph evaluation is only for @kind graph queries` + }; } - ); + const jsonResult = await executeCodeQLCommand( + "bqrs decode", + { format: "json" }, + [bqrsPath] + ); + if (!jsonResult.success) { + return { + success: false, + error: `Failed to decode BQRS file: ${jsonResult.stderr || jsonResult.error}` + }; + } + let queryResults; + try { + queryResults = JSON.parse(jsonResult.stdout); + } catch (parseError) { + return { + success: false, + error: `Failed to parse query results JSON: ${parseError}` + }; + } + const mermaidContent = generateMermaidFromGraphResults(queryResults, metadata); + const defaultOutputPath = outputPath || bqrsPath.replace(".bqrs", ".md"); + mkdirSync3(dirname3(defaultOutputPath), { recursive: true }); + writeFileSync(defaultOutputPath, mermaidContent); + return { + success: true, + outputPath: defaultOutputPath, + content: mermaidContent + }; + } catch (error) { + return { + success: false, + error: `Mermaid graph evaluation failed: ${error}` + }; + } } +function generateMermaidFromGraphResults(queryResults, metadata) { + const queryName = sanitizeMarkdown(metadata.name || "CodeQL Query Results"); + const queryDesc = sanitizeMarkdown(metadata.description || "Graph visualization of CodeQL query results"); + let mermaidContent = `# ${queryName} -// src/tools/codeql/find-query-files.ts -import { z as z9 } from "zod"; +${queryDesc} -// src/lib/query-file-finder.ts -import * as fs from "fs"; -import * as path from "path"; +`; + if (!queryResults || typeof queryResults !== "object") { + mermaidContent += "```mermaid\ngraph TD\n A[No Results]\n```\n"; + return mermaidContent; + } + const tuples = queryResults.tuples || queryResults; + if (!Array.isArray(tuples) || tuples.length === 0) { + mermaidContent += "```mermaid\ngraph TD\n A[No Graph Data]\n```\n"; + return mermaidContent; + } + mermaidContent += "```mermaid\ngraph TD\n"; + const nodes = /* @__PURE__ */ new Set(); + const edges = /* @__PURE__ */ new Set(); + tuples.forEach((tuple, index) => { + if (Array.isArray(tuple) && tuple.length >= 2) { + const source = sanitizeNodeId(tuple[0]?.toString() || `node_${index}_0`); + const target = sanitizeNodeId(tuple[1]?.toString() || `node_${index}_1`); + const label = tuple[2]?.toString() || ""; + nodes.add(source); + nodes.add(target); + const edgeId = `${source}_${target}`; + if (!edges.has(edgeId)) { + if (label) { + mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target} +`; + } else { + mermaidContent += ` ${source} --> ${target} +`; + } + edges.add(edgeId); + } + } else if (typeof tuple === "object" && tuple !== null) { + const source = sanitizeNodeId(tuple.source?.toString() || tuple.from?.toString() || `node_${index}_src`); + const target = sanitizeNodeId(tuple.target?.toString() || tuple.to?.toString() || `node_${index}_tgt`); + const label = tuple.label?.toString() || tuple.relation?.toString() || ""; + nodes.add(source); + nodes.add(target); + const edgeId = `${source}_${target}`; + if (!edges.has(edgeId)) { + if (label) { + mermaidContent += ` ${source} -->|${sanitizeLabel(label)}| ${target} +`; + } else { + mermaidContent += ` ${source} --> ${target} +`; + } + edges.add(edgeId); + } + } + }); + if (edges.size === 0 && nodes.size > 0) { + const nodeArray = Array.from(nodes).slice(0, 10); + nodeArray.forEach((node, index) => { + if (index === 0) { + mermaidContent += ` ${node}[${sanitizeLabel(node)}] +`; + } else { + mermaidContent += ` ${nodeArray[0]} --> ${node} +`; + } + }); + } + mermaidContent += "```\n\n"; + mermaidContent += `## Query Statistics -// ../node_modules/js-yaml/dist/js-yaml.mjs -function isNothing(subject) { - return typeof subject === "undefined" || subject === null; +`; + mermaidContent += `- Total nodes: ${nodes.size} +`; + mermaidContent += `- Total edges: ${edges.size} +`; + mermaidContent += `- Total tuples processed: ${tuples.length} +`; + return mermaidContent; } -function isObject(subject) { - return typeof subject === "object" && subject !== null; +function sanitizeNodeId(id) { + return id.replace(/[^a-zA-Z0-9_]/g, "_").replace(/^(\d)/, "n$1").substring(0, 50); } -function toArray(sequence) { - if (Array.isArray(sequence)) return sequence; - else if (isNothing(sequence)) return []; - return [sequence]; +function sanitizeLabel(label) { + return label.replace(/[|"`<>\n\r\t]/g, "").replace(/\s+/g, " ").trim().substring(0, 30); } -function extend(target, source) { - var index, length, key, sourceKeys; - if (source) { - sourceKeys = Object.keys(source); - for (index = 0, length = sourceKeys.length; index < length; index += 1) { - key = sourceKeys[index]; - target[key] = source[key]; - } - } - return target; -} -function repeat(string, count) { - var result = "", cycle; - for (cycle = 0; cycle < count; cycle += 1) { - result += string; - } - return result; -} -function isNegativeZero(number) { - return number === 0 && Number.NEGATIVE_INFINITY === 1 / number; -} -var isNothing_1 = isNothing; -var isObject_1 = isObject; -var toArray_1 = toArray; -var repeat_1 = repeat; -var isNegativeZero_1 = isNegativeZero; -var extend_1 = extend; -var common = { - isNothing: isNothing_1, - isObject: isObject_1, - toArray: toArray_1, - repeat: repeat_1, - isNegativeZero: isNegativeZero_1, - extend: extend_1 -}; -function formatError(exception2, compact) { - var where = "", message = exception2.reason || "(unknown reason)"; - if (!exception2.mark) return message; - if (exception2.mark.name) { - where += 'in "' + exception2.mark.name + '" '; - } - where += "(" + (exception2.mark.line + 1) + ":" + (exception2.mark.column + 1) + ")"; - if (!compact && exception2.mark.snippet) { - where += "\n\n" + exception2.mark.snippet; - } - return message + " " + where; +function sanitizeMarkdown(content) { + return content.replace(/[<>"`]/g, "").replace(/\n/g, " ").replace(/\s+/g, " ").trim().substring(0, 100); } -function YAMLException$1(reason, mark) { - Error.call(this); - this.name = "YAMLException"; - this.reason = reason; - this.mark = mark; - this.message = formatError(this, false); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } else { - this.stack = new Error().stack || ""; +async function evaluateQueryResults(bqrsPath, queryPath, evaluationFunction, outputPath) { + try { + const evalFunc = evaluationFunction || "json-decode"; + logger.info(`Evaluating query results with function: ${evalFunc}`); + switch (evalFunc) { + case "json-decode": + return await evaluateWithJsonDecoder(bqrsPath, outputPath); + case "csv-decode": + return await evaluateWithCsvDecoder(bqrsPath, outputPath); + case "mermaid-graph": + return await evaluateWithMermaidGraph(bqrsPath, queryPath, outputPath); + default: + if (isAbsolute3(evalFunc)) { + return await evaluateWithCustomScript(bqrsPath, queryPath, evalFunc, outputPath); + } else { + return { + success: false, + error: `Unknown evaluation function: ${evalFunc}. Available built-in functions: ${Object.keys(BUILT_IN_EVALUATORS).join(", ")}` + }; + } + } + } catch (error) { + return { + success: false, + error: `Query evaluation failed: ${error}` + }; } } -YAMLException$1.prototype = Object.create(Error.prototype); -YAMLException$1.prototype.constructor = YAMLException$1; -YAMLException$1.prototype.toString = function toString(compact) { - return this.name + ": " + formatError(this, compact); -}; -var exception = YAMLException$1; -function getLine(buffer, lineStart, lineEnd, position, maxLineLength) { - var head = ""; - var tail = ""; - var maxHalfLength = Math.floor(maxLineLength / 2) - 1; - if (position - lineStart > maxHalfLength) { - head = " ... "; - lineStart = position - maxHalfLength + head.length; - } - if (lineEnd - position > maxHalfLength) { - tail = " ..."; - lineEnd = position + maxHalfLength - tail.length; - } +async function evaluateWithCustomScript(_bqrsPath, _queryPath, _scriptPath, _outputPath) { return { - str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, "\u2192") + tail, - pos: position - lineStart + head.length - // relative position + success: false, + error: "Custom evaluation scripts are not yet implemented" }; } -function padStart(string, max) { - return common.repeat(" ", max - string.length) + string; + +// src/lib/log-directory-manager.ts +init_temp_dir(); +import { mkdirSync as mkdirSync4, existsSync as existsSync3 } from "fs"; +import { join as join4, resolve as resolve3 } from "path"; +import { randomBytes } from "crypto"; +function ensurePathWithinBase(baseDir, targetPath) { + const absBase = resolve3(baseDir); + const absTarget = resolve3(targetPath); + if (!absTarget.startsWith(absBase + "/") && absTarget !== absBase) { + throw new Error(`Provided log directory is outside the allowed base directory: ${absBase}`); + } + return absTarget; } -function makeSnippet(mark, options) { - options = Object.create(options || null); - if (!mark.buffer) return null; - if (!options.maxLength) options.maxLength = 79; - if (typeof options.indent !== "number") options.indent = 1; - if (typeof options.linesBefore !== "number") options.linesBefore = 3; - if (typeof options.linesAfter !== "number") options.linesAfter = 2; - var re = /\r?\n|\r|\0/g; - var lineStarts = [0]; - var lineEnds = []; - var match; - var foundLineNo = -1; - while (match = re.exec(mark.buffer)) { - lineEnds.push(match.index); - lineStarts.push(match.index + match[0].length); - if (mark.position <= match.index && foundLineNo < 0) { - foundLineNo = lineStarts.length - 2; +function getOrCreateLogDirectory(logDir) { + const baseLogDir = process.env.CODEQL_QUERY_LOG_DIR || getProjectTmpDir("query-logs"); + if (logDir) { + const absLogDir = ensurePathWithinBase(baseLogDir, logDir); + if (!existsSync3(absLogDir)) { + mkdirSync4(absLogDir, { recursive: true }); } + return absLogDir; } - if (foundLineNo < 0) foundLineNo = lineStarts.length - 1; - var result = "", i, line; - var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length; - var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3); - for (i = 1; i <= options.linesBefore; i++) { - if (foundLineNo - i < 0) break; - line = getLine( - mark.buffer, - lineStarts[foundLineNo - i], - lineEnds[foundLineNo - i], - mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]), - maxLineLength - ); - result = common.repeat(" ", options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) + " | " + line.str + "\n" + result; - } - line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength); - result += common.repeat(" ", options.indent) + padStart((mark.line + 1).toString(), lineNoLength) + " | " + line.str + "\n"; - result += common.repeat("-", options.indent + lineNoLength + 3 + line.pos) + "^\n"; - for (i = 1; i <= options.linesAfter; i++) { - if (foundLineNo + i >= lineEnds.length) break; - line = getLine( - mark.buffer, - lineStarts[foundLineNo + i], - lineEnds[foundLineNo + i], - mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]), - maxLineLength - ); - result += common.repeat(" ", options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) + " | " + line.str + "\n"; + if (!existsSync3(baseLogDir)) { + mkdirSync4(baseLogDir, { recursive: true }); } - return result.replace(/\n$/, ""); + const timestamp2 = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-"); + const uniqueId = randomBytes(4).toString("hex"); + const uniqueLogDir = join4(baseLogDir, `query-run-${timestamp2}-${uniqueId}`); + mkdirSync4(uniqueLogDir, { recursive: true }); + return uniqueLogDir; } -var snippet = makeSnippet; -var TYPE_CONSTRUCTOR_OPTIONS = [ - "kind", - "multi", - "resolve", - "construct", - "instanceOf", - "predicate", - "represent", - "representName", - "defaultStyle", - "styleAliases" -]; -var YAML_NODE_KINDS = [ - "scalar", - "sequence", - "mapping" -]; -function compileStyleAliases(map2) { - var result = {}; - if (map2 !== null) { - Object.keys(map2).forEach(function(style) { - map2[style].forEach(function(alias) { - result[String(alias)] = style; - }); - }); + +// src/lib/cli-tool-registry.ts +init_package_paths(); +init_temp_dir(); +import { writeFileSync as writeFileSync2, rmSync, existsSync as existsSync4, mkdirSync as mkdirSync5 } from "fs"; +import { basename as basename2, dirname as dirname4, isAbsolute as isAbsolute4, join as join5, resolve as resolve4 } from "path"; +var defaultCLIResultProcessor = (result, _params) => { + if (!result.success) { + return `Command failed (exit code ${result.exitCode || "unknown"}): +${result.error || result.stderr}`; } - return result; -} -function Type$1(tag, options) { - options = options || {}; - Object.keys(options).forEach(function(name) { - if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { - throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); + let output = ""; + if (result.stdout) { + output += result.stdout; + } + if (result.stderr) { + if (output) { + output += "\n\nWarnings/Info:\n"; } - }); - this.options = options; - this.tag = tag; - this.kind = options["kind"] || null; - this.resolve = options["resolve"] || function() { - return true; - }; - this.construct = options["construct"] || function(data) { - return data; - }; - this.instanceOf = options["instanceOf"] || null; - this.predicate = options["predicate"] || null; - this.represent = options["represent"] || null; - this.representName = options["representName"] || null; - this.defaultStyle = options["defaultStyle"] || null; - this.multi = options["multi"] || false; - this.styleAliases = compileStyleAliases(options["styleAliases"] || null); - if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { - throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + output += result.stderr; } -} -var type = Type$1; -function compileList(schema2, name) { - var result = []; - schema2[name].forEach(function(currentType) { - var newIndex = result.length; - result.forEach(function(previousType, previousIndex) { - if (previousType.tag === currentType.tag && previousType.kind === currentType.kind && previousType.multi === currentType.multi) { - newIndex = previousIndex; - } - }); - result[newIndex] = currentType; - }); - return result; -} -function compileMap() { - var result = { - scalar: {}, - sequence: {}, - mapping: {}, - fallback: {}, - multi: { - scalar: [], - sequence: [], - mapping: [], - fallback: [] - } - }, index, length; - function collectType(type2) { - if (type2.multi) { - result.multi[type2.kind].push(type2); - result.multi["fallback"].push(type2); - } else { - result[type2.kind][type2.tag] = result["fallback"][type2.tag] = type2; - } - } - for (index = 0, length = arguments.length; index < length; index += 1) { - arguments[index].forEach(collectType); - } - return result; -} -function Schema$1(definition) { - return this.extend(definition); -} -Schema$1.prototype.extend = function extend2(definition) { - var implicit = []; - var explicit = []; - if (definition instanceof type) { - explicit.push(definition); - } else if (Array.isArray(definition)) { - explicit = explicit.concat(definition); - } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) { - if (definition.implicit) implicit = implicit.concat(definition.implicit); - if (definition.explicit) explicit = explicit.concat(definition.explicit); - } else { - throw new exception("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })"); + if (!output) { + output = "Command executed successfully (no output)"; } - implicit.forEach(function(type$1) { - if (!(type$1 instanceof type)) { - throw new exception("Specified list of YAML types (or a single Type object) contains a non-Type object."); - } - if (type$1.loadKind && type$1.loadKind !== "scalar") { - throw new exception("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported."); - } - if (type$1.multi) { - throw new exception("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit."); - } - }); - explicit.forEach(function(type$1) { - if (!(type$1 instanceof type)) { - throw new exception("Specified list of YAML types (or a single Type object) contains a non-Type object."); - } - }); - var result = Object.create(Schema$1.prototype); - result.implicit = (this.implicit || []).concat(implicit); - result.explicit = (this.explicit || []).concat(explicit); - result.compiledImplicit = compileList(result, "implicit"); - result.compiledExplicit = compileList(result, "explicit"); - result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit); - return result; + return output; }; -var schema = Schema$1; -var str = new type("tag:yaml.org,2002:str", { - kind: "scalar", - construct: function(data) { - return data !== null ? data : ""; - } -}); -var seq = new type("tag:yaml.org,2002:seq", { - kind: "sequence", - construct: function(data) { - return data !== null ? data : []; - } -}); -var map = new type("tag:yaml.org,2002:map", { - kind: "mapping", - construct: function(data) { - return data !== null ? data : {}; - } -}); -var failsafe = new schema({ - explicit: [ - str, - seq, - map - ] -}); -function resolveYamlNull(data) { - if (data === null) return true; - var max = data.length; - return max === 1 && data === "~" || max === 4 && (data === "null" || data === "Null" || data === "NULL"); -} -function constructYamlNull() { - return null; -} -function isNull(object) { - return object === null; -} -var _null = new type("tag:yaml.org,2002:null", { - kind: "scalar", - resolve: resolveYamlNull, - construct: constructYamlNull, - predicate: isNull, - represent: { - canonical: function() { - return "~"; - }, - lowercase: function() { - return "null"; - }, - uppercase: function() { - return "NULL"; - }, - camelcase: function() { - return "Null"; - }, - empty: function() { - return ""; - } - }, - defaultStyle: "lowercase" -}); -function resolveYamlBoolean(data) { - if (data === null) return false; - var max = data.length; - return max === 4 && (data === "true" || data === "True" || data === "TRUE") || max === 5 && (data === "false" || data === "False" || data === "FALSE"); -} -function constructYamlBoolean(data) { - return data === "true" || data === "True" || data === "TRUE"; -} -function isBoolean(object) { - return Object.prototype.toString.call(object) === "[object Boolean]"; -} -var bool = new type("tag:yaml.org,2002:bool", { - kind: "scalar", - resolve: resolveYamlBoolean, - construct: constructYamlBoolean, - predicate: isBoolean, - represent: { - lowercase: function(object) { - return object ? "true" : "false"; - }, - uppercase: function(object) { - return object ? "TRUE" : "FALSE"; - }, - camelcase: function(object) { - return object ? "True" : "False"; - } - }, - defaultStyle: "lowercase" -}); -function isHexCode(c) { - return 48 <= c && c <= 57 || 65 <= c && c <= 70 || 97 <= c && c <= 102; -} -function isOctCode(c) { - return 48 <= c && c <= 55; -} -function isDecCode(c) { - return 48 <= c && c <= 57; -} -function resolveYamlInteger(data) { - if (data === null) return false; - var max = data.length, index = 0, hasDigits = false, ch; - if (!max) return false; - ch = data[index]; - if (ch === "-" || ch === "+") { - ch = data[++index]; - } - if (ch === "0") { - if (index + 1 === max) return true; - ch = data[++index]; - if (ch === "b") { - index++; - for (; index < max; index++) { - ch = data[index]; - if (ch === "_") continue; - if (ch !== "0" && ch !== "1") return false; - hasDigits = true; - } - return hasDigits && ch !== "_"; - } - if (ch === "x") { - index++; - for (; index < max; index++) { - ch = data[index]; - if (ch === "_") continue; - if (!isHexCode(data.charCodeAt(index))) return false; - hasDigits = true; - } - return hasDigits && ch !== "_"; - } - if (ch === "o") { - index++; - for (; index < max; index++) { - ch = data[index]; - if (ch === "_") continue; - if (!isOctCode(data.charCodeAt(index))) return false; - hasDigits = true; - } - return hasDigits && ch !== "_"; - } - } - if (ch === "_") return false; - for (; index < max; index++) { - ch = data[index]; - if (ch === "_") continue; - if (!isDecCode(data.charCodeAt(index))) { - return false; - } - hasDigits = true; - } - if (!hasDigits || ch === "_") return false; - return true; -} -function constructYamlInteger(data) { - var value = data, sign = 1, ch; - if (value.indexOf("_") !== -1) { - value = value.replace(/_/g, ""); - } - ch = value[0]; - if (ch === "-" || ch === "+") { - if (ch === "-") sign = -1; - value = value.slice(1); - ch = value[0]; - } - if (value === "0") return 0; - if (ch === "0") { - if (value[1] === "b") return sign * parseInt(value.slice(2), 2); - if (value[1] === "x") return sign * parseInt(value.slice(2), 16); - if (value[1] === "o") return sign * parseInt(value.slice(2), 8); - } - return sign * parseInt(value, 10); -} -function isInteger(object) { - return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 === 0 && !common.isNegativeZero(object)); -} -var int = new type("tag:yaml.org,2002:int", { - kind: "scalar", - resolve: resolveYamlInteger, - construct: constructYamlInteger, - predicate: isInteger, - represent: { - binary: function(obj) { - return obj >= 0 ? "0b" + obj.toString(2) : "-0b" + obj.toString(2).slice(1); - }, - octal: function(obj) { - return obj >= 0 ? "0o" + obj.toString(8) : "-0o" + obj.toString(8).slice(1); - }, - decimal: function(obj) { - return obj.toString(10); - }, - /* eslint-disable max-len */ - hexadecimal: function(obj) { - return obj >= 0 ? "0x" + obj.toString(16).toUpperCase() : "-0x" + obj.toString(16).toUpperCase().slice(1); - } - }, - defaultStyle: "decimal", - styleAliases: { - binary: [2, "bin"], - octal: [8, "oct"], - decimal: [10, "dec"], - hexadecimal: [16, "hex"] - } -}); -var YAML_FLOAT_PATTERN = new RegExp( - // 2.5e4, 2.5 and integers - "^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$" -); -function resolveYamlFloat(data) { - if (data === null) return false; - if (!YAML_FLOAT_PATTERN.test(data) || // Quick hack to not allow integers end with `_` - // Probably should update regexp & check speed - data[data.length - 1] === "_") { - return false; - } - return true; -} -function constructYamlFloat(data) { - var value, sign; - value = data.replace(/_/g, "").toLowerCase(); - sign = value[0] === "-" ? -1 : 1; - if ("+-".indexOf(value[0]) >= 0) { - value = value.slice(1); - } - if (value === ".inf") { - return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; - } else if (value === ".nan") { - return NaN; - } - return sign * parseFloat(value, 10); -} -var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; -function representYamlFloat(object, style) { - var res; - if (isNaN(object)) { - switch (style) { - case "lowercase": - return ".nan"; - case "uppercase": - return ".NAN"; - case "camelcase": - return ".NaN"; - } - } else if (Number.POSITIVE_INFINITY === object) { - switch (style) { - case "lowercase": - return ".inf"; - case "uppercase": - return ".INF"; - case "camelcase": - return ".Inf"; - } - } else if (Number.NEGATIVE_INFINITY === object) { - switch (style) { - case "lowercase": - return "-.inf"; - case "uppercase": - return "-.INF"; - case "camelcase": - return "-.Inf"; - } - } else if (common.isNegativeZero(object)) { - return "-0.0"; - } - res = object.toString(10); - return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace("e", ".e") : res; -} -function isFloat(object) { - return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 !== 0 || common.isNegativeZero(object)); -} -var float = new type("tag:yaml.org,2002:float", { - kind: "scalar", - resolve: resolveYamlFloat, - construct: constructYamlFloat, - predicate: isFloat, - represent: representYamlFloat, - defaultStyle: "lowercase" -}); -var json = failsafe.extend({ - implicit: [ - _null, - bool, - int, - float - ] -}); -var core = json; -var YAML_DATE_REGEXP = new RegExp( - "^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$" -); -var YAML_TIMESTAMP_REGEXP = new RegExp( - "^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$" -); -function resolveYamlTimestamp(data) { - if (data === null) return false; - if (YAML_DATE_REGEXP.exec(data) !== null) return true; - if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; - return false; -} -function constructYamlTimestamp(data) { - var match, year, month, day, hour, minute, second, fraction = 0, delta = null, tz_hour, tz_minute, date; - match = YAML_DATE_REGEXP.exec(data); - if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); - if (match === null) throw new Error("Date resolve error"); - year = +match[1]; - month = +match[2] - 1; - day = +match[3]; - if (!match[4]) { - return new Date(Date.UTC(year, month, day)); - } - hour = +match[4]; - minute = +match[5]; - second = +match[6]; - if (match[7]) { - fraction = match[7].slice(0, 3); - while (fraction.length < 3) { - fraction += "0"; - } - fraction = +fraction; - } - if (match[9]) { - tz_hour = +match[10]; - tz_minute = +(match[11] || 0); - delta = (tz_hour * 60 + tz_minute) * 6e4; - if (match[9] === "-") delta = -delta; - } - date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); - if (delta) date.setTime(date.getTime() - delta); - return date; -} -function representYamlTimestamp(object) { - return object.toISOString(); -} -var timestamp = new type("tag:yaml.org,2002:timestamp", { - kind: "scalar", - resolve: resolveYamlTimestamp, - construct: constructYamlTimestamp, - instanceOf: Date, - represent: representYamlTimestamp -}); -function resolveYamlMerge(data) { - return data === "<<" || data === null; -} -var merge = new type("tag:yaml.org,2002:merge", { - kind: "scalar", - resolve: resolveYamlMerge -}); -var BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r"; -function resolveYamlBinary(data) { - if (data === null) return false; - var code, idx, bitlen = 0, max = data.length, map2 = BASE64_MAP; - for (idx = 0; idx < max; idx++) { - code = map2.indexOf(data.charAt(idx)); - if (code > 64) continue; - if (code < 0) return false; - bitlen += 6; - } - return bitlen % 8 === 0; -} -function constructYamlBinary(data) { - var idx, tailbits, input = data.replace(/[\r\n=]/g, ""), max = input.length, map2 = BASE64_MAP, bits = 0, result = []; - for (idx = 0; idx < max; idx++) { - if (idx % 4 === 0 && idx) { - result.push(bits >> 16 & 255); - result.push(bits >> 8 & 255); - result.push(bits & 255); - } - bits = bits << 6 | map2.indexOf(input.charAt(idx)); - } - tailbits = max % 4 * 6; - if (tailbits === 0) { - result.push(bits >> 16 & 255); - result.push(bits >> 8 & 255); - result.push(bits & 255); - } else if (tailbits === 18) { - result.push(bits >> 10 & 255); - result.push(bits >> 2 & 255); - } else if (tailbits === 12) { - result.push(bits >> 4 & 255); - } - return new Uint8Array(result); -} -function representYamlBinary(object) { - var result = "", bits = 0, idx, tail, max = object.length, map2 = BASE64_MAP; - for (idx = 0; idx < max; idx++) { - if (idx % 3 === 0 && idx) { - result += map2[bits >> 18 & 63]; - result += map2[bits >> 12 & 63]; - result += map2[bits >> 6 & 63]; - result += map2[bits & 63]; - } - bits = (bits << 8) + object[idx]; - } - tail = max % 3; - if (tail === 0) { - result += map2[bits >> 18 & 63]; - result += map2[bits >> 12 & 63]; - result += map2[bits >> 6 & 63]; - result += map2[bits & 63]; - } else if (tail === 2) { - result += map2[bits >> 10 & 63]; - result += map2[bits >> 4 & 63]; - result += map2[bits << 2 & 63]; - result += map2[64]; - } else if (tail === 1) { - result += map2[bits >> 2 & 63]; - result += map2[bits << 4 & 63]; - result += map2[64]; - result += map2[64]; - } - return result; -} -function isBinary(obj) { - return Object.prototype.toString.call(obj) === "[object Uint8Array]"; -} -var binary = new type("tag:yaml.org,2002:binary", { - kind: "scalar", - resolve: resolveYamlBinary, - construct: constructYamlBinary, - predicate: isBinary, - represent: representYamlBinary -}); -var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; -var _toString$2 = Object.prototype.toString; -function resolveYamlOmap(data) { - if (data === null) return true; - var objectKeys = [], index, length, pair, pairKey, pairHasKey, object = data; - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - pairHasKey = false; - if (_toString$2.call(pair) !== "[object Object]") return false; - for (pairKey in pair) { - if (_hasOwnProperty$3.call(pair, pairKey)) { - if (!pairHasKey) pairHasKey = true; - else return false; +function registerCLITool(server, definition) { + const { + name, + description, + command, + subcommand, + inputSchema, + resultProcessor = defaultCLIResultProcessor + } = definition; + server.tool( + name, + description, + inputSchema, + async (params) => { + const tempDirsToCleanup = []; + try { + logger.info(`Executing CLI tool: ${name}`, { command, subcommand, params }); + const formatShouldBePassedToCLI = name === "codeql_bqrs_interpret" || name === "codeql_bqrs_decode" || name === "codeql_generate_query-help" || name === "codeql_database_analyze"; + const extractedParams = formatShouldBePassedToCLI ? { + _positional: params._positional || [], + files: params.files, + file: params.file, + dir: params.dir, + packDir: params.packDir, + tests: params.tests, + query: params.query, + queryName: params.queryName, + queryLanguage: params.queryLanguage, + queryPack: params.queryPack, + sourceFiles: params.sourceFiles, + sourceFunction: params.sourceFunction, + targetFunction: params.targetFunction, + interpretedOutput: params.interpretedOutput, + evaluationFunction: params.evaluationFunction, + evaluationOutput: params.evaluationOutput, + directory: params.directory, + logDir: params.logDir, + qlref: params.qlref + } : { + _positional: params._positional || [], + files: params.files, + file: params.file, + dir: params.dir, + packDir: params.packDir, + tests: params.tests, + query: params.query, + queryName: params.queryName, + queryLanguage: params.queryLanguage, + queryPack: params.queryPack, + sourceFiles: params.sourceFiles, + sourceFunction: params.sourceFunction, + targetFunction: params.targetFunction, + format: params.format, + interpretedOutput: params.interpretedOutput, + evaluationFunction: params.evaluationFunction, + evaluationOutput: params.evaluationOutput, + directory: params.directory, + logDir: params.logDir, + qlref: params.qlref + }; + const { + _positional = [], + files, + file, + dir, + packDir, + tests, + query, + queryName, + queryLanguage: _queryLanguage, + queryPack: _queryPack, + sourceFiles, + sourceFunction, + targetFunction, + format: _format, + interpretedOutput: _interpretedOutput, + evaluationFunction: _evaluationFunction, + evaluationOutput: _evaluationOutput, + directory, + logDir: customLogDir, + qlref + } = extractedParams; + const options = { ...params }; + Object.keys(extractedParams).forEach((key) => delete options[key]); + let positionalArgs = Array.isArray(_positional) ? _positional : [_positional]; + if (files && Array.isArray(files)) { + positionalArgs = [...positionalArgs, ...files]; + } + if (file && name.startsWith("codeql_bqrs_")) { + positionalArgs = [...positionalArgs, file]; + } + if (qlref && name === "codeql_resolve_qlref") { + positionalArgs = [...positionalArgs, qlref]; + } + if (options.database && name === "codeql_resolve_database") { + positionalArgs = [...positionalArgs, options.database]; + delete options.database; + } + if (options.database && name === "codeql_database_create") { + positionalArgs = [...positionalArgs, options.database]; + delete options.database; + } + if (name === "codeql_database_analyze") { + if (options.database) { + positionalArgs = [...positionalArgs, options.database]; + delete options.database; + } + if (options.queries) { + positionalArgs = [...positionalArgs, options.queries]; + delete options.queries; + } + } + if (query && name === "codeql_generate_query-help") { + positionalArgs = [...positionalArgs, query]; + } + if (dir && name === "codeql_pack_ls") { + positionalArgs = [...positionalArgs, dir]; + } + switch (name) { + case "codeql_test_accept": + case "codeql_test_extract": + case "codeql_test_run": + case "codeql_resolve_tests": + if (tests && Array.isArray(tests)) { + const userDir = getUserWorkspaceDir(); + positionalArgs = [...positionalArgs, ...tests.map( + (t) => isAbsolute4(t) ? t : resolve4(userDir, t) + )]; + } + break; + case "codeql_query_run": { + if (options.database && typeof options.database === "string" && !isAbsolute4(options.database)) { + options.database = resolve4(getUserWorkspaceDir(), options.database); + logger.info(`Resolved database path to: ${options.database}`); + } + const resolvedQuery = await resolveQueryPath(params, logger); + if (resolvedQuery) { + positionalArgs = [...positionalArgs, resolvedQuery]; + } else if (query) { + positionalArgs = [...positionalArgs, query]; + } + if (queryName === "PrintAST" && sourceFiles) { + const filePaths = sourceFiles.split(",").map((f) => f.trim()); + let tempDir; + let csvPath; + try { + tempDir = createProjectTempDir("codeql-external-"); + tempDirsToCleanup.push(tempDir); + csvPath = join5(tempDir, "selectedSourceFiles.csv"); + const csvContent = filePaths.join("\n") + "\n"; + writeFileSync2(csvPath, csvContent, "utf8"); + } catch (err) { + logger.error(`Failed to create external predicate CSV for PrintAST query at path ${csvPath || "[unknown]"}: ${err instanceof Error ? err.message : String(err)}`); + throw err; + } + const currentExternal = options.external || []; + const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal]; + externalArray.push(`selectedSourceFiles=${csvPath}`); + options.external = externalArray; + logger.info(`Created external predicate CSV at ${csvPath} for files: ${filePaths.join(", ")}`); + } + if (queryName === "CallGraphFrom" && sourceFunction) { + const functionNames = sourceFunction.split(",").map((f) => f.trim()); + let tempDir; + let csvPath; + try { + tempDir = createProjectTempDir("codeql-external-"); + tempDirsToCleanup.push(tempDir); + csvPath = join5(tempDir, "sourceFunction.csv"); + const csvContent = functionNames.join("\n") + "\n"; + writeFileSync2(csvPath, csvContent, "utf8"); + } catch (err) { + logger.error(`Failed to create external predicate CSV for CallGraphFrom query at path ${csvPath || "[unknown]"}: ${err instanceof Error ? err.message : String(err)}`); + throw err; + } + const currentExternal = options.external || []; + const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal]; + externalArray.push(`sourceFunction=${csvPath}`); + options.external = externalArray; + logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(", ")}`); + } + if (queryName === "CallGraphTo" && targetFunction) { + const functionNames = targetFunction.split(",").map((f) => f.trim()); + let tempDir; + let csvPath; + try { + tempDir = createProjectTempDir("codeql-external-"); + tempDirsToCleanup.push(tempDir); + csvPath = join5(tempDir, "targetFunction.csv"); + const csvContent = functionNames.join("\n") + "\n"; + writeFileSync2(csvPath, csvContent, "utf8"); + } catch (err) { + logger.error(`Failed to create external predicate CSV for CallGraphTo query at path ${csvPath || "[unknown]"}: ${err instanceof Error ? err.message : String(err)}`); + throw err; + } + const currentExternal = options.external || []; + const externalArray = Array.isArray(currentExternal) ? currentExternal : [currentExternal]; + externalArray.push(`targetFunction=${csvPath}`); + options.external = externalArray; + logger.info(`Created external predicate CSV at ${csvPath} for functions: ${functionNames.join(", ")}`); + } + break; + } + case "codeql_query_compile": + case "codeql_resolve_metadata": + if (query) { + positionalArgs = [...positionalArgs, query]; + } + break; + case "codeql_resolve_queries": + if (directory) { + positionalArgs = [...positionalArgs, directory]; + } + break; + default: + break; + } + let queryLogDir; + if (name === "codeql_query_run" || name === "codeql_test_run") { + queryLogDir = getOrCreateLogDirectory(customLogDir); + logger.info(`Using log directory for ${name}: ${queryLogDir}`); + const timestampPath = join5(queryLogDir, "timestamp"); + writeFileSync2(timestampPath, Date.now().toString(), "utf8"); + options.logdir = queryLogDir; + if (!options.verbosity) { + options.verbosity = "progress+"; + } + if (name === "codeql_query_run") { + if (!options["evaluator-log"]) { + options["evaluator-log"] = join5(queryLogDir, "evaluator-log.jsonl"); + } + if (!options.output) { + options.output = join5(queryLogDir, "results.bqrs"); + } + } + } + let result; + if (command === "codeql") { + let cwd; + if ((name === "codeql_pack_install" || name === "codeql_pack_ls") && (dir || packDir)) { + const rawCwd = dir || packDir; + cwd = isAbsolute4(rawCwd) ? rawCwd : resolve4(getUserWorkspaceDir(), rawCwd); + } + const defaultExamplesPath = resolve4(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") { + options["keep-databases"] = true; + } + result = await executeCodeQLCommand(subcommand, options, positionalArgs, cwd); + } else if (command === "qlt") { + result = await executeQLTCommand(subcommand, options, positionalArgs); + } else { + throw new Error(`Unsupported command: ${command}`); + } + if (name === "codeql_query_run" && result.success && queryLogDir) { + const bqrsPath = options.output; + const sarifPath = join5(queryLogDir, "results.sarif"); + if (existsSync4(bqrsPath)) { + try { + const sarifResult = await executeCodeQLCommand( + "bqrs interpret", + { format: "sarif-latest", output: sarifPath }, + [bqrsPath] + ); + if (sarifResult.success) { + logger.info(`Generated SARIF interpretation at ${sarifPath}`); + } + } catch (error) { + logger.warn(`Failed to generate SARIF interpretation: ${error}`); + } + } + result = await processQueryRunResults(result, params, logger); + } + const processedResult = resultProcessor(result, params); + return { + content: [{ + type: "text", + text: processedResult + }], + isError: !result.success + }; + } catch (error) { + logger.error(`Error in CLI tool ${name}:`, error); + return { + content: [{ + type: "text", + text: `Failed to execute CLI tool: ${error instanceof Error ? error.message : String(error)}` + }], + isError: true + }; + } finally { + for (const tempDir of tempDirsToCleanup) { + try { + rmSync(tempDir, { recursive: true, force: true }); + logger.info(`Cleaned up temporary directory: ${tempDir}`); + } catch (cleanupError) { + logger.error(`Failed to clean up temporary directory ${tempDir}:`, cleanupError); + } + } } } - if (!pairHasKey) return false; - if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey); - else return false; - } - return true; -} -function constructYamlOmap(data) { - return data !== null ? data : []; -} -var omap = new type("tag:yaml.org,2002:omap", { - kind: "sequence", - resolve: resolveYamlOmap, - construct: constructYamlOmap -}); -var _toString$1 = Object.prototype.toString; -function resolveYamlPairs(data) { - if (data === null) return true; - var index, length, pair, keys, result, object = data; - result = new Array(object.length); - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - if (_toString$1.call(pair) !== "[object Object]") return false; - keys = Object.keys(pair); - if (keys.length !== 1) return false; - result[index] = [keys[0], pair[keys[0]]]; - } - return true; -} -function constructYamlPairs(data) { - if (data === null) return []; - var index, length, pair, keys, result, object = data; - result = new Array(object.length); - for (index = 0, length = object.length; index < length; index += 1) { - pair = object[index]; - keys = Object.keys(pair); - result[index] = [keys[0], pair[keys[0]]]; - } - return result; -} -var pairs = new type("tag:yaml.org,2002:pairs", { - kind: "sequence", - resolve: resolveYamlPairs, - construct: constructYamlPairs -}); -var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; -function resolveYamlSet(data) { - if (data === null) return true; - var key, object = data; - for (key in object) { - if (_hasOwnProperty$2.call(object, key)) { - if (object[key] !== null) return false; - } - } - return true; -} -function constructYamlSet(data) { - return data !== null ? data : {}; -} -var set = new type("tag:yaml.org,2002:set", { - kind: "mapping", - resolve: resolveYamlSet, - construct: constructYamlSet -}); -var _default = core.extend({ - implicit: [ - timestamp, - merge - ], - explicit: [ - binary, - omap, - pairs, - set - ] -}); -var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; -var CONTEXT_FLOW_IN = 1; -var CONTEXT_FLOW_OUT = 2; -var CONTEXT_BLOCK_IN = 3; -var CONTEXT_BLOCK_OUT = 4; -var CHOMPING_CLIP = 1; -var CHOMPING_STRIP = 2; -var CHOMPING_KEEP = 3; -var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; -var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; -var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; -var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; -var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; -function _class(obj) { - return Object.prototype.toString.call(obj); -} -function is_EOL(c) { - return c === 10 || c === 13; -} -function is_WHITE_SPACE(c) { - return c === 9 || c === 32; -} -function is_WS_OR_EOL(c) { - return c === 9 || c === 32 || c === 10 || c === 13; -} -function is_FLOW_INDICATOR(c) { - return c === 44 || c === 91 || c === 93 || c === 123 || c === 125; -} -function fromHexCode(c) { - var lc; - if (48 <= c && c <= 57) { - return c - 48; - } - lc = c | 32; - if (97 <= lc && lc <= 102) { - return lc - 97 + 10; - } - return -1; + ); } -function escapedHexLen(c) { - if (c === 120) { - return 2; - } - if (c === 117) { - return 4; - } - if (c === 85) { - return 8; +var createCodeQLSchemas = { + database: () => z.string().describe("Path to the CodeQL database"), + query: () => z.string().describe("Path to the CodeQL query file (.ql)"), + output: () => z.string().optional().describe("Output file path"), + outputFormat: () => z.enum(["csv", "json", "bqrs", "sarif-latest", "sarifv2.1.0"]).optional().describe("Output format for results"), + language: () => z.string().optional().describe("Programming language"), + threads: () => z.number().optional().describe("Number of threads to use"), + ram: () => z.number().optional().describe("Amount of RAM to use (MB)"), + timeout: () => z.number().optional().describe("Timeout in seconds"), + verbose: () => z.boolean().optional().describe("Enable verbose output"), + additionalArgs: () => z.array(z.string()).optional().describe("Additional command-line arguments"), + positionalArgs: () => z.array(z.string()).optional().describe("Positional arguments").transform((val) => ({ _positional: val })) +}; +var createBQRSResultProcessor = () => (result, params) => { + if (!result.success) { + return defaultCLIResultProcessor(result, params); } - return 0; -} -function fromDecimalCode(c) { - if (48 <= c && c <= 57) { - return c - 48; + let output = result.stdout; + if (params.output) { + output += ` + +Results saved to: ${params.output}`; } - return -1; -} -function simpleEscapeSequence(c) { - return c === 48 ? "\0" : c === 97 ? "\x07" : c === 98 ? "\b" : c === 116 ? " " : c === 9 ? " " : c === 110 ? "\n" : c === 118 ? "\v" : c === 102 ? "\f" : c === 114 ? "\r" : c === 101 ? "\x1B" : c === 32 ? " " : c === 34 ? '"' : c === 47 ? "/" : c === 92 ? "\\" : c === 78 ? "\x85" : c === 95 ? "\xA0" : c === 76 ? "\u2028" : c === 80 ? "\u2029" : ""; -} -function charFromCodepoint(c) { - if (c <= 65535) { - return String.fromCharCode(c); + if (result.stderr) { + output += ` + +Additional information: +${result.stderr}`; } - return String.fromCharCode( - (c - 65536 >> 10) + 55296, - (c - 65536 & 1023) + 56320 - ); -} -function setProperty(object, key, value) { - if (key === "__proto__") { - Object.defineProperty(object, key, { - configurable: true, - enumerable: true, - writable: true, - value - }); - } else { - object[key] = value; + return output; +}; +var createDatabaseResultProcessor = () => (result, params) => { + if (!result.success) { + return defaultCLIResultProcessor(result, params); } -} -var simpleEscapeCheck = new Array(256); -var simpleEscapeMap = new Array(256); -for (i = 0; i < 256; i++) { - simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; - simpleEscapeMap[i] = simpleEscapeSequence(i); -} -var i; -function State$1(input, options) { - this.input = input; - this.filename = options["filename"] || null; - this.schema = options["schema"] || _default; - this.onWarning = options["onWarning"] || null; - this.legacy = options["legacy"] || false; - this.json = options["json"] || false; - this.listener = options["listener"] || null; - this.implicitTypes = this.schema.compiledImplicit; - this.typeMap = this.schema.compiledTypeMap; - this.length = input.length; - this.position = 0; - this.line = 0; - this.lineStart = 0; - this.lineIndent = 0; - this.firstTabInLine = -1; - this.documents = []; -} -function generateError(state, message) { - var mark = { - name: state.filename, - buffer: state.input.slice(0, -1), - // omit trailing \0 - position: state.position, - line: state.line, - column: state.position - state.lineStart - }; - mark.snippet = snippet(mark); - return new exception(message, mark); -} -function throwError(state, message) { - throw generateError(state, message); -} -function throwWarning(state, message) { - if (state.onWarning) { - state.onWarning.call(null, generateError(state, message)); + let output = "Database creation completed successfully"; + if (params.database || params._positional) { + const dbPath = params.database || (Array.isArray(params._positional) ? params._positional[0] : params._positional); + output += ` + +Database location: ${dbPath}`; } -} -var directiveHandlers = { - YAML: function handleYamlDirective(state, name, args) { - var match, major, minor; - if (state.version !== null) { - throwError(state, "duplication of %YAML directive"); + if (result.stdout) { + output += ` + +Output: +${result.stdout}`; + } + if (result.stderr) { + output += ` + +Additional information: +${result.stderr}`; + } + return output; +}; +async function resolveQueryPath(params, logger2) { + const { queryName, queryLanguage, queryPack, query } = params; + if (queryName && query) { + logger2.error('Cannot use both "query" and "queryName" parameters simultaneously. Use either "query" for direct file path OR "queryName" + "queryLanguage" for tool queries.'); + throw new Error('Cannot use both "query" and "queryName" parameters simultaneously. Use either "query" for direct file path OR "queryName" + "queryLanguage" for tool queries.'); + } + if (!queryName) { + return query || null; + } + if (!queryLanguage) { + logger2.error("queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift"); + throw new Error("queryLanguage is required when using queryName parameter. Supported languages: actions, cpp, csharp, go, java, javascript, python, ruby, swift"); + } + try { + 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)); + const resolveResult = await executeCodeQLCommand2( + "resolve queries", + { format: "json" }, + [packPath] + ); + if (!resolveResult.success) { + logger2.error("Failed to resolve queries:", resolveResult.stderr || resolveResult.error); + throw new Error(`Failed to resolve queries: ${resolveResult.stderr || resolveResult.error}`); } - if (args.length !== 1) { - throwError(state, "YAML directive accepts exactly one argument"); + let resolvedQueries; + try { + resolvedQueries = JSON.parse(resolveResult.stdout); + } catch (parseError) { + logger2.error("Failed to parse resolve queries output:", parseError); + throw new Error("Failed to parse resolve queries output"); } - match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); - if (match === null) { - throwError(state, "ill-formed argument of the YAML directive"); + const matchingQuery = resolvedQueries.find((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) => basename2(q))); + throw new Error(`Query "${queryName}.ql" not found in pack "${packPath}"`); } - major = parseInt(match[1], 10); - minor = parseInt(match[2], 10); - if (major !== 1) { - throwError(state, "unacceptable YAML version of the document"); + logger2.info(`Resolved query "${queryName}" to: ${matchingQuery}`); + return matchingQuery; + } catch (error) { + logger2.error("Error resolving query path:", error); + throw error; + } +} +async function interpretBQRSFile(bqrsPath, queryPath, format, outputPath, logger2) { + try { + const metadata = await extractQueryMetadata(queryPath); + const missingFields = []; + if (!metadata.id) missingFields.push("id"); + if (!metadata.kind) missingFields.push("kind"); + if (missingFields.length > 0) { + return { + success: false, + exitCode: 1, + stdout: "", + stderr: "", + error: `Query metadata is incomplete. Missing required field(s): ${missingFields.join(", ")}. Ensure the query file contains @id and @kind metadata.` + }; } - state.version = args[0]; - state.checkLineBreaks = minor < 2; - if (minor !== 1 && minor !== 2) { - throwWarning(state, "unsupported YAML version of the document"); + const sanitizedKind = (metadata.kind || "").replace(/[^a-zA-Z0-9_-]/g, ""); + const sanitizedId = (metadata.id || "").replace(/[^a-zA-Z0-9_/:-]/g, ""); + const graphFormats = ["graphtext", "dgml", "dot"]; + if (graphFormats.includes(format) && metadata.kind !== "graph") { + return { + success: false, + exitCode: 1, + stdout: "", + stderr: "", + error: `Format '${format}' is only compatible with @kind graph queries, but this query has @kind ${metadata.kind}` + }; } - }, - TAG: function handleTagDirective(state, name, args) { - var handle, prefix; - if (args.length !== 2) { - throwError(state, "TAG directive accepts exactly two arguments"); + mkdirSync5(dirname4(outputPath), { recursive: true }); + const params = { + format, + output: outputPath, + t: [`kind=${sanitizedKind}`, `id=${sanitizedId}`] + }; + logger2.info(`Interpreting BQRS file ${bqrsPath} with format ${format} to ${outputPath}`); + const result = await executeCodeQLCommand( + "bqrs interpret", + params, + [bqrsPath] + ); + return result; + } catch (error) { + return { + success: false, + exitCode: 1, + stdout: "", + stderr: "", + error: `Failed to interpret BQRS file: ${error}` + }; + } +} +function getDefaultExtension(format) { + switch (format) { + case "sarif-latest": + case "sarifv2.1.0": + return ".sarif"; + case "csv": + return ".csv"; + case "graphtext": + return ".txt"; + case "dgml": + return ".dgml"; + case "dot": + return ".dot"; + default: + return ".txt"; + } +} +async function processQueryRunResults(result, params, logger2) { + try { + const { format, interpretedOutput, evaluationFunction, evaluationOutput, output, query, queryName, queryLanguage } = params; + if (!format && !evaluationFunction) { + return result; } - handle = args[0]; - prefix = args[1]; - if (!PATTERN_TAG_HANDLE.test(handle)) { - throwError(state, "ill-formed tag handle (first argument) of the TAG directive"); + if (!output) { + return result; } - if (_hasOwnProperty$1.call(state.tagMap, handle)) { - throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); + const bqrsPath = output; + let queryPath = null; + if (query) { + queryPath = query; + } else if (queryName && queryLanguage) { + queryPath = await resolveQueryPath(params, logger2); } - if (!PATTERN_TAG_URI.test(prefix)) { - throwError(state, "ill-formed tag prefix (second argument) of the TAG directive"); + if (!queryPath) { + logger2.error("Cannot determine query path for interpretation/evaluation"); + return { + ...result, + stdout: result.stdout + "\n\nWarning: Query interpretation skipped - could not determine query path" + }; } - try { - prefix = decodeURIComponent(prefix); - } catch (err) { - throwError(state, "tag prefix is malformed: " + prefix); + if (format) { + const outputFormat = format; + let outputFilePath = interpretedOutput; + if (!outputFilePath) { + const ext = getDefaultExtension(outputFormat); + outputFilePath = bqrsPath.replace(".bqrs", ext); + } + logger2.info(`Interpreting query results from ${bqrsPath} with format: ${outputFormat}`); + const interpretResult = await interpretBQRSFile( + bqrsPath, + queryPath, + outputFormat, + outputFilePath, + logger2 + ); + if (interpretResult.success) { + let enhancedOutput = result.stdout; + enhancedOutput += ` + +Query results interpreted successfully with format: ${outputFormat}`; + enhancedOutput += ` +Interpreted output saved to: ${outputFilePath}`; + return { + ...result, + stdout: enhancedOutput + }; + } else { + logger2.error("Query interpretation failed:", interpretResult.error); + return { + ...result, + stdout: result.stdout + ` + +Warning: Query interpretation failed - ${interpretResult.error || interpretResult.stderr}` + }; + } } - state.tagMap[handle] = prefix; - } -}; -function captureSegment(state, start, end, checkJson) { - var _position, _length, _character, _result; - if (start < end) { - _result = state.input.slice(start, end); - if (checkJson) { - for (_position = 0, _length = _result.length; _position < _length; _position += 1) { - _character = _result.charCodeAt(_position); - if (!(_character === 9 || 32 <= _character && _character <= 1114111)) { - throwError(state, "expected valid JSON character"); + if (evaluationFunction) { + logger2.info(`Using deprecated evaluationFunction parameter. Consider using format parameter instead.`); + logger2.info(`Evaluating query results from ${bqrsPath} using function: ${evaluationFunction}`); + const evaluationResult = await evaluateQueryResults( + bqrsPath, + queryPath, + evaluationFunction, + evaluationOutput + ); + if (evaluationResult.success) { + let enhancedOutput = result.stdout; + if (evaluationResult.outputPath) { + enhancedOutput += ` + +Query evaluation completed successfully.`; + enhancedOutput += ` +Evaluation output saved to: ${evaluationResult.outputPath}`; + } + if (evaluationResult.content) { + enhancedOutput += ` + +=== Query Results Evaluation === +`; + enhancedOutput += evaluationResult.content; } + return { + ...result, + stdout: enhancedOutput + }; + } else { + logger2.error("Query evaluation failed:", evaluationResult.error); + return { + ...result, + stdout: result.stdout + ` + +Warning: Query evaluation failed - ${evaluationResult.error}` + }; } - } else if (PATTERN_NON_PRINTABLE.test(_result)) { - throwError(state, "the stream contains non-printable characters"); - } - state.result += _result; - } -} -function mergeMappings(state, destination, source, overridableKeys) { - var sourceKeys, key, index, quantity; - if (!common.isObject(source)) { - throwError(state, "cannot merge mappings; the provided source object is unacceptable"); - } - sourceKeys = Object.keys(source); - for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { - key = sourceKeys[index]; - if (!_hasOwnProperty$1.call(destination, key)) { - setProperty(destination, key, source[key]); - overridableKeys[key] = true; } + return result; + } catch (error) { + logger2.error("Error in query results processing:", error); + return { + ...result, + stdout: result.stdout + ` + +Warning: Query processing error - ${error}` + }; } } -function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startLineStart, startPos) { - var index, quantity; - if (Array.isArray(keyNode)) { - keyNode = Array.prototype.slice.call(keyNode); - for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { - if (Array.isArray(keyNode[index])) { - throwError(state, "nested arrays are not supported inside keys"); - } - if (typeof keyNode === "object" && _class(keyNode[index]) === "[object Object]") { - keyNode[index] = "[object Object]"; - } - } - } - if (typeof keyNode === "object" && _class(keyNode) === "[object Object]") { - keyNode = "[object Object]"; - } - keyNode = String(keyNode); - if (_result === null) { - _result = {}; - } - if (keyTag === "tag:yaml.org,2002:merge") { - if (Array.isArray(valueNode)) { - for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { - mergeMappings(state, _result, valueNode[index], overridableKeys); + +// src/tools/codeql/bqrs-decode.ts +var codeqlBqrsDecodeTool = { + name: "codeql_bqrs_decode", + description: "Decode BQRS result files to human-readable formats", + command: "codeql", + subcommand: "bqrs decode", + inputSchema: { + files: z2.array(z2.string()).describe("BQRS file(s) to decode"), + output: createCodeQLSchemas.output(), + format: z2.enum(["csv", "json"]).optional().describe("Output format"), + "max-paths": z2.number().optional().describe("Maximum number of paths to output"), + "start-at": z2.number().optional().describe("Start output at result number"), + "max-results": z2.number().optional().describe("Maximum number of results"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql bqrs decode --format=csv --output=results.csv results.bqrs", + "codeql bqrs decode --format=json --max-results=100 results.bqrs" + ], + resultProcessor: createBQRSResultProcessor() +}; + +// src/tools/codeql/bqrs-info.ts +import { z as z3 } from "zod"; +var codeqlBqrsInfoTool = { + name: "codeql_bqrs_info", + description: "Get metadata and information about BQRS result files", + command: "codeql", + subcommand: "bqrs info", + inputSchema: { + files: z3.array(z3.string()).describe("BQRS file(s) to examine"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql bqrs info results.bqrs", + "codeql bqrs info --verbose results.bqrs" + ], + resultProcessor: createBQRSResultProcessor() +}; + +// src/tools/codeql/bqrs-interpret.ts +import { z as z4 } from "zod"; +var codeqlBqrsInterpretTool = { + name: "codeql_bqrs_interpret", + description: "Interpret BQRS result files according to query metadata and generate output in specified formats (CSV, SARIF, graph formats)", + command: "codeql", + subcommand: "bqrs interpret", + inputSchema: { + file: z4.string().describe("The BQRS file to interpret"), + format: z4.enum(["csv", "sarif-latest", "sarifv2.1.0", "graphtext", "dgml", "dot"]).describe("Output format: csv (comma-separated), sarif-latest/sarifv2.1.0 (SARIF), graphtext/dgml/dot (graph formats, only for @kind graph queries)"), + output: createCodeQLSchemas.output(), + t: z4.array(z4.string()).describe('Query metadata key=value pairs. At least "kind" and "id" must be specified (e.g., ["kind=graph", "id=js/print-ast"])'), + "max-paths": z4.number().optional().describe("Maximum number of paths to produce for each alert with paths (default: 4)"), + "sarif-add-file-contents": z4.boolean().optional().describe("[SARIF only] Include full file contents for all files referenced in results"), + "sarif-add-snippets": z4.boolean().optional().describe("[SARIF only] Include code snippets for each location with context"), + "sarif-group-rules-by-pack": z4.boolean().optional().describe("[SARIF only] Place rule objects under their QL pack in tool.extensions property"), + "sarif-multicause-markdown": z4.boolean().optional().describe("[SARIF only] Include multi-cause alerts as Markdown-formatted lists"), + "sarif-category": z4.string().optional().describe("[SARIF only] Category for this analysis (distinguishes multiple analyses on same code)"), + "csv-location-format": z4.enum(["uri", "line-column", "offset-length"]).optional().describe("[CSV only] Format for locations in CSV output (default: line-column)"), + "dot-location-url-format": z4.string().optional().describe("[DOT only] Format string for file location URLs (placeholders: {path}, {start:line}, {start:column}, {end:line}, {end:column}, {offset}, {length})"), + threads: z4.number().optional().describe("Number of threads for computing paths (0 = one per core, -N = leave N cores unused)"), + "column-kind": z4.enum(["utf8", "utf16", "utf32", "bytes"]).optional().describe("[SARIF only] Column kind for interpreting location columns"), + "unicode-new-lines": z4.boolean().optional().describe("[SARIF only] Whether unicode newlines (U+2028, U+2029) are considered as newlines"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql bqrs interpret --format=sarif-latest --output=results.sarif -t kind=problem -t id=js/sql-injection results.bqrs", + "codeql bqrs interpret --format=graphtext --output=ast.txt -t kind=graph -t id=js/print-ast results.bqrs", + "codeql bqrs interpret --format=csv --csv-location-format=line-column --output=results.csv -t kind=problem -t id=js/xss results.bqrs", + "codeql bqrs interpret --format=dot --output=graph.dot -t kind=graph -t id=java/call-graph results.bqrs", + "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" + ], + resultProcessor: createBQRSResultProcessor() +}; + +// src/tools/codeql/database-analyze.ts +import { z as z5 } from "zod"; +var codeqlDatabaseAnalyzeTool = { + name: "codeql_database_analyze", + description: "Run queries or query suites against CodeQL databases", + command: "codeql", + subcommand: "database analyze", + inputSchema: { + database: z5.string().describe("Path to the CodeQL database"), + queries: z5.string().describe("Queries or query suite to run"), + output: z5.string().optional().describe("Output file path"), + format: z5.enum(["csv", "json", "sarif-latest", "sarifv2.1.0"]).optional().describe("Output format for results"), + "download-location": z5.string().optional().describe("Location to download missing dependencies"), + threads: z5.number().optional().describe("Number of threads to use"), + ram: z5.number().optional().describe("Amount of RAM to use (MB)"), + timeout: z5.number().optional().describe("Timeout in seconds"), + verbose: z5.boolean().optional().describe("Enable verbose output"), + additionalArgs: z5.array(z5.string()).optional().describe("Additional command-line arguments") + }, + examples: [ + "codeql database analyze mydb queries.qls --format=sarif-latest --output=results.sarif", + "codeql database analyze mydb codeql/java-queries --format=csv" + ] +}; + +// src/tools/codeql/database-create.ts +import { z as z6 } from "zod"; +var codeqlDatabaseCreateTool = { + name: "codeql_database_create", + description: "Create a CodeQL database from source code", + command: "codeql", + subcommand: "database create", + inputSchema: { + database: z6.string().describe("Database path/name to create"), + language: z6.string().optional().describe("Programming language(s) to extract"), + "source-root": z6.string().optional().describe("Root directory of source code"), + command: z6.string().optional().describe("Build command for compiled languages"), + "build-mode": z6.enum(["none", "autobuild", "manual"]).optional().describe("Build mode: none (interpreted langs), autobuild, or manual"), + threads: z6.number().optional().describe("Number of threads to use"), + ram: z6.number().optional().describe("Amount of RAM to use (MB)"), + verbose: z6.boolean().optional().describe("Enable verbose output"), + overwrite: z6.boolean().optional().describe("Overwrite existing database if it exists"), + "no-cleanup": z6.boolean().optional().describe("Skip database cleanup after finalization"), + additionalArgs: z6.array(z6.string()).optional().describe("Additional command-line arguments") + }, + examples: [ + "codeql database create --language=java --source-root=/path/to/project mydb", + 'codeql database create --language=cpp --command="make all" mydb', + "codeql database create --language=python,javascript mydb" + ], + resultProcessor: createDatabaseResultProcessor() +}; + +// src/tools/codeql/find-class-position.ts +init_logger(); +import { z as z7 } from "zod"; +import { readFile } from "fs/promises"; +async function findClassPosition(filepath, className) { + try { + const content = await readFile(filepath, "utf-8"); + const lines = content.split("\n"); + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const classNameRegex = new RegExp(`\\bclass\\s+(${className.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")})\\b`); + const match = classNameRegex.exec(line); + if (match) { + const start_line = i + 1; + const classNameStart = match.index + match[0].indexOf(match[1]); + const start_col = classNameStart + 1; + const end_col = start_col + className.length - 1; + return { + start_line, + start_col, + end_line: start_line, + end_col + }; } - } else { - mergeMappings(state, _result, valueNode, overridableKeys); } - } else { - if (!state.json && !_hasOwnProperty$1.call(overridableKeys, keyNode) && _hasOwnProperty$1.call(_result, keyNode)) { - state.line = startLine || state.line; - state.lineStart = startLineStart || state.lineStart; - state.position = startPos || state.position; - throwError(state, "duplicated mapping key"); + throw new Error(`Class name '${className}' not found in file: ${filepath}`); + } catch (error) { + if (error instanceof Error && error.message.includes("not found in file")) { + throw error; } - setProperty(_result, keyNode, valueNode); - delete overridableKeys[keyNode]; + throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : "Unknown error"}`); } - return _result; } -function readLineBreak(state) { - var ch; - ch = state.input.charCodeAt(state.position); - if (ch === 10) { - state.position++; - } else if (ch === 13) { - state.position++; - if (state.input.charCodeAt(state.position) === 10) { - state.position++; +function registerFindClassPositionTool(server) { + server.tool( + "find_class_position", + "Finds startline, startcol, endline endcol of a class for quickeval", + { + file: z7.string().describe("Path to the .ql file to search"), + name: z7.string().describe("Name of the class to find") + }, + async ({ file, name }) => { + try { + const position = await findClassPosition(file, name); + return { + content: [{ type: "text", text: JSON.stringify(position, null, 2) }] + }; + } catch (error) { + logger.error("Error finding class position:", error); + return { + content: [ + { + type: "text", + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + } + ], + isError: true + }; + } } - } else { - throwError(state, "a line break is expected"); - } - state.line += 1; - state.lineStart = state.position; - state.firstTabInLine = -1; + ); } -function skipSeparationSpace(state, allowComments, checkIndent) { - var lineBreaks = 0, ch = state.input.charCodeAt(state.position); - while (ch !== 0) { - while (is_WHITE_SPACE(ch)) { - if (ch === 9 && state.firstTabInLine === -1) { - state.firstTabInLine = state.position; + +// src/tools/codeql/find-predicate-position.ts +init_logger(); +import { z as z8 } from "zod"; +import { readFile as readFile2 } from "fs/promises"; +async function findPredicatePosition(filepath, predicateName) { + try { + const content = await readFile2(filepath, "utf-8"); + const lines = content.split("\n"); + const escapedName = predicateName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const predicateKeywordRegex = new RegExp(`\\bpredicate\\s+(${escapedName})\\s*\\(`); + let match = predicateKeywordRegex.exec(line); + if (!match) { + const returnTypeRegex = new RegExp(`(?:^|\\s)(?:abstract\\s+)?(?:cached\\s+)?(?:private\\s+)?(?:deprecated\\s+)?(?:\\w+)\\s+(${escapedName})\\s*\\(`); + match = returnTypeRegex.exec(line); + } + if (match) { + const start_line = i + 1; + const predicateNameStart = match.index + match[0].indexOf(match[1]); + const start_col = predicateNameStart + 1; + const end_col = start_col + predicateName.length - 1; + return { + start_line, + start_col, + end_line: start_line, + end_col + }; } - ch = state.input.charCodeAt(++state.position); } - if (allowComments && ch === 35) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 10 && ch !== 13 && ch !== 0); + throw new Error(`Predicate name '${predicateName}' not found in file: ${filepath}`); + } catch (error) { + if (error instanceof Error && error.message.includes("not found in file")) { + throw error; } - if (is_EOL(ch)) { - readLineBreak(state); - ch = state.input.charCodeAt(state.position); - lineBreaks++; - state.lineIndent = 0; - while (ch === 32) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); + throw new Error(`Failed to read or parse file ${filepath}: ${error instanceof Error ? error.message : "Unknown error"}`); + } +} +function registerFindPredicatePositionTool(server) { + server.tool( + "find_predicate_position", + "Finds startline, startcol, endline endcol of a predicate for quickeval", + { + file: z8.string().describe("Path to the .ql file to search"), + name: z8.string().describe("Name of the predicate to find") + }, + async ({ file, name }) => { + try { + const position = await findPredicatePosition(file, name); + return { + content: [{ type: "text", text: JSON.stringify(position, null, 2) }] + }; + } catch (error) { + logger.error("Error finding predicate position:", error); + return { + content: [ + { + type: "text", + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + } + ], + isError: true + }; } - } else { - break; } - } - if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { - throwWarning(state, "deficient indentation"); - } - return lineBreaks; + ); } -function testDocumentSeparator(state) { - var _position = state.position, ch; - ch = state.input.charCodeAt(_position); - if ((ch === 45 || ch === 46) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { - _position += 3; - ch = state.input.charCodeAt(_position); - if (ch === 0 || is_WS_OR_EOL(ch)) { - return true; + +// src/tools/codeql/find-query-files.ts +import { z as z9 } from "zod"; + +// src/lib/query-file-finder.ts +import * as fs from "fs"; +import * as path from "path"; + +// ../node_modules/js-yaml/dist/js-yaml.mjs +function isNothing(subject) { + return typeof subject === "undefined" || subject === null; +} +function isObject(subject) { + return typeof subject === "object" && subject !== null; +} +function toArray(sequence) { + if (Array.isArray(sequence)) return sequence; + else if (isNothing(sequence)) return []; + return [sequence]; +} +function extend(target, source) { + var index, length, key, sourceKeys; + if (source) { + sourceKeys = Object.keys(source); + for (index = 0, length = sourceKeys.length; index < length; index += 1) { + key = sourceKeys[index]; + target[key] = source[key]; } } - return false; + return target; } -function writeFoldedLines(state, count) { - if (count === 1) { - state.result += " "; - } else if (count > 1) { - state.result += common.repeat("\n", count - 1); +function repeat(string, count) { + var result = "", cycle; + for (cycle = 0; cycle < count; cycle += 1) { + result += string; } + return result; } -function readPlainScalar(state, nodeIndent, withinFlowCollection) { - var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state.kind, _result = state.result, ch; - ch = state.input.charCodeAt(state.position); - if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96) { - return false; +function isNegativeZero(number) { + return number === 0 && Number.NEGATIVE_INFINITY === 1 / number; +} +var isNothing_1 = isNothing; +var isObject_1 = isObject; +var toArray_1 = toArray; +var repeat_1 = repeat; +var isNegativeZero_1 = isNegativeZero; +var extend_1 = extend; +var common = { + isNothing: isNothing_1, + isObject: isObject_1, + toArray: toArray_1, + repeat: repeat_1, + isNegativeZero: isNegativeZero_1, + extend: extend_1 +}; +function formatError(exception2, compact) { + var where = "", message = exception2.reason || "(unknown reason)"; + if (!exception2.mark) return message; + if (exception2.mark.name) { + where += 'in "' + exception2.mark.name + '" '; } - if (ch === 63 || ch === 45) { - following = state.input.charCodeAt(state.position + 1); - if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { - return false; - } + where += "(" + (exception2.mark.line + 1) + ":" + (exception2.mark.column + 1) + ")"; + if (!compact && exception2.mark.snippet) { + where += "\n\n" + exception2.mark.snippet; } - state.kind = "scalar"; - state.result = ""; - captureStart = captureEnd = state.position; - hasPendingContent = false; - while (ch !== 0) { - if (ch === 58) { - following = state.input.charCodeAt(state.position + 1); - if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { - break; - } - } else if (ch === 35) { - preceding = state.input.charCodeAt(state.position - 1); - if (is_WS_OR_EOL(preceding)) { - break; - } - } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { - break; - } else if (is_EOL(ch)) { - _line = state.line; - _lineStart = state.lineStart; - _lineIndent = state.lineIndent; - skipSeparationSpace(state, false, -1); - if (state.lineIndent >= nodeIndent) { - hasPendingContent = true; - ch = state.input.charCodeAt(state.position); - continue; - } else { - state.position = captureEnd; - state.line = _line; - state.lineStart = _lineStart; - state.lineIndent = _lineIndent; - break; - } - } - if (hasPendingContent) { - captureSegment(state, captureStart, captureEnd, false); - writeFoldedLines(state, state.line - _line); - captureStart = captureEnd = state.position; - hasPendingContent = false; - } - if (!is_WHITE_SPACE(ch)) { - captureEnd = state.position + 1; - } - ch = state.input.charCodeAt(++state.position); + return message + " " + where; +} +function YAMLException$1(reason, mark) { + Error.call(this); + this.name = "YAMLException"; + this.reason = reason; + this.mark = mark; + this.message = formatError(this, false); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + this.stack = new Error().stack || ""; + } +} +YAMLException$1.prototype = Object.create(Error.prototype); +YAMLException$1.prototype.constructor = YAMLException$1; +YAMLException$1.prototype.toString = function toString(compact) { + return this.name + ": " + formatError(this, compact); +}; +var exception = YAMLException$1; +function getLine(buffer, lineStart, lineEnd, position, maxLineLength) { + var head = ""; + var tail = ""; + var maxHalfLength = Math.floor(maxLineLength / 2) - 1; + if (position - lineStart > maxHalfLength) { + head = " ... "; + lineStart = position - maxHalfLength + head.length; } - captureSegment(state, captureStart, captureEnd, false); - if (state.result) { - return true; + if (lineEnd - position > maxHalfLength) { + tail = " ..."; + lineEnd = position + maxHalfLength - tail.length; } - state.kind = _kind; - state.result = _result; - return false; + return { + str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, "\u2192") + tail, + pos: position - lineStart + head.length + // relative position + }; } -function readSingleQuotedScalar(state, nodeIndent) { - var ch, captureStart, captureEnd; - ch = state.input.charCodeAt(state.position); - if (ch !== 39) { - return false; - } - state.kind = "scalar"; - state.result = ""; - state.position++; - captureStart = captureEnd = state.position; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 39) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - if (ch === 39) { - captureStart = state.position; - state.position++; - captureEnd = state.position; - } else { - return true; - } - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, "unexpected end of the document within a single quoted scalar"); - } else { - state.position++; - captureEnd = state.position; +function padStart(string, max) { + return common.repeat(" ", max - string.length) + string; +} +function makeSnippet(mark, options) { + options = Object.create(options || null); + if (!mark.buffer) return null; + if (!options.maxLength) options.maxLength = 79; + if (typeof options.indent !== "number") options.indent = 1; + if (typeof options.linesBefore !== "number") options.linesBefore = 3; + if (typeof options.linesAfter !== "number") options.linesAfter = 2; + var re = /\r?\n|\r|\0/g; + var lineStarts = [0]; + var lineEnds = []; + var match; + var foundLineNo = -1; + while (match = re.exec(mark.buffer)) { + lineEnds.push(match.index); + lineStarts.push(match.index + match[0].length); + if (mark.position <= match.index && foundLineNo < 0) { + foundLineNo = lineStarts.length - 2; } } - throwError(state, "unexpected end of the stream within a single quoted scalar"); -} -function readDoubleQuotedScalar(state, nodeIndent) { - var captureStart, captureEnd, hexLength, hexResult, tmp, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 34) { - return false; + if (foundLineNo < 0) foundLineNo = lineStarts.length - 1; + var result = "", i, line; + var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length; + var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3); + for (i = 1; i <= options.linesBefore; i++) { + if (foundLineNo - i < 0) break; + line = getLine( + mark.buffer, + lineStarts[foundLineNo - i], + lineEnds[foundLineNo - i], + mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]), + maxLineLength + ); + result = common.repeat(" ", options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) + " | " + line.str + "\n" + result; } - state.kind = "scalar"; - state.result = ""; - state.position++; - captureStart = captureEnd = state.position; - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - if (ch === 34) { - captureSegment(state, captureStart, state.position, true); - state.position++; - return true; - } else if (ch === 92) { - captureSegment(state, captureStart, state.position, true); - ch = state.input.charCodeAt(++state.position); - if (is_EOL(ch)) { - skipSeparationSpace(state, false, nodeIndent); - } else if (ch < 256 && simpleEscapeCheck[ch]) { - state.result += simpleEscapeMap[ch]; - state.position++; - } else if ((tmp = escapedHexLen(ch)) > 0) { - hexLength = tmp; - hexResult = 0; - for (; hexLength > 0; hexLength--) { - ch = state.input.charCodeAt(++state.position); - if ((tmp = fromHexCode(ch)) >= 0) { - hexResult = (hexResult << 4) + tmp; - } else { - throwError(state, "expected hexadecimal character"); - } - } - state.result += charFromCodepoint(hexResult); - state.position++; - } else { - throwError(state, "unknown escape sequence"); - } - captureStart = captureEnd = state.position; - } else if (is_EOL(ch)) { - captureSegment(state, captureStart, captureEnd, true); - writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); - captureStart = captureEnd = state.position; - } else if (state.position === state.lineStart && testDocumentSeparator(state)) { - throwError(state, "unexpected end of the document within a double quoted scalar"); - } else { - state.position++; - captureEnd = state.position; - } + line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength); + result += common.repeat(" ", options.indent) + padStart((mark.line + 1).toString(), lineNoLength) + " | " + line.str + "\n"; + result += common.repeat("-", options.indent + lineNoLength + 3 + line.pos) + "^\n"; + for (i = 1; i <= options.linesAfter; i++) { + if (foundLineNo + i >= lineEnds.length) break; + line = getLine( + mark.buffer, + lineStarts[foundLineNo + i], + lineEnds[foundLineNo + i], + mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]), + maxLineLength + ); + result += common.repeat(" ", options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) + " | " + line.str + "\n"; } - throwError(state, "unexpected end of the stream within a double quoted scalar"); + return result.replace(/\n$/, ""); } -function readFlowCollection(state, nodeIndent) { - var readNext = true, _line, _lineStart, _pos, _tag = state.tag, _result, _anchor = state.anchor, following, terminator, isPair, isExplicitPair, isMapping, overridableKeys = /* @__PURE__ */ Object.create(null), keyNode, keyTag, valueNode, ch; - ch = state.input.charCodeAt(state.position); - if (ch === 91) { - terminator = 93; - isMapping = false; - _result = []; - } else if (ch === 123) { - terminator = 125; - isMapping = true; - _result = {}; - } else { - return false; - } - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; +var snippet = makeSnippet; +var TYPE_CONSTRUCTOR_OPTIONS = [ + "kind", + "multi", + "resolve", + "construct", + "instanceOf", + "predicate", + "represent", + "representName", + "defaultStyle", + "styleAliases" +]; +var YAML_NODE_KINDS = [ + "scalar", + "sequence", + "mapping" +]; +function compileStyleAliases(map2) { + var result = {}; + if (map2 !== null) { + Object.keys(map2).forEach(function(style) { + map2[style].forEach(function(alias) { + result[String(alias)] = style; + }); + }); } - ch = state.input.charCodeAt(++state.position); - while (ch !== 0) { - skipSeparationSpace(state, true, nodeIndent); - ch = state.input.charCodeAt(state.position); - if (ch === terminator) { - state.position++; - state.tag = _tag; - state.anchor = _anchor; - state.kind = isMapping ? "mapping" : "sequence"; - state.result = _result; - return true; - } else if (!readNext) { - throwError(state, "missed comma between flow collection entries"); - } else if (ch === 44) { - throwError(state, "expected the node content, but found ','"); - } - keyTag = keyNode = valueNode = null; - isPair = isExplicitPair = false; - if (ch === 63) { - following = state.input.charCodeAt(state.position + 1); - if (is_WS_OR_EOL(following)) { - isPair = isExplicitPair = true; - state.position++; - skipSeparationSpace(state, true, nodeIndent); - } - } - _line = state.line; - _lineStart = state.lineStart; - _pos = state.position; - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - keyTag = state.tag; - keyNode = state.result; - skipSeparationSpace(state, true, nodeIndent); - ch = state.input.charCodeAt(state.position); - if ((isExplicitPair || state.line === _line) && ch === 58) { - isPair = true; - ch = state.input.charCodeAt(++state.position); - skipSeparationSpace(state, true, nodeIndent); - composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); - valueNode = state.result; + return result; +} +function Type$1(tag, options) { + options = options || {}; + Object.keys(options).forEach(function(name) { + if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { + throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); } - if (isMapping) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos); - } else if (isPair) { - _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos)); - } else { - _result.push(keyNode); + }); + this.options = options; + this.tag = tag; + this.kind = options["kind"] || null; + this.resolve = options["resolve"] || function() { + return true; + }; + this.construct = options["construct"] || function(data) { + return data; + }; + this.instanceOf = options["instanceOf"] || null; + this.predicate = options["predicate"] || null; + this.represent = options["represent"] || null; + this.representName = options["representName"] || null; + this.defaultStyle = options["defaultStyle"] || null; + this.multi = options["multi"] || false; + this.styleAliases = compileStyleAliases(options["styleAliases"] || null); + if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { + throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + } +} +var type = Type$1; +function compileList(schema2, name) { + var result = []; + schema2[name].forEach(function(currentType) { + var newIndex = result.length; + result.forEach(function(previousType, previousIndex) { + if (previousType.tag === currentType.tag && previousType.kind === currentType.kind && previousType.multi === currentType.multi) { + newIndex = previousIndex; + } + }); + result[newIndex] = currentType; + }); + return result; +} +function compileMap() { + var result = { + scalar: {}, + sequence: {}, + mapping: {}, + fallback: {}, + multi: { + scalar: [], + sequence: [], + mapping: [], + fallback: [] } - skipSeparationSpace(state, true, nodeIndent); - ch = state.input.charCodeAt(state.position); - if (ch === 44) { - readNext = true; - ch = state.input.charCodeAt(++state.position); + }, index, length; + function collectType(type2) { + if (type2.multi) { + result.multi[type2.kind].push(type2); + result.multi["fallback"].push(type2); } else { - readNext = false; + result[type2.kind][type2.tag] = result["fallback"][type2.tag] = type2; } } - throwError(state, "unexpected end of the stream within a flow collection"); + for (index = 0, length = arguments.length; index < length; index += 1) { + arguments[index].forEach(collectType); + } + return result; } -function readBlockScalar(state, nodeIndent) { - var captureStart, folding, chomping = CHOMPING_CLIP, didReadContent = false, detectedIndent = false, textIndent = nodeIndent, emptyLines = 0, atMoreIndented = false, tmp, ch; - ch = state.input.charCodeAt(state.position); - if (ch === 124) { - folding = false; - } else if (ch === 62) { - folding = true; +function Schema$1(definition) { + return this.extend(definition); +} +Schema$1.prototype.extend = function extend2(definition) { + var implicit = []; + var explicit = []; + if (definition instanceof type) { + explicit.push(definition); + } else if (Array.isArray(definition)) { + explicit = explicit.concat(definition); + } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) { + if (definition.implicit) implicit = implicit.concat(definition.implicit); + if (definition.explicit) explicit = explicit.concat(definition.explicit); } else { - return false; + throw new exception("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })"); } - state.kind = "scalar"; - state.result = ""; - while (ch !== 0) { - ch = state.input.charCodeAt(++state.position); - if (ch === 43 || ch === 45) { - if (CHOMPING_CLIP === chomping) { - chomping = ch === 43 ? CHOMPING_KEEP : CHOMPING_STRIP; - } else { - throwError(state, "repeat of a chomping mode identifier"); - } - } else if ((tmp = fromDecimalCode(ch)) >= 0) { - if (tmp === 0) { - throwError(state, "bad explicit indentation width of a block scalar; it cannot be less than one"); - } else if (!detectedIndent) { - textIndent = nodeIndent + tmp - 1; - detectedIndent = true; - } else { - throwError(state, "repeat of an indentation width identifier"); - } - } else { - break; + implicit.forEach(function(type$1) { + if (!(type$1 instanceof type)) { + throw new exception("Specified list of YAML types (or a single Type object) contains a non-Type object."); } - } - if (is_WHITE_SPACE(ch)) { - do { - ch = state.input.charCodeAt(++state.position); - } while (is_WHITE_SPACE(ch)); - if (ch === 35) { - do { - ch = state.input.charCodeAt(++state.position); - } while (!is_EOL(ch) && ch !== 0); + if (type$1.loadKind && type$1.loadKind !== "scalar") { + throw new exception("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported."); + } + if (type$1.multi) { + throw new exception("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit."); + } + }); + explicit.forEach(function(type$1) { + if (!(type$1 instanceof type)) { + throw new exception("Specified list of YAML types (or a single Type object) contains a non-Type object."); } + }); + var result = Object.create(Schema$1.prototype); + result.implicit = (this.implicit || []).concat(implicit); + result.explicit = (this.explicit || []).concat(explicit); + result.compiledImplicit = compileList(result, "implicit"); + result.compiledExplicit = compileList(result, "explicit"); + result.compiledTypeMap = compileMap(result.compiledImplicit, result.compiledExplicit); + return result; +}; +var schema = Schema$1; +var str = new type("tag:yaml.org,2002:str", { + kind: "scalar", + construct: function(data) { + return data !== null ? data : ""; } - while (ch !== 0) { - readLineBreak(state); - state.lineIndent = 0; - ch = state.input.charCodeAt(state.position); - while ((!detectedIndent || state.lineIndent < textIndent) && ch === 32) { - state.lineIndent++; - ch = state.input.charCodeAt(++state.position); +}); +var seq = new type("tag:yaml.org,2002:seq", { + kind: "sequence", + construct: function(data) { + return data !== null ? data : []; + } +}); +var map = new type("tag:yaml.org,2002:map", { + kind: "mapping", + construct: function(data) { + return data !== null ? data : {}; + } +}); +var failsafe = new schema({ + explicit: [ + str, + seq, + map + ] +}); +function resolveYamlNull(data) { + if (data === null) return true; + var max = data.length; + return max === 1 && data === "~" || max === 4 && (data === "null" || data === "Null" || data === "NULL"); +} +function constructYamlNull() { + return null; +} +function isNull(object) { + return object === null; +} +var _null = new type("tag:yaml.org,2002:null", { + kind: "scalar", + resolve: resolveYamlNull, + construct: constructYamlNull, + predicate: isNull, + represent: { + canonical: function() { + return "~"; + }, + lowercase: function() { + return "null"; + }, + uppercase: function() { + return "NULL"; + }, + camelcase: function() { + return "Null"; + }, + empty: function() { + return ""; } - if (!detectedIndent && state.lineIndent > textIndent) { - textIndent = state.lineIndent; + }, + defaultStyle: "lowercase" +}); +function resolveYamlBoolean(data) { + if (data === null) return false; + var max = data.length; + return max === 4 && (data === "true" || data === "True" || data === "TRUE") || max === 5 && (data === "false" || data === "False" || data === "FALSE"); +} +function constructYamlBoolean(data) { + return data === "true" || data === "True" || data === "TRUE"; +} +function isBoolean(object) { + return Object.prototype.toString.call(object) === "[object Boolean]"; +} +var bool = new type("tag:yaml.org,2002:bool", { + kind: "scalar", + resolve: resolveYamlBoolean, + construct: constructYamlBoolean, + predicate: isBoolean, + represent: { + lowercase: function(object) { + return object ? "true" : "false"; + }, + uppercase: function(object) { + return object ? "TRUE" : "FALSE"; + }, + camelcase: function(object) { + return object ? "True" : "False"; } - if (is_EOL(ch)) { - emptyLines++; - continue; + }, + defaultStyle: "lowercase" +}); +function isHexCode(c) { + return 48 <= c && c <= 57 || 65 <= c && c <= 70 || 97 <= c && c <= 102; +} +function isOctCode(c) { + return 48 <= c && c <= 55; +} +function isDecCode(c) { + return 48 <= c && c <= 57; +} +function resolveYamlInteger(data) { + if (data === null) return false; + var max = data.length, index = 0, hasDigits = false, ch; + if (!max) return false; + ch = data[index]; + if (ch === "-" || ch === "+") { + ch = data[++index]; + } + if (ch === "0") { + if (index + 1 === max) return true; + ch = data[++index]; + if (ch === "b") { + index++; + for (; index < max; index++) { + ch = data[index]; + if (ch === "_") continue; + if (ch !== "0" && ch !== "1") return false; + hasDigits = true; + } + return hasDigits && ch !== "_"; } - if (state.lineIndent < textIndent) { - if (chomping === CHOMPING_KEEP) { - state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); - } else if (chomping === CHOMPING_CLIP) { - if (didReadContent) { - state.result += "\n"; - } + if (ch === "x") { + index++; + for (; index < max; index++) { + ch = data[index]; + if (ch === "_") continue; + if (!isHexCode(data.charCodeAt(index))) return false; + hasDigits = true; } - break; + return hasDigits && ch !== "_"; } - if (folding) { - if (is_WHITE_SPACE(ch)) { - atMoreIndented = true; - state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); - } else if (atMoreIndented) { - atMoreIndented = false; - state.result += common.repeat("\n", emptyLines + 1); - } else if (emptyLines === 0) { - if (didReadContent) { - state.result += " "; - } - } else { - state.result += common.repeat("\n", emptyLines); + if (ch === "o") { + index++; + for (; index < max; index++) { + ch = data[index]; + if (ch === "_") continue; + if (!isOctCode(data.charCodeAt(index))) return false; + hasDigits = true; } - } else { - state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); + return hasDigits && ch !== "_"; } - didReadContent = true; - detectedIndent = true; - emptyLines = 0; - captureStart = state.position; - while (!is_EOL(ch) && ch !== 0) { - ch = state.input.charCodeAt(++state.position); + } + if (ch === "_") return false; + for (; index < max; index++) { + ch = data[index]; + if (ch === "_") continue; + if (!isDecCode(data.charCodeAt(index))) { + return false; } - captureSegment(state, captureStart, state.position, false); + hasDigits = true; } + if (!hasDigits || ch === "_") return false; return true; } -function readBlockSequence(state, nodeIndent) { - var _line, _tag = state.tag, _anchor = state.anchor, _result = [], following, detected = false, ch; - if (state.firstTabInLine !== -1) return false; - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; +function constructYamlInteger(data) { + var value = data, sign = 1, ch; + if (value.indexOf("_") !== -1) { + value = value.replace(/_/g, ""); } - ch = state.input.charCodeAt(state.position); - while (ch !== 0) { - if (state.firstTabInLine !== -1) { - state.position = state.firstTabInLine; - throwError(state, "tab characters must not be used in indentation"); - } - if (ch !== 45) { - break; - } - following = state.input.charCodeAt(state.position + 1); - if (!is_WS_OR_EOL(following)) { - break; - } - detected = true; - state.position++; - if (skipSeparationSpace(state, true, -1)) { - if (state.lineIndent <= nodeIndent) { - _result.push(null); - ch = state.input.charCodeAt(state.position); - continue; - } - } - _line = state.line; - composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); - _result.push(state.result); - skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); - if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { - throwError(state, "bad indentation of a sequence entry"); - } else if (state.lineIndent < nodeIndent) { - break; + ch = value[0]; + if (ch === "-" || ch === "+") { + if (ch === "-") sign = -1; + value = value.slice(1); + ch = value[0]; + } + if (value === "0") return 0; + if (ch === "0") { + if (value[1] === "b") return sign * parseInt(value.slice(2), 2); + if (value[1] === "x") return sign * parseInt(value.slice(2), 16); + if (value[1] === "o") return sign * parseInt(value.slice(2), 8); + } + return sign * parseInt(value, 10); +} +function isInteger(object) { + return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 === 0 && !common.isNegativeZero(object)); +} +var int = new type("tag:yaml.org,2002:int", { + kind: "scalar", + resolve: resolveYamlInteger, + construct: constructYamlInteger, + predicate: isInteger, + represent: { + binary: function(obj) { + return obj >= 0 ? "0b" + obj.toString(2) : "-0b" + obj.toString(2).slice(1); + }, + octal: function(obj) { + return obj >= 0 ? "0o" + obj.toString(8) : "-0o" + obj.toString(8).slice(1); + }, + decimal: function(obj) { + return obj.toString(10); + }, + /* eslint-disable max-len */ + hexadecimal: function(obj) { + return obj >= 0 ? "0x" + obj.toString(16).toUpperCase() : "-0x" + obj.toString(16).toUpperCase().slice(1); } + }, + defaultStyle: "decimal", + styleAliases: { + binary: [2, "bin"], + octal: [8, "oct"], + decimal: [10, "dec"], + hexadecimal: [16, "hex"] } - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = "sequence"; - state.result = _result; - return true; +}); +var YAML_FLOAT_PATTERN = new RegExp( + // 2.5e4, 2.5 and integers + "^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$" +); +function resolveYamlFloat(data) { + if (data === null) return false; + if (!YAML_FLOAT_PATTERN.test(data) || // Quick hack to not allow integers end with `_` + // Probably should update regexp & check speed + data[data.length - 1] === "_") { + return false; } - return false; + return true; } -function readBlockMapping(state, nodeIndent, flowIndent) { - var following, allowCompact, _line, _keyLine, _keyLineStart, _keyPos, _tag = state.tag, _anchor = state.anchor, _result = {}, overridableKeys = /* @__PURE__ */ Object.create(null), keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch; - if (state.firstTabInLine !== -1) return false; - if (state.anchor !== null) { - state.anchorMap[state.anchor] = _result; +function constructYamlFloat(data) { + var value, sign; + value = data.replace(/_/g, "").toLowerCase(); + sign = value[0] === "-" ? -1 : 1; + if ("+-".indexOf(value[0]) >= 0) { + value = value.slice(1); } - ch = state.input.charCodeAt(state.position); - while (ch !== 0) { - if (!atExplicitKey && state.firstTabInLine !== -1) { - state.position = state.firstTabInLine; - throwError(state, "tab characters must not be used in indentation"); - } - following = state.input.charCodeAt(state.position + 1); - _line = state.line; - if ((ch === 63 || ch === 58) && is_WS_OR_EOL(following)) { - if (ch === 63) { - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); - keyTag = keyNode = valueNode = null; - } - detected = true; - atExplicitKey = true; - allowCompact = true; - } else if (atExplicitKey) { - atExplicitKey = false; - allowCompact = true; - } else { - throwError(state, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"); - } - state.position += 1; - ch = following; - } else { - _keyLine = state.line; - _keyLineStart = state.lineStart; - _keyPos = state.position; - if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { - break; - } - if (state.line === _line) { - ch = state.input.charCodeAt(state.position); - while (is_WHITE_SPACE(ch)) { - ch = state.input.charCodeAt(++state.position); - } - if (ch === 58) { - ch = state.input.charCodeAt(++state.position); - if (!is_WS_OR_EOL(ch)) { - throwError(state, "a whitespace character is expected after the key-value separator within a block mapping"); - } - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); - keyTag = keyNode = valueNode = null; - } - detected = true; - atExplicitKey = false; - allowCompact = false; - keyTag = state.tag; - keyNode = state.result; - } else if (detected) { - throwError(state, "can not read an implicit mapping pair; a colon is missed"); - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; - } - } else if (detected) { - throwError(state, "can not read a block mapping entry; a multiline key may not be an implicit key"); - } else { - state.tag = _tag; - state.anchor = _anchor; - return true; - } - } - if (state.line === _line || state.lineIndent > nodeIndent) { - if (atExplicitKey) { - _keyLine = state.line; - _keyLineStart = state.lineStart; - _keyPos = state.position; - } - if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { - if (atExplicitKey) { - keyNode = state.result; - } else { - valueNode = state.result; - } - } - if (!atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos); - keyTag = keyNode = valueNode = null; - } - skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); + if (value === ".inf") { + return sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY; + } else if (value === ".nan") { + return NaN; + } + return sign * parseFloat(value, 10); +} +var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/; +function representYamlFloat(object, style) { + var res; + if (isNaN(object)) { + switch (style) { + case "lowercase": + return ".nan"; + case "uppercase": + return ".NAN"; + case "camelcase": + return ".NaN"; } - if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { - throwError(state, "bad indentation of a mapping entry"); - } else if (state.lineIndent < nodeIndent) { - break; + } else if (Number.POSITIVE_INFINITY === object) { + switch (style) { + case "lowercase": + return ".inf"; + case "uppercase": + return ".INF"; + case "camelcase": + return ".Inf"; + } + } else if (Number.NEGATIVE_INFINITY === object) { + switch (style) { + case "lowercase": + return "-.inf"; + case "uppercase": + return "-.INF"; + case "camelcase": + return "-.Inf"; } + } else if (common.isNegativeZero(object)) { + return "-0.0"; } - if (atExplicitKey) { - storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + res = object.toString(10); + return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace("e", ".e") : res; +} +function isFloat(object) { + return Object.prototype.toString.call(object) === "[object Number]" && (object % 1 !== 0 || common.isNegativeZero(object)); +} +var float = new type("tag:yaml.org,2002:float", { + kind: "scalar", + resolve: resolveYamlFloat, + construct: constructYamlFloat, + predicate: isFloat, + represent: representYamlFloat, + defaultStyle: "lowercase" +}); +var json = failsafe.extend({ + implicit: [ + _null, + bool, + int, + float + ] +}); +var core = json; +var YAML_DATE_REGEXP = new RegExp( + "^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$" +); +var YAML_TIMESTAMP_REGEXP = new RegExp( + "^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$" +); +function resolveYamlTimestamp(data) { + if (data === null) return false; + if (YAML_DATE_REGEXP.exec(data) !== null) return true; + if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true; + return false; +} +function constructYamlTimestamp(data) { + var match, year, month, day, hour, minute, second, fraction = 0, delta = null, tz_hour, tz_minute, date; + match = YAML_DATE_REGEXP.exec(data); + if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data); + if (match === null) throw new Error("Date resolve error"); + year = +match[1]; + month = +match[2] - 1; + day = +match[3]; + if (!match[4]) { + return new Date(Date.UTC(year, month, day)); } - if (detected) { - state.tag = _tag; - state.anchor = _anchor; - state.kind = "mapping"; - state.result = _result; + hour = +match[4]; + minute = +match[5]; + second = +match[6]; + if (match[7]) { + fraction = match[7].slice(0, 3); + while (fraction.length < 3) { + fraction += "0"; + } + fraction = +fraction; } - return detected; + if (match[9]) { + tz_hour = +match[10]; + tz_minute = +(match[11] || 0); + delta = (tz_hour * 60 + tz_minute) * 6e4; + if (match[9] === "-") delta = -delta; + } + date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction)); + if (delta) date.setTime(date.getTime() - delta); + return date; } -function readTagProperty(state) { - var _position, isVerbatim = false, isNamed = false, tagHandle, tagName, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 33) return false; - if (state.tag !== null) { - throwError(state, "duplication of a tag property"); +function representYamlTimestamp(object) { + return object.toISOString(); +} +var timestamp = new type("tag:yaml.org,2002:timestamp", { + kind: "scalar", + resolve: resolveYamlTimestamp, + construct: constructYamlTimestamp, + instanceOf: Date, + represent: representYamlTimestamp +}); +function resolveYamlMerge(data) { + return data === "<<" || data === null; +} +var merge = new type("tag:yaml.org,2002:merge", { + kind: "scalar", + resolve: resolveYamlMerge +}); +var BASE64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r"; +function resolveYamlBinary(data) { + if (data === null) return false; + var code, idx, bitlen = 0, max = data.length, map2 = BASE64_MAP; + for (idx = 0; idx < max; idx++) { + code = map2.indexOf(data.charAt(idx)); + if (code > 64) continue; + if (code < 0) return false; + bitlen += 6; } - ch = state.input.charCodeAt(++state.position); - if (ch === 60) { - isVerbatim = true; - ch = state.input.charCodeAt(++state.position); - } else if (ch === 33) { - isNamed = true; - tagHandle = "!!"; - ch = state.input.charCodeAt(++state.position); - } else { - tagHandle = "!"; + return bitlen % 8 === 0; +} +function constructYamlBinary(data) { + var idx, tailbits, input = data.replace(/[\r\n=]/g, ""), max = input.length, map2 = BASE64_MAP, bits = 0, result = []; + for (idx = 0; idx < max; idx++) { + if (idx % 4 === 0 && idx) { + result.push(bits >> 16 & 255); + result.push(bits >> 8 & 255); + result.push(bits & 255); + } + bits = bits << 6 | map2.indexOf(input.charAt(idx)); } - _position = state.position; - if (isVerbatim) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0 && ch !== 62); - if (state.position < state.length) { - tagName = state.input.slice(_position, state.position); - ch = state.input.charCodeAt(++state.position); - } else { - throwError(state, "unexpected end of the stream within a verbatim tag"); + tailbits = max % 4 * 6; + if (tailbits === 0) { + result.push(bits >> 16 & 255); + result.push(bits >> 8 & 255); + result.push(bits & 255); + } else if (tailbits === 18) { + result.push(bits >> 10 & 255); + result.push(bits >> 2 & 255); + } else if (tailbits === 12) { + result.push(bits >> 4 & 255); + } + return new Uint8Array(result); +} +function representYamlBinary(object) { + var result = "", bits = 0, idx, tail, max = object.length, map2 = BASE64_MAP; + for (idx = 0; idx < max; idx++) { + if (idx % 3 === 0 && idx) { + result += map2[bits >> 18 & 63]; + result += map2[bits >> 12 & 63]; + result += map2[bits >> 6 & 63]; + result += map2[bits & 63]; } - } else { - while (ch !== 0 && !is_WS_OR_EOL(ch)) { - if (ch === 33) { - if (!isNamed) { - tagHandle = state.input.slice(_position - 1, state.position + 1); - if (!PATTERN_TAG_HANDLE.test(tagHandle)) { - throwError(state, "named tag handle cannot contain such characters"); - } - isNamed = true; - _position = state.position + 1; - } else { - throwError(state, "tag suffix cannot contain exclamation marks"); - } + bits = (bits << 8) + object[idx]; + } + tail = max % 3; + if (tail === 0) { + result += map2[bits >> 18 & 63]; + result += map2[bits >> 12 & 63]; + result += map2[bits >> 6 & 63]; + result += map2[bits & 63]; + } else if (tail === 2) { + result += map2[bits >> 10 & 63]; + result += map2[bits >> 4 & 63]; + result += map2[bits << 2 & 63]; + result += map2[64]; + } else if (tail === 1) { + result += map2[bits >> 2 & 63]; + result += map2[bits << 4 & 63]; + result += map2[64]; + result += map2[64]; + } + return result; +} +function isBinary(obj) { + return Object.prototype.toString.call(obj) === "[object Uint8Array]"; +} +var binary = new type("tag:yaml.org,2002:binary", { + kind: "scalar", + resolve: resolveYamlBinary, + construct: constructYamlBinary, + predicate: isBinary, + represent: representYamlBinary +}); +var _hasOwnProperty$3 = Object.prototype.hasOwnProperty; +var _toString$2 = Object.prototype.toString; +function resolveYamlOmap(data) { + if (data === null) return true; + var objectKeys = [], index, length, pair, pairKey, pairHasKey, object = data; + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + pairHasKey = false; + if (_toString$2.call(pair) !== "[object Object]") return false; + for (pairKey in pair) { + if (_hasOwnProperty$3.call(pair, pairKey)) { + if (!pairHasKey) pairHasKey = true; + else return false; } - ch = state.input.charCodeAt(++state.position); - } - tagName = state.input.slice(_position, state.position); - if (PATTERN_FLOW_INDICATORS.test(tagName)) { - throwError(state, "tag suffix cannot contain flow indicator characters"); } + if (!pairHasKey) return false; + if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey); + else return false; } - if (tagName && !PATTERN_TAG_URI.test(tagName)) { - throwError(state, "tag name cannot contain such characters: " + tagName); + return true; +} +function constructYamlOmap(data) { + return data !== null ? data : []; +} +var omap = new type("tag:yaml.org,2002:omap", { + kind: "sequence", + resolve: resolveYamlOmap, + construct: constructYamlOmap +}); +var _toString$1 = Object.prototype.toString; +function resolveYamlPairs(data) { + if (data === null) return true; + var index, length, pair, keys, result, object = data; + result = new Array(object.length); + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + if (_toString$1.call(pair) !== "[object Object]") return false; + keys = Object.keys(pair); + if (keys.length !== 1) return false; + result[index] = [keys[0], pair[keys[0]]]; } - try { - tagName = decodeURIComponent(tagName); - } catch (err) { - throwError(state, "tag name is malformed: " + tagName); + return true; +} +function constructYamlPairs(data) { + if (data === null) return []; + var index, length, pair, keys, result, object = data; + result = new Array(object.length); + for (index = 0, length = object.length; index < length; index += 1) { + pair = object[index]; + keys = Object.keys(pair); + result[index] = [keys[0], pair[keys[0]]]; } - if (isVerbatim) { - state.tag = tagName; - } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) { - state.tag = state.tagMap[tagHandle] + tagName; - } else if (tagHandle === "!") { - state.tag = "!" + tagName; - } else if (tagHandle === "!!") { - state.tag = "tag:yaml.org,2002:" + tagName; - } else { - throwError(state, 'undeclared tag handle "' + tagHandle + '"'); + return result; +} +var pairs = new type("tag:yaml.org,2002:pairs", { + kind: "sequence", + resolve: resolveYamlPairs, + construct: constructYamlPairs +}); +var _hasOwnProperty$2 = Object.prototype.hasOwnProperty; +function resolveYamlSet(data) { + if (data === null) return true; + var key, object = data; + for (key in object) { + if (_hasOwnProperty$2.call(object, key)) { + if (object[key] !== null) return false; + } } return true; } -function readAnchorProperty(state) { - var _position, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 38) return false; - if (state.anchor !== null) { - throwError(state, "duplication of an anchor property"); +function constructYamlSet(data) { + return data !== null ? data : {}; +} +var set = new type("tag:yaml.org,2002:set", { + kind: "mapping", + resolve: resolveYamlSet, + construct: constructYamlSet +}); +var _default = core.extend({ + implicit: [ + timestamp, + merge + ], + explicit: [ + binary, + omap, + pairs, + set + ] +}); +var _hasOwnProperty$1 = Object.prototype.hasOwnProperty; +var CONTEXT_FLOW_IN = 1; +var CONTEXT_FLOW_OUT = 2; +var CONTEXT_BLOCK_IN = 3; +var CONTEXT_BLOCK_OUT = 4; +var CHOMPING_CLIP = 1; +var CHOMPING_STRIP = 2; +var CHOMPING_KEEP = 3; +var PATTERN_NON_PRINTABLE = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; +var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/; +var PATTERN_FLOW_INDICATORS = /[,\[\]\{\}]/; +var PATTERN_TAG_HANDLE = /^(?:!|!!|![a-z\-]+!)$/i; +var PATTERN_TAG_URI = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; +function _class(obj) { + return Object.prototype.toString.call(obj); +} +function is_EOL(c) { + return c === 10 || c === 13; +} +function is_WHITE_SPACE(c) { + return c === 9 || c === 32; +} +function is_WS_OR_EOL(c) { + return c === 9 || c === 32 || c === 10 || c === 13; +} +function is_FLOW_INDICATOR(c) { + return c === 44 || c === 91 || c === 93 || c === 123 || c === 125; +} +function fromHexCode(c) { + var lc; + if (48 <= c && c <= 57) { + return c - 48; } - ch = state.input.charCodeAt(++state.position); - _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); + lc = c | 32; + if (97 <= lc && lc <= 102) { + return lc - 97 + 10; } - if (state.position === _position) { - throwError(state, "name of an anchor node must contain at least one character"); + return -1; +} +function escapedHexLen(c) { + if (c === 120) { + return 2; } - state.anchor = state.input.slice(_position, state.position); - return true; + if (c === 117) { + return 4; + } + if (c === 85) { + return 8; + } + return 0; } -function readAlias(state) { - var _position, alias, ch; - ch = state.input.charCodeAt(state.position); - if (ch !== 42) return false; - ch = state.input.charCodeAt(++state.position); - _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { - ch = state.input.charCodeAt(++state.position); +function fromDecimalCode(c) { + if (48 <= c && c <= 57) { + return c - 48; } - if (state.position === _position) { - throwError(state, "name of an alias node must contain at least one character"); + return -1; +} +function simpleEscapeSequence(c) { + return c === 48 ? "\0" : c === 97 ? "\x07" : c === 98 ? "\b" : c === 116 ? " " : c === 9 ? " " : c === 110 ? "\n" : c === 118 ? "\v" : c === 102 ? "\f" : c === 114 ? "\r" : c === 101 ? "\x1B" : c === 32 ? " " : c === 34 ? '"' : c === 47 ? "/" : c === 92 ? "\\" : c === 78 ? "\x85" : c === 95 ? "\xA0" : c === 76 ? "\u2028" : c === 80 ? "\u2029" : ""; +} +function charFromCodepoint(c) { + if (c <= 65535) { + return String.fromCharCode(c); } - alias = state.input.slice(_position, state.position); - if (!_hasOwnProperty$1.call(state.anchorMap, alias)) { - throwError(state, 'unidentified alias "' + alias + '"'); + return String.fromCharCode( + (c - 65536 >> 10) + 55296, + (c - 65536 & 1023) + 56320 + ); +} +function setProperty(object, key, value) { + if (key === "__proto__") { + Object.defineProperty(object, key, { + configurable: true, + enumerable: true, + writable: true, + value + }); + } else { + object[key] = value; } - state.result = state.anchorMap[alias]; - skipSeparationSpace(state, true, -1); - return true; } -function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { - var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, typeList, type2, flowIndent, blockIndent; - if (state.listener !== null) { - state.listener("open", state); +var simpleEscapeCheck = new Array(256); +var simpleEscapeMap = new Array(256); +for (i = 0; i < 256; i++) { + simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0; + simpleEscapeMap[i] = simpleEscapeSequence(i); +} +var i; +function State$1(input, options) { + this.input = input; + this.filename = options["filename"] || null; + this.schema = options["schema"] || _default; + this.onWarning = options["onWarning"] || null; + this.legacy = options["legacy"] || false; + this.json = options["json"] || false; + this.listener = options["listener"] || null; + this.implicitTypes = this.schema.compiledImplicit; + this.typeMap = this.schema.compiledTypeMap; + this.length = input.length; + this.position = 0; + this.line = 0; + this.lineStart = 0; + this.lineIndent = 0; + this.firstTabInLine = -1; + this.documents = []; +} +function generateError(state, message) { + var mark = { + name: state.filename, + buffer: state.input.slice(0, -1), + // omit trailing \0 + position: state.position, + line: state.line, + column: state.position - state.lineStart + }; + mark.snippet = snippet(mark); + return new exception(message, mark); +} +function throwError(state, message) { + throw generateError(state, message); +} +function throwWarning(state, message) { + if (state.onWarning) { + state.onWarning.call(null, generateError(state, message)); } - state.tag = null; - state.anchor = null; - state.kind = null; - state.result = null; - allowBlockStyles = allowBlockScalars = allowBlockCollections = CONTEXT_BLOCK_OUT === nodeContext || CONTEXT_BLOCK_IN === nodeContext; - if (allowToSeek) { - if (skipSeparationSpace(state, true, -1)) { - atNewLine = true; - if (state.lineIndent > parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; - } +} +var directiveHandlers = { + YAML: function handleYamlDirective(state, name, args) { + var match, major, minor; + if (state.version !== null) { + throwError(state, "duplication of %YAML directive"); + } + if (args.length !== 1) { + throwError(state, "YAML directive accepts exactly one argument"); + } + match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]); + if (match === null) { + throwError(state, "ill-formed argument of the YAML directive"); + } + major = parseInt(match[1], 10); + minor = parseInt(match[2], 10); + if (major !== 1) { + throwError(state, "unacceptable YAML version of the document"); + } + state.version = args[0]; + state.checkLineBreaks = minor < 2; + if (minor !== 1 && minor !== 2) { + throwWarning(state, "unsupported YAML version of the document"); + } + }, + TAG: function handleTagDirective(state, name, args) { + var handle, prefix; + if (args.length !== 2) { + throwError(state, "TAG directive accepts exactly two arguments"); + } + handle = args[0]; + prefix = args[1]; + if (!PATTERN_TAG_HANDLE.test(handle)) { + throwError(state, "ill-formed tag handle (first argument) of the TAG directive"); + } + if (_hasOwnProperty$1.call(state.tagMap, handle)) { + throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle'); + } + if (!PATTERN_TAG_URI.test(prefix)) { + throwError(state, "ill-formed tag prefix (second argument) of the TAG directive"); } + try { + prefix = decodeURIComponent(prefix); + } catch (err) { + throwError(state, "tag prefix is malformed: " + prefix); + } + state.tagMap[handle] = prefix; } - if (indentStatus === 1) { - while (readTagProperty(state) || readAnchorProperty(state)) { - if (skipSeparationSpace(state, true, -1)) { - atNewLine = true; - allowBlockCollections = allowBlockStyles; - if (state.lineIndent > parentIndent) { - indentStatus = 1; - } else if (state.lineIndent === parentIndent) { - indentStatus = 0; - } else if (state.lineIndent < parentIndent) { - indentStatus = -1; +}; +function captureSegment(state, start, end, checkJson) { + var _position, _length, _character, _result; + if (start < end) { + _result = state.input.slice(start, end); + if (checkJson) { + for (_position = 0, _length = _result.length; _position < _length; _position += 1) { + _character = _result.charCodeAt(_position); + if (!(_character === 9 || 32 <= _character && _character <= 1114111)) { + throwError(state, "expected valid JSON character"); } - } else { - allowBlockCollections = false; } + } else if (PATTERN_NON_PRINTABLE.test(_result)) { + throwError(state, "the stream contains non-printable characters"); } + state.result += _result; } - if (allowBlockCollections) { - allowBlockCollections = atNewLine || allowCompact; +} +function mergeMappings(state, destination, source, overridableKeys) { + var sourceKeys, key, index, quantity; + if (!common.isObject(source)) { + throwError(state, "cannot merge mappings; the provided source object is unacceptable"); } - if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { - if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { - flowIndent = parentIndent; - } else { - flowIndent = parentIndent + 1; + sourceKeys = Object.keys(source); + for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) { + key = sourceKeys[index]; + if (!_hasOwnProperty$1.call(destination, key)) { + setProperty(destination, key, source[key]); + overridableKeys[key] = true; } - blockIndent = state.position - state.lineStart; - if (indentStatus === 1) { - if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) { - hasContent = true; - } else { - if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) { - hasContent = true; - } else if (readAlias(state)) { - hasContent = true; - if (state.tag !== null || state.anchor !== null) { - throwError(state, "alias node should not have any properties"); - } - } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { - hasContent = true; - if (state.tag === null) { - state.tag = "?"; - } - } - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } + } +} +function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startLineStart, startPos) { + var index, quantity; + if (Array.isArray(keyNode)) { + keyNode = Array.prototype.slice.call(keyNode); + for (index = 0, quantity = keyNode.length; index < quantity; index += 1) { + if (Array.isArray(keyNode[index])) { + throwError(state, "nested arrays are not supported inside keys"); + } + if (typeof keyNode === "object" && _class(keyNode[index]) === "[object Object]") { + keyNode[index] = "[object Object]"; } - } else if (indentStatus === 0) { - hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } } - if (state.tag === null) { - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - } else if (state.tag === "?") { - if (state.result !== null && state.kind !== "scalar") { - throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); - } - for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { - type2 = state.implicitTypes[typeIndex]; - if (type2.resolve(state.result)) { - state.result = type2.construct(state.result); - state.tag = type2.tag; - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } - break; + if (typeof keyNode === "object" && _class(keyNode) === "[object Object]") { + keyNode = "[object Object]"; + } + keyNode = String(keyNode); + if (_result === null) { + _result = {}; + } + if (keyTag === "tag:yaml.org,2002:merge") { + if (Array.isArray(valueNode)) { + for (index = 0, quantity = valueNode.length; index < quantity; index += 1) { + mergeMappings(state, _result, valueNode[index], overridableKeys); } - } - } else if (state.tag !== "!") { - if (_hasOwnProperty$1.call(state.typeMap[state.kind || "fallback"], state.tag)) { - type2 = state.typeMap[state.kind || "fallback"][state.tag]; } else { - type2 = null; - typeList = state.typeMap.multi[state.kind || "fallback"]; - for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) { - if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) { - type2 = typeList[typeIndex]; - break; - } - } - } - if (!type2) { - throwError(state, "unknown tag !<" + state.tag + ">"); - } - if (state.result !== null && type2.kind !== state.kind) { - throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' + type2.kind + '", not "' + state.kind + '"'); + mergeMappings(state, _result, valueNode, overridableKeys); } - if (!type2.resolve(state.result, state.tag)) { - throwError(state, "cannot resolve a node with !<" + state.tag + "> explicit tag"); - } else { - state.result = type2.construct(state.result, state.tag); - if (state.anchor !== null) { - state.anchorMap[state.anchor] = state.result; - } + } else { + if (!state.json && !_hasOwnProperty$1.call(overridableKeys, keyNode) && _hasOwnProperty$1.call(_result, keyNode)) { + state.line = startLine || state.line; + state.lineStart = startLineStart || state.lineStart; + state.position = startPos || state.position; + throwError(state, "duplicated mapping key"); } + setProperty(_result, keyNode, valueNode); + delete overridableKeys[keyNode]; } - if (state.listener !== null) { - state.listener("close", state); - } - return state.tag !== null || state.anchor !== null || hasContent; + return _result; } -function readDocument(state) { - var documentStart = state.position, _position, directiveName, directiveArgs, hasDirectives = false, ch; - state.version = null; - state.checkLineBreaks = state.legacy; - state.tagMap = /* @__PURE__ */ Object.create(null); - state.anchorMap = /* @__PURE__ */ Object.create(null); - while ((ch = state.input.charCodeAt(state.position)) !== 0) { - skipSeparationSpace(state, true, -1); - ch = state.input.charCodeAt(state.position); - if (state.lineIndent > 0 || ch !== 37) { - break; +function readLineBreak(state) { + var ch; + ch = state.input.charCodeAt(state.position); + if (ch === 10) { + state.position++; + } else if (ch === 13) { + state.position++; + if (state.input.charCodeAt(state.position) === 10) { + state.position++; } - hasDirectives = true; - ch = state.input.charCodeAt(++state.position); - _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch)) { + } else { + throwError(state, "a line break is expected"); + } + state.line += 1; + state.lineStart = state.position; + state.firstTabInLine = -1; +} +function skipSeparationSpace(state, allowComments, checkIndent) { + var lineBreaks = 0, ch = state.input.charCodeAt(state.position); + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + if (ch === 9 && state.firstTabInLine === -1) { + state.firstTabInLine = state.position; + } ch = state.input.charCodeAt(++state.position); } - directiveName = state.input.slice(_position, state.position); - directiveArgs = []; - if (directiveName.length < 1) { - throwError(state, "directive name must not be less than one character in length"); - } - while (ch !== 0) { - while (is_WHITE_SPACE(ch)) { + if (allowComments && ch === 35) { + do { ch = state.input.charCodeAt(++state.position); - } - if (ch === 35) { - do { - ch = state.input.charCodeAt(++state.position); - } while (ch !== 0 && !is_EOL(ch)); - break; - } - if (is_EOL(ch)) break; - _position = state.position; - while (ch !== 0 && !is_WS_OR_EOL(ch)) { + } while (ch !== 10 && ch !== 13 && ch !== 0); + } + if (is_EOL(ch)) { + readLineBreak(state); + ch = state.input.charCodeAt(state.position); + lineBreaks++; + state.lineIndent = 0; + while (ch === 32) { + state.lineIndent++; ch = state.input.charCodeAt(++state.position); } - directiveArgs.push(state.input.slice(_position, state.position)); - } - if (ch !== 0) readLineBreak(state); - if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) { - directiveHandlers[directiveName](state, directiveName, directiveArgs); } else { - throwWarning(state, 'unknown document directive "' + directiveName + '"'); + break; } } - skipSeparationSpace(state, true, -1); - if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 45 && state.input.charCodeAt(state.position + 1) === 45 && state.input.charCodeAt(state.position + 2) === 45) { - state.position += 3; - skipSeparationSpace(state, true, -1); - } else if (hasDirectives) { - throwError(state, "directives end mark is expected"); - } - composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); - skipSeparationSpace(state, true, -1); - if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { - throwWarning(state, "non-ASCII line breaks are interpreted as content"); + if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) { + throwWarning(state, "deficient indentation"); } - state.documents.push(state.result); - if (state.position === state.lineStart && testDocumentSeparator(state)) { - if (state.input.charCodeAt(state.position) === 46) { - state.position += 3; - skipSeparationSpace(state, true, -1); + return lineBreaks; +} +function testDocumentSeparator(state) { + var _position = state.position, ch; + ch = state.input.charCodeAt(_position); + if ((ch === 45 || ch === 46) && ch === state.input.charCodeAt(_position + 1) && ch === state.input.charCodeAt(_position + 2)) { + _position += 3; + ch = state.input.charCodeAt(_position); + if (ch === 0 || is_WS_OR_EOL(ch)) { + return true; } - return; } - if (state.position < state.length - 1) { - throwError(state, "end of the stream or a document separator is expected"); - } else { - return; + return false; +} +function writeFoldedLines(state, count) { + if (count === 1) { + state.result += " "; + } else if (count > 1) { + state.result += common.repeat("\n", count - 1); } } -function loadDocuments(input, options) { - input = String(input); - options = options || {}; - if (input.length !== 0) { - if (input.charCodeAt(input.length - 1) !== 10 && input.charCodeAt(input.length - 1) !== 13) { - input += "\n"; - } - if (input.charCodeAt(0) === 65279) { - input = input.slice(1); - } +function readPlainScalar(state, nodeIndent, withinFlowCollection) { + var preceding, following, captureStart, captureEnd, hasPendingContent, _line, _lineStart, _lineIndent, _kind = state.kind, _result = state.result, ch; + ch = state.input.charCodeAt(state.position); + if (is_WS_OR_EOL(ch) || is_FLOW_INDICATOR(ch) || ch === 35 || ch === 38 || ch === 42 || ch === 33 || ch === 124 || ch === 62 || ch === 39 || ch === 34 || ch === 37 || ch === 64 || ch === 96) { + return false; } - var state = new State$1(input, options); - var nullpos = input.indexOf("\0"); - if (nullpos !== -1) { - state.position = nullpos; - throwError(state, "null byte is not allowed in input"); + if (ch === 63 || ch === 45) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { + return false; + } } - state.input += "\0"; - while (state.input.charCodeAt(state.position) === 32) { - state.lineIndent += 1; - state.position += 1; + state.kind = "scalar"; + state.result = ""; + captureStart = captureEnd = state.position; + hasPendingContent = false; + while (ch !== 0) { + if (ch === 58) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following) || withinFlowCollection && is_FLOW_INDICATOR(following)) { + break; + } + } else if (ch === 35) { + preceding = state.input.charCodeAt(state.position - 1); + if (is_WS_OR_EOL(preceding)) { + break; + } + } else if (state.position === state.lineStart && testDocumentSeparator(state) || withinFlowCollection && is_FLOW_INDICATOR(ch)) { + break; + } else if (is_EOL(ch)) { + _line = state.line; + _lineStart = state.lineStart; + _lineIndent = state.lineIndent; + skipSeparationSpace(state, false, -1); + if (state.lineIndent >= nodeIndent) { + hasPendingContent = true; + ch = state.input.charCodeAt(state.position); + continue; + } else { + state.position = captureEnd; + state.line = _line; + state.lineStart = _lineStart; + state.lineIndent = _lineIndent; + break; + } + } + if (hasPendingContent) { + captureSegment(state, captureStart, captureEnd, false); + writeFoldedLines(state, state.line - _line); + captureStart = captureEnd = state.position; + hasPendingContent = false; + } + if (!is_WHITE_SPACE(ch)) { + captureEnd = state.position + 1; + } + ch = state.input.charCodeAt(++state.position); } - while (state.position < state.length - 1) { - readDocument(state); + captureSegment(state, captureStart, captureEnd, false); + if (state.result) { + return true; } - return state.documents; + state.kind = _kind; + state.result = _result; + return false; } -function loadAll$1(input, iterator, options) { - if (iterator !== null && typeof iterator === "object" && typeof options === "undefined") { - options = iterator; - iterator = null; - } - var documents = loadDocuments(input, options); - if (typeof iterator !== "function") { - return documents; +function readSingleQuotedScalar(state, nodeIndent) { + var ch, captureStart, captureEnd; + ch = state.input.charCodeAt(state.position); + if (ch !== 39) { + return false; } - for (var index = 0, length = documents.length; index < length; index += 1) { - iterator(documents[index]); + state.kind = "scalar"; + state.result = ""; + state.position++; + captureStart = captureEnd = state.position; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 39) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + if (ch === 39) { + captureStart = state.position; + state.position++; + captureEnd = state.position; + } else { + return true; + } + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, "unexpected end of the document within a single quoted scalar"); + } else { + state.position++; + captureEnd = state.position; + } } + throwError(state, "unexpected end of the stream within a single quoted scalar"); } -function load$1(input, options) { - var documents = loadDocuments(input, options); - if (documents.length === 0) { - return void 0; - } else if (documents.length === 1) { - return documents[0]; +function readDoubleQuotedScalar(state, nodeIndent) { + var captureStart, captureEnd, hexLength, hexResult, tmp, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 34) { + return false; } - throw new exception("expected a single document in the stream, but found more"); -} -var loadAll_1 = loadAll$1; -var load_1 = load$1; -var loader = { - loadAll: loadAll_1, - load: load_1 -}; -var _toString = Object.prototype.toString; -var _hasOwnProperty = Object.prototype.hasOwnProperty; -var CHAR_BOM = 65279; -var CHAR_TAB = 9; -var CHAR_LINE_FEED = 10; -var CHAR_CARRIAGE_RETURN = 13; -var CHAR_SPACE = 32; -var CHAR_EXCLAMATION = 33; -var CHAR_DOUBLE_QUOTE = 34; -var CHAR_SHARP = 35; -var CHAR_PERCENT = 37; -var CHAR_AMPERSAND = 38; -var CHAR_SINGLE_QUOTE = 39; -var CHAR_ASTERISK = 42; -var CHAR_COMMA = 44; -var CHAR_MINUS = 45; -var CHAR_COLON = 58; -var CHAR_EQUALS = 61; -var CHAR_GREATER_THAN = 62; -var CHAR_QUESTION = 63; -var CHAR_COMMERCIAL_AT = 64; -var CHAR_LEFT_SQUARE_BRACKET = 91; -var CHAR_RIGHT_SQUARE_BRACKET = 93; -var CHAR_GRAVE_ACCENT = 96; -var CHAR_LEFT_CURLY_BRACKET = 123; -var CHAR_VERTICAL_LINE = 124; -var CHAR_RIGHT_CURLY_BRACKET = 125; -var ESCAPE_SEQUENCES = {}; -ESCAPE_SEQUENCES[0] = "\\0"; -ESCAPE_SEQUENCES[7] = "\\a"; -ESCAPE_SEQUENCES[8] = "\\b"; -ESCAPE_SEQUENCES[9] = "\\t"; -ESCAPE_SEQUENCES[10] = "\\n"; -ESCAPE_SEQUENCES[11] = "\\v"; -ESCAPE_SEQUENCES[12] = "\\f"; -ESCAPE_SEQUENCES[13] = "\\r"; -ESCAPE_SEQUENCES[27] = "\\e"; -ESCAPE_SEQUENCES[34] = '\\"'; -ESCAPE_SEQUENCES[92] = "\\\\"; -ESCAPE_SEQUENCES[133] = "\\N"; -ESCAPE_SEQUENCES[160] = "\\_"; -ESCAPE_SEQUENCES[8232] = "\\L"; -ESCAPE_SEQUENCES[8233] = "\\P"; -var DEPRECATED_BOOLEANS_SYNTAX = [ - "y", - "Y", - "yes", - "Yes", - "YES", - "on", - "On", - "ON", - "n", - "N", - "no", - "No", - "NO", - "off", - "Off", - "OFF" -]; -var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/; -function compileStyleMap(schema2, map2) { - var result, keys, index, length, tag, style, type2; - if (map2 === null) return {}; - result = {}; - keys = Object.keys(map2); - for (index = 0, length = keys.length; index < length; index += 1) { - tag = keys[index]; - style = String(map2[tag]); - if (tag.slice(0, 2) === "!!") { - tag = "tag:yaml.org,2002:" + tag.slice(2); - } - type2 = schema2.compiledTypeMap["fallback"][tag]; - if (type2 && _hasOwnProperty.call(type2.styleAliases, style)) { - style = type2.styleAliases[style]; + state.kind = "scalar"; + state.result = ""; + state.position++; + captureStart = captureEnd = state.position; + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + if (ch === 34) { + captureSegment(state, captureStart, state.position, true); + state.position++; + return true; + } else if (ch === 92) { + captureSegment(state, captureStart, state.position, true); + ch = state.input.charCodeAt(++state.position); + if (is_EOL(ch)) { + skipSeparationSpace(state, false, nodeIndent); + } else if (ch < 256 && simpleEscapeCheck[ch]) { + state.result += simpleEscapeMap[ch]; + state.position++; + } else if ((tmp = escapedHexLen(ch)) > 0) { + hexLength = tmp; + hexResult = 0; + for (; hexLength > 0; hexLength--) { + ch = state.input.charCodeAt(++state.position); + if ((tmp = fromHexCode(ch)) >= 0) { + hexResult = (hexResult << 4) + tmp; + } else { + throwError(state, "expected hexadecimal character"); + } + } + state.result += charFromCodepoint(hexResult); + state.position++; + } else { + throwError(state, "unknown escape sequence"); + } + captureStart = captureEnd = state.position; + } else if (is_EOL(ch)) { + captureSegment(state, captureStart, captureEnd, true); + writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent)); + captureStart = captureEnd = state.position; + } else if (state.position === state.lineStart && testDocumentSeparator(state)) { + throwError(state, "unexpected end of the document within a double quoted scalar"); + } else { + state.position++; + captureEnd = state.position; } - result[tag] = style; } - return result; + throwError(state, "unexpected end of the stream within a double quoted scalar"); } -function encodeHex(character) { - var string, handle, length; - string = character.toString(16).toUpperCase(); - if (character <= 255) { - handle = "x"; - length = 2; - } else if (character <= 65535) { - handle = "u"; - length = 4; - } else if (character <= 4294967295) { - handle = "U"; - length = 8; +function readFlowCollection(state, nodeIndent) { + var readNext = true, _line, _lineStart, _pos, _tag = state.tag, _result, _anchor = state.anchor, following, terminator, isPair, isExplicitPair, isMapping, overridableKeys = /* @__PURE__ */ Object.create(null), keyNode, keyTag, valueNode, ch; + ch = state.input.charCodeAt(state.position); + if (ch === 91) { + terminator = 93; + isMapping = false; + _result = []; + } else if (ch === 123) { + terminator = 125; + isMapping = true; + _result = {}; } else { - throw new exception("code point within a string may not be greater than 0xFFFFFFFF"); + return false; } - return "\\" + handle + common.repeat("0", length - string.length) + string; -} -var QUOTING_TYPE_SINGLE = 1; -var QUOTING_TYPE_DOUBLE = 2; -function State(options) { - this.schema = options["schema"] || _default; - this.indent = Math.max(1, options["indent"] || 2); - this.noArrayIndent = options["noArrayIndent"] || false; - this.skipInvalid = options["skipInvalid"] || false; - this.flowLevel = common.isNothing(options["flowLevel"]) ? -1 : options["flowLevel"]; - this.styleMap = compileStyleMap(this.schema, options["styles"] || null); - this.sortKeys = options["sortKeys"] || false; - this.lineWidth = options["lineWidth"] || 80; - this.noRefs = options["noRefs"] || false; - this.noCompatMode = options["noCompatMode"] || false; - this.condenseFlow = options["condenseFlow"] || false; - this.quotingType = options["quotingType"] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE; - this.forceQuotes = options["forceQuotes"] || false; - this.replacer = typeof options["replacer"] === "function" ? options["replacer"] : null; - this.implicitTypes = this.schema.compiledImplicit; - this.explicitTypes = this.schema.compiledExplicit; - this.tag = null; - this.result = ""; - this.duplicates = []; - this.usedDuplicates = null; -} -function indentString(string, spaces) { - var ind = common.repeat(" ", spaces), position = 0, next = -1, result = "", line, length = string.length; - while (position < length) { - next = string.indexOf("\n", position); - if (next === -1) { - line = string.slice(position); - position = length; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + ch = state.input.charCodeAt(++state.position); + while (ch !== 0) { + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if (ch === terminator) { + state.position++; + state.tag = _tag; + state.anchor = _anchor; + state.kind = isMapping ? "mapping" : "sequence"; + state.result = _result; + return true; + } else if (!readNext) { + throwError(state, "missed comma between flow collection entries"); + } else if (ch === 44) { + throwError(state, "expected the node content, but found ','"); + } + keyTag = keyNode = valueNode = null; + isPair = isExplicitPair = false; + if (ch === 63) { + following = state.input.charCodeAt(state.position + 1); + if (is_WS_OR_EOL(following)) { + isPair = isExplicitPair = true; + state.position++; + skipSeparationSpace(state, true, nodeIndent); + } + } + _line = state.line; + _lineStart = state.lineStart; + _pos = state.position; + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + keyTag = state.tag; + keyNode = state.result; + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if ((isExplicitPair || state.line === _line) && ch === 58) { + isPair = true; + ch = state.input.charCodeAt(++state.position); + skipSeparationSpace(state, true, nodeIndent); + composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true); + valueNode = state.result; + } + if (isMapping) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos); + } else if (isPair) { + _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos)); } else { - line = string.slice(position, next + 1); - position = next + 1; + _result.push(keyNode); + } + skipSeparationSpace(state, true, nodeIndent); + ch = state.input.charCodeAt(state.position); + if (ch === 44) { + readNext = true; + ch = state.input.charCodeAt(++state.position); + } else { + readNext = false; } - if (line.length && line !== "\n") result += ind; - result += line; } - return result; + throwError(state, "unexpected end of the stream within a flow collection"); } -function generateNextLine(state, level) { - return "\n" + common.repeat(" ", state.indent * level); +function readBlockScalar(state, nodeIndent) { + var captureStart, folding, chomping = CHOMPING_CLIP, didReadContent = false, detectedIndent = false, textIndent = nodeIndent, emptyLines = 0, atMoreIndented = false, tmp, ch; + ch = state.input.charCodeAt(state.position); + if (ch === 124) { + folding = false; + } else if (ch === 62) { + folding = true; + } else { + return false; + } + state.kind = "scalar"; + state.result = ""; + while (ch !== 0) { + ch = state.input.charCodeAt(++state.position); + if (ch === 43 || ch === 45) { + if (CHOMPING_CLIP === chomping) { + chomping = ch === 43 ? CHOMPING_KEEP : CHOMPING_STRIP; + } else { + throwError(state, "repeat of a chomping mode identifier"); + } + } else if ((tmp = fromDecimalCode(ch)) >= 0) { + if (tmp === 0) { + throwError(state, "bad explicit indentation width of a block scalar; it cannot be less than one"); + } else if (!detectedIndent) { + textIndent = nodeIndent + tmp - 1; + detectedIndent = true; + } else { + throwError(state, "repeat of an indentation width identifier"); + } + } else { + break; + } + } + if (is_WHITE_SPACE(ch)) { + do { + ch = state.input.charCodeAt(++state.position); + } while (is_WHITE_SPACE(ch)); + if (ch === 35) { + do { + ch = state.input.charCodeAt(++state.position); + } while (!is_EOL(ch) && ch !== 0); + } + } + while (ch !== 0) { + readLineBreak(state); + state.lineIndent = 0; + ch = state.input.charCodeAt(state.position); + while ((!detectedIndent || state.lineIndent < textIndent) && ch === 32) { + state.lineIndent++; + ch = state.input.charCodeAt(++state.position); + } + if (!detectedIndent && state.lineIndent > textIndent) { + textIndent = state.lineIndent; + } + if (is_EOL(ch)) { + emptyLines++; + continue; + } + if (state.lineIndent < textIndent) { + if (chomping === CHOMPING_KEEP) { + state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); + } else if (chomping === CHOMPING_CLIP) { + if (didReadContent) { + state.result += "\n"; + } + } + break; + } + if (folding) { + if (is_WHITE_SPACE(ch)) { + atMoreIndented = true; + state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); + } else if (atMoreIndented) { + atMoreIndented = false; + state.result += common.repeat("\n", emptyLines + 1); + } else if (emptyLines === 0) { + if (didReadContent) { + state.result += " "; + } + } else { + state.result += common.repeat("\n", emptyLines); + } + } else { + state.result += common.repeat("\n", didReadContent ? 1 + emptyLines : emptyLines); + } + didReadContent = true; + detectedIndent = true; + emptyLines = 0; + captureStart = state.position; + while (!is_EOL(ch) && ch !== 0) { + ch = state.input.charCodeAt(++state.position); + } + captureSegment(state, captureStart, state.position, false); + } + return true; } -function testImplicitResolving(state, str2) { - var index, length, type2; - for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { - type2 = state.implicitTypes[index]; - if (type2.resolve(str2)) { - return true; +function readBlockSequence(state, nodeIndent) { + var _line, _tag = state.tag, _anchor = state.anchor, _result = [], following, detected = false, ch; + if (state.firstTabInLine !== -1) return false; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + ch = state.input.charCodeAt(state.position); + while (ch !== 0) { + if (state.firstTabInLine !== -1) { + state.position = state.firstTabInLine; + throwError(state, "tab characters must not be used in indentation"); + } + if (ch !== 45) { + break; + } + following = state.input.charCodeAt(state.position + 1); + if (!is_WS_OR_EOL(following)) { + break; + } + detected = true; + state.position++; + if (skipSeparationSpace(state, true, -1)) { + if (state.lineIndent <= nodeIndent) { + _result.push(null); + ch = state.input.charCodeAt(state.position); + continue; + } + } + _line = state.line; + composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true); + _result.push(state.result); + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { + throwError(state, "bad indentation of a sequence entry"); + } else if (state.lineIndent < nodeIndent) { + break; } } + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = "sequence"; + state.result = _result; + return true; + } return false; } -function isWhitespace(c) { - return c === CHAR_SPACE || c === CHAR_TAB; -} -function isPrintable(c) { - return 32 <= c && c <= 126 || 161 <= c && c <= 55295 && c !== 8232 && c !== 8233 || 57344 <= c && c <= 65533 && c !== CHAR_BOM || 65536 <= c && c <= 1114111; -} -function isNsCharOrWhitespace(c) { - return isPrintable(c) && c !== CHAR_BOM && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED; -} -function isPlainSafe(c, prev, inblock) { - var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c); - var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c); - return ( - // ns-plain-safe - (inblock ? ( - // c = flow-in - cIsNsCharOrWhitespace - ) : cIsNsCharOrWhitespace && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET) && c !== CHAR_SHARP && !(prev === CHAR_COLON && !cIsNsChar) || isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP || prev === CHAR_COLON && cIsNsChar - ); -} -function isPlainSafeFirst(c) { - return isPrintable(c) && c !== CHAR_BOM && !isWhitespace(c) && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT; -} -function isPlainSafeLast(c) { - return !isWhitespace(c) && c !== CHAR_COLON; -} -function codePointAt(string, pos) { - var first = string.charCodeAt(pos), second; - if (first >= 55296 && first <= 56319 && pos + 1 < string.length) { - second = string.charCodeAt(pos + 1); - if (second >= 56320 && second <= 57343) { - return (first - 55296) * 1024 + second - 56320 + 65536; +function readBlockMapping(state, nodeIndent, flowIndent) { + var following, allowCompact, _line, _keyLine, _keyLineStart, _keyPos, _tag = state.tag, _anchor = state.anchor, _result = {}, overridableKeys = /* @__PURE__ */ Object.create(null), keyTag = null, keyNode = null, valueNode = null, atExplicitKey = false, detected = false, ch; + if (state.firstTabInLine !== -1) return false; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = _result; + } + ch = state.input.charCodeAt(state.position); + while (ch !== 0) { + if (!atExplicitKey && state.firstTabInLine !== -1) { + state.position = state.firstTabInLine; + throwError(state, "tab characters must not be used in indentation"); + } + following = state.input.charCodeAt(state.position + 1); + _line = state.line; + if ((ch === 63 || ch === 58) && is_WS_OR_EOL(following)) { + if (ch === 63) { + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + detected = true; + atExplicitKey = true; + allowCompact = true; + } else if (atExplicitKey) { + atExplicitKey = false; + allowCompact = true; + } else { + throwError(state, "incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"); + } + state.position += 1; + ch = following; + } else { + _keyLine = state.line; + _keyLineStart = state.lineStart; + _keyPos = state.position; + if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) { + break; + } + if (state.line === _line) { + ch = state.input.charCodeAt(state.position); + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); + } + if (ch === 58) { + ch = state.input.charCodeAt(++state.position); + if (!is_WS_OR_EOL(ch)) { + throwError(state, "a whitespace character is expected after the key-value separator within a block mapping"); + } + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + detected = true; + atExplicitKey = false; + allowCompact = false; + keyTag = state.tag; + keyNode = state.result; + } else if (detected) { + throwError(state, "can not read an implicit mapping pair; a colon is missed"); + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; + } + } else if (detected) { + throwError(state, "can not read a block mapping entry; a multiline key may not be an implicit key"); + } else { + state.tag = _tag; + state.anchor = _anchor; + return true; + } + } + if (state.line === _line || state.lineIndent > nodeIndent) { + if (atExplicitKey) { + _keyLine = state.line; + _keyLineStart = state.lineStart; + _keyPos = state.position; + } + if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) { + if (atExplicitKey) { + keyNode = state.result; + } else { + valueNode = state.result; + } + } + if (!atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos); + keyTag = keyNode = valueNode = null; + } + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + } + if ((state.line === _line || state.lineIndent > nodeIndent) && ch !== 0) { + throwError(state, "bad indentation of a mapping entry"); + } else if (state.lineIndent < nodeIndent) { + break; } } - return first; -} -function needIndentIndicator(string) { - var leadingSpaceRe = /^\n* /; - return leadingSpaceRe.test(string); + if (atExplicitKey) { + storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos); + } + if (detected) { + state.tag = _tag; + state.anchor = _anchor; + state.kind = "mapping"; + state.result = _result; + } + return detected; } -var STYLE_PLAIN = 1; -var STYLE_SINGLE = 2; -var STYLE_LITERAL = 3; -var STYLE_FOLDED = 4; -var STYLE_DOUBLE = 5; -function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType, quotingType, forceQuotes, inblock) { - var i; - var char = 0; - var prevChar = null; - var hasLineBreak = false; - var hasFoldableLine = false; - var shouldTrackWidth = lineWidth !== -1; - var previousLineBreak = -1; - var plain = isPlainSafeFirst(codePointAt(string, 0)) && isPlainSafeLast(codePointAt(string, string.length - 1)); - if (singleLineOnly || forceQuotes) { - for (i = 0; i < string.length; char >= 65536 ? i += 2 : i++) { - char = codePointAt(string, i); - if (!isPrintable(char)) { - return STYLE_DOUBLE; - } - plain = plain && isPlainSafe(char, prevChar, inblock); - prevChar = char; +function readTagProperty(state) { + var _position, isVerbatim = false, isNamed = false, tagHandle, tagName, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 33) return false; + if (state.tag !== null) { + throwError(state, "duplication of a tag property"); + } + ch = state.input.charCodeAt(++state.position); + if (ch === 60) { + isVerbatim = true; + ch = state.input.charCodeAt(++state.position); + } else if (ch === 33) { + isNamed = true; + tagHandle = "!!"; + ch = state.input.charCodeAt(++state.position); + } else { + tagHandle = "!"; + } + _position = state.position; + if (isVerbatim) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0 && ch !== 62); + if (state.position < state.length) { + tagName = state.input.slice(_position, state.position); + ch = state.input.charCodeAt(++state.position); + } else { + throwError(state, "unexpected end of the stream within a verbatim tag"); } } else { - for (i = 0; i < string.length; char >= 65536 ? i += 2 : i++) { - char = codePointAt(string, i); - if (char === CHAR_LINE_FEED) { - hasLineBreak = true; - if (shouldTrackWidth) { - hasFoldableLine = hasFoldableLine || // Foldable line = too long, and not more-indented. - i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== " "; - previousLineBreak = i; + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + if (ch === 33) { + if (!isNamed) { + tagHandle = state.input.slice(_position - 1, state.position + 1); + if (!PATTERN_TAG_HANDLE.test(tagHandle)) { + throwError(state, "named tag handle cannot contain such characters"); + } + isNamed = true; + _position = state.position + 1; + } else { + throwError(state, "tag suffix cannot contain exclamation marks"); } - } else if (!isPrintable(char)) { - return STYLE_DOUBLE; } - plain = plain && isPlainSafe(char, prevChar, inblock); - prevChar = char; + ch = state.input.charCodeAt(++state.position); } - hasFoldableLine = hasFoldableLine || shouldTrackWidth && (i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== " "); - } - if (!hasLineBreak && !hasFoldableLine) { - if (plain && !forceQuotes && !testAmbiguousType(string)) { - return STYLE_PLAIN; + tagName = state.input.slice(_position, state.position); + if (PATTERN_FLOW_INDICATORS.test(tagName)) { + throwError(state, "tag suffix cannot contain flow indicator characters"); } - return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; } - if (indentPerLevel > 9 && needIndentIndicator(string)) { - return STYLE_DOUBLE; + if (tagName && !PATTERN_TAG_URI.test(tagName)) { + throwError(state, "tag name cannot contain such characters: " + tagName); } - if (!forceQuotes) { - return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; + try { + tagName = decodeURIComponent(tagName); + } catch (err) { + throwError(state, "tag name is malformed: " + tagName); } - return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; -} -function writeScalar(state, string, level, iskey, inblock) { - state.dump = (function() { - if (string.length === 0) { - return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''"; - } - if (!state.noCompatMode) { - if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) { - return state.quotingType === QUOTING_TYPE_DOUBLE ? '"' + string + '"' : "'" + string + "'"; - } - } - var indent = state.indent * Math.max(1, level); - var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); - var singleLineOnly = iskey || state.flowLevel > -1 && level >= state.flowLevel; - function testAmbiguity(string2) { - return testImplicitResolving(state, string2); - } - switch (chooseScalarStyle( - string, - singleLineOnly, - state.indent, - lineWidth, - testAmbiguity, - state.quotingType, - state.forceQuotes && !iskey, - inblock - )) { - case STYLE_PLAIN: - return string; - case STYLE_SINGLE: - return "'" + string.replace(/'/g, "''") + "'"; - case STYLE_LITERAL: - return "|" + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent)); - case STYLE_FOLDED: - return ">" + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); - case STYLE_DOUBLE: - return '"' + escapeString(string) + '"'; - default: - throw new exception("impossible error: invalid scalar style"); - } - })(); -} -function blockHeader(string, indentPerLevel) { - var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ""; - var clip = string[string.length - 1] === "\n"; - var keep = clip && (string[string.length - 2] === "\n" || string === "\n"); - var chomp = keep ? "+" : clip ? "" : "-"; - return indentIndicator + chomp + "\n"; -} -function dropEndingNewline(string) { - return string[string.length - 1] === "\n" ? string.slice(0, -1) : string; -} -function foldString(string, width) { - var lineRe = /(\n+)([^\n]*)/g; - var result = (function() { - var nextLF = string.indexOf("\n"); - nextLF = nextLF !== -1 ? nextLF : string.length; - lineRe.lastIndex = nextLF; - return foldLine(string.slice(0, nextLF), width); - })(); - var prevMoreIndented = string[0] === "\n" || string[0] === " "; - var moreIndented; - var match; - while (match = lineRe.exec(string)) { - var prefix = match[1], line = match[2]; - moreIndented = line[0] === " "; - result += prefix + (!prevMoreIndented && !moreIndented && line !== "" ? "\n" : "") + foldLine(line, width); - prevMoreIndented = moreIndented; + if (isVerbatim) { + state.tag = tagName; + } else if (_hasOwnProperty$1.call(state.tagMap, tagHandle)) { + state.tag = state.tagMap[tagHandle] + tagName; + } else if (tagHandle === "!") { + state.tag = "!" + tagName; + } else if (tagHandle === "!!") { + state.tag = "tag:yaml.org,2002:" + tagName; + } else { + throwError(state, 'undeclared tag handle "' + tagHandle + '"'); } - return result; + return true; } -function foldLine(line, width) { - if (line === "" || line[0] === " ") return line; - var breakRe = / [^ ]/g; - var match; - var start = 0, end, curr = 0, next = 0; - var result = ""; - while (match = breakRe.exec(line)) { - next = match.index; - if (next - start > width) { - end = curr > start ? curr : next; - result += "\n" + line.slice(start, end); - start = end + 1; - } - curr = next; +function readAnchorProperty(state) { + var _position, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 38) return false; + if (state.anchor !== null) { + throwError(state, "duplication of an anchor property"); } - result += "\n"; - if (line.length - start > width && curr > start) { - result += line.slice(start, curr) + "\n" + line.slice(curr + 1); - } else { - result += line.slice(start); + ch = state.input.charCodeAt(++state.position); + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); } - return result.slice(1); -} -function escapeString(string) { - var result = ""; - var char = 0; - var escapeSeq; - for (var i = 0; i < string.length; char >= 65536 ? i += 2 : i++) { - char = codePointAt(string, i); - escapeSeq = ESCAPE_SEQUENCES[char]; - if (!escapeSeq && isPrintable(char)) { - result += string[i]; - if (char >= 65536) result += string[i + 1]; - } else { - result += escapeSeq || encodeHex(char); - } + if (state.position === _position) { + throwError(state, "name of an anchor node must contain at least one character"); } - return result; + state.anchor = state.input.slice(_position, state.position); + return true; } -function writeFlowSequence(state, level, object) { - var _result = "", _tag = state.tag, index, length, value; - for (index = 0, length = object.length; index < length; index += 1) { - value = object[index]; - if (state.replacer) { - value = state.replacer.call(object, String(index), value); - } - if (writeNode(state, level, value, false, false) || typeof value === "undefined" && writeNode(state, level, null, false, false)) { - if (_result !== "") _result += "," + (!state.condenseFlow ? " " : ""); - _result += state.dump; - } +function readAlias(state) { + var _position, alias, ch; + ch = state.input.charCodeAt(state.position); + if (ch !== 42) return false; + ch = state.input.charCodeAt(++state.position); + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) { + ch = state.input.charCodeAt(++state.position); } - state.tag = _tag; - state.dump = "[" + _result + "]"; + if (state.position === _position) { + throwError(state, "name of an alias node must contain at least one character"); + } + alias = state.input.slice(_position, state.position); + if (!_hasOwnProperty$1.call(state.anchorMap, alias)) { + throwError(state, 'unidentified alias "' + alias + '"'); + } + state.result = state.anchorMap[alias]; + skipSeparationSpace(state, true, -1); + return true; } -function writeBlockSequence(state, level, object, compact) { - var _result = "", _tag = state.tag, index, length, value; - for (index = 0, length = object.length; index < length; index += 1) { - value = object[index]; - if (state.replacer) { - value = state.replacer.call(object, String(index), value); - } - if (writeNode(state, level + 1, value, true, true, false, true) || typeof value === "undefined" && writeNode(state, level + 1, null, true, true, false, true)) { - if (!compact || _result !== "") { - _result += generateNextLine(state, level); - } - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - _result += "-"; - } else { - _result += "- "; +function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) { + var allowBlockStyles, allowBlockScalars, allowBlockCollections, indentStatus = 1, atNewLine = false, hasContent = false, typeIndex, typeQuantity, typeList, type2, flowIndent, blockIndent; + if (state.listener !== null) { + state.listener("open", state); + } + state.tag = null; + state.anchor = null; + state.kind = null; + state.result = null; + allowBlockStyles = allowBlockScalars = allowBlockCollections = CONTEXT_BLOCK_OUT === nodeContext || CONTEXT_BLOCK_IN === nodeContext; + if (allowToSeek) { + if (skipSeparationSpace(state, true, -1)) { + atNewLine = true; + if (state.lineIndent > parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; } - _result += state.dump; } } - state.tag = _tag; - state.dump = _result || "[]"; -} -function writeFlowMapping(state, level, object) { - var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, pairBuffer; - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - pairBuffer = ""; - if (_result !== "") pairBuffer += ", "; - if (state.condenseFlow) pairBuffer += '"'; - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; - if (state.replacer) { - objectValue = state.replacer.call(object, objectKey, objectValue); - } - if (!writeNode(state, level, objectKey, false, false)) { - continue; - } - if (state.dump.length > 1024) pairBuffer += "? "; - pairBuffer += state.dump + (state.condenseFlow ? '"' : "") + ":" + (state.condenseFlow ? "" : " "); - if (!writeNode(state, level, objectValue, false, false)) { - continue; + if (indentStatus === 1) { + while (readTagProperty(state) || readAnchorProperty(state)) { + if (skipSeparationSpace(state, true, -1)) { + atNewLine = true; + allowBlockCollections = allowBlockStyles; + if (state.lineIndent > parentIndent) { + indentStatus = 1; + } else if (state.lineIndent === parentIndent) { + indentStatus = 0; + } else if (state.lineIndent < parentIndent) { + indentStatus = -1; + } + } else { + allowBlockCollections = false; + } } - pairBuffer += state.dump; - _result += pairBuffer; } - state.tag = _tag; - state.dump = "{" + _result + "}"; -} -function writeBlockMapping(state, level, object, compact) { - var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, explicitPair, pairBuffer; - if (state.sortKeys === true) { - objectKeyList.sort(); - } else if (typeof state.sortKeys === "function") { - objectKeyList.sort(state.sortKeys); - } else if (state.sortKeys) { - throw new exception("sortKeys must be a boolean or a function"); + if (allowBlockCollections) { + allowBlockCollections = atNewLine || allowCompact; } - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - pairBuffer = ""; - if (!compact || _result !== "") { - pairBuffer += generateNextLine(state, level); - } - objectKey = objectKeyList[index]; - objectValue = object[objectKey]; - if (state.replacer) { - objectValue = state.replacer.call(object, objectKey, objectValue); - } - if (!writeNode(state, level + 1, objectKey, true, true, true)) { - continue; + if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) { + if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) { + flowIndent = parentIndent; + } else { + flowIndent = parentIndent + 1; } - explicitPair = state.tag !== null && state.tag !== "?" || state.dump && state.dump.length > 1024; - if (explicitPair) { - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += "?"; + blockIndent = state.position - state.lineStart; + if (indentStatus === 1) { + if (allowBlockCollections && (readBlockSequence(state, blockIndent) || readBlockMapping(state, blockIndent, flowIndent)) || readFlowCollection(state, flowIndent)) { + hasContent = true; } else { - pairBuffer += "? "; + if (allowBlockScalars && readBlockScalar(state, flowIndent) || readSingleQuotedScalar(state, flowIndent) || readDoubleQuotedScalar(state, flowIndent)) { + hasContent = true; + } else if (readAlias(state)) { + hasContent = true; + if (state.tag !== null || state.anchor !== null) { + throwError(state, "alias node should not have any properties"); + } + } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) { + hasContent = true; + if (state.tag === null) { + state.tag = "?"; + } + } + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } } + } else if (indentStatus === 0) { + hasContent = allowBlockCollections && readBlockSequence(state, blockIndent); } - pairBuffer += state.dump; - if (explicitPair) { - pairBuffer += generateNextLine(state, level); - } - if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { - continue; + } + if (state.tag === null) { + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; } - if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { - pairBuffer += ":"; - } else { - pairBuffer += ": "; + } else if (state.tag === "?") { + if (state.result !== null && state.kind !== "scalar") { + throwError(state, 'unacceptable node kind for ! tag; it should be "scalar", not "' + state.kind + '"'); } - pairBuffer += state.dump; - _result += pairBuffer; - } - state.tag = _tag; - state.dump = _result || "{}"; -} -function detectType(state, object, explicit) { - var _result, typeList, index, length, type2, style; - typeList = explicit ? state.explicitTypes : state.implicitTypes; - for (index = 0, length = typeList.length; index < length; index += 1) { - type2 = typeList[index]; - if ((type2.instanceOf || type2.predicate) && (!type2.instanceOf || typeof object === "object" && object instanceof type2.instanceOf) && (!type2.predicate || type2.predicate(object))) { - if (explicit) { - if (type2.multi && type2.representName) { - state.tag = type2.representName(object); - } else { - state.tag = type2.tag; + for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) { + type2 = state.implicitTypes[typeIndex]; + if (type2.resolve(state.result)) { + state.result = type2.construct(state.result); + state.tag = type2.tag; + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; } - } else { - state.tag = "?"; + break; } - if (type2.represent) { - style = state.styleMap[type2.tag] || type2.defaultStyle; - if (_toString.call(type2.represent) === "[object Function]") { - _result = type2.represent(object, style); - } else if (_hasOwnProperty.call(type2.represent, style)) { - _result = type2.represent[style](object, style); - } else { - throw new exception("!<" + type2.tag + '> tag resolver accepts not "' + style + '" style'); + } + } else if (state.tag !== "!") { + if (_hasOwnProperty$1.call(state.typeMap[state.kind || "fallback"], state.tag)) { + type2 = state.typeMap[state.kind || "fallback"][state.tag]; + } else { + type2 = null; + typeList = state.typeMap.multi[state.kind || "fallback"]; + for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) { + if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) { + type2 = typeList[typeIndex]; + break; } - state.dump = _result; } - return true; + } + if (!type2) { + throwError(state, "unknown tag !<" + state.tag + ">"); + } + if (state.result !== null && type2.kind !== state.kind) { + throwError(state, "unacceptable node kind for !<" + state.tag + '> tag; it should be "' + type2.kind + '", not "' + state.kind + '"'); + } + if (!type2.resolve(state.result, state.tag)) { + throwError(state, "cannot resolve a node with !<" + state.tag + "> explicit tag"); + } else { + state.result = type2.construct(state.result, state.tag); + if (state.anchor !== null) { + state.anchorMap[state.anchor] = state.result; + } } } - return false; -} -function writeNode(state, level, object, block, compact, iskey, isblockseq) { - state.tag = null; - state.dump = object; - if (!detectType(state, object, false)) { - detectType(state, object, true); - } - var type2 = _toString.call(state.dump); - var inblock = block; - var tagStr; - if (block) { - block = state.flowLevel < 0 || state.flowLevel > level; - } - var objectOrArray = type2 === "[object Object]" || type2 === "[object Array]", duplicateIndex, duplicate; - if (objectOrArray) { - duplicateIndex = state.duplicates.indexOf(object); - duplicate = duplicateIndex !== -1; - } - if (state.tag !== null && state.tag !== "?" || duplicate || state.indent !== 2 && level > 0) { - compact = false; + if (state.listener !== null) { + state.listener("close", state); } - if (duplicate && state.usedDuplicates[duplicateIndex]) { - state.dump = "*ref_" + duplicateIndex; - } else { - if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { - state.usedDuplicates[duplicateIndex] = true; + return state.tag !== null || state.anchor !== null || hasContent; +} +function readDocument(state) { + var documentStart = state.position, _position, directiveName, directiveArgs, hasDirectives = false, ch; + state.version = null; + state.checkLineBreaks = state.legacy; + state.tagMap = /* @__PURE__ */ Object.create(null); + state.anchorMap = /* @__PURE__ */ Object.create(null); + while ((ch = state.input.charCodeAt(state.position)) !== 0) { + skipSeparationSpace(state, true, -1); + ch = state.input.charCodeAt(state.position); + if (state.lineIndent > 0 || ch !== 37) { + break; } - if (type2 === "[object Object]") { - if (block && Object.keys(state.dump).length !== 0) { - writeBlockMapping(state, level, state.dump, compact); - if (duplicate) { - state.dump = "&ref_" + duplicateIndex + state.dump; - } - } else { - writeFlowMapping(state, level, state.dump); - if (duplicate) { - state.dump = "&ref_" + duplicateIndex + " " + state.dump; - } - } - } else if (type2 === "[object Array]") { - if (block && state.dump.length !== 0) { - if (state.noArrayIndent && !isblockseq && level > 0) { - writeBlockSequence(state, level - 1, state.dump, compact); - } else { - writeBlockSequence(state, level, state.dump, compact); - } - if (duplicate) { - state.dump = "&ref_" + duplicateIndex + state.dump; - } - } else { - writeFlowSequence(state, level, state.dump); - if (duplicate) { - state.dump = "&ref_" + duplicateIndex + " " + state.dump; - } + hasDirectives = true; + ch = state.input.charCodeAt(++state.position); + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); + } + directiveName = state.input.slice(_position, state.position); + directiveArgs = []; + if (directiveName.length < 1) { + throwError(state, "directive name must not be less than one character in length"); + } + while (ch !== 0) { + while (is_WHITE_SPACE(ch)) { + ch = state.input.charCodeAt(++state.position); } - } else if (type2 === "[object String]") { - if (state.tag !== "?") { - writeScalar(state, state.dump, level, iskey, inblock); + if (ch === 35) { + do { + ch = state.input.charCodeAt(++state.position); + } while (ch !== 0 && !is_EOL(ch)); + break; } - } else if (type2 === "[object Undefined]") { - return false; - } else { - if (state.skipInvalid) return false; - throw new exception("unacceptable kind of an object to dump " + type2); - } - if (state.tag !== null && state.tag !== "?") { - tagStr = encodeURI( - state.tag[0] === "!" ? state.tag.slice(1) : state.tag - ).replace(/!/g, "%21"); - if (state.tag[0] === "!") { - tagStr = "!" + tagStr; - } else if (tagStr.slice(0, 18) === "tag:yaml.org,2002:") { - tagStr = "!!" + tagStr.slice(18); - } else { - tagStr = "!<" + tagStr + ">"; + if (is_EOL(ch)) break; + _position = state.position; + while (ch !== 0 && !is_WS_OR_EOL(ch)) { + ch = state.input.charCodeAt(++state.position); } - state.dump = tagStr + " " + state.dump; + directiveArgs.push(state.input.slice(_position, state.position)); + } + if (ch !== 0) readLineBreak(state); + if (_hasOwnProperty$1.call(directiveHandlers, directiveName)) { + directiveHandlers[directiveName](state, directiveName, directiveArgs); + } else { + throwWarning(state, 'unknown document directive "' + directiveName + '"'); } } - return true; -} -function getDuplicateReferences(object, state) { - var objects = [], duplicatesIndexes = [], index, length; - inspectNode(object, objects, duplicatesIndexes); - for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { - state.duplicates.push(objects[duplicatesIndexes[index]]); + skipSeparationSpace(state, true, -1); + if (state.lineIndent === 0 && state.input.charCodeAt(state.position) === 45 && state.input.charCodeAt(state.position + 1) === 45 && state.input.charCodeAt(state.position + 2) === 45) { + state.position += 3; + skipSeparationSpace(state, true, -1); + } else if (hasDirectives) { + throwError(state, "directives end mark is expected"); } - state.usedDuplicates = new Array(length); -} -function inspectNode(object, objects, duplicatesIndexes) { - var objectKeyList, index, length; - if (object !== null && typeof object === "object") { - index = objects.indexOf(object); - if (index !== -1) { - if (duplicatesIndexes.indexOf(index) === -1) { - duplicatesIndexes.push(index); - } - } else { - objects.push(object); - if (Array.isArray(object)) { - for (index = 0, length = object.length; index < length; index += 1) { - inspectNode(object[index], objects, duplicatesIndexes); - } - } else { - objectKeyList = Object.keys(object); - for (index = 0, length = objectKeyList.length; index < length; index += 1) { - inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); - } - } + composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true); + skipSeparationSpace(state, true, -1); + if (state.checkLineBreaks && PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) { + throwWarning(state, "non-ASCII line breaks are interpreted as content"); + } + state.documents.push(state.result); + if (state.position === state.lineStart && testDocumentSeparator(state)) { + if (state.input.charCodeAt(state.position) === 46) { + state.position += 3; + skipSeparationSpace(state, true, -1); } + return; } -} -function dump$1(input, options) { - options = options || {}; - var state = new State(options); - if (!state.noRefs) getDuplicateReferences(input, state); - var value = input; - if (state.replacer) { - value = state.replacer.call({ "": value }, "", value); + if (state.position < state.length - 1) { + throwError(state, "end of the stream or a document separator is expected"); + } else { + return; } - if (writeNode(state, 0, value, true, true)) return state.dump + "\n"; - return ""; -} -var dump_1 = dump$1; -var dumper = { - dump: dump_1 -}; -function renamed(from, to) { - return function() { - throw new Error("Function yaml." + from + " is removed in js-yaml 4. Use yaml." + to + " instead, which is now safe by default."); - }; } -var load = loader.load; -var loadAll = loader.loadAll; -var dump = dumper.dump; -var safeLoad = renamed("safeLoad", "load"); -var safeLoadAll = renamed("safeLoadAll", "loadAll"); -var safeDump = renamed("safeDump", "dump"); - -// src/lib/metadata-resolver.ts -init_cli_executor(); -init_logger(); -async function resolveQueryMetadata(queryPath) { - try { - logger.info(`Resolving metadata for query: ${queryPath}`); - const result = await executeCodeQLCommand( - "resolve metadata", - { format: "json" }, - [queryPath] - ); - if (!result.success) { - logger.error(`Failed to resolve metadata for ${queryPath}:`, result.stderr || result.error); - return null; +function loadDocuments(input, options) { + input = String(input); + options = options || {}; + if (input.length !== 0) { + if (input.charCodeAt(input.length - 1) !== 10 && input.charCodeAt(input.length - 1) !== 13) { + input += "\n"; } - try { - const metadata = JSON.parse(result.stdout); - return metadata; - } catch (parseError) { - logger.error(`Failed to parse metadata JSON for ${queryPath}:`, parseError); - return null; + if (input.charCodeAt(0) === 65279) { + input = input.slice(1); } - } catch (error) { - logger.error(`Error resolving metadata for ${queryPath}:`, error); - return null; } -} - -// src/lib/query-file-finder.ts -var LANGUAGE_EXTENSIONS = { - actions: "yml", - cpp: "cpp", - csharp: "cs", - go: "go", - java: "java", - javascript: "js", - python: "py", - ruby: "rb", - swift: "swift", - typescript: "ts" -}; -var KNOWN_LANGUAGES = Object.keys(LANGUAGE_EXTENSIONS); -function getLanguageExtension(language) { - return LANGUAGE_EXTENSIONS[language.toLowerCase()] || "txt"; -} -function inferLanguageFromPath(queryPath) { - const parts = queryPath.split(path.sep); - for (const part of parts) { - if (KNOWN_LANGUAGES.includes(part.toLowerCase())) { - return part.toLowerCase(); - } + var state = new State$1(input, options); + var nullpos = input.indexOf("\0"); + if (nullpos !== -1) { + state.position = nullpos; + throwError(state, "null byte is not allowed in input"); } - return "unknown"; -} -function findNearestQlpack(startPath) { - let currentPath = startPath; - const root = path.parse(currentPath).root; - while (currentPath !== root) { - for (const packFile of ["codeql-pack.yml", "qlpack.yml"]) { - const packPath = path.join(currentPath, packFile); - if (fs.existsSync(packPath) && fs.statSync(packPath).isFile()) { - return packPath; - } - } - currentPath = path.dirname(currentPath); + state.input += "\0"; + while (state.input.charCodeAt(state.position) === 32) { + state.lineIndent += 1; + state.position += 1; } - return null; -} -function readQlpackMetadata(qlpackPath) { - try { - const content = fs.readFileSync(qlpackPath, "utf-8"); - const parsed = load(content); - return parsed; - } catch (_error) { - return null; + while (state.position < state.length - 1) { + readDocument(state); } + return state.documents; } -function checkFile(filePath) { - try { - const exists = fs.existsSync(filePath) && fs.statSync(filePath).isFile(); - return { - exists, - path: filePath - // Always return path, whether it exists or not - }; - } catch { - return { - exists: false, - path: filePath - // Return the path even on error - }; +function loadAll$1(input, iterator, options) { + if (iterator !== null && typeof iterator === "object" && typeof options === "undefined") { + options = iterator; + iterator = null; } -} -function checkDirectory(dirPath) { - try { - const exists = fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory(); - return { - exists, - path: dirPath - // Always return path, whether it exists or not - }; - } catch { - return { - exists: false, - path: dirPath - // Return the path even on error - }; + var documents = loadDocuments(input, options); + if (typeof iterator !== "function") { + return documents; + } + for (var index = 0, length = documents.length; index < length; index += 1) { + iterator(documents[index]); } } -function findTestCodeFiles(testDir, queryName, language) { - if (!fs.existsSync(testDir)) { - return []; +function load$1(input, options) { + var documents = loadDocuments(input, options); + if (documents.length === 0) { + return void 0; + } else if (documents.length === 1) { + return documents[0]; } - try { - const files = fs.readdirSync(testDir); - const languageExt = getLanguageExtension(language); - const testFiles = []; - const allValidExtensions = [.../* @__PURE__ */ new Set([...Object.values(LANGUAGE_EXTENSIONS), "yaml"])]; - for (const file of files) { - const filePath = path.join(testDir, file); - const stat = fs.statSync(filePath); - if (stat.isFile()) { - if (file === `${queryName}.${languageExt}`) { - testFiles.push(filePath); - } else if (!file.endsWith(".qlref") && !file.endsWith(".expected") && !file.endsWith(".actual")) { - const ext = path.extname(file).slice(1); - if (ext === languageExt || allValidExtensions.includes(ext)) { - testFiles.push(filePath); - } - } - } + throw new exception("expected a single document in the stream, but found more"); +} +var loadAll_1 = loadAll$1; +var load_1 = load$1; +var loader = { + loadAll: loadAll_1, + load: load_1 +}; +var _toString = Object.prototype.toString; +var _hasOwnProperty = Object.prototype.hasOwnProperty; +var CHAR_BOM = 65279; +var CHAR_TAB = 9; +var CHAR_LINE_FEED = 10; +var CHAR_CARRIAGE_RETURN = 13; +var CHAR_SPACE = 32; +var CHAR_EXCLAMATION = 33; +var CHAR_DOUBLE_QUOTE = 34; +var CHAR_SHARP = 35; +var CHAR_PERCENT = 37; +var CHAR_AMPERSAND = 38; +var CHAR_SINGLE_QUOTE = 39; +var CHAR_ASTERISK = 42; +var CHAR_COMMA = 44; +var CHAR_MINUS = 45; +var CHAR_COLON = 58; +var CHAR_EQUALS = 61; +var CHAR_GREATER_THAN = 62; +var CHAR_QUESTION = 63; +var CHAR_COMMERCIAL_AT = 64; +var CHAR_LEFT_SQUARE_BRACKET = 91; +var CHAR_RIGHT_SQUARE_BRACKET = 93; +var CHAR_GRAVE_ACCENT = 96; +var CHAR_LEFT_CURLY_BRACKET = 123; +var CHAR_VERTICAL_LINE = 124; +var CHAR_RIGHT_CURLY_BRACKET = 125; +var ESCAPE_SEQUENCES = {}; +ESCAPE_SEQUENCES[0] = "\\0"; +ESCAPE_SEQUENCES[7] = "\\a"; +ESCAPE_SEQUENCES[8] = "\\b"; +ESCAPE_SEQUENCES[9] = "\\t"; +ESCAPE_SEQUENCES[10] = "\\n"; +ESCAPE_SEQUENCES[11] = "\\v"; +ESCAPE_SEQUENCES[12] = "\\f"; +ESCAPE_SEQUENCES[13] = "\\r"; +ESCAPE_SEQUENCES[27] = "\\e"; +ESCAPE_SEQUENCES[34] = '\\"'; +ESCAPE_SEQUENCES[92] = "\\\\"; +ESCAPE_SEQUENCES[133] = "\\N"; +ESCAPE_SEQUENCES[160] = "\\_"; +ESCAPE_SEQUENCES[8232] = "\\L"; +ESCAPE_SEQUENCES[8233] = "\\P"; +var DEPRECATED_BOOLEANS_SYNTAX = [ + "y", + "Y", + "yes", + "Yes", + "YES", + "on", + "On", + "ON", + "n", + "N", + "no", + "No", + "NO", + "off", + "Off", + "OFF" +]; +var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/; +function compileStyleMap(schema2, map2) { + var result, keys, index, length, tag, style, type2; + if (map2 === null) return {}; + result = {}; + keys = Object.keys(map2); + for (index = 0, length = keys.length; index < length; index += 1) { + tag = keys[index]; + style = String(map2[tag]); + if (tag.slice(0, 2) === "!!") { + tag = "tag:yaml.org,2002:" + tag.slice(2); } - return testFiles; - } catch { - return []; + type2 = schema2.compiledTypeMap["fallback"][tag]; + if (type2 && _hasOwnProperty.call(type2.styleAliases, style)) { + style = type2.styleAliases[style]; + } + result[tag] = style; } + return result; } -async function findCodeQLQueryFiles(queryFilePath, language, resolveMetadata = true) { - const absoluteQueryPath = path.resolve(queryFilePath); - const queryName = path.basename(absoluteQueryPath, ".ql"); - const queryDir = path.dirname(absoluteQueryPath); - const detectedLanguage = language || inferLanguageFromPath(absoluteQueryPath); - const queryPath = checkFile(absoluteQueryPath); - const queryDirectory = checkDirectory(queryDir); - const mdPath = path.join(queryDir, `${queryName}.md`); - const qhelpPath = path.join(queryDir, `${queryName}.qhelp`); - const mdInfo = checkFile(mdPath); - const qhelpInfo = checkFile(qhelpPath); - const documentationPath = mdInfo.exists ? mdInfo : qhelpInfo.exists ? qhelpInfo : { - exists: false, - path: mdPath - // Suggest .md as the default - }; - const qspecPath = path.join(queryDir, `${queryName}.qspec`); - const specificationPath = checkFile(qspecPath); - let testDir; - if (queryDir.includes(`${path.sep}src${path.sep}`)) { - const parts = queryDir.split(path.sep); - const srcIndex = parts.lastIndexOf("src"); - if (srcIndex !== -1) { - parts[srcIndex] = "test"; - testDir = parts.join(path.sep); - } else { - testDir = path.join(path.dirname(queryDir), "test", queryName); - } +function encodeHex(character) { + var string, handle, length; + string = character.toString(16).toUpperCase(); + if (character <= 255) { + handle = "x"; + length = 2; + } else if (character <= 65535) { + handle = "u"; + length = 4; + } else if (character <= 4294967295) { + handle = "U"; + length = 8; } else { - testDir = path.join(path.dirname(queryDir), "test", queryName); - } - const testDirectory = checkDirectory(testDir); - const qlrefPath = path.join(testDir, `${queryName}.qlref`); - const qlrefInfo = checkFile(qlrefPath); - const testCodePaths = findTestCodeFiles(testDir, queryName, detectedLanguage); - const expectedPath = path.join(testDir, `${queryName}.expected`); - const expectedResultsPath = checkFile(expectedPath); - const actualPath = path.join(testDir, `${queryName}.actual`); - const actualResultsPath = checkFile(actualPath); - const testprojPath = path.join(testDir, `${queryName}.testproj`); - const testDatabasePath = checkDirectory(testprojPath); - const missingFiles = []; - if (!queryPath.exists) missingFiles.push(queryPath.path); - if (!documentationPath.exists) missingFiles.push(documentationPath.path); - if (!specificationPath.exists) missingFiles.push(specificationPath.path); - if (!testDirectory.exists) missingFiles.push(testDirectory.path); - if (!qlrefInfo.exists) missingFiles.push(qlrefInfo.path); - if (testCodePaths.length === 0) missingFiles.push(path.join(testDir, `${queryName}.${getLanguageExtension(detectedLanguage)}`)); - if (!expectedResultsPath.exists) missingFiles.push(expectedResultsPath.path); - const allFilesExist = missingFiles.length === 0; - let metadata; - if (resolveMetadata && queryPath.exists) { - const resolvedMetadata = await resolveQueryMetadata(absoluteQueryPath); - if (resolvedMetadata) { - metadata = resolvedMetadata; - } - } - let packMetadata; - const queryPackPath = findNearestQlpack(queryDir); - const queryPackDir = queryPackPath ? path.dirname(queryPackPath) : queryDir; - if (queryPackPath) { - const parsed = readQlpackMetadata(queryPackPath); - if (parsed) { - packMetadata = parsed; - } + throw new exception("code point within a string may not be greater than 0xFFFFFFFF"); } - const testPackPath = findNearestQlpack(testDir); - const testPackDir = testPackPath ? path.dirname(testPackPath) : testDir; - return { - queryName, - language: detectedLanguage, - allFilesExist, - files: { - query: { - dir: queryDirectory.path, - doc: path.basename(documentationPath.path), - packDir: queryPackDir, - query: path.basename(queryPath.path), - spec: path.basename(specificationPath.path) - }, - test: { - actual: path.basename(actualResultsPath.path), - dir: testDirectory.path, - expected: path.basename(expectedResultsPath.path), - packDir: testPackDir, - qlref: path.basename(qlrefInfo.path), - testCode: testCodePaths, - testDatabaseDir: testDatabasePath.path - } - }, - metadata, - missingFiles, - packMetadata, - status: { - actualResultsExist: actualResultsPath.exists, - documentationExists: documentationPath.exists, - expectedResultsExist: expectedResultsPath.exists, - hasTestCode: testCodePaths.length > 0, - qlrefExists: qlrefInfo.exists, - queryExists: queryPath.exists, - specificationExists: specificationPath.exists, - testDatabaseDirExists: testDatabasePath.exists, - testDirectoryExists: testDirectory.exists - } - }; + return "\\" + handle + common.repeat("0", length - string.length) + string; } - -// src/tools/codeql/find-query-files.ts -init_logger(); -function registerFindCodeQLQueryFilesTool(server) { - server.tool( - "find_codeql_query_files", - "Find and track all files and directories related to a CodeQL query, including resolved metadata", - { - queryPath: z9.string().describe("Path to the CodeQL query file (.ql)"), - language: z9.string().optional().describe("Programming language (optional, will be inferred if not provided)"), - resolveMetadata: z9.boolean().optional().describe("Whether to resolve query metadata (default: true)") - }, - async ({ queryPath, language, resolveMetadata }) => { - try { - const result = await findCodeQLQueryFiles( - queryPath, - language, - resolveMetadata !== false - // Default to true if not specified - ); - return { - content: [{ type: "text", text: JSON.stringify(result, null, 2) }] - }; - } catch (error) { - logger.error("Error finding CodeQL query files:", error); - return { - content: [ - { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` - } - ], - isError: true - }; - } +var QUOTING_TYPE_SINGLE = 1; +var QUOTING_TYPE_DOUBLE = 2; +function State(options) { + this.schema = options["schema"] || _default; + this.indent = Math.max(1, options["indent"] || 2); + this.noArrayIndent = options["noArrayIndent"] || false; + this.skipInvalid = options["skipInvalid"] || false; + this.flowLevel = common.isNothing(options["flowLevel"]) ? -1 : options["flowLevel"]; + this.styleMap = compileStyleMap(this.schema, options["styles"] || null); + this.sortKeys = options["sortKeys"] || false; + this.lineWidth = options["lineWidth"] || 80; + this.noRefs = options["noRefs"] || false; + this.noCompatMode = options["noCompatMode"] || false; + this.condenseFlow = options["condenseFlow"] || false; + this.quotingType = options["quotingType"] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE; + this.forceQuotes = options["forceQuotes"] || false; + this.replacer = typeof options["replacer"] === "function" ? options["replacer"] : null; + this.implicitTypes = this.schema.compiledImplicit; + this.explicitTypes = this.schema.compiledExplicit; + this.tag = null; + this.result = ""; + this.duplicates = []; + this.usedDuplicates = null; +} +function indentString(string, spaces) { + var ind = common.repeat(" ", spaces), position = 0, next = -1, result = "", line, length = string.length; + while (position < length) { + next = string.indexOf("\n", position); + if (next === -1) { + line = string.slice(position); + position = length; + } else { + line = string.slice(position, next + 1); + position = next + 1; + } + if (line.length && line !== "\n") result += ind; + result += line; + } + return result; +} +function generateNextLine(state, level) { + return "\n" + common.repeat(" ", state.indent * level); +} +function testImplicitResolving(state, str2) { + var index, length, type2; + for (index = 0, length = state.implicitTypes.length; index < length; index += 1) { + type2 = state.implicitTypes[index]; + if (type2.resolve(str2)) { + return true; } + } + return false; +} +function isWhitespace(c) { + return c === CHAR_SPACE || c === CHAR_TAB; +} +function isPrintable(c) { + return 32 <= c && c <= 126 || 161 <= c && c <= 55295 && c !== 8232 && c !== 8233 || 57344 <= c && c <= 65533 && c !== CHAR_BOM || 65536 <= c && c <= 1114111; +} +function isNsCharOrWhitespace(c) { + return isPrintable(c) && c !== CHAR_BOM && c !== CHAR_CARRIAGE_RETURN && c !== CHAR_LINE_FEED; +} +function isPlainSafe(c, prev, inblock) { + var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c); + var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c); + return ( + // ns-plain-safe + (inblock ? ( + // c = flow-in + cIsNsCharOrWhitespace + ) : cIsNsCharOrWhitespace && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET) && c !== CHAR_SHARP && !(prev === CHAR_COLON && !cIsNsChar) || isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP || prev === CHAR_COLON && cIsNsChar ); } - -// src/tools/codeql/generate-log-summary.ts -import { z as z10 } from "zod"; -var codeqlGenerateLogSummaryTool = { - name: "codeql_generate_log-summary", - description: "Create a summary of a structured JSON evaluator event log file", - command: "codeql", - subcommand: "generate log-summary", - inputSchema: { - inputLog: z10.string().describe("Path to the evaluator log file to summarize"), - outputFile: z10.string().optional().describe("Path to write the summary (optional, defaults to stdout)"), - format: z10.enum(["text", "predicates", "overall"]).optional().describe("Output format: text (human-readable), predicates (JSON), or overall (stats)"), - "minify-output": z10.boolean().optional().describe("Minify JSON output"), - utc: z10.boolean().optional().describe("Force UTC timestamps"), - "deduplicate-stage-summaries": z10.boolean().optional().describe("Deduplicate stage summaries"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql generate log-summary --format=text -- evaluator-log.json.txt summary.txt", - "codeql generate log-summary --format=predicates --minify-output -- evaluator-log.json.txt", - "codeql generate log-summary --format=overall -- evaluator-log.json.txt overall-stats.json" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/generate-query-help.ts -import { z as z11 } from "zod"; -var codeqlGenerateQueryHelpTool = { - name: "codeql_generate_query-help", - description: "Generate query help documentation from QLDoc comments", - command: "codeql", - subcommand: "generate query-help", - inputSchema: { - query: z11.string().describe("Path to the query file to generate help for"), - outputFile: z11.string().optional().describe("Path to write the help documentation"), - format: z11.enum(["markdown", "text", "html"]).optional().describe("Output format for the help documentation"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql generate query-help -- MyQuery.ql", - "codeql generate query-help --format=markdown -- MyQuery.ql help.md", - "codeql generate query-help --format=html -- MyQuery.ql help.html" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/pack-install.ts -import { z as z12 } from "zod"; -var codeqlPackInstallTool = { - name: "codeql_pack_install", - description: "Install CodeQL pack dependencies", - command: "codeql", - subcommand: "pack install", - inputSchema: { - packDir: z12.string().optional().describe("Directory containing qlpack.yml (default: current)"), - force: z12.boolean().optional().describe("Force reinstall of dependencies"), - "no-strict-mode": z12.boolean().optional().describe("Allow non-strict dependency resolution"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql pack install", - "codeql pack install --force /path/to/pack", - "codeql pack install --no-strict-mode" - ] -}; - -// src/tools/codeql/pack-ls.ts -import { z as z13 } from "zod"; -var codeqlPackLsTool = { - name: "codeql_pack_ls", - description: "List CodeQL packs under some local directory path", - command: "codeql", - subcommand: "pack ls", - inputSchema: { - dir: z13.string().optional().describe("The root directory of the package or workspace, defaults to the current working directory"), - format: z13.enum(["text", "json"]).optional().describe("Output format: text (default) or json"), - groups: z13.string().optional().describe("List of CodeQL pack groups to include or exclude"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql pack ls -- .", - "codeql pack ls --format=json -- /path/to/pack-directory", - "codeql pack ls --format=json --groups=queries,tests -- ." - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/profile-codeql-query.ts -init_cli_executor(); -init_logger(); -import { z as z14 } from "zod"; -import { writeFileSync as writeFileSync3, readFileSync as readFileSync4, existsSync as existsSync6 } from "fs"; -import { join as join5, dirname as dirname6, basename as basename4 } from "path"; -import { mkdirSync as mkdirSync5 } from "fs"; -function parseEvaluatorLog(logPath) { - const logContent = readFileSync4(logPath, "utf-8"); - const jsonObjects = logContent.split("\n\n").filter((s) => s.trim()); - const events = jsonObjects.map((obj) => { - try { - return JSON.parse(obj); - } catch (_error) { - logger.warn(`Failed to parse evaluator log object: ${obj.substring(0, 100)}...`); - return null; +function isPlainSafeFirst(c) { + return isPrintable(c) && c !== CHAR_BOM && !isWhitespace(c) && c !== CHAR_MINUS && c !== CHAR_QUESTION && c !== CHAR_COLON && c !== CHAR_COMMA && c !== CHAR_LEFT_SQUARE_BRACKET && c !== CHAR_RIGHT_SQUARE_BRACKET && c !== CHAR_LEFT_CURLY_BRACKET && c !== CHAR_RIGHT_CURLY_BRACKET && c !== CHAR_SHARP && c !== CHAR_AMPERSAND && c !== CHAR_ASTERISK && c !== CHAR_EXCLAMATION && c !== CHAR_VERTICAL_LINE && c !== CHAR_EQUALS && c !== CHAR_GREATER_THAN && c !== CHAR_SINGLE_QUOTE && c !== CHAR_DOUBLE_QUOTE && c !== CHAR_PERCENT && c !== CHAR_COMMERCIAL_AT && c !== CHAR_GRAVE_ACCENT; +} +function isPlainSafeLast(c) { + return !isWhitespace(c) && c !== CHAR_COLON; +} +function codePointAt(string, pos) { + var first = string.charCodeAt(pos), second; + if (first >= 55296 && first <= 56319 && pos + 1 < string.length) { + second = string.charCodeAt(pos + 1); + if (second >= 56320 && second <= 57343) { + return (first - 55296) * 1024 + second - 56320 + 65536; } - }).filter((event) => event !== null); - const pipelineMap = /* @__PURE__ */ new Map(); - const predicateNameToEventId = /* @__PURE__ */ new Map(); - let queryName = ""; - let queryStartTime = 0; - let queryEndTime = 0; - for (const event of events) { - switch (event.type) { - case "QUERY_STARTED": - queryName = event.queryName || ""; - queryStartTime = event.nanoTime; - break; - case "QUERY_COMPLETED": - queryEndTime = event.nanoTime; - break; - case "PREDICATE_STARTED": { - const predicateName = event.predicateName; - const position = event.position; - const predicateType = event.predicateType; - const dependencies = event.dependencies; - predicateNameToEventId.set(predicateName, event.eventId); - const dependencyEventIds = []; - const dependencyNames = []; - if (dependencies) { - for (const depName of Object.keys(dependencies)) { - dependencyNames.push(depName); - const depEventId = predicateNameToEventId.get(depName); - if (depEventId !== void 0) { - dependencyEventIds.push(depEventId); - } - } - } - pipelineMap.set(event.eventId, { - eventId: event.eventId, - name: predicateName, - position, - type: predicateType, - startTime: event.nanoTime, - dependencies: dependencyNames, - dependencyEventIds - }); - break; + } + return first; +} +function needIndentIndicator(string) { + var leadingSpaceRe = /^\n* /; + return leadingSpaceRe.test(string); +} +var STYLE_PLAIN = 1; +var STYLE_SINGLE = 2; +var STYLE_LITERAL = 3; +var STYLE_FOLDED = 4; +var STYLE_DOUBLE = 5; +function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType, quotingType, forceQuotes, inblock) { + var i; + var char = 0; + var prevChar = null; + var hasLineBreak = false; + var hasFoldableLine = false; + var shouldTrackWidth = lineWidth !== -1; + var previousLineBreak = -1; + var plain = isPlainSafeFirst(codePointAt(string, 0)) && isPlainSafeLast(codePointAt(string, string.length - 1)); + if (singleLineOnly || forceQuotes) { + for (i = 0; i < string.length; char >= 65536 ? i += 2 : i++) { + char = codePointAt(string, i); + if (!isPrintable(char)) { + return STYLE_DOUBLE; } - case "PREDICATE_COMPLETED": { - const startEventId = event.startEvent; - const pipelineInfo = pipelineMap.get(startEventId); - if (pipelineInfo) { - const startEvent = events.find((e) => e.eventId === startEventId); - if (startEvent) { - const duration = (event.nanoTime - startEvent.nanoTime) / 1e6; - pipelineInfo.endTime = event.nanoTime; - pipelineInfo.duration = duration; - pipelineInfo.resultSize = event.resultSize; - pipelineInfo.tupleCount = event.tupleCount; - } + plain = plain && isPlainSafe(char, prevChar, inblock); + prevChar = char; + } + } else { + for (i = 0; i < string.length; char >= 65536 ? i += 2 : i++) { + char = codePointAt(string, i); + if (char === CHAR_LINE_FEED) { + hasLineBreak = true; + if (shouldTrackWidth) { + hasFoldableLine = hasFoldableLine || // Foldable line = too long, and not more-indented. + i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== " "; + previousLineBreak = i; } - break; + } else if (!isPrintable(char)) { + return STYLE_DOUBLE; } + plain = plain && isPlainSafe(char, prevChar, inblock); + prevChar = char; + } + hasFoldableLine = hasFoldableLine || shouldTrackWidth && (i - previousLineBreak - 1 > lineWidth && string[previousLineBreak + 1] !== " "); + } + if (!hasLineBreak && !hasFoldableLine) { + if (plain && !forceQuotes && !testAmbiguousType(string)) { + return STYLE_PLAIN; } + return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; } - const pipelines = Array.from(pipelineMap.values()).filter((p) => p.duration !== void 0).sort((a, b) => a.eventId - b.eventId); - const totalDuration = queryEndTime > 0 ? (queryEndTime - queryStartTime) / 1e6 : 0; - return { - queryName, - totalDuration, - totalEvents: events.length, - pipelines - }; + if (indentPerLevel > 9 && needIndentIndicator(string)) { + return STYLE_DOUBLE; + } + if (!forceQuotes) { + return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL; + } + return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE; } -function formatAsJson(profile) { - return JSON.stringify(profile, null, 2); +function writeScalar(state, string, level, iskey, inblock) { + state.dump = (function() { + if (string.length === 0) { + return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''"; + } + if (!state.noCompatMode) { + if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) { + return state.quotingType === QUOTING_TYPE_DOUBLE ? '"' + string + '"' : "'" + string + "'"; + } + } + var indent = state.indent * Math.max(1, level); + var lineWidth = state.lineWidth === -1 ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent); + var singleLineOnly = iskey || state.flowLevel > -1 && level >= state.flowLevel; + function testAmbiguity(string2) { + return testImplicitResolving(state, string2); + } + switch (chooseScalarStyle( + string, + singleLineOnly, + state.indent, + lineWidth, + testAmbiguity, + state.quotingType, + state.forceQuotes && !iskey, + inblock + )) { + case STYLE_PLAIN: + return string; + case STYLE_SINGLE: + return "'" + string.replace(/'/g, "''") + "'"; + case STYLE_LITERAL: + return "|" + blockHeader(string, state.indent) + dropEndingNewline(indentString(string, indent)); + case STYLE_FOLDED: + return ">" + blockHeader(string, state.indent) + dropEndingNewline(indentString(foldString(string, lineWidth), indent)); + case STYLE_DOUBLE: + return '"' + escapeString(string) + '"'; + default: + throw new exception("impossible error: invalid scalar style"); + } + })(); } -function formatAsMermaid(profile) { - const lines = []; - lines.push("```mermaid"); - lines.push("graph TD"); - lines.push(""); - lines.push(` QUERY["${basename4(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms"]`); - lines.push(""); - profile.pipelines.forEach((pipeline) => { - const nodeId = `P${pipeline.eventId}`; - const duration = pipeline.duration.toFixed(2); - const resultSize = pipeline.resultSize !== void 0 ? pipeline.resultSize : "?"; - const name = pipeline.name.replace(/[<>]/g, "").substring(0, 40); - lines.push(` ${nodeId}["${name}
${duration}ms | ${resultSize} results"]`); - }); - lines.push(""); - const rootPipelines = profile.pipelines.filter((p) => p.dependencies.length === 0); - rootPipelines.forEach((pipeline) => { - lines.push(` QUERY --> P${pipeline.eventId}`); - }); - lines.push(""); - profile.pipelines.forEach((pipeline) => { - pipeline.dependencyEventIds.forEach((depEventId) => { - const duration = pipeline.duration.toFixed(2); - lines.push(` P${depEventId} -->|"${duration}ms"| P${pipeline.eventId}`); - }); - }); - lines.push(""); - lines.push(" classDef default fill:#e1f5ff,stroke:#333,stroke-width:2px"); - lines.push(" classDef query fill:#ffe1e1,stroke:#333,stroke-width:3px"); - lines.push(" class QUERY query"); - lines.push("```"); - return lines.join("\n"); +function blockHeader(string, indentPerLevel) { + var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : ""; + var clip = string[string.length - 1] === "\n"; + var keep = clip && (string[string.length - 2] === "\n" || string === "\n"); + var chomp = keep ? "+" : clip ? "" : "-"; + return indentIndicator + chomp + "\n"; } -function registerProfileCodeQLQueryTool(server) { - server.tool( - "profile_codeql_query", - "Profile the performance of a CodeQL query run against a specific database by analyzing the evaluator log JSON file", - { - query: z14.string().describe("Path to the .ql query file"), - database: z14.string().describe("Path to the CodeQL database directory"), - evaluatorLog: z14.string().optional().describe( - "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." - ), - outputDir: z14.string().optional().describe("Directory to write profiling data files (defaults to same directory as evaluator log)") - }, - async (params) => { - try { - const { query, database, evaluatorLog, outputDir } = params; - let logPath = evaluatorLog; - let bqrsPath; - let sarifPath; - if (!logPath) { - logger.info("No evaluator log provided, running query to generate one"); - const defaultOutputDir = outputDir || join5(dirname6(query), "profile-output"); - mkdirSync5(defaultOutputDir, { recursive: true }); - logPath = join5(defaultOutputDir, "evaluator-log.jsonl"); - bqrsPath = join5(defaultOutputDir, "query-results.bqrs"); - sarifPath = join5(defaultOutputDir, "query-results.sarif"); - const queryResult = await executeCodeQLCommand( - "query run", - { - database, - output: bqrsPath, - "evaluator-log": logPath, - "tuple-counting": true, - "evaluator-log-level": 5 - }, - [query] - ); - if (!queryResult.success) { - return { - content: [ - { - type: "text", - text: `Failed to run query: ${queryResult.stderr || queryResult.error}` - } - ], - isError: true - }; - } - if (existsSync6(bqrsPath)) { - try { - const sarifResult = await executeCodeQLCommand( - "bqrs interpret", - { format: "sarif-latest", output: sarifPath }, - [bqrsPath] - ); - if (sarifResult.success) { - logger.info(`Generated SARIF interpretation at ${sarifPath}`); - } - } catch (error) { - logger.warn(`Failed to generate SARIF interpretation: ${error}`); - } - } - } - if (!existsSync6(logPath)) { - return { - content: [ - { - type: "text", - text: `Evaluator log not found at: ${logPath}` - } - ], - isError: true - }; - } - logger.info(`Parsing evaluator log from: ${logPath}`); - const profile = parseEvaluatorLog(logPath); - const profileOutputDir = outputDir || dirname6(logPath); - mkdirSync5(profileOutputDir, { recursive: true }); - const jsonPath = join5(profileOutputDir, "query-evaluation-profile.json"); - const jsonContent = formatAsJson(profile); - writeFileSync3(jsonPath, jsonContent); - logger.info(`Profile JSON written to: ${jsonPath}`); - const mdPath = join5(profileOutputDir, "query-evaluation-profile.md"); - const mdContent = formatAsMermaid(profile); - writeFileSync3(mdPath, mdContent); - logger.info(`Profile Mermaid diagram written to: ${mdPath}`); - const outputFiles = [ - `Profile JSON: ${jsonPath}`, - `Profile Mermaid: ${mdPath}`, - `Evaluator Log: ${logPath}` - ]; - if (bqrsPath) { - outputFiles.push(`Query Results (BQRS): ${bqrsPath}`); - } - if (sarifPath && existsSync6(sarifPath)) { - outputFiles.push(`Query Results (SARIF): ${sarifPath}`); - } - const responseText = [ - "Query profiling completed successfully!", - "", - "Output Files:", - ...outputFiles.map((f) => ` - ${f}`), - "", - "Profile Summary:", - ` - Query: ${basename4(profile.queryName)}`, - ` - Total Duration: ${profile.totalDuration.toFixed(2)} ms`, - ` - Total Pipelines: ${profile.pipelines.length}`, - ` - Total Events: ${profile.totalEvents}`, - "", - "First 5 Pipeline Nodes (in evaluation order):", - ...profile.pipelines.slice(0, 5).map((p, idx) => { - return ` ${idx + 1}. ${p.name} (${p.duration.toFixed(2)} ms, ${p.resultSize || "?"} results)`; - }) - ].join("\n"); - return { - content: [ - { - type: "text", - text: responseText - } - ] - }; - } catch (error) { - logger.error("Error profiling CodeQL query:", error); - return { - content: [ - { - type: "text", - text: `Failed to profile query: ${error instanceof Error ? error.message : String(error)}` - } - ], - isError: true - }; - } +function dropEndingNewline(string) { + return string[string.length - 1] === "\n" ? string.slice(0, -1) : string; +} +function foldString(string, width) { + var lineRe = /(\n+)([^\n]*)/g; + var result = (function() { + var nextLF = string.indexOf("\n"); + nextLF = nextLF !== -1 ? nextLF : string.length; + lineRe.lastIndex = nextLF; + return foldLine(string.slice(0, nextLF), width); + })(); + var prevMoreIndented = string[0] === "\n" || string[0] === " "; + var moreIndented; + var match; + while (match = lineRe.exec(string)) { + var prefix = match[1], line = match[2]; + moreIndented = line[0] === " "; + result += prefix + (!prevMoreIndented && !moreIndented && line !== "" ? "\n" : "") + foldLine(line, width); + prevMoreIndented = moreIndented; + } + return result; +} +function foldLine(line, width) { + if (line === "" || line[0] === " ") return line; + var breakRe = / [^ ]/g; + var match; + var start = 0, end, curr = 0, next = 0; + var result = ""; + while (match = breakRe.exec(line)) { + next = match.index; + if (next - start > width) { + end = curr > start ? curr : next; + result += "\n" + line.slice(start, end); + start = end + 1; } - ); + curr = next; + } + result += "\n"; + if (line.length - start > width && curr > start) { + result += line.slice(start, curr) + "\n" + line.slice(curr + 1); + } else { + result += line.slice(start); + } + return result.slice(1); } - -// src/tools/codeql/query-compile.ts -import { z as z15 } from "zod"; -var codeqlQueryCompileTool = { - name: "codeql_query_compile", - description: "Compile and validate CodeQL queries", - command: "codeql", - subcommand: "query compile", - inputSchema: { - query: z15.string().describe("Path to the CodeQL query file (.ql)"), - database: z15.string().optional().describe("Path to the CodeQL database"), - library: z15.string().optional().describe("Path to query library"), - output: z15.string().optional().describe("Output file path"), - warnings: z15.enum(["hide", "show", "error"]).optional().describe("How to handle compilation warnings"), - verbose: z15.boolean().optional().describe("Enable verbose output"), - additionalArgs: z15.array(z15.string()).optional().describe("Additional command-line arguments") - }, - examples: [ - "codeql query compile --database=/path/to/db MyQuery.ql", - "codeql query compile --library=/path/to/lib --output=compiled.qlo MyQuery.ql" - ] -}; - -// src/tools/codeql/query-format.ts -import { z as z16 } from "zod"; -function formatResultProcessor(result, params) { - const isCheckOnly = params["check-only"]; - const hasFormatChanges = result.exitCode === 1; - if (isCheckOnly && hasFormatChanges) { - result.success = true; - return result.stdout || result.stderr || "File would change by autoformatting."; +function escapeString(string) { + var result = ""; + var char = 0; + var escapeSeq; + for (var i = 0; i < string.length; char >= 65536 ? i += 2 : i++) { + char = codePointAt(string, i); + escapeSeq = ESCAPE_SEQUENCES[char]; + if (!escapeSeq && isPrintable(char)) { + result += string[i]; + if (char >= 65536) result += string[i + 1]; + } else { + result += escapeSeq || encodeHex(char); + } } - return defaultCLIResultProcessor(result, params); + return result; } -var codeqlQueryFormatTool = { - name: "codeql_query_format", - description: "Automatically format CodeQL source code files", - command: "codeql", - subcommand: "query format", - inputSchema: { - files: z16.array(z16.string()).describe("One or more .ql or .qll source files to format"), - output: z16.string().optional().describe("Write formatted code to this file instead of stdout"), - "in-place": z16.boolean().optional().describe("Overwrite each input file with formatted version"), - "check-only": z16.boolean().optional().describe("Check formatting without writing output"), - backup: z16.string().optional().describe("Backup extension when overwriting existing files"), - "no-syntax-errors": z16.boolean().optional().describe("Ignore syntax errors and pretend file is formatted"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql query format -i -- ExampleQuery.ql", - "codeql query format --in-place -- queries/*.ql", - "codeql query format --check-only -- queries/*.ql" - ], - resultProcessor: formatResultProcessor -}; - -// src/tools/codeql/query-run.ts -import { z as z17 } from "zod"; -var codeqlQueryRunTool = { - name: "codeql_query_run", - description: 'Execute a CodeQL query against a database. Use either "query" parameter for direct file path OR "queryName" + "queryLanguage" for pre-defined tool queries.', - command: "codeql", - subcommand: "query run", - inputSchema: { - query: z17.string().optional().describe("Path to the CodeQL query file (.ql) - cannot be used with queryName"), - queryName: z17.string().optional().describe('Name of pre-defined query to run (e.g., "PrintAST", "CallGraphFrom", "CallGraphTo") - requires queryLanguage'), - queryLanguage: z17.string().optional().describe('Programming language for tools queries (e.g., "javascript", "java", "python") - required when using queryName'), - queryPack: z17.string().optional().describe("Query pack path (defaults to server/ql//tools/src/ for tool queries)"), - sourceFiles: z17.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")'), - sourceFunction: z17.string().optional().describe('Comma-separated list of source function names for CallGraphFrom queries (e.g., "main,processData")'), - targetFunction: z17.string().optional().describe('Comma-separated list of target function names for CallGraphTo queries (e.g., "helper,validateInput")'), - database: createCodeQLSchemas.database(), - output: createCodeQLSchemas.output(), - external: z17.array(z17.string()).optional().describe("External predicate data: predicate=file.csv"), - timeout: createCodeQLSchemas.timeout(), - logDir: z17.string().optional().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/"), - "evaluator-log": z17.string().optional().describe("Path to save evaluator log (deprecated: use logDir instead)"), - "evaluator-log-minify": z17.boolean().optional().describe("Minimize evaluator log for smaller size"), - "evaluator-log-level": z17.number().min(1).max(5).optional().describe("Evaluator log verbosity level (1-5, default 5)"), - "tuple-counting": z17.boolean().optional().describe("Display tuple counts for each evaluation step in evaluator logs"), - format: z17.enum(["sarif-latest", "sarifv2.1.0", "csv", "graphtext", "dgml", "dot"]).optional().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."), - interpretedOutput: z17.string().optional().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"), - evaluationFunction: z17.string().optional().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'), - evaluationOutput: z17.string().optional().describe("[DEPRECATED - use interpretedOutput parameter instead] Output file for evaluation results"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql query run --database=mydb --output=results.bqrs MyQuery.ql", - "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", - "codeql query run --database=mydb --external=data=input.csv --output=results.bqrs MyQuery.ql --format=sarif-latest --interpreted-output=results.sarif", - "codeql query run --database=mydb --evaluator-log=eval.log --tuple-counting --evaluator-log-level=5 --output=results.bqrs MyQuery.ql", - 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files="main.js,utils.js" --format=graphtext', - "codeql query run --database=mydb --log-dir=/custom/log/path --tuple-counting --output=results.bqrs MyQuery.ql" - ] -}; - -// src/tools/codeql/quick-evaluate.ts -import { z as z18 } from "zod"; -import { join as join6, resolve as resolve6 } from "path"; -init_logger(); -async function quickEvaluate({ - file, - db: _db, - symbol, - output_path -}) { - try { - try { - await findClassPosition(file, symbol); - } catch { - try { - await findPredicatePosition(file, symbol); - } catch { - throw new Error(`Symbol '${symbol}' not found as class or predicate in file: ${file}`); - } +function writeFlowSequence(state, level, object) { + var _result = "", _tag = state.tag, index, length, value; + for (index = 0, length = object.length; index < length; index += 1) { + value = object[index]; + if (state.replacer) { + value = state.replacer.call(object, String(index), value); + } + if (writeNode(state, level, value, false, false) || typeof value === "undefined" && writeNode(state, level, null, false, false)) { + if (_result !== "") _result += "," + (!state.condenseFlow ? " " : ""); + _result += state.dump; } - const resolvedOutput = resolve6(output_path || join6(getProjectTmpDir("quickeval"), "quickeval.bqrs")); - return resolvedOutput; - } catch (error) { - throw new Error(`CodeQL evaluation failed: ${error instanceof Error ? error.message : "Unknown error"}`); } + state.tag = _tag; + state.dump = "[" + _result + "]"; } -function registerQuickEvaluateTool(server) { - server.tool( - "quick_evaluate", - "Quick evaluate either a class or a predicate in a CodeQL query for debugging", - { - file: z18.string().describe("Path to the .ql file containing the symbol"), - db: z18.string().describe("Path to the CodeQL database"), - symbol: z18.string().describe("Name of the class or predicate to evaluate"), - output_path: z18.string().optional().describe("Output path for results (defaults to project-local .tmp/quickeval/)") - }, - async ({ file, db, symbol, output_path }) => { - try { - const result = await quickEvaluate({ file, db, symbol, output_path }); - return { - content: [{ type: "text", text: result }] - }; - } catch (error) { - logger.error("Error in quick evaluate:", error); - return { - content: [ - { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` - } - ], - isError: true - }; +function writeBlockSequence(state, level, object, compact) { + var _result = "", _tag = state.tag, index, length, value; + for (index = 0, length = object.length; index < length; index += 1) { + value = object[index]; + if (state.replacer) { + value = state.replacer.call(object, String(index), value); + } + if (writeNode(state, level + 1, value, true, true, false, true) || typeof value === "undefined" && writeNode(state, level + 1, null, true, true, false, true)) { + if (!compact || _result !== "") { + _result += generateNextLine(state, level); + } + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + _result += "-"; + } else { + _result += "- "; } + _result += state.dump; } - ); + } + state.tag = _tag; + state.dump = _result || "[]"; } - -// src/tools/codeql/register-database.ts -init_logger(); -import { z as z19 } from "zod"; -import { access, constants } from "fs/promises"; -import { resolve as resolve7 } from "path"; -async function registerDatabase(dbPath) { - try { - const resolvedPath = resolve7(dbPath); - await access(resolvedPath, constants.F_OK); - const dbYmlPath = resolve7(resolvedPath, "codeql-database.yml"); - await access(dbYmlPath, constants.F_OK); - const srcZipPath = resolve7(resolvedPath, "src.zip"); - const srcDirPath = resolve7(resolvedPath, "src"); - let hasSrcZip = false; - let hasSrcDir = false; - try { - await access(srcZipPath, constants.F_OK); - hasSrcZip = true; - } catch { +function writeFlowMapping(state, level, object) { + var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, pairBuffer; + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ""; + if (_result !== "") pairBuffer += ", "; + if (state.condenseFlow) pairBuffer += '"'; + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + if (state.replacer) { + objectValue = state.replacer.call(object, objectKey, objectValue); + } + if (!writeNode(state, level, objectKey, false, false)) { + continue; + } + if (state.dump.length > 1024) pairBuffer += "? "; + pairBuffer += state.dump + (state.condenseFlow ? '"' : "") + ":" + (state.condenseFlow ? "" : " "); + if (!writeNode(state, level, objectValue, false, false)) { + continue; + } + pairBuffer += state.dump; + _result += pairBuffer; + } + state.tag = _tag; + state.dump = "{" + _result + "}"; +} +function writeBlockMapping(state, level, object, compact) { + var _result = "", _tag = state.tag, objectKeyList = Object.keys(object), index, length, objectKey, objectValue, explicitPair, pairBuffer; + if (state.sortKeys === true) { + objectKeyList.sort(); + } else if (typeof state.sortKeys === "function") { + objectKeyList.sort(state.sortKeys); + } else if (state.sortKeys) { + throw new exception("sortKeys must be a boolean or a function"); + } + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + pairBuffer = ""; + if (!compact || _result !== "") { + pairBuffer += generateNextLine(state, level); } - if (!hasSrcZip) { - try { - await access(srcDirPath, constants.F_OK); - hasSrcDir = true; - } catch { - } + objectKey = objectKeyList[index]; + objectValue = object[objectKey]; + if (state.replacer) { + objectValue = state.replacer.call(object, objectKey, objectValue); } - if (!hasSrcZip && !hasSrcDir) { - throw new Error(`Missing required source archive (src.zip) or source directory (src/) in: ${dbPath}`); + if (!writeNode(state, level + 1, objectKey, true, true, true)) { + continue; } - const sourceType = hasSrcZip ? "src.zip" : "src/"; - return `Database registered: ${dbPath} (source: ${sourceType})`; - } catch (error) { - if (error instanceof Error) { - const errorCode = error.code; - if (errorCode === "ENOENT") { - if (error.message.includes("codeql-database.yml")) { - throw new Error(`Missing required codeql-database.yml in: ${dbPath}`); - } - throw new Error(`Database path does not exist: ${dbPath}`); - } - if (errorCode === "EACCES") { - throw new Error(`Database path does not exist: ${dbPath}`); + explicitPair = state.tag !== null && state.tag !== "?" || state.dump && state.dump.length > 1024; + if (explicitPair) { + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += "?"; + } else { + pairBuffer += "? "; } } - throw new Error(`Failed to register database: ${error instanceof Error ? error.message : "Unknown error"}`); + pairBuffer += state.dump; + if (explicitPair) { + pairBuffer += generateNextLine(state, level); + } + if (!writeNode(state, level + 1, objectValue, true, explicitPair)) { + continue; + } + if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) { + pairBuffer += ":"; + } else { + pairBuffer += ": "; + } + pairBuffer += state.dump; + _result += pairBuffer; } + state.tag = _tag; + state.dump = _result || "{}"; } -function registerRegisterDatabaseTool(server) { - server.tool( - "register_database", - "Register a CodeQL database given a local path to the database directory", - { - db_path: z19.string().describe("Path to the CodeQL database directory") - }, - async ({ db_path }) => { - try { - const result = await registerDatabase(db_path); - return { - content: [{ type: "text", text: result }] - }; - } catch (error) { - logger.error("Error registering database:", error); - return { - content: [ - { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` - } - ], - isError: true - }; +function detectType(state, object, explicit) { + var _result, typeList, index, length, type2, style; + typeList = explicit ? state.explicitTypes : state.implicitTypes; + for (index = 0, length = typeList.length; index < length; index += 1) { + type2 = typeList[index]; + if ((type2.instanceOf || type2.predicate) && (!type2.instanceOf || typeof object === "object" && object instanceof type2.instanceOf) && (!type2.predicate || type2.predicate(object))) { + if (explicit) { + if (type2.multi && type2.representName) { + state.tag = type2.representName(object); + } else { + state.tag = type2.tag; + } + } else { + state.tag = "?"; + } + if (type2.represent) { + style = state.styleMap[type2.tag] || type2.defaultStyle; + if (_toString.call(type2.represent) === "[object Function]") { + _result = type2.represent(object, style); + } else if (_hasOwnProperty.call(type2.represent, style)) { + _result = type2.represent[style](object, style); + } else { + throw new exception("!<" + type2.tag + '> tag resolver accepts not "' + style + '" style'); + } + state.dump = _result; } + return true; } - ); + } + return false; } - -// src/tools/codeql/resolve-database.ts -import { z as z20 } from "zod"; -var codeqlResolveDatabaseTool = { - name: "codeql_resolve_database", - description: "Resolve database path and validate database structure", - command: "codeql", - subcommand: "resolve database", - inputSchema: { - database: z20.string().describe("Database path to resolve"), - format: z20.enum(["text", "json", "betterjson"]).optional().describe("Output format for database information"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql resolve database -- /path/to/database", - "codeql resolve database --format=json -- my-database", - "codeql resolve database --format=betterjson -- database-dir" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/resolve-languages.ts -import { z as z21 } from "zod"; -var codeqlResolveLanguagesTool = { - name: "codeql_resolve_languages", - description: "List installed CodeQL extractor packs", - command: "codeql", - subcommand: "resolve languages", - inputSchema: { - format: z21.enum(["text", "json", "betterjson"]).optional().describe("Output format for language information"), - verbose: z21.boolean().optional().describe("Enable verbose output"), - additionalArgs: z21.array(z21.string()).optional().describe("Additional command-line arguments") - }, - examples: [ - "codeql resolve languages --format=text", - "codeql resolve languages --format=json", - "codeql resolve languages --format=betterjson" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/resolve-library-path.ts -import { z as z22 } from "zod"; -var codeqlResolveLibraryPathTool = { - name: "codeql_resolve_library-path", - description: "Resolve library path for CodeQL queries and libraries", - command: "codeql", - subcommand: "resolve library-path", - inputSchema: { - language: z22.string().optional().describe("Programming language to resolve library path for"), - format: z22.enum(["text", "json", "betterjson"]).optional().describe("Output format for library path information"), - verbose: z22.boolean().optional().describe("Enable verbose output"), - additionalArgs: z22.array(z22.string()).optional().describe("Additional command-line arguments") - }, - examples: [ - "codeql resolve library-path --language=java", - "codeql resolve library-path --format=json --language=python", - "codeql resolve library-path --format=betterjson" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/resolve-metadata.ts -import { z as z23 } from "zod"; -var codeqlResolveMetadataTool = { - name: "codeql_resolve_metadata", - description: "Resolve and return the key-value metadata pairs from a CodeQL query source file.", - command: "codeql", - subcommand: "resolve metadata", - inputSchema: { - query: z23.string().describe("Query file to resolve metadata for"), - format: z23.enum(["json"]).optional().describe("Output format for metadata information (always JSON, optional for future compatibility)"), - verbose: z23.boolean().optional().describe("Enable verbose output"), - additionalArgs: z23.array(z23.string()).optional().describe("Additional command-line arguments") - }, - examples: [ - "codeql resolve metadata -- relative-path/2/MyQuery.ql", - "codeql resolve metadata --format=json -- /absolute-plus/relative-path/2/MyQuery.ql" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/resolve-qlref.ts -import { z as z24 } from "zod"; -var codeqlResolveQlrefTool = { - name: "codeql_resolve_qlref", - description: "Resolve qlref files to their corresponding query files", - command: "codeql", - subcommand: "resolve qlref", - inputSchema: { - qlref: z24.string().describe("Path to the .qlref file to resolve"), - format: z24.enum(["text", "json", "betterjson"]).optional().describe("Output format for qlref resolution"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql resolve qlref -- test/MyQuery.qlref", - "codeql resolve qlref --format=json -- test/MyQuery.qlref", - "codeql resolve qlref --format=betterjson -- test/MyQuery.qlref" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/resolve-queries.ts -import { z as z25 } from "zod"; -var jsonOnlyResultProcessor = (result, params) => { - if (!result.success) { - return `Command failed (exit code ${result.exitCode || "unknown"}): -${result.error || result.stderr}`; +function writeNode(state, level, object, block, compact, iskey, isblockseq) { + state.tag = null; + state.dump = object; + if (!detectType(state, object, false)) { + detectType(state, object, true); } - if (params.format === "json" || params.format === "betterjson" || params.format === "bylanguage") { - return result.stdout || "[]"; + var type2 = _toString.call(state.dump); + var inblock = block; + var tagStr; + if (block) { + block = state.flowLevel < 0 || state.flowLevel > level; + } + var objectOrArray = type2 === "[object Object]" || type2 === "[object Array]", duplicateIndex, duplicate; + if (objectOrArray) { + duplicateIndex = state.duplicates.indexOf(object); + duplicate = duplicateIndex !== -1; + } + if (state.tag !== null && state.tag !== "?" || duplicate || state.indent !== 2 && level > 0) { + compact = false; + } + if (duplicate && state.usedDuplicates[duplicateIndex]) { + state.dump = "*ref_" + duplicateIndex; + } else { + if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) { + state.usedDuplicates[duplicateIndex] = true; + } + if (type2 === "[object Object]") { + if (block && Object.keys(state.dump).length !== 0) { + writeBlockMapping(state, level, state.dump, compact); + if (duplicate) { + state.dump = "&ref_" + duplicateIndex + state.dump; + } + } else { + writeFlowMapping(state, level, state.dump); + if (duplicate) { + state.dump = "&ref_" + duplicateIndex + " " + state.dump; + } + } + } else if (type2 === "[object Array]") { + if (block && state.dump.length !== 0) { + if (state.noArrayIndent && !isblockseq && level > 0) { + writeBlockSequence(state, level - 1, state.dump, compact); + } else { + writeBlockSequence(state, level, state.dump, compact); + } + if (duplicate) { + state.dump = "&ref_" + duplicateIndex + state.dump; + } + } else { + writeFlowSequence(state, level, state.dump); + if (duplicate) { + state.dump = "&ref_" + duplicateIndex + " " + state.dump; + } + } + } else if (type2 === "[object String]") { + if (state.tag !== "?") { + writeScalar(state, state.dump, level, iskey, inblock); + } + } else if (type2 === "[object Undefined]") { + return false; + } else { + if (state.skipInvalid) return false; + throw new exception("unacceptable kind of an object to dump " + type2); + } + if (state.tag !== null && state.tag !== "?") { + tagStr = encodeURI( + state.tag[0] === "!" ? state.tag.slice(1) : state.tag + ).replace(/!/g, "%21"); + if (state.tag[0] === "!") { + tagStr = "!" + tagStr; + } else if (tagStr.slice(0, 18) === "tag:yaml.org,2002:") { + tagStr = "!!" + tagStr.slice(18); + } else { + tagStr = "!<" + tagStr + ">"; + } + state.dump = tagStr + " " + state.dump; + } } - let output = ""; - if (result.stdout) { - output += result.stdout; + return true; +} +function getDuplicateReferences(object, state) { + var objects = [], duplicatesIndexes = [], index, length; + inspectNode(object, objects, duplicatesIndexes); + for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) { + state.duplicates.push(objects[duplicatesIndexes[index]]); } - if (result.stderr) { - if (output) { - output += "\n\nWarnings/Info:\n"; + state.usedDuplicates = new Array(length); +} +function inspectNode(object, objects, duplicatesIndexes) { + var objectKeyList, index, length; + if (object !== null && typeof object === "object") { + index = objects.indexOf(object); + if (index !== -1) { + if (duplicatesIndexes.indexOf(index) === -1) { + duplicatesIndexes.push(index); + } + } else { + objects.push(object); + if (Array.isArray(object)) { + for (index = 0, length = object.length; index < length; index += 1) { + inspectNode(object[index], objects, duplicatesIndexes); + } + } else { + objectKeyList = Object.keys(object); + for (index = 0, length = objectKeyList.length; index < length; index += 1) { + inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes); + } + } } - output += result.stderr; } - if (!output) { - output = "Command executed successfully (no output)"; +} +function dump$1(input, options) { + options = options || {}; + var state = new State(options); + if (!state.noRefs) getDuplicateReferences(input, state); + var value = input; + if (state.replacer) { + value = state.replacer.call({ "": value }, "", value); } - return output; -}; -var codeqlResolveQueriesTool = { - name: "codeql_resolve_queries", - description: "List available CodeQL queries found on the local filesystem", - command: "codeql", - subcommand: "resolve queries", - inputSchema: { - directory: z25.string().optional().describe("Directory to search for queries"), - language: z25.string().optional().describe("Filter queries by programming language"), - format: z25.enum(["text", "json", "betterjson", "bylanguage"]).optional().describe("Output format for query list"), - "additional-packs": z25.union([z25.string(), z25.array(z25.string())]).optional().describe("Additional pack directories to search for CodeQL packs"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql resolve queries", - "codeql resolve queries --language=java --format=json", - "codeql resolve queries --format=betterjson -- /path/to/queries", - "codeql resolve queries --additional-packs=/path/to/packs codeql/java-queries" - ], - resultProcessor: jsonOnlyResultProcessor -}; - -// src/tools/codeql/resolve-tests.ts -import { z as z26 } from "zod"; -var codeqlResolveTestsTool = { - name: "codeql_resolve_tests", - description: "Resolve the local filesystem paths of unit tests and/or queries under some base directory", - command: "codeql", - subcommand: "resolve tests", - inputSchema: { - tests: z26.array(z26.string()).optional().describe("One or more tests (.ql, .qlref files, or test directories)"), - format: z26.enum(["text", "json"]).optional().describe("Output format for test list"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql resolve tests", - "codeql resolve tests --format=json -- test-directory", - "codeql resolve tests --format=json -- test1.ql test2.ql" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/test-accept.ts -import { z as z27 } from "zod"; -var codeqlTestAcceptTool = { - name: "codeql_test_accept", - description: "Accept new test results as the expected baseline", - command: "codeql", - subcommand: "test accept", - inputSchema: { - tests: z27.array(z27.string()).describe("One or more tests (.ql, .qlref files, or test directories)"), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql test accept -- languages/java/test/MyQuery/MyQuery.qlref", - "codeql test accept -- languages/java/test/MyQuery/", - "codeql test accept -- languages/java/src/MyQuery/MyQuery.ql" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/test-extract.ts -import { z as z28 } from "zod"; -var codeqlTestExtractTool = { - name: "codeql_test_extract", - description: "Extract test databases for CodeQL query tests", - command: "codeql", - subcommand: "test extract", - inputSchema: { - tests: z28.array(z28.string()).describe("One or more test directories or files"), - language: z28.string().optional().describe("Programming language for extraction"), - threads: createCodeQLSchemas.threads(), - ram: createCodeQLSchemas.ram(), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql test extract -- languages/java/test/MyQuery/", - "codeql test extract --language=java --threads=4 -- test-directory", - "codeql test extract --threads=2 --ram=2048 -- multiple/test/directories" - ], - resultProcessor: defaultCLIResultProcessor -}; - -// src/tools/codeql/test-run.ts -import { z as z29 } from "zod"; -var codeqlTestRunTool = { - name: "codeql_test_run", - description: "Run CodeQL query tests", - command: "codeql", - subcommand: "test run", - inputSchema: { - tests: z29.array(z29.string()).describe("One or more tests (.ql, .qlref files, or test directories)"), - "show-extractor-output": z29.boolean().optional().describe("Show output from extractors during test execution"), - "keep-databases": z29.boolean().optional().describe("Keep test databases after running tests"), - "learn": z29.boolean().optional().describe("Accept current output as expected for failing tests"), - logDir: z29.string().optional().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/"), - threads: createCodeQLSchemas.threads(), - ram: createCodeQLSchemas.ram(), - verbose: createCodeQLSchemas.verbose(), - additionalArgs: createCodeQLSchemas.additionalArgs() - }, - examples: [ - "codeql test run /path/to/tests", - "codeql test run --learn /path/to/failing/tests", - "codeql test run --threads=4 --keep-databases /path/to/tests", - "codeql test run --log-dir=/custom/log/path /path/to/tests" - ] + if (writeNode(state, 0, value, true, true)) return state.dump + "\n"; + return ""; +} +var dump_1 = dump$1; +var dumper = { + dump: dump_1 }; +function renamed(from, to) { + return function() { + throw new Error("Function yaml." + from + " is removed in js-yaml 4. Use yaml." + to + " instead, which is now safe by default."); + }; +} +var load = loader.load; +var loadAll = loader.loadAll; +var dump = dumper.dump; +var safeLoad = renamed("safeLoad", "load"); +var safeLoadAll = renamed("safeLoadAll", "loadAll"); +var safeDump = renamed("safeDump", "dump"); -// src/tools/codeql-tools.ts -import { z as z30 } from "zod"; +// src/lib/metadata-resolver.ts +init_cli_executor(); +init_logger(); +async function resolveQueryMetadata(queryPath) { + try { + logger.info(`Resolving metadata for query: ${queryPath}`); + const result = await executeCodeQLCommand( + "resolve metadata", + { format: "json" }, + [queryPath] + ); + if (!result.success) { + logger.error(`Failed to resolve metadata for ${queryPath}:`, result.stderr || result.error); + return null; + } + try { + const metadata = JSON.parse(result.stdout); + return metadata; + } catch (parseError) { + logger.error(`Failed to parse metadata JSON for ${queryPath}:`, parseError); + return null; + } + } catch (error) { + logger.error(`Error resolving metadata for ${queryPath}:`, error); + return null; + } +} -// src/lib/validation.ts -function validateCodeQLSyntax(query, _language) { - const validation = { - isValid: true, - errors: [], - warnings: [], - suggestions: [] - }; - if (!query.trim()) { - validation.isValid = false; - validation.errors.push("Query cannot be empty"); - return validation; +// src/lib/query-file-finder.ts +var LANGUAGE_EXTENSIONS = { + actions: "yml", + cpp: "cpp", + csharp: "cs", + go: "go", + java: "java", + javascript: "js", + python: "py", + ruby: "rb", + swift: "swift", + typescript: "ts" +}; +var KNOWN_LANGUAGES = Object.keys(LANGUAGE_EXTENSIONS); +function getLanguageExtension(language) { + return LANGUAGE_EXTENSIONS[language.toLowerCase()] || "txt"; +} +function inferLanguageFromPath(queryPath) { + const parts = queryPath.split(path.sep); + for (const part of parts) { + if (KNOWN_LANGUAGES.includes(part.toLowerCase())) { + return part.toLowerCase(); + } } - if (!query.includes("from") && !query.includes("select")) { - validation.warnings.push('Query should typically include "from" and "select" clauses'); + return "unknown"; +} +function findNearestQlpack(startPath) { + let currentPath = startPath; + const root = path.parse(currentPath).root; + while (currentPath !== root) { + for (const packFile of ["codeql-pack.yml", "qlpack.yml"]) { + const packPath = path.join(currentPath, packFile); + if (fs.existsSync(packPath) && fs.statSync(packPath).isFile()) { + return packPath; + } + } + currentPath = path.dirname(currentPath); } - if (!query.includes("@name") && !query.includes("@description")) { - validation.suggestions.push("Consider adding @name and @description metadata"); + return null; +} +function readQlpackMetadata(qlpackPath) { + try { + const content = fs.readFileSync(qlpackPath, "utf-8"); + const parsed = load(content); + return parsed; + } catch (_error) { + return null; } - return validation; } - -// src/lib/query-scaffolding.ts -import * as fs2 from "fs"; -import * as path2 from "path"; -function getLanguageExtension2(language) { - const extensions = { - javascript: "js", - typescript: "ts", - python: "py", - java: "java", - csharp: "cs", - cpp: "cpp", - go: "go", - ruby: "rb", - actions: "yml" - }; - return extensions[language.toLowerCase()] || "txt"; +function checkFile(filePath) { + try { + const exists = fs.existsSync(filePath) && fs.statSync(filePath).isFile(); + return { + exists, + path: filePath + // Always return path, whether it exists or not + }; + } catch { + return { + exists: false, + path: filePath + // Return the path even on error + }; + } } -function generateQueryTemplate(queryName, language, description, queryId) { - const desc = description || `${queryName} query`; - const id = queryId || `${language}/example/${queryName.toLowerCase()}`; - return `/** - * @id ${id} - * @name ${queryName} - * @description ${desc} - * @kind problem - * @precision medium - * @problem.severity warning - */ - -import ${language} - -// TODO: Implement query logic -from File f -where f.getBaseName() = "${queryName}.${getLanguageExtension2(language)}" -select f, "TODO: Add query logic" -`; +function checkDirectory(dirPath) { + try { + const exists = fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory(); + return { + exists, + path: dirPath + // Always return path, whether it exists or not + }; + } catch { + return { + exists: false, + path: dirPath + // Return the path even on error + }; + } } -function createCodeQLQuery(options) { - const { basePath, queryName, language, description, queryId } = options; - const absoluteBasePath = path2.resolve(basePath); - const srcDir = path2.join(absoluteBasePath, "src", queryName); - const testDir = path2.join(absoluteBasePath, "test", queryName); - const queryPath = path2.join(srcDir, `${queryName}.ql`); - const qlrefPath = path2.join(testDir, `${queryName}.qlref`); - const testCodePath = path2.join(testDir, `${queryName}.${getLanguageExtension2(language)}`); - const filesCreated = []; +function findTestCodeFiles(testDir, queryName, language) { + if (!fs.existsSync(testDir)) { + return []; + } try { - fs2.mkdirSync(srcDir, { recursive: true }); - fs2.mkdirSync(testDir, { recursive: true }); - try { - const queryContent = generateQueryTemplate(queryName, language, description, queryId); - fs2.writeFileSync(queryPath, queryContent, { encoding: "utf8", flag: "wx" }); - filesCreated.push(queryPath); - } catch (e) { - const err = e; - if (err.code !== "EEXIST") throw e; + const files = fs.readdirSync(testDir); + const languageExt = getLanguageExtension(language); + const testFiles = []; + const allValidExtensions = [.../* @__PURE__ */ new Set([...Object.values(LANGUAGE_EXTENSIONS), "yaml"])]; + for (const file of files) { + const filePath = path.join(testDir, file); + const stat = fs.statSync(filePath); + if (stat.isFile()) { + if (file === `${queryName}.${languageExt}`) { + testFiles.push(filePath); + } else if (!file.endsWith(".qlref") && !file.endsWith(".expected") && !file.endsWith(".actual")) { + const ext = path.extname(file).slice(1); + if (ext === languageExt || allValidExtensions.includes(ext)) { + testFiles.push(filePath); + } + } + } } - try { - const qlrefContent = `${queryName}/${queryName}.ql -`; - fs2.writeFileSync(qlrefPath, qlrefContent, { encoding: "utf8", flag: "wx" }); - filesCreated.push(qlrefPath); - } catch (e) { - const err = e; - if (err.code !== "EEXIST") throw e; + return testFiles; + } catch { + return []; + } +} +async function findCodeQLQueryFiles(queryFilePath, language, resolveMetadata = true) { + const absoluteQueryPath = path.resolve(queryFilePath); + const queryName = path.basename(absoluteQueryPath, ".ql"); + const queryDir = path.dirname(absoluteQueryPath); + const detectedLanguage = language || inferLanguageFromPath(absoluteQueryPath); + const queryPath = checkFile(absoluteQueryPath); + const queryDirectory = checkDirectory(queryDir); + const mdPath = path.join(queryDir, `${queryName}.md`); + const qhelpPath = path.join(queryDir, `${queryName}.qhelp`); + const mdInfo = checkFile(mdPath); + const qhelpInfo = checkFile(qhelpPath); + const documentationPath = mdInfo.exists ? mdInfo : qhelpInfo.exists ? qhelpInfo : { + exists: false, + path: mdPath + // Suggest .md as the default + }; + const qspecPath = path.join(queryDir, `${queryName}.qspec`); + const specificationPath = checkFile(qspecPath); + let testDir; + if (queryDir.includes(`${path.sep}src${path.sep}`)) { + const parts = queryDir.split(path.sep); + const srcIndex = parts.lastIndexOf("src"); + if (srcIndex !== -1) { + parts[srcIndex] = "test"; + testDir = parts.join(path.sep); + } else { + testDir = path.join(path.dirname(queryDir), "test", queryName); } - try { - const testCodeContent = `// Test code for ${queryName} -// TODO: Add test cases -`; - fs2.writeFileSync(testCodePath, testCodeContent, { encoding: "utf8", flag: "wx" }); - filesCreated.push(testCodePath); - } catch (e) { - const err = e; - if (err.code !== "EEXIST") throw e; + } else { + testDir = path.join(path.dirname(queryDir), "test", queryName); + } + const testDirectory = checkDirectory(testDir); + const qlrefPath = path.join(testDir, `${queryName}.qlref`); + const qlrefInfo = checkFile(qlrefPath); + const testCodePaths = findTestCodeFiles(testDir, queryName, detectedLanguage); + const expectedPath = path.join(testDir, `${queryName}.expected`); + const expectedResultsPath = checkFile(expectedPath); + const actualPath = path.join(testDir, `${queryName}.actual`); + const actualResultsPath = checkFile(actualPath); + const testprojPath = path.join(testDir, `${queryName}.testproj`); + const testDatabasePath = checkDirectory(testprojPath); + const missingFiles = []; + if (!queryPath.exists) missingFiles.push(queryPath.path); + if (!documentationPath.exists) missingFiles.push(documentationPath.path); + if (!specificationPath.exists) missingFiles.push(specificationPath.path); + if (!testDirectory.exists) missingFiles.push(testDirectory.path); + if (!qlrefInfo.exists) missingFiles.push(qlrefInfo.path); + if (testCodePaths.length === 0) missingFiles.push(path.join(testDir, `${queryName}.${getLanguageExtension(detectedLanguage)}`)); + if (!expectedResultsPath.exists) missingFiles.push(expectedResultsPath.path); + const allFilesExist = missingFiles.length === 0; + let metadata; + if (resolveMetadata && queryPath.exists) { + const resolvedMetadata = await resolveQueryMetadata(absoluteQueryPath); + if (resolvedMetadata) { + metadata = resolvedMetadata; + } + } + let packMetadata; + const queryPackPath = findNearestQlpack(queryDir); + const queryPackDir = queryPackPath ? path.dirname(queryPackPath) : queryDir; + if (queryPackPath) { + const parsed = readQlpackMetadata(queryPackPath); + if (parsed) { + packMetadata = parsed; + } + } + const testPackPath = findNearestQlpack(testDir); + const testPackDir = testPackPath ? path.dirname(testPackPath) : testDir; + return { + queryName, + language: detectedLanguage, + allFilesExist, + files: { + query: { + dir: queryDirectory.path, + doc: path.basename(documentationPath.path), + packDir: queryPackDir, + query: path.basename(queryPath.path), + spec: path.basename(specificationPath.path) + }, + test: { + actual: path.basename(actualResultsPath.path), + dir: testDirectory.path, + expected: path.basename(expectedResultsPath.path), + packDir: testPackDir, + qlref: path.basename(qlrefInfo.path), + testCode: testCodePaths, + testDatabaseDir: testDatabasePath.path + } + }, + metadata, + missingFiles, + packMetadata, + status: { + actualResultsExist: actualResultsPath.exists, + documentationExists: documentationPath.exists, + expectedResultsExist: expectedResultsPath.exists, + hasTestCode: testCodePaths.length > 0, + qlrefExists: qlrefInfo.exists, + queryExists: queryPath.exists, + specificationExists: specificationPath.exists, + testDatabaseDirExists: testDatabasePath.exists, + testDirectoryExists: testDirectory.exists } - return { - queryPath, - testPath: testDir, - qlrefPath, - testCodePath, - filesCreated - }; - } catch (error) { - throw new Error(`Failed to create query scaffolding: ${error instanceof Error ? error.message : "Unknown error"}`); - } + }; } -// src/tools/codeql-tools.ts +// src/tools/codeql/find-query-files.ts init_logger(); -function registerCodeQLTools(server) { +function registerFindCodeQLQueryFilesTool(server) { server.tool( - "validate_codeql_query", - "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_lsp_diagnostics instead.", + "find_codeql_query_files", + "Find and track all files and directories related to a CodeQL query, including resolved metadata", { - query: z30.string().describe("The CodeQL query to validate"), - language: z30.string().optional().describe("Target programming language") + queryPath: z9.string().describe("Path to the CodeQL query file (.ql)"), + language: z9.string().optional().describe("Programming language (optional, will be inferred if not provided)"), + resolveMetadata: z9.boolean().optional().describe("Whether to resolve query metadata (default: true)") }, - async ({ query, language }) => { + async ({ queryPath, language, resolveMetadata }) => { try { - const validation = validateCodeQLSyntax(query, language); + const result = await findCodeQLQueryFiles( + queryPath, + language, + resolveMetadata !== false + // Default to true if not specified + ); return { - content: [{ type: "text", text: JSON.stringify(validation, null, 2) }] + content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (error) { - logger.error("Error validating CodeQL query:", error); + logger.error("Error finding CodeQL query files:", error); return { content: [ { @@ -5452,1313 +5737,1205 @@ function registerCodeQLTools(server) { } } ); - server.tool( - "create_codeql_query", - "Create directory structure and files for a new CodeQL query with tests", - { - basePath: z30.string().describe("Base path where src/ and test/ directories will be created"), - queryName: z30.string().describe("Name of the query (e.g., MySecurityQuery)"), - language: z30.string().describe("Target programming language (e.g., javascript, python, java)"), - description: z30.string().optional().describe("Description of what the query does"), - queryId: z30.string().optional().describe("Custom query ID (defaults to language/example/queryname)") - }, - async ({ basePath, queryName, language, description, queryId }) => { - try { - const result = createCodeQLQuery({ - basePath, - queryName, - language, - description, - queryId - }); - const summary = { - success: true, - queryPath: result.queryPath, - testPath: result.testPath, - qlrefPath: result.qlrefPath, - testCodePath: result.testCodePath, - filesCreated: result.filesCreated, - nextSteps: [ - "Review and customize the generated query in: " + result.queryPath, - "Add test cases to: " + result.testCodePath, - "Run codeql_pack_install to install dependencies", - "Run codeql_test_extract to create test database", - "Run codeql_test_run to execute tests" - ] - }; - return { - content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] - }; - } catch (error) { - logger.error("Error creating CodeQL query:", error); - return { - content: [ - { - type: "text", - text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` +} + +// src/tools/codeql/generate-log-summary.ts +import { z as z10 } from "zod"; +var codeqlGenerateLogSummaryTool = { + name: "codeql_generate_log-summary", + description: "Create a summary of a structured JSON evaluator event log file", + command: "codeql", + subcommand: "generate log-summary", + inputSchema: { + inputLog: z10.string().describe("Path to the evaluator log file to summarize"), + outputFile: z10.string().optional().describe("Path to write the summary (optional, defaults to stdout)"), + format: z10.enum(["text", "predicates", "overall"]).optional().describe("Output format: text (human-readable), predicates (JSON), or overall (stats)"), + "minify-output": z10.boolean().optional().describe("Minify JSON output"), + utc: z10.boolean().optional().describe("Force UTC timestamps"), + "deduplicate-stage-summaries": z10.boolean().optional().describe("Deduplicate stage summaries"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql generate log-summary --format=text -- evaluator-log.json.txt summary.txt", + "codeql generate log-summary --format=predicates --minify-output -- evaluator-log.json.txt", + "codeql generate log-summary --format=overall -- evaluator-log.json.txt overall-stats.json" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/generate-query-help.ts +import { z as z11 } from "zod"; +var codeqlGenerateQueryHelpTool = { + name: "codeql_generate_query-help", + description: "Generate query help documentation from QLDoc comments", + command: "codeql", + subcommand: "generate query-help", + inputSchema: { + query: z11.string().describe("Path to the query file to generate help for"), + outputFile: z11.string().optional().describe("Path to write the help documentation"), + format: z11.enum(["markdown", "text", "html"]).optional().describe("Output format for the help documentation"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql generate query-help -- MyQuery.ql", + "codeql generate query-help --format=markdown -- MyQuery.ql help.md", + "codeql generate query-help --format=html -- MyQuery.ql help.html" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/pack-install.ts +import { z as z12 } from "zod"; +var codeqlPackInstallTool = { + name: "codeql_pack_install", + description: "Install CodeQL pack dependencies", + command: "codeql", + subcommand: "pack install", + inputSchema: { + packDir: z12.string().optional().describe("Directory containing qlpack.yml (default: current)"), + force: z12.boolean().optional().describe("Force reinstall of dependencies"), + "no-strict-mode": z12.boolean().optional().describe("Allow non-strict dependency resolution"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql pack install", + "codeql pack install --force /path/to/pack", + "codeql pack install --no-strict-mode" + ] +}; + +// src/tools/codeql/pack-ls.ts +import { z as z13 } from "zod"; +var codeqlPackLsTool = { + name: "codeql_pack_ls", + description: "List CodeQL packs under some local directory path", + command: "codeql", + subcommand: "pack ls", + inputSchema: { + dir: z13.string().optional().describe("The root directory of the package or workspace, defaults to the current working directory"), + format: z13.enum(["text", "json"]).optional().describe("Output format: text (default) or json"), + groups: z13.string().optional().describe("List of CodeQL pack groups to include or exclude"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql pack ls -- .", + "codeql pack ls --format=json -- /path/to/pack-directory", + "codeql pack ls --format=json --groups=queries,tests -- ." + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/profile-codeql-query.ts +init_cli_executor(); +init_logger(); +import { z as z14 } from "zod"; +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 mkdirSync6 } from "fs"; +function parseEvaluatorLog(logPath) { + const logContent = readFileSync4(logPath, "utf-8"); + const jsonObjects = logContent.split("\n\n").filter((s) => s.trim()); + const events = jsonObjects.map((obj) => { + try { + return JSON.parse(obj); + } catch (_error) { + logger.warn(`Failed to parse evaluator log object: ${obj.substring(0, 100)}...`); + return null; + } + }).filter((event) => event !== null); + const pipelineMap = /* @__PURE__ */ new Map(); + const predicateNameToEventId = /* @__PURE__ */ new Map(); + let queryName = ""; + let queryStartTime = 0; + let queryEndTime = 0; + for (const event of events) { + switch (event.type) { + case "QUERY_STARTED": + queryName = event.queryName || ""; + queryStartTime = event.nanoTime; + break; + case "QUERY_COMPLETED": + queryEndTime = event.nanoTime; + break; + case "PREDICATE_STARTED": { + const predicateName = event.predicateName; + const position = event.position; + const predicateType = event.predicateType; + const dependencies = event.dependencies; + predicateNameToEventId.set(predicateName, event.eventId); + const dependencyEventIds = []; + const dependencyNames = []; + if (dependencies) { + for (const depName of Object.keys(dependencies)) { + dependencyNames.push(depName); + const depEventId = predicateNameToEventId.get(depName); + if (depEventId !== void 0) { + dependencyEventIds.push(depEventId); } - ], - isError: true - }; + } + } + pipelineMap.set(event.eventId, { + eventId: event.eventId, + name: predicateName, + position, + type: predicateType, + startTime: event.nanoTime, + dependencies: dependencyNames, + dependencyEventIds + }); + break; + } + case "PREDICATE_COMPLETED": { + const startEventId = event.startEvent; + const pipelineInfo = pipelineMap.get(startEventId); + if (pipelineInfo) { + const startEvent = events.find((e) => e.eventId === startEventId); + if (startEvent) { + const duration = (event.nanoTime - startEvent.nanoTime) / 1e6; + pipelineInfo.endTime = event.nanoTime; + pipelineInfo.duration = duration; + pipelineInfo.resultSize = event.resultSize; + pipelineInfo.tupleCount = event.tupleCount; + } + } + break; } } - ); - registerCLITool(server, codeqlBqrsDecodeTool); - registerCLITool(server, codeqlBqrsInfoTool); - registerCLITool(server, codeqlBqrsInterpretTool); - registerCLITool(server, codeqlDatabaseAnalyzeTool); - registerCLITool(server, codeqlDatabaseCreateTool); - registerCLITool(server, codeqlGenerateLogSummaryTool); - registerCLITool(server, codeqlGenerateQueryHelpTool); - registerCLITool(server, codeqlPackInstallTool); - registerCLITool(server, codeqlPackLsTool); - registerCLITool(server, codeqlQueryCompileTool); - registerCLITool(server, codeqlQueryFormatTool); - registerCLITool(server, codeqlQueryRunTool); - registerCLITool(server, codeqlResolveDatabaseTool); - registerCLITool(server, codeqlResolveLanguagesTool); - registerCLITool(server, codeqlResolveLibraryPathTool); - registerCLITool(server, codeqlResolveMetadataTool); - registerCLITool(server, codeqlResolveQlrefTool); - registerCLITool(server, codeqlResolveQueriesTool); - registerCLITool(server, codeqlResolveTestsTool); - registerCLITool(server, codeqlTestAcceptTool); - registerCLITool(server, codeqlTestExtractTool); - registerCLITool(server, codeqlTestRunTool); - registerFindClassPositionTool(server); - registerFindCodeQLQueryFilesTool(server); - registerFindPredicatePositionTool(server); - registerProfileCodeQLQueryTool(server); - registerQuickEvaluateTool(server); - registerRegisterDatabaseTool(server); -} - -// src/lib/resources.ts -import { readFileSync as readFileSync5 } from "fs"; -import { join as join8, 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 readFileSync5(join8(__dirname2, "../resources/getting-started.md"), "utf-8"); - } catch { - return "Getting started guide not available"; - } -} -function getQueryBasicsGuide() { - try { - return readFileSync5(join8(__dirname2, "../resources/query-basics.md"), "utf-8"); - } catch { - return "Query basics guide not available"; } + const pipelines = Array.from(pipelineMap.values()).filter((p) => p.duration !== void 0).sort((a, b) => a.eventId - b.eventId); + const totalDuration = queryEndTime > 0 ? (queryEndTime - queryStartTime) / 1e6 : 0; + return { + queryName, + totalDuration, + totalEvents: events.length, + pipelines + }; } -function getSecurityTemplates() { - try { - return readFileSync5(join8(__dirname2, "../resources/security-templates.md"), "utf-8"); - } catch { - return "Security templates not available"; - } +function formatAsJson(profile) { + return JSON.stringify(profile, null, 2); } -function getPerformancePatterns() { - try { - return readFileSync5(join8(__dirname2, "../resources/performance-patterns.md"), "utf-8"); - } catch { - return "Performance patterns not available"; - } +function formatAsMermaid(profile) { + const lines = []; + lines.push("```mermaid"); + lines.push("graph TD"); + lines.push(""); + lines.push(` QUERY["${basename4(profile.queryName)}
Total: ${profile.totalDuration.toFixed(2)}ms"]`); + lines.push(""); + profile.pipelines.forEach((pipeline) => { + const nodeId = `P${pipeline.eventId}`; + const duration = pipeline.duration.toFixed(2); + const resultSize = pipeline.resultSize !== void 0 ? pipeline.resultSize : "?"; + const name = pipeline.name.replace(/[<>]/g, "").substring(0, 40); + lines.push(` ${nodeId}["${name}
${duration}ms | ${resultSize} results"]`); + }); + lines.push(""); + const rootPipelines = profile.pipelines.filter((p) => p.dependencies.length === 0); + rootPipelines.forEach((pipeline) => { + lines.push(` QUERY --> P${pipeline.eventId}`); + }); + lines.push(""); + profile.pipelines.forEach((pipeline) => { + pipeline.dependencyEventIds.forEach((depEventId) => { + const duration = pipeline.duration.toFixed(2); + lines.push(` P${depEventId} -->|"${duration}ms"| P${pipeline.eventId}`); + }); + }); + lines.push(""); + lines.push(" classDef default fill:#e1f5ff,stroke:#333,stroke-width:2px"); + lines.push(" classDef query fill:#ffe1e1,stroke:#333,stroke-width:3px"); + lines.push(" class QUERY query"); + lines.push("```"); + return lines.join("\n"); } - -// src/tools/codeql-resources.ts -function registerCodeQLResources(server) { - server.resource( - "CodeQL Getting Started", - "codeql://learning/getting-started", - { - description: "Comprehensive introduction to CodeQL for beginners", - mimeType: "text/markdown" - }, - async () => { - return { - contents: [ - { - uri: "codeql://learning/getting-started", - mimeType: "text/markdown", - text: getGettingStartedGuide() - } - ] - }; - } - ); - server.resource( - "CodeQL Query Basics", - "codeql://learning/query-basics", - { - description: "Learn the fundamentals of writing CodeQL queries", - mimeType: "text/markdown" - }, - async () => { - return { - contents: [ - { - uri: "codeql://learning/query-basics", - mimeType: "text/markdown", - text: getQueryBasicsGuide() - } - ] - }; - } - ); - server.resource( - "CodeQL Security Templates", - "codeql://templates/security", +function registerProfileCodeQLQueryTool(server) { + server.tool( + "profile_codeql_query", + "Profile the performance of a CodeQL query run against a specific database by analyzing the evaluator log JSON file", { - description: "Ready-to-use security query templates", - mimeType: "text/markdown" + query: z14.string().describe("Path to the .ql query file"), + database: z14.string().describe("Path to the CodeQL database directory"), + evaluatorLog: z14.string().optional().describe( + "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." + ), + outputDir: z14.string().optional().describe("Directory to write profiling data files (defaults to same directory as evaluator log)") }, - async () => { - return { - contents: [ - { - uri: "codeql://templates/security", - mimeType: "text/markdown", - text: getSecurityTemplates() + async (params) => { + try { + const { query, database, evaluatorLog, outputDir } = params; + let logPath = evaluatorLog; + let bqrsPath; + let sarifPath; + if (!logPath) { + logger.info("No evaluator log provided, running query to generate one"); + const defaultOutputDir = outputDir || join7(dirname6(query), "profile-output"); + mkdirSync6(defaultOutputDir, { recursive: true }); + logPath = join7(defaultOutputDir, "evaluator-log.jsonl"); + bqrsPath = join7(defaultOutputDir, "query-results.bqrs"); + sarifPath = join7(defaultOutputDir, "query-results.sarif"); + const queryResult = await executeCodeQLCommand( + "query run", + { + database, + output: bqrsPath, + "evaluator-log": logPath, + "tuple-counting": true, + "evaluator-log-level": 5 + }, + [query] + ); + if (!queryResult.success) { + return { + content: [ + { + type: "text", + text: `Failed to run query: ${queryResult.stderr || queryResult.error}` + } + ], + isError: true + }; } - ] - }; - } - ); - server.resource( - "CodeQL Performance Patterns", - "codeql://patterns/performance", - { - description: "Best practices for writing efficient CodeQL queries", - mimeType: "text/markdown" - }, - async () => { - return { - contents: [ - { - uri: "codeql://patterns/performance", - mimeType: "text/markdown", - text: getPerformancePatterns() + if (existsSync6(bqrsPath)) { + try { + const sarifResult = await executeCodeQLCommand( + "bqrs interpret", + { format: "sarif-latest", output: sarifPath }, + [bqrsPath] + ); + if (sarifResult.success) { + logger.info(`Generated SARIF interpretation at ${sarifPath}`); + } + } catch (error) { + logger.warn(`Failed to generate SARIF interpretation: ${error}`); + } } - ] - }; + } + if (!existsSync6(logPath)) { + return { + content: [ + { + type: "text", + text: `Evaluator log not found at: ${logPath}` + } + ], + isError: true + }; + } + logger.info(`Parsing evaluator log from: ${logPath}`); + const profile = parseEvaluatorLog(logPath); + const profileOutputDir = outputDir || dirname6(logPath); + mkdirSync6(profileOutputDir, { recursive: true }); + const jsonPath = join7(profileOutputDir, "query-evaluation-profile.json"); + const jsonContent = formatAsJson(profile); + writeFileSync3(jsonPath, jsonContent); + logger.info(`Profile JSON written to: ${jsonPath}`); + const mdPath = join7(profileOutputDir, "query-evaluation-profile.md"); + const mdContent = formatAsMermaid(profile); + writeFileSync3(mdPath, mdContent); + logger.info(`Profile Mermaid diagram written to: ${mdPath}`); + const outputFiles = [ + `Profile JSON: ${jsonPath}`, + `Profile Mermaid: ${mdPath}`, + `Evaluator Log: ${logPath}` + ]; + if (bqrsPath) { + outputFiles.push(`Query Results (BQRS): ${bqrsPath}`); + } + if (sarifPath && existsSync6(sarifPath)) { + outputFiles.push(`Query Results (SARIF): ${sarifPath}`); + } + const responseText = [ + "Query profiling completed successfully!", + "", + "Output Files:", + ...outputFiles.map((f) => ` - ${f}`), + "", + "Profile Summary:", + ` - Query: ${basename4(profile.queryName)}`, + ` - Total Duration: ${profile.totalDuration.toFixed(2)} ms`, + ` - Total Pipelines: ${profile.pipelines.length}`, + ` - Total Events: ${profile.totalEvents}`, + "", + "First 5 Pipeline Nodes (in evaluation order):", + ...profile.pipelines.slice(0, 5).map((p, idx) => { + return ` ${idx + 1}. ${p.name} (${p.duration.toFixed(2)} ms, ${p.resultSize || "?"} results)`; + }) + ].join("\n"); + return { + content: [ + { + type: "text", + text: responseText + } + ] + }; + } catch (error) { + logger.error("Error profiling CodeQL query:", error); + return { + content: [ + { + type: "text", + text: `Failed to profile query: ${error instanceof Error ? error.message : String(error)}` + } + ], + isError: true + }; + } } ); } -// src/tools/lsp/lsp-diagnostics.ts -import { z as z31 } from "zod"; - -// src/lib/server-manager.ts -import { mkdirSync as mkdirSync7 } from "fs"; -import { join as join10 } from "path"; -import { randomUUID } from "crypto"; +// src/tools/codeql/query-compile.ts +import { z as z15 } from "zod"; +var codeqlQueryCompileTool = { + name: "codeql_query_compile", + description: "Compile and validate CodeQL queries", + command: "codeql", + subcommand: "query compile", + inputSchema: { + query: z15.string().describe("Path to the CodeQL query file (.ql)"), + database: z15.string().optional().describe("Path to the CodeQL database"), + library: z15.string().optional().describe("Path to query library"), + output: z15.string().optional().describe("Output file path"), + warnings: z15.enum(["hide", "show", "error"]).optional().describe("How to handle compilation warnings"), + verbose: z15.boolean().optional().describe("Enable verbose output"), + additionalArgs: z15.array(z15.string()).optional().describe("Additional command-line arguments") + }, + examples: [ + "codeql query compile --database=/path/to/db MyQuery.ql", + "codeql query compile --library=/path/to/lib --output=compiled.qlo MyQuery.ql" + ] +}; -// src/lib/server-config.ts -import { createHash } from "crypto"; -function computeConfigHash(type2, config) { - const sortKeys = (_key, value) => { - if (value && typeof value === "object" && !Array.isArray(value)) { - const sorted = {}; - for (const k of Object.keys(value).sort()) { - sorted[k] = value[k]; - } - return sorted; - } - return value; - }; - const canonical = JSON.stringify({ config, type: type2 }, sortKeys); - return createHash("sha256").update(canonical).digest("hex"); -} -function buildQueryServerArgs(config) { - const args = [ - "execute", - "query-server2" - ]; - if (config.searchPath) { - args.push(`--search-path=${config.searchPath}`); - } - if (config.commonCaches) { - args.push(`--common-caches=${config.commonCaches}`); - } - if (config.logdir) { - args.push(`--logdir=${config.logdir}`); - } - if (config.threads !== void 0) { - args.push(`--threads=${config.threads}`); - } - if (config.timeout !== void 0) { - args.push(`--timeout=${config.timeout}`); - } - if (config.maxDiskCache !== void 0) { - args.push(`--max-disk-cache=${config.maxDiskCache}`); - } - if (config.evaluatorLog) { - args.push(`--evaluator-log=${config.evaluatorLog}`); - } - if (config.debug) { - args.push("--debug"); - args.push("--tuple-counting"); - } else if (config.tupleCounting) { - args.push("--tuple-counting"); - } - return args; -} -function buildCLIServerArgs(config) { - const args = [ - "execute", - "cli-server" - ]; - if (config.commonCaches) { - args.push(`--common-caches=${config.commonCaches}`); - } - if (config.logdir) { - args.push(`--logdir=${config.logdir}`); +// src/tools/codeql/query-format.ts +import { z as z16 } from "zod"; +function formatResultProcessor(result, params) { + const isCheckOnly = params["check-only"]; + const hasFormatChanges = result.exitCode === 1; + if (isCheckOnly && hasFormatChanges) { + result.success = true; + return result.stdout || result.stderr || "File would change by autoformatting."; } - return args; + return defaultCLIResultProcessor(result, params); } +var codeqlQueryFormatTool = { + name: "codeql_query_format", + description: "Automatically format CodeQL source code files", + command: "codeql", + subcommand: "query format", + inputSchema: { + files: z16.array(z16.string()).describe("One or more .ql or .qll source files to format"), + output: z16.string().optional().describe("Write formatted code to this file instead of stdout"), + "in-place": z16.boolean().optional().describe("Overwrite each input file with formatted version"), + "check-only": z16.boolean().optional().describe("Check formatting without writing output"), + backup: z16.string().optional().describe("Backup extension when overwriting existing files"), + "no-syntax-errors": z16.boolean().optional().describe("Ignore syntax errors and pretend file is formatted"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql query format -i -- ExampleQuery.ql", + "codeql query format --in-place -- queries/*.ql", + "codeql query format --check-only -- queries/*.ql" + ], + resultProcessor: formatResultProcessor +}; -// src/lib/language-server.ts -init_logger(); -init_package_paths(); -import { spawn } from "child_process"; -import { EventEmitter } from "events"; -import { setTimeout as setTimeout3, clearTimeout as clearTimeout2 } from "timers"; -import { pathToFileURL } from "url"; -import { delimiter as delimiter2, join as join9 } from "path"; -init_cli_executor(); - -// src/utils/process-ready.ts -init_logger(); -import { clearTimeout, setTimeout as setTimeout2 } from "timers"; -var DEFAULT_READY_TIMEOUT_MS = 3e4; -function waitForProcessReady(child, name, opts) { - const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS; - return new Promise((resolve12, reject) => { - let settled = false; - const cleanup = () => { - settled = true; - child.stderr?.removeListener("data", onStderr); - child.stdout?.removeListener("data", onStdout); - child.removeListener("error", onError); - child.removeListener("exit", onExit); - clearTimeout(timer); - }; - const onStderr = () => { - if (settled) return; - logger.debug(`${name}: ready (stderr output detected)`); - cleanup(); - resolve12(); - }; - const onStdout = () => { - if (settled) return; - logger.debug(`${name}: ready (stdout output detected)`); - cleanup(); - resolve12(); - }; - const onError = (error) => { - if (settled) return; - cleanup(); - reject(new Error(`${name} failed to start: ${error.message}`)); - }; - const onExit = (code) => { - if (settled) return; - cleanup(); - reject(new Error(`${name} exited before becoming ready (code: ${code})`)); - }; - const timer = setTimeout2(() => { - if (settled) return; - logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`); - cleanup(); - resolve12(); - }, timeoutMs); - child.stderr?.on("data", onStderr); - child.stdout?.on("data", onStdout); - child.on("error", onError); - child.on("exit", onExit); - if (child.killed || child.exitCode !== null) { - cleanup(); - reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`)); - } - }); -} +// src/tools/codeql/query-run.ts +import { z as z17 } from "zod"; +var codeqlQueryRunTool = { + name: "codeql_query_run", + description: 'Execute a CodeQL query against a database. Use either "query" parameter for direct file path OR "queryName" + "queryLanguage" for pre-defined tool queries.', + command: "codeql", + subcommand: "query run", + inputSchema: { + query: z17.string().optional().describe("Path to the CodeQL query file (.ql) - cannot be used with queryName"), + queryName: z17.string().optional().describe('Name of pre-defined query to run (e.g., "PrintAST", "CallGraphFrom", "CallGraphTo") - requires queryLanguage'), + queryLanguage: z17.string().optional().describe('Programming language for tools queries (e.g., "javascript", "java", "python") - required when using queryName'), + queryPack: z17.string().optional().describe("Query pack path (defaults to server/ql//tools/src/ for tool queries)"), + sourceFiles: z17.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")'), + sourceFunction: z17.string().optional().describe('Comma-separated list of source function names for CallGraphFrom queries (e.g., "main,processData")'), + targetFunction: z17.string().optional().describe('Comma-separated list of target function names for CallGraphTo queries (e.g., "helper,validateInput")'), + database: createCodeQLSchemas.database(), + output: createCodeQLSchemas.output(), + external: z17.array(z17.string()).optional().describe("External predicate data: predicate=file.csv"), + timeout: createCodeQLSchemas.timeout(), + logDir: z17.string().optional().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/"), + "evaluator-log": z17.string().optional().describe("Path to save evaluator log (deprecated: use logDir instead)"), + "evaluator-log-minify": z17.boolean().optional().describe("Minimize evaluator log for smaller size"), + "evaluator-log-level": z17.number().min(1).max(5).optional().describe("Evaluator log verbosity level (1-5, default 5)"), + "tuple-counting": z17.boolean().optional().describe("Display tuple counts for each evaluation step in evaluator logs"), + format: z17.enum(["sarif-latest", "sarifv2.1.0", "csv", "graphtext", "dgml", "dot"]).optional().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."), + interpretedOutput: z17.string().optional().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"), + evaluationFunction: z17.string().optional().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'), + evaluationOutput: z17.string().optional().describe("[DEPRECATED - use interpretedOutput parameter instead] Output file for evaluation results"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql query run --database=mydb --output=results.bqrs MyQuery.ql", + "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", + "codeql query run --database=mydb --external=data=input.csv --output=results.bqrs MyQuery.ql --format=sarif-latest --interpreted-output=results.sarif", + "codeql query run --database=mydb --evaluator-log=eval.log --tuple-counting --evaluator-log-level=5 --output=results.bqrs MyQuery.ql", + 'codeql query run --database=mydb --query-name=PrintAST --query-language=javascript --source-files="main.js,utils.js" --format=graphtext', + "codeql query run --database=mydb --log-dir=/custom/log/path --tuple-counting --output=results.bqrs MyQuery.ql" + ] +}; -// src/lib/language-server.ts -var CodeQLLanguageServer = class extends EventEmitter { - constructor(_options = {}) { - super(); - this._options = _options; - } - server = null; - messageId = 1; - pendingResponses = /* @__PURE__ */ new Map(); - isInitialized = false; - currentWorkspaceUri; - messageBuffer = ""; - async start() { - if (this.server) { - throw new Error("Language server is already running"); - } - logger.info("Starting CodeQL Language Server..."); - const args = [ - "execute", - "language-server", - "--check-errors=ON_CHANGE" - ]; - if (this._options.searchPath) { - args.push(`--search-path=${this._options.searchPath}`); - } - if (this._options.logdir) { - args.push(`--logdir=${this._options.logdir}`); - } - if (this._options.loglevel) { - args.push(`--loglevel=${this._options.loglevel}`); - } - if (this._options.synchronous) { - args.push("--synchronous"); - } - 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"], - env: spawnEnv - }); - this.server.stderr?.on("data", (data) => { - logger.debug("CodeQL LS stderr:", data.toString()); - }); - this.server.stdout?.on("data", (data) => { - this.handleStdout(data); - }); - this.server.on("error", (error) => { - logger.error("CodeQL Language Server error:", error); - this.emit("error", error); - }); - this.server.on("exit", (code) => { - logger.info("CodeQL Language Server exited with code:", code); - this.server = null; - this.isInitialized = false; - this.emit("exit", code); - }); - await waitForProcessReady(this.server, "CodeQL Language Server"); - } - handleStdout(data) { - this.messageBuffer += data.toString(); - let headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); - while (headerEnd !== -1) { - const header = this.messageBuffer.substring(0, headerEnd); - const contentLengthMatch = header.match(/Content-Length: (\d+)/); - if (contentLengthMatch) { - const contentLength = parseInt(contentLengthMatch[1]); - const messageStart = headerEnd + 4; - const messageEnd = messageStart + contentLength; - if (this.messageBuffer.length >= messageEnd) { - const messageContent = this.messageBuffer.substring(messageStart, messageEnd); - this.messageBuffer = this.messageBuffer.substring(messageEnd); - try { - const message = JSON.parse(messageContent); - this.handleMessage(message); - } catch (error) { - logger.error("Failed to parse LSP message:", error, messageContent); - } - headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); - } else { - break; - } - } else { - logger.error("Invalid LSP header:", header); - this.messageBuffer = ""; - break; +// src/tools/codeql/quick-evaluate.ts +import { z as z18 } from "zod"; +import { join as join8, resolve as resolve6 } from "path"; +init_logger(); +init_temp_dir(); +async function quickEvaluate({ + file, + db: _db, + symbol, + output_path +}) { + try { + try { + await findClassPosition(file, symbol); + } catch { + try { + await findPredicatePosition(file, symbol); + } catch { + throw new Error(`Symbol '${symbol}' not found as class or predicate in file: ${file}`); } } + const resolvedOutput = resolve6(output_path || join8(getProjectTmpDir("quickeval"), "quickeval.bqrs")); + return resolvedOutput; + } catch (error) { + throw new Error(`CodeQL evaluation failed: ${error instanceof Error ? error.message : "Unknown error"}`); } - handleMessage(message) { - logger.debug("Received LSP message:", message); - if (message.id !== void 0 && this.pendingResponses.has(Number(message.id))) { - const pending = this.pendingResponses.get(Number(message.id)); - this.pendingResponses.delete(Number(message.id)); - if (message.error) { - pending.reject(new Error(`LSP Error: ${message.error.message}`)); - } else { - pending.resolve(message.result); +} +function registerQuickEvaluateTool(server) { + server.tool( + "quick_evaluate", + "Quick evaluate either a class or a predicate in a CodeQL query for debugging", + { + file: z18.string().describe("Path to the .ql file containing the symbol"), + db: z18.string().describe("Path to the CodeQL database"), + symbol: z18.string().describe("Name of the class or predicate to evaluate"), + output_path: z18.string().optional().describe("Output path for results (defaults to project-local .tmp/quickeval/)") + }, + async ({ file, db, symbol, output_path }) => { + try { + const result = await quickEvaluate({ file, db, symbol, output_path }); + return { + content: [{ type: "text", text: result }] + }; + } catch (error) { + logger.error("Error in quick evaluate:", error); + return { + content: [ + { + type: "text", + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + } + ], + isError: true + }; } - return; - } - if (message.method === "textDocument/publishDiagnostics") { - this.emit("diagnostics", message.params); } - } - sendMessage(message) { - if (!this.server?.stdin) { - throw new Error("Language server is not running"); + ); +} + +// src/tools/codeql/register-database.ts +init_logger(); +import { z as z19 } from "zod"; +import { access, constants } from "fs/promises"; +import { resolve as resolve7 } from "path"; +async function registerDatabase(dbPath) { + try { + const resolvedPath = resolve7(dbPath); + await access(resolvedPath, constants.F_OK); + const dbYmlPath = resolve7(resolvedPath, "codeql-database.yml"); + await access(dbYmlPath, constants.F_OK); + const srcZipPath = resolve7(resolvedPath, "src.zip"); + const srcDirPath = resolve7(resolvedPath, "src"); + let hasSrcZip = false; + let hasSrcDir = false; + try { + await access(srcZipPath, constants.F_OK); + hasSrcZip = true; + } catch { } - const messageStr = JSON.stringify(message); - const contentLength = Buffer.byteLength(messageStr, "utf8"); - const header = `Content-Length: ${contentLength}\r -\r -`; - const fullMessage = header + messageStr; - logger.debug("Sending LSP message:", fullMessage); - this.server.stdin.write(fullMessage); - } - sendRequest(method, params) { - const id = this.messageId++; - const message = { - jsonrpc: "2.0", - id, - method, - params - }; - return new Promise((resolve12, reject) => { - this.pendingResponses.set(id, { resolve: resolve12, reject }); - this.sendMessage(message); - setTimeout3(() => { - if (this.pendingResponses.has(id)) { - this.pendingResponses.delete(id); - reject(new Error(`LSP request timeout for method: ${method}`)); - } - }, 3e4); - }); - } - sendNotification(method, params) { - const message = { - jsonrpc: "2.0", - method, - params - }; - this.sendMessage(message); - } - /** - * Initialize the language server with an optional workspace URI. - * - * If the server is already initialized with a different workspace, a - * `workspace/didChangeWorkspaceFolders` notification is sent to update - * the workspace context instead of requiring a full restart. - */ - async initialize(workspaceUri) { - if (this.isInitialized) { - if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) { - await this.updateWorkspace(workspaceUri); + if (!hasSrcZip) { + try { + await access(srcDirPath, constants.F_OK); + hasSrcDir = true; + } catch { } - return; } - logger.info("Initializing CodeQL Language Server..."); - const initParams = { - processId: process.pid, - clientInfo: { - name: "codeql-development-mcp-server", - version: getPackageVersion() - }, - capabilities: { - textDocument: { - completion: { completionItem: { snippetSupport: false } }, - definition: {}, - publishDiagnostics: {}, - references: {}, - synchronization: { - didClose: true, - didChange: true, - didOpen: true - } - }, - workspace: { - workspaceFolders: true + if (!hasSrcZip && !hasSrcDir) { + throw new Error(`Missing required source archive (src.zip) or source directory (src/) in: ${dbPath}`); + } + const sourceType = hasSrcZip ? "src.zip" : "src/"; + return `Database registered: ${dbPath} (source: ${sourceType})`; + } catch (error) { + if (error instanceof Error) { + const errorCode = error.code; + if (errorCode === "ENOENT") { + if (error.message.includes("codeql-database.yml")) { + throw new Error(`Missing required codeql-database.yml in: ${dbPath}`); } + throw new Error(`Database path does not exist: ${dbPath}`); } - }; - if (workspaceUri) { - initParams.workspaceFolders = [{ - uri: workspaceUri, - name: "codeql-workspace" - }]; - } - await this.sendRequest("initialize", initParams); - this.sendNotification("initialized", {}); - this.currentWorkspaceUri = workspaceUri; - this.isInitialized = true; - logger.info("CodeQL Language Server initialized successfully"); + if (errorCode === "EACCES") { + throw new Error(`Database path does not exist: ${dbPath}`); + } + } + throw new Error(`Failed to register database: ${error instanceof Error ? error.message : "Unknown error"}`); } - /** - * Update the workspace folders on a running, initialized server. - */ - async updateWorkspace(newUri) { - logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`); - const removed = this.currentWorkspaceUri ? [{ uri: this.currentWorkspaceUri, name: "codeql-workspace" }] : []; - this.sendNotification("workspace/didChangeWorkspaceFolders", { - event: { - added: [{ uri: newUri, name: "codeql-workspace" }], - removed +} +function registerRegisterDatabaseTool(server) { + server.tool( + "register_database", + "Register a CodeQL database given a local path to the database directory", + { + db_path: z19.string().describe("Path to the CodeQL database directory") + }, + async ({ db_path }) => { + try { + const result = await registerDatabase(db_path); + return { + content: [{ type: "text", text: result }] + }; + } catch (error) { + logger.error("Error registering database:", error); + return { + content: [ + { + type: "text", + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + } + ], + isError: true + }; } - }); - this.currentWorkspaceUri = newUri; + } + ); +} + +// src/tools/codeql/resolve-database.ts +import { z as z20 } from "zod"; +var codeqlResolveDatabaseTool = { + name: "codeql_resolve_database", + description: "Resolve database path and validate database structure", + command: "codeql", + subcommand: "resolve database", + inputSchema: { + database: z20.string().describe("Database path to resolve"), + format: z20.enum(["text", "json", "betterjson"]).optional().describe("Output format for database information"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql resolve database -- /path/to/database", + "codeql resolve database --format=json -- my-database", + "codeql resolve database --format=betterjson -- database-dir" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/resolve-languages.ts +import { z as z21 } from "zod"; +var codeqlResolveLanguagesTool = { + name: "codeql_resolve_languages", + description: "List installed CodeQL extractor packs", + command: "codeql", + subcommand: "resolve languages", + inputSchema: { + format: z21.enum(["text", "json", "betterjson"]).optional().describe("Output format for language information"), + verbose: z21.boolean().optional().describe("Enable verbose output"), + additionalArgs: z21.array(z21.string()).optional().describe("Additional command-line arguments") + }, + examples: [ + "codeql resolve languages --format=text", + "codeql resolve languages --format=json", + "codeql resolve languages --format=betterjson" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/resolve-library-path.ts +import { z as z22 } from "zod"; +var codeqlResolveLibraryPathTool = { + name: "codeql_resolve_library-path", + description: "Resolve library path for CodeQL queries and libraries", + command: "codeql", + subcommand: "resolve library-path", + inputSchema: { + language: z22.string().optional().describe("Programming language to resolve library path for"), + format: z22.enum(["text", "json", "betterjson"]).optional().describe("Output format for library path information"), + verbose: z22.boolean().optional().describe("Enable verbose output"), + additionalArgs: z22.array(z22.string()).optional().describe("Additional command-line arguments") + }, + examples: [ + "codeql resolve library-path --language=java", + "codeql resolve library-path --format=json --language=python", + "codeql resolve library-path --format=betterjson" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/resolve-metadata.ts +import { z as z23 } from "zod"; +var codeqlResolveMetadataTool = { + name: "codeql_resolve_metadata", + description: "Resolve and return the key-value metadata pairs from a CodeQL query source file.", + command: "codeql", + subcommand: "resolve metadata", + inputSchema: { + query: z23.string().describe("Query file to resolve metadata for"), + format: z23.enum(["json"]).optional().describe("Output format for metadata information (always JSON, optional for future compatibility)"), + verbose: z23.boolean().optional().describe("Enable verbose output"), + additionalArgs: z23.array(z23.string()).optional().describe("Additional command-line arguments") + }, + examples: [ + "codeql resolve metadata -- relative-path/2/MyQuery.ql", + "codeql resolve metadata --format=json -- /absolute-plus/relative-path/2/MyQuery.ql" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/resolve-qlref.ts +import { z as z24 } from "zod"; +var codeqlResolveQlrefTool = { + name: "codeql_resolve_qlref", + description: "Resolve qlref files to their corresponding query files", + command: "codeql", + subcommand: "resolve qlref", + inputSchema: { + qlref: z24.string().describe("Path to the .qlref file to resolve"), + format: z24.enum(["text", "json", "betterjson"]).optional().describe("Output format for qlref resolution"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql resolve qlref -- test/MyQuery.qlref", + "codeql resolve qlref --format=json -- test/MyQuery.qlref", + "codeql resolve qlref --format=betterjson -- test/MyQuery.qlref" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/resolve-queries.ts +import { z as z25 } from "zod"; +var jsonOnlyResultProcessor = (result, params) => { + if (!result.success) { + return `Command failed (exit code ${result.exitCode || "unknown"}): +${result.error || result.stderr}`; } - /** - * Get the current workspace URI. - */ - getWorkspaceUri() { - return this.currentWorkspaceUri; + if (params.format === "json" || params.format === "betterjson" || params.format === "bylanguage") { + return result.stdout || "[]"; } - async evaluateQL(qlCode, uri) { - if (!this.isInitialized) { - throw new Error("Language server is not initialized"); - } - const documentUri = uri || pathToFileURL(join9(getProjectTmpDir("lsp-eval"), "eval.ql")).href; - return new Promise((resolve12, reject) => { - let diagnosticsReceived = false; - const timeout = setTimeout3(() => { - if (!diagnosticsReceived) { - this.removeAllListeners("diagnostics"); - reject(new Error("Timeout waiting for diagnostics")); - } - }, 3e4); - const diagnosticsHandler = (params) => { - if (params.uri === documentUri) { - diagnosticsReceived = true; - clearTimeout2(timeout); - this.removeListener("diagnostics", diagnosticsHandler); - this.sendNotification("textDocument/didClose", { - textDocument: { uri: documentUri } - }); - resolve12(params.diagnostics); - } - }; - this.on("diagnostics", diagnosticsHandler); - this.sendNotification("textDocument/didOpen", { - textDocument: { - uri: documentUri, - languageId: "ql", - version: 1, - text: qlCode - } - }); - }); + let output = ""; + if (result.stdout) { + output += result.stdout; } - // ---- LSP feature methods (issue #1) ---- - /** - * Get code completions at a position in a document. - */ - async getCompletions(params) { - if (!this.isInitialized) { - throw new Error("Language server is not initialized"); - } - if (!this.isRunning()) { - throw new Error("Language server process is not running"); - } - const result = await this.sendRequest("textDocument/completion", params); - if (result && typeof result === "object" && "items" in result) { - return result.items; + if (result.stderr) { + if (output) { + output += "\n\nWarnings/Info:\n"; } - return result || []; + output += result.stderr; } - /** - * Find the definition(s) of a symbol at a position. - */ - async getDefinition(params) { - if (!this.isInitialized) { - throw new Error("Language server is not initialized"); - } - if (!this.isRunning()) { - throw new Error("Language server process is not running"); - } - const result = await this.sendRequest("textDocument/definition", params); - return this.normalizeLocations(result); + if (!output) { + output = "Command executed successfully (no output)"; } - /** - * Find all references to a symbol at a position. - */ - async getReferences(params) { - if (!this.isInitialized) { - throw new Error("Language server is not initialized"); - } - if (!this.isRunning()) { - throw new Error("Language server process is not running"); - } - const result = await this.sendRequest("textDocument/references", { - ...params, - context: params.context ?? { includeDeclaration: true } - }); - return this.normalizeLocations(result); + return output; +}; +var codeqlResolveQueriesTool = { + name: "codeql_resolve_queries", + description: "List available CodeQL queries found on the local filesystem", + command: "codeql", + subcommand: "resolve queries", + inputSchema: { + directory: z25.string().optional().describe("Directory to search for queries"), + language: z25.string().optional().describe("Filter queries by programming language"), + format: z25.enum(["text", "json", "betterjson", "bylanguage"]).optional().describe("Output format for query list"), + "additional-packs": z25.union([z25.string(), z25.array(z25.string())]).optional().describe("Additional pack directories to search for CodeQL packs"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql resolve queries", + "codeql resolve queries --language=java --format=json", + "codeql resolve queries --format=betterjson -- /path/to/queries", + "codeql resolve queries --additional-packs=/path/to/packs codeql/java-queries" + ], + resultProcessor: jsonOnlyResultProcessor +}; + +// src/tools/codeql/resolve-tests.ts +import { z as z26 } from "zod"; +var codeqlResolveTestsTool = { + name: "codeql_resolve_tests", + description: "Resolve the local filesystem paths of unit tests and/or queries under some base directory", + command: "codeql", + subcommand: "resolve tests", + inputSchema: { + tests: z26.array(z26.string()).optional().describe("One or more tests (.ql, .qlref files, or test directories)"), + format: z26.enum(["text", "json"]).optional().describe("Output format for test list"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql resolve tests", + "codeql resolve tests --format=json -- test-directory", + "codeql resolve tests --format=json -- test1.ql test2.ql" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/test-accept.ts +import { z as z27 } from "zod"; +var codeqlTestAcceptTool = { + name: "codeql_test_accept", + description: "Accept new test results as the expected baseline", + command: "codeql", + subcommand: "test accept", + inputSchema: { + tests: z27.array(z27.string()).describe("One or more tests (.ql, .qlref files, or test directories)"), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql test accept -- languages/java/test/MyQuery/MyQuery.qlref", + "codeql test accept -- languages/java/test/MyQuery/", + "codeql test accept -- languages/java/src/MyQuery/MyQuery.ql" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/test-extract.ts +import { z as z28 } from "zod"; +var codeqlTestExtractTool = { + name: "codeql_test_extract", + description: "Extract test databases for CodeQL query tests", + command: "codeql", + subcommand: "test extract", + inputSchema: { + tests: z28.array(z28.string()).describe("One or more test directories or files"), + language: z28.string().optional().describe("Programming language for extraction"), + threads: createCodeQLSchemas.threads(), + ram: createCodeQLSchemas.ram(), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql test extract -- languages/java/test/MyQuery/", + "codeql test extract --language=java --threads=4 -- test-directory", + "codeql test extract --threads=2 --ram=2048 -- multiple/test/directories" + ], + resultProcessor: defaultCLIResultProcessor +}; + +// src/tools/codeql/test-run.ts +import { z as z29 } from "zod"; +var codeqlTestRunTool = { + name: "codeql_test_run", + description: "Run CodeQL query tests", + command: "codeql", + subcommand: "test run", + inputSchema: { + tests: z29.array(z29.string()).describe("One or more tests (.ql, .qlref files, or test directories)"), + "show-extractor-output": z29.boolean().optional().describe("Show output from extractors during test execution"), + "keep-databases": z29.boolean().optional().describe("Keep test databases after running tests"), + "learn": z29.boolean().optional().describe("Accept current output as expected for failing tests"), + logDir: z29.string().optional().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/"), + threads: createCodeQLSchemas.threads(), + ram: createCodeQLSchemas.ram(), + verbose: createCodeQLSchemas.verbose(), + additionalArgs: createCodeQLSchemas.additionalArgs() + }, + examples: [ + "codeql test run /path/to/tests", + "codeql test run --learn /path/to/failing/tests", + "codeql test run --threads=4 --keep-databases /path/to/tests", + "codeql test run --log-dir=/custom/log/path /path/to/tests" + ] +}; + +// src/tools/codeql-tools.ts +import { z as z30 } from "zod"; + +// src/lib/validation.ts +function validateCodeQLSyntax(query, _language) { + const validation = { + isValid: true, + errors: [], + warnings: [], + suggestions: [] + }; + if (!query.trim()) { + validation.isValid = false; + validation.errors.push("Query cannot be empty"); + return validation; } - /** - * Open a text document in the language server. - * The document must be opened before requesting completions, definitions, etc. - */ - openDocument(uri, text, languageId = "ql", version = 1) { - if (!this.isInitialized) { - throw new Error("Language server is not initialized"); - } - this.sendNotification("textDocument/didOpen", { - textDocument: { uri, languageId, version, text } - }); + if (!query.includes("from") && !query.includes("select")) { + validation.warnings.push('Query should typically include "from" and "select" clauses'); } - /** - * Close a text document in the language server. - */ - closeDocument(uri) { - if (!this.isInitialized) { - throw new Error("Language server is not initialized"); - } - this.sendNotification("textDocument/didClose", { - textDocument: { uri } - }); + if (!query.includes("@name") && !query.includes("@description")) { + validation.suggestions.push("Consider adding @name and @description metadata"); } - /** - * Normalize a definition/references/implementation result to Location[]. - * The LSP spec allows Location | Location[] | LocationLink[]. - */ - normalizeLocations(result) { - if (!result) return []; - if (Array.isArray(result)) { - return result.map((item) => { - if ("targetUri" in item) { - return { uri: item.targetUri, range: item.targetRange }; - } - return item; - }); - } - if (typeof result === "object" && "uri" in result) { - return [result]; + return validation; +} + +// src/lib/query-scaffolding.ts +import * as fs2 from "fs"; +import * as path2 from "path"; +function getLanguageExtension2(language) { + const extensions = { + javascript: "js", + typescript: "ts", + python: "py", + java: "java", + csharp: "cs", + cpp: "cpp", + go: "go", + ruby: "rb", + actions: "yml" + }; + return extensions[language.toLowerCase()] || "txt"; +} +function generateQueryTemplate(queryName, language, description, queryId) { + const desc = description || `${queryName} query`; + const id = queryId || `${language}/example/${queryName.toLowerCase()}`; + return `/** + * @id ${id} + * @name ${queryName} + * @description ${desc} + * @kind problem + * @precision medium + * @problem.severity warning + */ + +import ${language} + +// TODO: Implement query logic +from File f +where f.getBaseName() = "${queryName}.${getLanguageExtension2(language)}" +select f, "TODO: Add query logic" +`; +} +function createCodeQLQuery(options) { + const { basePath, queryName, language, description, queryId } = options; + const absoluteBasePath = path2.resolve(basePath); + const srcDir = path2.join(absoluteBasePath, "src", queryName); + const testDir = path2.join(absoluteBasePath, "test", queryName); + const queryPath = path2.join(srcDir, `${queryName}.ql`); + const qlrefPath = path2.join(testDir, `${queryName}.qlref`); + const testCodePath = path2.join(testDir, `${queryName}.${getLanguageExtension2(language)}`); + const filesCreated = []; + try { + fs2.mkdirSync(srcDir, { recursive: true }); + fs2.mkdirSync(testDir, { recursive: true }); + try { + const queryContent = generateQueryTemplate(queryName, language, description, queryId); + fs2.writeFileSync(queryPath, queryContent, { encoding: "utf8", flag: "wx" }); + filesCreated.push(queryPath); + } catch (e) { + const err = e; + if (err.code !== "EEXIST") throw e; } - return []; - } - async shutdown() { - if (!this.server) { - return; + try { + const qlrefContent = `${queryName}/${queryName}.ql +`; + fs2.writeFileSync(qlrefPath, qlrefContent, { encoding: "utf8", flag: "wx" }); + filesCreated.push(qlrefPath); + } catch (e) { + const err = e; + if (err.code !== "EEXIST") throw e; } - logger.info("Shutting down CodeQL Language Server..."); try { - await this.sendRequest("shutdown", {}); - if (this.server) { - this.sendNotification("exit", {}); - } - } catch (error) { - logger.warn("Error during graceful shutdown:", error); + const testCodeContent = `// Test code for ${queryName} +// TODO: Add test cases +`; + fs2.writeFileSync(testCodePath, testCodeContent, { encoding: "utf8", flag: "wx" }); + filesCreated.push(testCodePath); + } catch (e) { + const err = e; + if (err.code !== "EEXIST") throw e; } - await new Promise((resolve12) => { - const timer = setTimeout3(() => { - if (this.server) { - this.server.kill("SIGTERM"); - } - resolve12(); - }, 1e3); - if (this.server) { - this.server.once("exit", () => { - clearTimeout2(timer); - this.server = null; - resolve12(); - }); - } else { - clearTimeout2(timer); - resolve12(); - } - }); - this.isInitialized = false; - } - isRunning() { - return this.server !== null && !this.server.killed; + return { + queryPath, + testPath: testDir, + qlrefPath, + testCodePath, + filesCreated + }; + } catch (error) { + throw new Error(`Failed to create query scaffolding: ${error instanceof Error ? error.message : "Unknown error"}`); } -}; +} -// src/lib/query-server.ts -import { spawn as spawn2 } from "child_process"; -import { delimiter as delimiter3 } from "path"; -import { EventEmitter as EventEmitter2 } from "events"; -import { clearTimeout as clearTimeout3, setTimeout as setTimeout4 } from "timers"; -init_cli_executor(); +// src/tools/codeql-tools.ts init_logger(); -var CodeQLQueryServer = class extends EventEmitter2 { - messageBuffer = ""; - messageId = 1; - pendingRequests = /* @__PURE__ */ new Map(); - process = null; - config; - constructor(config) { - super(); - this.config = config; - } - /** - * Start the query-server2 process. - */ - async start() { - if (this.process) { - throw new Error("Query server is already running"); - } - logger.info("Starting CodeQL Query Server (query-server2)..."); - const args = buildQueryServerArgs(this.config); - const spawnEnv = { ...process.env }; - const codeqlDir = getResolvedCodeQLDir(); - if (codeqlDir && spawnEnv.PATH) { - spawnEnv.PATH = `${codeqlDir}${delimiter3}${spawnEnv.PATH}`; - } else if (codeqlDir) { - spawnEnv.PATH = codeqlDir; - } - this.process = spawn2("codeql", args, { - stdio: ["pipe", "pipe", "pipe"], - env: spawnEnv - }); - this.process.stderr?.on("data", (data) => { - logger.debug("QueryServer2 stderr:", data.toString()); - }); - this.process.stdout?.on("data", (data) => { - this.handleStdout(data); - }); - this.process.on("error", (error) => { - logger.error("Query server process error:", error); - this.emit("error", error); - }); - this.process.on("exit", (code) => { - logger.info(`Query server exited with code: ${code}`); - this.rejectAllPending(new Error(`Query server exited with code: ${code}`)); - this.process = null; - this.emit("exit", code); - }); - await waitForProcessReady(this.process, "CodeQL Query Server"); - logger.info("CodeQL Query Server started"); - } - /** - * Send a request to the query server and await the response. - * - * @param method - The JSON-RPC method name. - * @param params - The method parameters. - * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min). - * @returns The result from the server. - */ - sendRequest(method, params, timeoutMs = 3e5) { - const id = this.messageId++; - const message = { - id, - jsonrpc: "2.0", - method, - params - }; - return new Promise((resolve12, reject) => { - this.pendingRequests.set(id, { reject, resolve: resolve12 }); +function registerCodeQLTools(server) { + server.tool( + "validate_codeql_query", + "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_lsp_diagnostics instead.", + { + query: z30.string().describe("The CodeQL query to validate"), + language: z30.string().optional().describe("Target programming language") + }, + async ({ query, language }) => { try { - this.sendRaw(message); + const validation = validateCodeQLSyntax(query, language); + return { + content: [{ type: "text", text: JSON.stringify(validation, null, 2) }] + }; } catch (error) { - this.pendingRequests.delete(id); - reject(error instanceof Error ? error : new Error(String(error))); - return; + logger.error("Error validating CodeQL query:", error); + return { + content: [ + { + type: "text", + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + } + ], + isError: true + }; } - const timer = setTimeout4(() => { - if (this.pendingRequests.has(id)) { - this.pendingRequests.delete(id); - reject(new Error(`Query server request timeout for method: ${method}`)); - } - }, timeoutMs); - const originalResolve = resolve12; - const originalReject = reject; - const wrapped = { - reject: (err) => { - clearTimeout3(timer); - originalReject(err); - }, - resolve: (val) => { - clearTimeout3(timer); - originalResolve(val); - } - }; - this.pendingRequests.set(id, wrapped); - }); - } - /** - * Gracefully shut down the query server. - */ - async shutdown() { - if (!this.process) { - return; } - logger.info("Shutting down CodeQL Query Server..."); - try { - await this.sendRequest("shutdown", {}, 5e3); - } catch (error) { - logger.warn("Error during query server graceful shutdown:", error); - } - await new Promise((resolve12) => { - const timer = setTimeout4(() => { - if (this.process) { - this.process.kill("SIGTERM"); - this.process = null; - } - resolve12(); - }, 2e3); - if (this.process) { - this.process.once("exit", () => { - clearTimeout3(timer); - this.process = null; - resolve12(); + ); + server.tool( + "create_codeql_query", + "Create directory structure and files for a new CodeQL query with tests", + { + basePath: z30.string().describe("Base path where src/ and test/ directories will be created"), + queryName: z30.string().describe("Name of the query (e.g., MySecurityQuery)"), + language: z30.string().describe("Target programming language (e.g., javascript, python, java)"), + description: z30.string().optional().describe("Description of what the query does"), + queryId: z30.string().optional().describe("Custom query ID (defaults to language/example/queryname)") + }, + async ({ basePath, queryName, language, description, queryId }) => { + try { + const result = createCodeQLQuery({ + basePath, + queryName, + language, + description, + queryId }); - } else { - clearTimeout3(timer); - resolve12(); - } - }); - } - /** - * Whether the query server process is running. - */ - isRunning() { - return this.process !== null && !this.process.killed; - } - // ---- private helpers ---- - handleStdout(data) { - this.messageBuffer += data.toString(); - let headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); - while (headerEnd !== -1) { - const header = this.messageBuffer.substring(0, headerEnd); - const contentLengthMatch = header.match(/Content-Length: (\d+)/); - if (contentLengthMatch) { - const contentLength = parseInt(contentLengthMatch[1]); - const messageStart = headerEnd + 4; - const messageEnd = messageStart + contentLength; - if (this.messageBuffer.length >= messageEnd) { - const messageContent = this.messageBuffer.substring(messageStart, messageEnd); - this.messageBuffer = this.messageBuffer.substring(messageEnd); - try { - const message = JSON.parse(messageContent); - this.handleMessage(message); - } catch (error) { - logger.error("Failed to parse query server message:", error); - } - headerEnd = this.messageBuffer.indexOf("\r\n\r\n"); - } else { - break; - } - } else { - logger.error("Invalid query server header:", header); - this.messageBuffer = ""; - break; - } - } - } - handleMessage(message) { - logger.debug("QueryServer2 message:", message); - if (message.id !== void 0 && this.pendingRequests.has(Number(message.id))) { - const pending = this.pendingRequests.get(Number(message.id)); - this.pendingRequests.delete(Number(message.id)); - if (message.error) { - pending.reject(new Error(`Query server error: ${message.error.message}`)); - } else { - pending.resolve(message.result); - } - return; - } - if (message.method) { - this.emit("notification", { method: message.method, params: message.params }); - } - } - rejectAllPending(error) { - for (const [id, pending] of this.pendingRequests) { - pending.reject(error); - this.pendingRequests.delete(id); - } - } - sendRaw(message) { - if (!this.process?.stdin) { - throw new Error("Query server is not running"); - } - const body = JSON.stringify(message); - const contentLength = Buffer.byteLength(body, "utf8"); - const frame = `Content-Length: ${contentLength}\r -\r -${body}`; - this.process.stdin.write(frame); - } -}; - -// src/lib/cli-server.ts -import { spawn as spawn3 } from "child_process"; -import { delimiter as delimiter4 } from "path"; -import { EventEmitter as EventEmitter3 } from "events"; -import { clearTimeout as clearTimeout4, setTimeout as setTimeout5 } from "timers"; -init_cli_executor(); -init_logger(); -var CodeQLCLIServer = class extends EventEmitter3 { - commandInProgress = false; - commandQueue = []; - config; - currentReject = null; - currentResolve = null; - nullBuffer = Buffer.alloc(1); - process = null; - stdoutBuffer = ""; - constructor(config) { - super(); - this.config = config; - } - /** - * Start the cli-server process. - */ - async start() { - if (this.process) { - throw new Error("CLI server is already running"); - } - logger.info("Starting CodeQL CLI Server..."); - const args = buildCLIServerArgs(this.config); - const spawnEnv = { ...process.env }; - const codeqlDir = getResolvedCodeQLDir(); - if (codeqlDir && spawnEnv.PATH) { - spawnEnv.PATH = `${codeqlDir}${delimiter4}${spawnEnv.PATH}`; - } else if (codeqlDir) { - spawnEnv.PATH = codeqlDir; - } - this.process = spawn3("codeql", args, { - stdio: ["pipe", "pipe", "pipe"], - env: spawnEnv - }); - this.process.stdout?.on("data", (data) => { - this.handleStdout(data); - }); - this.process.stderr?.on("data", (data) => { - logger.debug("CLIServer stderr:", data.toString()); - }); - this.process.on("error", (error) => { - logger.error("CLI server process error:", error); - if (this.currentReject) { - this.currentReject(error); - this.currentReject = null; - this.currentResolve = null; - } - this.emit("error", error); - }); - this.process.on("exit", (code) => { - logger.info(`CLI server exited with code: ${code}`); - if (this.currentReject) { - this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`)); - this.currentReject = null; - this.currentResolve = null; - } - this.process = null; - this.emit("exit", code); - }); - await waitForProcessReady(this.process, "CodeQL CLI Server"); - logger.info("CodeQL CLI Server started"); - } - /** - * Run a CodeQL CLI command through the persistent server. - * - * Commands are serialized and queued; only one command runs at a time. - * - * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`). - * @returns The stdout output from the command. - */ - runCommand(args) { - return new Promise((resolve12, reject) => { - const execute = () => { - this.executeCommand({ args, reject, resolve: resolve12 }); - }; - if (this.commandInProgress) { - this.commandQueue.push(execute); - } else { - execute(); + const summary = { + success: true, + queryPath: result.queryPath, + testPath: result.testPath, + qlrefPath: result.qlrefPath, + testCodePath: result.testCodePath, + filesCreated: result.filesCreated, + nextSteps: [ + "Review and customize the generated query in: " + result.queryPath, + "Add test cases to: " + result.testCodePath, + "Run codeql_pack_install to install dependencies", + "Run codeql_test_extract to create test database", + "Run codeql_test_run to execute tests" + ] + }; + return { + content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] + }; + } catch (error) { + logger.error("Error creating CodeQL query:", error); + return { + content: [ + { + type: "text", + text: `Error: ${error instanceof Error ? error.message : "Unknown error"}` + } + ], + isError: true + }; } - }); - } - /** - * Gracefully shut down the CLI server. - */ - async shutdown() { - if (!this.process) { - return; - } - logger.info("Shutting down CodeQL CLI Server..."); - try { - this.process.stdin?.write(JSON.stringify(["shutdown"]), "utf8"); - this.process.stdin?.write(this.nullBuffer); - } catch (error) { - logger.warn("Error during CLI server shutdown request:", error); } - await new Promise((resolve12) => { - const timer = setTimeout5(() => { - if (this.process) { - this.process.kill("SIGTERM"); - this.process = null; - } - resolve12(); - }, 2e3); - if (this.process) { - this.process.once("exit", () => { - clearTimeout4(timer); - this.process = null; - resolve12(); - }); - } else { - clearTimeout4(timer); - resolve12(); - } - }); - this.commandInProgress = false; - this.commandQueue = []; - logger.info("CodeQL CLI Server stopped"); + ); + registerCLITool(server, codeqlBqrsDecodeTool); + registerCLITool(server, codeqlBqrsInfoTool); + registerCLITool(server, codeqlBqrsInterpretTool); + registerCLITool(server, codeqlDatabaseAnalyzeTool); + registerCLITool(server, codeqlDatabaseCreateTool); + registerCLITool(server, codeqlGenerateLogSummaryTool); + registerCLITool(server, codeqlGenerateQueryHelpTool); + registerCLITool(server, codeqlPackInstallTool); + registerCLITool(server, codeqlPackLsTool); + registerCLITool(server, codeqlQueryCompileTool); + registerCLITool(server, codeqlQueryFormatTool); + registerCLITool(server, codeqlQueryRunTool); + registerCLITool(server, codeqlResolveDatabaseTool); + registerCLITool(server, codeqlResolveLanguagesTool); + registerCLITool(server, codeqlResolveLibraryPathTool); + registerCLITool(server, codeqlResolveMetadataTool); + registerCLITool(server, codeqlResolveQlrefTool); + registerCLITool(server, codeqlResolveQueriesTool); + registerCLITool(server, codeqlResolveTestsTool); + registerCLITool(server, codeqlTestAcceptTool); + registerCLITool(server, codeqlTestExtractTool); + registerCLITool(server, codeqlTestRunTool); + registerFindClassPositionTool(server); + registerFindCodeQLQueryFilesTool(server); + registerFindPredicatePositionTool(server); + registerProfileCodeQLQueryTool(server); + registerQuickEvaluateTool(server); + registerRegisterDatabaseTool(server); +} + +// src/lib/resources.ts +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 readFileSync5(join10(__dirname2, "../resources/getting-started.md"), "utf-8"); + } catch { + return "Getting started guide not available"; } - /** - * Whether the CLI server process is running. - */ - isRunning() { - return this.process !== null && !this.process.killed; +} +function getQueryBasicsGuide() { + try { + return readFileSync5(join10(__dirname2, "../resources/query-basics.md"), "utf-8"); + } catch { + return "Query basics guide not available"; } - // ---- private helpers ---- - executeCommand(cmd) { - if (!this.process?.stdin) { - cmd.reject(new Error("CLI server is not running")); - return; - } - this.commandInProgress = true; - this.currentResolve = cmd.resolve; - this.currentReject = cmd.reject; - this.stdoutBuffer = ""; - try { - this.process.stdin.write(JSON.stringify(cmd.args), "utf8"); - this.process.stdin.write(this.nullBuffer); - } catch (error) { - this.commandInProgress = false; - this.currentResolve = null; - this.currentReject = null; - cmd.reject(error instanceof Error ? error : new Error(String(error))); - this.runNext(); - } - } - handleStdout(data) { - const str2 = data.toString(); - const nulIndex = str2.indexOf("\0"); - if (nulIndex === -1) { - this.stdoutBuffer += str2; - return; - } - this.stdoutBuffer += str2.substring(0, nulIndex); - const result = this.stdoutBuffer; - this.stdoutBuffer = ""; - if (this.currentResolve) { - this.currentResolve(result); - this.currentResolve = null; - this.currentReject = null; - } - this.commandInProgress = false; - this.runNext(); - const remainder = str2.substring(nulIndex + 1); - if (remainder.length > 0) { - this.stdoutBuffer = remainder; - } +} +function getSecurityTemplates() { + try { + return readFileSync5(join10(__dirname2, "../resources/security-templates.md"), "utf-8"); + } catch { + return "Security templates not available"; } - runNext() { - const next = this.commandQueue.shift(); - if (next) { - next(); - } +} +function getPerformancePatterns() { + try { + return readFileSync5(join10(__dirname2, "../resources/performance-patterns.md"), "utf-8"); + } catch { + return "Performance patterns not available"; } -}; +} -// src/lib/server-manager.ts -init_logger(); -var CodeQLServerManager = class { - /** Keyed by `CodeQLServerType` — at most one per type at a time. */ - servers = /* @__PURE__ */ new Map(); - /** The session ID used for cache isolation. */ - sessionId; - /** Root directory for session-specific caches. */ - sessionCacheDir; - constructor(options) { - this.sessionId = options?.sessionId ?? randomUUID(); - this.sessionCacheDir = join10( - getProjectTmpDir("codeql-cache"), - this.sessionId - ); - for (const subdir of ["compilation-cache", "logs", "query-cache"]) { - mkdirSync7(join10(this.sessionCacheDir, subdir), { recursive: true }); +// src/tools/codeql-resources.ts +function registerCodeQLResources(server) { + server.resource( + "CodeQL Getting Started", + "codeql://learning/getting-started", + { + description: "Comprehensive introduction to CodeQL for beginners", + mimeType: "text/markdown" + }, + async () => { + return { + contents: [ + { + uri: "codeql://learning/getting-started", + mimeType: "text/markdown", + text: getGettingStartedGuide() + } + ] + }; } - logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`); - } - // ---- Public API ---- - /** - * Get the current session ID. - */ - getSessionId() { - return this.sessionId; - } - /** - * Get the session-specific cache directory. - */ - getCacheDir() { - return this.sessionCacheDir; - } - /** - * Return the session-specific log directory. - */ - getLogDir() { - return join10(this.sessionCacheDir, "logs"); - } - /** - * Get or create a Language Server with the given configuration. - * - * If a language server is already running with the same config it is reused. - * If the config has changed the old server is shut down first. - */ - async getLanguageServer(config) { - const enriched = this.enrichConfig(config); - return this.getOrRestart("language", enriched, () => { - return new CodeQLLanguageServer({ - loglevel: enriched.loglevel, - logdir: enriched.logdir, - searchPath: enriched.searchPath, - synchronous: enriched.synchronous, - verbosity: enriched.verbosity - }); - }); - } - /** - * Get or create a Query Server with the given configuration. - */ - async getQueryServer(config) { - const enriched = this.enrichConfig(config); - return this.getOrRestart("query", enriched, () => { - return new CodeQLQueryServer(enriched); - }); - } - /** - * Get or create a CLI Server with the given configuration. - */ - async getCLIServer(config) { - const enriched = this.enrichConfig(config); - return this.getOrRestart("cli", enriched, () => { - return new CodeQLCLIServer(enriched); - }); - } - /** - * Shut down a specific server type. - */ - async shutdownServer(type2) { - const managed = this.servers.get(type2); - if (!managed) return; - logger.info(`Shutting down ${type2} server (session: ${managed.sessionId})`); - await this.stopServer(managed); - this.servers.delete(type2); - } - /** - * Shut down all managed servers. - */ - async shutdownAll() { - logger.info(`Shutting down all servers for session: ${this.sessionId}`); - const shutdownPromises = Array.from(this.servers.entries()).map( - async ([type2, managed]) => { - try { - await this.stopServer(managed); - } catch (error) { - logger.error(`Error shutting down ${type2} server:`, error); - } - } - ); - await Promise.all(shutdownPromises); - this.servers.clear(); - logger.info("All servers shut down"); - } - /** - * Check whether a server of the given type is currently running. - */ - isRunning(type2) { - const managed = this.servers.get(type2); - if (!managed) return false; - return managed.server.isRunning(); - } - /** - * Get status information for all managed servers. - */ - getStatus() { - const status = { - cli: null, - language: null, - query: null - }; - for (const [type2, managed] of this.servers) { - status[type2] = { - configHash: managed.configHash, - running: managed.server.isRunning(), - sessionId: managed.sessionId + ); + server.resource( + "CodeQL Query Basics", + "codeql://learning/query-basics", + { + description: "Learn the fundamentals of writing CodeQL queries", + mimeType: "text/markdown" + }, + async () => { + return { + contents: [ + { + uri: "codeql://learning/query-basics", + mimeType: "text/markdown", + text: getQueryBasicsGuide() + } + ] }; } - return status; - } - // ---- Private helpers ---- - /** - * Enrich a config with session-specific defaults for commonCaches and logdir. - */ - enrichConfig(config) { - return { - ...config, - commonCaches: config.commonCaches ?? this.sessionCacheDir, - logdir: config.logdir ?? this.getLogDir() - }; - } - /** - * Get an existing server if its config matches, otherwise stop the old - * one and start a new server. - */ - async getOrRestart(type2, config, factory) { - const hash = computeConfigHash(type2, config); - const existing = this.servers.get(type2); - if (existing && existing.configHash === hash && existing.server.isRunning()) { - logger.debug(`Reusing existing ${type2} server (hash: ${hash.substring(0, 8)})`); - return existing.server; - } - if (existing) { - logger.info(`${type2} server config changed or dead, restarting...`); - await this.stopServer(existing); - this.servers.delete(type2); - } - const server = factory(); - await server.start(); - this.servers.set(type2, { - configHash: hash, - server, - sessionId: this.sessionId, - type: type2 - }); - logger.info(`${type2} server started (hash: ${hash.substring(0, 8)})`); - return server; - } - /** - * Stop a managed server, ignoring errors. - */ - async stopServer(managed) { - try { - await managed.server.shutdown(); - } catch (error) { - logger.warn(`Error stopping ${managed.type} server:`, error); + ); + server.resource( + "CodeQL Security Templates", + "codeql://templates/security", + { + description: "Ready-to-use security query templates", + mimeType: "text/markdown" + }, + async () => { + return { + contents: [ + { + uri: "codeql://templates/security", + mimeType: "text/markdown", + text: getSecurityTemplates() + } + ] + }; } - } -}; -var globalServerManager = null; -function initServerManager(options) { - if (!globalServerManager) { - globalServerManager = new CodeQLServerManager(options); - } - return globalServerManager; -} -function getServerManager() { - if (!globalServerManager) { - globalServerManager = new CodeQLServerManager(); - } - return globalServerManager; -} -async function shutdownServerManager() { - if (globalServerManager) { - await globalServerManager.shutdownAll(); - globalServerManager = null; - } + ); + server.resource( + "CodeQL Performance Patterns", + "codeql://patterns/performance", + { + description: "Best practices for writing efficient CodeQL queries", + mimeType: "text/markdown" + }, + async () => { + return { + contents: [ + { + uri: "codeql://patterns/performance", + mimeType: "text/markdown", + text: getPerformancePatterns() + } + ] + }; + } + ); } // src/tools/lsp/lsp-diagnostics.ts init_logger(); -import { join as join11, isAbsolute as isAbsolute5, resolve as resolve9 } from "path"; +init_temp_dir(); +import { z as z31 } from "zod"; +import { join as join11 } from "path"; +import { pathToFileURL as pathToFileURL3 } from "url"; + +// src/tools/lsp/lsp-server-helper.ts +init_server_manager(); +init_logger(); +import { isAbsolute as isAbsolute5, resolve as resolve9 } from "path"; import { pathToFileURL as pathToFileURL2 } from "url"; +async function getInitializedLanguageServer(opts = {}) { + const { packageRootDir: pkgRoot, getUserWorkspaceDir: getUserWorkspaceDir2 } = await Promise.resolve().then(() => (init_package_paths(), package_paths_exports)); + const options = opts.serverOptions ?? {}; + const config = { + checkErrors: "ON_CHANGE", + loglevel: options.loglevel ?? "WARN", + searchPath: options.searchPath ?? resolve9(pkgRoot, "ql"), + synchronous: options.synchronous, + verbosity: options.verbosity + }; + const manager = getServerManager(); + const server = await manager.getLanguageServer(config); + let effectiveUri = opts.workspaceUri; + if (effectiveUri && !effectiveUri.startsWith("file://")) { + const absWorkspace = isAbsolute5(effectiveUri) ? effectiveUri : resolve9(getUserWorkspaceDir2(), effectiveUri); + effectiveUri = pathToFileURL2(absWorkspace).href; + } + effectiveUri = effectiveUri ?? pathToFileURL2(resolve9(pkgRoot, "ql")).href; + await server.initialize(effectiveUri); + logger.debug(`Language server initialized with workspace: ${effectiveUri}`); + return server; +} + +// src/tools/lsp/lsp-diagnostics.ts function formatDiagnostics(diagnostics) { if (diagnostics.length === 0) { return "\u2705 No issues found in QL code"; @@ -6814,27 +6991,6 @@ function getSeverityName(severity) { return "Unknown"; } } -async function getLanguageServer(options = {}, workspaceUri) { - const { packageRootDir: pkgRoot } = await Promise.resolve().then(() => (init_package_paths(), package_paths_exports)); - const config = { - checkErrors: "ON_CHANGE", - loglevel: options.loglevel ?? "WARN", - searchPath: options.searchPath ?? resolve9(pkgRoot, "ql"), - synchronous: options.synchronous, - verbosity: options.verbosity - }; - const manager = getServerManager(); - const languageServer = await manager.getLanguageServer(config); - let effectiveUri = workspaceUri; - if (effectiveUri && !effectiveUri.startsWith("file://")) { - const { getUserWorkspaceDir: getUserWorkspaceDir2 } = await Promise.resolve().then(() => (init_package_paths(), package_paths_exports)); - const absWorkspace = isAbsolute5(effectiveUri) ? effectiveUri : resolve9(getUserWorkspaceDir2(), effectiveUri); - effectiveUri = pathToFileURL2(absWorkspace).href; - } - effectiveUri = effectiveUri ?? pathToFileURL2(resolve9(pkgRoot, "ql")).href; - await languageServer.initialize(effectiveUri); - return languageServer; -} async function lspDiagnostics({ qlCode, workspaceUri, @@ -6842,8 +6998,11 @@ async function lspDiagnostics({ }) { try { logger.info("Evaluating QL code via Language Server..."); - const languageServer = await getLanguageServer(serverOptions, workspaceUri); - const evalUri = pathToFileURL2(join11(getProjectTmpDir("lsp-eval"), `eval_${Date.now()}.ql`)).href; + const languageServer = await getInitializedLanguageServer({ + serverOptions, + workspaceUri + }); + const evalUri = pathToFileURL3(join11(getProjectTmpDir("lsp-eval"), `eval_${Date.now()}.ql`)).href; const diagnostics = await languageServer.evaluateQL(qlCode, evalUri); const summary = { errorCount: diagnostics.filter((d) => d.severity === 1).length, @@ -6929,32 +7088,20 @@ function registerLspDiagnosticsTool(server) { } // src/tools/lsp/lsp-handlers.ts -import { readFile as readFile3 } from "fs/promises"; -import { isAbsolute as isAbsolute6, resolve as resolve10 } from "path"; -import { pathToFileURL as pathToFileURL3 } from "url"; init_logger(); init_package_paths(); +import { readFile as readFile3 } from "fs/promises"; +import { isAbsolute as isAbsolute6, resolve as resolve10 } from "path"; +import { pathToFileURL as pathToFileURL4 } from "url"; async function getInitializedServer(params) { - const { packageRootDir: pkgRoot } = await Promise.resolve().then(() => (init_package_paths(), package_paths_exports)); - const config = { - checkErrors: "ON_CHANGE", - loglevel: "WARN", - searchPath: params.searchPath ?? resolve10(pkgRoot, "ql") - }; - const manager = getServerManager(); - const server = await manager.getLanguageServer(config); - let effectiveUri = params.workspaceUri; - if (effectiveUri && !effectiveUri.startsWith("file://")) { - const absWorkspace = isAbsolute6(effectiveUri) ? effectiveUri : resolve10(getUserWorkspaceDir(), effectiveUri); - effectiveUri = pathToFileURL3(absWorkspace).href; - } - effectiveUri = effectiveUri ?? pathToFileURL3(resolve10(pkgRoot, "ql")).href; - await server.initialize(effectiveUri); - return server; + return getInitializedLanguageServer({ + serverOptions: { searchPath: params.searchPath }, + workspaceUri: params.workspaceUri + }); } function prepareDocumentPosition(params) { const absPath = isAbsolute6(params.filePath) ? params.filePath : resolve10(getUserWorkspaceDir(), params.filePath); - const docUri = pathToFileURL3(absPath).href; + const docUri = pathToFileURL4(absPath).href; return { absPath, docUri }; } async function openDocumentForPosition(server, params, absPath, docUri) { @@ -7887,6 +8034,7 @@ var JSONFileSync = class extends DataFileSync { }; // src/lib/session-data-manager.ts +init_temp_dir(); import { mkdirSync as mkdirSync8, writeFileSync as writeFileSync6 } from "fs"; import { join as join14 } from "path"; import { randomUUID as randomUUID2 } from "crypto"; @@ -9181,6 +9329,7 @@ function generateListRecommendations(sessions) { // src/codeql-development-mcp-server.ts init_cli_executor(); +init_server_manager(); init_package_paths(); init_logger(); dotenv.config({ path: resolve11(packageRootDir, ".env") }); @@ -9203,7 +9352,12 @@ async function startServer(mode = "stdio") { registerWorkflowPrompts(server); registerMonitoringTools(server); await sessionDataManager.initialize(); - initServerManager(); + const manager = initServerManager(); + Promise.all([ + manager.warmUpLanguageServer(), + manager.warmUpCLIServer() + ]).catch(() => { + }); if (mode === "stdio") { const transport = new StdioServerTransport(); await server.connect(transport); @@ -9275,7 +9429,7 @@ async function main() { } } var scriptPath = process.argv[1] ? resolve11(process.argv[1]) : void 0; -if (scriptPath && import.meta.url === pathToFileURL4(scriptPath).href) { +if (scriptPath && import.meta.url === pathToFileURL5(scriptPath).href) { main(); } export { diff --git a/server/dist/codeql-development-mcp-server.js.map b/server/dist/codeql-development-mcp-server.js.map index aafa8beb..6c81fdaa 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/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/tools/lsp/lsp-diagnostics.ts", "../src/lib/server-manager.ts", "../src/lib/server-config.ts", "../src/lib/language-server.ts", "../src/utils/process-ready.ts", "../src/lib/query-server.ts", "../src/lib/cli-server.ts", "../src/tools/lsp/lsp-handlers.ts", "../src/tools/lsp/lsp-tools.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 = '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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager\n initServerManager();\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join, isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 via the server manager.\n *\n * - Respects `searchPath` and `workspaceUri` on every call\n * - Restarts the server when configuration changes\n * - Uses session-isolated cache directories\n */\nasync function getLanguageServer(\n options: LanguageServerOptions = {},\n workspaceUri?: string,\n): Promise {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const languageServer = await manager.getLanguageServer(config);\n\n // Normalize workspace URI: resolve relative / bare directory paths to\n // file:// URIs against getUserWorkspaceDir() (respects CODEQL_MCP_WORKSPACE).\n let effectiveUri = workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const { getUserWorkspaceDir } = await import('../../utils/package-paths');\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(getUserWorkspaceDir(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await languageServer.initialize(effectiveUri);\n\n return languageServer;\n}\n\n/**\n * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getLanguageServer(serverOptions, workspaceUri);\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\n}\n", "/**\n * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n } else if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 \u2014 CI environments may need longer for initial JVM warm-up\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 }, 30_000); // 30 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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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 }, 30_000); // 30s \u2014 CI environments need longer for JVM warm-up\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 if (this.server) {\n this.sendNotification('exit', {});\n }\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\n}\n", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n\n try {\n this.sendRaw(message);\n } catch (error) {\n // Clean up immediately \u2014 sendRaw() failed so no response will arrive.\n this.pendingRequests.delete(id);\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n this.stdoutBuffer = '';\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n const str = data.toString();\n\n // Look for NUL byte delimiter\n const nulIndex = str.indexOf('\\0');\n if (nulIndex === -1) {\n // No delimiter yet, accumulate\n this.stdoutBuffer += str;\n return;\n }\n\n // Found delimiter \u2014 command is complete\n this.stdoutBuffer += str.substring(0, nulIndex);\n const result = this.stdoutBuffer;\n this.stdoutBuffer = '';\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n // Handle any remaining data after the NUL byte\n const remainder = str.substring(nulIndex + 1);\n if (remainder.length > 0) {\n this.stdoutBuffer = remainder;\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { readFile } from 'fs/promises';\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\nimport { getUserWorkspaceDir } from '../../utils/package-paths';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /** Absolute path to the QL file. */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n const { packageRootDir: pkgRoot } = await import('../../utils/package-paths');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: params.searchPath ?? resolve(pkgRoot, 'ql'),\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n // Resolve workspace URI: convert relative paths to absolute file:// URIs.\n // Relative paths resolve against getUserWorkspaceDir() so that\n // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools.\n let effectiveUri = params.workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(getUserWorkspaceDir(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n await server.initialize(effectiveUri);\n\n return server;\n}\n\n/**\n * Resolve the file path to an absolute path and file:// URI.\n */\nfunction prepareDocumentPosition(\n params: LSPToolParams,\n): { absPath: string; docUri: string } {\n // Resolve relative paths against getUserWorkspaceDir() so that\n // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools.\n const absPath = isAbsolute(params.filePath)\n ? params.filePath\n : resolve(getUserWorkspaceDir(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n return { absPath, docUri };\n}\n\n/**\n * Read file content and open the document in the language server.\n */\nasync function openDocumentForPosition(\n server: Awaited>,\n params: LSPToolParams,\n absPath: string,\n docUri: string,\n): Promise {\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = await readFile(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n return {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Path to the CodeQL (.ql/.qll) file. Relative paths are resolved against the user workspace directory (see CODEQL_MCP_WORKSPACE).'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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", "isAbsolute", "resolve", "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", "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", "z", "mkdirSync", "join", "type", "setTimeout", "clearTimeout", "delimiter", "join", "setTimeout", "resolve", "delimiter", "resolve", "setTimeout", "join", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "EventEmitter", "delimiter", "spawn", "resolve", "setTimeout", "clearTimeout", "str", "join", "mkdirSync", "type", "join", "isAbsolute", "resolve", "pathToFileURL", "getUserWorkspaceDir", "z", "readFile", "isAbsolute", "resolve", "pathToFileURL", "resolve", "isAbsolute", "pathToFileURL", "readFile", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] + "sources": ["../src/utils/logger.ts", "../src/lib/server-config.ts", "../src/utils/package-paths.ts", "../src/utils/temp-dir.ts", "../src/utils/process-ready.ts", "../src/lib/language-server.ts", "../src/lib/query-server.ts", "../src/lib/cli-server.ts", "../src/lib/server-manager.ts", "../src/lib/cli-executor.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/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/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/tools/lsp/lsp-diagnostics.ts", "../src/tools/lsp/lsp-server-helper.ts", "../src/tools/lsp/lsp-handlers.ts", "../src/tools/lsp/lsp-tools.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 * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n } else if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\n}\n\n// Pre-computed values for use throughout the server\nexport const packageRootDir = getPackageRootDir();\nexport const workspaceRootDir = getWorkspaceRootDir(packageRootDir);\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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 // Wrap resolve/reject to clear the timer when the promise settles.\n const timer = setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 60_000); // 60 second timeout (Windows CI cold JVM can exceed 30s)\n\n this.pendingResponses.set(id, {\n reject: (err: Error) => { clearTimeout(timer); reject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); resolve(val); },\n });\n this.sendMessage(message);\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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.removeListener('diagnostics', diagnosticsHandler);\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 90_000); // 90s \u2014 first call triggers JVM start + compilation; Windows CI is slow\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 if (this.server) {\n this.sendNotification('exit', {});\n }\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n\n try {\n this.sendRaw(message);\n } catch (error) {\n // Clean up immediately \u2014 sendRaw() failed so no response will arrive.\n this.pendingRequests.delete(id);\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n this.stdoutBuffer += data.toString();\n\n // Process all NUL-delimited responses in the buffer\n let nulIndex = this.stdoutBuffer.indexOf('\\0');\n while (nulIndex !== -1) {\n const result = this.stdoutBuffer.substring(0, nulIndex);\n this.stdoutBuffer = this.stdoutBuffer.substring(nulIndex + 1);\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n nulIndex = this.stdoutBuffer.indexOf('\\0');\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Eagerly start the language server so the JVM is warm when the first\n * LSP tool call arrives. Uses the default configuration that\n * `lsp-handlers.ts` / `lsp-diagnostics.ts` would create on the first\n * `getLanguageServer()` call. The server is stored in the managed-servers\n * map and reused by subsequent tool invocations.\n *\n * This is fire-and-forget: errors are logged but do not prevent the MCP\n * server from starting.\n */\n async warmUpLanguageServer(): Promise {\n try {\n // Lazy-import to avoid circular dependency at module level\n const { packageRootDir } = await import('../utils/package-paths');\n const { resolve } = await import('path');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: resolve(packageRootDir, 'ql'),\n };\n logger.info('Warming up language server (background JVM start)...');\n await this.getLanguageServer(config);\n logger.info('Language server warm-up complete');\n } catch (error) {\n logger.warn('Language server warm-up failed (will retry on first tool call):', error);\n }\n }\n\n /**\n * Eagerly start the CLI server so the JVM is warm when the first\n * `executeCodeQLCommand()` call routes through it.\n *\n * The CLI server uses only session-scoped `commonCaches` and `logdir`,\n * both injected by `enrichConfig()`. Passing an empty config is\n * intentional \u2014 it matches what `executeCodeQLCommand()` will request.\n *\n * Fire-and-forget: errors are logged but do not block startup.\n */\n async warmUpCLIServer(): Promise {\n try {\n logger.info('Warming up CLI server (background JVM start)...');\n await this.getCLIServer({});\n logger.info('CLI server warm-up complete');\n } catch (error) {\n logger.warn('CLI server warm-up failed (will retry on first tool call):', error);\n }\n }\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\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 * CodeQL subcommands that MUST run as fresh processes.\n *\n * These cannot use the cli-server because they:\n * - Spawn extractors or other long-running child processes (database create, test extract)\n * - Produce multi-event NUL-delimited streams (test run)\n * - Are compound orchestration commands (database analyze)\n *\n * Everything else is routed through the persistent cli-server JVM for\n * sub-second execution instead of 2-5 s JVM cold-start per invocation.\n */\nconst FRESH_PROCESS_SUBCOMMANDS = new Set([\n 'database analyze',\n 'database create',\n 'test extract',\n 'test run',\n]);\n\n/**\n * Execute a CodeQL command.\n *\n * By default, commands are routed through the persistent `codeql execute\n * cli-server` process managed by {@link CodeQLServerManager}, eliminating\n * repeated JVM startup overhead (~2-5 s savings per call).\n *\n * Commands listed in {@link FRESH_PROCESS_SUBCOMMANDS} (e.g. `database create`,\n * `test run`) are always executed as fresh processes because they either spawn\n * child extractors, produce streaming output, or require a dedicated working\n * directory.\n *\n * If the cli-server is not available (e.g. during early startup before\n * `initServerManager()` is called), the function falls back transparently to\n * a fresh process.\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 // Determine whether this subcommand can use the persistent cli-server.\n // Commands that need a specific CWD also must use a fresh process because\n // the cli-server's CWD is fixed at startup.\n const canUseCLIServer = !FRESH_PROCESS_SUBCOMMANDS.has(subcommand) && !cwd;\n\n if (canUseCLIServer) {\n try {\n // Lazy-import to avoid circular dependency at module level.\n // Use getServerManager() (not initServerManager()) \u2014 if the manager\n // hasn't been initialized yet (e.g. during tests or early startup),\n // this creates one, but we only attempt to *use* the cli-server if\n // it is already running (warmed up at MCP server startup). We never\n // block on starting a new cli-server here \u2014 that would add JVM\n // startup latency to the first fresh-process-fallback call.\n const { getServerManager } = await import('./server-manager');\n const manager = getServerManager();\n\n if (manager.isRunning('cli')) {\n const cliServer = await manager.getCLIServer({});\n const sanitizedArgs = sanitizeCLIArguments(args);\n\n logger.info(`Executing CodeQL command via cli-server: ${subcommand}`, { args: sanitizedArgs });\n\n const stdout = await cliServer.runCommand(sanitizedArgs);\n\n return {\n stdout,\n stderr: '',\n success: true,\n exitCode: 0,\n };\n } else {\n logger.debug(`cli-server not yet running for \"${subcommand}\", using fresh process`);\n }\n } catch (error) {\n // If the cli-server call fails, check whether it's a command-level\n // error (the CLI returned non-zero) or a transport/startup error.\n // For transport errors we fall back to a fresh process; for command\n // errors we return the failure directly.\n const message = error instanceof Error ? error.message : String(error);\n\n // Transport-level errors that warrant a fallback:\n if (message.includes('CLI server is not running') ||\n message.includes('CLI server exited') ||\n message.includes('failed to start')) {\n logger.warn(`cli-server unavailable for \"${subcommand}\", falling back to fresh process: ${message}`);\n // Fall through to fresh-process execution below\n } else {\n // Command-level error \u2014 return it as a failed result\n logger.error(`cli-server command failed for \"${subcommand}\": ${message}`);\n return {\n stdout: '',\n stderr: message,\n success: false,\n error: message,\n exitCode: 1,\n };\n }\n }\n }\n\n // Fresh-process execution (for FRESH_PROCESS_SUBCOMMANDS, CWD-specific\n // calls, or as a fallback when the cli-server is unavailable).\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager and eagerly start the\n // language server and CLI server JVMs so they are warm when the first tool\n // calls arrive. This avoids 2-60 s cold-start penalties per JVM.\n const manager = initServerManager();\n Promise.all([\n manager.warmUpLanguageServer(),\n manager.warmUpCLIServer(),\n ]).catch(() => { /* individual errors logged inside each warm-up method */ });\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 * 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join } from 'path';\nimport { pathToFileURL } from 'url';\nimport { getInitializedLanguageServer } from './lsp-server-helper';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getInitializedLanguageServer({\n serverOptions,\n workspaceUri,\n });\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const { getServerManager } = await import('../../lib/server-manager');\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * Shared helper for obtaining a running, initialized CodeQL Language Server.\n *\n * Both `lsp-diagnostics.ts` and `lsp-handlers.ts` need to:\n * 1. Build a `LanguageServerConfig` with sensible defaults\n * 2. Obtain a server instance from the `CodeQLServerManager`\n * 3. Resolve a workspace URI (relative \u2192 absolute \u2192 `file://`)\n * 4. Initialize the server with the resolved workspace\n *\n * Centralizing this logic avoids duplication and ensures consistent\n * default behaviour across all LSP tools.\n */\n\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport { CodeQLLanguageServer, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\n\n/**\n * Options accepted by {@link getInitializedLanguageServer}.\n */\nexport interface InitializedServerOptions {\n /** Language-server-level options (loglevel, searchPath, etc.). */\n serverOptions?: LanguageServerOptions;\n /** Workspace URI \u2014 may be a `file://` URI, absolute path, or relative path. */\n workspaceUri?: string;\n}\n\n/**\n * Return a running, initialized `CodeQLLanguageServer`.\n *\n * - Resolves `searchPath` to the bundled `ql` directory when not provided.\n * - Converts relative / bare-directory `workspaceUri` paths to `file://` URIs\n * resolved against `getUserWorkspaceDir()` (respects `CODEQL_MCP_WORKSPACE`).\n * - Falls back to the bundled `ql` directory when no workspace is given.\n * - Delegates lifecycle management to the global `CodeQLServerManager`.\n */\nexport async function getInitializedLanguageServer(\n opts: InitializedServerOptions = {},\n): Promise {\n const { packageRootDir: pkgRoot, getUserWorkspaceDir } = await import('../../utils/package-paths');\n const options = opts.serverOptions ?? {};\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n // Normalize workspace URI: convert relative / bare directory paths to\n // file:// URIs against getUserWorkspaceDir() (respects CODEQL_MCP_WORKSPACE).\n let effectiveUri = opts.workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(getUserWorkspaceDir(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n\n await server.initialize(effectiveUri);\n logger.debug(`Language server initialized with workspace: ${effectiveUri}`);\n\n return server;\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { readFile } from 'fs/promises';\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getUserWorkspaceDir } from '../../utils/package-paths';\nimport { getInitializedLanguageServer } from './lsp-server-helper';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /** Absolute path to the QL file. */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n return getInitializedLanguageServer({\n serverOptions: { searchPath: params.searchPath },\n workspaceUri: params.workspaceUri,\n });\n}\n\n/**\n * Resolve the file path to an absolute path and file:// URI.\n */\nfunction prepareDocumentPosition(\n params: LSPToolParams,\n): { absPath: string; docUri: string } {\n // Resolve relative paths against getUserWorkspaceDir() so that\n // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools.\n const absPath = isAbsolute(params.filePath)\n ? params.filePath\n : resolve(getUserWorkspaceDir(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n return { absPath, docUri };\n}\n\n/**\n * Read file content and open the document in the language server.\n */\nasync function openDocumentForPosition(\n server: Awaited>,\n params: LSPToolParams,\n absPath: string,\n docUri: string,\n): Promise {\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = await readFile(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n return {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Path to the CodeQL (.ql/.qll) file. Relative paths are resolved against the user workspace directory (see CODEQL_MCP_WORKSPACE).'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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": ["type", "resolve", "setTimeout", "resolve", "setTimeout", "clearTimeout", "join", "resolve", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "resolve", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "resolve", "mkdirSync", "join", "type", "packageRootDir", "resolve", "existsSync", "delimiter", "dirname", "isAbsolute", "binary", "getServerManager", "resolve", "pathToFileURL", "z", "readFileSync", "dirname", "isAbsolute", "mkdirSync", "mkdirSync", "existsSync", "join", "resolve", "timestamp", "writeFileSync", "existsSync", "mkdirSync", "basename", "dirname", "isAbsolute", "join", "resolve", "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", "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", "z", "join", "pathToFileURL", "isAbsolute", "resolve", "pathToFileURL", "getUserWorkspaceDir", "pathToFileURL", "join", "z", "readFile", "isAbsolute", "resolve", "pathToFileURL", "isAbsolute", "resolve", "pathToFileURL", "readFile", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] } diff --git a/server/src/codeql-development-mcp-server.ts b/server/src/codeql-development-mcp-server.ts index f4534011..0cce811c 100644 --- a/server/src/codeql-development-mcp-server.ts +++ b/server/src/codeql-development-mcp-server.ts @@ -74,8 +74,14 @@ export async function startServer(mode: 'stdio' | 'http' = 'stdio'): Promise { /* individual errors logged inside each warm-up method */ }); if (mode === 'stdio') { const transport = new StdioServerTransport(); diff --git a/server/src/lib/cli-executor.ts b/server/src/lib/cli-executor.ts index a6cb356e..696ccf43 100644 --- a/server/src/lib/cli-executor.ts +++ b/server/src/lib/cli-executor.ts @@ -442,21 +442,112 @@ export function buildQLTArgs(subcommand: string, options: Record, + subcommand: string, + options: Record, additionalArgs: string[] = [], cwd?: string ): Promise { const args = buildCodeQLArgs(subcommand, options); args.push(...additionalArgs); - + + // Determine whether this subcommand can use the persistent cli-server. + // Commands that need a specific CWD also must use a fresh process because + // the cli-server's CWD is fixed at startup. + const canUseCLIServer = !FRESH_PROCESS_SUBCOMMANDS.has(subcommand) && !cwd; + + if (canUseCLIServer) { + try { + // Lazy-import to avoid circular dependency at module level. + // Use getServerManager() (not initServerManager()) — if the manager + // hasn't been initialized yet (e.g. during tests or early startup), + // this creates one, but we only attempt to *use* the cli-server if + // it is already running (warmed up at MCP server startup). We never + // block on starting a new cli-server here — that would add JVM + // startup latency to the first fresh-process-fallback call. + const { getServerManager } = await import('./server-manager'); + const manager = getServerManager(); + + if (manager.isRunning('cli')) { + const cliServer = await manager.getCLIServer({}); + const sanitizedArgs = sanitizeCLIArguments(args); + + logger.info(`Executing CodeQL command via cli-server: ${subcommand}`, { args: sanitizedArgs }); + + const stdout = await cliServer.runCommand(sanitizedArgs); + + return { + stdout, + stderr: '', + success: true, + exitCode: 0, + }; + } else { + logger.debug(`cli-server not yet running for "${subcommand}", using fresh process`); + } + } catch (error) { + // If the cli-server call fails, check whether it's a command-level + // error (the CLI returned non-zero) or a transport/startup error. + // For transport errors we fall back to a fresh process; for command + // errors we return the failure directly. + const message = error instanceof Error ? error.message : String(error); + + // Transport-level errors that warrant a fallback: + if (message.includes('CLI server is not running') || + message.includes('CLI server exited') || + message.includes('failed to start')) { + logger.warn(`cli-server unavailable for "${subcommand}", falling back to fresh process: ${message}`); + // Fall through to fresh-process execution below + } else { + // Command-level error — return it as a failed result + logger.error(`cli-server command failed for "${subcommand}": ${message}`); + return { + stdout: '', + stderr: message, + success: false, + error: message, + exitCode: 1, + }; + } + } + } + + // Fresh-process execution (for FRESH_PROCESS_SUBCOMMANDS, CWD-specific + // calls, or as a fallback when the cli-server is unavailable). return executeCLICommand({ command: 'codeql', args, diff --git a/server/src/lib/cli-server.ts b/server/src/lib/cli-server.ts index 385fa19a..c393af49 100644 --- a/server/src/lib/cli-server.ts +++ b/server/src/lib/cli-server.ts @@ -193,7 +193,6 @@ export class CodeQLCLIServer extends EventEmitter { this.commandInProgress = true; this.currentResolve = cmd.resolve; this.currentReject = cmd.reject; - this.stdoutBuffer = ''; try { this.process.stdin.write(JSON.stringify(cmd.args), 'utf8'); @@ -208,34 +207,24 @@ export class CodeQLCLIServer extends EventEmitter { } private handleStdout(data: Buffer): void { - const str = data.toString(); + this.stdoutBuffer += data.toString(); - // Look for NUL byte delimiter - const nulIndex = str.indexOf('\0'); - if (nulIndex === -1) { - // No delimiter yet, accumulate - this.stdoutBuffer += str; - return; - } - - // Found delimiter — command is complete - this.stdoutBuffer += str.substring(0, nulIndex); - const result = this.stdoutBuffer; - this.stdoutBuffer = ''; + // Process all NUL-delimited responses in the buffer + let nulIndex = this.stdoutBuffer.indexOf('\0'); + while (nulIndex !== -1) { + const result = this.stdoutBuffer.substring(0, nulIndex); + this.stdoutBuffer = this.stdoutBuffer.substring(nulIndex + 1); - if (this.currentResolve) { - this.currentResolve(result); - this.currentResolve = null; - this.currentReject = null; - } + if (this.currentResolve) { + this.currentResolve(result); + this.currentResolve = null; + this.currentReject = null; + } - this.commandInProgress = false; - this.runNext(); + this.commandInProgress = false; + this.runNext(); - // Handle any remaining data after the NUL byte - const remainder = str.substring(nulIndex + 1); - if (remainder.length > 0) { - this.stdoutBuffer = remainder; + nulIndex = this.stdoutBuffer.indexOf('\0'); } } diff --git a/server/src/lib/language-server.ts b/server/src/lib/language-server.ts index ade7ff5b..ed812af3 100644 --- a/server/src/lib/language-server.ts +++ b/server/src/lib/language-server.ts @@ -264,16 +264,19 @@ export class CodeQLLanguageServer extends EventEmitter { }; return new Promise((resolve, reject) => { - this.pendingResponses.set(id, { resolve, reject }); - this.sendMessage(message); - - // Add timeout — CI environments may need longer for initial JVM warm-up - setTimeout(() => { + // Wrap resolve/reject to clear the timer when the promise settles. + const timer = setTimeout(() => { if (this.pendingResponses.has(id)) { this.pendingResponses.delete(id); reject(new Error(`LSP request timeout for method: ${method}`)); } - }, 30_000); // 30 second timeout + }, 60_000); // 60 second timeout (Windows CI cold JVM can exceed 30s) + + this.pendingResponses.set(id, { + reject: (err: Error) => { clearTimeout(timer); reject(err); }, + resolve: (val: unknown) => { clearTimeout(timer); resolve(val); }, + }); + this.sendMessage(message); }); } @@ -382,10 +385,10 @@ export class CodeQLLanguageServer extends EventEmitter { let diagnosticsReceived = false; const timeout = setTimeout(() => { if (!diagnosticsReceived) { - this.removeAllListeners('diagnostics'); + this.removeListener('diagnostics', diagnosticsHandler); reject(new Error('Timeout waiting for diagnostics')); } - }, 30_000); // 30s — CI environments need longer for JVM warm-up + }, 90_000); // 90s — first call triggers JVM start + compilation; Windows CI is slow // Listen for diagnostics const diagnosticsHandler = (params: PublishDiagnosticsParams) => { diff --git a/server/src/lib/server-manager.ts b/server/src/lib/server-manager.ts index dd818421..96d6fcb8 100644 --- a/server/src/lib/server-manager.ts +++ b/server/src/lib/server-manager.ts @@ -201,6 +201,55 @@ export class CodeQLServerManager { // ---- Private helpers ---- + /** + * Eagerly start the language server so the JVM is warm when the first + * LSP tool call arrives. Uses the default configuration that + * `lsp-handlers.ts` / `lsp-diagnostics.ts` would create on the first + * `getLanguageServer()` call. The server is stored in the managed-servers + * map and reused by subsequent tool invocations. + * + * This is fire-and-forget: errors are logged but do not prevent the MCP + * server from starting. + */ + async warmUpLanguageServer(): Promise { + try { + // Lazy-import to avoid circular dependency at module level + const { packageRootDir } = await import('../utils/package-paths'); + const { resolve } = await import('path'); + + const config: LanguageServerConfig = { + checkErrors: 'ON_CHANGE', + loglevel: 'WARN', + searchPath: resolve(packageRootDir, 'ql'), + }; + logger.info('Warming up language server (background JVM start)...'); + await this.getLanguageServer(config); + logger.info('Language server warm-up complete'); + } catch (error) { + logger.warn('Language server warm-up failed (will retry on first tool call):', error); + } + } + + /** + * Eagerly start the CLI server so the JVM is warm when the first + * `executeCodeQLCommand()` call routes through it. + * + * The CLI server uses only session-scoped `commonCaches` and `logdir`, + * both injected by `enrichConfig()`. Passing an empty config is + * intentional — it matches what `executeCodeQLCommand()` will request. + * + * Fire-and-forget: errors are logged but do not block startup. + */ + async warmUpCLIServer(): Promise { + try { + logger.info('Warming up CLI server (background JVM start)...'); + await this.getCLIServer({}); + logger.info('CLI server warm-up complete'); + } catch (error) { + logger.warn('CLI server warm-up failed (will retry on first tool call):', error); + } + } + /** * Enrich a config with session-specific defaults for commonCaches and logdir. */ diff --git a/server/src/tools/lsp/index.ts b/server/src/tools/lsp/index.ts index 87c96b10..f2b59757 100644 --- a/server/src/tools/lsp/index.ts +++ b/server/src/tools/lsp/index.ts @@ -12,4 +12,5 @@ export { lspDefinition, lspReferences, } from './lsp-handlers'; +export { getInitializedLanguageServer } from './lsp-server-helper'; export { registerLSPTools } from './lsp-tools'; diff --git a/server/src/tools/lsp/lsp-diagnostics.ts b/server/src/tools/lsp/lsp-diagnostics.ts index 4ffdc6ce..a34a33ef 100644 --- a/server/src/tools/lsp/lsp-diagnostics.ts +++ b/server/src/tools/lsp/lsp-diagnostics.ts @@ -9,12 +9,11 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { z } from 'zod'; import { Diagnostic, LanguageServerOptions } from '../../lib/language-server'; -import { LanguageServerConfig } from '../../lib/server-config'; -import { getServerManager } from '../../lib/server-manager'; import { logger } from '../../utils/logger'; import { getProjectTmpDir } from '../../utils/temp-dir'; -import { join, isAbsolute, resolve } from 'path'; +import { join } from 'path'; import { pathToFileURL } from 'url'; +import { getInitializedLanguageServer } from './lsp-server-helper'; export interface LspDiagnosticsParams { qlCode: string; @@ -84,46 +83,6 @@ function getSeverityName(severity: number): string { } } -/** - * Initialize or get existing language server instance via the server manager. - * - * - Respects `searchPath` and `workspaceUri` on every call - * - Restarts the server when configuration changes - * - Uses session-isolated cache directories - */ -async function getLanguageServer( - options: LanguageServerOptions = {}, - workspaceUri?: string, -): Promise { - const { packageRootDir: pkgRoot } = await import('../../utils/package-paths'); - - const config: LanguageServerConfig = { - checkErrors: 'ON_CHANGE', - loglevel: options.loglevel ?? 'WARN', - searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'), - synchronous: options.synchronous, - verbosity: options.verbosity, - }; - - const manager = getServerManager(); - const languageServer = await manager.getLanguageServer(config); - - // Normalize workspace URI: resolve relative / bare directory paths to - // file:// URIs against getUserWorkspaceDir() (respects CODEQL_MCP_WORKSPACE). - let effectiveUri = workspaceUri; - if (effectiveUri && !effectiveUri.startsWith('file://')) { - const { getUserWorkspaceDir } = await import('../../utils/package-paths'); - const absWorkspace = isAbsolute(effectiveUri) - ? effectiveUri - : resolve(getUserWorkspaceDir(), effectiveUri); - effectiveUri = pathToFileURL(absWorkspace).href; - } - effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href; - await languageServer.initialize(effectiveUri); - - return languageServer; -} - /** * Evaluate QL code using the CodeQL Language Server and return diagnostics. */ @@ -135,7 +94,10 @@ export async function lspDiagnostics({ try { logger.info('Evaluating QL code via Language Server...'); - const languageServer = await getLanguageServer(serverOptions, workspaceUri); + const languageServer = await getInitializedLanguageServer({ + serverOptions, + workspaceUri, + }); // Generate unique URI for this evaluation const evalUri = pathToFileURL(join(getProjectTmpDir('lsp-eval'), `eval_${Date.now()}.ql`)).href; @@ -172,6 +134,7 @@ export async function lspDiagnostics({ * Shutdown the language server via the server manager. */ export async function shutdownDiagnosticsServer(): Promise { + const { getServerManager } = await import('../../lib/server-manager'); const manager = getServerManager(); await manager.shutdownServer('language'); } diff --git a/server/src/tools/lsp/lsp-handlers.ts b/server/src/tools/lsp/lsp-handlers.ts index b178622e..db3adabf 100644 --- a/server/src/tools/lsp/lsp-handlers.ts +++ b/server/src/tools/lsp/lsp-handlers.ts @@ -15,10 +15,9 @@ import { LSPLocation, TextDocumentPositionParams, } from '../../lib/language-server'; -import { LanguageServerConfig } from '../../lib/server-config'; -import { getServerManager } from '../../lib/server-manager'; import { logger } from '../../utils/logger'; import { getUserWorkspaceDir } from '../../utils/package-paths'; +import { getInitializedLanguageServer } from './lsp-server-helper'; /** * Common parameters for LSP tool invocations. @@ -42,31 +41,10 @@ export interface LSPToolParams { * Get a running, initialized language server for the given parameters. */ async function getInitializedServer(params: LSPToolParams) { - const { packageRootDir: pkgRoot } = await import('../../utils/package-paths'); - - const config: LanguageServerConfig = { - checkErrors: 'ON_CHANGE', - loglevel: 'WARN', - searchPath: params.searchPath ?? resolve(pkgRoot, 'ql'), - }; - - const manager = getServerManager(); - const server = await manager.getLanguageServer(config); - - // Resolve workspace URI: convert relative paths to absolute file:// URIs. - // Relative paths resolve against getUserWorkspaceDir() so that - // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools. - let effectiveUri = params.workspaceUri; - if (effectiveUri && !effectiveUri.startsWith('file://')) { - const absWorkspace = isAbsolute(effectiveUri) - ? effectiveUri - : resolve(getUserWorkspaceDir(), effectiveUri); - effectiveUri = pathToFileURL(absWorkspace).href; - } - effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href; - await server.initialize(effectiveUri); - - return server; + return getInitializedLanguageServer({ + serverOptions: { searchPath: params.searchPath }, + workspaceUri: params.workspaceUri, + }); } /** diff --git a/server/src/tools/lsp/lsp-server-helper.ts b/server/src/tools/lsp/lsp-server-helper.ts new file mode 100644 index 00000000..71a33a5a --- /dev/null +++ b/server/src/tools/lsp/lsp-server-helper.ts @@ -0,0 +1,73 @@ +/** + * Shared helper for obtaining a running, initialized CodeQL Language Server. + * + * Both `lsp-diagnostics.ts` and `lsp-handlers.ts` need to: + * 1. Build a `LanguageServerConfig` with sensible defaults + * 2. Obtain a server instance from the `CodeQLServerManager` + * 3. Resolve a workspace URI (relative → absolute → `file://`) + * 4. Initialize the server with the resolved workspace + * + * Centralizing this logic avoids duplication and ensures consistent + * default behaviour across all LSP tools. + */ + +import { isAbsolute, resolve } from 'path'; +import { pathToFileURL } from 'url'; + +import { CodeQLLanguageServer, LanguageServerOptions } from '../../lib/language-server'; +import { LanguageServerConfig } from '../../lib/server-config'; +import { getServerManager } from '../../lib/server-manager'; +import { logger } from '../../utils/logger'; + +/** + * Options accepted by {@link getInitializedLanguageServer}. + */ +export interface InitializedServerOptions { + /** Language-server-level options (loglevel, searchPath, etc.). */ + serverOptions?: LanguageServerOptions; + /** Workspace URI — may be a `file://` URI, absolute path, or relative path. */ + workspaceUri?: string; +} + +/** + * Return a running, initialized `CodeQLLanguageServer`. + * + * - Resolves `searchPath` to the bundled `ql` directory when not provided. + * - Converts relative / bare-directory `workspaceUri` paths to `file://` URIs + * resolved against `getUserWorkspaceDir()` (respects `CODEQL_MCP_WORKSPACE`). + * - Falls back to the bundled `ql` directory when no workspace is given. + * - Delegates lifecycle management to the global `CodeQLServerManager`. + */ +export async function getInitializedLanguageServer( + opts: InitializedServerOptions = {}, +): Promise { + const { packageRootDir: pkgRoot, getUserWorkspaceDir } = await import('../../utils/package-paths'); + const options = opts.serverOptions ?? {}; + + const config: LanguageServerConfig = { + checkErrors: 'ON_CHANGE', + loglevel: options.loglevel ?? 'WARN', + searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'), + synchronous: options.synchronous, + verbosity: options.verbosity, + }; + + const manager = getServerManager(); + const server = await manager.getLanguageServer(config); + + // Normalize workspace URI: convert relative / bare directory paths to + // file:// URIs against getUserWorkspaceDir() (respects CODEQL_MCP_WORKSPACE). + let effectiveUri = opts.workspaceUri; + if (effectiveUri && !effectiveUri.startsWith('file://')) { + const absWorkspace = isAbsolute(effectiveUri) + ? effectiveUri + : resolve(getUserWorkspaceDir(), effectiveUri); + effectiveUri = pathToFileURL(absWorkspace).href; + } + effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href; + + await server.initialize(effectiveUri); + logger.debug(`Language server initialized with workspace: ${effectiveUri}`); + + return server; +} diff --git a/server/test/src/lib/cli-executor.test.ts b/server/test/src/lib/cli-executor.test.ts index e7432b48..e0619cfd 100644 --- a/server/test/src/lib/cli-executor.test.ts +++ b/server/test/src/lib/cli-executor.test.ts @@ -776,3 +776,47 @@ describe('validateCodeQLBinaryReachable', () => { } }); }); + +describe('executeCodeQLCommand cli-server routing', () => { + // These tests verify the routing logic without spawning real processes. + // We import executeCodeQLCommand directly and mock the server-manager module. + + it('should include fresh-process subcommands for database create, test run, test extract, database analyze', async () => { + // Verify the FRESH_PROCESS_SUBCOMMANDS set by checking that these commands + // don't attempt to use the cli-server even when it's running. + // We import the module to access the internal behavior. + const { executeCodeQLCommand } = await import('../../../src/lib/cli-executor'); + + // These subcommands should always use fresh processes (they will fail because + // codeql isn't available in the test env, but the important thing is they + // DON'T try to use the cli-server). + const freshCommands = ['database create', 'database analyze', 'test run', 'test extract']; + for (const cmd of freshCommands) { + const result = await executeCodeQLCommand(cmd, {}, []); + // These will fail (no codeql binary in test) — that's fine. + // We're verifying they don't hang waiting for a cli-server. + expect(result.success).toBe(false); + } + }); + + it('should fall back to fresh process when cli-server is not running', async () => { + const { executeCodeQLCommand } = await import('../../../src/lib/cli-executor'); + + // With no server manager initialized, the cli-server won't be running. + // executeCodeQLCommand should gracefully fall back to a fresh process. + const result = await executeCodeQLCommand('resolve languages', {}, []); + // Will fail because no codeql binary, but should not hang or throw. + expect(result).toBeDefined(); + expect(typeof result.success).toBe('boolean'); + }); + + it('should not use cli-server when cwd is specified', async () => { + const { executeCodeQLCommand } = await import('../../../src/lib/cli-executor'); + + // Commands with a specific CWD must use fresh processes because the + // cli-server's CWD is fixed at startup. + const result = await executeCodeQLCommand('pack ls', {}, [], '/tmp'); + expect(result).toBeDefined(); + expect(typeof result.success).toBe('boolean'); + }); +}); diff --git a/server/test/src/lib/cli-server.test.ts b/server/test/src/lib/cli-server.test.ts index 40282c3f..e98d7a7b 100644 --- a/server/test/src/lib/cli-server.test.ts +++ b/server/test/src/lib/cli-server.test.ts @@ -207,6 +207,43 @@ describe('CodeQLCLIServer', () => { }); }); + describe('handleStdout with multiple NUL delimiters', () => { + it('should handle two NUL-delimited responses in a single data chunk', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + const cmd1Promise = server.runCommand(['cmd1']); + const cmd2Promise = server.runCommand(['cmd2']); + + // Send two NUL-delimited responses in a single data event + mockProc.stdout.emit('data', Buffer.from('result1\0result2\0')); + + const result1 = await cmd1Promise; + const result2 = await cmd2Promise; + + expect(result1).toBe('result1'); + expect(result2).toBe('result2'); + }); + + it('should handle a trailing NUL with more data after it', async () => { + const server = new CodeQLCLIServer({}); + await server.start(); + + const cmd1Promise = server.runCommand(['cmd1']); + const cmd2Promise = server.runCommand(['cmd2']); + + // First chunk contains cmd1 response and partial cmd2 response + mockProc.stdout.emit('data', Buffer.from('result1\0partial')); + const result1 = await cmd1Promise; + expect(result1).toBe('result1'); + + // Second chunk completes cmd2 + mockProc.stdout.emit('data', Buffer.from('_more\0')); + const result2 = await cmd2Promise; + expect(result2).toBe('partial_more'); + }); + }); + describe('events', () => { it('should emit error event on process error', async () => { const server = new CodeQLCLIServer({}); diff --git a/server/test/src/lib/language-server.test.ts b/server/test/src/lib/language-server.test.ts index 1b1af5b5..a0a9212e 100644 --- a/server/test/src/lib/language-server.test.ts +++ b/server/test/src/lib/language-server.test.ts @@ -276,6 +276,74 @@ describe('CodeQLLanguageServer', () => { }); }); + describe('sendRequest timer cleanup', () => { + it('should clear the timeout timer when a response arrives', async () => { + vi.useFakeTimers(); + + const ls = new CodeQLLanguageServer(); + await ls.start(); + + // Initialize first + const initPromise = ls.initialize('file:///workspace'); + mockProc.stdout.emit('data', Buffer.from(buildLspFrame({ + id: 1, jsonrpc: '2.0', result: { capabilities: {} }, + }))); + await initPromise; + + // Issue a completion request + const completionsPromise = ls.getCompletions({ + position: { character: 0, line: 0 }, + textDocument: { uri: 'file:///test.ql' }, + }); + + // Respond successfully (id=2 since id=1 was initialize) + mockProc.stdout.emit('data', Buffer.from(buildLspFrame({ + id: 2, jsonrpc: '2.0', result: [], + }))); + + const result = await completionsPromise; + expect(result).toEqual([]); + + // Advance time past the 60s timeout — must NOT throw + await vi.advanceTimersByTimeAsync(120_000); + + vi.useRealTimers(); + }); + }); + + describe('evaluateQL listener isolation', () => { + it('should only remove its own diagnostics handler, not all listeners', async () => { + const ls = new CodeQLLanguageServer(); + await ls.start(); + + // Initialize + const initPromise = ls.initialize('file:///workspace'); + mockProc.stdout.emit('data', Buffer.from(buildLspFrame({ + id: 1, jsonrpc: '2.0', result: { capabilities: {} }, + }))); + await initPromise; + + // Add a separate diagnostics listener that should survive + const externalHandler = vi.fn(); + ls.on('diagnostics', externalHandler); + + // evaluateQL adds its own handler — total should be 2 + const evalPromise = ls.evaluateQL('select 1', 'file:///eval.ql'); + expect(ls.listenerCount('diagnostics')).toBe(2); + + // Simulate diagnostics arriving for the evaluateQL document + ls.emit('diagnostics', { + uri: 'file:///eval.ql', + diagnostics: [], + }); + + await evalPromise; + + // evaluateQL's handler should be gone, but external handler must survive + expect(ls.listenerCount('diagnostics')).toBe(1); + }); + }); + describe('shutdown', () => { it('should not throw when server is not running', async () => { const ls = new CodeQLLanguageServer(); diff --git a/server/test/src/lib/server-manager.test.ts b/server/test/src/lib/server-manager.test.ts index 6d9232ef..4103a98c 100644 --- a/server/test/src/lib/server-manager.test.ts +++ b/server/test/src/lib/server-manager.test.ts @@ -264,4 +264,48 @@ describe('global server manager', () => { expect(newManager).toBeDefined(); }); }); + + describe('warmUpLanguageServer', () => { + it('should start the language server eagerly', async () => { + const manager = new CodeQLServerManager({ sessionId: 'warmup-lang-test' }); + expect(manager.isRunning('language')).toBe(false); + + await manager.warmUpLanguageServer(); + + expect(manager.isRunning('language')).toBe(true); + }); + + it('should not throw on failure', async () => { + // Mock spawn to throw — warmUpLanguageServer should catch and log + const { spawn } = await import('child_process'); + (spawn as ReturnType).mockImplementationOnce(() => { + throw new Error('mock spawn failure'); + }); + + const manager = new CodeQLServerManager({ sessionId: 'warmup-fail-test' }); + // Should not throw + await expect(manager.warmUpLanguageServer()).resolves.toBeUndefined(); + }); + }); + + describe('warmUpCLIServer', () => { + it('should start the CLI server eagerly', async () => { + const manager = new CodeQLServerManager({ sessionId: 'warmup-cli-test' }); + expect(manager.isRunning('cli')).toBe(false); + + await manager.warmUpCLIServer(); + + expect(manager.isRunning('cli')).toBe(true); + }); + + it('should not throw on failure', async () => { + const { spawn } = await import('child_process'); + (spawn as ReturnType).mockImplementationOnce(() => { + throw new Error('mock spawn failure'); + }); + + const manager = new CodeQLServerManager({ sessionId: 'warmup-cli-fail-test' }); + await expect(manager.warmUpCLIServer()).resolves.toBeUndefined(); + }); + }); }); diff --git a/server/test/src/tools/lsp/lsp-diagnostics.test.ts b/server/test/src/tools/lsp/lsp-diagnostics.test.ts index 17dee40f..583f6aa5 100644 --- a/server/test/src/tools/lsp/lsp-diagnostics.test.ts +++ b/server/test/src/tools/lsp/lsp-diagnostics.test.ts @@ -32,6 +32,7 @@ vi.mock('../../../../src/lib/server-manager', () => ({ // Mock package-paths vi.mock('../../../../src/utils/package-paths', () => ({ getPackageRootDir: vi.fn(() => '/mock/pkg'), + getUserWorkspaceDir: vi.fn(() => '/mock/workspace'), packageRootDir: '/mock/pkg', })); From a30bc49e2b7adefac327bf3fb7a2fb1be31d7392 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Mon, 9 Feb 2026 07:20:52 -0700 Subject: [PATCH 6/7] Address PR review comments from review #3773277390 - Fix race condition in server-manager getOrRestart: serialize concurrent calls per server type using pendingStarts map with async/await pattern - Fix lsp-handlers filePath docstring: document that relative paths are accepted and resolved against getUserWorkspaceDir() - Fix semantic_validation/syntax_validation READMEs: clarify that before/ after .ql files differ (not identical as previously stated) - Fix semantic_validation/after/monitoring-state.json: update parameter shape to use ql_code matching the codeql_lsp_diagnostics tool contract - Add concurrent access serialization test for server-manager --- .../semantic_validation/README.md | 2 +- .../after/monitoring-state.json | 34 +++++-------------- .../syntax_validation/README.md | 2 +- server/dist/codeql-development-mcp-server.js | 26 ++++++++++++++ .../dist/codeql-development-mcp-server.js.map | 4 +-- server/src/lib/server-manager.ts | 33 ++++++++++++++++++ server/src/tools/lsp/lsp-handlers.ts | 6 +++- server/test/src/lib/server-manager.test.ts | 14 ++++++++ 8 files changed, 90 insertions(+), 31 deletions(-) diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/README.md b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/README.md index e424a7b3..34ffd0ed 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/README.md +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/README.md @@ -13,5 +13,5 @@ references undefined types (e.g., `UndefinedType`). ## EXPECTED OUTPUTS - `isValid` is `false` with semantic diagnostics about unresolvable types. -- The `semantic_query.ql` file remains unchanged (identical in before/ and after/). +- The `before/semantic_query.ql` contains the erroneous query; `after/semantic_query.ql` shows the corrected version after addressing the diagnostics. - Monitoring state updated to record a successful `codeql_lsp_diagnostics` call. diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/after/monitoring-state.json b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/after/monitoring-state.json index a3b9dab2..1b725f38 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/after/monitoring-state.json +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/semantic_validation/after/monitoring-state.json @@ -1,35 +1,17 @@ { "sessions": [ { - "sessionId": "codeql-eval-session", - "queryPath": "/test/semantic_query.ql", - "language": "javascript", - "queryType": "test", - "description": "CodeQL LSP diagnostics test", - "status": "active", - "state": { - "compilationStatus": "success", - "testStatus": "no_tests", - "documentationStatus": "missing", - "filesPresent": ["/test/semantic_query.ql"] - }, - "mcpCalls": [ + "id": "integration_test_session", + "calls": [ { - "callId": "eval-call-1", - "timestamp": "2024-01-01T00:00:00.000Z", - "toolName": "codeql_lsp_diagnostics", + "tool": "codeql_lsp_diagnostics", + "timestamp": "2026-02-08T00:00:00.000Z", + "status": "success", "parameters": { - "sessionId": "codeql-eval-session", - "query": "from DataFlow::Configuration cfg select cfg", - "language": "javascript" - }, - "success": true, - "duration": 1500, - "result": "semantic validation completed" + "ql_code": "from NonExistentType item\nwhere item.someProperty() = \"value\"\nselect item, \"This has semantic errors\"" + } } - ], - "testExecutions": [], - "qualityScores": [] + ] } ] } \ No newline at end of file diff --git a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/README.md b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/README.md index 45f330ed..af69141f 100644 --- a/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/README.md +++ b/client/integration-tests/primitives/tools/codeql_lsp_diagnostics/syntax_validation/README.md @@ -11,5 +11,5 @@ Tests that `codeql_lsp_diagnostics` detects syntax errors in invalid QL code. ## EXPECTED OUTPUTS - `isValid` is `false` with one or more error diagnostics. -- The `test_query.ql` file remains unchanged (identical in before/ and after/). +- The `before/test_query.ql` contains the erroneous query; `after/test_query.ql` shows the corrected version after addressing the diagnostics. - Monitoring state updated to record a successful `codeql_lsp_diagnostics` call. diff --git a/server/dist/codeql-development-mcp-server.js b/server/dist/codeql-development-mcp-server.js index 0d00fa52..d4f6da0a 100755 --- a/server/dist/codeql-development-mcp-server.js +++ b/server/dist/codeql-development-mcp-server.js @@ -1111,6 +1111,8 @@ var init_server_manager = __esm({ CodeQLServerManager = class { /** Keyed by `CodeQLServerType` — at most one per type at a time. */ servers = /* @__PURE__ */ new Map(); + /** In-flight `getOrRestart` promises, keyed by server type, to serialize concurrent calls. */ + pendingStarts = /* @__PURE__ */ new Map(); /** The session ID used for cache isolation. */ sessionId; /** Root directory for session-specific caches. */ @@ -1294,8 +1296,32 @@ var init_server_manager = __esm({ /** * Get an existing server if its config matches, otherwise stop the old * one and start a new server. + * + * Concurrent calls for the same server type are serialized via + * `pendingStarts` to avoid spawning duplicate server processes. */ async getOrRestart(type2, config, factory) { + const inflight = this.pendingStarts.get(type2); + if (inflight) { + try { + await inflight; + } catch { + } + } + const work = this.doGetOrRestart(type2, config, factory); + this.pendingStarts.set(type2, work); + try { + return await work; + } finally { + if (this.pendingStarts.get(type2) === work) { + this.pendingStarts.delete(type2); + } + } + } + /** + * Core logic for getOrRestart, separated to allow serialization. + */ + async doGetOrRestart(type2, config, factory) { const hash = computeConfigHash(type2, config); const existing = this.servers.get(type2); if (existing && existing.configHash === hash && existing.server.isRunning()) { diff --git a/server/dist/codeql-development-mcp-server.js.map b/server/dist/codeql-development-mcp-server.js.map index 6c81fdaa..b65fa321 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/server-config.ts", "../src/utils/package-paths.ts", "../src/utils/temp-dir.ts", "../src/utils/process-ready.ts", "../src/lib/language-server.ts", "../src/lib/query-server.ts", "../src/lib/cli-server.ts", "../src/lib/server-manager.ts", "../src/lib/cli-executor.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/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/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/tools/lsp/lsp-diagnostics.ts", "../src/tools/lsp/lsp-server-helper.ts", "../src/tools/lsp/lsp-handlers.ts", "../src/tools/lsp/lsp-tools.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 * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n } else if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\n}\n\n// Pre-computed values for use throughout the server\nexport const packageRootDir = getPackageRootDir();\nexport const workspaceRootDir = getWorkspaceRootDir(packageRootDir);\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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 // Wrap resolve/reject to clear the timer when the promise settles.\n const timer = setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 60_000); // 60 second timeout (Windows CI cold JVM can exceed 30s)\n\n this.pendingResponses.set(id, {\n reject: (err: Error) => { clearTimeout(timer); reject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); resolve(val); },\n });\n this.sendMessage(message);\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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.removeListener('diagnostics', diagnosticsHandler);\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 90_000); // 90s \u2014 first call triggers JVM start + compilation; Windows CI is slow\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 if (this.server) {\n this.sendNotification('exit', {});\n }\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n\n try {\n this.sendRaw(message);\n } catch (error) {\n // Clean up immediately \u2014 sendRaw() failed so no response will arrive.\n this.pendingRequests.delete(id);\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n this.stdoutBuffer += data.toString();\n\n // Process all NUL-delimited responses in the buffer\n let nulIndex = this.stdoutBuffer.indexOf('\\0');\n while (nulIndex !== -1) {\n const result = this.stdoutBuffer.substring(0, nulIndex);\n this.stdoutBuffer = this.stdoutBuffer.substring(nulIndex + 1);\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n nulIndex = this.stdoutBuffer.indexOf('\\0');\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Eagerly start the language server so the JVM is warm when the first\n * LSP tool call arrives. Uses the default configuration that\n * `lsp-handlers.ts` / `lsp-diagnostics.ts` would create on the first\n * `getLanguageServer()` call. The server is stored in the managed-servers\n * map and reused by subsequent tool invocations.\n *\n * This is fire-and-forget: errors are logged but do not prevent the MCP\n * server from starting.\n */\n async warmUpLanguageServer(): Promise {\n try {\n // Lazy-import to avoid circular dependency at module level\n const { packageRootDir } = await import('../utils/package-paths');\n const { resolve } = await import('path');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: resolve(packageRootDir, 'ql'),\n };\n logger.info('Warming up language server (background JVM start)...');\n await this.getLanguageServer(config);\n logger.info('Language server warm-up complete');\n } catch (error) {\n logger.warn('Language server warm-up failed (will retry on first tool call):', error);\n }\n }\n\n /**\n * Eagerly start the CLI server so the JVM is warm when the first\n * `executeCodeQLCommand()` call routes through it.\n *\n * The CLI server uses only session-scoped `commonCaches` and `logdir`,\n * both injected by `enrichConfig()`. Passing an empty config is\n * intentional \u2014 it matches what `executeCodeQLCommand()` will request.\n *\n * Fire-and-forget: errors are logged but do not block startup.\n */\n async warmUpCLIServer(): Promise {\n try {\n logger.info('Warming up CLI server (background JVM start)...');\n await this.getCLIServer({});\n logger.info('CLI server warm-up complete');\n } catch (error) {\n logger.warn('CLI server warm-up failed (will retry on first tool call):', error);\n }\n }\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\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 * CodeQL subcommands that MUST run as fresh processes.\n *\n * These cannot use the cli-server because they:\n * - Spawn extractors or other long-running child processes (database create, test extract)\n * - Produce multi-event NUL-delimited streams (test run)\n * - Are compound orchestration commands (database analyze)\n *\n * Everything else is routed through the persistent cli-server JVM for\n * sub-second execution instead of 2-5 s JVM cold-start per invocation.\n */\nconst FRESH_PROCESS_SUBCOMMANDS = new Set([\n 'database analyze',\n 'database create',\n 'test extract',\n 'test run',\n]);\n\n/**\n * Execute a CodeQL command.\n *\n * By default, commands are routed through the persistent `codeql execute\n * cli-server` process managed by {@link CodeQLServerManager}, eliminating\n * repeated JVM startup overhead (~2-5 s savings per call).\n *\n * Commands listed in {@link FRESH_PROCESS_SUBCOMMANDS} (e.g. `database create`,\n * `test run`) are always executed as fresh processes because they either spawn\n * child extractors, produce streaming output, or require a dedicated working\n * directory.\n *\n * If the cli-server is not available (e.g. during early startup before\n * `initServerManager()` is called), the function falls back transparently to\n * a fresh process.\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 // Determine whether this subcommand can use the persistent cli-server.\n // Commands that need a specific CWD also must use a fresh process because\n // the cli-server's CWD is fixed at startup.\n const canUseCLIServer = !FRESH_PROCESS_SUBCOMMANDS.has(subcommand) && !cwd;\n\n if (canUseCLIServer) {\n try {\n // Lazy-import to avoid circular dependency at module level.\n // Use getServerManager() (not initServerManager()) \u2014 if the manager\n // hasn't been initialized yet (e.g. during tests or early startup),\n // this creates one, but we only attempt to *use* the cli-server if\n // it is already running (warmed up at MCP server startup). We never\n // block on starting a new cli-server here \u2014 that would add JVM\n // startup latency to the first fresh-process-fallback call.\n const { getServerManager } = await import('./server-manager');\n const manager = getServerManager();\n\n if (manager.isRunning('cli')) {\n const cliServer = await manager.getCLIServer({});\n const sanitizedArgs = sanitizeCLIArguments(args);\n\n logger.info(`Executing CodeQL command via cli-server: ${subcommand}`, { args: sanitizedArgs });\n\n const stdout = await cliServer.runCommand(sanitizedArgs);\n\n return {\n stdout,\n stderr: '',\n success: true,\n exitCode: 0,\n };\n } else {\n logger.debug(`cli-server not yet running for \"${subcommand}\", using fresh process`);\n }\n } catch (error) {\n // If the cli-server call fails, check whether it's a command-level\n // error (the CLI returned non-zero) or a transport/startup error.\n // For transport errors we fall back to a fresh process; for command\n // errors we return the failure directly.\n const message = error instanceof Error ? error.message : String(error);\n\n // Transport-level errors that warrant a fallback:\n if (message.includes('CLI server is not running') ||\n message.includes('CLI server exited') ||\n message.includes('failed to start')) {\n logger.warn(`cli-server unavailable for \"${subcommand}\", falling back to fresh process: ${message}`);\n // Fall through to fresh-process execution below\n } else {\n // Command-level error \u2014 return it as a failed result\n logger.error(`cli-server command failed for \"${subcommand}\": ${message}`);\n return {\n stdout: '',\n stderr: message,\n success: false,\n error: message,\n exitCode: 1,\n };\n }\n }\n }\n\n // Fresh-process execution (for FRESH_PROCESS_SUBCOMMANDS, CWD-specific\n // calls, or as a fallback when the cli-server is unavailable).\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager and eagerly start the\n // language server and CLI server JVMs so they are warm when the first tool\n // calls arrive. This avoids 2-60 s cold-start penalties per JVM.\n const manager = initServerManager();\n Promise.all([\n manager.warmUpLanguageServer(),\n manager.warmUpCLIServer(),\n ]).catch(() => { /* individual errors logged inside each warm-up method */ });\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 * 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join } from 'path';\nimport { pathToFileURL } from 'url';\nimport { getInitializedLanguageServer } from './lsp-server-helper';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getInitializedLanguageServer({\n serverOptions,\n workspaceUri,\n });\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const { getServerManager } = await import('../../lib/server-manager');\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * Shared helper for obtaining a running, initialized CodeQL Language Server.\n *\n * Both `lsp-diagnostics.ts` and `lsp-handlers.ts` need to:\n * 1. Build a `LanguageServerConfig` with sensible defaults\n * 2. Obtain a server instance from the `CodeQLServerManager`\n * 3. Resolve a workspace URI (relative \u2192 absolute \u2192 `file://`)\n * 4. Initialize the server with the resolved workspace\n *\n * Centralizing this logic avoids duplication and ensures consistent\n * default behaviour across all LSP tools.\n */\n\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport { CodeQLLanguageServer, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\n\n/**\n * Options accepted by {@link getInitializedLanguageServer}.\n */\nexport interface InitializedServerOptions {\n /** Language-server-level options (loglevel, searchPath, etc.). */\n serverOptions?: LanguageServerOptions;\n /** Workspace URI \u2014 may be a `file://` URI, absolute path, or relative path. */\n workspaceUri?: string;\n}\n\n/**\n * Return a running, initialized `CodeQLLanguageServer`.\n *\n * - Resolves `searchPath` to the bundled `ql` directory when not provided.\n * - Converts relative / bare-directory `workspaceUri` paths to `file://` URIs\n * resolved against `getUserWorkspaceDir()` (respects `CODEQL_MCP_WORKSPACE`).\n * - Falls back to the bundled `ql` directory when no workspace is given.\n * - Delegates lifecycle management to the global `CodeQLServerManager`.\n */\nexport async function getInitializedLanguageServer(\n opts: InitializedServerOptions = {},\n): Promise {\n const { packageRootDir: pkgRoot, getUserWorkspaceDir } = await import('../../utils/package-paths');\n const options = opts.serverOptions ?? {};\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n // Normalize workspace URI: convert relative / bare directory paths to\n // file:// URIs against getUserWorkspaceDir() (respects CODEQL_MCP_WORKSPACE).\n let effectiveUri = opts.workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(getUserWorkspaceDir(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n\n await server.initialize(effectiveUri);\n logger.debug(`Language server initialized with workspace: ${effectiveUri}`);\n\n return server;\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { readFile } from 'fs/promises';\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getUserWorkspaceDir } from '../../utils/package-paths';\nimport { getInitializedLanguageServer } from './lsp-server-helper';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /** Absolute path to the QL file. */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n return getInitializedLanguageServer({\n serverOptions: { searchPath: params.searchPath },\n workspaceUri: params.workspaceUri,\n });\n}\n\n/**\n * Resolve the file path to an absolute path and file:// URI.\n */\nfunction prepareDocumentPosition(\n params: LSPToolParams,\n): { absPath: string; docUri: string } {\n // Resolve relative paths against getUserWorkspaceDir() so that\n // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools.\n const absPath = isAbsolute(params.filePath)\n ? params.filePath\n : resolve(getUserWorkspaceDir(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n return { absPath, docUri };\n}\n\n/**\n * Read file content and open the document in the language server.\n */\nasync function openDocumentForPosition(\n server: Awaited>,\n params: LSPToolParams,\n absPath: string,\n docUri: string,\n): Promise {\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = await readFile(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n return {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Path to the CodeQL (.ql/.qll) file. Relative paths are resolved against the user workspace directory (see CODEQL_MCP_WORKSPACE).'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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 * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n } else if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\n}\n\n// Pre-computed values for use throughout the server\nexport const packageRootDir = getPackageRootDir();\nexport const workspaceRootDir = getWorkspaceRootDir(packageRootDir);\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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 // Wrap resolve/reject to clear the timer when the promise settles.\n const timer = setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 60_000); // 60 second timeout (Windows CI cold JVM can exceed 30s)\n\n this.pendingResponses.set(id, {\n reject: (err: Error) => { clearTimeout(timer); reject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); resolve(val); },\n });\n this.sendMessage(message);\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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.removeListener('diagnostics', diagnosticsHandler);\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 90_000); // 90s \u2014 first call triggers JVM start + compilation; Windows CI is slow\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 if (this.server) {\n this.sendNotification('exit', {});\n }\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n\n try {\n this.sendRaw(message);\n } catch (error) {\n // Clean up immediately \u2014 sendRaw() failed so no response will arrive.\n this.pendingRequests.delete(id);\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n this.stdoutBuffer += data.toString();\n\n // Process all NUL-delimited responses in the buffer\n let nulIndex = this.stdoutBuffer.indexOf('\\0');\n while (nulIndex !== -1) {\n const result = this.stdoutBuffer.substring(0, nulIndex);\n this.stdoutBuffer = this.stdoutBuffer.substring(nulIndex + 1);\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n nulIndex = this.stdoutBuffer.indexOf('\\0');\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** In-flight `getOrRestart` promises, keyed by server type, to serialize concurrent calls. */\n private pendingStarts = new Map>();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Eagerly start the language server so the JVM is warm when the first\n * LSP tool call arrives. Uses the default configuration that\n * `lsp-handlers.ts` / `lsp-diagnostics.ts` would create on the first\n * `getLanguageServer()` call. The server is stored in the managed-servers\n * map and reused by subsequent tool invocations.\n *\n * This is fire-and-forget: errors are logged but do not prevent the MCP\n * server from starting.\n */\n async warmUpLanguageServer(): Promise {\n try {\n // Lazy-import to avoid circular dependency at module level\n const { packageRootDir } = await import('../utils/package-paths');\n const { resolve } = await import('path');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: resolve(packageRootDir, 'ql'),\n };\n logger.info('Warming up language server (background JVM start)...');\n await this.getLanguageServer(config);\n logger.info('Language server warm-up complete');\n } catch (error) {\n logger.warn('Language server warm-up failed (will retry on first tool call):', error);\n }\n }\n\n /**\n * Eagerly start the CLI server so the JVM is warm when the first\n * `executeCodeQLCommand()` call routes through it.\n *\n * The CLI server uses only session-scoped `commonCaches` and `logdir`,\n * both injected by `enrichConfig()`. Passing an empty config is\n * intentional \u2014 it matches what `executeCodeQLCommand()` will request.\n *\n * Fire-and-forget: errors are logged but do not block startup.\n */\n async warmUpCLIServer(): Promise {\n try {\n logger.info('Warming up CLI server (background JVM start)...');\n await this.getCLIServer({});\n logger.info('CLI server warm-up complete');\n } catch (error) {\n logger.warn('CLI server warm-up failed (will retry on first tool call):', error);\n }\n }\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n *\n * Concurrent calls for the same server type are serialized via\n * `pendingStarts` to avoid spawning duplicate server processes.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n // If another call is already starting a server of this type, wait for it\n // to settle (success or failure) and then re-check whether the result is\n // still usable.\n const inflight = this.pendingStarts.get(type);\n if (inflight) {\n try { await inflight; } catch { /* swallow \u2014 original caller handles the rejection */ }\n }\n\n const work = this.doGetOrRestart(type, config, factory);\n this.pendingStarts.set(type, work);\n try {\n return await work;\n } finally {\n if (this.pendingStarts.get(type) === work) {\n this.pendingStarts.delete(type);\n }\n }\n }\n\n /**\n * Core logic for getOrRestart, separated to allow serialization.\n */\n private async doGetOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\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 * CodeQL subcommands that MUST run as fresh processes.\n *\n * These cannot use the cli-server because they:\n * - Spawn extractors or other long-running child processes (database create, test extract)\n * - Produce multi-event NUL-delimited streams (test run)\n * - Are compound orchestration commands (database analyze)\n *\n * Everything else is routed through the persistent cli-server JVM for\n * sub-second execution instead of 2-5 s JVM cold-start per invocation.\n */\nconst FRESH_PROCESS_SUBCOMMANDS = new Set([\n 'database analyze',\n 'database create',\n 'test extract',\n 'test run',\n]);\n\n/**\n * Execute a CodeQL command.\n *\n * By default, commands are routed through the persistent `codeql execute\n * cli-server` process managed by {@link CodeQLServerManager}, eliminating\n * repeated JVM startup overhead (~2-5 s savings per call).\n *\n * Commands listed in {@link FRESH_PROCESS_SUBCOMMANDS} (e.g. `database create`,\n * `test run`) are always executed as fresh processes because they either spawn\n * child extractors, produce streaming output, or require a dedicated working\n * directory.\n *\n * If the cli-server is not available (e.g. during early startup before\n * `initServerManager()` is called), the function falls back transparently to\n * a fresh process.\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 // Determine whether this subcommand can use the persistent cli-server.\n // Commands that need a specific CWD also must use a fresh process because\n // the cli-server's CWD is fixed at startup.\n const canUseCLIServer = !FRESH_PROCESS_SUBCOMMANDS.has(subcommand) && !cwd;\n\n if (canUseCLIServer) {\n try {\n // Lazy-import to avoid circular dependency at module level.\n // Use getServerManager() (not initServerManager()) \u2014 if the manager\n // hasn't been initialized yet (e.g. during tests or early startup),\n // this creates one, but we only attempt to *use* the cli-server if\n // it is already running (warmed up at MCP server startup). We never\n // block on starting a new cli-server here \u2014 that would add JVM\n // startup latency to the first fresh-process-fallback call.\n const { getServerManager } = await import('./server-manager');\n const manager = getServerManager();\n\n if (manager.isRunning('cli')) {\n const cliServer = await manager.getCLIServer({});\n const sanitizedArgs = sanitizeCLIArguments(args);\n\n logger.info(`Executing CodeQL command via cli-server: ${subcommand}`, { args: sanitizedArgs });\n\n const stdout = await cliServer.runCommand(sanitizedArgs);\n\n return {\n stdout,\n stderr: '',\n success: true,\n exitCode: 0,\n };\n } else {\n logger.debug(`cli-server not yet running for \"${subcommand}\", using fresh process`);\n }\n } catch (error) {\n // If the cli-server call fails, check whether it's a command-level\n // error (the CLI returned non-zero) or a transport/startup error.\n // For transport errors we fall back to a fresh process; for command\n // errors we return the failure directly.\n const message = error instanceof Error ? error.message : String(error);\n\n // Transport-level errors that warrant a fallback:\n if (message.includes('CLI server is not running') ||\n message.includes('CLI server exited') ||\n message.includes('failed to start')) {\n logger.warn(`cli-server unavailable for \"${subcommand}\", falling back to fresh process: ${message}`);\n // Fall through to fresh-process execution below\n } else {\n // Command-level error \u2014 return it as a failed result\n logger.error(`cli-server command failed for \"${subcommand}\": ${message}`);\n return {\n stdout: '',\n stderr: message,\n success: false,\n error: message,\n exitCode: 1,\n };\n }\n }\n }\n\n // Fresh-process execution (for FRESH_PROCESS_SUBCOMMANDS, CWD-specific\n // calls, or as a fallback when the cli-server is unavailable).\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager and eagerly start the\n // language server and CLI server JVMs so they are warm when the first tool\n // calls arrive. This avoids 2-60 s cold-start penalties per JVM.\n const manager = initServerManager();\n Promise.all([\n manager.warmUpLanguageServer(),\n manager.warmUpCLIServer(),\n ]).catch(() => { /* individual errors logged inside each warm-up method */ });\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 * 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join } from 'path';\nimport { pathToFileURL } from 'url';\nimport { getInitializedLanguageServer } from './lsp-server-helper';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getInitializedLanguageServer({\n serverOptions,\n workspaceUri,\n });\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const { getServerManager } = await import('../../lib/server-manager');\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * Shared helper for obtaining a running, initialized CodeQL Language Server.\n *\n * Both `lsp-diagnostics.ts` and `lsp-handlers.ts` need to:\n * 1. Build a `LanguageServerConfig` with sensible defaults\n * 2. Obtain a server instance from the `CodeQLServerManager`\n * 3. Resolve a workspace URI (relative \u2192 absolute \u2192 `file://`)\n * 4. Initialize the server with the resolved workspace\n *\n * Centralizing this logic avoids duplication and ensures consistent\n * default behaviour across all LSP tools.\n */\n\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport { CodeQLLanguageServer, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\n\n/**\n * Options accepted by {@link getInitializedLanguageServer}.\n */\nexport interface InitializedServerOptions {\n /** Language-server-level options (loglevel, searchPath, etc.). */\n serverOptions?: LanguageServerOptions;\n /** Workspace URI \u2014 may be a `file://` URI, absolute path, or relative path. */\n workspaceUri?: string;\n}\n\n/**\n * Return a running, initialized `CodeQLLanguageServer`.\n *\n * - Resolves `searchPath` to the bundled `ql` directory when not provided.\n * - Converts relative / bare-directory `workspaceUri` paths to `file://` URIs\n * resolved against `getUserWorkspaceDir()` (respects `CODEQL_MCP_WORKSPACE`).\n * - Falls back to the bundled `ql` directory when no workspace is given.\n * - Delegates lifecycle management to the global `CodeQLServerManager`.\n */\nexport async function getInitializedLanguageServer(\n opts: InitializedServerOptions = {},\n): Promise {\n const { packageRootDir: pkgRoot, getUserWorkspaceDir } = await import('../../utils/package-paths');\n const options = opts.serverOptions ?? {};\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n // Normalize workspace URI: convert relative / bare directory paths to\n // file:// URIs against getUserWorkspaceDir() (respects CODEQL_MCP_WORKSPACE).\n let effectiveUri = opts.workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(getUserWorkspaceDir(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n\n await server.initialize(effectiveUri);\n logger.debug(`Language server initialized with workspace: ${effectiveUri}`);\n\n return server;\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { readFile } from 'fs/promises';\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getUserWorkspaceDir } from '../../utils/package-paths';\nimport { getInitializedLanguageServer } from './lsp-server-helper';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /**\n * Path to the QL file. May be absolute or relative.\n * Relative paths are resolved against `getUserWorkspaceDir()`\n * (respects the `CODEQL_MCP_WORKSPACE` environment variable).\n */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n return getInitializedLanguageServer({\n serverOptions: { searchPath: params.searchPath },\n workspaceUri: params.workspaceUri,\n });\n}\n\n/**\n * Resolve the file path to an absolute path and file:// URI.\n */\nfunction prepareDocumentPosition(\n params: LSPToolParams,\n): { absPath: string; docUri: string } {\n // Resolve relative paths against getUserWorkspaceDir() so that\n // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools.\n const absPath = isAbsolute(params.filePath)\n ? params.filePath\n : resolve(getUserWorkspaceDir(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n return { absPath, docUri };\n}\n\n/**\n * Read file content and open the document in the language server.\n */\nasync function openDocumentForPosition(\n server: Awaited>,\n params: LSPToolParams,\n absPath: string,\n docUri: string,\n): Promise {\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = await readFile(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n return {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Path to the CodeQL (.ql/.qll) file. Relative paths are resolved against the user workspace directory (see CODEQL_MCP_WORKSPACE).'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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": ["type", "resolve", "setTimeout", "resolve", "setTimeout", "clearTimeout", "join", "resolve", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "resolve", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "resolve", "mkdirSync", "join", "type", "packageRootDir", "resolve", "existsSync", "delimiter", "dirname", "isAbsolute", "binary", "getServerManager", "resolve", "pathToFileURL", "z", "readFileSync", "dirname", "isAbsolute", "mkdirSync", "mkdirSync", "existsSync", "join", "resolve", "timestamp", "writeFileSync", "existsSync", "mkdirSync", "basename", "dirname", "isAbsolute", "join", "resolve", "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", "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", "z", "join", "pathToFileURL", "isAbsolute", "resolve", "pathToFileURL", "getUserWorkspaceDir", "pathToFileURL", "join", "z", "readFile", "isAbsolute", "resolve", "pathToFileURL", "isAbsolute", "resolve", "pathToFileURL", "readFile", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] } diff --git a/server/src/lib/server-manager.ts b/server/src/lib/server-manager.ts index 96d6fcb8..61416746 100644 --- a/server/src/lib/server-manager.ts +++ b/server/src/lib/server-manager.ts @@ -58,6 +58,9 @@ export class CodeQLServerManager { /** Keyed by `CodeQLServerType` — at most one per type at a time. */ private servers = new Map(); + /** In-flight `getOrRestart` promises, keyed by server type, to serialize concurrent calls. */ + private pendingStarts = new Map>(); + /** The session ID used for cache isolation. */ private sessionId: string; @@ -264,11 +267,41 @@ export class CodeQLServerManager { /** * Get an existing server if its config matches, otherwise stop the old * one and start a new server. + * + * Concurrent calls for the same server type are serialized via + * `pendingStarts` to avoid spawning duplicate server processes. */ private async getOrRestart( type: CodeQLServerType, config: ServerConfig, factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer, + ): Promise { + // If another call is already starting a server of this type, wait for it + // to settle (success or failure) and then re-check whether the result is + // still usable. + const inflight = this.pendingStarts.get(type); + if (inflight) { + try { await inflight; } catch { /* swallow — original caller handles the rejection */ } + } + + const work = this.doGetOrRestart(type, config, factory); + this.pendingStarts.set(type, work); + try { + return await work; + } finally { + if (this.pendingStarts.get(type) === work) { + this.pendingStarts.delete(type); + } + } + } + + /** + * Core logic for getOrRestart, separated to allow serialization. + */ + private async doGetOrRestart( + type: CodeQLServerType, + config: ServerConfig, + factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer, ): Promise { const hash = computeConfigHash(type, config); const existing = this.servers.get(type); diff --git a/server/src/tools/lsp/lsp-handlers.ts b/server/src/tools/lsp/lsp-handlers.ts index db3adabf..ff5dc1f6 100644 --- a/server/src/tools/lsp/lsp-handlers.ts +++ b/server/src/tools/lsp/lsp-handlers.ts @@ -27,7 +27,11 @@ export interface LSPToolParams { character: number; /** Optional override for the file content (if not reading from disk). */ fileContent?: string; - /** Absolute path to the QL file. */ + /** + * Path to the QL file. May be absolute or relative. + * Relative paths are resolved against `getUserWorkspaceDir()` + * (respects the `CODEQL_MCP_WORKSPACE` environment variable). + */ filePath: string; /** 0-based line number in the document. */ line: number; diff --git a/server/test/src/lib/server-manager.test.ts b/server/test/src/lib/server-manager.test.ts index 4103a98c..1933ba13 100644 --- a/server/test/src/lib/server-manager.test.ts +++ b/server/test/src/lib/server-manager.test.ts @@ -165,6 +165,20 @@ describe('CodeQLServerManager', () => { expect(manager.isRunning('language')).toBe(true); expect(server1.shutdown).toHaveBeenCalled(); }); + + it('should serialize concurrent calls for the same server type', async () => { + const manager = new CodeQLServerManager({ sessionId: 'ls-concurrent' }); + const config = { searchPath: '/ql' }; + + // Fire two concurrent requests — both should resolve to the same server + const [server1, server2] = await Promise.all([ + manager.getLanguageServer(config), + manager.getLanguageServer(config), + ]); + + expect(server1).toBe(server2); + expect(manager.isRunning('language')).toBe(true); + }); }); describe('getQueryServer', () => { From a58953dfd52fb8ad963e454eef9192a5c42d14f6 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Mon, 9 Feb 2026 07:35:07 -0700 Subject: [PATCH 7/7] Address code-quality PR review feedback --- server/dist/codeql-development-mcp-server.js | 4 ++ .../dist/codeql-development-mcp-server.js.map | 4 +- server/src/lib/server-manager.ts | 5 ++ server/test/src/lib/server-manager.test.ts | 59 +++++++++++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/server/dist/codeql-development-mcp-server.js b/server/dist/codeql-development-mcp-server.js index d4f6da0a..25f6e73f 100755 --- a/server/dist/codeql-development-mcp-server.js +++ b/server/dist/codeql-development-mcp-server.js @@ -1313,6 +1313,10 @@ var init_server_manager = __esm({ try { return await work; } finally { + try { + await work; + } catch { + } if (this.pendingStarts.get(type2) === work) { this.pendingStarts.delete(type2); } diff --git a/server/dist/codeql-development-mcp-server.js.map b/server/dist/codeql-development-mcp-server.js.map index b65fa321..26d7e2bb 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/server-config.ts", "../src/utils/package-paths.ts", "../src/utils/temp-dir.ts", "../src/utils/process-ready.ts", "../src/lib/language-server.ts", "../src/lib/query-server.ts", "../src/lib/cli-server.ts", "../src/lib/server-manager.ts", "../src/lib/cli-executor.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/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/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/tools/lsp/lsp-diagnostics.ts", "../src/tools/lsp/lsp-server-helper.ts", "../src/tools/lsp/lsp-handlers.ts", "../src/tools/lsp/lsp-tools.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 * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n } else if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\n}\n\n// Pre-computed values for use throughout the server\nexport const packageRootDir = getPackageRootDir();\nexport const workspaceRootDir = getWorkspaceRootDir(packageRootDir);\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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 // Wrap resolve/reject to clear the timer when the promise settles.\n const timer = setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 60_000); // 60 second timeout (Windows CI cold JVM can exceed 30s)\n\n this.pendingResponses.set(id, {\n reject: (err: Error) => { clearTimeout(timer); reject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); resolve(val); },\n });\n this.sendMessage(message);\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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.removeListener('diagnostics', diagnosticsHandler);\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 90_000); // 90s \u2014 first call triggers JVM start + compilation; Windows CI is slow\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 if (this.server) {\n this.sendNotification('exit', {});\n }\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n\n try {\n this.sendRaw(message);\n } catch (error) {\n // Clean up immediately \u2014 sendRaw() failed so no response will arrive.\n this.pendingRequests.delete(id);\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n this.stdoutBuffer += data.toString();\n\n // Process all NUL-delimited responses in the buffer\n let nulIndex = this.stdoutBuffer.indexOf('\\0');\n while (nulIndex !== -1) {\n const result = this.stdoutBuffer.substring(0, nulIndex);\n this.stdoutBuffer = this.stdoutBuffer.substring(nulIndex + 1);\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n nulIndex = this.stdoutBuffer.indexOf('\\0');\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** In-flight `getOrRestart` promises, keyed by server type, to serialize concurrent calls. */\n private pendingStarts = new Map>();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Eagerly start the language server so the JVM is warm when the first\n * LSP tool call arrives. Uses the default configuration that\n * `lsp-handlers.ts` / `lsp-diagnostics.ts` would create on the first\n * `getLanguageServer()` call. The server is stored in the managed-servers\n * map and reused by subsequent tool invocations.\n *\n * This is fire-and-forget: errors are logged but do not prevent the MCP\n * server from starting.\n */\n async warmUpLanguageServer(): Promise {\n try {\n // Lazy-import to avoid circular dependency at module level\n const { packageRootDir } = await import('../utils/package-paths');\n const { resolve } = await import('path');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: resolve(packageRootDir, 'ql'),\n };\n logger.info('Warming up language server (background JVM start)...');\n await this.getLanguageServer(config);\n logger.info('Language server warm-up complete');\n } catch (error) {\n logger.warn('Language server warm-up failed (will retry on first tool call):', error);\n }\n }\n\n /**\n * Eagerly start the CLI server so the JVM is warm when the first\n * `executeCodeQLCommand()` call routes through it.\n *\n * The CLI server uses only session-scoped `commonCaches` and `logdir`,\n * both injected by `enrichConfig()`. Passing an empty config is\n * intentional \u2014 it matches what `executeCodeQLCommand()` will request.\n *\n * Fire-and-forget: errors are logged but do not block startup.\n */\n async warmUpCLIServer(): Promise {\n try {\n logger.info('Warming up CLI server (background JVM start)...');\n await this.getCLIServer({});\n logger.info('CLI server warm-up complete');\n } catch (error) {\n logger.warn('CLI server warm-up failed (will retry on first tool call):', error);\n }\n }\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n *\n * Concurrent calls for the same server type are serialized via\n * `pendingStarts` to avoid spawning duplicate server processes.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n // If another call is already starting a server of this type, wait for it\n // to settle (success or failure) and then re-check whether the result is\n // still usable.\n const inflight = this.pendingStarts.get(type);\n if (inflight) {\n try { await inflight; } catch { /* swallow \u2014 original caller handles the rejection */ }\n }\n\n const work = this.doGetOrRestart(type, config, factory);\n this.pendingStarts.set(type, work);\n try {\n return await work;\n } finally {\n if (this.pendingStarts.get(type) === work) {\n this.pendingStarts.delete(type);\n }\n }\n }\n\n /**\n * Core logic for getOrRestart, separated to allow serialization.\n */\n private async doGetOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\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 * CodeQL subcommands that MUST run as fresh processes.\n *\n * These cannot use the cli-server because they:\n * - Spawn extractors or other long-running child processes (database create, test extract)\n * - Produce multi-event NUL-delimited streams (test run)\n * - Are compound orchestration commands (database analyze)\n *\n * Everything else is routed through the persistent cli-server JVM for\n * sub-second execution instead of 2-5 s JVM cold-start per invocation.\n */\nconst FRESH_PROCESS_SUBCOMMANDS = new Set([\n 'database analyze',\n 'database create',\n 'test extract',\n 'test run',\n]);\n\n/**\n * Execute a CodeQL command.\n *\n * By default, commands are routed through the persistent `codeql execute\n * cli-server` process managed by {@link CodeQLServerManager}, eliminating\n * repeated JVM startup overhead (~2-5 s savings per call).\n *\n * Commands listed in {@link FRESH_PROCESS_SUBCOMMANDS} (e.g. `database create`,\n * `test run`) are always executed as fresh processes because they either spawn\n * child extractors, produce streaming output, or require a dedicated working\n * directory.\n *\n * If the cli-server is not available (e.g. during early startup before\n * `initServerManager()` is called), the function falls back transparently to\n * a fresh process.\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 // Determine whether this subcommand can use the persistent cli-server.\n // Commands that need a specific CWD also must use a fresh process because\n // the cli-server's CWD is fixed at startup.\n const canUseCLIServer = !FRESH_PROCESS_SUBCOMMANDS.has(subcommand) && !cwd;\n\n if (canUseCLIServer) {\n try {\n // Lazy-import to avoid circular dependency at module level.\n // Use getServerManager() (not initServerManager()) \u2014 if the manager\n // hasn't been initialized yet (e.g. during tests or early startup),\n // this creates one, but we only attempt to *use* the cli-server if\n // it is already running (warmed up at MCP server startup). We never\n // block on starting a new cli-server here \u2014 that would add JVM\n // startup latency to the first fresh-process-fallback call.\n const { getServerManager } = await import('./server-manager');\n const manager = getServerManager();\n\n if (manager.isRunning('cli')) {\n const cliServer = await manager.getCLIServer({});\n const sanitizedArgs = sanitizeCLIArguments(args);\n\n logger.info(`Executing CodeQL command via cli-server: ${subcommand}`, { args: sanitizedArgs });\n\n const stdout = await cliServer.runCommand(sanitizedArgs);\n\n return {\n stdout,\n stderr: '',\n success: true,\n exitCode: 0,\n };\n } else {\n logger.debug(`cli-server not yet running for \"${subcommand}\", using fresh process`);\n }\n } catch (error) {\n // If the cli-server call fails, check whether it's a command-level\n // error (the CLI returned non-zero) or a transport/startup error.\n // For transport errors we fall back to a fresh process; for command\n // errors we return the failure directly.\n const message = error instanceof Error ? error.message : String(error);\n\n // Transport-level errors that warrant a fallback:\n if (message.includes('CLI server is not running') ||\n message.includes('CLI server exited') ||\n message.includes('failed to start')) {\n logger.warn(`cli-server unavailable for \"${subcommand}\", falling back to fresh process: ${message}`);\n // Fall through to fresh-process execution below\n } else {\n // Command-level error \u2014 return it as a failed result\n logger.error(`cli-server command failed for \"${subcommand}\": ${message}`);\n return {\n stdout: '',\n stderr: message,\n success: false,\n error: message,\n exitCode: 1,\n };\n }\n }\n }\n\n // Fresh-process execution (for FRESH_PROCESS_SUBCOMMANDS, CWD-specific\n // calls, or as a fallback when the cli-server is unavailable).\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager and eagerly start the\n // language server and CLI server JVMs so they are warm when the first tool\n // calls arrive. This avoids 2-60 s cold-start penalties per JVM.\n const manager = initServerManager();\n Promise.all([\n manager.warmUpLanguageServer(),\n manager.warmUpCLIServer(),\n ]).catch(() => { /* individual errors logged inside each warm-up method */ });\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 * 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join } from 'path';\nimport { pathToFileURL } from 'url';\nimport { getInitializedLanguageServer } from './lsp-server-helper';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getInitializedLanguageServer({\n serverOptions,\n workspaceUri,\n });\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const { getServerManager } = await import('../../lib/server-manager');\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * Shared helper for obtaining a running, initialized CodeQL Language Server.\n *\n * Both `lsp-diagnostics.ts` and `lsp-handlers.ts` need to:\n * 1. Build a `LanguageServerConfig` with sensible defaults\n * 2. Obtain a server instance from the `CodeQLServerManager`\n * 3. Resolve a workspace URI (relative \u2192 absolute \u2192 `file://`)\n * 4. Initialize the server with the resolved workspace\n *\n * Centralizing this logic avoids duplication and ensures consistent\n * default behaviour across all LSP tools.\n */\n\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport { CodeQLLanguageServer, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\n\n/**\n * Options accepted by {@link getInitializedLanguageServer}.\n */\nexport interface InitializedServerOptions {\n /** Language-server-level options (loglevel, searchPath, etc.). */\n serverOptions?: LanguageServerOptions;\n /** Workspace URI \u2014 may be a `file://` URI, absolute path, or relative path. */\n workspaceUri?: string;\n}\n\n/**\n * Return a running, initialized `CodeQLLanguageServer`.\n *\n * - Resolves `searchPath` to the bundled `ql` directory when not provided.\n * - Converts relative / bare-directory `workspaceUri` paths to `file://` URIs\n * resolved against `getUserWorkspaceDir()` (respects `CODEQL_MCP_WORKSPACE`).\n * - Falls back to the bundled `ql` directory when no workspace is given.\n * - Delegates lifecycle management to the global `CodeQLServerManager`.\n */\nexport async function getInitializedLanguageServer(\n opts: InitializedServerOptions = {},\n): Promise {\n const { packageRootDir: pkgRoot, getUserWorkspaceDir } = await import('../../utils/package-paths');\n const options = opts.serverOptions ?? {};\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n // Normalize workspace URI: convert relative / bare directory paths to\n // file:// URIs against getUserWorkspaceDir() (respects CODEQL_MCP_WORKSPACE).\n let effectiveUri = opts.workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(getUserWorkspaceDir(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n\n await server.initialize(effectiveUri);\n logger.debug(`Language server initialized with workspace: ${effectiveUri}`);\n\n return server;\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { readFile } from 'fs/promises';\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getUserWorkspaceDir } from '../../utils/package-paths';\nimport { getInitializedLanguageServer } from './lsp-server-helper';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /**\n * Path to the QL file. May be absolute or relative.\n * Relative paths are resolved against `getUserWorkspaceDir()`\n * (respects the `CODEQL_MCP_WORKSPACE` environment variable).\n */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n return getInitializedLanguageServer({\n serverOptions: { searchPath: params.searchPath },\n workspaceUri: params.workspaceUri,\n });\n}\n\n/**\n * Resolve the file path to an absolute path and file:// URI.\n */\nfunction prepareDocumentPosition(\n params: LSPToolParams,\n): { absPath: string; docUri: string } {\n // Resolve relative paths against getUserWorkspaceDir() so that\n // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools.\n const absPath = isAbsolute(params.filePath)\n ? params.filePath\n : resolve(getUserWorkspaceDir(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n return { absPath, docUri };\n}\n\n/**\n * Read file content and open the document in the language server.\n */\nasync function openDocumentForPosition(\n server: Awaited>,\n params: LSPToolParams,\n absPath: string,\n docUri: string,\n): Promise {\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = await readFile(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n return {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Path to the CodeQL (.ql/.qll) file. Relative paths are resolved against the user workspace directory (see CODEQL_MCP_WORKSPACE).'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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": ";;;;;;;;;;;;AAAA,IAOa;AAPb;AAAA;AAAA;AAOO,IAAM,SAAS;AAAA,MACpB,MAAM,CAAC,YAAoB,SAAoB;AAC7C,gBAAQ,MAAM,WAAU,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,OAAO,IAAI,GAAG,IAAI;AAAA,MACxE;AAAA,MACA,OAAO,CAAC,YAAoB,SAAoB;AAC9C,gBAAQ,MAAM,YAAW,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,OAAO,IAAI,GAAG,IAAI;AAAA,MACzE;AAAA,MACA,MAAM,CAAC,YAAoB,SAAoB;AAC7C,gBAAQ,MAAM,WAAU,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,OAAO,IAAI,GAAG,IAAI;AAAA,MACxE;AAAA,MACA,OAAO,CAAC,YAAoB,SAAoB;AAC9C,YAAI,QAAQ,IAAI,OAAO;AACrB,kBAAQ,MAAM,YAAW,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,OAAO,IAAI,GAAG,IAAI;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACVA,SAAS,kBAAkB;AAuEpB,SAAS,kBAAkBA,OAAwB,QAA8B;AAGtF,QAAM,WAAW,CAAC,MAAc,UAA4B;AAC1D,QAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,YAAM,SAAkC,CAAC;AACzC,iBAAW,KAAK,OAAO,KAAK,KAAgC,EAAE,KAAK,GAAG;AACpE,eAAO,CAAC,IAAK,MAAkC,CAAC;AAAA,MAClD;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,QAAM,YAAY,KAAK,UAAU,EAAE,QAAQ,MAAAA,MAAK,GAAG,QAAQ;AAC3D,SAAO,WAAW,QAAQ,EAAE,OAAO,SAAS,EAAE,OAAO,KAAK;AAC5D;AAoCO,SAAS,qBAAqB,QAAqC;AACxE,QAAM,OAAiB;AAAA,IACrB;AAAA,IAAW;AAAA,EACb;AAEA,MAAI,OAAO,YAAY;AACrB,SAAK,KAAK,iBAAiB,OAAO,UAAU,EAAE;AAAA,EAChD;AACA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE;AAAA,EACpD;AACA,MAAI,OAAO,QAAQ;AACjB,SAAK,KAAK,YAAY,OAAO,MAAM,EAAE;AAAA,EACvC;AACA,MAAI,OAAO,YAAY,QAAW;AAChC,SAAK,KAAK,aAAa,OAAO,OAAO,EAAE;AAAA,EACzC;AACA,MAAI,OAAO,YAAY,QAAW;AAChC,SAAK,KAAK,aAAa,OAAO,OAAO,EAAE;AAAA,EACzC;AACA,MAAI,OAAO,iBAAiB,QAAW;AACrC,SAAK,KAAK,oBAAoB,OAAO,YAAY,EAAE;AAAA,EACrD;AACA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE;AAAA,EACpD;AACA,MAAI,OAAO,OAAO;AAChB,SAAK,KAAK,SAAS;AACnB,SAAK,KAAK,kBAAkB;AAAA,EAC9B,WAAW,OAAO,eAAe;AAC/B,SAAK,KAAK,kBAAkB;AAAA,EAC9B;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,QAAmC;AACpE,QAAM,OAAiB;AAAA,IACrB;AAAA,IAAW;AAAA,EACb;AAEA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,mBAAmB,OAAO,YAAY,EAAE;AAAA,EACpD;AACA,MAAI,OAAO,QAAQ;AACjB,SAAK,KAAK,YAAY,OAAO,MAAM,EAAE;AAAA,EACvC;AAEA,SAAO;AACT;AA1LA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,SAAS,SAAS,eAAe;AACjC,SAAS,YAAY,oBAAoB;AACzC,SAAS,qBAAqB;AAa9B,SAAS,oBAAoB,KAAsB;AACjD,QAAM,aAAa,IAAI,QAAQ,OAAO,GAAG;AACzC,SAAO,mBAAmB,KAAK,UAAU;AAC3C;AAQO,SAAS,kBAAkB,aAAqB,WAAmB;AACxE,SAAO,oBAAoB,UAAU,IACjC,QAAQ,YAAY,MAAM,IAAI,IAC9B,QAAQ,YAAY,IAAI;AAC9B;AASO,SAAS,oBAAoB,aAA8B;AAChE,QAAM,UAAU,eAAe,kBAAkB;AACjD,QAAM,YAAY,QAAQ,SAAS,IAAI;AAGvC,MAAI;AACF,UAAM,gBAAgB,QAAQ,WAAW,cAAc;AACvD,QAAI,WAAW,aAAa,GAAG;AAC7B,YAAM,YAAY,KAAK,MAAM,aAAa,eAAe,MAAM,CAAC;AAChE,UAAI,UAAU,YAAY;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AASO,SAAS,yBAAyB,UAAkB,aAA8B;AACvF,QAAM,UAAU,eAAe,kBAAkB;AACjD,SAAO,QAAQ,SAAS,MAAM,UAAU,SAAS,KAAK;AACxD;AAQO,SAAS,oBAA4B;AAC1C,MAAI,mBAAmB,OAAW,QAAO;AACzC,MAAI;AACF,UAAM,UAAU,QAAQ,kBAAkB,GAAG,cAAc;AAC3D,UAAM,MAAM,KAAK,MAAM,aAAa,SAAS,MAAM,CAAC;AACpD,qBAAiB,IAAI,WAAW;AAAA,EAClC,QAAQ;AACN,qBAAiB;AAAA,EACnB;AACA,SAAO;AACT;AAcO,SAAS,sBAA8B;AAC5C,MAAI,QAAQ,IAAI,sBAAsB;AACpC,WAAO,QAAQ,IAAI;AAAA,EACrB;AAGA,MAAI,qBAAqB,gBAAgB;AACvC,WAAO,QAAQ,IAAI;AAAA,EACrB;AACA,SAAO;AACT;AAhIA,IAqBM,YACA,WAuEF,gBAsCS,gBACA;AApIb;AAAA;AAAA;AAqBA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AA6G7B,IAAM,iBAAiB,kBAAkB;AACzC,IAAM,mBAAmB,oBAAoB,cAAc;AAAA;AAAA;;;AC3HlE,SAAS,WAAW,mBAAmB;AACvC,SAAS,YAAY,MAAM,WAAAC,gBAAe;AAqBnC,SAAS,oBAA4B;AAC1C,YAAU,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAC/C,SAAO;AACT;AAWO,SAAS,qBAAqB,QAAwB;AAC3D,QAAM,OAAO,kBAAkB;AAC/B,SAAO,YAAY,KAAK,MAAM,MAAM,CAAC;AACvC;AAWO,SAAS,iBAAiB,MAAsB;AACrD,QAAM,MAAM,KAAK,kBAAkB,GAAG,IAAI;AAC1C,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,SAAO;AACT;AA/DA,IAsBM;AAtBN;AAAA;AAAA;AAWA;AAWA,IAAM,mBAAmB,QAAQ,IAAI,qBAChC,WAAW,QAAQ,IAAI,kBAAkB,IACtC,QAAQ,IAAI,qBACZA,SAAQ,QAAQ,IAAI,GAAG,QAAQ,IAAI,kBAAkB,IACzD,KAAK,kBAAkB,GAAG,MAAM;AAAA;AAAA;;;ACbpC,SAAS,cAAc,cAAAC,mBAAkB;AAmClC,SAAS,oBACd,OACA,MACA,MACe;AACf,QAAM,YAAY,MAAM,aAAa;AAErC,SAAO,IAAI,QAAc,CAACC,WAAS,WAAW;AAC5C,QAAI,UAAU;AAEd,UAAM,UAAU,MAAM;AACpB,gBAAU;AACV,YAAM,QAAQ,eAAe,QAAQ,QAAQ;AAC7C,YAAM,QAAQ,eAAe,QAAQ,QAAQ;AAC7C,YAAM,eAAe,SAAS,OAAO;AACrC,YAAM,eAAe,QAAQ,MAAM;AACnC,mBAAa,KAAK;AAAA,IACpB;AAEA,UAAM,WAAW,MAAM;AACrB,UAAI,QAAS;AACb,aAAO,MAAM,GAAG,IAAI,kCAAkC;AACtD,cAAQ;AACR,MAAAA,UAAQ;AAAA,IACV;AAEA,UAAM,WAAW,MAAM;AACrB,UAAI,QAAS;AACb,aAAO,MAAM,GAAG,IAAI,kCAAkC;AACtD,cAAQ;AACR,MAAAA,UAAQ;AAAA,IACV;AAEA,UAAM,UAAU,CAAC,UAAiB;AAChC,UAAI,QAAS;AACb,cAAQ;AACR,aAAO,IAAI,MAAM,GAAG,IAAI,qBAAqB,MAAM,OAAO,EAAE,CAAC;AAAA,IAC/D;AAEA,UAAM,SAAS,CAAC,SAAwB;AACtC,UAAI,QAAS;AACb,cAAQ;AACR,aAAO,IAAI,MAAM,GAAG,IAAI,wCAAwC,IAAI,GAAG,CAAC;AAAA,IAC1E;AAEA,UAAM,QAAQD,YAAW,MAAM;AAC7B,UAAI,QAAS;AACb,aAAO,KAAK,GAAG,IAAI,wBAAwB,SAAS,+BAA0B;AAC9E,cAAQ;AACR,MAAAC,UAAQ;AAAA,IACV,GAAG,SAAS;AAEZ,UAAM,QAAQ,GAAG,QAAQ,QAAQ;AACjC,UAAM,QAAQ,GAAG,QAAQ,QAAQ;AACjC,UAAM,GAAG,SAAS,OAAO;AACzB,UAAM,GAAG,QAAQ,MAAM;AAGvB,QAAI,MAAM,UAAU,MAAM,aAAa,MAAM;AAC3C,cAAQ;AACR,aAAO,IAAI,MAAM,GAAG,IAAI,8BAA8B,MAAM,QAAQ,GAAG,CAAC;AAAA,IAC1E;AAAA,EACF,CAAC;AACH;AA/GA,IAiBM;AAjBN;AAAA;AAAA;AAcA;AAGA,IAAM,2BAA2B;AAAA;AAAA;;;ACZjC,SAAS,aAA2B;AACpC,SAAS,oBAAoB;AAC7B,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,qBAAqB;AAC9B,SAAS,WAAW,QAAAC,aAAY;AAThC,IAwGa;AAxGb;AAAA;AAAA;AAUA;AACA;AACA;AACA;AACA;AA0FO,IAAM,uBAAN,cAAmC,aAAa;AAAA,MAQrD,YAAoB,WAAkC,CAAC,GAAG;AACxD,cAAM;AADY;AAAA,MAEpB;AAAA,MATQ,SAA8B;AAAA,MAC9B,YAAY;AAAA,MACZ,mBAAmB,oBAAI,IAAqF;AAAA,MAC5G,gBAAgB;AAAA,MAChB;AAAA,MACA,gBAAgB;AAAA,MAMxB,MAAM,QAAuB;AAC3B,YAAI,KAAK,QAAQ;AACf,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AAEA,eAAO,KAAK,oCAAoC;AAEhD,cAAM,OAAO;AAAA,UACX;AAAA,UAAW;AAAA,UACX;AAAA,QACF;AAGA,YAAI,KAAK,SAAS,YAAY;AAC5B,eAAK,KAAK,iBAAiB,KAAK,SAAS,UAAU,EAAE;AAAA,QACvD;AACA,YAAI,KAAK,SAAS,QAAQ;AACxB,eAAK,KAAK,YAAY,KAAK,SAAS,MAAM,EAAE;AAAA,QAC9C;AACA,YAAI,KAAK,SAAS,UAAU;AAC1B,eAAK,KAAK,cAAc,KAAK,SAAS,QAAQ,EAAE;AAAA,QAClD;AACA,YAAI,KAAK,SAAS,aAAa;AAC7B,eAAK,KAAK,eAAe;AAAA,QAC3B;AACA,YAAI,KAAK,SAAS,WAAW;AAC3B,eAAK,KAAK,eAAe,KAAK,SAAS,SAAS,EAAE;AAAA,QACpD;AAIA,cAAM,WAAW,EAAE,GAAG,QAAQ,IAAI;AAClC,cAAM,YAAY,qBAAqB;AACvC,YAAI,aAAa,SAAS,MAAM;AAC9B,mBAAS,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,IAAI;AAAA,QAC1D,WAAW,WAAW;AACpB,mBAAS,OAAO;AAAA,QAClB;AAEA,aAAK,SAAS,MAAM,UAAU,MAAM;AAAA,UAClC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,UAC9B,KAAK;AAAA,QACP,CAAC;AAED,aAAK,OAAO,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACvC,iBAAO,MAAM,qBAAqB,KAAK,SAAS,CAAC;AAAA,QACnD,CAAC;AAED,aAAK,OAAO,QAAQ,GAAG,QAAQ,CAAC,SAAS;AACvC,eAAK,aAAa,IAAI;AAAA,QACxB,CAAC;AAED,aAAK,OAAO,GAAG,SAAS,CAAC,UAAU;AACjC,iBAAO,MAAM,iCAAiC,KAAK;AACnD,eAAK,KAAK,SAAS,KAAK;AAAA,QAC1B,CAAC;AAED,aAAK,OAAO,GAAG,QAAQ,CAAC,SAAS;AAC/B,iBAAO,KAAK,4CAA4C,IAAI;AAC5D,eAAK,SAAS;AACd,eAAK,gBAAgB;AACrB,eAAK,KAAK,QAAQ,IAAI;AAAA,QACxB,CAAC;AAGD,cAAM,oBAAoB,KAAK,QAAQ,wBAAwB;AAAA,MACjE;AAAA,MAEQ,aAAa,MAAoB;AACvC,aAAK,iBAAiB,KAAK,SAAS;AAEpC,YAAI,YAAY,KAAK,cAAc,QAAQ,UAAU;AACrD,eAAO,cAAc,IAAI;AACvB,gBAAM,SAAS,KAAK,cAAc,UAAU,GAAG,SAAS;AACxD,gBAAM,qBAAqB,OAAO,MAAM,uBAAuB;AAE/D,cAAI,oBAAoB;AACtB,kBAAM,gBAAgB,SAAS,mBAAmB,CAAC,CAAC;AACpD,kBAAM,eAAe,YAAY;AACjC,kBAAM,aAAa,eAAe;AAElC,gBAAI,KAAK,cAAc,UAAU,YAAY;AAC3C,oBAAM,iBAAiB,KAAK,cAAc,UAAU,cAAc,UAAU;AAC5E,mBAAK,gBAAgB,KAAK,cAAc,UAAU,UAAU;AAE5D,kBAAI;AACF,sBAAM,UAAsB,KAAK,MAAM,cAAc;AACrD,qBAAK,cAAc,OAAO;AAAA,cAC5B,SAAS,OAAO;AACd,uBAAO,MAAM,gCAAgC,OAAO,cAAc;AAAA,cACpE;AAEA,0BAAY,KAAK,cAAc,QAAQ,UAAU;AAAA,YACnD,OAAO;AACL;AAAA,YACF;AAAA,UACF,OAAO;AACL,mBAAO,MAAM,uBAAuB,MAAM;AAC1C,iBAAK,gBAAgB;AACrB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,cAAc,SAA2B;AAC/C,eAAO,MAAM,yBAAyB,OAAO;AAG7C,YAAI,QAAQ,OAAO,UAAa,KAAK,iBAAiB,IAAI,OAAO,QAAQ,EAAE,CAAC,GAAG;AAC7E,gBAAM,UAAU,KAAK,iBAAiB,IAAI,OAAO,QAAQ,EAAE,CAAC;AAC5D,eAAK,iBAAiB,OAAO,OAAO,QAAQ,EAAE,CAAC;AAE/C,cAAI,QAAQ,OAAO;AACjB,oBAAQ,OAAO,IAAI,MAAM,cAAc,QAAQ,MAAM,OAAO,EAAE,CAAC;AAAA,UACjE,OAAO;AACL,oBAAQ,QAAQ,QAAQ,MAAM;AAAA,UAChC;AACA;AAAA,QACF;AAGA,YAAI,QAAQ,WAAW,mCAAmC;AACxD,eAAK,KAAK,eAAe,QAAQ,MAAkC;AAAA,QACrE;AAAA,MACF;AAAA,MAEQ,YAAY,SAA2B;AAC7C,YAAI,CAAC,KAAK,QAAQ,OAAO;AACvB,gBAAM,IAAI,MAAM,gCAAgC;AAAA,QAClD;AAEA,cAAM,aAAa,KAAK,UAAU,OAAO;AACzC,cAAM,gBAAgB,OAAO,WAAW,YAAY,MAAM;AAC1D,cAAM,SAAS,mBAAmB,aAAa;AAAA;AAAA;AAC/C,cAAM,cAAc,SAAS;AAE7B,eAAO,MAAM,wBAAwB,WAAW;AAChD,aAAK,OAAO,MAAM,MAAM,WAAW;AAAA,MACrC;AAAA,MAEQ,YAAY,QAAgB,QAAoC;AACtE,cAAM,KAAK,KAAK;AAChB,cAAM,UAAsB;AAAA,UAC1B,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,eAAO,IAAI,QAAQ,CAACC,WAAS,WAAW;AAEtC,gBAAM,QAAQH,YAAW,MAAM;AAC7B,gBAAI,KAAK,iBAAiB,IAAI,EAAE,GAAG;AACjC,mBAAK,iBAAiB,OAAO,EAAE;AAC/B,qBAAO,IAAI,MAAM,mCAAmC,MAAM,EAAE,CAAC;AAAA,YAC/D;AAAA,UACF,GAAG,GAAM;AAET,eAAK,iBAAiB,IAAI,IAAI;AAAA,YAC5B,QAAQ,CAAC,QAAe;AAAE,cAAAC,cAAa,KAAK;AAAG,qBAAO,GAAG;AAAA,YAAG;AAAA,YAC5D,SAAS,CAAC,QAAiB;AAAE,cAAAA,cAAa,KAAK;AAAG,cAAAE,UAAQ,GAAG;AAAA,YAAG;AAAA,UAClE,CAAC;AACD,eAAK,YAAY,OAAO;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MAEQ,iBAAiB,QAAgB,QAAwB;AAC/D,cAAM,UAAsB;AAAA,UAC1B,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AACA,aAAK,YAAY,OAAO;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAM,WAAW,cAAsC;AACrD,YAAI,KAAK,eAAe;AAEtB,cAAI,gBAAgB,iBAAiB,KAAK,qBAAqB;AAC7D,kBAAM,KAAK,gBAAgB,YAAY;AAAA,UACzC;AACA;AAAA,QACF;AAEA,eAAO,KAAK,wCAAwC;AAEpD,cAAM,aAAa;AAAA,UACjB,WAAW,QAAQ;AAAA,UACnB,YAAY;AAAA,YACV,MAAM;AAAA,YACN,SAAS,kBAAkB;AAAA,UAC7B;AAAA,UACA,cAAc;AAAA,YACZ,cAAc;AAAA,cACZ,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,MAAM,EAAE;AAAA,cACxD,YAAY,CAAC;AAAA,cACb,oBAAoB,CAAC;AAAA,cACrB,YAAY,CAAC;AAAA,cACb,iBAAiB;AAAA,gBACf,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,SAAS;AAAA,cACX;AAAA,YACF;AAAA,YACA,WAAW;AAAA,cACT,kBAAkB;AAAA,YACpB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,cAAc;AAChB,UAAC,WAA0D,mBAAmB,CAAC;AAAA,YAC7E,KAAK;AAAA,YACL,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAEA,cAAM,KAAK,YAAY,cAAc,UAAU;AAC/C,aAAK,iBAAiB,eAAe,CAAC,CAAC;AAEvC,aAAK,sBAAsB;AAC3B,aAAK,gBAAgB;AACrB,eAAO,KAAK,iDAAiD;AAAA,MAC/D;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,gBAAgB,QAA+B;AAC3D,eAAO,KAAK,2BAA2B,KAAK,mBAAmB,OAAO,MAAM,EAAE;AAE9E,cAAM,UAAU,KAAK,sBACjB,CAAC,EAAE,KAAK,KAAK,qBAAqB,MAAM,mBAAmB,CAAC,IAC5D,CAAC;AAEL,aAAK,iBAAiB,uCAAuC;AAAA,UAC3D,OAAO;AAAA,YACL,OAAO,CAAC,EAAE,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAAA,YACjD;AAAA,UACF;AAAA,QACF,CAAC;AAED,aAAK,sBAAsB;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAsC;AACpC,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,MAAM,WAAW,QAAgB,KAAqC;AACpE,YAAI,CAAC,KAAK,eAAe;AACvB,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AAGA,cAAM,cAAc,OAAO,cAAcD,MAAK,iBAAiB,UAAU,GAAG,SAAS,CAAC,EAAE;AAExF,eAAO,IAAI,QAAQ,CAACC,WAAS,WAAW;AACtC,cAAI,sBAAsB;AAC1B,gBAAM,UAAUH,YAAW,MAAM;AAC/B,gBAAI,CAAC,qBAAqB;AACxB,mBAAK,eAAe,eAAe,kBAAkB;AACrD,qBAAO,IAAI,MAAM,iCAAiC,CAAC;AAAA,YACrD;AAAA,UACF,GAAG,GAAM;AAGT,gBAAM,qBAAqB,CAAC,WAAqC;AAC/D,gBAAI,OAAO,QAAQ,aAAa;AAC9B,oCAAsB;AACtB,cAAAC,cAAa,OAAO;AACpB,mBAAK,eAAe,eAAe,kBAAkB;AAGrD,mBAAK,iBAAiB,yBAAyB;AAAA,gBAC7C,cAAc,EAAE,KAAK,YAAY;AAAA,cACnC,CAAC;AAED,cAAAE,UAAQ,OAAO,WAAW;AAAA,YAC5B;AAAA,UACF;AAEA,eAAK,GAAG,eAAe,kBAAkB;AAGzC,eAAK,iBAAiB,wBAAwB;AAAA,YAC5C,cAAc;AAAA,cACZ,KAAK;AAAA,cACL,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,MAAM;AAAA,YACR;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,eAAe,QAA+D;AAClF,YAAI,CAAC,KAAK,eAAe;AACvB,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AACA,YAAI,CAAC,KAAK,UAAU,GAAG;AACrB,gBAAM,IAAI,MAAM,wCAAwC;AAAA,QAC1D;AACA,cAAM,SAAS,MAAM,KAAK,YAAY,2BAA2B,MAAM;AAEvE,YAAI,UAAU,OAAO,WAAW,YAAY,WAAY,QAAmB;AACzE,iBAAQ,OAAuC;AAAA,QACjD;AACA,eAAQ,UAA+B,CAAC;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,cAAc,QAA4D;AAC9E,YAAI,CAAC,KAAK,eAAe;AACvB,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AACA,YAAI,CAAC,KAAK,UAAU,GAAG;AACrB,gBAAM,IAAI,MAAM,wCAAwC;AAAA,QAC1D;AACA,cAAM,SAAS,MAAM,KAAK,YAAY,2BAA2B,MAAM;AACvE,eAAO,KAAK,mBAAmB,MAAM;AAAA,MACvC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,cAAc,QAA4G;AAC9H,YAAI,CAAC,KAAK,eAAe;AACvB,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AACA,YAAI,CAAC,KAAK,UAAU,GAAG;AACrB,gBAAM,IAAI,MAAM,wCAAwC;AAAA,QAC1D;AACA,cAAM,SAAS,MAAM,KAAK,YAAY,2BAA2B;AAAA,UAC/D,GAAG;AAAA,UACH,SAAS,OAAO,WAAW,EAAE,oBAAoB,KAAK;AAAA,QACxD,CAAC;AACD,eAAO,KAAK,mBAAmB,MAAM;AAAA,MACvC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAa,KAAa,MAAc,aAAa,MAAM,UAAU,GAAS;AAC5E,YAAI,CAAC,KAAK,eAAe;AACvB,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AACA,aAAK,iBAAiB,wBAAwB;AAAA,UAC5C,cAAc,EAAE,KAAK,YAAY,SAAS,KAAK;AAAA,QACjD,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,KAAmB;AAC/B,YAAI,CAAC,KAAK,eAAe;AACvB,gBAAM,IAAI,MAAM,oCAAoC;AAAA,QACtD;AACA,aAAK,iBAAiB,yBAAyB;AAAA,UAC7C,cAAc,EAAE,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,mBAAmB,QAAgC;AACzD,YAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,YAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,iBAAO,OAAO,IAAI,CAAC,SAAS;AAE1B,gBAAI,eAAe,MAAM;AACvB,qBAAO,EAAE,KAAK,KAAK,WAAW,OAAO,KAAK,YAAY;AAAA,YACxD;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAEA,YAAI,OAAO,WAAW,YAAY,SAAU,QAAmB;AAC7D,iBAAO,CAAC,MAAqB;AAAA,QAC/B;AACA,eAAO,CAAC;AAAA,MACV;AAAA,MAEA,MAAM,WAA0B;AAC9B,YAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,QACF;AAEA,eAAO,KAAK,yCAAyC;AAErD,YAAI;AACF,gBAAM,KAAK,YAAY,YAAY,CAAC,CAAC;AACrC,cAAI,KAAK,QAAQ;AACf,iBAAK,iBAAiB,QAAQ,CAAC,CAAC;AAAA,UAClC;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,KAAK,mCAAmC,KAAK;AAAA,QACtD;AAGA,cAAM,IAAI,QAAc,CAACA,cAAY;AACnC,gBAAM,QAAQH,YAAW,MAAM;AAC7B,gBAAI,KAAK,QAAQ;AACf,mBAAK,OAAO,KAAK,SAAS;AAAA,YAC5B;AACA,YAAAG,UAAQ;AAAA,UACV,GAAG,GAAI;AAEP,cAAI,KAAK,QAAQ;AACf,iBAAK,OAAO,KAAK,QAAQ,MAAM;AAC7B,cAAAF,cAAa,KAAK;AAClB,mBAAK,SAAS;AACd,cAAAE,UAAQ;AAAA,YACV,CAAC;AAAA,UACH,OAAO;AACL,YAAAF,cAAa,KAAK;AAClB,YAAAE,UAAQ;AAAA,UACV;AAAA,QACF,CAAC;AAED,aAAK,gBAAgB;AAAA,MACvB;AAAA,MAEA,YAAqB;AACnB,eAAO,KAAK,WAAW,QAAQ,CAAC,KAAK,OAAO;AAAA,MAC9C;AAAA,IACF;AAAA;AAAA;;;ACxiBA,SAAuB,SAAAC,cAAa;AACpC,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AAdzC,IAkCa;AAlCb;AAAA;AAAA;AAeA;AACA;AACA;AACA;AAgBO,IAAM,oBAAN,cAAgCF,cAAa;AAAA,MAC1C,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,kBAAkB,oBAAI,IAA4B;AAAA,MAClD,UAA+B;AAAA,MACtB;AAAA,MAEjB,YAAY,QAA2B;AACrC,cAAM;AACN,aAAK,SAAS;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAuB;AAC3B,YAAI,KAAK,SAAS;AAChB,gBAAM,IAAI,MAAM,iCAAiC;AAAA,QACnD;AAEA,eAAO,KAAK,iDAAiD;AAE7D,cAAM,OAAO,qBAAqB,KAAK,MAAM;AAG7C,cAAM,WAAW,EAAE,GAAG,QAAQ,IAAI;AAClC,cAAM,YAAY,qBAAqB;AACvC,YAAI,aAAa,SAAS,MAAM;AAC9B,mBAAS,OAAO,GAAG,SAAS,GAAGD,UAAS,GAAG,SAAS,IAAI;AAAA,QAC1D,WAAW,WAAW;AACpB,mBAAS,OAAO;AAAA,QAClB;AAEA,aAAK,UAAUD,OAAM,UAAU,MAAM;AAAA,UACnC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,UAC9B,KAAK;AAAA,QACP,CAAC;AAED,aAAK,QAAQ,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAChD,iBAAO,MAAM,wBAAwB,KAAK,SAAS,CAAC;AAAA,QACtD,CAAC;AAED,aAAK,QAAQ,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAChD,eAAK,aAAa,IAAI;AAAA,QACxB,CAAC;AAED,aAAK,QAAQ,GAAG,SAAS,CAAC,UAAiB;AACzC,iBAAO,MAAM,+BAA+B,KAAK;AACjD,eAAK,KAAK,SAAS,KAAK;AAAA,QAC1B,CAAC;AAED,aAAK,QAAQ,GAAG,QAAQ,CAAC,SAAwB;AAC/C,iBAAO,KAAK,kCAAkC,IAAI,EAAE;AACpD,eAAK,iBAAiB,IAAI,MAAM,kCAAkC,IAAI,EAAE,CAAC;AACzE,eAAK,UAAU;AACf,eAAK,KAAK,QAAQ,IAAI;AAAA,QACxB,CAAC;AAGD,cAAM,oBAAoB,KAAK,SAAS,qBAAqB;AAC7D,eAAO,KAAK,6BAA6B;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,YAAY,QAAgB,QAAkB,YAAY,KAA2B;AACnF,cAAM,KAAK,KAAK;AAChB,cAAM,UAAU;AAAA,UACd;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAEA,eAAO,IAAI,QAAQ,CAACK,WAAS,WAAW;AACtC,eAAK,gBAAgB,IAAI,IAAI,EAAE,QAAQ,SAAAA,UAAQ,CAAC;AAEhD,cAAI;AACF,iBAAK,QAAQ,OAAO;AAAA,UACtB,SAAS,OAAO;AAEd,iBAAK,gBAAgB,OAAO,EAAE;AAC9B,mBAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAChE;AAAA,UACF;AAEA,gBAAM,QAAQD,YAAW,MAAM;AAC7B,gBAAI,KAAK,gBAAgB,IAAI,EAAE,GAAG;AAChC,mBAAK,gBAAgB,OAAO,EAAE;AAC9B,qBAAO,IAAI,MAAM,4CAA4C,MAAM,EAAE,CAAC;AAAA,YACxE;AAAA,UACF,GAAG,SAAS;AAGZ,gBAAM,kBAAkBC;AACxB,gBAAM,iBAAiB;AACvB,gBAAM,UAAU;AAAA,YACd,QAAQ,CAAC,QAAe;AAAE,cAAAF,cAAa,KAAK;AAAG,6BAAe,GAAG;AAAA,YAAG;AAAA,YACpE,SAAS,CAAC,QAAiB;AAAE,cAAAA,cAAa,KAAK;AAAG,8BAAgB,GAAG;AAAA,YAAG;AAAA,UAC1E;AACA,eAAK,gBAAgB,IAAI,IAAI,OAAO;AAAA,QACtC,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,WAA0B;AAC9B,YAAI,CAAC,KAAK,SAAS;AACjB;AAAA,QACF;AAEA,eAAO,KAAK,sCAAsC;AAElD,YAAI;AACF,gBAAM,KAAK,YAAY,YAAY,CAAC,GAAG,GAAI;AAAA,QAC7C,SAAS,OAAO;AACd,iBAAO,KAAK,gDAAgD,KAAK;AAAA,QACnE;AAGA,cAAM,IAAI,QAAc,CAACE,cAAY;AACnC,gBAAM,QAAQD,YAAW,MAAM;AAC7B,gBAAI,KAAK,SAAS;AAChB,mBAAK,QAAQ,KAAK,SAAS;AAC3B,mBAAK,UAAU;AAAA,YACjB;AACA,YAAAC,UAAQ;AAAA,UACV,GAAG,GAAI;AAEP,cAAI,KAAK,SAAS;AAChB,iBAAK,QAAQ,KAAK,QAAQ,MAAM;AAC9B,cAAAF,cAAa,KAAK;AAClB,mBAAK,UAAU;AACf,cAAAE,UAAQ;AAAA,YACV,CAAC;AAAA,UACH,OAAO;AACL,YAAAF,cAAa,KAAK;AAClB,YAAAE,UAAQ;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,YAAqB;AACnB,eAAO,KAAK,YAAY,QAAQ,CAAC,KAAK,QAAQ;AAAA,MAChD;AAAA;AAAA,MAIQ,aAAa,MAAoB;AACvC,aAAK,iBAAiB,KAAK,SAAS;AAEpC,YAAI,YAAY,KAAK,cAAc,QAAQ,UAAU;AACrD,eAAO,cAAc,IAAI;AACvB,gBAAM,SAAS,KAAK,cAAc,UAAU,GAAG,SAAS;AACxD,gBAAM,qBAAqB,OAAO,MAAM,uBAAuB;AAE/D,cAAI,oBAAoB;AACtB,kBAAM,gBAAgB,SAAS,mBAAmB,CAAC,CAAC;AACpD,kBAAM,eAAe,YAAY;AACjC,kBAAM,aAAa,eAAe;AAElC,gBAAI,KAAK,cAAc,UAAU,YAAY;AAC3C,oBAAM,iBAAiB,KAAK,cAAc,UAAU,cAAc,UAAU;AAC5E,mBAAK,gBAAgB,KAAK,cAAc,UAAU,UAAU;AAE5D,kBAAI;AACF,sBAAM,UAAU,KAAK,MAAM,cAAc;AACzC,qBAAK,cAAc,OAAO;AAAA,cAC5B,SAAS,OAAO;AACd,uBAAO,MAAM,yCAAyC,KAAK;AAAA,cAC7D;AAEA,0BAAY,KAAK,cAAc,QAAQ,UAAU;AAAA,YACnD,OAAO;AACL;AAAA,YACF;AAAA,UACF,OAAO;AACL,mBAAO,MAAM,gCAAgC,MAAM;AACnD,iBAAK,gBAAgB;AACrB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,cAAc,SAAkH;AACtI,eAAO,MAAM,yBAAyB,OAAO;AAG7C,YAAI,QAAQ,OAAO,UAAa,KAAK,gBAAgB,IAAI,OAAO,QAAQ,EAAE,CAAC,GAAG;AAC5E,gBAAM,UAAU,KAAK,gBAAgB,IAAI,OAAO,QAAQ,EAAE,CAAC;AAC3D,eAAK,gBAAgB,OAAO,OAAO,QAAQ,EAAE,CAAC;AAE9C,cAAI,QAAQ,OAAO;AACjB,oBAAQ,OAAO,IAAI,MAAM,uBAAuB,QAAQ,MAAM,OAAO,EAAE,CAAC;AAAA,UAC1E,OAAO;AACL,oBAAQ,QAAQ,QAAQ,MAAM;AAAA,UAChC;AACA;AAAA,QACF;AAGA,YAAI,QAAQ,QAAQ;AAClB,eAAK,KAAK,gBAAgB,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,CAAC;AAAA,QAC9E;AAAA,MACF;AAAA,MAEQ,iBAAiB,OAAoB;AAC3C,mBAAW,CAAC,IAAI,OAAO,KAAK,KAAK,iBAAiB;AAChD,kBAAQ,OAAO,KAAK;AACpB,eAAK,gBAAgB,OAAO,EAAE;AAAA,QAChC;AAAA,MACF;AAAA,MAEQ,QAAQ,SAAuB;AACrC,YAAI,CAAC,KAAK,SAAS,OAAO;AACxB,gBAAM,IAAI,MAAM,6BAA6B;AAAA,QAC/C;AAEA,cAAM,OAAO,KAAK,UAAU,OAAO;AACnC,cAAM,gBAAgB,OAAO,WAAW,MAAM,MAAM;AACpD,cAAM,QAAQ,mBAAmB,aAAa;AAAA;AAAA,EAAW,IAAI;AAC7D,aAAK,QAAQ,MAAM,MAAM,KAAK;AAAA,MAChC;AAAA,IACF;AAAA;AAAA;;;ACjQA,SAAuB,SAAAC,cAAa;AACpC,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AAbzC,IAoCa;AApCb;AAAA;AAAA;AAcA;AACA;AACA;AACA;AAmBO,IAAM,kBAAN,cAA8BF,cAAa;AAAA,MACxC,oBAAoB;AAAA,MACpB,eAAkC,CAAC;AAAA,MAC1B;AAAA,MACT,gBAAkD;AAAA,MAClD,iBAAoD;AAAA,MACpD,aAAa,OAAO,MAAM,CAAC;AAAA,MAC3B,UAA+B;AAAA,MAC/B,eAAe;AAAA,MAEvB,YAAY,QAAyB;AACnC,cAAM;AACN,aAAK,SAAS;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAuB;AAC3B,YAAI,KAAK,SAAS;AAChB,gBAAM,IAAI,MAAM,+BAA+B;AAAA,QACjD;AAEA,eAAO,KAAK,+BAA+B;AAE3C,cAAM,OAAO,mBAAmB,KAAK,MAAM;AAE3C,cAAM,WAAW,EAAE,GAAG,QAAQ,IAAI;AAClC,cAAM,YAAY,qBAAqB;AACvC,YAAI,aAAa,SAAS,MAAM;AAC9B,mBAAS,OAAO,GAAG,SAAS,GAAGD,UAAS,GAAG,SAAS,IAAI;AAAA,QAC1D,WAAW,WAAW;AACpB,mBAAS,OAAO;AAAA,QAClB;AAEA,aAAK,UAAUD,OAAM,UAAU,MAAM;AAAA,UACnC,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,UAC9B,KAAK;AAAA,QACP,CAAC;AAED,aAAK,QAAQ,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAChD,eAAK,aAAa,IAAI;AAAA,QACxB,CAAC;AAED,aAAK,QAAQ,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AAChD,iBAAO,MAAM,qBAAqB,KAAK,SAAS,CAAC;AAAA,QACnD,CAAC;AAED,aAAK,QAAQ,GAAG,SAAS,CAAC,UAAiB;AACzC,iBAAO,MAAM,6BAA6B,KAAK;AAC/C,cAAI,KAAK,eAAe;AACtB,iBAAK,cAAc,KAAK;AACxB,iBAAK,gBAAgB;AACrB,iBAAK,iBAAiB;AAAA,UACxB;AACA,eAAK,KAAK,SAAS,KAAK;AAAA,QAC1B,CAAC;AAED,aAAK,QAAQ,GAAG,QAAQ,CAAC,SAAwB;AAC/C,iBAAO,KAAK,gCAAgC,IAAI,EAAE;AAClD,cAAI,KAAK,eAAe;AACtB,iBAAK,cAAc,IAAI,MAAM,6CAA6C,IAAI,EAAE,CAAC;AACjF,iBAAK,gBAAgB;AACrB,iBAAK,iBAAiB;AAAA,UACxB;AACA,eAAK,UAAU;AACf,eAAK,KAAK,QAAQ,IAAI;AAAA,QACxB,CAAC;AAGD,cAAM,oBAAoB,KAAK,SAAS,mBAAmB;AAC3D,eAAO,KAAK,2BAA2B;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,WAAW,MAAiC;AAC1C,eAAO,IAAI,QAAQ,CAACK,WAAS,WAAW;AACtC,gBAAM,UAAU,MAAM;AACpB,iBAAK,eAAe,EAAE,MAAM,QAAQ,SAAAA,UAAQ,CAAC;AAAA,UAC/C;AAEA,cAAI,KAAK,mBAAmB;AAC1B,iBAAK,aAAa,KAAK,OAAO;AAAA,UAChC,OAAO;AACL,oBAAQ;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,WAA0B;AAC9B,YAAI,CAAC,KAAK,SAAS;AACjB;AAAA,QACF;AAEA,eAAO,KAAK,oCAAoC;AAEhD,YAAI;AAEF,eAAK,QAAQ,OAAO,MAAM,KAAK,UAAU,CAAC,UAAU,CAAC,GAAG,MAAM;AAC9D,eAAK,QAAQ,OAAO,MAAM,KAAK,UAAU;AAAA,QAC3C,SAAS,OAAO;AACd,iBAAO,KAAK,6CAA6C,KAAK;AAAA,QAChE;AAGA,cAAM,IAAI,QAAc,CAACA,cAAY;AACnC,gBAAM,QAAQD,YAAW,MAAM;AAC7B,gBAAI,KAAK,SAAS;AAChB,mBAAK,QAAQ,KAAK,SAAS;AAC3B,mBAAK,UAAU;AAAA,YACjB;AACA,YAAAC,UAAQ;AAAA,UACV,GAAG,GAAI;AAEP,cAAI,KAAK,SAAS;AAChB,iBAAK,QAAQ,KAAK,QAAQ,MAAM;AAC9B,cAAAF,cAAa,KAAK;AAClB,mBAAK,UAAU;AACf,cAAAE,UAAQ;AAAA,YACV,CAAC;AAAA,UACH,OAAO;AACL,YAAAF,cAAa,KAAK;AAClB,YAAAE,UAAQ;AAAA,UACV;AAAA,QACF,CAAC;AAED,aAAK,oBAAoB;AACzB,aAAK,eAAe,CAAC;AACrB,eAAO,KAAK,2BAA2B;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA,MAKA,YAAqB;AACnB,eAAO,KAAK,YAAY,QAAQ,CAAC,KAAK,QAAQ;AAAA,MAChD;AAAA;AAAA,MAIQ,eAAe,KAA0B;AAC/C,YAAI,CAAC,KAAK,SAAS,OAAO;AACxB,cAAI,OAAO,IAAI,MAAM,2BAA2B,CAAC;AACjD;AAAA,QACF;AAEA,aAAK,oBAAoB;AACzB,aAAK,iBAAiB,IAAI;AAC1B,aAAK,gBAAgB,IAAI;AAEzB,YAAI;AACF,eAAK,QAAQ,MAAM,MAAM,KAAK,UAAU,IAAI,IAAI,GAAG,MAAM;AACzD,eAAK,QAAQ,MAAM,MAAM,KAAK,UAAU;AAAA,QAC1C,SAAS,OAAO;AACd,eAAK,oBAAoB;AACzB,eAAK,iBAAiB;AACtB,eAAK,gBAAgB;AACrB,cAAI,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AACpE,eAAK,QAAQ;AAAA,QACf;AAAA,MACF;AAAA,MAEQ,aAAa,MAAoB;AACvC,aAAK,gBAAgB,KAAK,SAAS;AAGnC,YAAI,WAAW,KAAK,aAAa,QAAQ,IAAI;AAC7C,eAAO,aAAa,IAAI;AACtB,gBAAM,SAAS,KAAK,aAAa,UAAU,GAAG,QAAQ;AACtD,eAAK,eAAe,KAAK,aAAa,UAAU,WAAW,CAAC;AAE5D,cAAI,KAAK,gBAAgB;AACvB,iBAAK,eAAe,MAAM;AAC1B,iBAAK,iBAAiB;AACtB,iBAAK,gBAAgB;AAAA,UACvB;AAEA,eAAK,oBAAoB;AACzB,eAAK,QAAQ;AAEb,qBAAW,KAAK,aAAa,QAAQ,IAAI;AAAA,QAC3C;AAAA,MACF;AAAA,MAEQ,UAAgB;AACtB,cAAM,OAAO,KAAK,aAAa,MAAM;AACrC,YAAI,MAAM;AACR,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC5OA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,QAAAC,aAAY;AACrB,SAAS,kBAAkB;AA0VpB,SAAS,kBAAkB,SAAoD;AACpF,MAAI,CAAC,qBAAqB;AACxB,0BAAsB,IAAI,oBAAoB,OAAO;AAAA,EACvD;AACA,SAAO;AACT;AAKO,SAAS,mBAAwC;AACtD,MAAI,CAAC,qBAAqB;AACxB,0BAAsB,IAAI,oBAAoB;AAAA,EAChD;AACA,SAAO;AACT;AAKA,eAAsB,wBAAuC;AAC3D,MAAI,qBAAqB;AACvB,UAAM,oBAAoB,YAAY;AACtC,0BAAsB;AAAA,EACxB;AACF;AAKO,SAAS,qBAA2B;AACzC,wBAAsB;AACxB;AAzYA,IAwDa,qBA4ST;AApWJ;AAAA;AAAA;AAgBA;AAQA;AACA;AACA;AACA;AACA;AA4BO,IAAM,sBAAN,MAA0B;AAAA;AAAA,MAEvB,UAAU,oBAAI,IAAqC;AAAA;AAAA,MAGnD,gBAAgB,oBAAI,IAA2F;AAAA;AAAA,MAG/G;AAAA;AAAA,MAGA;AAAA,MAER,YAAY,SAA+B;AACzC,aAAK,YAAY,SAAS,aAAa,WAAW;AAClD,aAAK,kBAAkBA;AAAA,UACrB,iBAAiB,cAAc;AAAA,UAC/B,KAAK;AAAA,QACP;AAEA,mBAAW,UAAU,CAAC,qBAAqB,QAAQ,aAAa,GAAG;AACjE,UAAAD,WAAUC,MAAK,KAAK,iBAAiB,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,QACnE;AACA,eAAO,KAAK,6CAA6C,KAAK,SAAS,GAAG;AAAA,MAC5E;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,eAAuB;AACrB,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,cAAsB;AACpB,eAAO,KAAK;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,YAAoB;AAClB,eAAOA,MAAK,KAAK,iBAAiB,MAAM;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,MAAM,kBAAkB,QAA6D;AACnF,cAAM,WAAW,KAAK,aAAa,MAAM;AACzC,eAAO,KAAK,aAAa,YAAY,UAAU,MAAM;AAEnD,iBAAO,IAAI,qBAAqB;AAAA,YAC9B,UAAU,SAAS;AAAA,YACnB,QAAQ,SAAS;AAAA,YACjB,YAAY,SAAS;AAAA,YACrB,aAAa,SAAS;AAAA,YACtB,WAAW,SAAS;AAAA,UACtB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,eAAe,QAAuD;AAC1E,cAAM,WAAW,KAAK,aAAa,MAAM;AACzC,eAAO,KAAK,aAAa,SAAS,UAAU,MAAM;AAChD,iBAAO,IAAI,kBAAkB,QAAQ;AAAA,QACvC,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,aAAa,QAAmD;AACpE,cAAM,WAAW,KAAK,aAAa,MAAM;AACzC,eAAO,KAAK,aAAa,OAAO,UAAU,MAAM;AAC9C,iBAAO,IAAI,gBAAgB,QAAQ;AAAA,QACrC,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,eAAeC,OAAuC;AAC1D,cAAM,UAAU,KAAK,QAAQ,IAAIA,KAAI;AACrC,YAAI,CAAC,QAAS;AAEd,eAAO,KAAK,iBAAiBA,KAAI,qBAAqB,QAAQ,SAAS,GAAG;AAC1E,cAAM,KAAK,WAAW,OAAO;AAC7B,aAAK,QAAQ,OAAOA,KAAI;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,cAA6B;AACjC,eAAO,KAAK,0CAA0C,KAAK,SAAS,EAAE;AACtE,cAAM,mBAAmB,MAAM,KAAK,KAAK,QAAQ,QAAQ,CAAC,EAAE;AAAA,UAC1D,OAAO,CAACA,OAAM,OAAO,MAAM;AACzB,gBAAI;AACF,oBAAM,KAAK,WAAW,OAAO;AAAA,YAC/B,SAAS,OAAO;AACd,qBAAO,MAAM,uBAAuBA,KAAI,YAAY,KAAK;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AACA,cAAM,QAAQ,IAAI,gBAAgB;AAClC,aAAK,QAAQ,MAAM;AACnB,eAAO,KAAK,uBAAuB;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA,MAKA,UAAUA,OAAiC;AACzC,cAAM,UAAU,KAAK,QAAQ,IAAIA,KAAI;AACrC,YAAI,CAAC,QAAS,QAAO;AACrB,eAAO,QAAQ,OAAO,UAAU;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAKA,YAA0G;AACxG,cAAM,SAA6F;AAAA,UACjG,KAAK;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,QACT;AACA,mBAAW,CAACA,OAAM,OAAO,KAAK,KAAK,SAAS;AAC1C,iBAAOA,KAAI,IAAI;AAAA,YACb,YAAY,QAAQ;AAAA,YACpB,SAAS,QAAQ,OAAO,UAAU;AAAA,YAClC,WAAW,QAAQ;AAAA,UACrB;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAcA,MAAM,uBAAsC;AAC1C,YAAI;AAEF,gBAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM;AACjC,gBAAM,EAAE,SAAAC,UAAQ,IAAI,MAAM,OAAO,MAAM;AAEvC,gBAAM,SAA+B;AAAA,YACnC,aAAa;AAAA,YACb,UAAU;AAAA,YACV,YAAYA,UAAQD,iBAAgB,IAAI;AAAA,UAC1C;AACA,iBAAO,KAAK,sDAAsD;AAClE,gBAAM,KAAK,kBAAkB,MAAM;AACnC,iBAAO,KAAK,kCAAkC;AAAA,QAChD,SAAS,OAAO;AACd,iBAAO,KAAK,mEAAmE,KAAK;AAAA,QACtF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,MAAM,kBAAiC;AACrC,YAAI;AACF,iBAAO,KAAK,iDAAiD;AAC7D,gBAAM,KAAK,aAAa,CAAC,CAAC;AAC1B,iBAAO,KAAK,6BAA6B;AAAA,QAC3C,SAAS,OAAO;AACd,iBAAO,KAAK,8DAA8D,KAAK;AAAA,QACjF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAqC,QAAc;AACzD,eAAO;AAAA,UACL,GAAG;AAAA,UACH,cAAc,OAAO,gBAAgB,KAAK;AAAA,UAC1C,QAAQ,OAAO,UAAU,KAAK,UAAU;AAAA,QAC1C;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,MAAc,aACZD,OACA,QACA,SACqE;AAIrE,cAAM,WAAW,KAAK,cAAc,IAAIA,KAAI;AAC5C,YAAI,UAAU;AACZ,cAAI;AAAE,kBAAM;AAAA,UAAU,QAAQ;AAAA,UAAwD;AAAA,QACxF;AAEA,cAAM,OAAO,KAAK,eAAeA,OAAM,QAAQ,OAAO;AACtD,aAAK,cAAc,IAAIA,OAAM,IAAI;AACjC,YAAI;AACF,iBAAO,MAAM;AAAA,QACf,UAAE;AACA,cAAI,KAAK,cAAc,IAAIA,KAAI,MAAM,MAAM;AACzC,iBAAK,cAAc,OAAOA,KAAI;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,eACZA,OACA,QACA,SACqE;AACrE,cAAM,OAAO,kBAAkBA,OAAM,MAAM;AAC3C,cAAM,WAAW,KAAK,QAAQ,IAAIA,KAAI;AAGtC,YAAI,YAAY,SAAS,eAAe,QAAQ,SAAS,OAAO,UAAU,GAAG;AAC3E,iBAAO,MAAM,oBAAoBA,KAAI,kBAAkB,KAAK,UAAU,GAAG,CAAC,CAAC,GAAG;AAC9E,iBAAO,SAAS;AAAA,QAClB;AAGA,YAAI,UAAU;AACZ,iBAAO,KAAK,GAAGA,KAAI,+CAA+C;AAClE,gBAAM,KAAK,WAAW,QAAQ;AAC9B,eAAK,QAAQ,OAAOA,KAAI;AAAA,QAC1B;AAGA,cAAM,SAAS,QAAQ;AACvB,cAAM,OAAO,MAAM;AAEnB,aAAK,QAAQ,IAAIA,OAAM;AAAA,UACrB,YAAY;AAAA,UACZ;AAAA,UACA,WAAW,KAAK;AAAA,UAChB,MAAAA;AAAA,QACF,CAAC;AAED,eAAO,KAAK,GAAGA,KAAI,0BAA0B,KAAK,UAAU,GAAG,CAAC,CAAC,GAAG;AACpE,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,WAAW,SAAuC;AAC9D,YAAI;AACF,gBAAM,QAAQ,OAAO,SAAS;AAAA,QAChC,SAAS,OAAO;AACd,iBAAO,KAAK,kBAAkB,QAAQ,IAAI,YAAY,KAAK;AAAA,QAE7D;AAAA,MACF;AAAA,IACF;AASA,IAAI,sBAAkD;AAAA;AAAA;;;ACpWtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,SAAS,gBAAgB;AACzB,SAAS,cAAAG,mBAAkB;AAC3B,SAAS,UAAU,aAAAC,YAAW,WAAAC,UAAS,cAAAC,mBAAkB;AACzD,SAAS,iBAAiB;AA4EnB,SAAS,qBAA2B;AACzC,iBAAe,oBAAI,IAAI;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAKO,SAAS,sBAA4B;AAC1C,iBAAe;AACjB;AAKA,SAAS,iBAAiB,SAA0B;AAClD,SAAO,iBAAiB,IAAI,OAAO,KAAM,iBAAiB,QAAQ,aAAa,IAAI,OAAO;AAC5F;AAyBO,SAAS,sBAA8B;AAE5C,MAAI,yBAAyB,QAAW;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,IAAI;AAE5B,MAAI,CAAC,SAAS;AACZ,wBAAoB;AACpB,2BAAuB;AACvB,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,SAAS,OAAO,EAAE,YAAY;AAC3C,QAAM,iBAAiB,CAAC,UAAU,cAAc,YAAY;AAC5D,MAAI,CAAC,eAAe,SAAS,IAAI,GAAG;AAClC,UAAM,IAAI;AAAA,MACR,mFAAmF,IAAI;AAAA,IACzF;AAAA,EACF;AAGA,MAAI,CAACA,YAAW,OAAO,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,8CAA8C,OAAO;AAAA,IACvD;AAAA,EACF;AAGA,MAAI,CAACH,YAAW,OAAO,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,qDAAqD,OAAO;AAAA,IAC9D;AAAA,EACF;AAEA,sBAAoBE,SAAQ,OAAO;AACnC,yBAAuB;AACvB,SAAO,KAAK,wCAAwC,OAAO,UAAU,iBAAiB,GAAG;AACzF,SAAO;AACT;AAKO,SAAS,uBAAsC;AACpD,SAAO;AACT;AAKO,SAAS,4BAAkC;AAChD,sBAAoB;AACpB,yBAAuB;AACzB;AAaA,eAAsB,gCAAiD;AACrE,QAAME,UAAS,wBAAwB;AACvC,QAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;AAC7B,MAAI,mBAAmB;AACrB,QAAI,OAAO,oBAAoBH,cAAa,IAAI,QAAQ;AAAA,EAC1D;AAEA,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAcG,SAAQ,CAAC,WAAW,gBAAgB,GAAG;AAAA,MAC5E;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,WAAO,OAAO,KAAK;AAAA,EACrB,SAAS,KAAc;AACrB,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAM,IAAI;AAAA,MACR,wCAAwCA,OAAM,mIAEa,OAAO;AAAA,IACpE;AAAA,EACF;AACF;AAeO,SAAS,oBAAoB,KAAqB;AAGvD,MAAI,IAAI,SAAS,IAAI,GAAG;AACtB,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAGA,MAAI,wBAAwB,KAAK,GAAG,GAAG;AAErC,UAAM,IAAI,MAAM,0EAA0E;AAAA,EAC5F;AAEA,SAAO;AACT;AAQO,SAAS,qBAAqB,MAA0B;AAC7D,SAAO,KAAK,IAAI,mBAAmB;AACrC;AAMA,SAAS,mBAAmB,eAAgE;AAC1F,QAAM,UAAkC,CAAC;AAGzC,aAAW,OAAO,eAAe;AAC/B,QAAI,QAAQ,IAAI,GAAG,MAAM,QAAW;AAClC,cAAQ,GAAG,IAAI,QAAQ,IAAI,GAAG;AAAA,IAChC;AAAA,EACF;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AACtD,QAAI,UAAU,UAAa,kBAAkB,KAAK,YAAU,IAAI,WAAW,MAAM,CAAC,GAAG;AACnF,cAAQ,GAAG,IAAI;AAAA,IACjB;AAAA,EACF;AAOA,MAAI,qBAAqB,QAAQ,MAAM;AACrC,YAAQ,OAAO,GAAG,iBAAiB,GAAGH,UAAS,GAAG,QAAQ,IAAI;AAAA,EAChE,WAAW,mBAAmB;AAC5B,YAAQ,OAAO;AAAA,EACjB;AAIA,MAAI,eAAe;AACjB,WAAO,OAAO,SAAS,aAAa;AAAA,EACtC;AAEA,SAAO;AACT;AAaA,eAAsB,kBAAkB,SAA2D;AACjG,MAAI;AACF,UAAM,EAAE,SAAS,MAAM,KAAK,UAAU,KAAQ,IAAI,IAAI;AAGtD,QAAI,CAAC,iBAAiB,OAAO,GAAG;AAC9B,YAAM,IAAI,MAAM,wBAAwB,OAAO,8CAA8C;AAAA,IAC/F;AAGA,QAAI,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KACtE,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,IAAI,KACvE,QAAQ,SAAS,IAAI,GAAG;AAC1B,YAAM,IAAI,MAAM,mDAAmD,OAAO,EAAE;AAAA,IAC9E;AAIA,UAAM,gBAAgB,qBAAqB,IAAI;AAE/C,WAAO,KAAK,0BAA0B,OAAO,IAAI,EAAE,MAAM,eAAe,KAAK,QAAQ,CAAC;AAEtF,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA,KAAK,mBAAmB,GAAG;AAAA,IAC7B;AAIA,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,cAAc,SAAS,eAAe,WAAW;AAElF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EAEF,SAAS,OAAgB;AACvB,WAAO,MAAM,iCAAiC,KAAK;AAEnD,UAAM,MAAM;AACZ,UAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,KAAK;AACtE,UAAM,WAAW,IAAI,QAAQ;AAE7B,WAAO;AAAA,MACL,QAAQ,IAAI,UAAU;AAAA,MACtB,QAAQ,IAAI,UAAU;AAAA,MACtB,SAAS;AAAA,MACT,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,gBAAgB,YAAoB,SAA4C;AAC9F,QAAM,OAAO,CAAC,UAAU;AAIxB,QAAM,qBAAqB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAEjE,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,IACF;AAEA,UAAM,iBAAiB,IAAI,WAAW,KAAK,mBAAmB,IAAI,GAAG;AAErE,QAAI,OAAO,UAAU,WAAW;AAC9B,UAAI,OAAO;AACT,aAAK,KAAK,iBAAiB,IAAI,GAAG,KAAK,KAAK,GAAG,EAAE;AAAA,MACnD;AAAA,IACF,WAAW,MAAM,QAAQ,KAAK,GAAG;AAE/B,iBAAW,QAAQ,OAAO;AACxB,YAAI,gBAAgB;AAElB,eAAK,KAAK,IAAI,GAAG,IAAI,OAAO,IAAI,CAAC,EAAE;AAAA,QACrC,OAAO;AAEL,eAAK,KAAK,KAAK,GAAG,IAAI,OAAO,IAAI,CAAC,EAAE;AAAA,QACtC;AAAA,MACF;AAAA,IACF,OAAO;AAEL,UAAI,gBAAgB;AAElB,aAAK,KAAK,IAAI,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE;AAAA,MACtC,OAAO;AACL,aAAK,KAAK,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,aAAa,YAAoB,SAA4C;AAC3F,QAAM,OAAO,CAAC,UAAU;AAExB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,WAAW;AAC9B,UAAI,OAAO;AACT,aAAK,KAAK,KAAK,GAAG,EAAE;AAAA,MACtB;AAAA,IACF,WAAW,MAAM,QAAQ,KAAK,GAAG;AAE/B,iBAAW,QAAQ,OAAO;AACxB,aAAK,KAAK,KAAK,GAAG,IAAI,OAAO,IAAI,CAAC;AAAA,MACpC;AAAA,IACF,OAAO;AAEL,WAAK,KAAK,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AAoCA,eAAsB,qBACpB,YACA,SACA,iBAA2B,CAAC,GAC5B,KAC6B;AAC7B,QAAM,OAAO,gBAAgB,YAAY,OAAO;AAChD,OAAK,KAAK,GAAG,cAAc;AAK3B,QAAM,kBAAkB,CAAC,0BAA0B,IAAI,UAAU,KAAK,CAAC;AAEvE,MAAI,iBAAiB;AACnB,QAAI;AAQF,YAAM,EAAE,kBAAAI,kBAAiB,IAAI,MAAM;AACnC,YAAM,UAAUA,kBAAiB;AAEjC,UAAI,QAAQ,UAAU,KAAK,GAAG;AAC5B,cAAM,YAAY,MAAM,QAAQ,aAAa,CAAC,CAAC;AAC/C,cAAM,gBAAgB,qBAAqB,IAAI;AAE/C,eAAO,KAAK,4CAA4C,UAAU,IAAI,EAAE,MAAM,cAAc,CAAC;AAE7F,cAAM,SAAS,MAAM,UAAU,WAAW,aAAa;AAEvD,eAAO;AAAA,UACL;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,UAAU;AAAA,QACZ;AAAA,MACF,OAAO;AACL,eAAO,MAAM,mCAAmC,UAAU,wBAAwB;AAAA,MACpF;AAAA,IACF,SAAS,OAAO;AAKd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAGrE,UAAI,QAAQ,SAAS,2BAA2B,KAC5C,QAAQ,SAAS,mBAAmB,KACpC,QAAQ,SAAS,iBAAiB,GAAG;AACvC,eAAO,KAAK,+BAA+B,UAAU,qCAAqC,OAAO,EAAE;AAAA,MAErG,OAAO;AAEL,eAAO,MAAM,kCAAkC,UAAU,MAAM,OAAO,EAAE;AACxE,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,SAAO,kBAAkB;AAAA,IACvB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAKA,eAAsB,kBACpB,YACA,SACA,iBAA2B,CAAC,GACC;AAC7B,QAAM,OAAO,aAAa,YAAY,OAAO;AAC7C,OAAK,KAAK,GAAG,cAAc;AAE3B,SAAO,kBAAkB;AAAA,IACvB,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAKA,eAAsB,eAAe,SAAiB,YAAsC;AAC1F,QAAM,OAAO,aAAa,CAAC,YAAY,QAAQ,IAAI,CAAC,QAAQ;AAE5D,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,OAAO,UAAU,OAAO,UAAU;AAC3C;AAKA,eAAsB,sBAAsB,SAAmC;AAC7E,MAAI;AACF,UAAM,SAAS,MAAM,kBAAkB;AAAA,MACrC,SAAS;AAAA,MACT,MAAM,CAAC,OAAO;AAAA,IAChB,CAAC;AACD,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAzlBA,IAUM,eAmBA,kBAUF,cAIE,eAiBA,mBAiBA,yBAoCF,mBAGA,sBAmVE;AAvcN;AAAA;AAAA;AAQA;AAEA,IAAM,gBAAgB,UAAU,QAAQ;AAmBxC,IAAM,mBAAmB,oBAAI,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,IAAI,eAAmC;AAIvC,IAAM,gBAAgB;AAAA,MACpB;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAIA,IAAM,oBAAoB;AAAA,MACxB;AAAA;AAAA,MACA;AAAA;AAAA,IACF;AAcA,IAAM,0BAA0B;AAoChC,IAAI,oBAAmC;AAsVvC,IAAM,4BAA4B,oBAAI,IAAI;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;;;ACvcD,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,qCAAqC;AAC9C,OAAO,aAAa;AACpB,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,SAAS,WAAAC,iBAAe;AACxB,SAAS,iBAAAC,sBAAqB;;;ACR9B,SAAS,KAAAC,UAAS;;;ACElB;AACA;AAFA,SAAS,SAAS;;;ACDlB;AACA;AACA,SAAS,eAAe,gBAAAC,qBAAoB;AAC5C,SAAS,WAAAC,UAAS,cAAAC,mBAAkB;AACpC,SAAS,aAAAC,kBAAiB;AAoBnB,IAAM,sBAAsB;AAAA,EACjC,eAAe;AAAA,EACf,cAAc;AAAA,EACd,iBAAiB;AACnB;AAOA,eAAsB,qBAAqB,WAA2C;AACpF,MAAI;AACF,UAAM,eAAeH,cAAa,WAAW,OAAO;AACpD,UAAM,WAA0B,CAAC;AAGjC,UAAM,YAAY,aAAa,MAAM,kBAAkB;AACvD,QAAI,UAAW,UAAS,OAAO,UAAU,CAAC;AAE1C,UAAM,YAAY,aAAa,MAAM,cAAc;AACnD,QAAI,UAAW,UAAS,OAAO,UAAU,CAAC,EAAE,KAAK;AAEjD,UAAM,YAAY,aAAa,MAAM,qBAAqB;AAC1D,QAAI,UAAW,UAAS,cAAc,UAAU,CAAC,EAAE,KAAK;AAExD,UAAM,UAAU,aAAa,MAAM,YAAY;AAC/C,QAAI,QAAS,UAAS,KAAK,QAAQ,CAAC,EAAE,KAAK;AAE3C,UAAM,YAAY,aAAa,MAAM,cAAc;AACnD,QAAI,WAAW;AACb,eAAS,OAAO,UAAU,CAAC,EAAE,MAAM,KAAK,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAAA,IACpE;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,MAAM,qCAAqC,KAAK;AACvD,WAAO,CAAC;AAAA,EACV;AACF;AAKA,eAAsB,wBACpB,UACA,YACgC;AAChC,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,EAAE,QAAQ,OAAO;AAAA,MACjB,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,+BAA+B,OAAO,UAAU,OAAO,KAAK;AAAA,MACrE;AAAA,IACF;AAEA,UAAM,oBAAoB,cAAc,SAAS,QAAQ,SAAS,OAAO;AAGzE,IAAAG,WAAUF,SAAQ,iBAAiB,GAAG,EAAE,WAAW,KAAK,CAAC;AAGzD,kBAAc,mBAAmB,OAAO,MAAM;AAE9C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS,OAAO;AAAA,IAClB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,2BAA2B,KAAK;AAAA,IACzC;AAAA,EACF;AACF;AAKA,eAAsB,uBACpB,UACA,YACgC;AAChC,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,EAAE,QAAQ,MAAM;AAAA,MAChB,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,+BAA+B,OAAO,UAAU,OAAO,KAAK;AAAA,MACrE;AAAA,IACF;AAEA,UAAM,oBAAoB,cAAc,SAAS,QAAQ,SAAS,MAAM;AAGxE,IAAAE,WAAUF,SAAQ,iBAAiB,GAAG,EAAE,WAAW,KAAK,CAAC;AAGzD,kBAAc,mBAAmB,OAAO,MAAM;AAE9C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS,OAAO;AAAA,IAClB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,0BAA0B,KAAK;AAAA,IACxC;AAAA,EACF;AACF;AAKA,eAAsB,yBACpB,UACA,WACA,YACgC;AAChC,MAAI;AAEF,UAAM,WAAW,MAAM,qBAAqB,SAAS;AAErD,QAAI,SAAS,SAAS,SAAS;AAC7B,aAAO,MAAM,qCAAqC,SAAS,IAAI,6DAA6D;AAC5H,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,qCAAqC,SAAS,IAAI;AAAA,MAC3D;AAAA,IACF;AAGA,UAAM,aAAa,MAAM;AAAA,MACvB;AAAA,MACA,EAAE,QAAQ,OAAO;AAAA,MACjB,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,+BAA+B,WAAW,UAAU,WAAW,KAAK;AAAA,MAC7E;AAAA,IACF;AAGA,QAAI;AACJ,QAAI;AACF,qBAAe,KAAK,MAAM,WAAW,MAAM;AAAA,IAC7C,SAAS,YAAY;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,uCAAuC,UAAU;AAAA,MAC1D;AAAA,IACF;AAGA,UAAM,iBAAiB,gCAAgC,cAAc,QAAQ;AAE7E,UAAM,oBAAoB,cAAc,SAAS,QAAQ,SAAS,KAAK;AAGvE,IAAAE,WAAUF,SAAQ,iBAAiB,GAAG,EAAE,WAAW,KAAK,CAAC;AAGzD,kBAAc,mBAAmB,cAAc;AAE/C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,oCAAoC,KAAK;AAAA,IAClD;AAAA,EACF;AACF;AAKA,SAAS,gCAAgC,cAAuB,UAAiC;AAC/F,QAAM,YAAY,iBAAiB,SAAS,QAAQ,sBAAsB;AAC1E,QAAM,YAAY,iBAAiB,SAAS,eAAe,6CAA6C;AAExG,MAAI,iBAAiB,KAAK,SAAS;AAAA;AAAA,EAAO,SAAS;AAAA;AAAA;AAGnD,MAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAAU;AACrD,sBAAkB;AAClB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,aAAa,UAAU;AAEtC,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,sBAAkB;AAClB,WAAO;AAAA,EACT;AAEA,oBAAkB;AAGlB,QAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAM,QAAQ,oBAAI,IAAY;AAG9B,SAAO,QAAQ,CAAC,OAAgB,UAAkB;AAChD,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,GAAG;AAE7C,YAAM,SAAS,eAAe,MAAM,CAAC,GAAG,SAAS,KAAK,QAAQ,KAAK,IAAI;AACvE,YAAM,SAAS,eAAe,MAAM,CAAC,GAAG,SAAS,KAAK,QAAQ,KAAK,IAAI;AACvE,YAAM,QAAQ,MAAM,CAAC,GAAG,SAAS,KAAK;AAGtC,YAAM,IAAI,MAAM;AAChB,YAAM,IAAI,MAAM;AAGhB,YAAM,SAAS,GAAG,MAAM,IAAI,MAAM;AAClC,UAAI,CAAC,MAAM,IAAI,MAAM,GAAG;AACtB,YAAI,OAAO;AACT,4BAAkB,OAAO,MAAM,QAAQ,cAAc,KAAK,CAAC,KAAK,MAAM;AAAA;AAAA,QACxE,OAAO;AACL,4BAAkB,OAAO,MAAM,QAAQ,MAAM;AAAA;AAAA,QAC/C;AACA,cAAM,IAAI,MAAM;AAAA,MAClB;AAAA,IACF,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AAEtD,YAAM,SAAS,eAAe,MAAM,QAAQ,SAAS,KAAK,MAAM,MAAM,SAAS,KAAK,QAAQ,KAAK,MAAM;AACvG,YAAM,SAAS,eAAe,MAAM,QAAQ,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ,KAAK,MAAM;AACrG,YAAM,QAAQ,MAAM,OAAO,SAAS,KAAK,MAAM,UAAU,SAAS,KAAK;AAEvE,YAAM,IAAI,MAAM;AAChB,YAAM,IAAI,MAAM;AAEhB,YAAM,SAAS,GAAG,MAAM,IAAI,MAAM;AAClC,UAAI,CAAC,MAAM,IAAI,MAAM,GAAG;AACtB,YAAI,OAAO;AACT,4BAAkB,OAAO,MAAM,QAAQ,cAAc,KAAK,CAAC,KAAK,MAAM;AAAA;AAAA,QACxE,OAAO;AACL,4BAAkB,OAAO,MAAM,QAAQ,MAAM;AAAA;AAAA,QAC/C;AACA,cAAM,IAAI,MAAM;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAC;AAGD,MAAI,MAAM,SAAS,KAAK,MAAM,OAAO,GAAG;AACtC,UAAM,YAAY,MAAM,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE;AAC/C,cAAU,QAAQ,CAAC,MAAM,UAAU;AACjC,UAAI,UAAU,GAAG;AACf,0BAAkB,OAAO,IAAI,IAAI,cAAc,IAAI,CAAC;AAAA;AAAA,MACtD,OAAO;AACL,0BAAkB,OAAO,UAAU,CAAC,CAAC,QAAQ,IAAI;AAAA;AAAA,MACnD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,oBAAkB;AAGlB,oBAAkB;AAAA;AAAA;AAClB,oBAAkB,kBAAkB,MAAM,IAAI;AAAA;AAC9C,oBAAkB,kBAAkB,MAAM,IAAI;AAAA;AAC9C,oBAAkB,6BAA6B,OAAO,MAAM;AAAA;AAE5D,SAAO;AACT;AAKA,SAAS,eAAe,IAAoB;AAC1C,SAAO,GACJ,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,SAAS,KAAK,EACtB,UAAU,GAAG,EAAE;AACpB;AAKA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MACJ,QAAQ,kBAAkB,EAAE,EAC5B,QAAQ,QAAQ,GAAG,EACnB,KAAK,EACL,UAAU,GAAG,EAAE;AACpB;AAKA,SAAS,iBAAiB,SAAyB;AACjD,SAAO,QACJ,QAAQ,WAAW,EAAE,EACrB,QAAQ,OAAO,GAAG,EAClB,QAAQ,QAAQ,GAAG,EACnB,KAAK,EACL,UAAU,GAAG,GAAG;AACrB;AAKA,eAAsB,qBACpB,UACA,WACA,oBACA,YACgC;AAChC,MAAI;AAEF,UAAM,WAAW,sBAAsB;AAEvC,WAAO,KAAK,2CAA2C,QAAQ,EAAE;AAGjE,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO,MAAM,wBAAwB,UAAU,UAAU;AAAA,MAE3D,KAAK;AACH,eAAO,MAAM,uBAAuB,UAAU,UAAU;AAAA,MAE1D,KAAK;AACH,eAAO,MAAM,yBAAyB,UAAU,WAAW,UAAU;AAAA,MAEvE;AAEE,YAAIC,YAAW,QAAQ,GAAG;AACxB,iBAAO,MAAM,yBAAyB,UAAU,WAAW,UAAU,UAAU;AAAA,QACjF,OAAO;AACL,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,OAAO,gCAAgC,QAAQ,mCAAmC,OAAO,KAAK,mBAAmB,EAAE,KAAK,IAAI,CAAC;AAAA,UAC/H;AAAA,QACF;AAAA,IACJ;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,4BAA4B,KAAK;AAAA,IAC1C;AAAA,EACF;AACF;AAKA,eAAe,yBACb,WACA,YACA,aACA,aACgC;AAIhC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;;;ACpZA;AAHA,SAAS,aAAAE,YAAW,cAAAC,mBAAkB;AACtC,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,mBAAmB;AAO5B,SAAS,qBAAqB,SAAiB,YAA4B;AACzE,QAAM,UAAUA,SAAQ,OAAO;AAC/B,QAAM,YAAYA,SAAQ,UAAU;AACpC,MAAI,CAAC,UAAU,WAAW,UAAU,GAAG,KAAK,cAAc,SAAS;AACjE,UAAM,IAAI,MAAM,iEAAiE,OAAO,EAAE;AAAA,EAC5F;AACA,SAAO;AACT;AAQO,SAAS,wBAAwB,QAAyB;AAE/D,QAAM,aAAa,QAAQ,IAAI,wBAAwB,iBAAiB,YAAY;AAGpF,MAAI,QAAQ;AACV,UAAM,YAAY,qBAAqB,YAAY,MAAM;AACzD,QAAI,CAACF,YAAW,SAAS,GAAG;AAC1B,MAAAD,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAKA,MAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,IAAAD,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AAGA,QAAMI,cAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,WAAW,YAAY,CAAC,EAAE,SAAS,KAAK;AAC9C,QAAM,eAAeF,MAAK,YAAY,aAAaE,UAAS,IAAI,QAAQ,EAAE;AAE1E,EAAAJ,WAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAE3C,SAAO;AACT;;;AF9CA;AAGA;AAFA,SAAS,iBAAAK,gBAAe,QAAQ,cAAAC,aAAY,aAAAC,kBAAiB;AAC7D,SAAS,YAAAC,WAAU,WAAAC,UAAS,cAAAC,aAAY,QAAAC,OAAM,WAAAC,gBAAe;AAkBtD,IAAM,4BAA4B,CACvC,QACA,YACW;AACX,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,6BAA6B,OAAO,YAAY,SAAS;AAAA,EAAO,OAAO,SAAS,OAAO,MAAM;AAAA,EACtG;AAEA,MAAI,SAAS;AAEb,MAAI,OAAO,QAAQ;AACjB,cAAU,OAAO;AAAA,EACnB;AAEA,MAAI,OAAO,QAAQ;AACjB,QAAI,QAAQ;AACV,gBAAU;AAAA,IACZ;AACA,cAAU,OAAO;AAAA,EACnB;AAEA,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAKO,SAAS,gBAAgB,QAAmB,YAAqC;AACtF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,EACpB,IAAI;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,WAAoC;AAEzC,YAAM,oBAA8B,CAAC;AAErC,UAAI;AACF,eAAO,KAAK,uBAAuB,IAAI,IAAI,EAAE,SAAS,YAAY,OAAO,CAAC;AAM1E,cAAM,4BAA4B,SAAS,2BAA2B,SAAS,wBAAwB,SAAS,gCAAgC,SAAS;AAEzJ,cAAM,kBAAkB,4BACpB;AAAA,UACE,aAAa,OAAO,eAAe,CAAC;AAAA,UACpC,OAAO,OAAO;AAAA,UACd,MAAM,OAAO;AAAA,UACb,KAAK,OAAO;AAAA,UACZ,SAAS,OAAO;AAAA,UAChB,OAAO,OAAO;AAAA,UACd,OAAO,OAAO;AAAA,UACd,WAAW,OAAO;AAAA,UAClB,eAAe,OAAO;AAAA,UACtB,WAAW,OAAO;AAAA,UAClB,aAAa,OAAO;AAAA,UACpB,gBAAgB,OAAO;AAAA,UACvB,gBAAgB,OAAO;AAAA,UACvB,mBAAmB,OAAO;AAAA,UAC1B,oBAAoB,OAAO;AAAA,UAC3B,kBAAkB,OAAO;AAAA,UACzB,WAAW,OAAO;AAAA,UAClB,QAAQ,OAAO;AAAA,UACf,OAAO,OAAO;AAAA,QAChB,IACA;AAAA,UACE,aAAa,OAAO,eAAe,CAAC;AAAA,UACpC,OAAO,OAAO;AAAA,UACd,MAAM,OAAO;AAAA,UACb,KAAK,OAAO;AAAA,UACZ,SAAS,OAAO;AAAA,UAChB,OAAO,OAAO;AAAA,UACd,OAAO,OAAO;AAAA,UACd,WAAW,OAAO;AAAA,UAClB,eAAe,OAAO;AAAA,UACtB,WAAW,OAAO;AAAA,UAClB,aAAa,OAAO;AAAA,UACpB,gBAAgB,OAAO;AAAA,UACvB,gBAAgB,OAAO;AAAA,UACvB,QAAQ,OAAO;AAAA,UACf,mBAAmB,OAAO;AAAA,UAC1B,oBAAoB,OAAO;AAAA,UAC3B,kBAAkB,OAAO;AAAA,UACzB,WAAW,OAAO;AAAA,UAClB,QAAQ,OAAO;AAAA,UACf,OAAO,OAAO;AAAA,QAChB;AAEJ,cAAM;AAAA,UACJ,cAAc,CAAC;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,mBAAmB;AAAA,UACnB,oBAAoB;AAAA,UACpB,kBAAkB;AAAA,UAClB;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,QACF,IAAI;AAGJ,cAAM,UAAU,EAAC,GAAG,OAAM;AAC1B,eAAO,KAAK,eAAe,EAAE,QAAQ,SAAO,OAAO,QAAQ,GAAG,CAAC;AAC/D,YAAI,iBAAiB,MAAM,QAAQ,WAAW,IAAI,cAA0B,CAAC,WAAqB;AAGlG,YAAI,SAAS,MAAM,QAAQ,KAAK,GAAG;AACjC,2BAAiB,CAAC,GAAG,gBAAgB,GAAG,KAAiB;AAAA,QAC3D;AAGA,YAAI,QAAQ,KAAK,WAAW,cAAc,GAAG;AAC3C,2BAAiB,CAAC,GAAG,gBAAgB,IAAc;AAAA,QACrD;AAGA,YAAI,SAAS,SAAS,wBAAwB;AAC5C,2BAAiB,CAAC,GAAG,gBAAgB,KAAe;AAAA,QACtD;AAGA,YAAI,QAAQ,YAAY,SAAS,2BAA2B;AAC1D,2BAAiB,CAAC,GAAG,gBAAgB,QAAQ,QAAkB;AAC/D,iBAAO,QAAQ;AAAA,QACjB;AAGA,YAAI,QAAQ,YAAY,SAAS,0BAA0B;AACzD,2BAAiB,CAAC,GAAG,gBAAgB,QAAQ,QAAkB;AAC/D,iBAAO,QAAQ;AAAA,QACjB;AAGA,YAAI,SAAS,2BAA2B;AACtC,cAAI,QAAQ,UAAU;AACpB,6BAAiB,CAAC,GAAG,gBAAgB,QAAQ,QAAkB;AAC/D,mBAAO,QAAQ;AAAA,UACjB;AACA,cAAI,QAAQ,SAAS;AACnB,6BAAiB,CAAC,GAAG,gBAAgB,QAAQ,OAAiB;AAC9D,mBAAO,QAAQ;AAAA,UACjB;AAAA,QACF;AAGA,YAAI,SAAS,SAAS,8BAA8B;AAClD,2BAAiB,CAAC,GAAG,gBAAgB,KAAe;AAAA,QACtD;AAGA,YAAI,OAAQ,SAAS,kBAAmB;AACtC,2BAAiB,CAAC,GAAG,gBAAgB,GAAa;AAAA,QACpD;AAGA,gBAAQ,MAAM;AAAA,UACZ,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAKH,gBAAI,SAAS,MAAM,QAAQ,KAAK,GAAG;AACjC,oBAAM,UAAU,oBAAoB;AACpC,+BAAiB,CAAC,GAAG,gBAAgB,GAAI,MAAmB;AAAA,gBAC1D,OAAKF,YAAW,CAAC,IAAI,IAAIE,SAAQ,SAAS,CAAC;AAAA,cAC7C,CAAC;AAAA,YACH;AACA;AAAA,UAEF,KAAK,oBAAoB;AAEvB,gBAAI,QAAQ,YAAY,OAAO,QAAQ,aAAa,YAAY,CAACF,YAAW,QAAQ,QAAQ,GAAG;AAC7F,sBAAQ,WAAWE,SAAQ,oBAAoB,GAAG,QAAQ,QAAQ;AAClE,qBAAO,KAAK,8BAA8B,QAAQ,QAAQ,EAAE;AAAA,YAC9D;AAGA,kBAAM,gBAAgB,MAAM,iBAAiB,QAAQ,MAAM;AAC3D,gBAAI,eAAe;AACjB,+BAAiB,CAAC,GAAG,gBAAgB,aAAa;AAAA,YACpD,WAAW,OAAO;AAChB,+BAAiB,CAAC,GAAG,gBAAgB,KAAe;AAAA,YACtD;AAGA,gBAAI,cAAc,cAAc,aAAa;AAG3C,oBAAM,YAAa,YAAuB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAChF,kBAAI;AACJ,kBAAI;AACJ,kBAAI;AACF,0BAAU,qBAAqB,kBAAkB;AACjD,kCAAkB,KAAK,OAAO;AAC9B,0BAAUD,MAAK,SAAS,yBAAyB;AAGjD,sBAAM,aAAa,UAAU,KAAK,IAAI,IAAI;AAE1C,gBAAAN,eAAc,SAAS,YAAY,MAAM;AAAA,cAC3C,SAAS,KAAK;AACZ,uBAAO,MAAM,sEAAsE,WAAW,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAChK,sBAAM;AAAA,cACR;AAGA,oBAAM,kBAAkB,QAAQ,YAAY,CAAC;AAC7C,oBAAM,gBAAgB,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC,eAAe;AACzF,4BAAc,KAAK,uBAAuB,OAAO,EAAE;AACnD,sBAAQ,WAAW;AAEnB,qBAAO,KAAK,qCAAqC,OAAO,eAAe,UAAU,KAAK,IAAI,CAAC,EAAE;AAAA,YAC/F;AAGA,gBAAI,cAAc,mBAAmB,gBAAgB;AACnD,oBAAM,gBAAiB,eAA0B,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AACvF,kBAAI;AACJ,kBAAI;AACJ,kBAAI;AACF,0BAAU,qBAAqB,kBAAkB;AACjD,kCAAkB,KAAK,OAAO;AAC9B,0BAAUM,MAAK,SAAS,oBAAoB;AAG5C,sBAAM,aAAa,cAAc,KAAK,IAAI,IAAI;AAE9C,gBAAAN,eAAc,SAAS,YAAY,MAAM;AAAA,cAC3C,SAAS,KAAK;AACZ,uBAAO,MAAM,2EAA2E,WAAW,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACrK,sBAAM;AAAA,cACR;AAGA,oBAAM,kBAAkB,QAAQ,YAAY,CAAC;AAC7C,oBAAM,gBAAgB,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC,eAAe;AACzF,4BAAc,KAAK,kBAAkB,OAAO,EAAE;AAC9C,sBAAQ,WAAW;AAEnB,qBAAO,KAAK,qCAAqC,OAAO,mBAAmB,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,YACvG;AAGA,gBAAI,cAAc,iBAAiB,gBAAgB;AACjD,oBAAM,gBAAiB,eAA0B,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AACvF,kBAAI;AACJ,kBAAI;AACJ,kBAAI;AACF,0BAAU,qBAAqB,kBAAkB;AACjD,kCAAkB,KAAK,OAAO;AAC9B,0BAAUM,MAAK,SAAS,oBAAoB;AAG5C,sBAAM,aAAa,cAAc,KAAK,IAAI,IAAI;AAE9C,gBAAAN,eAAc,SAAS,YAAY,MAAM;AAAA,cAC3C,SAAS,KAAK;AACZ,uBAAO,MAAM,yEAAyE,WAAW,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACnK,sBAAM;AAAA,cACR;AAGA,oBAAM,kBAAkB,QAAQ,YAAY,CAAC;AAC7C,oBAAM,gBAAgB,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC,eAAe;AACzF,4BAAc,KAAK,kBAAkB,OAAO,EAAE;AAC9C,sBAAQ,WAAW;AAEnB,qBAAO,KAAK,qCAAqC,OAAO,mBAAmB,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,YACvG;AACA;AAAA,UACF;AAAA,UAEA,KAAK;AAAA,UACL,KAAK;AAEH,gBAAI,OAAO;AACT,+BAAiB,CAAC,GAAG,gBAAgB,KAAe;AAAA,YACtD;AACA;AAAA,UAEF,KAAK;AAEH,gBAAI,WAAW;AACb,+BAAiB,CAAC,GAAG,gBAAgB,SAAmB;AAAA,YAC1D;AACA;AAAA,UAEF;AAEE;AAAA,QACJ;AAGA,YAAI;AACJ,YAAI,SAAS,sBAAsB,SAAS,mBAAmB;AAC7D,wBAAc,wBAAwB,YAAkC;AACxE,iBAAO,KAAK,2BAA2B,IAAI,KAAK,WAAW,EAAE;AAG7D,gBAAM,gBAAgBM,MAAK,aAAa,WAAW;AACnD,UAAAN,eAAc,eAAe,KAAK,IAAI,EAAE,SAAS,GAAG,MAAM;AAG1D,kBAAQ,SAAS;AAGjB,cAAI,CAAC,QAAQ,WAAW;AACtB,oBAAQ,YAAY;AAAA,UACtB;AAGA,cAAI,SAAS,oBAAoB;AAG/B,gBAAI,CAAC,QAAQ,eAAe,GAAG;AAC7B,sBAAQ,eAAe,IAAIM,MAAK,aAAa,qBAAqB;AAAA,YACpE;AAGA,gBAAI,CAAC,QAAQ,QAAQ;AACnB,sBAAQ,SAASA,MAAK,aAAa,cAAc;AAAA,YACnD;AAAA,UACF;AAAA,QACF;AAEA,YAAI;AAEJ,YAAI,YAAY,UAAU;AAIxB,cAAI;AACJ,eAAK,SAAS,yBAAyB,SAAS,sBAAsB,OAAO,UAAU;AACrF,kBAAM,SAAU,OAAO;AAGvB,kBAAMD,YAAW,MAAM,IAAI,SAASE,SAAQ,oBAAoB,GAAG,MAAM;AAAA,UAC3E;AAMA,gBAAM,sBAAsBA,SAAQ,gBAAgB,MAAM,cAAc,UAAU;AAClF,gBAAM,sBAAsB,QAAQ,IAAI,4BAClCN,YAAW,mBAAmB,IAAI,sBAAsB;AAC9D,cAAI,wBAAwB,SAAS,qBAAqB,SAAS,sBAAsB,SAAS,yBAAyB;AACzH,oBAAQ,kBAAkB,IAAI;AAAA,UAChC;AAGA,cAAI,SAAS,mBAAmB;AAC9B,oBAAQ,gBAAgB,IAAI;AAAA,UAC9B;AAEA,mBAAS,MAAM,qBAAqB,YAAY,SAAS,gBAAgB,GAAG;AAAA,QAC9E,WAAW,YAAY,OAAO;AAC5B,mBAAS,MAAM,kBAAkB,YAAY,SAAS,cAAc;AAAA,QACtE,OAAO;AACL,gBAAM,IAAI,MAAM,wBAAwB,OAAO,EAAE;AAAA,QACnD;AAGA,YAAI,SAAS,sBAAsB,OAAO,WAAW,aAAa;AAEhE,gBAAM,WAAW,QAAQ;AACzB,gBAAM,YAAYK,MAAK,aAAa,eAAe;AAEnD,cAAIL,YAAW,QAAQ,GAAG;AACxB,gBAAI;AACF,oBAAM,cAAc,MAAM;AAAA,gBACxB;AAAA,gBACA,EAAE,QAAQ,gBAAgB,QAAQ,UAAU;AAAA,gBAC5C,CAAC,QAAQ;AAAA,cACX;AAEA,kBAAI,YAAY,SAAS;AACvB,uBAAO,KAAK,qCAAqC,SAAS,EAAE;AAAA,cAC9D;AAAA,YACF,SAAS,OAAO;AACd,qBAAO,KAAK,4CAA4C,KAAK,EAAE;AAAA,YACjE;AAAA,UACF;AAGA,mBAAS,MAAM,uBAAuB,QAAQ,QAAQ,MAAM;AAAA,QAC9D;AAGA,cAAM,kBAAkB,gBAAgB,QAAQ,MAAM;AAEtD,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,UACD,SAAS,CAAC,OAAO;AAAA,QACnB;AAAA,MAEF,SAAS,OAAO;AACd,eAAO,MAAM,qBAAqB,IAAI,KAAK,KAAK;AAEhD,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAC7F,CAAC;AAAA,UACD,SAAS;AAAA,QACX;AAAA,MACF,UAAE;AAEA,mBAAW,WAAW,mBAAmB;AACvC,cAAI;AACF,mBAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAChD,mBAAO,KAAK,mCAAmC,OAAO,EAAE;AAAA,UAC1D,SAAS,cAAc;AACrB,mBAAO,MAAM,0CAA0C,OAAO,KAAK,YAAY;AAAA,UACjF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,sBAAsB;AAAA,EACjC,UAAU,MAAM,EAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,EAEjE,OAAO,MAAM,EAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,EAEtE,QAAQ,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,EAE/D,cAAc,MAAM,EAAE,KAAK,CAAC,OAAO,QAAQ,QAAQ,gBAAgB,aAAa,CAAC,EAAE,SAAS,EACzF,SAAS,2BAA2B;AAAA,EAEvC,UAAU,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,EAErE,SAAS,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,EAExE,KAAK,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,EAErE,SAAS,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oBAAoB;AAAA,EAElE,SAAS,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,EAEtE,gBAAgB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAEjG,gBAAgB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,sBAAsB,EACjF,UAAU,CAAC,SAAS,EAAE,aAAa,IAAI,EAAE;AAC9C;AA0BO,IAAM,4BAA4B,MAAM,CAC7C,QACA,WACW;AACX,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,0BAA0B,QAAQ,MAAM;AAAA,EACjD;AAGA,MAAI,SAAS,OAAO;AAEpB,MAAI,OAAO,QAAQ;AACjB,cAAU;AAAA;AAAA,oBAAyB,OAAO,MAAM;AAAA,EAClD;AAEA,MAAI,OAAO,QAAQ;AACjB,cAAU;AAAA;AAAA;AAAA,EAAgC,OAAO,MAAM;AAAA,EACzD;AAEA,SAAO;AACT;AAKO,IAAM,gCAAgC,MAAM,CACjD,QACA,WACW;AACX,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,0BAA0B,QAAQ,MAAM;AAAA,EACjD;AAEA,MAAI,SAAS;AAEb,MAAI,OAAO,YAAY,OAAO,aAAa;AACzC,UAAM,SAAS,OAAO,aAAa,MAAM,QAAQ,OAAO,WAAW,IAAI,OAAO,YAAY,CAAC,IAAI,OAAO;AACtG,cAAU;AAAA;AAAA,qBAA0B,MAAM;AAAA,EAC5C;AAEA,MAAI,OAAO,QAAQ;AACjB,cAAU;AAAA;AAAA;AAAA,EAAgB,OAAO,MAAM;AAAA,EACzC;AAEA,MAAI,OAAO,QAAQ;AACjB,cAAU;AAAA;AAAA;AAAA,EAAgC,OAAO,MAAM;AAAA,EACzD;AAEA,SAAO;AACT;AAMA,eAAe,iBACb,QACAO,SACwB;AACxB,QAAM,EAAE,WAAW,eAAe,WAAW,MAAM,IAAI;AAGvD,MAAI,aAAa,OAAO;AACtB,IAAAA,QAAO,MAAM,+JAA+J;AAC5K,UAAM,IAAI,MAAM,+JAA+J;AAAA,EACjL;AAGA,MAAI,CAAC,WAAW;AACd,WAAO,SAAmB;AAAA,EAC5B;AAGA,MAAI,CAAC,eAAe;AAClB,IAAAA,QAAO,MAAM,gJAAgJ;AAC7J,UAAM,IAAI,MAAM,gJAAgJ;AAAA,EAClK;AAEA,MAAI;AAEF,UAAM,kBAAkB,yBAAyB,aAAuB;AACxE,UAAM,WAAW,aAAuB;AAExC,IAAAA,QAAO,KAAK,oBAAoB,SAAS,kBAAkB,aAAa,aAAa,QAAQ,EAAE;AAG/F,UAAM,EAAE,sBAAAC,sBAAqB,IAAI,MAAM;AACvC,UAAM,gBAAgB,MAAMA;AAAA,MAC1B;AAAA,MACA,EAAE,QAAQ,OAAO;AAAA,MACjB,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,CAAC,cAAc,SAAS;AAC1B,MAAAD,QAAO,MAAM,8BAA8B,cAAc,UAAU,cAAc,KAAK;AACtF,YAAM,IAAI,MAAM,8BAA8B,cAAc,UAAU,cAAc,KAAK,EAAE;AAAA,IAC7F;AAGA,QAAI;AACJ,QAAI;AACF,wBAAkB,KAAK,MAAM,cAAc,MAAM;AAAA,IACnD,SAAS,YAAY;AACnB,MAAAA,QAAO,MAAM,2CAA2C,UAAU;AAClE,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAGA,UAAM,gBAAgB,gBAAgB,KAAK,eAAa;AACtD,YAAM,WAAWE,UAAS,SAAS;AAEnC,aAAO,aAAa,GAAG,SAAS;AAAA,IAClC,CAAC;AAED,QAAI,CAAC,eAAe;AAClB,MAAAF,QAAO,MAAM,UAAU,SAAS,2BAA2B,QAAQ,yBAAyB,gBAAgB,IAAI,OAAKE,UAAS,CAAC,CAAC,CAAC;AACjI,YAAM,IAAI,MAAM,UAAU,SAAS,2BAA2B,QAAQ,GAAG;AAAA,IAC3E;AAEA,IAAAF,QAAO,KAAK,mBAAmB,SAAS,SAAS,aAAa,EAAE;AAChE,WAAO;AAAA,EAET,SAAS,OAAO;AACd,IAAAA,QAAO,MAAM,+BAA+B,KAAK;AACjD,UAAM;AAAA,EACR;AACF;AAKA,eAAe,kBACb,UACA,WACA,QACA,YACAA,SAC6B;AAC7B,MAAI;AAEF,UAAM,WAAW,MAAM,qBAAqB,SAAS;AAGrD,UAAM,gBAAgB,CAAC;AACvB,QAAI,CAAC,SAAS,GAAI,eAAc,KAAK,IAAI;AACzC,QAAI,CAAC,SAAS,KAAM,eAAc,KAAK,MAAM;AAE7C,QAAI,cAAc,SAAS,GAAG;AAC5B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO,4DAA4D,cAAc,KAAK,IAAI,CAAC;AAAA,MAC7F;AAAA,IACF;AAGA,UAAM,iBAAiB,SAAS,QAAQ,IAAI,QAAQ,mBAAmB,EAAE;AACzE,UAAM,eAAe,SAAS,MAAM,IAAI,QAAQ,qBAAqB,EAAE;AAGvE,UAAM,eAAe,CAAC,aAAa,QAAQ,KAAK;AAChD,QAAI,aAAa,SAAS,MAAM,KAAK,SAAS,SAAS,SAAS;AAC9D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO,WAAW,MAAM,2EAA2E,SAAS,IAAI;AAAA,MAClH;AAAA,IACF;AAGA,IAAAG,WAAUC,SAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAGlD,UAAM,SAAkC;AAAA,MACtC;AAAA,MACA,QAAQ;AAAA,MACR,GAAG,CAAC,QAAQ,aAAa,IAAI,MAAM,WAAW,EAAE;AAAA,IAClD;AAEA,IAAAJ,QAAO,KAAK,0BAA0B,QAAQ,gBAAgB,MAAM,OAAO,UAAU,EAAE;AAGvF,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO,kCAAkC,KAAK;AAAA,IAChD;AAAA,EACF;AACF;AAKA,SAAS,oBAAoB,QAAwB;AACnD,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAKA,eAAe,uBACb,QACA,QACAA,SAC6B;AAC7B,MAAI;AACF,UAAM,EAAE,QAAQ,mBAAmB,oBAAoB,kBAAkB,QAAQ,OAAO,WAAW,cAAc,IAAI;AAGrH,QAAI,CAAC,UAAU,CAAC,oBAAoB;AAClC,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,UAAM,WAAW;AAGjB,QAAI,YAA2B;AAE/B,QAAI,OAAO;AACT,kBAAY;AAAA,IACd,WAAW,aAAa,eAAe;AAErC,kBAAY,MAAM,iBAAiB,QAAQA,OAAM;AAAA,IACnD;AAEA,QAAI,CAAC,WAAW;AACd,MAAAA,QAAO,MAAM,2DAA2D;AACxE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ,OAAO,SAAS;AAAA,MAC1B;AAAA,IACF;AAGA,QAAI,QAAQ;AACV,YAAM,eAAe;AAGrB,UAAI,iBAAiB;AACrB,UAAI,CAAC,gBAAgB;AACnB,cAAM,MAAM,oBAAoB,YAAY;AAC5C,yBAAiB,SAAS,QAAQ,SAAS,GAAG;AAAA,MAChD;AAEA,MAAAA,QAAO,KAAK,mCAAmC,QAAQ,iBAAiB,YAAY,EAAE;AAGtF,YAAM,kBAAkB,MAAM;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAA;AAAA,MACF;AAEA,UAAI,gBAAgB,SAAS;AAC3B,YAAI,iBAAiB,OAAO;AAC5B,0BAAkB;AAAA;AAAA,sDAA2D,YAAY;AACzF,0BAAkB;AAAA,+BAAkC,cAAc;AAElE,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,QACV;AAAA,MACF,OAAO;AACL,QAAAA,QAAO,MAAM,gCAAgC,gBAAgB,KAAK;AAClE,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ,OAAO,SAAS;AAAA;AAAA,yCAA8C,gBAAgB,SAAS,gBAAgB,MAAM;AAAA,QACvH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,oBAAoB;AACtB,MAAAA,QAAO,KAAK,yFAAyF;AACrG,MAAAA,QAAO,KAAK,iCAAiC,QAAQ,oBAAoB,kBAAkB,EAAE;AAG7F,YAAM,mBAA0C,MAAM;AAAA,QACpD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,iBAAiB,SAAS;AAE5B,YAAI,iBAAiB,OAAO;AAE5B,YAAI,iBAAiB,YAAY;AAC/B,4BAAkB;AAAA;AAAA;AAClB,4BAAkB;AAAA,8BAAiC,iBAAiB,UAAU;AAAA,QAChF;AAEA,YAAI,iBAAiB,SAAS;AAC5B,4BAAkB;AAAA;AAAA;AAAA;AAClB,4BAAkB,iBAAiB;AAAA,QACrC;AAEA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,QACV;AAAA,MACF,OAAO;AAEL,QAAAA,QAAO,MAAM,4BAA4B,iBAAiB,KAAK;AAC/D,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ,OAAO,SAAS;AAAA;AAAA,qCAA0C,iBAAiB,KAAK;AAAA,QAC1F;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,IAAAA,QAAO,MAAM,sCAAsC,KAAK;AACxD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,OAAO,SAAS;AAAA;AAAA,oCAAyC,KAAK;AAAA,IACxE;AAAA,EACF;AACF;;;ADp3BO,IAAM,uBAA0C;AAAA,EACrD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOK,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,wBAAwB;AAAA,IAC5D,QAAQ,oBAAoB,OAAO;AAAA,IACnC,QAAQA,GAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,eAAe;AAAA,IACnE,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,IAC/E,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,IAC1E,eAAeA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,IACzE,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB,0BAA0B;AAC7C;;;AIvBA,SAAS,KAAAC,UAAS;AAGX,IAAM,qBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,yBAAyB;AAAA,IAC7D,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB,0BAA0B;AAC7C;;;AClBA,SAAS,KAAAC,UAAS;AAGX,IAAM,0BAA6C;AAAA,EACxD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,MAAMC,GAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,IACtD,QAAQA,GAAE,KAAK,CAAC,OAAO,gBAAgB,eAAe,aAAa,QAAQ,KAAK,CAAC,EAC9E,SAAS,0IAA0I;AAAA,IACtJ,QAAQ,oBAAoB,OAAO;AAAA,IACnC,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAClB,SAAS,sHAAsH;AAAA,IAClI,aAAaA,GAAE,OAAO,EAAE,SAAS,EAC9B,SAAS,2EAA2E;AAAA,IACvF,2BAA2BA,GAAE,QAAQ,EAAE,SAAS,EAC7C,SAAS,6EAA6E;AAAA,IACzF,sBAAsBA,GAAE,QAAQ,EAAE,SAAS,EACxC,SAAS,mEAAmE;AAAA,IAC/E,6BAA6BA,GAAE,QAAQ,EAAE,SAAS,EAC/C,SAAS,iFAAiF;AAAA,IAC7F,6BAA6BA,GAAE,QAAQ,EAAE,SAAS,EAC/C,SAAS,qEAAqE;AAAA,IACjF,kBAAkBA,GAAE,OAAO,EAAE,SAAS,EACnC,SAAS,wFAAwF;AAAA,IACpG,uBAAuBA,GAAE,KAAK,CAAC,OAAO,eAAe,eAAe,CAAC,EAAE,SAAS,EAC7E,SAAS,sEAAsE;AAAA,IAClF,2BAA2BA,GAAE,OAAO,EAAE,SAAS,EAC5C,SAAS,oJAAoJ;AAAA,IAChK,SAASA,GAAE,OAAO,EAAE,SAAS,EAC1B,SAAS,qFAAqF;AAAA,IACjG,eAAeA,GAAE,KAAK,CAAC,QAAQ,SAAS,SAAS,OAAO,CAAC,EAAE,SAAS,EACjE,SAAS,4DAA4D;AAAA,IACxE,qBAAqBA,GAAE,QAAQ,EAAE,SAAS,EACvC,SAAS,mFAAmF;AAAA,IAC/F,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB,0BAA0B;AAC7C;;;AChDA,SAAS,KAAAC,UAAS;AAGX,IAAM,4BAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,UAAUA,GAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,IAC3D,SAASA,GAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,IAC5D,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,IACzD,QAAQA,GAAE,KAAK,CAAC,OAAO,QAAQ,gBAAgB,aAAa,CAAC,EAAE,SAAS,EACrE,SAAS,2BAA2B;AAAA,IACvC,qBAAqBA,GAAE,OAAO,EAAE,SAAS,EACtC,SAAS,2CAA2C;AAAA,IACvD,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,IAClE,KAAKA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,IAC/D,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oBAAoB;AAAA,IAC5D,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;;;AC1BA,SAAS,KAAAC,UAAS;AAGX,IAAM,2BAA8C;AAAA,EACzD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,UAAUC,GAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,IAC5D,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,IAC7E,eAAeA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,IAC7E,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,IAC9E,cAAcA,GAAE,KAAK,CAAC,QAAQ,aAAa,QAAQ,CAAC,EAAE,SAAS,EAC5D,SAAS,4DAA4D;AAAA,IACxE,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,IAClE,KAAKA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,IAC/D,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,WAAWA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,IACrF,cAAcA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,IACxF,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB,8BAA8B;AACjD;;;ACrBA;AAFA,SAAS,KAAAC,UAAS;AAClB,SAAS,gBAAgB;AAczB,eAAsB,kBAAkB,UAAkB,WAA2C;AACnG,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AAEpB,YAAM,iBAAiB,IAAI,OAAO,gBAAgB,UAAU,QAAQ,uBAAuB,MAAM,CAAC,MAAM;AACxG,YAAM,QAAQ,eAAe,KAAK,IAAI;AAEtC,UAAI,OAAO;AACT,cAAM,aAAa,IAAI;AAEvB,cAAM,iBAAiB,MAAM,QAAQ,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAC9D,cAAM,YAAY,iBAAiB;AACnC,cAAM,UAAU,YAAY,UAAU,SAAS;AAE/C,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,eAAe,SAAS,wBAAwB,QAAQ,EAAE;AAAA,EAC5E,SAAS,OAAO;AACd,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,mBAAmB,GAAG;AACzE,YAAM;AAAA,IACR;AACA,UAAM,IAAI,MAAM,gCAAgC,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACzH;AACF;AAKO,SAAS,8BAA8B,QAAyB;AACrE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAMA,GAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,MAC1D,MAAMA,GAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,IACvD;AAAA,IACA,OAAO,EAAE,MAAM,KAAK,MAAM;AACxB,UAAI;AACF,cAAM,WAAW,MAAM,kBAAkB,MAAM,IAAI;AACnD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,CAAC;AAAA,QACrE;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,iCAAiC,KAAK;AACnD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AChFA;AAFA,SAAS,KAAAC,UAAS;AAClB,SAAS,YAAAC,iBAAgB;AAkBzB,eAAsB,sBAAsB,UAAkB,eAAmD;AAC/G,MAAI;AACF,UAAM,UAAU,MAAMA,UAAS,UAAU,OAAO;AAChD,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAM,cAAc,cAAc,QAAQ,uBAAuB,MAAM;AAEvE,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AAIpB,YAAM,wBAAwB,IAAI,OAAO,oBAAoB,WAAW,UAAU;AAClF,UAAI,QAAQ,sBAAsB,KAAK,IAAI;AAK3C,UAAI,CAAC,OAAO;AACV,cAAM,kBAAkB,IAAI,OAAO,4FAA4F,WAAW,UAAU;AACpJ,gBAAQ,gBAAgB,KAAK,IAAI;AAAA,MACnC;AAEA,UAAI,OAAO;AACT,cAAM,aAAa,IAAI;AAEvB,cAAM,qBAAqB,MAAM,QAAQ,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAClE,cAAM,YAAY,qBAAqB;AACvC,cAAM,UAAU,YAAY,cAAc,SAAS;AAEnD,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,mBAAmB,aAAa,wBAAwB,QAAQ,EAAE;AAAA,EACpF,SAAS,OAAO;AACd,QAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,mBAAmB,GAAG;AACzE,YAAM;AAAA,IACR;AACA,UAAM,IAAI,MAAM,gCAAgC,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACzH;AACF;AAKO,SAAS,kCAAkC,QAAyB;AACzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAMD,GAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,MAC1D,MAAMA,GAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,IAC3D;AAAA,IACA,OAAO,EAAE,MAAM,KAAK,MAAM;AACxB,UAAI;AACF,cAAM,WAAW,MAAM,sBAAsB,MAAM,IAAI;AACvD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,CAAC;AAAA,QACrE;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,qCAAqC,KAAK;AACvD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrGA,SAAS,KAAAE,UAAS;;;ACAlB,YAAY,QAAQ;AACpB,YAAY,UAAU;;;ACJtB,SAAS,UAAU,SAAS;AAC1B,SAAQ,OAAO,YAAY,eAAiB,YAAY;AAC1D;AAGA,SAAS,SAAS,SAAS;AACzB,SAAQ,OAAO,YAAY,YAAc,YAAY;AACvD;AAGA,SAAS,QAAQ,UAAU;AACzB,MAAI,MAAM,QAAQ,QAAQ,EAAG,QAAO;AAAA,WAC3B,UAAU,QAAQ,EAAG,QAAO,CAAC;AAEtC,SAAO,CAAE,QAAS;AACpB;AAGA,SAAS,OAAO,QAAQ,QAAQ;AAC9B,MAAI,OAAO,QAAQ,KAAK;AAExB,MAAI,QAAQ;AACV,iBAAa,OAAO,KAAK,MAAM;AAE/B,SAAK,QAAQ,GAAG,SAAS,WAAW,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtE,YAAM,WAAW,KAAK;AACtB,aAAO,GAAG,IAAI,OAAO,GAAG;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,OAAO,QAAQ,OAAO;AAC7B,MAAI,SAAS,IAAI;AAEjB,OAAK,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;AACzC,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAGA,SAAS,eAAe,QAAQ;AAC9B,SAAQ,WAAW,KAAO,OAAO,sBAAsB,IAAI;AAC7D;AAGA,IAAI,cAAmB;AACvB,IAAI,aAAmB;AACvB,IAAI,YAAmB;AACvB,IAAI,WAAmB;AACvB,IAAI,mBAAmB;AACvB,IAAI,WAAmB;AAEvB,IAAI,SAAS;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,QAAQ;AACT;AAKA,SAAS,YAAYC,YAAW,SAAS;AACvC,MAAI,QAAQ,IAAI,UAAUA,WAAU,UAAU;AAE9C,MAAI,CAACA,WAAU,KAAM,QAAO;AAE5B,MAAIA,WAAU,KAAK,MAAM;AACvB,aAAS,SAASA,WAAU,KAAK,OAAO;AAAA,EAC1C;AAEA,WAAS,OAAOA,WAAU,KAAK,OAAO,KAAK,OAAOA,WAAU,KAAK,SAAS,KAAK;AAE/E,MAAI,CAAC,WAAWA,WAAU,KAAK,SAAS;AACtC,aAAS,SAASA,WAAU,KAAK;AAAA,EACnC;AAEA,SAAO,UAAU,MAAM;AACzB;AAGA,SAAS,gBAAgB,QAAQ,MAAM;AAErC,QAAM,KAAK,IAAI;AAEf,OAAK,OAAO;AACZ,OAAK,SAAS;AACd,OAAK,OAAO;AACZ,OAAK,UAAU,YAAY,MAAM,KAAK;AAGtC,MAAI,MAAM,mBAAmB;AAE3B,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,EAChD,OAAO;AAEL,SAAK,QAAS,IAAI,MAAM,EAAG,SAAS;AAAA,EACtC;AACF;AAIA,gBAAgB,YAAY,OAAO,OAAO,MAAM,SAAS;AACzD,gBAAgB,UAAU,cAAc;AAGxC,gBAAgB,UAAU,WAAW,SAAS,SAAS,SAAS;AAC9D,SAAO,KAAK,OAAO,OAAO,YAAY,MAAM,OAAO;AACrD;AAGA,IAAI,YAAY;AAGhB,SAAS,QAAQ,QAAQ,WAAW,SAAS,UAAU,eAAe;AACpE,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,gBAAgB,KAAK,MAAM,gBAAgB,CAAC,IAAI;AAEpD,MAAI,WAAW,YAAY,eAAe;AACxC,WAAO;AACP,gBAAY,WAAW,gBAAgB,KAAK;AAAA,EAC9C;AAEA,MAAI,UAAU,WAAW,eAAe;AACtC,WAAO;AACP,cAAU,WAAW,gBAAgB,KAAK;AAAA,EAC5C;AAEA,SAAO;AAAA,IACL,KAAK,OAAO,OAAO,MAAM,WAAW,OAAO,EAAE,QAAQ,OAAO,QAAG,IAAI;AAAA,IACnE,KAAK,WAAW,YAAY,KAAK;AAAA;AAAA,EACnC;AACF;AAGA,SAAS,SAAS,QAAQ,KAAK;AAC7B,SAAO,OAAO,OAAO,KAAK,MAAM,OAAO,MAAM,IAAI;AACnD;AAGA,SAAS,YAAY,MAAM,SAAS;AAClC,YAAU,OAAO,OAAO,WAAW,IAAI;AAEvC,MAAI,CAAC,KAAK,OAAQ,QAAO;AAEzB,MAAI,CAAC,QAAQ,UAAW,SAAQ,YAAY;AAC5C,MAAI,OAAO,QAAQ,WAAgB,SAAU,SAAQ,SAAc;AACnE,MAAI,OAAO,QAAQ,gBAAgB,SAAU,SAAQ,cAAc;AACnE,MAAI,OAAO,QAAQ,eAAgB,SAAU,SAAQ,aAAc;AAEnE,MAAI,KAAK;AACT,MAAI,aAAa,CAAE,CAAE;AACrB,MAAI,WAAW,CAAC;AAChB,MAAI;AACJ,MAAI,cAAc;AAElB,SAAQ,QAAQ,GAAG,KAAK,KAAK,MAAM,GAAI;AACrC,aAAS,KAAK,MAAM,KAAK;AACzB,eAAW,KAAK,MAAM,QAAQ,MAAM,CAAC,EAAE,MAAM;AAE7C,QAAI,KAAK,YAAY,MAAM,SAAS,cAAc,GAAG;AACnD,oBAAc,WAAW,SAAS;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,cAAc,EAAG,eAAc,WAAW,SAAS;AAEvD,MAAI,SAAS,IAAI,GAAG;AACpB,MAAI,eAAe,KAAK,IAAI,KAAK,OAAO,QAAQ,YAAY,SAAS,MAAM,EAAE,SAAS,EAAE;AACxF,MAAI,gBAAgB,QAAQ,aAAa,QAAQ,SAAS,eAAe;AAEzE,OAAK,IAAI,GAAG,KAAK,QAAQ,aAAa,KAAK;AACzC,QAAI,cAAc,IAAI,EAAG;AACzB,WAAO;AAAA,MACL,KAAK;AAAA,MACL,WAAW,cAAc,CAAC;AAAA,MAC1B,SAAS,cAAc,CAAC;AAAA,MACxB,KAAK,YAAY,WAAW,WAAW,IAAI,WAAW,cAAc,CAAC;AAAA,MACrE;AAAA,IACF;AACA,aAAS,OAAO,OAAO,KAAK,QAAQ,MAAM,IAAI,UAAU,KAAK,OAAO,IAAI,GAAG,SAAS,GAAG,YAAY,IACjG,QAAQ,KAAK,MAAM,OAAO;AAAA,EAC9B;AAEA,SAAO,QAAQ,KAAK,QAAQ,WAAW,WAAW,GAAG,SAAS,WAAW,GAAG,KAAK,UAAU,aAAa;AACxG,YAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,IAAI,UAAU,KAAK,OAAO,GAAG,SAAS,GAAG,YAAY,IAC9F,QAAQ,KAAK,MAAM;AACrB,YAAU,OAAO,OAAO,KAAK,QAAQ,SAAS,eAAe,IAAI,KAAK,GAAG,IAAI;AAE7E,OAAK,IAAI,GAAG,KAAK,QAAQ,YAAY,KAAK;AACxC,QAAI,cAAc,KAAK,SAAS,OAAQ;AACxC,WAAO;AAAA,MACL,KAAK;AAAA,MACL,WAAW,cAAc,CAAC;AAAA,MAC1B,SAAS,cAAc,CAAC;AAAA,MACxB,KAAK,YAAY,WAAW,WAAW,IAAI,WAAW,cAAc,CAAC;AAAA,MACrE;AAAA,IACF;AACA,cAAU,OAAO,OAAO,KAAK,QAAQ,MAAM,IAAI,UAAU,KAAK,OAAO,IAAI,GAAG,SAAS,GAAG,YAAY,IAClG,QAAQ,KAAK,MAAM;AAAA,EACvB;AAEA,SAAO,OAAO,QAAQ,OAAO,EAAE;AACjC;AAGA,IAAI,UAAU;AAEd,IAAI,2BAA2B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAI,kBAAkB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,oBAAoBC,MAAK;AAChC,MAAI,SAAS,CAAC;AAEd,MAAIA,SAAQ,MAAM;AAChB,WAAO,KAAKA,IAAG,EAAE,QAAQ,SAAU,OAAO;AACxC,MAAAA,KAAI,KAAK,EAAE,QAAQ,SAAU,OAAO;AAClC,eAAO,OAAO,KAAK,CAAC,IAAI;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,OAAO,KAAK,SAAS;AAC5B,YAAU,WAAW,CAAC;AAEtB,SAAO,KAAK,OAAO,EAAE,QAAQ,SAAU,MAAM;AAC3C,QAAI,yBAAyB,QAAQ,IAAI,MAAM,IAAI;AACjD,YAAM,IAAI,UAAU,qBAAqB,OAAO,gCAAgC,MAAM,cAAc;AAAA,IACtG;AAAA,EACF,CAAC;AAGD,OAAK,UAAgB;AACrB,OAAK,MAAgB;AACrB,OAAK,OAAgB,QAAQ,MAAM,KAAc;AACjD,OAAK,UAAgB,QAAQ,SAAS,KAAW,WAAY;AAAE,WAAO;AAAA,EAAM;AAC5E,OAAK,YAAgB,QAAQ,WAAW,KAAS,SAAU,MAAM;AAAE,WAAO;AAAA,EAAM;AAChF,OAAK,aAAgB,QAAQ,YAAY,KAAQ;AACjD,OAAK,YAAgB,QAAQ,WAAW,KAAS;AACjD,OAAK,YAAgB,QAAQ,WAAW,KAAS;AACjD,OAAK,gBAAgB,QAAQ,eAAe,KAAK;AACjD,OAAK,eAAgB,QAAQ,cAAc,KAAM;AACjD,OAAK,QAAgB,QAAQ,OAAO,KAAa;AACjD,OAAK,eAAgB,oBAAoB,QAAQ,cAAc,KAAK,IAAI;AAExE,MAAI,gBAAgB,QAAQ,KAAK,IAAI,MAAM,IAAI;AAC7C,UAAM,IAAI,UAAU,mBAAmB,KAAK,OAAO,yBAAyB,MAAM,cAAc;AAAA,EAClG;AACF;AAEA,IAAI,OAAO;AAQX,SAAS,YAAYC,SAAQ,MAAM;AACjC,MAAI,SAAS,CAAC;AAEd,EAAAA,QAAO,IAAI,EAAE,QAAQ,SAAU,aAAa;AAC1C,QAAI,WAAW,OAAO;AAEtB,WAAO,QAAQ,SAAU,cAAc,eAAe;AACpD,UAAI,aAAa,QAAQ,YAAY,OACjC,aAAa,SAAS,YAAY,QAClC,aAAa,UAAU,YAAY,OAAO;AAE5C,mBAAW;AAAA,MACb;AAAA,IACF,CAAC;AAED,WAAO,QAAQ,IAAI;AAAA,EACrB,CAAC;AAED,SAAO;AACT;AAGA,SAAS,aAA2B;AAClC,MAAI,SAAS;AAAA,IACP,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,IACV,UAAU,CAAC;AAAA,IACX,OAAO;AAAA,MACL,QAAQ,CAAC;AAAA,MACT,UAAU,CAAC;AAAA,MACX,SAAS,CAAC;AAAA,MACV,UAAU,CAAC;AAAA,IACb;AAAA,EACF,GAAG,OAAO;AAEd,WAAS,YAAYC,OAAM;AACzB,QAAIA,MAAK,OAAO;AACd,aAAO,MAAMA,MAAK,IAAI,EAAE,KAAKA,KAAI;AACjC,aAAO,MAAM,UAAU,EAAE,KAAKA,KAAI;AAAA,IACpC,OAAO;AACL,aAAOA,MAAK,IAAI,EAAEA,MAAK,GAAG,IAAI,OAAO,UAAU,EAAEA,MAAK,GAAG,IAAIA;AAAA,IAC/D;AAAA,EACF;AAEA,OAAK,QAAQ,GAAG,SAAS,UAAU,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACrE,cAAU,KAAK,EAAE,QAAQ,WAAW;AAAA,EACtC;AACA,SAAO;AACT;AAGA,SAAS,SAAS,YAAY;AAC5B,SAAO,KAAK,OAAO,UAAU;AAC/B;AAGA,SAAS,UAAU,SAAS,SAASC,QAAO,YAAY;AACtD,MAAI,WAAW,CAAC;AAChB,MAAI,WAAW,CAAC;AAEhB,MAAI,sBAAsB,MAAM;AAE9B,aAAS,KAAK,UAAU;AAAA,EAE1B,WAAW,MAAM,QAAQ,UAAU,GAAG;AAEpC,eAAW,SAAS,OAAO,UAAU;AAAA,EAEvC,WAAW,eAAe,MAAM,QAAQ,WAAW,QAAQ,KAAK,MAAM,QAAQ,WAAW,QAAQ,IAAI;AAEnG,QAAI,WAAW,SAAU,YAAW,SAAS,OAAO,WAAW,QAAQ;AACvE,QAAI,WAAW,SAAU,YAAW,SAAS,OAAO,WAAW,QAAQ;AAAA,EAEzE,OAAO;AACL,UAAM,IAAI,UAAU,kHAC6C;AAAA,EACnE;AAEA,WAAS,QAAQ,SAAU,QAAQ;AACjC,QAAI,EAAE,kBAAkB,OAAO;AAC7B,YAAM,IAAI,UAAU,oFAAoF;AAAA,IAC1G;AAEA,QAAI,OAAO,YAAY,OAAO,aAAa,UAAU;AACnD,YAAM,IAAI,UAAU,iHAAiH;AAAA,IACvI;AAEA,QAAI,OAAO,OAAO;AAChB,YAAM,IAAI,UAAU,oGAAoG;AAAA,IAC1H;AAAA,EACF,CAAC;AAED,WAAS,QAAQ,SAAU,QAAQ;AACjC,QAAI,EAAE,kBAAkB,OAAO;AAC7B,YAAM,IAAI,UAAU,oFAAoF;AAAA,IAC1G;AAAA,EACF,CAAC;AAED,MAAI,SAAS,OAAO,OAAO,SAAS,SAAS;AAE7C,SAAO,YAAY,KAAK,YAAY,CAAC,GAAG,OAAO,QAAQ;AACvD,SAAO,YAAY,KAAK,YAAY,CAAC,GAAG,OAAO,QAAQ;AAEvD,SAAO,mBAAmB,YAAY,QAAQ,UAAU;AACxD,SAAO,mBAAmB,YAAY,QAAQ,UAAU;AACxD,SAAO,kBAAmB,WAAW,OAAO,kBAAkB,OAAO,gBAAgB;AAErF,SAAO;AACT;AAGA,IAAI,SAAS;AAEb,IAAI,MAAM,IAAI,KAAK,yBAAyB;AAAA,EAC1C,MAAM;AAAA,EACN,WAAW,SAAU,MAAM;AAAE,WAAO,SAAS,OAAO,OAAO;AAAA,EAAI;AACjE,CAAC;AAED,IAAI,MAAM,IAAI,KAAK,yBAAyB;AAAA,EAC1C,MAAM;AAAA,EACN,WAAW,SAAU,MAAM;AAAE,WAAO,SAAS,OAAO,OAAO,CAAC;AAAA,EAAG;AACjE,CAAC;AAED,IAAI,MAAM,IAAI,KAAK,yBAAyB;AAAA,EAC1C,MAAM;AAAA,EACN,WAAW,SAAU,MAAM;AAAE,WAAO,SAAS,OAAO,OAAO,CAAC;AAAA,EAAG;AACjE,CAAC;AAED,IAAI,WAAW,IAAI,OAAO;AAAA,EACxB,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,SAAS,gBAAgB,MAAM;AAC7B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,MAAM,KAAK;AAEf,SAAQ,QAAQ,KAAK,SAAS,OACtB,QAAQ,MAAM,SAAS,UAAU,SAAS,UAAU,SAAS;AACvE;AAEA,SAAS,oBAAoB;AAC3B,SAAO;AACT;AAEA,SAAS,OAAO,QAAQ;AACtB,SAAO,WAAW;AACpB;AAEA,IAAI,QAAQ,IAAI,KAAK,0BAA0B;AAAA,EAC7C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,IACT,WAAW,WAAY;AAAE,aAAO;AAAA,IAAQ;AAAA,IACxC,WAAW,WAAY;AAAE,aAAO;AAAA,IAAQ;AAAA,IACxC,WAAW,WAAY;AAAE,aAAO;AAAA,IAAQ;AAAA,IACxC,WAAW,WAAY;AAAE,aAAO;AAAA,IAAQ;AAAA,IACxC,OAAW,WAAY;AAAE,aAAO;AAAA,IAAQ;AAAA,EAC1C;AAAA,EACA,cAAc;AAChB,CAAC;AAED,SAAS,mBAAmB,MAAM;AAChC,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,MAAM,KAAK;AAEf,SAAQ,QAAQ,MAAM,SAAS,UAAU,SAAS,UAAU,SAAS,WAC7D,QAAQ,MAAM,SAAS,WAAW,SAAS,WAAW,SAAS;AACzE;AAEA,SAAS,qBAAqB,MAAM;AAClC,SAAO,SAAS,UACT,SAAS,UACT,SAAS;AAClB;AAEA,SAAS,UAAU,QAAQ;AACzB,SAAO,OAAO,UAAU,SAAS,KAAK,MAAM,MAAM;AACpD;AAEA,IAAI,OAAO,IAAI,KAAK,0BAA0B;AAAA,EAC5C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,IACT,WAAW,SAAU,QAAQ;AAAE,aAAO,SAAS,SAAS;AAAA,IAAS;AAAA,IACjE,WAAW,SAAU,QAAQ;AAAE,aAAO,SAAS,SAAS;AAAA,IAAS;AAAA,IACjE,WAAW,SAAU,QAAQ;AAAE,aAAO,SAAS,SAAS;AAAA,IAAS;AAAA,EACnE;AAAA,EACA,cAAc;AAChB,CAAC;AAED,SAAS,UAAU,GAAG;AACpB,SAAS,MAAe,KAAO,KAAK,MAC3B,MAAe,KAAO,KAAK,MAC3B,MAAe,KAAO,KAAK;AACtC;AAEA,SAAS,UAAU,GAAG;AACpB,SAAS,MAAe,KAAO,KAAK;AACtC;AAEA,SAAS,UAAU,GAAG;AACpB,SAAS,MAAe,KAAO,KAAK;AACtC;AAEA,SAAS,mBAAmB,MAAM;AAChC,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,MAAM,KAAK,QACX,QAAQ,GACR,YAAY,OACZ;AAEJ,MAAI,CAAC,IAAK,QAAO;AAEjB,OAAK,KAAK,KAAK;AAGf,MAAI,OAAO,OAAO,OAAO,KAAK;AAC5B,SAAK,KAAK,EAAE,KAAK;AAAA,EACnB;AAEA,MAAI,OAAO,KAAK;AAEd,QAAI,QAAQ,MAAM,IAAK,QAAO;AAC9B,SAAK,KAAK,EAAE,KAAK;AAIjB,QAAI,OAAO,KAAK;AAEd;AAEA,aAAO,QAAQ,KAAK,SAAS;AAC3B,aAAK,KAAK,KAAK;AACf,YAAI,OAAO,IAAK;AAChB,YAAI,OAAO,OAAO,OAAO,IAAK,QAAO;AACrC,oBAAY;AAAA,MACd;AACA,aAAO,aAAa,OAAO;AAAA,IAC7B;AAGA,QAAI,OAAO,KAAK;AAEd;AAEA,aAAO,QAAQ,KAAK,SAAS;AAC3B,aAAK,KAAK,KAAK;AACf,YAAI,OAAO,IAAK;AAChB,YAAI,CAAC,UAAU,KAAK,WAAW,KAAK,CAAC,EAAG,QAAO;AAC/C,oBAAY;AAAA,MACd;AACA,aAAO,aAAa,OAAO;AAAA,IAC7B;AAGA,QAAI,OAAO,KAAK;AAEd;AAEA,aAAO,QAAQ,KAAK,SAAS;AAC3B,aAAK,KAAK,KAAK;AACf,YAAI,OAAO,IAAK;AAChB,YAAI,CAAC,UAAU,KAAK,WAAW,KAAK,CAAC,EAAG,QAAO;AAC/C,oBAAY;AAAA,MACd;AACA,aAAO,aAAa,OAAO;AAAA,IAC7B;AAAA,EACF;AAKA,MAAI,OAAO,IAAK,QAAO;AAEvB,SAAO,QAAQ,KAAK,SAAS;AAC3B,SAAK,KAAK,KAAK;AACf,QAAI,OAAO,IAAK;AAChB,QAAI,CAAC,UAAU,KAAK,WAAW,KAAK,CAAC,GAAG;AACtC,aAAO;AAAA,IACT;AACA,gBAAY;AAAA,EACd;AAGA,MAAI,CAAC,aAAa,OAAO,IAAK,QAAO;AAErC,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAM;AAClC,MAAI,QAAQ,MAAM,OAAO,GAAG;AAE5B,MAAI,MAAM,QAAQ,GAAG,MAAM,IAAI;AAC7B,YAAQ,MAAM,QAAQ,MAAM,EAAE;AAAA,EAChC;AAEA,OAAK,MAAM,CAAC;AAEZ,MAAI,OAAO,OAAO,OAAO,KAAK;AAC5B,QAAI,OAAO,IAAK,QAAO;AACvB,YAAQ,MAAM,MAAM,CAAC;AACrB,SAAK,MAAM,CAAC;AAAA,EACd;AAEA,MAAI,UAAU,IAAK,QAAO;AAE1B,MAAI,OAAO,KAAK;AACd,QAAI,MAAM,CAAC,MAAM,IAAK,QAAO,OAAO,SAAS,MAAM,MAAM,CAAC,GAAG,CAAC;AAC9D,QAAI,MAAM,CAAC,MAAM,IAAK,QAAO,OAAO,SAAS,MAAM,MAAM,CAAC,GAAG,EAAE;AAC/D,QAAI,MAAM,CAAC,MAAM,IAAK,QAAO,OAAO,SAAS,MAAM,MAAM,CAAC,GAAG,CAAC;AAAA,EAChE;AAEA,SAAO,OAAO,SAAS,OAAO,EAAE;AAClC;AAEA,SAAS,UAAU,QAAQ;AACzB,SAAQ,OAAO,UAAU,SAAS,KAAK,MAAM,MAAO,sBAC5C,SAAS,MAAM,KAAK,CAAC,OAAO,eAAe,MAAM;AAC3D;AAEA,IAAI,MAAM,IAAI,KAAK,yBAAyB;AAAA,EAC1C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,IACT,QAAa,SAAU,KAAK;AAAE,aAAO,OAAO,IAAI,OAAO,IAAI,SAAS,CAAC,IAAI,QAAQ,IAAI,SAAS,CAAC,EAAE,MAAM,CAAC;AAAA,IAAG;AAAA,IAC3G,OAAa,SAAU,KAAK;AAAE,aAAO,OAAO,IAAI,OAAQ,IAAI,SAAS,CAAC,IAAI,QAAS,IAAI,SAAS,CAAC,EAAE,MAAM,CAAC;AAAA,IAAG;AAAA,IAC7G,SAAa,SAAU,KAAK;AAAE,aAAO,IAAI,SAAS,EAAE;AAAA,IAAG;AAAA;AAAA,IAEvD,aAAa,SAAU,KAAK;AAAE,aAAO,OAAO,IAAI,OAAO,IAAI,SAAS,EAAE,EAAE,YAAY,IAAK,QAAQ,IAAI,SAAS,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC;AAAA,IAAG;AAAA,EAC5I;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,IACZ,QAAa,CAAE,GAAI,KAAM;AAAA,IACzB,OAAa,CAAE,GAAI,KAAM;AAAA,IACzB,SAAa,CAAE,IAAI,KAAM;AAAA,IACzB,aAAa,CAAE,IAAI,KAAM;AAAA,EAC3B;AACF,CAAC;AAED,IAAI,qBAAqB,IAAI;AAAA;AAAA,EAE3B;AAOuB;AAEzB,SAAS,iBAAiB,MAAM;AAC9B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,CAAC,mBAAmB,KAAK,IAAI;AAAA;AAAA,EAG7B,KAAK,KAAK,SAAS,CAAC,MAAM,KAAK;AACjC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAM;AAChC,MAAI,OAAO;AAEX,UAAS,KAAK,QAAQ,MAAM,EAAE,EAAE,YAAY;AAC5C,SAAS,MAAM,CAAC,MAAM,MAAM,KAAK;AAEjC,MAAI,KAAK,QAAQ,MAAM,CAAC,CAAC,KAAK,GAAG;AAC/B,YAAQ,MAAM,MAAM,CAAC;AAAA,EACvB;AAEA,MAAI,UAAU,QAAQ;AACpB,WAAQ,SAAS,IAAK,OAAO,oBAAoB,OAAO;AAAA,EAE1D,WAAW,UAAU,QAAQ;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,OAAO,WAAW,OAAO,EAAE;AACpC;AAGA,IAAI,yBAAyB;AAE7B,SAAS,mBAAmB,QAAQ,OAAO;AACzC,MAAI;AAEJ,MAAI,MAAM,MAAM,GAAG;AACjB,YAAQ,OAAO;AAAA,MACb,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,IAC3B;AAAA,EACF,WAAW,OAAO,sBAAsB,QAAQ;AAC9C,YAAQ,OAAO;AAAA,MACb,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,IAC3B;AAAA,EACF,WAAW,OAAO,sBAAsB,QAAQ;AAC9C,YAAQ,OAAO;AAAA,MACb,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,MACzB,KAAK;AAAa,eAAO;AAAA,IAC3B;AAAA,EACF,WAAW,OAAO,eAAe,MAAM,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,SAAS,EAAE;AAKxB,SAAO,uBAAuB,KAAK,GAAG,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI;AACrE;AAEA,SAAS,QAAQ,QAAQ;AACvB,SAAQ,OAAO,UAAU,SAAS,KAAK,MAAM,MAAM,sBAC3C,SAAS,MAAM,KAAK,OAAO,eAAe,MAAM;AAC1D;AAEA,IAAI,QAAQ,IAAI,KAAK,2BAA2B;AAAA,EAC9C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAChB,CAAC;AAED,IAAI,OAAO,SAAS,OAAO;AAAA,EACzB,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAED,IAAI,OAAO;AAEX,IAAI,mBAAmB,IAAI;AAAA,EACzB;AAEgB;AAElB,IAAI,wBAAwB,IAAI;AAAA,EAC9B;AASwB;AAE1B,SAAS,qBAAqB,MAAM;AAClC,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,iBAAiB,KAAK,IAAI,MAAM,KAAM,QAAO;AACjD,MAAI,sBAAsB,KAAK,IAAI,MAAM,KAAM,QAAO;AACtD,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAM;AACpC,MAAI,OAAO,MAAM,OAAO,KAAK,MAAM,QAAQ,QAAQ,WAAW,GAC1D,QAAQ,MAAM,SAAS,WAAW;AAEtC,UAAQ,iBAAiB,KAAK,IAAI;AAClC,MAAI,UAAU,KAAM,SAAQ,sBAAsB,KAAK,IAAI;AAE3D,MAAI,UAAU,KAAM,OAAM,IAAI,MAAM,oBAAoB;AAIxD,SAAO,CAAE,MAAM,CAAC;AAChB,UAAQ,CAAE,MAAM,CAAC,IAAK;AACtB,QAAM,CAAE,MAAM,CAAC;AAEf,MAAI,CAAC,MAAM,CAAC,GAAG;AACb,WAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,EAC5C;AAIA,SAAO,CAAE,MAAM,CAAC;AAChB,WAAS,CAAE,MAAM,CAAC;AAClB,WAAS,CAAE,MAAM,CAAC;AAElB,MAAI,MAAM,CAAC,GAAG;AACZ,eAAW,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC;AAC9B,WAAO,SAAS,SAAS,GAAG;AAC1B,kBAAY;AAAA,IACd;AACA,eAAW,CAAC;AAAA,EACd;AAIA,MAAI,MAAM,CAAC,GAAG;AACZ,cAAU,CAAE,MAAM,EAAE;AACpB,gBAAY,EAAE,MAAM,EAAE,KAAK;AAC3B,aAAS,UAAU,KAAK,aAAa;AACrC,QAAI,MAAM,CAAC,MAAM,IAAK,SAAQ,CAAC;AAAA,EACjC;AAEA,SAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM,QAAQ,QAAQ,QAAQ,CAAC;AAE1E,MAAI,MAAO,MAAK,QAAQ,KAAK,QAAQ,IAAI,KAAK;AAE9C,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAoB;AAClD,SAAO,OAAO,YAAY;AAC5B;AAEA,IAAI,YAAY,IAAI,KAAK,+BAA+B;AAAA,EACtD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AACb,CAAC;AAED,SAAS,iBAAiB,MAAM;AAC9B,SAAO,SAAS,QAAQ,SAAS;AACnC;AAEA,IAAI,QAAQ,IAAI,KAAK,2BAA2B;AAAA,EAC9C,MAAM;AAAA,EACN,SAAS;AACX,CAAC;AASD,IAAI,aAAa;AAGjB,SAAS,kBAAkB,MAAM;AAC/B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,MAAM,KAAK,SAAS,GAAG,MAAM,KAAK,QAAQH,OAAM;AAGpD,OAAK,MAAM,GAAG,MAAM,KAAK,OAAO;AAC9B,WAAOA,KAAI,QAAQ,KAAK,OAAO,GAAG,CAAC;AAGnC,QAAI,OAAO,GAAI;AAGf,QAAI,OAAO,EAAG,QAAO;AAErB,cAAU;AAAA,EACZ;AAGA,SAAQ,SAAS,MAAO;AAC1B;AAEA,SAAS,oBAAoB,MAAM;AACjC,MAAI,KAAK,UACL,QAAQ,KAAK,QAAQ,YAAY,EAAE,GACnC,MAAM,MAAM,QACZA,OAAM,YACN,OAAO,GACP,SAAS,CAAC;AAId,OAAK,MAAM,GAAG,MAAM,KAAK,OAAO;AAC9B,QAAK,MAAM,MAAM,KAAM,KAAK;AAC1B,aAAO,KAAM,QAAQ,KAAM,GAAI;AAC/B,aAAO,KAAM,QAAQ,IAAK,GAAI;AAC9B,aAAO,KAAK,OAAO,GAAI;AAAA,IACzB;AAEA,WAAQ,QAAQ,IAAKA,KAAI,QAAQ,MAAM,OAAO,GAAG,CAAC;AAAA,EACpD;AAIA,aAAY,MAAM,IAAK;AAEvB,MAAI,aAAa,GAAG;AAClB,WAAO,KAAM,QAAQ,KAAM,GAAI;AAC/B,WAAO,KAAM,QAAQ,IAAK,GAAI;AAC9B,WAAO,KAAK,OAAO,GAAI;AAAA,EACzB,WAAW,aAAa,IAAI;AAC1B,WAAO,KAAM,QAAQ,KAAM,GAAI;AAC/B,WAAO,KAAM,QAAQ,IAAK,GAAI;AAAA,EAChC,WAAW,aAAa,IAAI;AAC1B,WAAO,KAAM,QAAQ,IAAK,GAAI;AAAA,EAChC;AAEA,SAAO,IAAI,WAAW,MAAM;AAC9B;AAEA,SAAS,oBAAoB,QAAoB;AAC/C,MAAI,SAAS,IAAI,OAAO,GAAG,KAAK,MAC5B,MAAM,OAAO,QACbA,OAAM;AAIV,OAAK,MAAM,GAAG,MAAM,KAAK,OAAO;AAC9B,QAAK,MAAM,MAAM,KAAM,KAAK;AAC1B,gBAAUA,KAAK,QAAQ,KAAM,EAAI;AACjC,gBAAUA,KAAK,QAAQ,KAAM,EAAI;AACjC,gBAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,gBAAUA,KAAI,OAAO,EAAI;AAAA,IAC3B;AAEA,YAAQ,QAAQ,KAAK,OAAO,GAAG;AAAA,EACjC;AAIA,SAAO,MAAM;AAEb,MAAI,SAAS,GAAG;AACd,cAAUA,KAAK,QAAQ,KAAM,EAAI;AACjC,cAAUA,KAAK,QAAQ,KAAM,EAAI;AACjC,cAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,cAAUA,KAAI,OAAO,EAAI;AAAA,EAC3B,WAAW,SAAS,GAAG;AACrB,cAAUA,KAAK,QAAQ,KAAM,EAAI;AACjC,cAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,cAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,cAAUA,KAAI,EAAE;AAAA,EAClB,WAAW,SAAS,GAAG;AACrB,cAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,cAAUA,KAAK,QAAQ,IAAK,EAAI;AAChC,cAAUA,KAAI,EAAE;AAChB,cAAUA,KAAI,EAAE;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,KAAK;AACrB,SAAO,OAAO,UAAU,SAAS,KAAK,GAAG,MAAO;AAClD;AAEA,IAAI,SAAS,IAAI,KAAK,4BAA4B;AAAA,EAChD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb,CAAC;AAED,IAAI,oBAAoB,OAAO,UAAU;AACzC,IAAI,cAAoB,OAAO,UAAU;AAEzC,SAAS,gBAAgB,MAAM;AAC7B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,aAAa,CAAC,GAAG,OAAO,QAAQ,MAAM,SAAS,YAC/C,SAAS;AAEb,OAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,WAAO,OAAO,KAAK;AACnB,iBAAa;AAEb,QAAI,YAAY,KAAK,IAAI,MAAM,kBAAmB,QAAO;AAEzD,SAAK,WAAW,MAAM;AACpB,UAAI,kBAAkB,KAAK,MAAM,OAAO,GAAG;AACzC,YAAI,CAAC,WAAY,cAAa;AAAA,YACzB,QAAO;AAAA,MACd;AAAA,IACF;AAEA,QAAI,CAAC,WAAY,QAAO;AAExB,QAAI,WAAW,QAAQ,OAAO,MAAM,GAAI,YAAW,KAAK,OAAO;AAAA,QAC1D,QAAO;AAAA,EACd;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAM;AAC/B,SAAO,SAAS,OAAO,OAAO,CAAC;AACjC;AAEA,IAAI,OAAO,IAAI,KAAK,0BAA0B;AAAA,EAC5C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AACb,CAAC;AAED,IAAI,cAAc,OAAO,UAAU;AAEnC,SAAS,iBAAiB,MAAM;AAC9B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,OAAO,QAAQ,MAAM,MAAM,QAC3B,SAAS;AAEb,WAAS,IAAI,MAAM,OAAO,MAAM;AAEhC,OAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,WAAO,OAAO,KAAK;AAEnB,QAAI,YAAY,KAAK,IAAI,MAAM,kBAAmB,QAAO;AAEzD,WAAO,OAAO,KAAK,IAAI;AAEvB,QAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,WAAO,KAAK,IAAI,CAAE,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAE;AAAA,EAC3C;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAM;AAChC,MAAI,SAAS,KAAM,QAAO,CAAC;AAE3B,MAAI,OAAO,QAAQ,MAAM,MAAM,QAC3B,SAAS;AAEb,WAAS,IAAI,MAAM,OAAO,MAAM;AAEhC,OAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,WAAO,OAAO,KAAK;AAEnB,WAAO,OAAO,KAAK,IAAI;AAEvB,WAAO,KAAK,IAAI,CAAE,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAE;AAAA,EAC3C;AAEA,SAAO;AACT;AAEA,IAAI,QAAQ,IAAI,KAAK,2BAA2B;AAAA,EAC9C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AACb,CAAC;AAED,IAAI,oBAAoB,OAAO,UAAU;AAEzC,SAAS,eAAe,MAAM;AAC5B,MAAI,SAAS,KAAM,QAAO;AAE1B,MAAI,KAAK,SAAS;AAElB,OAAK,OAAO,QAAQ;AAClB,QAAI,kBAAkB,KAAK,QAAQ,GAAG,GAAG;AACvC,UAAI,OAAO,GAAG,MAAM,KAAM,QAAO;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAM;AAC9B,SAAO,SAAS,OAAO,OAAO,CAAC;AACjC;AAEA,IAAI,MAAM,IAAI,KAAK,yBAAyB;AAAA,EAC1C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AACb,CAAC;AAED,IAAI,WAAW,KAAK,OAAO;AAAA,EACzB,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF,CAAC;AAUD,IAAI,oBAAoB,OAAO,UAAU;AAGzC,IAAI,kBAAoB;AACxB,IAAI,mBAAoB;AACxB,IAAI,mBAAoB;AACxB,IAAI,oBAAoB;AAGxB,IAAI,gBAAiB;AACrB,IAAI,iBAAiB;AACrB,IAAI,gBAAiB;AAGrB,IAAI,wBAAgC;AACpC,IAAI,gCAAgC;AACpC,IAAI,0BAAgC;AACpC,IAAI,qBAAgC;AACpC,IAAI,kBAAgC;AAGpC,SAAS,OAAO,KAAK;AAAE,SAAO,OAAO,UAAU,SAAS,KAAK,GAAG;AAAG;AAEnE,SAAS,OAAO,GAAG;AACjB,SAAQ,MAAM,MAAkB,MAAM;AACxC;AAEA,SAAS,eAAe,GAAG;AACzB,SAAQ,MAAM,KAAmB,MAAM;AACzC;AAEA,SAAS,aAAa,GAAG;AACvB,SAAQ,MAAM,KACN,MAAM,MACN,MAAM,MACN,MAAM;AAChB;AAEA,SAAS,kBAAkB,GAAG;AAC5B,SAAO,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,OACN,MAAM;AACf;AAEA,SAAS,YAAY,GAAG;AACtB,MAAI;AAEJ,MAAK,MAAe,KAAO,KAAK,IAAc;AAC5C,WAAO,IAAI;AAAA,EACb;AAGA,OAAK,IAAI;AAET,MAAK,MAAe,MAAQ,MAAM,KAAc;AAC9C,WAAO,KAAK,KAAO;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,GAAG;AACxB,MAAI,MAAM,KAAa;AAAE,WAAO;AAAA,EAAG;AACnC,MAAI,MAAM,KAAa;AAAE,WAAO;AAAA,EAAG;AACnC,MAAI,MAAM,IAAa;AAAE,WAAO;AAAA,EAAG;AACnC,SAAO;AACT;AAEA,SAAS,gBAAgB,GAAG;AAC1B,MAAK,MAAe,KAAO,KAAK,IAAc;AAC5C,WAAO,IAAI;AAAA,EACb;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,GAAG;AAE/B,SAAQ,MAAM,KAAe,OACtB,MAAM,KAAe,SACrB,MAAM,KAAe,OACrB,MAAM,MAAe,MACrB,MAAM,IAAiB,MACvB,MAAM,MAAe,OACrB,MAAM,MAAe,OACrB,MAAM,MAAe,OACrB,MAAM,MAAe,OACrB,MAAM,MAAe,SACrB,MAAM,KAAmB,MACzB,MAAM,KAAe,MACrB,MAAM,KAAe,MACrB,MAAM,KAAe,OACrB,MAAM,KAAe,SACrB,MAAM,KAAe,SACrB,MAAM,KAAe,WACrB,MAAM,KAAe,WAAW;AACzC;AAEA,SAAS,kBAAkB,GAAG;AAC5B,MAAI,KAAK,OAAQ;AACf,WAAO,OAAO,aAAa,CAAC;AAAA,EAC9B;AAGA,SAAO,OAAO;AAAA,KACV,IAAI,SAAa,MAAM;AAAA,KACvB,IAAI,QAAY,QAAU;AAAA,EAC9B;AACF;AAIA,SAAS,YAAY,QAAQ,KAAK,OAAO;AAEvC,MAAI,QAAQ,aAAa;AACvB,WAAO,eAAe,QAAQ,KAAK;AAAA,MACjC,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,OAAO;AACL,WAAO,GAAG,IAAI;AAAA,EAChB;AACF;AAEA,IAAI,oBAAoB,IAAI,MAAM,GAAG;AACrC,IAAI,kBAAkB,IAAI,MAAM,GAAG;AACnC,KAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,oBAAkB,CAAC,IAAI,qBAAqB,CAAC,IAAI,IAAI;AACrD,kBAAgB,CAAC,IAAI,qBAAqB,CAAC;AAC7C;AAHS;AAMT,SAAS,QAAQ,OAAO,SAAS;AAC/B,OAAK,QAAQ;AAEb,OAAK,WAAY,QAAQ,UAAU,KAAM;AACzC,OAAK,SAAY,QAAQ,QAAQ,KAAQ;AACzC,OAAK,YAAY,QAAQ,WAAW,KAAK;AAGzC,OAAK,SAAY,QAAQ,QAAQ,KAAQ;AAEzC,OAAK,OAAY,QAAQ,MAAM,KAAU;AACzC,OAAK,WAAY,QAAQ,UAAU,KAAM;AAEzC,OAAK,gBAAgB,KAAK,OAAO;AACjC,OAAK,UAAgB,KAAK,OAAO;AAEjC,OAAK,SAAa,MAAM;AACxB,OAAK,WAAa;AAClB,OAAK,OAAa;AAClB,OAAK,YAAa;AAClB,OAAK,aAAa;AAIlB,OAAK,iBAAiB;AAEtB,OAAK,YAAY,CAAC;AAYpB;AAGA,SAAS,cAAc,OAAO,SAAS;AACrC,MAAI,OAAO;AAAA,IACT,MAAU,MAAM;AAAA,IAChB,QAAU,MAAM,MAAM,MAAM,GAAG,EAAE;AAAA;AAAA,IACjC,UAAU,MAAM;AAAA,IAChB,MAAU,MAAM;AAAA,IAChB,QAAU,MAAM,WAAW,MAAM;AAAA,EACnC;AAEA,OAAK,UAAU,QAAQ,IAAI;AAE3B,SAAO,IAAI,UAAU,SAAS,IAAI;AACpC;AAEA,SAAS,WAAW,OAAO,SAAS;AAClC,QAAM,cAAc,OAAO,OAAO;AACpC;AAEA,SAAS,aAAa,OAAO,SAAS;AACpC,MAAI,MAAM,WAAW;AACnB,UAAM,UAAU,KAAK,MAAM,cAAc,OAAO,OAAO,CAAC;AAAA,EAC1D;AACF;AAGA,IAAI,oBAAoB;AAAA,EAEtB,MAAM,SAAS,oBAAoB,OAAO,MAAM,MAAM;AAEpD,QAAI,OAAO,OAAO;AAElB,QAAI,MAAM,YAAY,MAAM;AAC1B,iBAAW,OAAO,gCAAgC;AAAA,IACpD;AAEA,QAAI,KAAK,WAAW,GAAG;AACrB,iBAAW,OAAO,6CAA6C;AAAA,IACjE;AAEA,YAAQ,uBAAuB,KAAK,KAAK,CAAC,CAAC;AAE3C,QAAI,UAAU,MAAM;AAClB,iBAAW,OAAO,2CAA2C;AAAA,IAC/D;AAEA,YAAQ,SAAS,MAAM,CAAC,GAAG,EAAE;AAC7B,YAAQ,SAAS,MAAM,CAAC,GAAG,EAAE;AAE7B,QAAI,UAAU,GAAG;AACf,iBAAW,OAAO,2CAA2C;AAAA,IAC/D;AAEA,UAAM,UAAU,KAAK,CAAC;AACtB,UAAM,kBAAmB,QAAQ;AAEjC,QAAI,UAAU,KAAK,UAAU,GAAG;AAC9B,mBAAa,OAAO,0CAA0C;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,KAAK,SAAS,mBAAmB,OAAO,MAAM,MAAM;AAElD,QAAI,QAAQ;AAEZ,QAAI,KAAK,WAAW,GAAG;AACrB,iBAAW,OAAO,6CAA6C;AAAA,IACjE;AAEA,aAAS,KAAK,CAAC;AACf,aAAS,KAAK,CAAC;AAEf,QAAI,CAAC,mBAAmB,KAAK,MAAM,GAAG;AACpC,iBAAW,OAAO,6DAA6D;AAAA,IACjF;AAEA,QAAI,kBAAkB,KAAK,MAAM,QAAQ,MAAM,GAAG;AAChD,iBAAW,OAAO,gDAAgD,SAAS,cAAc;AAAA,IAC3F;AAEA,QAAI,CAAC,gBAAgB,KAAK,MAAM,GAAG;AACjC,iBAAW,OAAO,8DAA8D;AAAA,IAClF;AAEA,QAAI;AACF,eAAS,mBAAmB,MAAM;AAAA,IACpC,SAAS,KAAK;AACZ,iBAAW,OAAO,8BAA8B,MAAM;AAAA,IACxD;AAEA,UAAM,OAAO,MAAM,IAAI;AAAA,EACzB;AACF;AAGA,SAAS,eAAe,OAAO,OAAO,KAAK,WAAW;AACpD,MAAI,WAAW,SAAS,YAAY;AAEpC,MAAI,QAAQ,KAAK;AACf,cAAU,MAAM,MAAM,MAAM,OAAO,GAAG;AAEtC,QAAI,WAAW;AACb,WAAK,YAAY,GAAG,UAAU,QAAQ,QAAQ,YAAY,SAAS,aAAa,GAAG;AACjF,qBAAa,QAAQ,WAAW,SAAS;AACzC,YAAI,EAAE,eAAe,KACd,MAAQ,cAAc,cAAc,UAAY;AACrD,qBAAW,OAAO,+BAA+B;AAAA,QACnD;AAAA,MACF;AAAA,IACF,WAAW,sBAAsB,KAAK,OAAO,GAAG;AAC9C,iBAAW,OAAO,8CAA8C;AAAA,IAClE;AAEA,UAAM,UAAU;AAAA,EAClB;AACF;AAEA,SAAS,cAAc,OAAO,aAAa,QAAQ,iBAAiB;AAClE,MAAI,YAAY,KAAK,OAAO;AAE5B,MAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,eAAW,OAAO,mEAAmE;AAAA,EACvF;AAEA,eAAa,OAAO,KAAK,MAAM;AAE/B,OAAK,QAAQ,GAAG,WAAW,WAAW,QAAQ,QAAQ,UAAU,SAAS,GAAG;AAC1E,UAAM,WAAW,KAAK;AAEtB,QAAI,CAAC,kBAAkB,KAAK,aAAa,GAAG,GAAG;AAC7C,kBAAY,aAAa,KAAK,OAAO,GAAG,CAAC;AACzC,sBAAgB,GAAG,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,WAC1E,WAAW,gBAAgB,UAAU;AAErC,MAAI,OAAO;AAKX,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,cAAU,MAAM,UAAU,MAAM,KAAK,OAAO;AAE5C,SAAK,QAAQ,GAAG,WAAW,QAAQ,QAAQ,QAAQ,UAAU,SAAS,GAAG;AACvE,UAAI,MAAM,QAAQ,QAAQ,KAAK,CAAC,GAAG;AACjC,mBAAW,OAAO,6CAA6C;AAAA,MACjE;AAEA,UAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,KAAK,CAAC,MAAM,mBAAmB;AAC/E,gBAAQ,KAAK,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAKA,MAAI,OAAO,YAAY,YAAY,OAAO,OAAO,MAAM,mBAAmB;AACxE,cAAU;AAAA,EACZ;AAGA,YAAU,OAAO,OAAO;AAExB,MAAI,YAAY,MAAM;AACpB,cAAU,CAAC;AAAA,EACb;AAEA,MAAI,WAAW,2BAA2B;AACxC,QAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,WAAK,QAAQ,GAAG,WAAW,UAAU,QAAQ,QAAQ,UAAU,SAAS,GAAG;AACzE,sBAAc,OAAO,SAAS,UAAU,KAAK,GAAG,eAAe;AAAA,MACjE;AAAA,IACF,OAAO;AACL,oBAAc,OAAO,SAAS,WAAW,eAAe;AAAA,IAC1D;AAAA,EACF,OAAO;AACL,QAAI,CAAC,MAAM,QACP,CAAC,kBAAkB,KAAK,iBAAiB,OAAO,KAChD,kBAAkB,KAAK,SAAS,OAAO,GAAG;AAC5C,YAAM,OAAO,aAAa,MAAM;AAChC,YAAM,YAAY,kBAAkB,MAAM;AAC1C,YAAM,WAAW,YAAY,MAAM;AACnC,iBAAW,OAAO,wBAAwB;AAAA,IAC5C;AAEA,gBAAY,SAAS,SAAS,SAAS;AACvC,WAAO,gBAAgB,OAAO;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAO;AAC5B,MAAI;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,IAAc;AACvB,UAAM;AAAA,EACR,WAAW,OAAO,IAAc;AAC9B,UAAM;AACN,QAAI,MAAM,MAAM,WAAW,MAAM,QAAQ,MAAM,IAAc;AAC3D,YAAM;AAAA,IACR;AAAA,EACF,OAAO;AACL,eAAW,OAAO,0BAA0B;AAAA,EAC9C;AAEA,QAAM,QAAQ;AACd,QAAM,YAAY,MAAM;AACxB,QAAM,iBAAiB;AACzB;AAEA,SAAS,oBAAoB,OAAO,eAAe,aAAa;AAC9D,MAAI,aAAa,GACb,KAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE9C,SAAO,OAAO,GAAG;AACf,WAAO,eAAe,EAAE,GAAG;AACzB,UAAI,OAAO,KAAiB,MAAM,mBAAmB,IAAI;AACvD,cAAM,iBAAiB,MAAM;AAAA,MAC/B;AACA,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C;AAEA,QAAI,iBAAiB,OAAO,IAAa;AACvC,SAAG;AACD,aAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,MAC9C,SAAS,OAAO,MAAgB,OAAO,MAAgB,OAAO;AAAA,IAChE;AAEA,QAAI,OAAO,EAAE,GAAG;AACd,oBAAc,KAAK;AAEnB,WAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC1C;AACA,YAAM,aAAa;AAEnB,aAAO,OAAO,IAAiB;AAC7B,cAAM;AACN,aAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,MAC9C;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,MAAM,eAAe,KAAK,MAAM,aAAa,aAAa;AAC5E,iBAAa,OAAO,uBAAuB;AAAA,EAC7C;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAO;AACpC,MAAI,YAAY,MAAM,UAClB;AAEJ,OAAK,MAAM,MAAM,WAAW,SAAS;AAIrC,OAAK,OAAO,MAAe,OAAO,OAC9B,OAAO,MAAM,MAAM,WAAW,YAAY,CAAC,KAC3C,OAAO,MAAM,MAAM,WAAW,YAAY,CAAC,GAAG;AAEhD,iBAAa;AAEb,SAAK,MAAM,MAAM,WAAW,SAAS;AAErC,QAAI,OAAO,KAAK,aAAa,EAAE,GAAG;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAO,OAAO;AACtC,MAAI,UAAU,GAAG;AACf,UAAM,UAAU;AAAA,EAClB,WAAW,QAAQ,GAAG;AACpB,UAAM,UAAU,OAAO,OAAO,MAAM,QAAQ,CAAC;AAAA,EAC/C;AACF;AAGA,SAAS,gBAAgB,OAAO,YAAY,sBAAsB;AAChE,MAAI,WACA,WACA,cACA,YACA,mBACA,OACA,YACA,aACA,QAAQ,MAAM,MACd,UAAU,MAAM,QAChB;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,aAAa,EAAE,KACf,kBAAkB,EAAE,KACpB,OAAO,MACP,OAAO,MACP,OAAO,MACP,OAAO,MACP,OAAO,OACP,OAAO,MACP,OAAO,MACP,OAAO,MACP,OAAO,MACP,OAAO,MACP,OAAO,IAAa;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,MAAe,OAAO,IAAa;AAC5C,gBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AAErD,QAAI,aAAa,SAAS,KACtB,wBAAwB,kBAAkB,SAAS,GAAG;AACxD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,OAAO;AACb,QAAM,SAAS;AACf,iBAAe,aAAa,MAAM;AAClC,sBAAoB;AAEpB,SAAO,OAAO,GAAG;AACf,QAAI,OAAO,IAAa;AACtB,kBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AAErD,UAAI,aAAa,SAAS,KACtB,wBAAwB,kBAAkB,SAAS,GAAG;AACxD;AAAA,MACF;AAAA,IAEF,WAAW,OAAO,IAAa;AAC7B,kBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AAErD,UAAI,aAAa,SAAS,GAAG;AAC3B;AAAA,MACF;AAAA,IAEF,WAAY,MAAM,aAAa,MAAM,aAAa,sBAAsB,KAAK,KAClE,wBAAwB,kBAAkB,EAAE,GAAG;AACxD;AAAA,IAEF,WAAW,OAAO,EAAE,GAAG;AACrB,cAAQ,MAAM;AACd,mBAAa,MAAM;AACnB,oBAAc,MAAM;AACpB,0BAAoB,OAAO,OAAO,EAAE;AAEpC,UAAI,MAAM,cAAc,YAAY;AAClC,4BAAoB;AACpB,aAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC1C;AAAA,MACF,OAAO;AACL,cAAM,WAAW;AACjB,cAAM,OAAO;AACb,cAAM,YAAY;AAClB,cAAM,aAAa;AACnB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,mBAAmB;AACrB,qBAAe,OAAO,cAAc,YAAY,KAAK;AACrD,uBAAiB,OAAO,MAAM,OAAO,KAAK;AAC1C,qBAAe,aAAa,MAAM;AAClC,0BAAoB;AAAA,IACtB;AAEA,QAAI,CAAC,eAAe,EAAE,GAAG;AACvB,mBAAa,MAAM,WAAW;AAAA,IAChC;AAEA,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,EAC9C;AAEA,iBAAe,OAAO,cAAc,YAAY,KAAK;AAErD,MAAI,MAAM,QAAQ;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO;AACb,QAAM,SAAS;AACf,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAO,YAAY;AACjD,MAAI,IACA,cAAc;AAElB,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,IAAa;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO;AACb,QAAM,SAAS;AACf,QAAM;AACN,iBAAe,aAAa,MAAM;AAElC,UAAQ,KAAK,MAAM,MAAM,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC1D,QAAI,OAAO,IAAa;AACtB,qBAAe,OAAO,cAAc,MAAM,UAAU,IAAI;AACxD,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,UAAI,OAAO,IAAa;AACtB,uBAAe,MAAM;AACrB,cAAM;AACN,qBAAa,MAAM;AAAA,MACrB,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IAEF,WAAW,OAAO,EAAE,GAAG;AACrB,qBAAe,OAAO,cAAc,YAAY,IAAI;AACpD,uBAAiB,OAAO,oBAAoB,OAAO,OAAO,UAAU,CAAC;AACrE,qBAAe,aAAa,MAAM;AAAA,IAEpC,WAAW,MAAM,aAAa,MAAM,aAAa,sBAAsB,KAAK,GAAG;AAC7E,iBAAW,OAAO,8DAA8D;AAAA,IAElF,OAAO;AACL,YAAM;AACN,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,aAAW,OAAO,4DAA4D;AAChF;AAEA,SAAS,uBAAuB,OAAO,YAAY;AACjD,MAAI,cACA,YACA,WACA,WACA,KACA;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,IAAa;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO;AACb,QAAM,SAAS;AACf,QAAM;AACN,iBAAe,aAAa,MAAM;AAElC,UAAQ,KAAK,MAAM,MAAM,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC1D,QAAI,OAAO,IAAa;AACtB,qBAAe,OAAO,cAAc,MAAM,UAAU,IAAI;AACxD,YAAM;AACN,aAAO;AAAA,IAET,WAAW,OAAO,IAAa;AAC7B,qBAAe,OAAO,cAAc,MAAM,UAAU,IAAI;AACxD,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,UAAI,OAAO,EAAE,GAAG;AACd,4BAAoB,OAAO,OAAO,UAAU;AAAA,MAG9C,WAAW,KAAK,OAAO,kBAAkB,EAAE,GAAG;AAC5C,cAAM,UAAU,gBAAgB,EAAE;AAClC,cAAM;AAAA,MAER,YAAY,MAAM,cAAc,EAAE,KAAK,GAAG;AACxC,oBAAY;AACZ,oBAAY;AAEZ,eAAO,YAAY,GAAG,aAAa;AACjC,eAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,eAAK,MAAM,YAAY,EAAE,MAAM,GAAG;AAChC,yBAAa,aAAa,KAAK;AAAA,UAEjC,OAAO;AACL,uBAAW,OAAO,gCAAgC;AAAA,UACpD;AAAA,QACF;AAEA,cAAM,UAAU,kBAAkB,SAAS;AAE3C,cAAM;AAAA,MAER,OAAO;AACL,mBAAW,OAAO,yBAAyB;AAAA,MAC7C;AAEA,qBAAe,aAAa,MAAM;AAAA,IAEpC,WAAW,OAAO,EAAE,GAAG;AACrB,qBAAe,OAAO,cAAc,YAAY,IAAI;AACpD,uBAAiB,OAAO,oBAAoB,OAAO,OAAO,UAAU,CAAC;AACrE,qBAAe,aAAa,MAAM;AAAA,IAEpC,WAAW,MAAM,aAAa,MAAM,aAAa,sBAAsB,KAAK,GAAG;AAC7E,iBAAW,OAAO,8DAA8D;AAAA,IAElF,OAAO;AACL,YAAM;AACN,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,aAAW,OAAO,4DAA4D;AAChF;AAEA,SAAS,mBAAmB,OAAO,YAAY;AAC7C,MAAI,WAAW,MACX,OACA,YACA,MACA,OAAW,MAAM,KACjB,SACA,UAAW,MAAM,QACjB,WACA,YACA,QACA,gBACA,WACA,kBAAkB,uBAAO,OAAO,IAAI,GACpC,SACA,QACA,WACA;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,IAAa;AACtB,iBAAa;AACb,gBAAY;AACZ,cAAU,CAAC;AAAA,EACb,WAAW,OAAO,KAAa;AAC7B,iBAAa;AACb,gBAAY;AACZ,cAAU,CAAC;AAAA,EACb,OAAO;AACL,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,WAAW,MAAM;AACzB,UAAM,UAAU,MAAM,MAAM,IAAI;AAAA,EAClC;AAEA,OAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,SAAO,OAAO,GAAG;AACf,wBAAoB,OAAO,MAAM,UAAU;AAE3C,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,QAAI,OAAO,YAAY;AACrB,YAAM;AACN,YAAM,MAAM;AACZ,YAAM,SAAS;AACf,YAAM,OAAO,YAAY,YAAY;AACrC,YAAM,SAAS;AACf,aAAO;AAAA,IACT,WAAW,CAAC,UAAU;AACpB,iBAAW,OAAO,8CAA8C;AAAA,IAClE,WAAW,OAAO,IAAa;AAE7B,iBAAW,OAAO,0CAA0C;AAAA,IAC9D;AAEA,aAAS,UAAU,YAAY;AAC/B,aAAS,iBAAiB;AAE1B,QAAI,OAAO,IAAa;AACtB,kBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AAErD,UAAI,aAAa,SAAS,GAAG;AAC3B,iBAAS,iBAAiB;AAC1B,cAAM;AACN,4BAAoB,OAAO,MAAM,UAAU;AAAA,MAC7C;AAAA,IACF;AAEA,YAAQ,MAAM;AACd,iBAAa,MAAM;AACnB,WAAO,MAAM;AACb,gBAAY,OAAO,YAAY,iBAAiB,OAAO,IAAI;AAC3D,aAAS,MAAM;AACf,cAAU,MAAM;AAChB,wBAAoB,OAAO,MAAM,UAAU;AAE3C,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,SAAK,kBAAkB,MAAM,SAAS,UAAU,OAAO,IAAa;AAClE,eAAS;AACT,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAC5C,0BAAoB,OAAO,MAAM,UAAU;AAC3C,kBAAY,OAAO,YAAY,iBAAiB,OAAO,IAAI;AAC3D,kBAAY,MAAM;AAAA,IACpB;AAEA,QAAI,WAAW;AACb,uBAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,WAAW,OAAO,YAAY,IAAI;AAAA,IACvG,WAAW,QAAQ;AACjB,cAAQ,KAAK,iBAAiB,OAAO,MAAM,iBAAiB,QAAQ,SAAS,WAAW,OAAO,YAAY,IAAI,CAAC;AAAA,IAClH,OAAO;AACL,cAAQ,KAAK,OAAO;AAAA,IACtB;AAEA,wBAAoB,OAAO,MAAM,UAAU;AAE3C,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,QAAI,OAAO,IAAa;AACtB,iBAAW;AACX,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C,OAAO;AACL,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,aAAW,OAAO,uDAAuD;AAC3E;AAEA,SAAS,gBAAgB,OAAO,YAAY;AAC1C,MAAI,cACA,SACA,WAAiB,eACjB,iBAAiB,OACjB,iBAAiB,OACjB,aAAiB,YACjB,aAAiB,GACjB,iBAAiB,OACjB,KACA;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,KAAa;AACtB,cAAU;AAAA,EACZ,WAAW,OAAO,IAAa;AAC7B,cAAU;AAAA,EACZ,OAAO;AACL,WAAO;AAAA,EACT;AAEA,QAAM,OAAO;AACb,QAAM,SAAS;AAEf,SAAO,OAAO,GAAG;AACf,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,QAAI,OAAO,MAAe,OAAO,IAAa;AAC5C,UAAI,kBAAkB,UAAU;AAC9B,mBAAY,OAAO,KAAe,gBAAgB;AAAA,MACpD,OAAO;AACL,mBAAW,OAAO,sCAAsC;AAAA,MAC1D;AAAA,IAEF,YAAY,MAAM,gBAAgB,EAAE,MAAM,GAAG;AAC3C,UAAI,QAAQ,GAAG;AACb,mBAAW,OAAO,8EAA8E;AAAA,MAClG,WAAW,CAAC,gBAAgB;AAC1B,qBAAa,aAAa,MAAM;AAChC,yBAAiB;AAAA,MACnB,OAAO;AACL,mBAAW,OAAO,2CAA2C;AAAA,MAC/D;AAAA,IAEF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,MAAI,eAAe,EAAE,GAAG;AACtB,OAAG;AAAE,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAAG,SAC7C,eAAe,EAAE;AAExB,QAAI,OAAO,IAAa;AACtB,SAAG;AAAE,aAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,MAAG,SAC7C,CAAC,OAAO,EAAE,KAAM,OAAO;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,OAAO,GAAG;AACf,kBAAc,KAAK;AACnB,UAAM,aAAa;AAEnB,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,YAAQ,CAAC,kBAAkB,MAAM,aAAa,eACtC,OAAO,IAAkB;AAC/B,YAAM;AACN,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C;AAEA,QAAI,CAAC,kBAAkB,MAAM,aAAa,YAAY;AACpD,mBAAa,MAAM;AAAA,IACrB;AAEA,QAAI,OAAO,EAAE,GAAG;AACd;AACA;AAAA,IACF;AAGA,QAAI,MAAM,aAAa,YAAY;AAGjC,UAAI,aAAa,eAAe;AAC9B,cAAM,UAAU,OAAO,OAAO,MAAM,iBAAiB,IAAI,aAAa,UAAU;AAAA,MAClF,WAAW,aAAa,eAAe;AACrC,YAAI,gBAAgB;AAClB,gBAAM,UAAU;AAAA,QAClB;AAAA,MACF;AAGA;AAAA,IACF;AAGA,QAAI,SAAS;AAGX,UAAI,eAAe,EAAE,GAAG;AACtB,yBAAiB;AAEjB,cAAM,UAAU,OAAO,OAAO,MAAM,iBAAiB,IAAI,aAAa,UAAU;AAAA,MAGlF,WAAW,gBAAgB;AACzB,yBAAiB;AACjB,cAAM,UAAU,OAAO,OAAO,MAAM,aAAa,CAAC;AAAA,MAGpD,WAAW,eAAe,GAAG;AAC3B,YAAI,gBAAgB;AAClB,gBAAM,UAAU;AAAA,QAClB;AAAA,MAGF,OAAO;AACL,cAAM,UAAU,OAAO,OAAO,MAAM,UAAU;AAAA,MAChD;AAAA,IAGF,OAAO;AAEL,YAAM,UAAU,OAAO,OAAO,MAAM,iBAAiB,IAAI,aAAa,UAAU;AAAA,IAClF;AAEA,qBAAiB;AACjB,qBAAiB;AACjB,iBAAa;AACb,mBAAe,MAAM;AAErB,WAAO,CAAC,OAAO,EAAE,KAAM,OAAO,GAAI;AAChC,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C;AAEA,mBAAe,OAAO,cAAc,MAAM,UAAU,KAAK;AAAA,EAC3D;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAO,YAAY;AAC5C,MAAI,OACA,OAAY,MAAM,KAClB,UAAY,MAAM,QAClB,UAAY,CAAC,GACb,WACA,WAAY,OACZ;AAIJ,MAAI,MAAM,mBAAmB,GAAI,QAAO;AAExC,MAAI,MAAM,WAAW,MAAM;AACzB,UAAM,UAAU,MAAM,MAAM,IAAI;AAAA,EAClC;AAEA,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,SAAO,OAAO,GAAG;AACf,QAAI,MAAM,mBAAmB,IAAI;AAC/B,YAAM,WAAW,MAAM;AACvB,iBAAW,OAAO,gDAAgD;AAAA,IACpE;AAEA,QAAI,OAAO,IAAa;AACtB;AAAA,IACF;AAEA,gBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AAErD,QAAI,CAAC,aAAa,SAAS,GAAG;AAC5B;AAAA,IACF;AAEA,eAAW;AACX,UAAM;AAEN,QAAI,oBAAoB,OAAO,MAAM,EAAE,GAAG;AACxC,UAAI,MAAM,cAAc,YAAY;AAClC,gBAAQ,KAAK,IAAI;AACjB,aAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC1C;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,MAAM;AACd,gBAAY,OAAO,YAAY,kBAAkB,OAAO,IAAI;AAC5D,YAAQ,KAAK,MAAM,MAAM;AACzB,wBAAoB,OAAO,MAAM,EAAE;AAEnC,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,SAAK,MAAM,SAAS,SAAS,MAAM,aAAa,eAAgB,OAAO,GAAI;AACzE,iBAAW,OAAO,qCAAqC;AAAA,IACzD,WAAW,MAAM,aAAa,YAAY;AACxC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,UAAM,MAAM;AACZ,UAAM,SAAS;AACf,UAAM,OAAO;AACb,UAAM,SAAS;AACf,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAO,YAAY,YAAY;AACvD,MAAI,WACA,cACA,OACA,UACA,eACA,SACA,OAAgB,MAAM,KACtB,UAAgB,MAAM,QACtB,UAAgB,CAAC,GACjB,kBAAkB,uBAAO,OAAO,IAAI,GACpC,SAAgB,MAChB,UAAgB,MAChB,YAAgB,MAChB,gBAAgB,OAChB,WAAgB,OAChB;AAIJ,MAAI,MAAM,mBAAmB,GAAI,QAAO;AAExC,MAAI,MAAM,WAAW,MAAM;AACzB,UAAM,UAAU,MAAM,MAAM,IAAI;AAAA,EAClC;AAEA,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,SAAO,OAAO,GAAG;AACf,QAAI,CAAC,iBAAiB,MAAM,mBAAmB,IAAI;AACjD,YAAM,WAAW,MAAM;AACvB,iBAAW,OAAO,gDAAgD;AAAA,IACpE;AAEA,gBAAY,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC;AACrD,YAAQ,MAAM;AAMd,SAAK,OAAO,MAAe,OAAO,OAAgB,aAAa,SAAS,GAAG;AAEzE,UAAI,OAAO,IAAa;AACtB,YAAI,eAAe;AACjB,2BAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,MAAM,UAAU,eAAe,OAAO;AACzG,mBAAS,UAAU,YAAY;AAAA,QACjC;AAEA,mBAAW;AACX,wBAAgB;AAChB,uBAAe;AAAA,MAEjB,WAAW,eAAe;AAExB,wBAAgB;AAChB,uBAAe;AAAA,MAEjB,OAAO;AACL,mBAAW,OAAO,mGAAmG;AAAA,MACvH;AAEA,YAAM,YAAY;AAClB,WAAK;AAAA,IAKP,OAAO;AACL,iBAAW,MAAM;AACjB,sBAAgB,MAAM;AACtB,gBAAU,MAAM;AAEhB,UAAI,CAAC,YAAY,OAAO,YAAY,kBAAkB,OAAO,IAAI,GAAG;AAGlE;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,OAAO;AACxB,aAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,eAAO,eAAe,EAAE,GAAG;AACzB,eAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,QAC9C;AAEA,YAAI,OAAO,IAAa;AACtB,eAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,cAAI,CAAC,aAAa,EAAE,GAAG;AACrB,uBAAW,OAAO,yFAAyF;AAAA,UAC7G;AAEA,cAAI,eAAe;AACjB,6BAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,MAAM,UAAU,eAAe,OAAO;AACzG,qBAAS,UAAU,YAAY;AAAA,UACjC;AAEA,qBAAW;AACX,0BAAgB;AAChB,yBAAe;AACf,mBAAS,MAAM;AACf,oBAAU,MAAM;AAAA,QAElB,WAAW,UAAU;AACnB,qBAAW,OAAO,0DAA0D;AAAA,QAE9E,OAAO;AACL,gBAAM,MAAM;AACZ,gBAAM,SAAS;AACf,iBAAO;AAAA,QACT;AAAA,MAEF,WAAW,UAAU;AACnB,mBAAW,OAAO,gFAAgF;AAAA,MAEpG,OAAO;AACL,cAAM,MAAM;AACZ,cAAM,SAAS;AACf,eAAO;AAAA,MACT;AAAA,IACF;AAKA,QAAI,MAAM,SAAS,SAAS,MAAM,aAAa,YAAY;AACzD,UAAI,eAAe;AACjB,mBAAW,MAAM;AACjB,wBAAgB,MAAM;AACtB,kBAAU,MAAM;AAAA,MAClB;AAEA,UAAI,YAAY,OAAO,YAAY,mBAAmB,MAAM,YAAY,GAAG;AACzE,YAAI,eAAe;AACjB,oBAAU,MAAM;AAAA,QAClB,OAAO;AACL,sBAAY,MAAM;AAAA,QACpB;AAAA,MACF;AAEA,UAAI,CAAC,eAAe;AAClB,yBAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,WAAW,UAAU,eAAe,OAAO;AAC9G,iBAAS,UAAU,YAAY;AAAA,MACjC;AAEA,0BAAoB,OAAO,MAAM,EAAE;AACnC,WAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAAA,IAC5C;AAEA,SAAK,MAAM,SAAS,SAAS,MAAM,aAAa,eAAgB,OAAO,GAAI;AACzE,iBAAW,OAAO,oCAAoC;AAAA,IACxD,WAAW,MAAM,aAAa,YAAY;AACxC;AAAA,IACF;AAAA,EACF;AAOA,MAAI,eAAe;AACjB,qBAAiB,OAAO,SAAS,iBAAiB,QAAQ,SAAS,MAAM,UAAU,eAAe,OAAO;AAAA,EAC3G;AAGA,MAAI,UAAU;AACZ,UAAM,MAAM;AACZ,UAAM,SAAS;AACf,UAAM,OAAO;AACb,UAAM,SAAS;AAAA,EACjB;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAO;AAC9B,MAAI,WACA,aAAa,OACb,UAAa,OACb,WACA,SACA;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,GAAa,QAAO;AAE/B,MAAI,MAAM,QAAQ,MAAM;AACtB,eAAW,OAAO,+BAA+B;AAAA,EACnD;AAEA,OAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAE5C,MAAI,OAAO,IAAa;AACtB,iBAAa;AACb,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,EAE9C,WAAW,OAAO,IAAa;AAC7B,cAAU;AACV,gBAAY;AACZ,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,EAE9C,OAAO;AACL,gBAAY;AAAA,EACd;AAEA,cAAY,MAAM;AAElB,MAAI,YAAY;AACd,OAAG;AAAE,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAAG,SAC7C,OAAO,KAAK,OAAO;AAE1B,QAAI,MAAM,WAAW,MAAM,QAAQ;AACjC,gBAAU,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ;AACrD,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C,OAAO;AACL,iBAAW,OAAO,oDAAoD;AAAA,IACxE;AAAA,EACF,OAAO;AACL,WAAO,OAAO,KAAK,CAAC,aAAa,EAAE,GAAG;AAEpC,UAAI,OAAO,IAAa;AACtB,YAAI,CAAC,SAAS;AACZ,sBAAY,MAAM,MAAM,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC;AAE/D,cAAI,CAAC,mBAAmB,KAAK,SAAS,GAAG;AACvC,uBAAW,OAAO,iDAAiD;AAAA,UACrE;AAEA,oBAAU;AACV,sBAAY,MAAM,WAAW;AAAA,QAC/B,OAAO;AACL,qBAAW,OAAO,6CAA6C;AAAA,QACjE;AAAA,MACF;AAEA,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C;AAEA,cAAU,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ;AAErD,QAAI,wBAAwB,KAAK,OAAO,GAAG;AACzC,iBAAW,OAAO,qDAAqD;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,WAAW,CAAC,gBAAgB,KAAK,OAAO,GAAG;AAC7C,eAAW,OAAO,8CAA8C,OAAO;AAAA,EACzE;AAEA,MAAI;AACF,cAAU,mBAAmB,OAAO;AAAA,EACtC,SAAS,KAAK;AACZ,eAAW,OAAO,4BAA4B,OAAO;AAAA,EACvD;AAEA,MAAI,YAAY;AACd,UAAM,MAAM;AAAA,EAEd,WAAW,kBAAkB,KAAK,MAAM,QAAQ,SAAS,GAAG;AAC1D,UAAM,MAAM,MAAM,OAAO,SAAS,IAAI;AAAA,EAExC,WAAW,cAAc,KAAK;AAC5B,UAAM,MAAM,MAAM;AAAA,EAEpB,WAAW,cAAc,MAAM;AAC7B,UAAM,MAAM,uBAAuB;AAAA,EAErC,OAAO;AACL,eAAW,OAAO,4BAA4B,YAAY,GAAG;AAAA,EAC/D;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAO;AACjC,MAAI,WACA;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,GAAa,QAAO;AAE/B,MAAI,MAAM,WAAW,MAAM;AACzB,eAAW,OAAO,mCAAmC;AAAA,EACvD;AAEA,OAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAC5C,cAAY,MAAM;AAElB,SAAO,OAAO,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,kBAAkB,EAAE,GAAG;AAC9D,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,EAC9C;AAEA,MAAI,MAAM,aAAa,WAAW;AAChC,eAAW,OAAO,4DAA4D;AAAA,EAChF;AAEA,QAAM,SAAS,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC1D,SAAO;AACT;AAEA,SAAS,UAAU,OAAO;AACxB,MAAI,WAAW,OACX;AAEJ,OAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,MAAI,OAAO,GAAa,QAAO;AAE/B,OAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAC5C,cAAY,MAAM;AAElB,SAAO,OAAO,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,kBAAkB,EAAE,GAAG;AAC9D,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,EAC9C;AAEA,MAAI,MAAM,aAAa,WAAW;AAChC,eAAW,OAAO,2DAA2D;AAAA,EAC/E;AAEA,UAAQ,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ;AAEnD,MAAI,CAAC,kBAAkB,KAAK,MAAM,WAAW,KAAK,GAAG;AACnD,eAAW,OAAO,yBAAyB,QAAQ,GAAG;AAAA,EACxD;AAEA,QAAM,SAAS,MAAM,UAAU,KAAK;AACpC,sBAAoB,OAAO,MAAM,EAAE;AACnC,SAAO;AACT;AAEA,SAAS,YAAY,OAAO,cAAc,aAAa,aAAa,cAAc;AAChF,MAAI,kBACA,mBACA,uBACA,eAAe,GACf,YAAa,OACb,aAAa,OACb,WACA,cACA,UACAE,OACA,YACA;AAEJ,MAAI,MAAM,aAAa,MAAM;AAC3B,UAAM,SAAS,QAAQ,KAAK;AAAA,EAC9B;AAEA,QAAM,MAAS;AACf,QAAM,SAAS;AACf,QAAM,OAAS;AACf,QAAM,SAAS;AAEf,qBAAmB,oBAAoB,wBACrC,sBAAsB,eACtB,qBAAsB;AAExB,MAAI,aAAa;AACf,QAAI,oBAAoB,OAAO,MAAM,EAAE,GAAG;AACxC,kBAAY;AAEZ,UAAI,MAAM,aAAa,cAAc;AACnC,uBAAe;AAAA,MACjB,WAAW,MAAM,eAAe,cAAc;AAC5C,uBAAe;AAAA,MACjB,WAAW,MAAM,aAAa,cAAc;AAC1C,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB,GAAG;AACtB,WAAO,gBAAgB,KAAK,KAAK,mBAAmB,KAAK,GAAG;AAC1D,UAAI,oBAAoB,OAAO,MAAM,EAAE,GAAG;AACxC,oBAAY;AACZ,gCAAwB;AAExB,YAAI,MAAM,aAAa,cAAc;AACnC,yBAAe;AAAA,QACjB,WAAW,MAAM,eAAe,cAAc;AAC5C,yBAAe;AAAA,QACjB,WAAW,MAAM,aAAa,cAAc;AAC1C,yBAAe;AAAA,QACjB;AAAA,MACF,OAAO;AACL,gCAAwB;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,uBAAuB;AACzB,4BAAwB,aAAa;AAAA,EACvC;AAEA,MAAI,iBAAiB,KAAK,sBAAsB,aAAa;AAC3D,QAAI,oBAAoB,eAAe,qBAAqB,aAAa;AACvE,mBAAa;AAAA,IACf,OAAO;AACL,mBAAa,eAAe;AAAA,IAC9B;AAEA,kBAAc,MAAM,WAAW,MAAM;AAErC,QAAI,iBAAiB,GAAG;AACtB,UAAI,0BACC,kBAAkB,OAAO,WAAW,KACpC,iBAAiB,OAAO,aAAa,UAAU,MAChD,mBAAmB,OAAO,UAAU,GAAG;AACzC,qBAAa;AAAA,MACf,OAAO;AACL,YAAK,qBAAqB,gBAAgB,OAAO,UAAU,KACvD,uBAAuB,OAAO,UAAU,KACxC,uBAAuB,OAAO,UAAU,GAAG;AAC7C,uBAAa;AAAA,QAEf,WAAW,UAAU,KAAK,GAAG;AAC3B,uBAAa;AAEb,cAAI,MAAM,QAAQ,QAAQ,MAAM,WAAW,MAAM;AAC/C,uBAAW,OAAO,2CAA2C;AAAA,UAC/D;AAAA,QAEF,WAAW,gBAAgB,OAAO,YAAY,oBAAoB,WAAW,GAAG;AAC9E,uBAAa;AAEb,cAAI,MAAM,QAAQ,MAAM;AACtB,kBAAM,MAAM;AAAA,UACd;AAAA,QACF;AAEA,YAAI,MAAM,WAAW,MAAM;AACzB,gBAAM,UAAU,MAAM,MAAM,IAAI,MAAM;AAAA,QACxC;AAAA,MACF;AAAA,IACF,WAAW,iBAAiB,GAAG;AAG7B,mBAAa,yBAAyB,kBAAkB,OAAO,WAAW;AAAA,IAC5E;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,MAAM;AACtB,QAAI,MAAM,WAAW,MAAM;AACzB,YAAM,UAAU,MAAM,MAAM,IAAI,MAAM;AAAA,IACxC;AAAA,EAEF,WAAW,MAAM,QAAQ,KAAK;AAO5B,QAAI,MAAM,WAAW,QAAQ,MAAM,SAAS,UAAU;AACpD,iBAAW,OAAO,sEAAsE,MAAM,OAAO,GAAG;AAAA,IAC1G;AAEA,SAAK,YAAY,GAAG,eAAe,MAAM,cAAc,QAAQ,YAAY,cAAc,aAAa,GAAG;AACvG,MAAAA,QAAO,MAAM,cAAc,SAAS;AAEpC,UAAIA,MAAK,QAAQ,MAAM,MAAM,GAAG;AAC9B,cAAM,SAASA,MAAK,UAAU,MAAM,MAAM;AAC1C,cAAM,MAAMA,MAAK;AACjB,YAAI,MAAM,WAAW,MAAM;AACzB,gBAAM,UAAU,MAAM,MAAM,IAAI,MAAM;AAAA,QACxC;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,MAAM,QAAQ,KAAK;AAC5B,QAAI,kBAAkB,KAAK,MAAM,QAAQ,MAAM,QAAQ,UAAU,GAAG,MAAM,GAAG,GAAG;AAC9E,MAAAA,QAAO,MAAM,QAAQ,MAAM,QAAQ,UAAU,EAAE,MAAM,GAAG;AAAA,IAC1D,OAAO;AAEL,MAAAA,QAAO;AACP,iBAAW,MAAM,QAAQ,MAAM,MAAM,QAAQ,UAAU;AAEvD,WAAK,YAAY,GAAG,eAAe,SAAS,QAAQ,YAAY,cAAc,aAAa,GAAG;AAC5F,YAAI,MAAM,IAAI,MAAM,GAAG,SAAS,SAAS,EAAE,IAAI,MAAM,MAAM,SAAS,SAAS,EAAE,KAAK;AAClF,UAAAA,QAAO,SAAS,SAAS;AACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAACA,OAAM;AACT,iBAAW,OAAO,mBAAmB,MAAM,MAAM,GAAG;AAAA,IACtD;AAEA,QAAI,MAAM,WAAW,QAAQA,MAAK,SAAS,MAAM,MAAM;AACrD,iBAAW,OAAO,kCAAkC,MAAM,MAAM,0BAA0BA,MAAK,OAAO,aAAa,MAAM,OAAO,GAAG;AAAA,IACrI;AAEA,QAAI,CAACA,MAAK,QAAQ,MAAM,QAAQ,MAAM,GAAG,GAAG;AAC1C,iBAAW,OAAO,kCAAkC,MAAM,MAAM,gBAAgB;AAAA,IAClF,OAAO;AACL,YAAM,SAASA,MAAK,UAAU,MAAM,QAAQ,MAAM,GAAG;AACrD,UAAI,MAAM,WAAW,MAAM;AACzB,cAAM,UAAU,MAAM,MAAM,IAAI,MAAM;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,aAAa,MAAM;AAC3B,UAAM,SAAS,SAAS,KAAK;AAAA,EAC/B;AACA,SAAO,MAAM,QAAQ,QAAS,MAAM,WAAW,QAAQ;AACzD;AAEA,SAAS,aAAa,OAAO;AAC3B,MAAI,gBAAgB,MAAM,UACtB,WACA,eACA,eACA,gBAAgB,OAChB;AAEJ,QAAM,UAAU;AAChB,QAAM,kBAAkB,MAAM;AAC9B,QAAM,SAAS,uBAAO,OAAO,IAAI;AACjC,QAAM,YAAY,uBAAO,OAAO,IAAI;AAEpC,UAAQ,KAAK,MAAM,MAAM,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC1D,wBAAoB,OAAO,MAAM,EAAE;AAEnC,SAAK,MAAM,MAAM,WAAW,MAAM,QAAQ;AAE1C,QAAI,MAAM,aAAa,KAAK,OAAO,IAAa;AAC9C;AAAA,IACF;AAEA,oBAAgB;AAChB,SAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAC5C,gBAAY,MAAM;AAElB,WAAO,OAAO,KAAK,CAAC,aAAa,EAAE,GAAG;AACpC,WAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,IAC9C;AAEA,oBAAgB,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ;AAC3D,oBAAgB,CAAC;AAEjB,QAAI,cAAc,SAAS,GAAG;AAC5B,iBAAW,OAAO,8DAA8D;AAAA,IAClF;AAEA,WAAO,OAAO,GAAG;AACf,aAAO,eAAe,EAAE,GAAG;AACzB,aAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,MAC9C;AAEA,UAAI,OAAO,IAAa;AACtB,WAAG;AAAE,eAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,QAAG,SAC7C,OAAO,KAAK,CAAC,OAAO,EAAE;AAC7B;AAAA,MACF;AAEA,UAAI,OAAO,EAAE,EAAG;AAEhB,kBAAY,MAAM;AAElB,aAAO,OAAO,KAAK,CAAC,aAAa,EAAE,GAAG;AACpC,aAAK,MAAM,MAAM,WAAW,EAAE,MAAM,QAAQ;AAAA,MAC9C;AAEA,oBAAc,KAAK,MAAM,MAAM,MAAM,WAAW,MAAM,QAAQ,CAAC;AAAA,IACjE;AAEA,QAAI,OAAO,EAAG,eAAc,KAAK;AAEjC,QAAI,kBAAkB,KAAK,mBAAmB,aAAa,GAAG;AAC5D,wBAAkB,aAAa,EAAE,OAAO,eAAe,aAAa;AAAA,IACtE,OAAO;AACL,mBAAa,OAAO,iCAAiC,gBAAgB,GAAG;AAAA,IAC1E;AAAA,EACF;AAEA,sBAAoB,OAAO,MAAM,EAAE;AAEnC,MAAI,MAAM,eAAe,KACrB,MAAM,MAAM,WAAW,MAAM,QAAQ,MAAU,MAC/C,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC,MAAM,MAC/C,MAAM,MAAM,WAAW,MAAM,WAAW,CAAC,MAAM,IAAa;AAC9D,UAAM,YAAY;AAClB,wBAAoB,OAAO,MAAM,EAAE;AAAA,EAErC,WAAW,eAAe;AACxB,eAAW,OAAO,iCAAiC;AAAA,EACrD;AAEA,cAAY,OAAO,MAAM,aAAa,GAAG,mBAAmB,OAAO,IAAI;AACvE,sBAAoB,OAAO,MAAM,EAAE;AAEnC,MAAI,MAAM,mBACN,8BAA8B,KAAK,MAAM,MAAM,MAAM,eAAe,MAAM,QAAQ,CAAC,GAAG;AACxF,iBAAa,OAAO,kDAAkD;AAAA,EACxE;AAEA,QAAM,UAAU,KAAK,MAAM,MAAM;AAEjC,MAAI,MAAM,aAAa,MAAM,aAAa,sBAAsB,KAAK,GAAG;AAEtE,QAAI,MAAM,MAAM,WAAW,MAAM,QAAQ,MAAM,IAAa;AAC1D,YAAM,YAAY;AAClB,0BAAoB,OAAO,MAAM,EAAE;AAAA,IACrC;AACA;AAAA,EACF;AAEA,MAAI,MAAM,WAAY,MAAM,SAAS,GAAI;AACvC,eAAW,OAAO,uDAAuD;AAAA,EAC3E,OAAO;AACL;AAAA,EACF;AACF;AAGA,SAAS,cAAc,OAAO,SAAS;AACrC,UAAQ,OAAO,KAAK;AACpB,YAAU,WAAW,CAAC;AAEtB,MAAI,MAAM,WAAW,GAAG;AAGtB,QAAI,MAAM,WAAW,MAAM,SAAS,CAAC,MAAM,MACvC,MAAM,WAAW,MAAM,SAAS,CAAC,MAAM,IAAc;AACvD,eAAS;AAAA,IACX;AAGA,QAAI,MAAM,WAAW,CAAC,MAAM,OAAQ;AAClC,cAAQ,MAAM,MAAM,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,QAAQ,IAAI,QAAQ,OAAO,OAAO;AAEtC,MAAI,UAAU,MAAM,QAAQ,IAAI;AAEhC,MAAI,YAAY,IAAI;AAClB,UAAM,WAAW;AACjB,eAAW,OAAO,mCAAmC;AAAA,EACvD;AAGA,QAAM,SAAS;AAEf,SAAO,MAAM,MAAM,WAAW,MAAM,QAAQ,MAAM,IAAiB;AACjE,UAAM,cAAc;AACpB,UAAM,YAAY;AAAA,EACpB;AAEA,SAAO,MAAM,WAAY,MAAM,SAAS,GAAI;AAC1C,iBAAa,KAAK;AAAA,EACpB;AAEA,SAAO,MAAM;AACf;AAGA,SAAS,UAAU,OAAO,UAAU,SAAS;AAC3C,MAAI,aAAa,QAAQ,OAAO,aAAa,YAAY,OAAO,YAAY,aAAa;AACvF,cAAU;AACV,eAAW;AAAA,EACb;AAEA,MAAI,YAAY,cAAc,OAAO,OAAO;AAE5C,MAAI,OAAO,aAAa,YAAY;AAClC,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,GAAG,SAAS,UAAU,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACzE,aAAS,UAAU,KAAK,CAAC;AAAA,EAC3B;AACF;AAGA,SAAS,OAAO,OAAO,SAAS;AAC9B,MAAI,YAAY,cAAc,OAAO,OAAO;AAE5C,MAAI,UAAU,WAAW,GAAG;AAE1B,WAAO;AAAA,EACT,WAAW,UAAU,WAAW,GAAG;AACjC,WAAO,UAAU,CAAC;AAAA,EACpB;AACA,QAAM,IAAI,UAAU,0DAA0D;AAChF;AAGA,IAAI,YAAY;AAChB,IAAI,SAAY;AAEhB,IAAI,SAAS;AAAA,EACZ,SAAS;AAAA,EACT,MAAM;AACP;AAQA,IAAI,YAAkB,OAAO,UAAU;AACvC,IAAI,kBAAkB,OAAO,UAAU;AAEvC,IAAI,WAA4B;AAChC,IAAI,WAA4B;AAChC,IAAI,iBAA4B;AAChC,IAAI,uBAA4B;AAChC,IAAI,aAA4B;AAChC,IAAI,mBAA4B;AAChC,IAAI,oBAA4B;AAChC,IAAI,aAA4B;AAChC,IAAI,eAA4B;AAChC,IAAI,iBAA4B;AAChC,IAAI,oBAA4B;AAChC,IAAI,gBAA4B;AAChC,IAAI,aAA4B;AAChC,IAAI,aAA4B;AAChC,IAAI,aAA4B;AAChC,IAAI,cAA4B;AAChC,IAAI,oBAA4B;AAChC,IAAI,gBAA4B;AAChC,IAAI,qBAA4B;AAChC,IAAI,2BAA4B;AAChC,IAAI,4BAA4B;AAChC,IAAI,oBAA4B;AAChC,IAAI,0BAA4B;AAChC,IAAI,qBAA4B;AAChC,IAAI,2BAA4B;AAEhC,IAAI,mBAAmB,CAAC;AAExB,iBAAiB,CAAI,IAAM;AAC3B,iBAAiB,CAAI,IAAM;AAC3B,iBAAiB,CAAI,IAAM;AAC3B,iBAAiB,CAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,EAAI,IAAM;AAC3B,iBAAiB,GAAI,IAAM;AAC3B,iBAAiB,GAAI,IAAM;AAC3B,iBAAiB,IAAM,IAAI;AAC3B,iBAAiB,IAAM,IAAI;AAE3B,IAAI,6BAA6B;AAAA,EAC/B;AAAA,EAAK;AAAA,EAAK;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAM;AAAA,EAC3C;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAC5C;AAEA,IAAI,2BAA2B;AAE/B,SAAS,gBAAgBD,SAAQD,MAAK;AACpC,MAAI,QAAQ,MAAM,OAAO,QAAQ,KAAK,OAAOE;AAE7C,MAAIF,SAAQ,KAAM,QAAO,CAAC;AAE1B,WAAS,CAAC;AACV,SAAO,OAAO,KAAKA,IAAG;AAEtB,OAAK,QAAQ,GAAG,SAAS,KAAK,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAChE,UAAM,KAAK,KAAK;AAChB,YAAQ,OAAOA,KAAI,GAAG,CAAC;AAEvB,QAAI,IAAI,MAAM,GAAG,CAAC,MAAM,MAAM;AAC5B,YAAM,uBAAuB,IAAI,MAAM,CAAC;AAAA,IAC1C;AACA,IAAAE,QAAOD,QAAO,gBAAgB,UAAU,EAAE,GAAG;AAE7C,QAAIC,SAAQ,gBAAgB,KAAKA,MAAK,cAAc,KAAK,GAAG;AAC1D,cAAQA,MAAK,aAAa,KAAK;AAAA,IACjC;AAEA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,WAAW;AAC5B,MAAI,QAAQ,QAAQ;AAEpB,WAAS,UAAU,SAAS,EAAE,EAAE,YAAY;AAE5C,MAAI,aAAa,KAAM;AACrB,aAAS;AACT,aAAS;AAAA,EACX,WAAW,aAAa,OAAQ;AAC9B,aAAS;AACT,aAAS;AAAA,EACX,WAAW,aAAa,YAAY;AAClC,aAAS;AACT,aAAS;AAAA,EACX,OAAO;AACL,UAAM,IAAI,UAAU,+DAA+D;AAAA,EACrF;AAEA,SAAO,OAAO,SAAS,OAAO,OAAO,KAAK,SAAS,OAAO,MAAM,IAAI;AACtE;AAGA,IAAI,sBAAsB;AAA1B,IACI,sBAAsB;AAE1B,SAAS,MAAM,SAAS;AACtB,OAAK,SAAgB,QAAQ,QAAQ,KAAK;AAC1C,OAAK,SAAgB,KAAK,IAAI,GAAI,QAAQ,QAAQ,KAAK,CAAE;AACzD,OAAK,gBAAgB,QAAQ,eAAe,KAAK;AACjD,OAAK,cAAgB,QAAQ,aAAa,KAAK;AAC/C,OAAK,YAAiB,OAAO,UAAU,QAAQ,WAAW,CAAC,IAAI,KAAK,QAAQ,WAAW;AACvF,OAAK,WAAgB,gBAAgB,KAAK,QAAQ,QAAQ,QAAQ,KAAK,IAAI;AAC3E,OAAK,WAAgB,QAAQ,UAAU,KAAK;AAC5C,OAAK,YAAgB,QAAQ,WAAW,KAAK;AAC7C,OAAK,SAAgB,QAAQ,QAAQ,KAAK;AAC1C,OAAK,eAAgB,QAAQ,cAAc,KAAK;AAChD,OAAK,eAAgB,QAAQ,cAAc,KAAK;AAChD,OAAK,cAAgB,QAAQ,aAAa,MAAM,MAAM,sBAAsB;AAC5E,OAAK,cAAgB,QAAQ,aAAa,KAAK;AAC/C,OAAK,WAAgB,OAAO,QAAQ,UAAU,MAAM,aAAa,QAAQ,UAAU,IAAI;AAEvF,OAAK,gBAAgB,KAAK,OAAO;AACjC,OAAK,gBAAgB,KAAK,OAAO;AAEjC,OAAK,MAAM;AACX,OAAK,SAAS;AAEd,OAAK,aAAa,CAAC;AACnB,OAAK,iBAAiB;AACxB;AAGA,SAAS,aAAa,QAAQ,QAAQ;AACpC,MAAI,MAAM,OAAO,OAAO,KAAK,MAAM,GAC/B,WAAW,GACX,OAAO,IACP,SAAS,IACT,MACA,SAAS,OAAO;AAEpB,SAAO,WAAW,QAAQ;AACxB,WAAO,OAAO,QAAQ,MAAM,QAAQ;AACpC,QAAI,SAAS,IAAI;AACf,aAAO,OAAO,MAAM,QAAQ;AAC5B,iBAAW;AAAA,IACb,OAAO;AACL,aAAO,OAAO,MAAM,UAAU,OAAO,CAAC;AACtC,iBAAW,OAAO;AAAA,IACpB;AAEA,QAAI,KAAK,UAAU,SAAS,KAAM,WAAU;AAE5C,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAO,OAAO;AACtC,SAAO,OAAO,OAAO,OAAO,KAAK,MAAM,SAAS,KAAK;AACvD;AAEA,SAAS,sBAAsB,OAAOE,MAAK;AACzC,MAAI,OAAO,QAAQF;AAEnB,OAAK,QAAQ,GAAG,SAAS,MAAM,cAAc,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAC/E,IAAAA,QAAO,MAAM,cAAc,KAAK;AAEhC,QAAIA,MAAK,QAAQE,IAAG,GAAG;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,aAAa,GAAG;AACvB,SAAO,MAAM,cAAc,MAAM;AACnC;AAMA,SAAS,YAAY,GAAG;AACtB,SAAS,MAAW,KAAK,KAAK,OACrB,OAAW,KAAK,KAAK,SAAa,MAAM,QAAU,MAAM,QACxD,SAAW,KAAK,KAAK,SAAa,MAAM,YACxC,SAAW,KAAK,KAAK;AAChC;AAOA,SAAS,qBAAqB,GAAG;AAC/B,SAAO,YAAY,CAAC,KACf,MAAM,YAEN,MAAM,wBACN,MAAM;AACb;AAWA,SAAS,YAAY,GAAG,MAAM,SAAS;AACrC,MAAI,wBAAwB,qBAAqB,CAAC;AAClD,MAAI,YAAY,yBAAyB,CAAC,aAAa,CAAC;AACxD;AAAA;AAAA,KAEE;AAAA;AAAA,MACE;AAAA,QACE,yBAEG,MAAM,cACN,MAAM,4BACN,MAAM,6BACN,MAAM,2BACN,MAAM,6BAGV,MAAM,cACN,EAAE,SAAS,cAAc,CAAC,cACzB,qBAAqB,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,MAAM,cAC3D,SAAS,cAAc;AAAA;AAC/B;AAGA,SAAS,iBAAiB,GAAG;AAI3B,SAAO,YAAY,CAAC,KAAK,MAAM,YAC1B,CAAC,aAAa,CAAC,KAGf,MAAM,cACN,MAAM,iBACN,MAAM,cACN,MAAM,cACN,MAAM,4BACN,MAAM,6BACN,MAAM,2BACN,MAAM,4BAEN,MAAM,cACN,MAAM,kBACN,MAAM,iBACN,MAAM,oBACN,MAAM,sBACN,MAAM,eACN,MAAM,qBACN,MAAM,qBACN,MAAM,qBAEN,MAAM,gBACN,MAAM,sBACN,MAAM;AACb;AAGA,SAAS,gBAAgB,GAAG;AAE1B,SAAO,CAAC,aAAa,CAAC,KAAK,MAAM;AACnC;AAGA,SAAS,YAAY,QAAQ,KAAK;AAChC,MAAI,QAAQ,OAAO,WAAW,GAAG,GAAG;AACpC,MAAI,SAAS,SAAU,SAAS,SAAU,MAAM,IAAI,OAAO,QAAQ;AACjE,aAAS,OAAO,WAAW,MAAM,CAAC;AAClC,QAAI,UAAU,SAAU,UAAU,OAAQ;AAExC,cAAQ,QAAQ,SAAU,OAAQ,SAAS,QAAS;AAAA,IACtD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,oBAAoB,QAAQ;AACnC,MAAI,iBAAiB;AACrB,SAAO,eAAe,KAAK,MAAM;AACnC;AAEA,IAAI,cAAgB;AAApB,IACI,eAAgB;AADpB,IAEI,gBAAgB;AAFpB,IAGI,eAAgB;AAHpB,IAII,eAAgB;AASpB,SAAS,kBAAkB,QAAQ,gBAAgB,gBAAgB,WACjE,mBAAmB,aAAa,aAAa,SAAS;AAEtD,MAAI;AACJ,MAAI,OAAO;AACX,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,MAAI,kBAAkB;AACtB,MAAI,mBAAmB,cAAc;AACrC,MAAI,oBAAoB;AACxB,MAAI,QAAQ,iBAAiB,YAAY,QAAQ,CAAC,CAAC,KACxC,gBAAgB,YAAY,QAAQ,OAAO,SAAS,CAAC,CAAC;AAEjE,MAAI,kBAAkB,aAAa;AAGjC,SAAK,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,QAAU,KAAK,IAAI,KAAK;AAC7D,aAAO,YAAY,QAAQ,CAAC;AAC5B,UAAI,CAAC,YAAY,IAAI,GAAG;AACtB,eAAO;AAAA,MACT;AACA,cAAQ,SAAS,YAAY,MAAM,UAAU,OAAO;AACpD,iBAAW;AAAA,IACb;AAAA,EACF,OAAO;AAEL,SAAK,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,QAAU,KAAK,IAAI,KAAK;AAC7D,aAAO,YAAY,QAAQ,CAAC;AAC5B,UAAI,SAAS,gBAAgB;AAC3B,uBAAe;AAEf,YAAI,kBAAkB;AACpB,4BAAkB;AAAA,UAEf,IAAI,oBAAoB,IAAI,aAC5B,OAAO,oBAAoB,CAAC,MAAM;AACrC,8BAAoB;AAAA,QACtB;AAAA,MACF,WAAW,CAAC,YAAY,IAAI,GAAG;AAC7B,eAAO;AAAA,MACT;AACA,cAAQ,SAAS,YAAY,MAAM,UAAU,OAAO;AACpD,iBAAW;AAAA,IACb;AAEA,sBAAkB,mBAAoB,qBACnC,IAAI,oBAAoB,IAAI,aAC5B,OAAO,oBAAoB,CAAC,MAAM;AAAA,EACvC;AAIA,MAAI,CAAC,gBAAgB,CAAC,iBAAiB;AAGrC,QAAI,SAAS,CAAC,eAAe,CAAC,kBAAkB,MAAM,GAAG;AACvD,aAAO;AAAA,IACT;AACA,WAAO,gBAAgB,sBAAsB,eAAe;AAAA,EAC9D;AAEA,MAAI,iBAAiB,KAAK,oBAAoB,MAAM,GAAG;AACrD,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,aAAa;AAChB,WAAO,kBAAkB,eAAe;AAAA,EAC1C;AACA,SAAO,gBAAgB,sBAAsB,eAAe;AAC9D;AAQA,SAAS,YAAY,OAAO,QAAQ,OAAO,OAAO,SAAS;AACzD,QAAM,QAAQ,WAAY;AACxB,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,MAAM,gBAAgB,sBAAsB,OAAO;AAAA,IAC5D;AACA,QAAI,CAAC,MAAM,cAAc;AACvB,UAAI,2BAA2B,QAAQ,MAAM,MAAM,MAAM,yBAAyB,KAAK,MAAM,GAAG;AAC9F,eAAO,MAAM,gBAAgB,sBAAuB,MAAM,SAAS,MAAQ,MAAM,SAAS;AAAA,MAC5F;AAAA,IACF;AAEA,QAAI,SAAS,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK;AAQ7C,QAAI,YAAY,MAAM,cAAc,KAChC,KAAK,KAAK,IAAI,KAAK,IAAI,MAAM,WAAW,EAAE,GAAG,MAAM,YAAY,MAAM;AAGzE,QAAI,iBAAiB,SAEf,MAAM,YAAY,MAAM,SAAS,MAAM;AAC7C,aAAS,cAAcC,SAAQ;AAC7B,aAAO,sBAAsB,OAAOA,OAAM;AAAA,IAC5C;AAEA,YAAQ;AAAA,MAAkB;AAAA,MAAQ;AAAA,MAAgB,MAAM;AAAA,MAAQ;AAAA,MAC9D;AAAA,MAAe,MAAM;AAAA,MAAa,MAAM,eAAe,CAAC;AAAA,MAAO;AAAA,IAAO,GAAG;AAAA,MAEzE,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,MAAM,OAAO,QAAQ,MAAM,IAAI,IAAI;AAAA,MAC5C,KAAK;AACH,eAAO,MAAM,YAAY,QAAQ,MAAM,MAAM,IACzC,kBAAkB,aAAa,QAAQ,MAAM,CAAC;AAAA,MACpD,KAAK;AACH,eAAO,MAAM,YAAY,QAAQ,MAAM,MAAM,IACzC,kBAAkB,aAAa,WAAW,QAAQ,SAAS,GAAG,MAAM,CAAC;AAAA,MAC3E,KAAK;AACH,eAAO,MAAM,aAAa,MAAM,IAAI;AAAA,MACtC;AACE,cAAM,IAAI,UAAU,wCAAwC;AAAA,IAChE;AAAA,EACF,GAAE;AACJ;AAGA,SAAS,YAAY,QAAQ,gBAAgB;AAC3C,MAAI,kBAAkB,oBAAoB,MAAM,IAAI,OAAO,cAAc,IAAI;AAG7E,MAAI,OAAgB,OAAO,OAAO,SAAS,CAAC,MAAM;AAClD,MAAI,OAAO,SAAS,OAAO,OAAO,SAAS,CAAC,MAAM,QAAQ,WAAW;AACrE,MAAI,QAAQ,OAAO,MAAO,OAAO,KAAK;AAEtC,SAAO,kBAAkB,QAAQ;AACnC;AAGA,SAAS,kBAAkB,QAAQ;AACjC,SAAO,OAAO,OAAO,SAAS,CAAC,MAAM,OAAO,OAAO,MAAM,GAAG,EAAE,IAAI;AACpE;AAIA,SAAS,WAAW,QAAQ,OAAO;AAKjC,MAAI,SAAS;AAGb,MAAI,UAAU,WAAY;AACxB,QAAI,SAAS,OAAO,QAAQ,IAAI;AAChC,aAAS,WAAW,KAAK,SAAS,OAAO;AACzC,WAAO,YAAY;AACnB,WAAO,SAAS,OAAO,MAAM,GAAG,MAAM,GAAG,KAAK;AAAA,EAChD,GAAE;AAEF,MAAI,mBAAmB,OAAO,CAAC,MAAM,QAAQ,OAAO,CAAC,MAAM;AAC3D,MAAI;AAGJ,MAAI;AACJ,SAAQ,QAAQ,OAAO,KAAK,MAAM,GAAI;AACpC,QAAI,SAAS,MAAM,CAAC,GAAG,OAAO,MAAM,CAAC;AACrC,mBAAgB,KAAK,CAAC,MAAM;AAC5B,cAAU,UACL,CAAC,oBAAoB,CAAC,gBAAgB,SAAS,KAC9C,OAAO,MACT,SAAS,MAAM,KAAK;AACxB,uBAAmB;AAAA,EACrB;AAEA,SAAO;AACT;AAMA,SAAS,SAAS,MAAM,OAAO;AAC7B,MAAI,SAAS,MAAM,KAAK,CAAC,MAAM,IAAK,QAAO;AAG3C,MAAI,UAAU;AACd,MAAI;AAEJ,MAAI,QAAQ,GAAG,KAAK,OAAO,GAAG,OAAO;AACrC,MAAI,SAAS;AAMb,SAAQ,QAAQ,QAAQ,KAAK,IAAI,GAAI;AACnC,WAAO,MAAM;AAEb,QAAI,OAAO,QAAQ,OAAO;AACxB,YAAO,OAAO,QAAS,OAAO;AAC9B,gBAAU,OAAO,KAAK,MAAM,OAAO,GAAG;AAEtC,cAAQ,MAAM;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAIA,YAAU;AAEV,MAAI,KAAK,SAAS,QAAQ,SAAS,OAAO,OAAO;AAC/C,cAAU,KAAK,MAAM,OAAO,IAAI,IAAI,OAAO,KAAK,MAAM,OAAO,CAAC;AAAA,EAChE,OAAO;AACL,cAAU,KAAK,MAAM,KAAK;AAAA,EAC5B;AAEA,SAAO,OAAO,MAAM,CAAC;AACvB;AAGA,SAAS,aAAa,QAAQ;AAC5B,MAAI,SAAS;AACb,MAAI,OAAO;AACX,MAAI;AAEJ,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,QAAQ,QAAU,KAAK,IAAI,KAAK;AACjE,WAAO,YAAY,QAAQ,CAAC;AAC5B,gBAAY,iBAAiB,IAAI;AAEjC,QAAI,CAAC,aAAa,YAAY,IAAI,GAAG;AACnC,gBAAU,OAAO,CAAC;AAClB,UAAI,QAAQ,MAAS,WAAU,OAAO,IAAI,CAAC;AAAA,IAC7C,OAAO;AACL,gBAAU,aAAa,UAAU,IAAI;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAO,OAAO,QAAQ;AAC/C,MAAI,UAAU,IACV,OAAU,MAAM,KAChB,OACA,QACA;AAEJ,OAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,YAAQ,OAAO,KAAK;AAEpB,QAAI,MAAM,UAAU;AAClB,cAAQ,MAAM,SAAS,KAAK,QAAQ,OAAO,KAAK,GAAG,KAAK;AAAA,IAC1D;AAGA,QAAI,UAAU,OAAO,OAAO,OAAO,OAAO,KAAK,KAC1C,OAAO,UAAU,eACjB,UAAU,OAAO,OAAO,MAAM,OAAO,KAAK,GAAI;AAEjD,UAAI,YAAY,GAAI,YAAW,OAAO,CAAC,MAAM,eAAe,MAAM;AAClE,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,MAAM;AACZ,QAAM,OAAO,MAAM,UAAU;AAC/B;AAEA,SAAS,mBAAmB,OAAO,OAAO,QAAQ,SAAS;AACzD,MAAI,UAAU,IACV,OAAU,MAAM,KAChB,OACA,QACA;AAEJ,OAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,YAAQ,OAAO,KAAK;AAEpB,QAAI,MAAM,UAAU;AAClB,cAAQ,MAAM,SAAS,KAAK,QAAQ,OAAO,KAAK,GAAG,KAAK;AAAA,IAC1D;AAGA,QAAI,UAAU,OAAO,QAAQ,GAAG,OAAO,MAAM,MAAM,OAAO,IAAI,KACzD,OAAO,UAAU,eACjB,UAAU,OAAO,QAAQ,GAAG,MAAM,MAAM,MAAM,OAAO,IAAI,GAAI;AAEhE,UAAI,CAAC,WAAW,YAAY,IAAI;AAC9B,mBAAW,iBAAiB,OAAO,KAAK;AAAA,MAC1C;AAEA,UAAI,MAAM,QAAQ,mBAAmB,MAAM,KAAK,WAAW,CAAC,GAAG;AAC7D,mBAAW;AAAA,MACb,OAAO;AACL,mBAAW;AAAA,MACb;AAEA,iBAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,MAAM;AACZ,QAAM,OAAO,WAAW;AAC1B;AAEA,SAAS,iBAAiB,OAAO,OAAO,QAAQ;AAC9C,MAAI,UAAgB,IAChB,OAAgB,MAAM,KACtB,gBAAgB,OAAO,KAAK,MAAM,GAClC,OACA,QACA,WACA,aACA;AAEJ,OAAK,QAAQ,GAAG,SAAS,cAAc,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAEzE,iBAAa;AACb,QAAI,YAAY,GAAI,eAAc;AAElC,QAAI,MAAM,aAAc,eAAc;AAEtC,gBAAY,cAAc,KAAK;AAC/B,kBAAc,OAAO,SAAS;AAE9B,QAAI,MAAM,UAAU;AAClB,oBAAc,MAAM,SAAS,KAAK,QAAQ,WAAW,WAAW;AAAA,IAClE;AAEA,QAAI,CAAC,UAAU,OAAO,OAAO,WAAW,OAAO,KAAK,GAAG;AACrD;AAAA,IACF;AAEA,QAAI,MAAM,KAAK,SAAS,KAAM,eAAc;AAE5C,kBAAc,MAAM,QAAQ,MAAM,eAAe,MAAM,MAAM,OAAO,MAAM,eAAe,KAAK;AAE9F,QAAI,CAAC,UAAU,OAAO,OAAO,aAAa,OAAO,KAAK,GAAG;AACvD;AAAA,IACF;AAEA,kBAAc,MAAM;AAGpB,eAAW;AAAA,EACb;AAEA,QAAM,MAAM;AACZ,QAAM,OAAO,MAAM,UAAU;AAC/B;AAEA,SAAS,kBAAkB,OAAO,OAAO,QAAQ,SAAS;AACxD,MAAI,UAAgB,IAChB,OAAgB,MAAM,KACtB,gBAAgB,OAAO,KAAK,MAAM,GAClC,OACA,QACA,WACA,aACA,cACA;AAGJ,MAAI,MAAM,aAAa,MAAM;AAE3B,kBAAc,KAAK;AAAA,EACrB,WAAW,OAAO,MAAM,aAAa,YAAY;AAE/C,kBAAc,KAAK,MAAM,QAAQ;AAAA,EACnC,WAAW,MAAM,UAAU;AAEzB,UAAM,IAAI,UAAU,0CAA0C;AAAA,EAChE;AAEA,OAAK,QAAQ,GAAG,SAAS,cAAc,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACzE,iBAAa;AAEb,QAAI,CAAC,WAAW,YAAY,IAAI;AAC9B,oBAAc,iBAAiB,OAAO,KAAK;AAAA,IAC7C;AAEA,gBAAY,cAAc,KAAK;AAC/B,kBAAc,OAAO,SAAS;AAE9B,QAAI,MAAM,UAAU;AAClB,oBAAc,MAAM,SAAS,KAAK,QAAQ,WAAW,WAAW;AAAA,IAClE;AAEA,QAAI,CAAC,UAAU,OAAO,QAAQ,GAAG,WAAW,MAAM,MAAM,IAAI,GAAG;AAC7D;AAAA,IACF;AAEA,mBAAgB,MAAM,QAAQ,QAAQ,MAAM,QAAQ,OACpC,MAAM,QAAQ,MAAM,KAAK,SAAS;AAElD,QAAI,cAAc;AAChB,UAAI,MAAM,QAAQ,mBAAmB,MAAM,KAAK,WAAW,CAAC,GAAG;AAC7D,sBAAc;AAAA,MAChB,OAAO;AACL,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,kBAAc,MAAM;AAEpB,QAAI,cAAc;AAChB,oBAAc,iBAAiB,OAAO,KAAK;AAAA,IAC7C;AAEA,QAAI,CAAC,UAAU,OAAO,QAAQ,GAAG,aAAa,MAAM,YAAY,GAAG;AACjE;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,mBAAmB,MAAM,KAAK,WAAW,CAAC,GAAG;AAC7D,oBAAc;AAAA,IAChB,OAAO;AACL,oBAAc;AAAA,IAChB;AAEA,kBAAc,MAAM;AAGpB,eAAW;AAAA,EACb;AAEA,QAAM,MAAM;AACZ,QAAM,OAAO,WAAW;AAC1B;AAEA,SAAS,WAAW,OAAO,QAAQ,UAAU;AAC3C,MAAI,SAAS,UAAU,OAAO,QAAQH,OAAM;AAE5C,aAAW,WAAW,MAAM,gBAAgB,MAAM;AAElD,OAAK,QAAQ,GAAG,SAAS,SAAS,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACpE,IAAAA,QAAO,SAAS,KAAK;AAErB,SAAKA,MAAK,cAAeA,MAAK,eACzB,CAACA,MAAK,cAAgB,OAAO,WAAW,YAAc,kBAAkBA,MAAK,gBAC7E,CAACA,MAAK,aAAcA,MAAK,UAAU,MAAM,IAAI;AAEhD,UAAI,UAAU;AACZ,YAAIA,MAAK,SAASA,MAAK,eAAe;AACpC,gBAAM,MAAMA,MAAK,cAAc,MAAM;AAAA,QACvC,OAAO;AACL,gBAAM,MAAMA,MAAK;AAAA,QACnB;AAAA,MACF,OAAO;AACL,cAAM,MAAM;AAAA,MACd;AAEA,UAAIA,MAAK,WAAW;AAClB,gBAAQ,MAAM,SAASA,MAAK,GAAG,KAAKA,MAAK;AAEzC,YAAI,UAAU,KAAKA,MAAK,SAAS,MAAM,qBAAqB;AAC1D,oBAAUA,MAAK,UAAU,QAAQ,KAAK;AAAA,QACxC,WAAW,gBAAgB,KAAKA,MAAK,WAAW,KAAK,GAAG;AACtD,oBAAUA,MAAK,UAAU,KAAK,EAAE,QAAQ,KAAK;AAAA,QAC/C,OAAO;AACL,gBAAM,IAAI,UAAU,OAAOA,MAAK,MAAM,iCAAiC,QAAQ,SAAS;AAAA,QAC1F;AAEA,cAAM,OAAO;AAAA,MACf;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,UAAU,OAAO,OAAO,QAAQ,OAAO,SAAS,OAAO,YAAY;AAC1E,QAAM,MAAM;AACZ,QAAM,OAAO;AAEb,MAAI,CAAC,WAAW,OAAO,QAAQ,KAAK,GAAG;AACrC,eAAW,OAAO,QAAQ,IAAI;AAAA,EAChC;AAEA,MAAIA,QAAO,UAAU,KAAK,MAAM,IAAI;AACpC,MAAI,UAAU;AACd,MAAI;AAEJ,MAAI,OAAO;AACT,YAAS,MAAM,YAAY,KAAK,MAAM,YAAY;AAAA,EACpD;AAEA,MAAI,gBAAgBA,UAAS,qBAAqBA,UAAS,kBACvD,gBACA;AAEJ,MAAI,eAAe;AACjB,qBAAiB,MAAM,WAAW,QAAQ,MAAM;AAChD,gBAAY,mBAAmB;AAAA,EACjC;AAEA,MAAK,MAAM,QAAQ,QAAQ,MAAM,QAAQ,OAAQ,aAAc,MAAM,WAAW,KAAK,QAAQ,GAAI;AAC/F,cAAU;AAAA,EACZ;AAEA,MAAI,aAAa,MAAM,eAAe,cAAc,GAAG;AACrD,UAAM,OAAO,UAAU;AAAA,EACzB,OAAO;AACL,QAAI,iBAAiB,aAAa,CAAC,MAAM,eAAe,cAAc,GAAG;AACvE,YAAM,eAAe,cAAc,IAAI;AAAA,IACzC;AACA,QAAIA,UAAS,mBAAmB;AAC9B,UAAI,SAAU,OAAO,KAAK,MAAM,IAAI,EAAE,WAAW,GAAI;AACnD,0BAAkB,OAAO,OAAO,MAAM,MAAM,OAAO;AACnD,YAAI,WAAW;AACb,gBAAM,OAAO,UAAU,iBAAiB,MAAM;AAAA,QAChD;AAAA,MACF,OAAO;AACL,yBAAiB,OAAO,OAAO,MAAM,IAAI;AACzC,YAAI,WAAW;AACb,gBAAM,OAAO,UAAU,iBAAiB,MAAM,MAAM;AAAA,QACtD;AAAA,MACF;AAAA,IACF,WAAWA,UAAS,kBAAkB;AACpC,UAAI,SAAU,MAAM,KAAK,WAAW,GAAI;AACtC,YAAI,MAAM,iBAAiB,CAAC,cAAc,QAAQ,GAAG;AACnD,6BAAmB,OAAO,QAAQ,GAAG,MAAM,MAAM,OAAO;AAAA,QAC1D,OAAO;AACL,6BAAmB,OAAO,OAAO,MAAM,MAAM,OAAO;AAAA,QACtD;AACA,YAAI,WAAW;AACb,gBAAM,OAAO,UAAU,iBAAiB,MAAM;AAAA,QAChD;AAAA,MACF,OAAO;AACL,0BAAkB,OAAO,OAAO,MAAM,IAAI;AAC1C,YAAI,WAAW;AACb,gBAAM,OAAO,UAAU,iBAAiB,MAAM,MAAM;AAAA,QACtD;AAAA,MACF;AAAA,IACF,WAAWA,UAAS,mBAAmB;AACrC,UAAI,MAAM,QAAQ,KAAK;AACrB,oBAAY,OAAO,MAAM,MAAM,OAAO,OAAO,OAAO;AAAA,MACtD;AAAA,IACF,WAAWA,UAAS,sBAAsB;AACxC,aAAO;AAAA,IACT,OAAO;AACL,UAAI,MAAM,YAAa,QAAO;AAC9B,YAAM,IAAI,UAAU,4CAA4CA,KAAI;AAAA,IACtE;AAEA,QAAI,MAAM,QAAQ,QAAQ,MAAM,QAAQ,KAAK;AAc3C,eAAS;AAAA,QACP,MAAM,IAAI,CAAC,MAAM,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM;AAAA,MACpD,EAAE,QAAQ,MAAM,KAAK;AAErB,UAAI,MAAM,IAAI,CAAC,MAAM,KAAK;AACxB,iBAAS,MAAM;AAAA,MACjB,WAAW,OAAO,MAAM,GAAG,EAAE,MAAM,sBAAsB;AACvD,iBAAS,OAAO,OAAO,MAAM,EAAE;AAAA,MACjC,OAAO;AACL,iBAAS,OAAO,SAAS;AAAA,MAC3B;AAEA,YAAM,OAAO,SAAS,MAAM,MAAM;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAQ,OAAO;AAC7C,MAAI,UAAU,CAAC,GACX,oBAAoB,CAAC,GACrB,OACA;AAEJ,cAAY,QAAQ,SAAS,iBAAiB;AAE9C,OAAK,QAAQ,GAAG,SAAS,kBAAkB,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAC7E,UAAM,WAAW,KAAK,QAAQ,kBAAkB,KAAK,CAAC,CAAC;AAAA,EACzD;AACA,QAAM,iBAAiB,IAAI,MAAM,MAAM;AACzC;AAEA,SAAS,YAAY,QAAQ,SAAS,mBAAmB;AACvD,MAAI,eACA,OACA;AAEJ,MAAI,WAAW,QAAQ,OAAO,WAAW,UAAU;AACjD,YAAQ,QAAQ,QAAQ,MAAM;AAC9B,QAAI,UAAU,IAAI;AAChB,UAAI,kBAAkB,QAAQ,KAAK,MAAM,IAAI;AAC3C,0BAAkB,KAAK,KAAK;AAAA,MAC9B;AAAA,IACF,OAAO;AACL,cAAQ,KAAK,MAAM;AAEnB,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAK,QAAQ,GAAG,SAAS,OAAO,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAClE,sBAAY,OAAO,KAAK,GAAG,SAAS,iBAAiB;AAAA,QACvD;AAAA,MACF,OAAO;AACL,wBAAgB,OAAO,KAAK,MAAM;AAElC,aAAK,QAAQ,GAAG,SAAS,cAAc,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACzE,sBAAY,OAAO,cAAc,KAAK,CAAC,GAAG,SAAS,iBAAiB;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,OAAO,OAAO,SAAS;AAC9B,YAAU,WAAW,CAAC;AAEtB,MAAI,QAAQ,IAAI,MAAM,OAAO;AAE7B,MAAI,CAAC,MAAM,OAAQ,wBAAuB,OAAO,KAAK;AAEtD,MAAI,QAAQ;AAEZ,MAAI,MAAM,UAAU;AAClB,YAAQ,MAAM,SAAS,KAAK,EAAE,IAAI,MAAM,GAAG,IAAI,KAAK;AAAA,EACtD;AAEA,MAAI,UAAU,OAAO,GAAG,OAAO,MAAM,IAAI,EAAG,QAAO,MAAM,OAAO;AAEhE,SAAO;AACT;AAEA,IAAI,SAAS;AAEb,IAAI,SAAS;AAAA,EACZ,MAAM;AACP;AAEA,SAAS,QAAQ,MAAM,IAAI;AACzB,SAAO,WAAY;AACjB,UAAM,IAAI,MAAM,mBAAmB,OAAO,wCAC1B,KAAK,yCAAyC;AAAA,EAChE;AACF;AASA,IAAI,OAAsB,OAAO;AACjC,IAAI,UAAsB,OAAO;AACjC,IAAI,OAAsB,OAAO;AAqBjC,IAAI,WAAsB,QAAQ,YAAY,MAAM;AACpD,IAAI,cAAsB,QAAQ,eAAe,SAAS;AAC1D,IAAI,WAAsB,QAAQ,YAAY,MAAM;;;ACvvHpD;AACA;AAcA,eAAsB,qBAAqB,WAAkD;AAC3F,MAAI;AACF,WAAO,KAAK,iCAAiC,SAAS,EAAE;AAExD,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,EAAE,QAAQ,OAAO;AAAA,MACjB,CAAC,SAAS;AAAA,IACZ;AAEA,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,MAAM,kCAAkC,SAAS,KAAK,OAAO,UAAU,OAAO,KAAK;AAC1F,aAAO;AAAA,IACT;AAGA,QAAI;AACF,YAAM,WAAW,KAAK,MAAM,OAAO,MAAM;AACzC,aAAO;AAAA,IACT,SAAS,YAAY;AACnB,aAAO,MAAM,qCAAqC,SAAS,KAAK,UAAU;AAC1E,aAAO;AAAA,IACT;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,gCAAgC,SAAS,KAAK,KAAK;AAChE,WAAO;AAAA,EACT;AACF;;;AFnCA,IAAM,sBAA8C;AAAA,EAClD,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,YAAY;AACd;AAEA,IAAM,kBAAkB,OAAO,KAAK,mBAAmB;AAKvD,SAAS,qBAAqB,UAA0B;AACtD,SAAO,oBAAoB,SAAS,YAAY,CAAC,KAAK;AACxD;AAKA,SAAS,sBAAsB,WAA2B;AACxD,QAAM,QAAQ,UAAU,MAAW,QAAG;AAEtC,aAAW,QAAQ,OAAO;AACxB,QAAI,gBAAgB,SAAS,KAAK,YAAY,CAAC,GAAG;AAChD,aAAO,KAAK,YAAY;AAAA,IAC1B;AAAA,EACF;AAGA,SAAO;AACT;AAKA,SAAS,kBAAkB,WAAkC;AAC3D,MAAI,cAAc;AAClB,QAAM,OAAY,WAAM,WAAW,EAAE;AAErC,SAAO,gBAAgB,MAAM;AAE3B,eAAW,YAAY,CAAC,mBAAmB,YAAY,GAAG;AACxD,YAAM,WAAgB,UAAK,aAAa,QAAQ;AAChD,UAAO,cAAW,QAAQ,KAAQ,YAAS,QAAQ,EAAE,OAAO,GAAG;AAC7D,eAAO;AAAA,MACT;AAAA,IACF;AACA,kBAAmB,aAAQ,WAAW;AAAA,EACxC;AAEA,SAAO;AACT;AAKA,SAAS,mBAAmB,YAAoD;AAC9E,MAAI;AACF,UAAM,UAAa,gBAAa,YAAY,OAAO;AACnD,UAAM,SAAc,KAAK,OAAO;AAChC,WAAO;AAAA,EACT,SAAS,QAAQ;AAEf,WAAO;AAAA,EACT;AACF;AAKA,SAAS,UAAU,UAAiC;AAClD,MAAI;AACF,UAAM,SAAY,cAAW,QAAQ,KAAQ,YAAS,QAAQ,EAAE,OAAO;AACvE,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA;AAAA,IACR;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA;AAAA,IACR;AAAA,EACF;AACF;AAKA,SAAS,eAAe,SAAgC;AACtD,MAAI;AACF,UAAM,SAAY,cAAW,OAAO,KAAQ,YAAS,OAAO,EAAE,YAAY;AAC1E,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA;AAAA,IACR;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA;AAAA,IACR;AAAA,EACF;AACF;AAKA,SAAS,kBAAkB,SAAiB,WAAmB,UAA4B;AACzF,MAAI,CAAI,cAAW,OAAO,GAAG;AAC3B,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,QAAW,eAAY,OAAO;AACpC,UAAM,cAAc,qBAAqB,QAAQ;AACjD,UAAM,YAAsB,CAAC;AAG7B,UAAM,qBAAqB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,OAAO,mBAAmB,GAAG,MAAM,CAAC,CAAC;AAEvF,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAgB,UAAK,SAAS,IAAI;AACxC,YAAM,OAAU,YAAS,QAAQ;AAEjC,UAAI,KAAK,OAAO,GAAG;AAEjB,YAAI,SAAS,GAAG,SAAS,IAAI,WAAW,IAAI;AAC1C,oBAAU,KAAK,QAAQ;AAAA,QACzB,WAES,CAAC,KAAK,SAAS,QAAQ,KAAK,CAAC,KAAK,SAAS,WAAW,KAAK,CAAC,KAAK,SAAS,SAAS,GAAG;AAC7F,gBAAM,MAAW,aAAQ,IAAI,EAAE,MAAM,CAAC;AACtC,cAAI,QAAQ,eAAe,mBAAmB,SAAS,GAAG,GAAG;AAC3D,sBAAU,KAAK,QAAQ;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAMA,eAAsB,qBACpB,eACA,UACA,kBAA2B,MACA;AAE3B,QAAM,oBAAyB,aAAQ,aAAa;AAGpD,QAAM,YAAiB,cAAS,mBAAmB,KAAK;AACxD,QAAM,WAAgB,aAAQ,iBAAiB;AAG/C,QAAM,mBAAmB,YAAY,sBAAsB,iBAAiB;AAG5E,QAAM,YAAY,UAAU,iBAAiB;AAC7C,QAAM,iBAAiB,eAAe,QAAQ;AAG9C,QAAM,SAAc,UAAK,UAAU,GAAG,SAAS,KAAK;AACpD,QAAM,YAAiB,UAAK,UAAU,GAAG,SAAS,QAAQ;AAC1D,QAAM,SAAS,UAAU,MAAM;AAC/B,QAAM,YAAY,UAAU,SAAS;AAErC,QAAM,oBAAmC,OAAO,SAAS,SAAU,UAAU,SAAS,YAAY;AAAA,IAChG,QAAQ;AAAA,IACR,MAAM;AAAA;AAAA,EACR;AAGA,QAAM,YAAiB,UAAK,UAAU,GAAG,SAAS,QAAQ;AAC1D,QAAM,oBAAoB,UAAU,SAAS;AAI7C,MAAI;AACJ,MAAI,SAAS,SAAS,GAAQ,QAAG,MAAW,QAAG,EAAE,GAAG;AAElD,UAAM,QAAQ,SAAS,MAAW,QAAG;AACrC,UAAM,WAAW,MAAM,YAAY,KAAK;AACxC,QAAI,aAAa,IAAI;AACnB,YAAM,QAAQ,IAAI;AAClB,gBAAU,MAAM,KAAU,QAAG;AAAA,IAC/B,OAAO;AAEL,gBAAe,UAAU,aAAQ,QAAQ,GAAG,QAAQ,SAAS;AAAA,IAC/D;AAAA,EACF,OAAO;AAEL,cAAe,UAAU,aAAQ,QAAQ,GAAG,QAAQ,SAAS;AAAA,EAC/D;AACA,QAAM,gBAAgB,eAAe,OAAO;AAG5C,QAAM,YAAiB,UAAK,SAAS,GAAG,SAAS,QAAQ;AACzD,QAAM,YAAY,UAAU,SAAS;AAGrC,QAAM,gBAAgB,kBAAkB,SAAS,WAAW,gBAAgB;AAG5E,QAAM,eAAoB,UAAK,SAAS,GAAG,SAAS,WAAW;AAC/D,QAAM,sBAAsB,UAAU,YAAY;AAGlD,QAAM,aAAkB,UAAK,SAAS,GAAG,SAAS,SAAS;AAC3D,QAAM,oBAAoB,UAAU,UAAU;AAG9C,QAAM,eAAoB,UAAK,SAAS,GAAG,SAAS,WAAW;AAC/D,QAAM,mBAAmB,eAAe,YAAY;AAGpD,QAAM,eAAyB,CAAC;AAChC,MAAI,CAAC,UAAU,OAAQ,cAAa,KAAK,UAAU,IAAI;AACvD,MAAI,CAAC,kBAAkB,OAAQ,cAAa,KAAK,kBAAkB,IAAI;AACvE,MAAI,CAAC,kBAAkB,OAAQ,cAAa,KAAK,kBAAkB,IAAI;AACvE,MAAI,CAAC,cAAc,OAAQ,cAAa,KAAK,cAAc,IAAI;AAC/D,MAAI,CAAC,UAAU,OAAQ,cAAa,KAAK,UAAU,IAAI;AACvD,MAAI,cAAc,WAAW,EAAG,cAAa,KAAU,UAAK,SAAS,GAAG,SAAS,IAAI,qBAAqB,gBAAgB,CAAC,EAAE,CAAC;AAC9H,MAAI,CAAC,oBAAoB,OAAQ,cAAa,KAAK,oBAAoB,IAAI;AAE3E,QAAM,gBAAgB,aAAa,WAAW;AAG9C,MAAI;AACJ,MAAI,mBAAmB,UAAU,QAAQ;AACvC,UAAM,mBAAmB,MAAM,qBAAqB,iBAAiB;AACrE,QAAI,kBAAkB;AACpB,iBAAW;AAAA,IACb;AAAA,EACF;AAGA,MAAI;AACJ,QAAM,gBAAgB,kBAAkB,QAAQ;AAChD,QAAM,eAAe,gBAAqB,aAAQ,aAAa,IAAI;AACnE,MAAI,eAAe;AACjB,UAAM,SAAS,mBAAmB,aAAa;AAC/C,QAAI,QAAQ;AACV,qBAAe;AAAA,IACjB;AAAA,EACF;AAGA,QAAM,eAAe,kBAAkB,OAAO;AAC9C,QAAM,cAAc,eAAoB,aAAQ,YAAY,IAAI;AAEhE,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IAEV;AAAA,IAEA,OAAO;AAAA,MACL,OAAO;AAAA,QACL,KAAK,eAAe;AAAA,QACpB,KAAU,cAAS,kBAAkB,IAAI;AAAA,QACzC,SAAS;AAAA,QACT,OAAY,cAAS,UAAU,IAAI;AAAA,QACnC,MAAW,cAAS,kBAAkB,IAAI;AAAA,MAC5C;AAAA,MACA,MAAM;AAAA,QACJ,QAAa,cAAS,kBAAkB,IAAI;AAAA,QAC5C,KAAK,cAAc;AAAA,QACnB,UAAe,cAAS,oBAAoB,IAAI;AAAA,QAChD,SAAS;AAAA,QACT,OAAY,cAAS,UAAU,IAAI;AAAA,QACnC,UAAU;AAAA,QACV,iBAAiB,iBAAiB;AAAA,MACpC;AAAA,IACF;AAAA,IAEA;AAAA,IAEA;AAAA,IAEA;AAAA,IAEA,QAAQ;AAAA,MACN,oBAAoB,kBAAkB;AAAA,MACtC,qBAAqB,kBAAkB;AAAA,MACvC,sBAAsB,oBAAoB;AAAA,MAC1C,aAAa,cAAc,SAAS;AAAA,MACpC,aAAa,UAAU;AAAA,MACvB,aAAa,UAAU;AAAA,MACvB,qBAAqB,kBAAkB;AAAA,MACvC,uBAAuB,iBAAiB;AAAA,MACxC,qBAAqB,cAAc;AAAA,IACrC;AAAA,EACF;AACF;;;ADtTA;AAKO,SAAS,iCAAiC,QAAyB;AACxE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWI,GAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,MACpE,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mEAAmE;AAAA,MAC5G,iBAAiBA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,mDAAmD;AAAA,IACtG;AAAA,IACA,OAAO,EAAE,WAAW,UAAU,gBAAgB,MAAM;AAClD,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA;AAAA,UACA,oBAAoB;AAAA;AAAA,QACtB;AAEA,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,QACnE;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,qCAAqC,KAAK;AACvD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AI3CA,SAAS,KAAAC,WAAS;AAGX,IAAM,+BAAkD;AAAA,EAC7D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,UAAUC,IAAE,OAAO,EAAE,SAAS,6CAA6C;AAAA,IAC3E,YAAYA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,IACrG,QAAQA,IAAE,KAAK,CAAC,QAAQ,cAAc,SAAS,CAAC,EAAE,SAAS,EACxD,SAAS,6EAA6E;AAAA,IACzF,iBAAiBA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,oBAAoB;AAAA,IACrE,KAAKA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,IAC3D,+BAA+BA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,IAC5F,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACzBA,SAAS,KAAAC,WAAS;AAGX,IAAM,8BAAiD;AAAA,EAC5D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,OAAO,EAAE,SAAS,6CAA6C;AAAA,IACxE,YAAYA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,IACjF,QAAQA,IAAE,KAAK,CAAC,YAAY,QAAQ,MAAM,CAAC,EAAE,SAAS,EACnD,SAAS,0CAA0C;AAAA,IACtD,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACtBA,SAAS,KAAAC,WAAS;AAGX,IAAM,wBAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,SAASC,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,IAC5F,OAAOA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,iCAAiC;AAAA,IACxE,kBAAkBA,IAAE,QAAQ,EAAE,SAAS,EACpC,SAAS,wCAAwC;AAAA,IACpD,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACrBA,SAAS,KAAAC,WAAS;AAGX,IAAM,mBAAsC;AAAA,EACjD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,KAAKC,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2FAA2F;AAAA,IAC/H,QAAQA,IAAE,KAAK,CAAC,QAAQ,MAAM,CAAC,EAAE,SAAS,EACvC,SAAS,uCAAuC;AAAA,IACnD,QAAQA,IAAE,OAAO,EAAE,SAAS,EACzB,SAAS,kDAAkD;AAAA,IAC9D,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA;AACA;AAFA,SAAS,KAAAC,WAAS;AAGlB,SAAS,iBAAAC,gBAAe,gBAAAC,eAAc,cAAAC,mBAAkB;AACxD,SAAS,QAAAC,OAAM,WAAAC,UAAS,YAAAC,iBAAgB;AACxC,SAAS,aAAAC,kBAAiB;AAkC1B,SAAS,kBAAkB,SAA8B;AACvD,QAAM,aAAaL,cAAa,SAAS,OAAO;AAGhD,QAAM,cAAc,WAAW,MAAM,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AACnE,QAAM,SAA8B,YACjC,IAAI,CAAC,QAAQ;AACZ,QAAI;AACF,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB,SAAS,QAAQ;AACf,aAAO,KAAK,yCAAyC,IAAI,UAAU,GAAG,GAAG,CAAC,KAAK;AAC/E,aAAO;AAAA,IACT;AAAA,EACF,CAAC,EACA,OAAO,CAAC,UAAsC,UAAU,IAAI;AAG/D,QAAM,cAAc,oBAAI,IAAmC;AAE3D,QAAM,yBAAyB,oBAAI,IAAoB;AAEvD,MAAI,YAAY;AAChB,MAAI,iBAAiB;AACrB,MAAI,eAAe;AAEnB,aAAW,SAAS,QAAQ;AAC1B,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,oBAAa,MAAM,aAAwB;AAC3C,yBAAiB,MAAM;AACvB;AAAA,MAEF,KAAK;AACH,uBAAe,MAAM;AACrB;AAAA,MAEF,KAAK,qBAAqB;AACxB,cAAM,gBAAgB,MAAM;AAC5B,cAAM,WAAW,MAAM;AACvB,cAAM,gBAAgB,MAAM;AAC5B,cAAM,eAAe,MAAM;AAG3B,+BAAuB,IAAI,eAAe,MAAM,OAAO;AAGvD,cAAM,qBAA+B,CAAC;AACtC,cAAM,kBAA4B,CAAC;AACnC,YAAI,cAAc;AAChB,qBAAW,WAAW,OAAO,KAAK,YAAY,GAAG;AAC/C,4BAAgB,KAAK,OAAO;AAC5B,kBAAM,aAAa,uBAAuB,IAAI,OAAO;AACrD,gBAAI,eAAe,QAAW;AAC5B,iCAAmB,KAAK,UAAU;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAEA,oBAAY,IAAI,MAAM,SAAS;AAAA,UAC7B,SAAS,MAAM;AAAA,UACf,MAAM;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN,WAAW,MAAM;AAAA,UACjB,cAAc;AAAA,UACd;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,uBAAuB;AAC1B,cAAM,eAAe,MAAM;AAC3B,cAAM,eAAe,YAAY,IAAI,YAAY;AACjD,YAAI,cAAc;AAChB,gBAAM,aAAa,OAAO,KAAK,CAAC,MAAM,EAAE,YAAY,YAAY;AAChE,cAAI,YAAY;AACd,kBAAM,YAAY,MAAM,WAAW,WAAW,YAAY;AAC1D,yBAAa,UAAU,MAAM;AAC7B,yBAAa,WAAW;AACxB,yBAAa,aAAa,MAAM;AAChC,yBAAa,aAAa,MAAM;AAAA,UAClC;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAA4B,MAAM,KAAK,YAAY,OAAO,CAAC,EAC9D,OAAO,CAAC,MAAyB,EAAE,aAAa,MAAS,EACzD,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAEvC,QAAM,gBAAgB,eAAe,KAAK,eAAe,kBAAkB,MAAY;AAEvF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,OAAO;AAAA,IACpB;AAAA,EACF;AACF;AAKA,SAAS,aAAa,SAA8B;AAClD,SAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AACxC;AAOA,SAAS,gBAAgB,SAA8B;AACrD,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,YAAY;AACvB,QAAM,KAAK,UAAU;AACrB,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,YAAYI,UAAS,QAAQ,SAAS,CAAC,eAAe,QAAQ,cAAc,QAAQ,CAAC,CAAC,MAAM;AACvG,QAAM,KAAK,EAAE;AAGb,UAAQ,UAAU,QAAQ,CAAC,aAAa;AACtC,UAAM,SAAS,IAAI,SAAS,OAAO;AACnC,UAAM,WAAW,SAAS,SAAS,QAAQ,CAAC;AAC5C,UAAM,aAAa,SAAS,eAAe,SAAY,SAAS,aAAa;AAE7E,UAAM,OAAO,SAAS,KAAK,QAAQ,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAC/D,UAAM,KAAK,KAAK,MAAM,KAAK,IAAI,QAAQ,QAAQ,QAAQ,UAAU,YAAY;AAAA,EAC/E,CAAC;AAED,QAAM,KAAK,EAAE;AAGb,QAAM,gBAAgB,QAAQ,UAAU,OAAO,CAAC,MAAM,EAAE,aAAa,WAAW,CAAC;AAEjF,gBAAc,QAAQ,CAAC,aAAa;AAClC,UAAM,KAAK,gBAAgB,SAAS,OAAO,EAAE;AAAA,EAC/C,CAAC;AAED,QAAM,KAAK,EAAE;AAGb,UAAQ,UAAU,QAAQ,CAAC,aAAa;AACtC,aAAS,mBAAmB,QAAQ,CAAC,eAAe;AAClD,YAAM,WAAW,SAAS,SAAS,QAAQ,CAAC;AAC5C,YAAM,KAAK,MAAM,UAAU,SAAS,QAAQ,SAAS,SAAS,OAAO,EAAE;AAAA,IACzE,CAAC;AAAA,EACH,CAAC;AAED,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,8DAA8D;AACzE,QAAM,KAAK,4DAA4D;AACvE,QAAM,KAAK,qBAAqB;AAChC,QAAM,KAAK,KAAK;AAEhB,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,SAAS,+BAA+B,QAAyB;AACtE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAON,IAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,MACvD,UAAUA,IAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,MACrE,cAAcA,IACX,OAAO,EACP,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,uFAAuF;AAAA,IACrG;AAAA,IACA,OAAO,WAAW;AAChB,UAAI;AACF,cAAM,EAAE,OAAO,UAAU,cAAc,UAAU,IAAI;AACrD,YAAI,UAAU;AACd,YAAI;AACJ,YAAI;AAGJ,YAAI,CAAC,SAAS;AACZ,iBAAO,KAAK,0DAA0D;AAGtE,gBAAM,mBAAmB,aAAaI,MAAKC,SAAQ,KAAe,GAAG,gBAAgB;AACrF,UAAAE,WAAU,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAE/C,oBAAUH,MAAK,kBAAkB,qBAAqB;AACtD,qBAAWA,MAAK,kBAAkB,oBAAoB;AACtD,sBAAYA,MAAK,kBAAkB,qBAAqB;AAGxD,gBAAM,cAAc,MAAM;AAAA,YACxB;AAAA,YACA;AAAA,cACE;AAAA,cACA,QAAQ;AAAA,cACR,iBAAiB;AAAA,cACjB,kBAAkB;AAAA,cAClB,uBAAuB;AAAA,YACzB;AAAA,YACA,CAAC,KAAe;AAAA,UAClB;AAEA,cAAI,CAAC,YAAY,SAAS;AACxB,mBAAO;AAAA,cACL,SAAS;AAAA,gBACP;AAAA,kBACE,MAAM;AAAA,kBACN,MAAM,wBAAwB,YAAY,UAAU,YAAY,KAAK;AAAA,gBACvE;AAAA,cACF;AAAA,cACA,SAAS;AAAA,YACX;AAAA,UACF;AAGA,cAAID,YAAW,QAAQ,GAAG;AACxB,gBAAI;AACF,oBAAM,cAAc,MAAM;AAAA,gBACxB;AAAA,gBACA,EAAE,QAAQ,gBAAgB,QAAQ,UAAU;AAAA,gBAC5C,CAAC,QAAQ;AAAA,cACX;AAEA,kBAAI,YAAY,SAAS;AACvB,uBAAO,KAAK,qCAAqC,SAAS,EAAE;AAAA,cAC9D;AAAA,YACF,SAAS,OAAO;AACd,qBAAO,KAAK,4CAA4C,KAAK,EAAE;AAAA,YACjE;AAAA,UACF;AAAA,QACF;AAGA,YAAI,CAACA,YAAW,OAAO,GAAG;AACxB,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,+BAA+B,OAAO;AAAA,cAC9C;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAGA,eAAO,KAAK,+BAA+B,OAAO,EAAE;AACpD,cAAM,UAAU,kBAAkB,OAAO;AAGzC,cAAM,mBAAmB,aAAaE,SAAQ,OAAO;AACrD,QAAAE,WAAU,kBAAkB,EAAE,WAAW,KAAK,CAAC;AAG/C,cAAM,WAAWH,MAAK,kBAAkB,+BAA+B;AACvE,cAAM,cAAc,aAAa,OAAO;AACxC,QAAAH,eAAc,UAAU,WAAW;AACnC,eAAO,KAAK,4BAA4B,QAAQ,EAAE;AAGlD,cAAM,SAASG,MAAK,kBAAkB,6BAA6B;AACnE,cAAM,YAAY,gBAAgB,OAAO;AACzC,QAAAH,eAAc,QAAQ,SAAS;AAC/B,eAAO,KAAK,uCAAuC,MAAM,EAAE;AAG3D,cAAM,cAAwB;AAAA,UAC5B,iBAAiB,QAAQ;AAAA,UACzB,oBAAoB,MAAM;AAAA,UAC1B,kBAAkB,OAAO;AAAA,QAC3B;AAEA,YAAI,UAAU;AACZ,sBAAY,KAAK,yBAAyB,QAAQ,EAAE;AAAA,QACtD;AAEA,YAAI,aAAaE,YAAW,SAAS,GAAG;AACtC,sBAAY,KAAK,0BAA0B,SAAS,EAAE;AAAA,QACxD;AAEA,cAAM,eAAe;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG,YAAY,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE;AAAA,UACpC;AAAA,UACA;AAAA,UACA,cAAcG,UAAS,QAAQ,SAAS,CAAC;AAAA,UACzC,uBAAuB,QAAQ,cAAc,QAAQ,CAAC,CAAC;AAAA,UACvD,wBAAwB,QAAQ,UAAU,MAAM;AAAA,UAChD,qBAAqB,QAAQ,WAAW;AAAA,UACxC;AAAA,UACA;AAAA,UACA,GAAG,QAAQ,UAAU,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,QAAQ;AAC/C,mBAAO,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,EAAE,SAAS,QAAQ,CAAC,CAAC,QAAQ,EAAE,cAAc,GAAG;AAAA,UACrF,CAAC;AAAA,QACH,EAAE,KAAK,IAAI;AAEX,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,iCAAiC,KAAK;AAEnD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YAC1F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACxXA,SAAS,KAAAE,WAAS;AAGX,IAAM,yBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOA,IAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,IAChE,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,IACtE,SAASA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAC/D,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,IACzD,UAAUA,IAAE,KAAK,CAAC,QAAQ,QAAQ,OAAO,CAAC,EAAE,SAAS,EAClD,SAAS,oCAAoC;AAAA,IAChD,SAASA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;;;ACtBA,SAAS,KAAAC,WAAS;AAOlB,SAAS,sBAAsB,QAA4B,QAAyC;AAClG,QAAM,cAAc,OAAO,YAAY;AACvC,QAAM,mBAAmB,OAAO,aAAa;AAE7C,MAAI,eAAe,kBAAkB;AAEnC,WAAO,UAAU;AACjB,WAAO,OAAO,UAAU,OAAO,UAAU;AAAA,EAC3C;AAEA,SAAO,0BAA0B,QAAQ,MAAM;AACjD;AAEO,IAAM,wBAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,gDAAgD;AAAA,IACpF,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qDAAqD;AAAA,IAC5F,YAAYA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,IAC9F,cAAcA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,yCAAyC;AAAA,IACvF,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,IACzF,oBAAoBA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,IACxG,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACzCA,SAAS,KAAAC,WAAS;AAGX,IAAM,qBAAwC;AAAA,EACnD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qEAAqE;AAAA,IAC3G,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8GAA8G;AAAA,IACxJ,eAAeA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+GAA+G;AAAA,IAC7J,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gFAAgF;AAAA,IAC1H,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qHAAqH;AAAA,IACjK,gBAAgBA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oGAAoG;AAAA,IACnJ,gBAAgBA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sGAAsG;AAAA,IACrJ,UAAU,oBAAoB,SAAS;AAAA,IACvC,QAAQ,oBAAoB,OAAO;AAAA,IACnC,UAAUA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EACpC,SAAS,6CAA6C;AAAA,IACzD,SAAS,oBAAoB,QAAQ;AAAA,IACrC,QAAQA,IAAE,OAAO,EAAE,SAAS,EACzB,SAAS,wLAAwL;AAAA,IACpM,iBAAiBA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,IAC7G,wBAAwBA,IAAE,QAAQ,EAAE,SAAS,EAC1C,SAAS,yCAAyC;AAAA,IACrD,uBAAuBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EACtD,SAAS,gDAAgD;AAAA,IAC5D,kBAAkBA,IAAE,QAAQ,EAAE,SAAS,EACpC,SAAS,iEAAiE;AAAA,IAC7E,QAAQA,IAAE,KAAK,CAAC,gBAAgB,eAAe,OAAO,aAAa,QAAQ,KAAK,CAAC,EAAE,SAAS,EACzF,SAAS,yOAAyO;AAAA,IACrP,mBAAmBA,IAAE,OAAO,EAAE,SAAS,EACpC,SAAS,2LAA2L;AAAA,IACvM,oBAAoBA,IAAE,OAAO,EAAE,SAAS,EACrC,SAAS,qLAAqL;AAAA,IACjM,kBAAkBA,IAAE,OAAO,EAAE,SAAS,EACnC,SAAS,2FAA2F;AAAA,IACvG,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC5CA,SAAS,KAAAC,WAAS;AAClB,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAG9B;AACA;AAaA,eAAsB,cAAc;AAAA,EAClC;AAAA,EACA,IAAI;AAAA,EACJ;AAAA,EACA;AACF,GAAyC;AACvC,MAAI;AAEF,QAAI;AACF,YAAM,kBAAkB,MAAM,MAAM;AAAA,IACtC,QAAQ;AACN,UAAI;AACF,cAAM,sBAAsB,MAAM,MAAM;AAAA,MAC1C,QAAQ;AACN,cAAM,IAAI,MAAM,WAAW,MAAM,8CAA8C,IAAI,EAAE;AAAA,MACvF;AAAA,IACF;AAEA,UAAM,iBAAiBC,SAAQ,eAAeC,MAAK,iBAAiB,WAAW,GAAG,gBAAgB,CAAC;AAKnG,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACzG;AACF;AAKO,SAAS,0BAA0B,QAAyB;AACjE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAMC,IAAE,OAAO,EAAE,SAAS,4CAA4C;AAAA,MACtE,IAAIA,IAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,MACrD,QAAQA,IAAE,OAAO,EAAE,SAAS,4CAA4C;AAAA,MACxE,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qEAAqE;AAAA,IACnH;AAAA,IACA,OAAO,EAAE,MAAM,IAAI,QAAQ,YAAY,MAAM;AAC3C,UAAI;AACF,cAAM,SAAS,MAAM,cAAc,EAAE,MAAM,IAAI,QAAQ,YAAY,CAAC;AACpE,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QAC1C;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,4BAA4B,KAAK;AAC9C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC7EA;AAHA,SAAS,KAAAC,WAAS;AAClB,SAAS,QAAQ,iBAAiB;AAClC,SAAS,WAAAC,gBAAe;AAgBxB,eAAsB,iBAAiB,QAAiC;AACtE,MAAI;AACF,UAAM,eAAeA,SAAQ,MAAM;AAGnC,UAAM,OAAO,cAAc,UAAU,IAAI;AAGzC,UAAM,YAAYA,SAAQ,cAAc,qBAAqB;AAC7D,UAAM,OAAO,WAAW,UAAU,IAAI;AAGtC,UAAM,aAAaA,SAAQ,cAAc,SAAS;AAClD,UAAM,aAAaA,SAAQ,cAAc,KAAK;AAE9C,QAAI,YAAY;AAChB,QAAI,YAAY;AAEhB,QAAI;AACF,YAAM,OAAO,YAAY,UAAU,IAAI;AACvC,kBAAY;AAAA,IACd,QAAQ;AAAA,IAER;AAEA,QAAI,CAAC,WAAW;AACd,UAAI;AACF,cAAM,OAAO,YAAY,UAAU,IAAI;AACvC,oBAAY;AAAA,MACd,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,QAAI,CAAC,aAAa,CAAC,WAAW;AAC5B,YAAM,IAAI,MAAM,4EAA4E,MAAM,EAAE;AAAA,IACtG;AAIA,UAAM,aAAa,YAAY,YAAY;AAC3C,WAAO,wBAAwB,MAAM,aAAa,UAAU;AAAA,EAC9D,SAAS,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,YAAa,MAA4B;AAC/C,UAAI,cAAc,UAAU;AAC1B,YAAI,MAAM,QAAQ,SAAS,qBAAqB,GAAG;AACjD,gBAAM,IAAI,MAAM,4CAA4C,MAAM,EAAE;AAAA,QACtE;AACA,cAAM,IAAI,MAAM,iCAAiC,MAAM,EAAE;AAAA,MAC3D;AACA,UAAI,cAAc,UAAU;AAC1B,cAAM,IAAI,MAAM,iCAAiC,MAAM,EAAE;AAAA,MAC3D;AAAA,IACF;AACA,UAAM,IAAI,MAAM,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EAC5G;AACF;AAKO,SAAS,6BAA6B,QAAyB;AACpE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAASD,IAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,IACtE;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM;AACrB,UAAI;AACF,cAAM,SAAS,MAAM,iBAAiB,OAAO;AAC7C,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QAC1C;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,+BAA+B,KAAK;AACjD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AChHA,SAAS,KAAAE,WAAS;AAGX,IAAM,4BAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,UAAUC,IAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,IACxD,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,YAAY,CAAC,EAAE,SAAS,EACrD,SAAS,wCAAwC;AAAA,IACpD,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA,SAAS,KAAAC,WAAS;AAGX,IAAM,6BAAgD;AAAA,EAC3D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,QAAQC,IAAE,KAAK,CAAC,QAAQ,QAAQ,YAAY,CAAC,EAAE,SAAS,EACrD,SAAS,wCAAwC;AAAA,IACpD,SAASA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACpBA,SAAS,KAAAC,WAAS;AAGX,IAAM,+BAAkD;AAAA,EAC7D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,UAAUC,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,IAC3F,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,YAAY,CAAC,EAAE,SAAS,EACrD,SAAS,4CAA4C;AAAA,IACxD,SAASA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA,SAAS,KAAAC,WAAS;AAGX,IAAM,4BAA+C;AAAA,EAC1D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,IAC/D,QAAQA,IAAE,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAC/B,SAAS,yFAAyF;AAAA,IACrG,SAASA,IAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAChE,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,EAC7F;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACpBA,SAAS,KAAAC,WAAS;AAGX,IAAM,yBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,IAC/D,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,YAAY,CAAC,EAAE,SAAS,EACrD,SAAS,oCAAoC;AAAA,IAChD,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA,SAAS,KAAAC,WAAS;AAOlB,IAAM,0BAA0B,CAC9B,QACA,WACW;AACX,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,6BAA6B,OAAO,YAAY,SAAS;AAAA,EAAO,OAAO,SAAS,OAAO,MAAM;AAAA,EACtG;AAGA,MAAI,OAAO,WAAW,UAAU,OAAO,WAAW,gBAAgB,OAAO,WAAW,cAAc;AAChG,WAAO,OAAO,UAAU;AAAA,EAC1B;AAGA,MAAI,SAAS;AAEb,MAAI,OAAO,QAAQ;AACjB,cAAU,OAAO;AAAA,EACnB;AAEA,MAAI,OAAO,QAAQ;AACjB,QAAI,QAAQ;AACV,gBAAU;AAAA,IACZ;AACA,cAAU,OAAO;AAAA,EACnB;AAEA,MAAI,CAAC,QAAQ;AACX,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEO,IAAM,2BAA8C;AAAA,EACzD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,WAAWC,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iCAAiC;AAAA,IAC3E,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,IACjF,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,cAAc,YAAY,CAAC,EAAE,SAAS,EACnE,SAAS,8BAA8B;AAAA,IAC1C,oBAAoBA,IAAE,MAAM,CAACA,IAAE,OAAO,GAAGA,IAAE,MAAMA,IAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EACrE,SAAS,wDAAwD;AAAA,IACpE,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;AC/DA,SAAS,KAAAC,WAAS;AAGX,IAAM,yBAA4C;AAAA,EACvD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,4DAA4D;AAAA,IAC3G,QAAQA,IAAE,KAAK,CAAC,QAAQ,MAAM,CAAC,EAAE,SAAS,EACvC,SAAS,6BAA6B;AAAA,IACzC,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA,SAAS,KAAAC,WAAS;AAGX,IAAM,uBAA0C;AAAA,EACrD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,4DAA4D;AAAA,IAChG,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACnBA,SAAS,KAAAC,WAAS;AAGX,IAAM,wBAA2C;AAAA,EACtD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOC,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,uCAAuC;AAAA,IAC3E,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,IAC9E,SAAS,oBAAoB,QAAQ;AAAA,IACrC,KAAK,oBAAoB,IAAI;AAAA,IAC7B,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,iBAAiB;AACnB;;;ACrBA,SAAS,KAAAC,WAAS;AAEX,IAAM,oBAAuC;AAAA,EAClD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,IACX,OAAOA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,4DAA4D;AAAA,IAChG,yBAAyBA,IAAE,QAAQ,EAAE,SAAS,EAC3C,SAAS,mDAAmD;AAAA,IAC/D,kBAAkBA,IAAE,QAAQ,EAAE,SAAS,EACpC,SAAS,yCAAyC;AAAA,IACrD,SAASA,IAAE,QAAQ,EAAE,SAAS,EAC3B,SAAS,qDAAqD;AAAA,IACjE,QAAQA,IAAE,OAAO,EAAE,SAAS,EACzB,SAAS,uLAAuL;AAAA,IACnM,SAAS,oBAAoB,QAAQ;AAAA,IACrC,KAAK,oBAAoB,IAAI;AAAA,IAC7B,SAAS,oBAAoB,QAAQ;AAAA,IACrC,gBAAgB,oBAAoB,eAAe;AAAA,EACrD;AAAA,EACA,UAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC3BA,SAAS,KAAAC,WAAS;;;ACUX,SAAS,qBAAqB,OAAe,WAA4C;AAC9F,QAAM,aAAqC;AAAA,IACzC,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,aAAa,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,MAAM,KAAK,GAAG;AACjB,eAAW,UAAU;AACrB,eAAW,OAAO,KAAK,uBAAuB;AAC9C,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,SAAS,MAAM,KAAK,CAAC,MAAM,SAAS,QAAQ,GAAG;AACxD,eAAW,SAAS,KAAK,4DAA4D;AAAA,EACvF;AAEA,MAAI,CAAC,MAAM,SAAS,OAAO,KAAK,CAAC,MAAM,SAAS,cAAc,GAAG;AAC/D,eAAW,YAAY,KAAK,iDAAiD;AAAA,EAC/E;AAEA,SAAO;AACT;;;AClCA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AAqBtB,SAASC,sBAAqB,UAA0B;AACtD,QAAM,aAAqC;AAAA,IACzC,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACA,SAAO,WAAW,SAAS,YAAY,CAAC,KAAK;AAC/C;AAKA,SAAS,sBACP,WACA,UACA,aACA,SACQ;AACR,QAAM,OAAO,eAAe,GAAG,SAAS;AACxC,QAAM,KAAK,WAAW,GAAG,QAAQ,YAAY,UAAU,YAAY,CAAC;AAEpE,SAAO;AAAA,SACA,EAAE;AAAA,WACA,SAAS;AAAA,kBACF,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAMb,QAAQ;AAAA;AAAA;AAAA;AAAA,2BAIU,SAAS,IAAIA,sBAAqB,QAAQ,CAAC;AAAA;AAAA;AAGtE;AAKO,SAAS,kBAAkB,SAA0D;AAC1F,QAAM,EAAE,UAAU,WAAW,UAAU,aAAa,QAAQ,IAAI;AAGhE,QAAM,mBAAwB,cAAQ,QAAQ;AAG9C,QAAM,SAAc,WAAK,kBAAkB,OAAO,SAAS;AAC3D,QAAM,UAAe,WAAK,kBAAkB,QAAQ,SAAS;AAE7D,QAAM,YAAiB,WAAK,QAAQ,GAAG,SAAS,KAAK;AACrD,QAAM,YAAiB,WAAK,SAAS,GAAG,SAAS,QAAQ;AACzD,QAAM,eAAoB,WAAK,SAAS,GAAG,SAAS,IAAIA,sBAAqB,QAAQ,CAAC,EAAE;AAExF,QAAM,eAAyB,CAAC;AAEhC,MAAI;AAEF,IAAG,cAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACxC,IAAG,cAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAKzC,QAAI;AACF,YAAM,eAAe,sBAAsB,WAAW,UAAU,aAAa,OAAO;AACpF,MAAG,kBAAc,WAAW,cAAc,EAAE,UAAU,QAAQ,MAAM,KAAK,CAAC;AAC1E,mBAAa,KAAK,SAAS;AAAA,IAC7B,SAAS,GAAY;AACnB,YAAM,MAAM;AACZ,UAAI,IAAI,SAAS,SAAU,OAAM;AAAA,IACnC;AAEA,QAAI;AACF,YAAM,eAAe,GAAG,SAAS,IAAI,SAAS;AAAA;AAC9C,MAAG,kBAAc,WAAW,cAAc,EAAE,UAAU,QAAQ,MAAM,KAAK,CAAC;AAC1E,mBAAa,KAAK,SAAS;AAAA,IAC7B,SAAS,GAAY;AACnB,YAAM,MAAM;AACZ,UAAI,IAAI,SAAS,SAAU,OAAM;AAAA,IACnC;AAEA,QAAI;AACF,YAAM,kBAAkB,oBAAoB,SAAS;AAAA;AAAA;AACrD,MAAG,kBAAc,cAAc,iBAAiB,EAAE,UAAU,QAAQ,MAAM,KAAK,CAAC;AAChF,mBAAa,KAAK,YAAY;AAAA,IAChC,SAAS,GAAY;AACnB,YAAM,MAAM;AACZ,UAAI,IAAI,SAAS,SAAU,OAAM;AAAA,IACnC;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,uCAAuC,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACnH;AACF;;;AFhGA;AAKO,SAAS,oBAAoB,QAAyB;AAI3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAOC,IAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,MACzD,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,IACxE;AAAA,IACA,OAAO,EAAE,OAAO,SAAS,MAAM;AAC7B,UAAI;AACF,cAAM,aAAa,qBAAqB,OAAO,QAAQ;AACvD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,YAAY,MAAM,CAAC,EAAE,CAAC;AAAA,QACvE;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,kCAAkC,KAAK;AACpD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,UAAUA,IAAE,OAAO,EAAE,SAAS,4DAA4D;AAAA,MAC1F,WAAWA,IAAE,OAAO,EAAE,SAAS,2CAA2C;AAAA,MAC1E,UAAUA,IAAE,OAAO,EAAE,SAAS,8DAA8D;AAAA,MAC5F,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,MAChF,SAASA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,IACpG;AAAA,IACA,OAAO,EAAE,UAAU,WAAW,UAAU,aAAa,QAAQ,MAAM;AACjE,UAAI;AACF,cAAM,SAAS,kBAAkB;AAAA,UAC/B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,UAAU;AAAA,UACd,SAAS;AAAA,UACT,WAAW,OAAO;AAAA,UAClB,UAAU,OAAO;AAAA,UACjB,WAAW,OAAO;AAAA,UAClB,cAAc,OAAO;AAAA,UACrB,cAAc,OAAO;AAAA,UACrB,WAAW;AAAA,YACT,kDAAkD,OAAO;AAAA,YACzD,wBAAwB,OAAO;AAAA,YAC/B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE,CAAC;AAAA,QACpE;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,gCAAgC,KAAK;AAClD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,kBAAgB,QAAQ,oBAAoB;AAC5C,kBAAgB,QAAQ,kBAAkB;AAC1C,kBAAgB,QAAQ,uBAAuB;AAC/C,kBAAgB,QAAQ,yBAAyB;AACjD,kBAAgB,QAAQ,wBAAwB;AAChD,kBAAgB,QAAQ,4BAA4B;AACpD,kBAAgB,QAAQ,2BAA2B;AACnD,kBAAgB,QAAQ,qBAAqB;AAC7C,kBAAgB,QAAQ,gBAAgB;AACxC,kBAAgB,QAAQ,sBAAsB;AAC9C,kBAAgB,QAAQ,qBAAqB;AAC7C,kBAAgB,QAAQ,kBAAkB;AAC1C,kBAAgB,QAAQ,yBAAyB;AACjD,kBAAgB,QAAQ,0BAA0B;AAClD,kBAAgB,QAAQ,4BAA4B;AACpD,kBAAgB,QAAQ,yBAAyB;AACjD,kBAAgB,QAAQ,sBAAsB;AAC9C,kBAAgB,QAAQ,wBAAwB;AAChD,kBAAgB,QAAQ,sBAAsB;AAC9C,kBAAgB,QAAQ,oBAAoB;AAC5C,kBAAgB,QAAQ,qBAAqB;AAC7C,kBAAgB,QAAQ,iBAAiB;AAGzC,gCAA8B,MAAM;AACpC,mCAAiC,MAAM;AACvC,oCAAkC,MAAM;AACxC,iCAA+B,MAAM;AACrC,4BAA0B,MAAM;AAChC,+BAA6B,MAAM;AACrC;;;AG/JA,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,QAAAC,QAAM,WAAAC,gBAAe;AAC9B,SAAS,iBAAAC,sBAAqB;AAE9B,IAAMC,cAAaD,eAAc,YAAY,GAAG;AAChD,IAAME,aAAYH,SAAQE,WAAU;AAK7B,SAAS,yBAAiC;AAC/C,MAAI;AACF,WAAOJ,cAAaC,OAAKI,YAAW,iCAAiC,GAAG,OAAO;AAAA,EACjF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,sBAA8B;AAC5C,MAAI;AACF,WAAOL,cAAaC,OAAKI,YAAW,8BAA8B,GAAG,OAAO;AAAA,EAC9E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,uBAA+B;AAC7C,MAAI;AACF,WAAOL,cAAaC,OAAKI,YAAW,oCAAoC,GAAG,OAAO;AAAA,EACpF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,yBAAiC;AAC/C,MAAI;AACF,WAAOL,cAAaC,OAAKI,YAAW,sCAAsC,GAAG,OAAO;AAAA,EACtF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACtCO,SAAS,wBAAwB,QAAyB;AAE/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AACV,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM,uBAAuB;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AACV,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM,oBAAoB;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AACV,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM,qBAAqB;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,YAAY;AACV,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM,uBAAuB;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACxFA;AACA;AAHA,SAAS,KAAAC,WAAS;AAIlB,SAAS,QAAAC,cAAY;AACrB,SAAS,iBAAAC,sBAAqB;;;ACI9B;AACA;AANA,SAAS,cAAAC,aAAY,WAAAC,gBAAe;AACpC,SAAS,iBAAAC,sBAAqB;AA0B9B,eAAsB,6BACpB,OAAiC,CAAC,GACH;AAC/B,QAAM,EAAE,gBAAgB,SAAS,qBAAAC,qBAAoB,IAAI,MAAM;AAC/D,QAAM,UAAU,KAAK,iBAAiB,CAAC;AAEvC,QAAM,SAA+B;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,QAAQ,YAAY;AAAA,IAC9B,YAAY,QAAQ,cAAcF,SAAQ,SAAS,IAAI;AAAA,IACvD,aAAa,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,EACrB;AAEA,QAAM,UAAU,iBAAiB;AACjC,QAAM,SAAS,MAAM,QAAQ,kBAAkB,MAAM;AAIrD,MAAI,eAAe,KAAK;AACxB,MAAI,gBAAgB,CAAC,aAAa,WAAW,SAAS,GAAG;AACvD,UAAM,eAAeD,YAAW,YAAY,IACxC,eACAC,SAAQE,qBAAoB,GAAG,YAAY;AAC/C,mBAAeD,eAAc,YAAY,EAAE;AAAA,EAC7C;AACA,iBAAe,gBAAgBA,eAAcD,SAAQ,SAAS,IAAI,CAAC,EAAE;AAErE,QAAM,OAAO,WAAW,YAAY;AACpC,SAAO,MAAM,+CAA+C,YAAY,EAAE;AAE1E,SAAO;AACT;;;ADlCA,SAAS,kBAAkB,aAAmC;AAC5D,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,SAAS,YAAY,MAAM;AAAA,CAAc;AAEpD,cAAY,QAAQ,CAAC,YAAY,UAAU;AACzC,UAAM,eAAe,gBAAgB,WAAW,QAAQ;AACxD,UAAM,eAAe,gBAAgB,WAAW,QAAQ;AACxD,UAAM,WAAW,QAAQ,WAAW,MAAM,MAAM,OAAO,CAAC,YAAY,WAAW,MAAM,MAAM,YAAY,CAAC;AAExG,UAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,YAAY,IAAI,YAAY,OAAO,QAAQ,EAAE;AACzE,UAAM,KAAK,MAAM,WAAW,OAAO,EAAE;AACrC,QAAI,WAAW,QAAQ;AACrB,YAAM,KAAK,cAAc,WAAW,MAAM,EAAE;AAAA,IAC9C;AACA,QAAI,WAAW,MAAM;AACnB,YAAM,KAAK,YAAY,WAAW,IAAI,EAAE;AAAA,IAC1C;AACA,UAAM,KAAK,EAAE;AAAA,EACf,CAAC;AAED,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,gBAAgB,UAA0B;AACjD,UAAQ,UAAU;AAAA,IAChB,KAAK;AAAG,aAAO;AAAA;AAAA,IACf,KAAK;AAAG,aAAO;AAAA;AAAA,IACf,KAAK;AAAG,aAAO;AAAA;AAAA,IACf,KAAK;AAAG,aAAO;AAAA;AAAA,IACf;AAAS,aAAO;AAAA,EAClB;AACF;AAEA,SAAS,gBAAgB,UAA0B;AACjD,UAAQ,UAAU;AAAA,IAChB,KAAK;AAAG,aAAO;AAAA,IACf,KAAK;AAAG,aAAO;AAAA,IACf,KAAK;AAAG,aAAO;AAAA,IACf,KAAK;AAAG,aAAO;AAAA,IACf;AAAS,aAAO;AAAA,EAClB;AACF;AAKA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AAAA,EACA,gBAAgB,CAAC;AACnB,GAAwD;AACtD,MAAI;AACF,WAAO,KAAK,2CAA2C;AAEvD,UAAM,iBAAiB,MAAM,6BAA6B;AAAA,MACxD;AAAA,MACA;AAAA,IACF,CAAC;AAGD,UAAM,UAAUG,eAAcC,OAAK,iBAAiB,UAAU,GAAG,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;AAE3F,UAAM,cAAc,MAAM,eAAe,WAAW,QAAQ,OAAO;AAGnE,UAAM,UAAU;AAAA,MACd,YAAY,YAAY,OAAO,OAAK,EAAE,aAAa,CAAC,EAAE;AAAA,MACtD,WAAW,YAAY,OAAO,OAAK,EAAE,aAAa,CAAC,EAAE;AAAA,MACrD,WAAW,YAAY,OAAO,OAAK,EAAE,aAAa,CAAC,EAAE;AAAA,MACrD,cAAc,YAAY,OAAO,OAAK,EAAE,aAAa,CAAC,EAAE;AAAA,IAC1D;AAEA,UAAM,UAAU,QAAQ,eAAe;AACvC,UAAM,kBAAkB,kBAAkB,WAAW;AAErD,WAAO,KAAK,kCAAkC,OAAO,aAAa,YAAY,MAAM,EAAE;AAEtF,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EAEF,SAAS,OAAO;AACd,WAAO,MAAM,6BAA6B,KAAK;AAC/C,UAAM,IAAI,MAAM,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,EACrG;AACF;AAcO,SAAS,2BAA2B,QAAyB;AAClE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWC,IAAE,KAAK,CAAC,OAAO,SAAS,QAAQ,QAAQ,SAAS,SAAS,KAAK,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC5H,SAASA,IAAE,OAAO,EAAE,SAAS,iEAAiE;AAAA,MAC9F,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,MACvF,eAAeA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iEAAiE;AAAA,IACjH;AAAA,IACA,OAAO,EAAE,SAAS,eAAe,aAAa,UAAU,MAAM;AAC5D,UAAI;AACF,cAAM,gBAAuC,CAAC;AAE9C,YAAI,aAAa;AACf,wBAAc,aAAa;AAAA,QAC7B;AACA,YAAI,WAAW;AACb,wBAAc,WAAW;AAAA,QAC3B;AAEA,cAAM,SAAS,MAAM,eAAe;AAAA,UAClC,QAAQ;AAAA,UACR;AAAA,UACA,cAAc;AAAA,QAChB,CAAC;AAGD,cAAM,kBAAkB;AAAA,UACtB,aAAa,OAAO,YAAY,IAAI,QAAM;AAAA,YACxC,MAAM,EAAE;AAAA,YACR,QAAQ,EAAE,MAAM,MAAM,YAAY;AAAA;AAAA,YAClC,MAAM,EAAE,MAAM,MAAM,OAAO;AAAA;AAAA,YAC3B,SAAS,EAAE;AAAA,YACX,UAAU,gBAAgB,EAAE,QAAQ;AAAA,YACpC,QAAQ,EAAE;AAAA,UACZ,EAAE;AAAA,UACF,iBAAiB,OAAO;AAAA,UACxB,SAAS,OAAO;AAAA,UAChB,SAAS,OAAO;AAAA,QAClB;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM,KAAK,UAAU,iBAAiB,MAAM,CAAC;AAAA,cAC7C,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MAEF,SAAS,OAAO;AACd,eAAO,MAAM,yCAAyC,KAAK;AAC3D,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,cACxE,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAMF;;;AErMA;AACA;AAVA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAAC,aAAY,WAAAC,iBAAe;AACpC,SAAS,iBAAAC,sBAAqB;AAoC9B,eAAe,qBAAqB,QAAuB;AACzD,SAAO,6BAA6B;AAAA,IAClC,eAAe,EAAE,YAAY,OAAO,WAAW;AAAA,IAC/C,cAAc,OAAO;AAAA,EACvB,CAAC;AACH;AAKA,SAAS,wBACP,QACqC;AAGrC,QAAM,UAAUC,YAAW,OAAO,QAAQ,IACtC,OAAO,WACPC,UAAQ,oBAAoB,GAAG,OAAO,QAAQ;AAClD,QAAM,SAASC,eAAc,OAAO,EAAE;AAEtC,SAAO,EAAE,SAAS,OAAO;AAC3B;AAKA,eAAe,wBACb,QACA,QACA,SACA,QACqC;AAErC,MAAI;AACJ,MAAI,OAAO,aAAa;AACtB,WAAO,OAAO;AAAA,EAChB,OAAO;AACL,QAAI;AACF,aAAO,MAAMC,UAAS,SAAS,OAAO;AAAA,IACxC,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,qBAAqB,OAAO,KAAK,iBAAiB,QAAQ,MAAM,UAAU,KAAK,EAAE;AAAA,IACnG;AAAA,EACF;AAGA,SAAO,aAAa,QAAQ,IAAI;AAEhC,SAAO;AAAA,IACL,UAAU,EAAE,WAAW,OAAO,WAAW,MAAM,OAAO,KAAK;AAAA,IAC3D,cAAc,EAAE,KAAK,OAAO;AAAA,EAC9B;AACF;AAKA,eAAsB,cAAc,QAAkD;AACpF,SAAO,KAAK,qBAAqB,OAAO,QAAQ,IAAI,OAAO,IAAI,IAAI,OAAO,SAAS,EAAE;AACrF,QAAM,SAAS,MAAM,qBAAqB,MAAM;AAChD,QAAM,EAAE,SAAS,OAAO,IAAI,wBAAwB,MAAM;AAC1D,QAAM,iBAAiB,MAAM,wBAAwB,QAAQ,QAAQ,SAAS,MAAM;AAEpF,MAAI;AACF,WAAO,MAAM,OAAO,eAAe,cAAc;AAAA,EACnD,UAAE;AACA,WAAO,cAAc,MAAM;AAAA,EAC7B;AACF;AAKA,eAAsB,cAAc,QAA+C;AACjF,SAAO,KAAK,qBAAqB,OAAO,QAAQ,IAAI,OAAO,IAAI,IAAI,OAAO,SAAS,EAAE;AACrF,QAAM,SAAS,MAAM,qBAAqB,MAAM;AAChD,QAAM,EAAE,SAAS,OAAO,IAAI,wBAAwB,MAAM;AAC1D,QAAM,iBAAiB,MAAM,wBAAwB,QAAQ,QAAQ,SAAS,MAAM;AAEpF,MAAI;AACF,WAAO,MAAM,OAAO,cAAc,cAAc;AAAA,EAClD,UAAE;AACA,WAAO,cAAc,MAAM;AAAA,EAC7B;AACF;AAKA,eAAsB,cAAc,QAA+C;AACjF,SAAO,KAAK,qBAAqB,OAAO,QAAQ,IAAI,OAAO,IAAI,IAAI,OAAO,SAAS,EAAE;AACrF,QAAM,SAAS,MAAM,qBAAqB,MAAM;AAChD,QAAM,EAAE,SAAS,OAAO,IAAI,wBAAwB,MAAM;AAC1D,QAAM,iBAAiB,MAAM,wBAAwB,QAAQ,QAAQ,SAAS,MAAM;AAEpF,MAAI;AACF,WAAO,MAAM,OAAO,cAAc;AAAA,MAChC,GAAG;AAAA,MACH,SAAS,EAAE,oBAAoB,KAAK;AAAA,IACtC,CAAC;AAAA,EACH,UAAE;AACA,WAAO,cAAc,MAAM;AAAA,EAC7B;AACF;;;ACzIA,SAAS,KAAAC,WAAS;AAOlB;AAKA,IAAM,kBAAkB;AAAA,EACtB,WAAWC,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,0CAA0C;AAAA,EACtF,cAAcA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,EAC1G,WAAWA,IAAE,OAAO,EAAE,SAAS,kIAAkI;AAAA,EACjK,MAAMA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,qCAAqC;AAAA,EAC5E,aAAaA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,EACvF,eAAeA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iEAAiE;AACjH;AAKA,SAAS,gBAAgB,OAOtB;AACD,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM;AAAA,IACZ,YAAY,MAAM;AAAA,IAClB,cAAc,MAAM;AAAA,EACtB;AACF;AAKO,SAAS,iBAAiB,QAAyB;AAExD,6BAA2B,MAAM;AAGjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAU;AACf,UAAI;AACF,cAAM,QAAQ,MAAM,cAAc,gBAAgB,KAAK,CAAC;AACxD,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM,KAAK,UAAU;AAAA,cACnB,iBAAiB,MAAM;AAAA,cACvB,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,gBAC1B,QAAQ,KAAK;AAAA,gBACb,eAAe,KAAK;AAAA,gBACpB,YAAY,KAAK;AAAA,gBACjB,MAAM,KAAK;AAAA,gBACX,OAAO,KAAK;AAAA,cACd,EAAE;AAAA,YACJ,GAAG,MAAM,CAAC;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,gCAAgC,KAAK;AAClD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,IAAI,MAAM,OAAgB,CAAC;AAAA,UAC/G,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAU;AACf,UAAI;AACF,cAAM,YAAY,MAAM,cAAc,gBAAgB,KAAK,CAAC;AAC5D,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM,KAAK,UAAU;AAAA,cACnB,iBAAiB,UAAU;AAAA,cAC3B,WAAW,UAAU,IAAI,CAAC,SAAS;AAAA,gBACjC,cAAc,IAAI,MAAM,IAAI;AAAA,gBAC5B,SAAS,IAAI,MAAM,IAAI,OAAO;AAAA,gBAC9B,gBAAgB,IAAI,MAAM,MAAM;AAAA,gBAChC,WAAW,IAAI,MAAM,MAAM,OAAO;AAAA,gBAClC,KAAK,IAAI;AAAA,cACX,EAAE;AAAA,YACJ,GAAG,MAAM,CAAC;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,gCAAgC,KAAK;AAClD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,IAAI,MAAM,OAAgB,CAAC;AAAA,UAC/G,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAU;AACf,UAAI;AACF,cAAM,YAAY,MAAM,cAAc,gBAAgB,KAAK,CAAC;AAC5D,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM,KAAK,UAAU;AAAA,cACnB,WAAW,UAAU,IAAI,CAAC,SAAS;AAAA,gBACjC,cAAc,IAAI,MAAM,IAAI;AAAA,gBAC5B,SAAS,IAAI,MAAM,IAAI,OAAO;AAAA,gBAC9B,gBAAgB,IAAI,MAAM,MAAM;AAAA,gBAChC,WAAW,IAAI,MAAM,MAAM,OAAO;AAAA,gBAClC,KAAK,IAAI;AAAA,cACX,EAAE;AAAA,cACF,gBAAgB,UAAU;AAAA,YAC5B,GAAG,MAAM,CAAC;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,gCAAgC,KAAK;AAClD,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,eAAe,IAAI,MAAM,OAAgB,CAAC;AAAA,UAC/G,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACxJA,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AACzC,SAAS,QAAAC,cAAY;;;ACKd,IAAM,qBAAyC;AAAA,EACpD;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,IACd,iBAAiB;AAAA,MACf,YAAY;AAAA,MACZ,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,EACX;AACF;;;ADlDA;AACA;AAOA,SAAS,gBAAwB;AAC/B,SAAO;AACT;AAKA,SAAS,oBAAoB,cAAqC;AAChE,MAAI;AACF,UAAM,WAAWC,OAAK,cAAc,GAAG,YAAY;AAEnD,QAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,aAAO,KAAK,4BAA4B,QAAQ,EAAE;AAClD,aAAO;AAAA,IACT;AAEA,WAAOC,cAAa,UAAU,OAAO;AAAA,EACvC,SAAS,OAAO;AACd,WAAO,MAAM,+BAA+B,YAAY,KAAK,KAAK;AAClE,WAAO;AAAA,EACT;AACF;AAKO,SAAS,6BAA6B,QAAyB;AACpE,aAAW,gBAAgB,oBAAoB;AAC7C,QAAI,CAAC,aAAa,QAAS;AAE3B,UAAM,cAAc,sBAAsB,aAAa,QAAQ;AAE/D,WAAO;AAAA,MACL,GAAG,aAAa,SAAS,YAAY,CAAC;AAAA,MACtC;AAAA,MACA;AAAA,QACE,aAAa,kCAAkC,aAAa,QAAQ;AAAA,QACpE,UAAU;AAAA,MACZ;AAAA,MACA,YAAY;AACV,cAAM,UAAU,oBAAoB,aAAa,OAAQ;AAEzD,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,UAAU,CAAC;AAAA,cACT,KAAK;AAAA,cACL,UAAU;AAAA,cACV,MAAM,KAAK,aAAa,SAAS,YAAY,CAAC;AAAA;AAAA;AAAA,YAChD,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO;AAAA,UACL,UAAU,CAAC;AAAA,YACT,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,kCAAkC,QAAyB;AACzE,aAAW,gBAAgB,oBAAoB;AAC7C,QAAI,CAAC,aAAa,aAAc;AAEhC,UAAM,cAAc,sBAAsB,aAAa,QAAQ;AAE/D,WAAO;AAAA,MACL,GAAG,aAAa,SAAS,YAAY,CAAC;AAAA,MACtC;AAAA,MACA;AAAA,QACE,aAAa,6DAA6D,aAAa,QAAQ;AAAA,QAC/F,UAAU;AAAA,MACZ;AAAA,MACA,YAAY;AACV,cAAM,UAAU,oBAAoB,aAAa,YAAa;AAE9D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,UAAU,CAAC;AAAA,cACT,KAAK;AAAA,cACL,UAAU;AAAA,cACV,MAAM,KAAK,aAAa,SAAS,YAAY,CAAC;AAAA;AAAA;AAAA,YAChD,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO;AAAA,UACL,UAAU,CAAC;AAAA,YACT,KAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,oCAAoC,QAAyB;AAC3E,aAAW,gBAAgB,oBAAoB;AAC7C,QAAI,CAAC,aAAa,gBAAiB;AAEnC,eAAW,CAAC,cAAc,QAAQ,KAAK,OAAO,QAAQ,aAAa,eAAe,GAAG;AACnF,YAAM,cAAc,sBAAsB,aAAa,QAAQ,IAAI,YAAY;AAE/E,aAAO;AAAA,QACL,GAAG,aAAa,SAAS,YAAY,CAAC,IAAI,aAAa,QAAQ,KAAK,GAAG,EAAE,QAAQ,SAAS,OAAK,EAAE,YAAY,CAAC,CAAC;AAAA,QAC/G;AAAA,QACA;AAAA,UACE,aAAa,UAAU,aAAa,QAAQ,KAAK,GAAG,CAAC,cAAc,aAAa,QAAQ;AAAA,UACxF,UAAU;AAAA,QACZ;AAAA,QACA,YAAY;AACV,gBAAM,UAAU,oBAAoB,QAAQ;AAE5C,cAAI,CAAC,SAAS;AACZ,mBAAO;AAAA,cACL,UAAU,CAAC;AAAA,gBACT,KAAK;AAAA,gBACL,UAAU;AAAA,gBACV,MAAM,KAAK,aAAa,SAAS,YAAY,CAAC,IAAI,aAAa,QAAQ,KAAK,GAAG,EAAE,QAAQ,SAAS,OAAK,EAAE,YAAY,CAAC,CAAC;AAAA;AAAA;AAAA,cACzH,CAAC;AAAA,YACH;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,UAAU,CAAC;AAAA,cACT,KAAK;AAAA,cACL,UAAU;AAAA,cACV,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,0BAA0B,QAAyB;AACjE,SAAO,KAAK,4CAA4C;AAGxD,+BAA6B,MAAM;AAGnC,oCAAkC,MAAM;AAGxC,sCAAoC,MAAM;AAE1C,SAAO,KAAK,4BAA4B,mBAAmB,MAAM,YAAY;AAC/E;;;AE7KA,SAAS,KAAAC,WAAS;AAClB,SAAS,YAAAC,iBAAgB;;;ACLzB,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,QAAAC,QAAM,WAAAC,gBAAe;AAC9B,SAAS,iBAAAC,sBAAqB;AAE9B,IAAMC,cAAaD,eAAc,YAAY,GAAG;AAChD,IAAME,aAAYH,SAAQE,WAAU;AAK7B,SAAS,mBAAmB,gBAAgC;AACjE,MAAI;AACF,UAAM,aAAaH,OAAKI,YAAW,cAAc;AACjD,WAAOL,cAAa,YAAY,OAAO;AAAA,EACzC,SAAS,OAAO;AACd,WAAO,oBAAoB,cAAc,oBAAoB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,EACvH;AACF;AAKO,SAAS,sBAAsB,UAAkB,WAA2C;AACjG,MAAI,YAAY;AAGhB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,UAAM,WAAW;AAAA,MACf,IAAI,OAAO,SAAS,GAAG,UAAU,GAAG;AAAA,MACpC,IAAI,OAAO,MAAM,GAAG,OAAO,GAAG;AAAA,IAChC;AAEA,eAAW,WAAW,UAAU;AAC9B,kBAAY,UAAU,QAAQ,SAAS,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;;;AD/BA;AAGO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAsBO,IAAM,8BAA8BM,IAAE,OAAO;AAAA,EAClD,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,oCAAoC;AAAA,EAChD,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,8BAA8B;AAC5C,CAAC;AAQM,IAAM,2BAA2BA,IAAE,OAAO;AAAA,EAC/C,UAAUA,IACP,OAAO,EACP,SAAS,6BAA6B;AAAA,EACzC,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,4CAA4C;AAAA,EACxD,aAAaA,IACV,OAAO,EACP,SAAS,EACT,SAAS,2EAA2E;AAAA,EACvF,gBAAgBA,IACb,OAAO,EACP,SAAS,EACT,SAAS,mEAAmE;AAAA,EAC/E,gBAAgBA,IACb,OAAO,EACP,SAAS,EACT,SAAS,kDAAkD;AAChE,CAAC;AASM,IAAM,iCAAiCA,IAAE,OAAO;AAAA,EACrD,WAAWA,IACR,OAAO,EACP,SAAS,2DAA2D;AAAA,EACvE,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,mCAAmC;AAAA,EAC/C,cAAcA,IACX,OAAO,EACP,SAAS,EACT,SAAS,iCAAiC;AAAA,EAC7C,WAAWA,IACR,OAAO,OAAO,EACd,SAAS,EACT,SAAS,6CAA6C;AAC3D,CAAC;AAQM,IAAM,mBAAmBA,IAAE,OAAO;AAAA,EACvC,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,EACT,SAAS,+CAA+C;AAAA,EAC3D,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,8BAA8B;AAC5C,CAAC;AAOM,IAAM,sBAAsBA,IAAE,OAAO;AAAA,EAC1C,UAAUA,IACP,OAAO,EACP,SAAS,EACT,SAAS,0CAA0C;AAAA,EACtD,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,EACT,SAAS,+CAA+C;AAAA,EAC3D,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,8BAA8B;AAC5C,CAAC;AAOM,IAAM,kBAAkBA,IAAE,OAAO;AAAA,EACtC,SAASA,IACN,OAAO,EACP,SAAS,EACT,SAAS,8BAA8B;AAAA,EAC1C,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,mCAAmC;AACjD,CAAC;AAQM,IAAM,2BAA2BA,IAAE,OAAO;AAAA,EAC/C,cAAcA,IACX,OAAO,EACP,SAAS,EACT,SAAS,uDAAuD;AAAA,EACnE,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,mCAAmC;AAAA,EAC/C,WAAWA,IACR,OAAO,EACP,SAAS,+CAA+C;AAC7D,CAAC;AAOM,IAAM,4BAA4BA,IAAE,OAAO;AAAA,EAChD,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,mCAAmC;AAAA,EAC/C,WAAWA,IACR,OAAO,EACP,SAAS,+CAA+C;AAC7D,CAAC;AAOM,IAAM,kCAAkCA,IAAE,OAAO;AAAA,EACtD,UAAUA,IACP,KAAK,mBAAmB,EACxB,SAAS,EACT,SAAS,oCAAoC;AAAA,EAChD,WAAWA,IACR,OAAO,EACP,SAAS,EACT,SAAS,wCAAwC;AAAA,EACpD,cAAcA,IACX,OAAO,EACP,SAAS,EACT,SAAS,6CAA6C;AAC3D,CAAC;AAOM,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAYO,SAAS,wBAAwB,QAAyB;AAE/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,4BAA4B;AAAA,IAC5B,OAAO,EAAE,UAAU,UAAU,MAAM;AACjC,YAAM,WAAW,mBAAmB,wBAAwB;AAC5D,YAAM,UAAU,sBAAsB,UAAU;AAAA,QAC9C;AAAA,QACA,WAAW,aAAa;AAAA,MAC1B,CAAC;AAED,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM;AAAA;AAAA,kBAAiC,QAAQ;AAAA,EAAK,YAAY,qBAAqB,SAAS;AAAA,IAAO,EAAE;AAAA,EAAK,OAAO;AAAA,YACrH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,yBAAyB;AAAA,IACzB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,YAAM,WAAW,mBAAmB,gCAAgC;AACpE,YAAM,UAAU,sBAAsB,UAAU;AAAA,QAC9C;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,+BAA+B;AAAA,IAC/B,OAAO,EAAE,WAAW,UAAU,cAAc,UAAU,MAAM;AAC1D,YAAM,WAAW,mBAAmB,sCAAsC;AAG1E,YAAM,cACJ,gBACAC,UAAS,SAAS,EACf,QAAQ,iBAAiB,EAAE,EAC3B,YAAY,EACZ,QAAQ,eAAe,GAAG,KAC7B;AAEF,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,OAAO,EAAE,UAAU,UAAU,MAAM;AACjC,YAAM,WAAW,mBAAmB,wBAAwB;AAE5D,UAAI,iBAAiB;AACrB,UAAI,UAAU;AACZ,0BAAkB,mBAAmB,QAAQ;AAAA;AAAA,MAC/C;AACA,UAAI,WAAW;AACb,0BAAkB,qBAAqB,SAAS;AAAA;AAAA,MAClD;AACA,UAAI,YAAY,WAAW;AACzB,0BAAkB;AAAA,MACpB;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB,OAAO,EAAE,UAAU,WAAW,SAAS,MAAM;AAC3C,YAAM,WAAW,mBAAmB,2BAA2B;AAE/D,UAAI,iBAAiB;AACrB,UAAI,UAAU;AACZ,0BAAkB,mBAAmB,QAAQ;AAAA;AAAA,MAC/C;AACA,UAAI,WAAW;AACb,0BAAkB,qBAAqB,SAAS;AAAA;AAAA,MAClD;AACA,UAAI,UAAU;AACZ,0BAAkB,mBAAmB,QAAQ;AAAA;AAAA,MAC/C;AACA,UAAI,YAAY,aAAa,UAAU;AACrC,0BAAkB;AAAA,MACpB;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO,EAAE,SAAS,UAAU,MAAM;AAChC,YAAM,WAAW,mBAAmB,sCAAsC;AAE1E,UAAI,iBAAiB;AACrB,UAAI,SAAS;AACX,0BAAkB,mBAAmB,OAAO;AAAA;AAAA,MAC9C;AACA,UAAI,WAAW;AACb,0BAAkB,qBAAqB,SAAS;AAAA;AAAA,MAClD;AACA,UAAI,WAAW,WAAW;AACxB,0BAAkB;AAAA,MACpB;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO,EAAE,SAAS,UAAU,MAAM;AAChC,YAAM,WAAW,mBAAmB,qCAAqC;AAEzE,UAAI,iBAAiB;AACrB,UAAI,SAAS;AACX,0BAAkB,mBAAmB,OAAO;AAAA;AAAA,MAC9C;AACA,UAAI,WAAW;AACb,0BAAkB,qBAAqB,SAAS;AAAA;AAAA,MAClD;AACA,UAAI,WAAW,WAAW;AACxB,0BAAkB;AAAA,MACpB;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,yBAAyB;AAAA,IACzB,OAAO,EAAE,WAAW,UAAU,aAAa,MAAM;AAC/C,YAAM,WAAW,mBAAmB,gCAAgC;AAEpE,UAAI,iBAAiB;AACrB,wBAAkB,qBAAqB,SAAS;AAAA;AAChD,wBAAkB,mBAAmB,QAAQ;AAAA;AAC7C,UAAI,cAAc;AAChB,0BAAkB,wBAAwB,YAAY;AAAA;AAAA,MACxD;AACA,wBAAkB;AAElB,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,0BAA0B;AAAA,IAC1B,OAAO,EAAE,WAAW,SAAS,MAAM;AACjC,YAAM,WAAW,mBAAmB,iCAAiC;AAErE,YAAM,iBAAiB;AAAA;AAAA,oBAET,SAAS;AAAA,kBACX,QAAQ;AAAA;AAAA;AAIpB,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gCAAgC;AAAA,IAChC,OAAO,EAAE,UAAU,WAAW,aAAa,MAAM;AAC/C,YAAM,WAAW,mBAAmB,wCAAwC;AAE5E,UAAI,iBAAiB;AACrB,UAAI,UAAU;AACZ,0BAAkB,mBAAmB,QAAQ;AAAA;AAAA,MAC/C;AACA,UAAI,WAAW;AACb,0BAAkB,qBAAqB,SAAS;AAAA;AAAA,MAClD;AACA,UAAI,cAAc;AAChB,0BAAkB,wBAAwB,YAAY;AAAA;AAAA,MACxD;AACA,UAAI,YAAY,aAAa,cAAc;AACzC,0BAAkB;AAAA,MACpB;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,iBAAiB;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK,cAAc,sBAAsB,MAAM,mBAAmB;AAC3E;AAKO,SAAS,uBACd,UACA,UACA,aACA,gBACA,gBACQ;AACR,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,mBAAmB,QAAQ;AAAA,IAC3B,mBAAmB,QAAQ;AAAA,EAC7B;AAEA,MAAI,aAAa;AACf,UAAM,KAAK,uBAAuB,WAAW,EAAE;AAAA,EACjD;AACA,MAAI,gBAAgB;AAClB,UAAM,KAAK,0BAA0B,cAAc,EAAE;AAAA,EACvD;AACA,MAAI,gBAAgB;AAClB,UAAM,KAAK,0BAA0B,cAAc,EAAE;AAAA,EACvD;AAEA,QAAM,KAAK,IAAI,6BAA6B,EAAE;AAE9C,MAAI,aAAa;AACf,UAAM;AAAA,MACJ,uEAAuE,WAAW;AAAA,IACpF;AAAA,EACF,OAAO;AACL,UAAM,KAAK,mDAAmD;AAAA,EAChE;AAEA,MAAI,gBAAgB;AAClB,UAAM;AAAA,MACJ,6FAA6F,cAAc;AAAA,IAC7G;AAAA,EACF,OAAO;AACL,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB;AAClB,UAAM;AAAA,MACJ,6EAA6E,cAAc;AAAA,IAC7F;AAAA,EACF,OAAO;AACL,UAAM,KAAK,8CAA8C;AAAA,EAC3D;AAEA,QAAM,KAAK,IAAI,EAAE;AACjB,SAAO,MAAM,KAAK,IAAI;AACxB;AAKO,SAAS,qBACd,WACA,UACA,cACA,WACQ;AACR,SAAO;AAAA;AAAA,sBAEa,SAAS;AAAA,kBACb,QAAQ;AAAA,uBACH,YAAY;AAAA,0BACT,aAAa,6CAA6C;AAAA;AAAA;AAAA;AAAA,6EAIP,SAAS;AAAA,wGACkB,SAAS,mBAAmB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAM5I;;;AEjpBA,SAAS,KAAAC,WAAS;AAClB,SAAS,cAAAC,mBAAkB;;;ACP3B,SAAS,UAAU,SAAS,aAAa;AACrC,MAAI,YAAY;AACZ,UAAM,IAAI,MAAM,wBAAwB;AAC5C,MAAI,gBAAgB;AAChB,UAAM,IAAI,MAAM,6BAA6B;AACrD;AACO,IAAM,MAAN,MAAU;AAAA,EACb;AAAA,EACA;AAAA,EACA,YAAY,SAAS,aAAa;AAC9B,cAAU,SAAS,WAAW;AAC9B,SAAK,UAAU;AACf,SAAK,OAAO;AAAA,EAChB;AAAA,EACA,MAAM,OAAO;AACT,UAAM,OAAO,MAAM,KAAK,QAAQ,KAAK;AACrC,QAAI;AACA,WAAK,OAAO;AAAA,EACpB;AAAA,EACA,MAAM,QAAQ;AACV,QAAI,KAAK;AACL,YAAM,KAAK,QAAQ,MAAM,KAAK,IAAI;AAAA,EAC1C;AAAA,EACA,MAAM,OAAO,IAAI;AACb,OAAG,KAAK,IAAI;AACZ,UAAM,KAAK,MAAM;AAAA,EACrB;AACJ;;;AC3BA,SAAS,gBAAAC,eAAc,YAAY,iBAAAC,sBAAqB;AAExD,OAAOC,WAAU;AA0BV,IAAM,eAAN,MAAmB;AAAA,EACtB;AAAA,EACA;AAAA,EACA,YAAY,UAAU;AAClB,SAAK,YAAY;AACjB,UAAM,IAAI,SAAS,SAAS;AAC5B,SAAK,gBAAgBC,MAAK,KAAKA,MAAK,QAAQ,CAAC,GAAG,IAAIA,MAAK,SAAS,CAAC,CAAC,MAAM;AAAA,EAC9E;AAAA,EACA,OAAO;AACH,QAAI;AACJ,QAAI;AACA,aAAOC,cAAa,KAAK,WAAW,OAAO;AAAA,IAC/C,SACO,GAAG;AACN,UAAI,EAAE,SAAS,UAAU;AACrB,eAAO;AAAA,MACX;AACA,YAAM;AAAA,IACV;AACA,WAAO;AAAA,EACX;AAAA,EACA,MAAMC,MAAK;AACP,IAAAC,eAAc,KAAK,eAAeD,IAAG;AACrC,eAAW,KAAK,eAAe,KAAK,SAAS;AAAA,EACjD;AACJ;;;AC9BO,IAAM,eAAN,MAAmB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,UAAU,EAAE,OAAAE,QAAO,UAAW,GAAG;AACzC,SAAK,WAAW,IAAI,aAAa,QAAQ;AACzC,SAAK,SAASA;AACd,SAAK,aAAa;AAAA,EACtB;AAAA,EACA,OAAO;AACH,UAAM,OAAO,KAAK,SAAS,KAAK;AAChC,QAAI,SAAS,MAAM;AACf,aAAO;AAAA,IACX,OACK;AACD,aAAO,KAAK,OAAO,IAAI;AAAA,IAC3B;AAAA,EACJ;AAAA,EACA,MAAM,KAAK;AACP,SAAK,SAAS,MAAM,KAAK,WAAW,GAAG,CAAC;AAAA,EAC5C;AACJ;;;ACnCO,IAAM,eAAN,cAA2B,aAAa;AAAA,EAC3C,YAAY,UAAU;AAClB,UAAM,UAAU;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,WAAW,CAAC,SAAS,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,IACrD,CAAC;AAAA,EACL;AACJ;;;ACNA;AAHA,SAAS,aAAAC,YAAW,iBAAAC,sBAAqB;AACzC,SAAS,QAAAC,cAAY;AACrB,SAAS,cAAAC,mBAAkB;;;ACT3B,SAAS,KAAAC,WAAS;AAUX,IAAM,sBAAsBA,IAAE,OAAO;AAAA,EAC1C,QAAQA,IAAE,OAAO;AAAA,EACjB,WAAWA,IAAE,OAAO;AAAA;AAAA,EACpB,UAAUA,IAAE,OAAO;AAAA,EACnB,YAAYA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAAA,EAC5B,QAAQA,IAAE,IAAI;AAAA,EACd,SAASA,IAAE,QAAQ;AAAA,EACnB,UAAUA,IAAE,OAAO;AAAA;AAAA,EACnB,mBAAmBA,IAAE,OAAO,EAAE,SAAS;AACzC,CAAC;AAOM,IAAM,4BAA4BA,IAAE,OAAO;AAAA,EAChD,aAAaA,IAAE,OAAO;AAAA,EACtB,WAAWA,IAAE,OAAO;AAAA,EACpB,MAAMA,IAAE,KAAK,CAAC,eAAe,YAAY,gBAAgB,CAAC;AAAA,EAC1D,SAASA,IAAE,QAAQ;AAAA,EACnB,SAASA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAAA,EACzB,SAASA,IAAE,OAAO;AAAA,IAChB,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACnC,CAAC,EAAE,SAAS;AACd,CAAC;AAOM,IAAM,2BAA2BA,IAAE,OAAO;AAAA,EAC/C,SAASA,IAAE,OAAO;AAAA,EAClB,WAAWA,IAAE,OAAO;AAAA,EACpB,cAAcA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA;AAAA,EACvC,YAAYA,IAAE,OAAO;AAAA,IACnB,sBAAsBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC/C,qBAAqBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC9C,sBAAsBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC/C,uBAAuBA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAClD,CAAC;AAAA,EACD,OAAOA,IAAE,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA,EACvC,iBAAiBA,IAAE,MAAMA,IAAE,OAAO,CAAC;AACrC,CAAC;AAOM,IAAM,mBAAmBA,IAAE,OAAO;AAAA,EACvC,cAAcA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EAChC,mBAAmBA,IAAE,KAAK,CAAC,WAAW,WAAW,QAAQ,CAAC;AAAA,EAC1D,YAAYA,IAAE,KAAK,CAAC,WAAW,WAAW,WAAW,UAAU,CAAC;AAAA,EAChE,qBAAqBA,IAAE,KAAK,CAAC,WAAW,WAAW,WAAW,YAAY,CAAC;AAAA,EAC3E,cAAcA,IAAE,OAAO;AAAA;AACzB,CAAC;AAOM,IAAM,gCAAgCA,IAAE,OAAO;AAAA;AAAA,EAEpD,WAAWA,IAAE,OAAO;AAAA,EACpB,WAAWA,IAAE,OAAO;AAAA,EACpB,UAAUA,IAAE,OAAO;AAAA,EACnB,WAAWA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,WAAWA,IAAE,OAAO;AAAA;AAAA,EACpB,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,QAAQA,IAAE,KAAK,CAAC,UAAU,aAAa,UAAU,WAAW,CAAC;AAAA;AAAA,EAG7D,UAAUA,IAAE,MAAM,mBAAmB;AAAA;AAAA,EAGrC,gBAAgBA,IAAE,MAAM,yBAAyB;AAAA;AAAA,EAGjD,eAAeA,IAAE,MAAM,wBAAwB;AAAA;AAAA,EAG/C,cAAc;AAAA,EACd,iBAAiBA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EACnC,mBAAmBA,IAAE,OAAO,EAAE,SAAS;AACzC,CAAC;AAOM,IAAM,sBAAsBA,IAAE,OAAO;AAAA,EAC1C,WAAWA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,WAAWA,IAAE,MAAM,CAACA,IAAE,OAAO,GAAGA,IAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,EACtD,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAWA,IAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAOM,IAAM,yBAAyBA,IAAE,OAAO;AAAA,EAC7C,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EAC9B,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EAC9B,WAAWA,IAAE,OAAO;AAAA,EACpB,SAASA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAC3B,CAAC;AAOM,IAAM,wBAAwBA,IAAE,OAAO;AAAA,EAC5C,SAAS;AAAA,EACT,WAAWA,IAAE,OAAO;AAAA,EACpB,eAAeA,IAAE,OAAO;AAAA,EACxB,aAAaA,IAAE,OAAO;AAAA,EACtB,qBAAqBA,IAAE,OAAO;AAAA,EAC9B,gBAAgBA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EAClC,iBAAiBA,IAAE,MAAMA,IAAE,OAAO,CAAC;AACrC,CAAC;AAOM,IAAM,qBAAqBA,IAAE,OAAO;AAAA,EACzC,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,CAAC;AAAA,EAC3C,UAAUA,IAAE,OAAO;AAAA,EACnB,SAASA,IAAE,OAAO;AAAA,EAClB,WAAWA,IAAE,OAAO;AACtB,CAAC;AAOM,IAAM,6BAA6BA,IAAE,OAAO;AAAA,EACjD,WAAWA,IAAE,OAAO;AAAA,EACpB,WAAWA,IAAE,OAAO;AAAA,EACpB,QAAQA,IAAE,QAAQ;AAAA,EAClB,UAAUA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAAA,EAC1B,SAASA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAAA,EACzB,WAAWA,IAAE,OAAO;AACtB,CAAC;AAOM,IAAM,mBAAmBA,IAAE,OAAO;AAAA,EACvC,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,EAC9B,UAAUA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAAA,EAC1B,WAAWA,IAAE,OAAO;AAAA,EACpB,iBAAiBA,IAAE,OAAO;AAAA,EAC1B,SAASA,IAAE,MAAM,0BAA0B;AAAA,EAC3C,SAASA,IAAE,OAAOA,IAAE,IAAI,CAAC;AAC3B,CAAC;AAOM,IAAM,yBAAyBA,IAAE,OAAO;AAAA,EAC7C,iBAAiBA,IAAE,OAAO,EAAE,QAAQ,mBAAmB;AAAA,EACvD,mBAAmBA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC3C,eAAeA,IAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACpC,uBAAuBA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC/C,oBAAoBA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC5C,2BAA2BA,IAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC/C,kBAAkBA,IAAE,KAAK,CAAC,YAAY,YAAY,QAAQ,CAAC,EAAE,QAAQ,UAAU;AAAA,EAC/E,0BAA0BA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAClD,uBAAuBA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC/C,uBAAuBA,IAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAClD,CAAC;;;ADjLD;AAYO,IAAM,qBAAN,MAAyB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,kBAA6C,CAAC,GAAG;AAC3D,SAAK,SAAS,uBAAuB,MAAM;AAAA,MACzC,GAAG,uBAAuB,MAAM,CAAC,CAAC;AAAA,MAClC,GAAG;AAAA,IACL,CAAC;AAED,SAAK,aAAa,KAAK,OAAO;AAC9B,SAAK,uBAAuB;AAE5B,UAAM,UAAU,IAAI,aAA8BC,OAAK,KAAK,YAAY,eAAe,CAAC;AACxF,SAAK,KAAK,IAAI,IAAI,SAAS;AAAA,MACzB,UAAU,CAAC;AAAA,IACb,CAAC;AAED,SAAK,mBAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,UAAM,KAAK,mBAAmB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAoC;AAChD,QAAI;AACF,YAAM,KAAK,GAAG,KAAK;AAEnB,aAAO,KAAK,yCAAyC,KAAK,GAAG,KAAK,SAAS,MAAM,WAAW;AAAA,IAC9F,SAAS,OAAO;AACd,aAAO,MAAM,0CAA0C,KAAK;AAC5D,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAA+B;AACrC,QAAI;AAEF,MAAAC,WAAU,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAG9C,YAAM,UAAU,CAAC,oBAAoB,SAAS;AAC9C,iBAAW,UAAU,SAAS;AAC5B,QAAAA,WAAUD,OAAK,KAAK,YAAY,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MAC9D;AAIA,YAAM,aAAaA,OAAK,KAAK,YAAY,aAAa;AACtD,UAAI;AACF,QAAAE,eAAc,YAAY,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,MAChF,SAAS,GAAY;AACnB,cAAM,MAAM;AACZ,YAAI,IAAI,SAAS,SAAU,OAAM;AAAA,MACnC;AAEA,aAAO,MAAM,kCAAkC,KAAK,UAAU,EAAE;AAAA,IAClE,SAAS,OAAO;AACd,aAAO,MAAM,uCAAuC,KAAK;AACzD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,WACA,UACA,WACA,aACiB;AACjB,UAAM,YAAYC,YAAW;AAC7B,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,UAAM,UAAmC;AAAA,MACvC;AAAA,MACA;AAAA,MACA,UAAU,YAAY;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,gBAAgB,CAAC;AAAA,MACjB,eAAe,CAAC;AAAA,MAChB,cAAc;AAAA,QACZ,cAAc,CAAC;AAAA,QACf,mBAAmB;AAAA,QACnB,YAAY;AAAA,QACZ,qBAAqB;AAAA,QACrB,cAAc;AAAA,MAChB;AAAA,MACA,iBAAiB,CAAC;AAAA,IACpB;AAEA,UAAM,KAAK,GAAG,KAAK;AACnB,SAAK,GAAG,KAAK,SAAS,KAAK,OAAO;AAClC,UAAM,KAAK,GAAG,MAAM;AAEpB,WAAO,KAAK,wBAAwB,SAAS,eAAe,SAAS,EAAE;AACvE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,WACA,QACyC;AACzC,UAAM,KAAK,GAAG,KAAK;AAEnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,sBAAsB,SAAS,EAAE;AAC7C,aAAO;AAAA,IACT;AAEA,YAAQ,SAAS;AACjB,YAAQ,WAAU,oBAAI,KAAK,GAAE,YAAY;AACzC,YAAQ,aAAa,eAAe,QAAQ;AAE5C,UAAM,KAAK,GAAG,MAAM;AAGpB,QAAI,KAAK,OAAO,4BAA4B,WAAW,aAAa;AAClE,YAAM,KAAK,eAAe,SAAS;AAAA,IACrC;AAEA,WAAO,KAAK,kBAAkB,SAAS,iBAAiB,MAAM,EAAE;AAChE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,WAA4D;AAC3E,UAAM,KAAK,GAAG,KAAK;AACnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,WAAO,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAA6D;AAC9E,UAAM,KAAK,GAAG,KAAK;AACnB,QAAI,WAAW,CAAC,GAAG,KAAK,GAAG,KAAK,QAAQ;AAExC,QAAI,SAAS;AACX,UAAI,QAAQ,WAAW;AACrB,mBAAW,SAAS,OAAO,OAAK,EAAE,UAAU,SAAS,QAAQ,SAAU,CAAC;AAAA,MAC1E;AACA,UAAI,QAAQ,QAAQ;AAClB,mBAAW,SAAS,OAAO,OAAK,EAAE,WAAW,QAAQ,MAAM;AAAA,MAC7D;AACA,UAAI,QAAQ,UAAU;AACpB,mBAAW,SAAS,OAAO,OAAK,EAAE,aAAa,QAAQ,QAAQ;AAAA,MACjE;AACA,UAAI,QAAQ,WAAW;AACrB,mBAAW,SAAS,OAAO,OAAK,EAAE,cAAc,QAAQ,SAAS;AAAA,MACnE;AACA,UAAI,QAAQ,WAAW;AACrB,cAAM,CAAC,OAAO,GAAG,IAAI,QAAQ;AAC7B,mBAAW,SAAS;AAAA,UAAO,OACzB,EAAE,aAAa,SAAS,EAAE,aAAa;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACJ,WACA,aACyC;AACzC,UAAM,KAAK,GAAG,KAAK;AAEnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,sBAAsB,SAAS,EAAE;AAC7C,aAAO;AAAA,IACT;AAEA,YAAQ,eAAe;AAAA,MACrB,GAAG,QAAQ;AAAA,MACX,GAAG;AAAA,MACH,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,IACvC;AAEA,UAAM,KAAK,GAAG,MAAM;AACpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,WAAmB,YAA0C;AAC5E,UAAM,KAAK,GAAG,KAAK;AAEnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,mCAAmC,SAAS,EAAE;AAC1D;AAAA,IACF;AAEA,YAAQ,SAAS,KAAK,UAAU;AAChC,YAAQ,aAAa,eAAe,WAAW;AAG/C,QAAI,WAAW,mBAAmB;AAChC,cAAQ,oBAAoB,WAAW;AAAA,IACzC;AAEA,UAAM,KAAK,GAAG,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,WAAmB,YAAgD;AACxF,UAAM,KAAK,GAAG,KAAK;AAEnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,yCAAyC,SAAS,EAAE;AAChE;AAAA,IACF;AAEA,YAAQ,eAAe,KAAK,UAAU;AACtC,YAAQ,aAAa,eAAe,WAAW;AAG/C,QAAI,WAAW,SAAS,eAAe;AACrC,cAAQ,aAAa,oBAAoB,WAAW,UAAU,YAAY;AAAA,IAC5E,WAAW,WAAW,SAAS,YAAY;AACzC,cAAQ,aAAa,aAAa,WAAW,UAAU,YAAY;AAAA,IACrE;AAEA,UAAM,KAAK,GAAG,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,WAAmB,aAAgD;AACvF,UAAM,KAAK,GAAG,KAAK;AAEnB,UAAM,UAAU,KAAK,GAAG,KAAK,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS;AACzE,QAAI,CAAC,SAAS;AACZ,aAAO,KAAK,wCAAwC,SAAS,EAAE;AAC/D;AAAA,IACF;AAEA,YAAQ,cAAc,KAAK,WAAW;AACtC,YAAQ,aAAa,eAAe,YAAY;AAChD,YAAQ,kBAAkB,YAAY;AAEtC,UAAM,KAAK,GAAG,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAe,WAAkC;AAC7D,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAW,SAAS;AAC/C,UAAI,CAAC,QAAS;AAEd,YAAM,OAAO,IAAI,KAAK,QAAQ,WAAW,QAAQ,SAAS;AAC1D,YAAM,WAAW,GAAG,KAAK,YAAY,CAAC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AACtF,YAAM,aAAaH,OAAK,KAAK,YAAY,oBAAoB,QAAQ;AAErE,MAAAC,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAEzC,YAAM,cAAcD,OAAK,YAAY,GAAG,SAAS,OAAO;AACxD,MAAAE,eAAc,aAAa,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAG3D,YAAM,KAAK,GAAG,KAAK;AACnB,WAAK,GAAG,KAAK,WAAW,KAAK,GAAG,KAAK,SAAS,OAAO,OAAK,EAAE,cAAc,SAAS;AACnF,YAAM,KAAK,GAAG,MAAM;AAEpB,aAAO,KAAK,qBAAqB,SAAS,OAAO,WAAW,EAAE;AAAA,IAChE,SAAS,OAAO;AACd,aAAO,MAAM,6BAA6B,SAAS,KAAK,KAAK;AAAA,IAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAA0B,WAAuD;AACrF,UAAM,KAAK,GAAG,KAAK;AACnB,WAAO,KAAK,GAAG,KAAK,SAAS;AAAA,MAAO,OAClC,EAAE,cAAc,aAAa,EAAE,WAAW;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAoC;AACxC,UAAM,aAAa,oBAAI,KAAK;AAC5B,eAAW,QAAQ,WAAW,QAAQ,IAAI,KAAK,OAAO,aAAa;AACnE,UAAM,kBAAkB,WAAW,YAAY;AAE/C,UAAM,KAAK,GAAG,KAAK;AACnB,UAAM,mBAAmB,KAAK,GAAG,KAAK,SAAS;AAAA,MAAO,OACpD,EAAE,WAAW,EAAE,UAAU;AAAA,IAC3B;AAEA,QAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAK,GAAG,KAAK,WAAW,KAAK,GAAG,KAAK,SAAS;AAAA,QAAO,OACnD,CAAC,EAAE,WAAW,EAAE,WAAW;AAAA,MAC7B;AACA,YAAM,KAAK,GAAG,MAAM;AAEpB,aAAO,KAAK,cAAc,iBAAiB,MAAM,eAAe;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,cAAwD;AACzE,SAAK,SAAS,uBAAuB,MAAM;AAAA,MACzC,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL,CAAC;AAGD,UAAM,aAAaF,OAAK,KAAK,YAAY,aAAa;AACtD,IAAAE,eAAc,YAAY,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,CAAC;AAE9D,WAAO,KAAK,kCAAkC;AAAA,EAChD;AACF;AAKA,SAAS,aAAa,QAA4B,cAAgC;AAChF,MAAI,WAAW,OAAW,QAAO;AACjC,SAAO,OAAO,YAAY,MAAM,UAAU,WAAW;AACvD;AAGO,IAAM,qBAAqB,IAAI,mBAAmB;AAAA,EACvD,iBAAiB,QAAQ,IAAI,+BAA+BF,OAAK,kBAAkB,GAAG,kBAAkB;AAAA,EACxG,uBAAuB,aAAa,QAAQ,IAAI,yBAAyB,KAAK;AAChF,CAAC;;;ALrYD;AAOO,SAAS,wBAAwB,QAAyB;AAC/D,QAAM,SAAS,mBAAmB,UAAU;AAG5C,MAAI,CAAC,OAAO,uBAAuB;AACjC,WAAO,KAAK,oGAAoG;AAChH;AAAA,EACF;AAGA,yBAAuB,MAAM;AAC7B,yBAAuB,MAAM;AAC7B,0BAAwB,MAAM;AAC9B,iCAA+B,MAAM;AAGrC,oCAAkC,MAAM;AACxC,oCAAkC,MAAM;AACxC,qCAAmC,MAAM;AACzC,2CAAyC,MAAM;AAG/C,8BAA4B,MAAM;AAClC,gCAA8B,MAAM;AACpC,6BAA2B,MAAM;AAIjC,SAAO,KAAK,2CAA2C;AACzD;AAUA,SAAS,uBAAuB,QAAyB;AACvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWI,IAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,MACzD,QAAQA,IAAE,KAAK,CAAC,aAAa,UAAU,WAAW,CAAC,EAAE,SAAS,6BAA6B;AAAA,IAC7F;AAAA,IACA,OAAO,EAAE,WAAW,OAAO,MAAM;AAC/B,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,WAAW,MAAM;AAErE,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,YACvC;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,yBAAyB,KAAK;AAC3C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACzF;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,QAAyB;AACvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,+BAA+B;AAAA,IAChE;AAAA,IACA,OAAO,EAAE,UAAU,MAAM;AACvB,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,YACvC;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,0BAA0B,KAAK;AAC5C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC1F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,QAAyB;AACxD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,MAChF,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,MACjE,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,MACjH,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,MACzE,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,IAClE;AAAA,IACA,OAAO,EAAE,WAAW,QAAQ,WAAW,UAAU,UAAU,MAAM;AAC/D,UAAI;AACF,cAAM,UAAyB,CAAC;AAChC,YAAI,UAAW,SAAQ,YAAY;AACnC,YAAI,OAAQ,SAAQ,SAAS;AAC7B,YAAI,UAAW,SAAQ,YAAY,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AAC9D,YAAI,SAAU,SAAQ,WAAW;AACjC,YAAI,UAAW,SAAQ,YAAY;AAEnC,cAAM,WAAW,MAAM,mBAAmB;AAAA,UACxC,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AAAA,QAC9C;AAEA,cAAM,cAAc;AAAA,UAClB,eAAe,SAAS;AAAA,UACxB,UAAU,SAAS,IAAI,QAAM;AAAA,YAC3B,WAAW,EAAE;AAAA,YACb,WAAW,EAAE;AAAA,YACb,UAAU,EAAE;AAAA,YACZ,QAAQ,EAAE;AAAA,YACV,WAAW,EAAE;AAAA,YACb,SAAS,EAAE;AAAA,YACX,eAAe,EAAE,SAAS;AAAA,YAC1B,qBAAqB,EAAE,eAAe;AAAA,YACtC,cAAc,EAAE,cAAc,SAAS,IACnC,EAAE,cAAc,EAAE,cAAc,SAAS,CAAC,EAAE,eAC5C;AAAA,UACN,EAAE;AAAA,QACJ;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,YAC3C;AAAA,UACF;AAAA,UACA,iBAAiB,4BAA4B,QAAQ;AAAA,QACvD;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,2BAA2B,KAAK;AAC7C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC3F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,+BAA+B,QAAyB;AAC/D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,MAC5D,cAAcA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,gDAAgD;AAAA,MACtG,mBAAmBA,IAAE,KAAK,CAAC,WAAW,WAAW,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,MAC5G,YAAYA,IAAE,KAAK,CAAC,WAAW,WAAW,WAAW,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,MAC3G,qBAAqBA,IAAE,KAAK,CAAC,WAAW,WAAW,WAAW,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,IACzH;AAAA,IACA,OAAO,EAAE,WAAW,cAAc,mBAAmB,YAAY,oBAAoB,MAAM;AACzF,UAAI;AACF,cAAM,cAAuC,CAAC;AAC9C,YAAI,iBAAiB,OAAW,aAAY,eAAe;AAC3D,YAAI,sBAAsB,OAAW,aAAY,oBAAoB;AACrE,YAAI,eAAe,OAAW,aAAY,aAAa;AACvD,YAAI,wBAAwB,OAAW,aAAY,sBAAsB;AAEzE,cAAM,UAAU,MAAM,mBAAmB,mBAAmB,WAAW,WAAW;AAElF,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,YACvC;AAAA,UACF;AAAA,UACA,iBAAiB,wBAAwB,SAAS,sBAAsB;AAAA,QAC1E;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,iCAAiC,KAAK;AACnD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACjG;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,kCAAkC,QAAyB;AAClE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,MAClD,OAAOA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uDAAuD;AAAA,IAC/F;AAAA,IACA,OAAO,EAAE,WAAW,MAAM,MAAM;AAC9B,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,YAAI,QAAQ,CAAC,GAAG,QAAQ,QAAQ,EAAE,QAAQ;AAC1C,YAAI,SAAS,QAAQ,GAAG;AACtB,kBAAQ,MAAM,MAAM,GAAG,KAAK;AAAA,QAC9B;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB;AAAA,gBACA,YAAY,QAAQ,SAAS;AAAA,gBAC7B,aAAa;AAAA,cACf,GAAG,MAAM,CAAC;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,+BAA+B,KAAK;AACjD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC/F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kCAAkC,QAAyB;AAClE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,MAClD,OAAOA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iEAAiE;AAAA,IACzG;AAAA,IACA,OAAO,EAAE,WAAW,MAAM,MAAM;AAC9B,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,YAAI,QAAQ,CAAC,GAAG,QAAQ,cAAc,EAAE,QAAQ;AAChD,YAAI,SAAS,QAAQ,GAAG;AACtB,kBAAQ,MAAM,MAAM,GAAG,KAAK;AAAA,QAC9B;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB;AAAA,gBACA,YAAY,QAAQ,eAAe;AAAA,gBACnC,aAAa;AAAA,cACf,GAAG,MAAM,CAAC;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,+BAA+B,KAAK;AACjD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC/F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mCAAmC,QAAyB;AACnE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,MAClD,OAAOA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wDAAwD;AAAA,IAChG;AAAA,IACA,OAAO,EAAE,WAAW,MAAM,MAAM;AAC9B,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,YAAI,SAAS,CAAC,GAAG,QAAQ,aAAa,EAAE,QAAQ;AAChD,YAAI,SAAS,QAAQ,GAAG;AACtB,mBAAS,OAAO,MAAM,GAAG,KAAK;AAAA,QAChC;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB;AAAA,gBACA,aAAa,QAAQ,cAAc;AAAA,gBACnC,cAAc;AAAA,cAChB,GAAG,MAAM,CAAC;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,gCAAgC,KAAK;AAClD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAChG;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,yCAAyC,QAAyB;AACzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,IACpD;AAAA,IACA,OAAO,EAAE,UAAU,MAAM;AACvB,UAAI;AACF,cAAM,UAAU,MAAM,mBAAmB,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,sBAAsB,SAAS;AAAA,cACvC;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAGA,cAAM,cAAc,sBAAsB,OAAO;AAGjD,cAAM,mBAAmB,gBAAgB,WAAW,WAAW;AAG/D,cAAM,iBAAiB,MAAM,mBAAmB,WAAW,SAAS;AAEpE,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,YAC3C;AAAA,UACF;AAAA,UACA,iBAAiB,wBAAwB,gBAAgB,iCAAiC;AAAA,QAC5F;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,oCAAoC,KAAK;AACtD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,oCAAoC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YACpG;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,4BAA4B,QAAyB;AAC5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,iCAAiC;AAAA,MAC1E,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,IACrG;AAAA,IACA,OAAO,EAAE,YAAY,WAAW,MAAM;AACpC,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ;AAAA,UAC7B,WAAW,IAAI,QAAM,mBAAmB,WAAW,EAAE,CAAC;AAAA,QACxD;AAEA,cAAM,gBAAgB,SAAS,OAAO,OAAK,MAAM,IAAI;AAErD,YAAI,cAAc,WAAW,GAAG;AAC9B,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,aAAa,MAAM,gBAAgB,eAAe,UAAU;AAElE,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,YAAY,MAAM,CAAC;AAAA,YAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,6BAA6B,KAAK;AAC/C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC7F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,8BAA8B,QAAyB;AAC9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,MAChF,QAAQA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,MACjE,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,MACjH,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,MACzE,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,IAClE;AAAA,IACA,OAAO,EAAE,WAAW,QAAQ,WAAW,UAAU,UAAU,MAAM;AAC/D,UAAI;AACF,cAAM,UAAyB,CAAC;AAChC,YAAI,UAAW,SAAQ,YAAY;AACnC,YAAI,OAAQ,SAAQ,SAAS;AAC7B,YAAI,UAAW,SAAQ,YAAY,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;AAC9D,YAAI,SAAU,SAAQ,WAAW;AACjC,YAAI,UAAW,SAAQ,YAAY;AAEnC,cAAM,WAAW,MAAM,mBAAmB;AAAA,UACxC,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AAAA,QAC9C;AAEA,cAAM,YAAY,MAAM,kBAAkB,UAAU,OAAO;AAE3D,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC;AAAA,YACzC;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,+BAA+B,KAAK;AACjD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC/F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,QAAyB;AAC3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS,gCAAgC;AAAA,MACzE,QAAQA,IAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,MAAM,EAAE,SAAS,eAAe;AAAA,IAClG;AAAA,IACA,OAAO,EAAE,YAAY,SAAS,OAAO,MAAM;AACzC,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ;AAAA,UAC7B,WAAW,IAAI,QAAM,mBAAmB,WAAW,EAAE,CAAC;AAAA,QACxD;AAEA,cAAM,gBAAgB,SAAS,OAAO,OAAK,MAAM,IAAI;AAErD,YAAI,cAAc,WAAW,GAAG;AAC9B,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,eAAe,MAAM,eAAe,eAAe,MAAM;AAE/D,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,cAAc,MAAM,CAAC;AAAA,YAC5C;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,eAAO,MAAM,6BAA6B,KAAK;AAC/C,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,YAC7F;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AASA,SAAS,sBAAsB,SAAsD;AACnF,QAAMC,cAAY,oBAAI,KAAK,GAAE,YAAY;AAGzC,QAAM,uBAAuB,QAAQ,aAAa,sBAAsB,YAAY,MAClF,QAAQ,aAAa,sBAAsB,WAAW,IAAI;AAG5D,QAAM,sBAAsB,QAAQ,aAAa,eAAe,YAAY,MAC1E,QAAQ,aAAa,eAAe,YAAY,KAChD,QAAQ,aAAa,eAAe,aAAa,IAAI;AAGvD,QAAM,uBAAuB,QAAQ,aAAa,wBAAwB,YAAY,MACpF,QAAQ,aAAa,wBAAwB,eAAe,KAC5D,QAAQ,aAAa,wBAAwB,YAAY,IAAI;AAG/D,QAAM,kBAAkB,QAAQ,eAAe,OAAO,OAAK,EAAE,WAAW,EAAE,SAAS,UAAU,EAAE;AAC/F,QAAM,aAAa,QAAQ,eAAe,OAAO,OAAK,EAAE,SAAS,UAAU,EAAE;AAC7E,QAAM,wBAAwB,aAAa,IAAK,kBAAkB,aAAc,MAAM;AAGtF,QAAM,eAAe,KAAK;AAAA,IACvB,uBAAuB,OACvB,sBAAsB,MACtB,uBAAuB,MACvB,wBAAwB;AAAA,EAC3B;AAGA,QAAM,QAAQ,gBAAgB,KAAK,MACjC,gBAAgB,KAAK,MACrB,gBAAgB,KAAK,MACrB,gBAAgB,KAAK,MAAM;AAG7B,QAAM,kBAA4B,CAAC;AACnC,MAAI,uBAAuB,KAAK;AAC9B,oBAAgB,KAAK,yDAAyD;AAAA,EAChF;AACA,MAAI,sBAAsB,IAAI;AAC5B,oBAAgB,KAAK,8CAA8C;AAAA,EACrE;AACA,MAAI,uBAAuB,IAAI;AAC7B,oBAAgB,KAAK,kDAAkD;AAAA,EACzE;AACA,MAAI,wBAAwB,IAAI;AAC9B,oBAAgB,KAAK,+CAA+C;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,SAASC,YAAW;AAAA,IACpB,WAAAD;AAAA,IACA;AAAA,IACA,YAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,gBACb,UACA,YAC2B;AAC3B,QAAMA,cAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,aAAa,SAAS,IAAI,OAAK,EAAE,SAAS;AAEhD,QAAM,UAAmC;AAAA,IACvC,cAAc,SAAS;AAAA,IACvB,iBAAiB,SAAS,IAAI,QAAM;AAAA,MAClC,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,QAAQ,EAAE;AAAA,MACV,eAAe,EAAE,SAAS;AAAA,MAC1B,UAAU,EAAE,UACV,IAAI,KAAK,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,KAC9D,oBAAI,KAAK,GAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,MACvD,cAAc,EAAE,cAAc,SAAS,IACrC,EAAE,cAAc,EAAE,cAAc,SAAS,CAAC,EAAE,eAAe;AAAA,IAC/D,EAAE;AAAA,EACJ;AAEA,MAAI,CAAC,cAAc,WAAW,SAAS,SAAS,GAAG;AACjD,UAAM,gBAAgB,SAAS;AAAA,MAAI,OACjC,EAAE,cAAc,SAAS,IAAI,EAAE,cAAc,EAAE,cAAc,SAAS,CAAC,IAAI;AAAA,IAC7E;AACA,YAAQ,oBAAoB;AAAA,MAC1B,cAAc,cACX,OAAO,OAAK,MAAM,IAAI,EACtB,OAAO,CAAC,KAAK,MAAM,MAAM,EAAG,cAAc,CAAC,IAAI,cAAc,OAAO,OAAK,MAAM,IAAI,EAAE;AAAA,MACxF,YAAY;AAAA,QACV,KAAK,KAAK,IAAI,GAAG,cAAc,OAAO,OAAK,MAAM,IAAI,EAAE,IAAI,OAAK,EAAG,YAAY,CAAC;AAAA,QAChF,KAAK,KAAK,IAAI,GAAG,cAAc,OAAO,OAAK,MAAM,IAAI,EAAE,IAAI,OAAK,EAAG,YAAY,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,WAAW,SAAS,UAAU,GAAG;AAClD,YAAQ,qBAAqB;AAAA,MAC3B,eAAe,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ,CAAC;AAAA,MACrE,wBAAwB,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ,CAAC,IAAI,SAAS;AAAA,MAC3F,gBAAgB,gBAAgB,QAAQ;AAAA,IAC1C;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,YAAY,cAAc,CAAC,KAAK;AAAA,IAChC,WAAAA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,kBACb,UACA,SAC0B;AAC1B,QAAMA,cAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,QAAM,oBAAoB,SAAS,OAAO,OAAK,EAAE,WAAW,WAAW;AACvE,QAAM,cAAc,SAAS,SAAS,IAAI,kBAAkB,SAAS,SAAS,SAAS;AAEvF,QAAM,gBAAgB,SACnB,IAAI,OAAK,EAAE,cAAc,SAAS,IAAI,EAAE,cAAc,EAAE,cAAc,SAAS,CAAC,EAAE,eAAe,IAAI,EACrG,OAAO,WAAS,UAAU,IAAI;AAEjC,QAAM,sBAAsB,cAAc,SAAS,IACjD,cAAc,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,cAAc,SAAS;AAEhF,QAAM,iBAAiB,uBAAuB,QAAQ;AACtD,QAAM,kBAAkB,iCAAiC,QAAQ;AAEjE,SAAO;AAAA,IACL;AAAA,IACA,WAAAA;AAAA,IACA,eAAe,SAAS;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAe,eACb,UACA,QACuB;AACvB,QAAMA,cAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,WAAW,kBAAkBA,WAAU,QAAQ,SAAS,GAAG,CAAC,IAAI,MAAM;AAE5E,MAAI;AAEJ,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,gBAAU,KAAK,UAAU,UAAU,MAAM,CAAC;AAC1C;AAAA,IACF,KAAK;AACH,gBAAU,mBAAmB,QAAQ;AACrC;AAAA,IACF,KAAK;AACH,gBAAU,uBAAuB,QAAQ;AACzC;AAAA,EACJ;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAAA;AAAA,EACF;AACF;AAMA,SAAS,gBAAgB,UAA6C;AACpE,QAAM,aAAqC,CAAC;AAE5C,WAAS,QAAQ,aAAW;AAC1B,YAAQ,SAAS,QAAQ,UAAQ;AAC/B,iBAAW,KAAK,QAAQ,KAAK,WAAW,KAAK,QAAQ,KAAK,KAAK;AAAA,IACjE,CAAC;AAAA,EACH,CAAC;AAED,SAAO,OAAO,QAAQ,UAAU,EAC7B,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;AAC9C;AAEA,SAAS,uBAAuB,UAA+C;AAC7E,QAAM,WAAqB,CAAC;AAE5B,QAAM,cAAc,gBAAgB,QAAQ;AAC5C,MAAI,eAAe,gBAAgB,QAAQ;AACzC,aAAS,KAAK,4BAA4B,WAAW,EAAE;AAAA,EACzD;AAEA,QAAM,iBAAiB,SAAS,OAAO,OAAK,EAAE,WAAW,WAAW,EAAE,SAAS,SAAS;AACxF,MAAI,iBAAiB,KAAK;AACxB,aAAS,KAAK,mDAAmD;AAAA,EACnE,WAAW,iBAAiB,KAAK;AAC/B,aAAS,KAAK,8CAA8C;AAAA,EAC9D;AAEA,SAAO;AACT;AAEA,SAAS,iCAAiC,UAA+C;AACvF,QAAM,kBAA4B,CAAC;AAEnC,QAAM,iBAAiB,SAAS,OAAO,OAAK,EAAE,WAAW,QAAQ;AACjE,MAAI,eAAe,SAAS,SAAS,SAAS,KAAK;AACjD,oBAAgB,KAAK,oEAAoE;AAAA,EAC3F;AAEA,QAAM,yBAAyB,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,SAAS,QAAQ,CAAC,IAAI,SAAS;AAClG,MAAI,yBAAyB,IAAI;AAC/B,oBAAgB,KAAK,uEAAuE;AAAA,EAC9F;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,UAA6C;AACvE,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAeK,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,yBACnB,SAAS,MAAM;AAAA;AAAA,MAElC,SAAS,IAAI,aAAW;AAAA;AAAA,uBAEP,QAAQ,SAAS;AAAA,0CACE,QAAQ,SAAS;AAAA,sCACrB,QAAQ,MAAM;AAAA,wCACZ,QAAQ,QAAQ;AAAA,0CACd,QAAQ,SAAS;AAAA,yCAClB,QAAQ,SAAS,MAAM;AAAA,+CACjB,QAAQ,eAAe,MAAM;AAAA,8CAC9B,QAAQ,cAAc,MAAM;AAAA;AAAA,KAErE,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA;AAIb,SAAO;AACT;AAEA,SAAS,uBAAuB,UAA6C;AAC3E,QAAM,KAAK;AAAA;AAAA,cAEA,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,kBACnB,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,SAAS;AAAA,IAAI,aACb,KAAK,QAAQ,SAAS,MAAM,QAAQ,SAAS,MAAM,QAAQ,MAAM,MAAM,QAAQ,QAAQ,MAAM,QAAQ,SAAS,MAAM,MAAM,QAAQ,eAAe,MAAM;AAAA,EACzJ,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,EAIV,SAAS,IAAI,aAAW;AAAA,eACX,QAAQ,SAAS;AAAA;AAAA,oBAEZ,QAAQ,SAAS;AAAA,gBACrB,QAAQ,MAAM;AAAA,kBACZ,QAAQ,QAAQ;AAAA,oBACd,QAAQ,SAAS;AAAA,kBACnB,QAAQ,WAAW,KAAK;AAAA,mBACvB,QAAQ,SAAS,MAAM;AAAA,yBACjB,QAAQ,eAAe,MAAM;AAAA,wBAC9B,QAAQ,cAAc,MAAM;AAAA;AAAA,EAElD,QAAQ,gBAAgB,SAAS,IAAI;AAAA;AAAA,EAErC,QAAQ,gBAAgB,IAAI,SAAO,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACvD,EAAE;AAAA,CACL,EAAE,KAAK,IAAI,CAAC;AAEX,SAAO;AACT;AAkCA,SAAS,wBACP,SACA,aACwB;AACxB,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,kBAA0C,CAAC;AAGjD,MAAI,QAAQ,aAAa,sBAAsB,UAAU;AACvD,oBAAgB,qBAAqB,IAAI;AACzC,oBAAgB,sBAAsB,IAAI;AAAA,EAC5C,WAAW,QAAQ,aAAa,sBAAsB,WAAW;AAC/D,QAAI,QAAQ,aAAa,eAAe,aAAa,QAAQ,aAAa,eAAe,YAAY;AACnG,sBAAgB,iBAAiB,IAAI;AAAA,IACvC,WAAW,QAAQ,aAAa,eAAe,WAAW;AACxD,sBAAgB,0BAA0B,IAAI;AAC9C,sBAAgB,sBAAsB,IAAI;AAAA,IAC5C,WAAW,QAAQ,aAAa,eAAe,WAAW;AACxD,sBAAgB,iCAAiC,IAAI;AAAA,IACvD;AAAA,EACF;AAGA,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,UAAI,QAAQ,SAAS,WAAW,GAAG;AACjC,wBAAgB,sBAAsB,IAAI;AAAA,MAC5C;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,WAAW,aAAa;AAClC,wBAAgB,iBAAiB,IAAI;AAAA,MACvC;AACA;AAAA,IACF,KAAK,mCAAmC;AACtC,YAAM,cAAc,QAAQ,cAAc,QAAQ,cAAc,SAAS,CAAC;AAC1E,UAAI,eAAe,YAAY,eAAe,IAAI;AAChD,YAAI,YAAY,WAAW,uBAAuB,KAAK;AACrD,0BAAgB,qBAAqB,IAAI;AAAA,QAC3C;AACA,YAAI,YAAY,WAAW,sBAAsB,IAAI;AACnD,0BAAgB,iBAAiB,IAAI;AAAA,QACvC;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK;AAEH,UAAI,QAAQ,aAAa,sBAAsB,aAAa,QAAQ,aAAa,eAAe,WAAW;AACzG,wBAAgB,iBAAiB,IAAI;AAAA,MACvC;AACA;AAAA,EACJ;AAEA,SAAO;AACT;AAKA,SAAS,4BAA4B,UAA6D;AAChG,QAAM,kBAA0C,CAAC;AAEjD,QAAM,iBAAiB,SAAS,OAAO,OAAK,EAAE,WAAW,QAAQ;AACjE,QAAM,oBAAoB,SAAS,OAAO,OAAK,EAAE,WAAW,WAAW;AAEvE,MAAI,eAAe,SAAS,GAAG;AAC7B,oBAAgB,aAAa,IAAI,qBAAqB,eAAe,MAAM;AAAA,EAC7E;AAEA,MAAI,kBAAkB,SAAS,GAAG;AAChC,oBAAgB,kBAAkB,IAAI;AACtC,oBAAgB,oBAAoB,IAAI;AAAA,EAC1C;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,oBAAgB,iBAAiB,IAAI;AAAA,EACvC;AAEA,SAAO;AACT;;;AhDpkCA;AACA;AACA;AACA;AAKA,OAAO,OAAO,EAAE,MAAME,UAAQ,gBAAgB,MAAM,EAAE,CAAC;AAEvD,IAAM,eAAe;AACrB,IAAM,UAAU;AAKhB,eAAsB,YAAY,OAAyB,SAA6B;AACtF,SAAO,KAAK,8CAA8C,OAAO,OAAO,IAAI,OAAO;AAKnF,QAAM,eAAe,oBAAoB;AACzC,SAAO,KAAK,sBAAsB,YAAY,EAAE;AAKhD,QAAM,gBAAgB,MAAM,8BAA8B;AAC1D,SAAO,KAAK,uBAAuB,aAAa,EAAE;AAElD,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAGD,sBAAoB,MAAM;AAG1B,mBAAiB,MAAM;AAGvB,0BAAwB,MAAM;AAG9B,4BAA0B,MAAM;AAGhC,0BAAwB,MAAM;AAG9B,0BAAwB,MAAM;AAG9B,QAAM,mBAAmB,WAAW;AAKpC,QAAM,UAAU,kBAAkB;AAClC,UAAQ,IAAI;AAAA,IACV,QAAQ,qBAAqB;AAAA,IAC7B,QAAQ,gBAAgB;AAAA,EAC1B,CAAC,EAAE,MAAM,MAAM;AAAA,EAA4D,CAAC;AAE5E,MAAI,SAAS,SAAS;AACpB,UAAM,YAAY,IAAI,qBAAqB;AAC3C,UAAM,OAAO,QAAQ,SAAS;AAC9B,WAAO,KAAK,mDAAmD;AAAA,EACjE,OAAO;AAEL,UAAM,MAAM,QAAQ;AACpB,QAAI,IAAI,KAAK,CAAC;AACd,QAAI,IAAI,QAAQ,KAAK,CAAC;AAEtB,UAAM,YAAY,IAAI,8BAA8B;AAAA,MAClD,oBAAoB,MAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC;AAAA,IAClE,CAAC;AACD,UAAM,OAAO,QAAQ,SAAS;AAE9B,QAAI,IAAI,QAAQ,CAAC,KAAK,QAAQ;AAC5B,gBAAU,cAAc,KAAK,KAAK,IAAI,IAAI,EAAE,MAAM,CAAC,QAAQ;AACzD,eAAO,MAAM,+BAA+B,GAAG;AAC/C,YAAI,CAAC,IAAI,aAAa;AACpB,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,2BAA2B,CAAC;AAAA,QAC5D;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,IAAI,KAAK,CAAC,MAAM,QAAQ;AAC1B,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,QACb,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAED,UAAM,OAAO,QAAQ,IAAI,aAAa;AACtC,UAAM,OAAO,OAAO,QAAQ,IAAI,aAAa,QAAQ,IAAI,IAAI,KAAK;AAGlE,WAAO,IAAI,QAAc,CAACA,WAAS,WAAW;AAC5C,YAAM,aAAa,IAAI,OAAO,MAAM,MAAM,MAAM;AAC9C,eAAO,KAAK,mCAAmC,IAAI,IAAI,IAAI,MAAM;AACjE,QAAAA,UAAQ;AAAA,MACV,CAAC;AAED,iBAAW,GAAG,SAAS,CAAC,UAAU;AAChC,eAAO,MAAM,sBAAsB,KAAK;AACxC,eAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,wBAAsB,MAAM;AAC5B,SAAO;AACT;AAKA,SAAS,sBAAsB,QAAyB;AACtD,QAAM,WAAW,YAAY;AAC3B,WAAO,KAAK,yBAAyB;AACrC,QAAI;AAEF,YAAM,sBAAsB;AAC5B,YAAM,OAAO,MAAM;AACnB,aAAO,KAAK,6BAA6B;AACzC,cAAQ,KAAK,CAAC;AAAA,IAChB,SAAS,OAAO;AACd,aAAO,MAAM,0BAA0B,KAAK;AAC5C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;AAKA,eAAe,OAAsB;AACnC,MAAI;AACF,UAAM,iBAAiB,QAAQ,IAAI,kBAAkB,SAAS,YAAY;AAC1E,UAAM,OAAyB,kBAAkB,SAAS,SAAS;AACnE,UAAM,YAAY,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,WAAO,MAAM,2BAA2B,KAAK;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGA,IAAM,aAAa,QAAQ,KAAK,CAAC,IAAIA,UAAQ,QAAQ,KAAK,CAAC,CAAC,IAAI;AAChE,IAAI,cAAc,YAAY,QAAQC,eAAc,UAAU,EAAE,MAAM;AACpE,OAAK;AACP;", + "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 * Configuration types for CodeQL background server processes.\n *\n * CodeQL provides three background server types:\n * 1. language-server \u2013 LSP-based QL validation (JSON-RPC over stdio)\n * 2. query-server2 \u2013 Query evaluation (custom protocol over stdio)\n * 3. cli-server \u2013 JVM reuse for CLI commands (custom protocol over stdio)\n *\n * Each server type has its own configuration options, but they share common\n * settings like searchPath and commonCaches.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Server types supported by CodeQL.\n */\nexport type CodeQLServerType = 'cli' | 'language' | 'query';\n\n/**\n * Common configuration shared across all server types.\n */\nexport interface BaseServerConfig {\n /** Path to QL packs (like `codeql query compile --search-path`). */\n searchPath?: string;\n /** Location for cached data (compilation plans, downloaded packs). */\n commonCaches?: string;\n /** Directory for detailed logs. */\n logdir?: string;\n}\n\n/**\n * Configuration for the CodeQL Language Server.\n */\nexport interface LanguageServerConfig extends BaseServerConfig {\n /** Error checking mode. Default: ON_CHANGE */\n checkErrors?: 'EXPLICIT' | 'ON_CHANGE';\n /** Log level for the language server. */\n loglevel?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n /** Single-threaded execution. */\n synchronous?: boolean;\n /** Verbosity level for progress. */\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Configuration for the CodeQL Query Server (query-server2).\n */\nexport interface QueryServerConfig extends BaseServerConfig {\n /** Thread count. 0 = one per core, -N = leave N cores free. */\n threads?: number;\n /** Query evaluation timeout in seconds. */\n timeout?: number;\n /** Maximum disk cache size in MB for intermediate results. */\n maxDiskCache?: number;\n /** Path for structured evaluator performance logs. */\n evaluatorLog?: string;\n /** Include tuple counts in evaluation logs. */\n tupleCounting?: boolean;\n /** Enable debug mode. */\n debug?: boolean;\n}\n\n/**\n * Configuration for the CodeQL CLI Server.\n */\nexport interface CLIServerConfig extends BaseServerConfig {\n // cli-server has fewer options \u2014 just commonCaches and logdir.\n}\n\n/**\n * Union of all server configurations (discriminated by usage context).\n */\nexport type ServerConfig = CLIServerConfig | LanguageServerConfig | QueryServerConfig;\n\n/**\n * Compute a deterministic hash for a server configuration.\n * Used to detect configuration changes that require a server restart.\n *\n * @param type - The server type.\n * @param config - The server configuration.\n * @returns A hex-encoded SHA-256 hash of the canonical JSON representation.\n */\nexport function computeConfigHash(type: CodeQLServerType, config: ServerConfig): string {\n // Deep-sort all keys to ensure deterministic serialization regardless of\n // property insertion order.\n const sortKeys = (_key: string, value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const sorted: Record = {};\n for (const k of Object.keys(value as Record).sort()) {\n sorted[k] = (value as Record)[k];\n }\n return sorted;\n }\n return value;\n };\n const canonical = JSON.stringify({ config, type }, sortKeys);\n return createHash('sha256').update(canonical).digest('hex');\n}\n\n/**\n * Build command-line arguments for a language server from its configuration.\n */\nexport function buildLanguageServerArgs(config: LanguageServerConfig): string[] {\n const args: string[] = [\n 'execute', 'language-server',\n `--check-errors=${config.checkErrors ?? 'ON_CHANGE'}`,\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.loglevel) {\n args.push(`--loglevel=${config.loglevel}`);\n }\n if (config.synchronous) {\n args.push('--synchronous');\n }\n if (config.verbosity) {\n args.push(`--verbosity=${config.verbosity}`);\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a query server from its configuration.\n */\nexport function buildQueryServerArgs(config: QueryServerConfig): string[] {\n const args: string[] = [\n 'execute', 'query-server2',\n ];\n\n if (config.searchPath) {\n args.push(`--search-path=${config.searchPath}`);\n }\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n if (config.threads !== undefined) {\n args.push(`--threads=${config.threads}`);\n }\n if (config.timeout !== undefined) {\n args.push(`--timeout=${config.timeout}`);\n }\n if (config.maxDiskCache !== undefined) {\n args.push(`--max-disk-cache=${config.maxDiskCache}`);\n }\n if (config.evaluatorLog) {\n args.push(`--evaluator-log=${config.evaluatorLog}`);\n }\n if (config.debug) {\n args.push('--debug');\n args.push('--tuple-counting');\n } else if (config.tupleCounting) {\n args.push('--tuple-counting');\n }\n\n return args;\n}\n\n/**\n * Build command-line arguments for a CLI server from its configuration.\n */\nexport function buildCLIServerArgs(config: CLIServerConfig): string[] {\n const args: string[] = [\n 'execute', 'cli-server',\n ];\n\n if (config.commonCaches) {\n args.push(`--common-caches=${config.commonCaches}`);\n }\n if (config.logdir) {\n args.push(`--logdir=${config.logdir}`);\n }\n\n return args;\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/**\n * Read the package version from the nearest package.json.\n *\n * Cached at first call so the file is read at most once per process.\n */\nlet _cachedVersion: string | undefined;\nexport function getPackageVersion(): string {\n if (_cachedVersion !== undefined) return _cachedVersion;\n try {\n const pkgPath = resolve(getPackageRootDir(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n _cachedVersion = pkg.version ?? '0.0.0';\n } catch {\n _cachedVersion = '0.0.0';\n }\n return _cachedVersion as string;\n}\n\n/**\n * Get the effective workspace directory for resolving user-supplied relative\n * paths (test directories, database paths, pack dirs, etc.).\n *\n * In a monorepo checkout the workspace root is the monorepo parent. In an\n * npm-installed layout, `workspaceRootDir` falls back to `packageRootDir`\n * which may be read-only and is not the user's project. In that case we\n * fall back to `process.cwd()` so that relative paths resolve against the\n * directory the user actually invoked the server from.\n *\n * Override with `CODEQL_MCP_WORKSPACE` for deterministic behavior.\n */\nexport function getUserWorkspaceDir(): string {\n if (process.env.CODEQL_MCP_WORKSPACE) {\n return process.env.CODEQL_MCP_WORKSPACE;\n }\n // When workspaceRootDir === packageRootDir we are NOT in a monorepo\n // (npm-installed), so fall back to process.cwd().\n if (workspaceRootDir === packageRootDir) {\n return process.cwd();\n }\n return workspaceRootDir;\n}\n\n// Pre-computed values for use throughout the server\nexport const packageRootDir = getPackageRootDir();\nexport const workspaceRootDir = getWorkspaceRootDir(packageRootDir);\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 { isAbsolute, join, resolve } from 'path';\nimport { getPackageRootDir } from './package-paths';\n\n/**\n * Base directory for all project-local temporary data.\n *\n * Resolution order:\n * 1. `CODEQL_MCP_TMP_DIR` environment variable \u2014 for read-only package root\n * scenarios (e.g., npm global installs where the package directory is not\n * writable). Relative paths are resolved against process.cwd().\n * 2. `/.tmp` \u2014 default; excluded from version control.\n */\nconst PROJECT_TMP_BASE = process.env.CODEQL_MCP_TMP_DIR\n ? (isAbsolute(process.env.CODEQL_MCP_TMP_DIR) \n ? process.env.CODEQL_MCP_TMP_DIR \n : resolve(process.cwd(), process.env.CODEQL_MCP_TMP_DIR))\n : 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 * Utility for waiting until a spawned child process is ready.\n *\n * CodeQL background servers (cli-server, query-server2, language-server) run\n * on the JVM and emit stderr log output once the JVM has initialised. Rather\n * than sleeping for a hard-coded duration \u2014 which is fragile on both fast and\n * slow machines \u2014 this helper resolves as soon as the first stderr output\n * arrives (indicating the JVM is alive), or when the maximum timeout expires.\n * It also rejects immediately if the process exits or errors before becoming\n * ready, giving callers a clear error instead of a silent hang.\n */\n\nimport { ChildProcess } from 'child_process';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { logger } from './logger';\n\n/** Default maximum wait for a CodeQL server to become ready (30 s). */\nconst DEFAULT_READY_TIMEOUT_MS = 30_000;\n\n/**\n * Options for {@link waitForProcessReady}.\n */\nexport interface ProcessReadyOptions {\n /**\n * Maximum time in milliseconds to wait for the process to emit its first\n * stderr output. If the timeout is reached without a signal the promise\n * still resolves (best-effort) so the caller can attempt communication.\n *\n * Default: 30 000 ms.\n */\n timeoutMs?: number;\n}\n\n/**\n * Wait until a child process signals readiness.\n *\n * \"Ready\" is defined as any of:\n * 1. The process emits data on **stderr** (JVM startup log line).\n * 2. The process emits data on **stdout** (initial protocol message).\n * 3. The maximum timeout elapses (best-effort resolve).\n *\n * The promise **rejects** if the process emits an `error` event or exits\n * before any of the above conditions are met.\n *\n * @param child - The spawned child process.\n * @param name - A human-readable label for log messages.\n * @param opts - Optional configuration.\n */\nexport function waitForProcessReady(\n child: ChildProcess,\n name: string,\n opts?: ProcessReadyOptions,\n): Promise {\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_READY_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n settled = true;\n child.stderr?.removeListener('data', onStderr);\n child.stdout?.removeListener('data', onStdout);\n child.removeListener('error', onError);\n child.removeListener('exit', onExit);\n clearTimeout(timer);\n };\n\n const onStderr = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stderr output detected)`);\n cleanup();\n resolve();\n };\n\n const onStdout = () => {\n if (settled) return;\n logger.debug(`${name}: ready (stdout output detected)`);\n cleanup();\n resolve();\n };\n\n const onError = (error: Error) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} failed to start: ${error.message}`));\n };\n\n const onExit = (code: number | null) => {\n if (settled) return;\n cleanup();\n reject(new Error(`${name} exited before becoming ready (code: ${code})`));\n };\n\n const timer = setTimeout(() => {\n if (settled) return;\n logger.warn(`${name}: readiness timeout (${timeoutMs} ms) \u2014 proceeding anyway`);\n cleanup();\n resolve(); // best-effort: let the caller attempt communication\n }, timeoutMs);\n\n child.stderr?.on('data', onStderr);\n child.stdout?.on('data', onStdout);\n child.on('error', onError);\n child.on('exit', onExit);\n\n // If the process was dead before we even attached listeners, reject now\n if (child.killed || child.exitCode !== null) {\n cleanup();\n reject(new Error(`${name} is not running (exitCode: ${child.exitCode})`));\n }\n });\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 { getPackageVersion } from '../utils/package-paths';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { waitForProcessReady } from '../utils/process-ready';\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?: 'ALL' | 'DEBUG' | 'ERROR' | 'INFO' | 'OFF' | 'TRACE' | 'WARN';\n synchronous?: boolean;\n verbosity?: 'errors' | 'progress' | 'progress+' | 'progress++' | 'progress+++' | 'warnings';\n}\n\n/**\n * Position in a text document (0-based line and character).\n */\nexport interface LSPPosition {\n character: number;\n line: number;\n}\n\n/**\n * A range in a text document.\n */\nexport interface LSPRange {\n end: LSPPosition;\n start: LSPPosition;\n}\n\n/**\n * A location in a resource (file URI + range).\n */\nexport interface LSPLocation {\n range: LSPRange;\n uri: string;\n}\n\n/**\n * Identifies a text document by its URI.\n */\nexport interface TextDocumentIdentifier {\n uri: string;\n}\n\n/**\n * A text document position (document + position within it).\n */\nexport interface TextDocumentPositionParams {\n position: LSPPosition;\n textDocument: TextDocumentIdentifier;\n}\n\n/**\n * A completion item returned by the language server.\n */\nexport interface CompletionItem {\n detail?: string;\n documentation?: string | { kind: string; value: string };\n insertText?: string;\n kind?: number;\n label: string;\n sortText?: string;\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 currentWorkspaceUri: string | undefined;\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 the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.server, 'CodeQL Language Server');\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 // Wrap resolve/reject to clear the timer when the promise settles.\n const timer = setTimeout(() => {\n if (this.pendingResponses.has(id)) {\n this.pendingResponses.delete(id);\n reject(new Error(`LSP request timeout for method: ${method}`));\n }\n }, 60_000); // 60 second timeout (Windows CI cold JVM can exceed 30s)\n\n this.pendingResponses.set(id, {\n reject: (err: Error) => { clearTimeout(timer); reject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); resolve(val); },\n });\n this.sendMessage(message);\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 /**\n * Initialize the language server with an optional workspace URI.\n *\n * If the server is already initialized with a different workspace, a\n * `workspace/didChangeWorkspaceFolders` notification is sent to update\n * the workspace context instead of requiring a full restart.\n */\n async initialize(workspaceUri?: string): Promise {\n if (this.isInitialized) {\n // If workspace changed, notify the server\n if (workspaceUri && workspaceUri !== this.currentWorkspaceUri) {\n await this.updateWorkspace(workspaceUri);\n }\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: getPackageVersion()\n },\n capabilities: {\n textDocument: {\n completion: { completionItem: { snippetSupport: false } },\n definition: {},\n publishDiagnostics: {},\n references: {},\n synchronization: {\n didClose: true,\n didChange: true,\n didOpen: true,\n },\n },\n workspace: {\n workspaceFolders: true,\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.currentWorkspaceUri = workspaceUri;\n this.isInitialized = true;\n logger.info('CodeQL Language Server initialized successfully');\n }\n\n /**\n * Update the workspace folders on a running, initialized server.\n */\n private async updateWorkspace(newUri: string): Promise {\n logger.info(`Updating workspace from ${this.currentWorkspaceUri} to ${newUri}`);\n\n const removed = this.currentWorkspaceUri\n ? [{ uri: this.currentWorkspaceUri, name: 'codeql-workspace' }]\n : [];\n\n this.sendNotification('workspace/didChangeWorkspaceFolders', {\n event: {\n added: [{ uri: newUri, name: 'codeql-workspace' }],\n removed,\n },\n });\n\n this.currentWorkspaceUri = newUri;\n }\n\n /**\n * Get the current workspace URI.\n */\n getWorkspaceUri(): string | undefined {\n return this.currentWorkspaceUri;\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.removeListener('diagnostics', diagnosticsHandler);\n reject(new Error('Timeout waiting for diagnostics'));\n }\n }, 90_000); // 90s \u2014 first call triggers JVM start + compilation; Windows CI is slow\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 // ---- LSP feature methods (issue #1) ----\n\n /**\n * Get code completions at a position in a document.\n */\n async getCompletions(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/completion', params);\n // The result may be a CompletionList or CompletionItem[]\n if (result && typeof result === 'object' && 'items' in (result as object)) {\n return (result as { items: CompletionItem[] }).items;\n }\n return (result as CompletionItem[]) || [];\n }\n\n /**\n * Find the definition(s) of a symbol at a position.\n */\n async getDefinition(params: TextDocumentPositionParams): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/definition', params);\n return this.normalizeLocations(result);\n }\n\n /**\n * Find all references to a symbol at a position.\n */\n async getReferences(params: TextDocumentPositionParams & { context?: { includeDeclaration: boolean } }): Promise {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n if (!this.isRunning()) {\n throw new Error('Language server process is not running');\n }\n const result = await this.sendRequest('textDocument/references', {\n ...params,\n context: params.context ?? { includeDeclaration: true },\n });\n return this.normalizeLocations(result);\n }\n\n /**\n * Open a text document in the language server.\n * The document must be opened before requesting completions, definitions, etc.\n */\n openDocument(uri: string, text: string, languageId = 'ql', version = 1): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didOpen', {\n textDocument: { uri, languageId, version, text },\n });\n }\n\n /**\n * Close a text document in the language server.\n */\n closeDocument(uri: string): void {\n if (!this.isInitialized) {\n throw new Error('Language server is not initialized');\n }\n this.sendNotification('textDocument/didClose', {\n textDocument: { uri },\n });\n }\n\n /**\n * Normalize a definition/references/implementation result to Location[].\n * The LSP spec allows Location | Location[] | LocationLink[].\n */\n private normalizeLocations(result: unknown): LSPLocation[] {\n if (!result) return [];\n if (Array.isArray(result)) {\n return result.map((item) => {\n // LocationLink has targetUri/targetRange\n if ('targetUri' in item) {\n return { uri: item.targetUri, range: item.targetRange } as LSPLocation;\n }\n return item as LSPLocation;\n });\n }\n // Single Location\n if (typeof result === 'object' && 'uri' in (result as object)) {\n return [result as LSPLocation];\n }\n return [];\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 if (this.server) {\n this.sendNotification('exit', {});\n }\n } catch (error) {\n logger.warn('Error during graceful shutdown:', error);\n }\n\n // Force kill if needed\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.server) {\n this.server.kill('SIGTERM');\n }\n resolve();\n }, 1000);\n\n if (this.server) {\n this.server.once('exit', () => {\n clearTimeout(timer);\n this.server = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.isInitialized = false;\n }\n\n isRunning(): boolean {\n return this.server !== null && !this.server.killed;\n }\n}", "/**\n * CodeQL Query Server (query-server2) client.\n *\n * Manages a long-lived `codeql execute query-server2` process that evaluates\n * queries using a custom JSON-RPC protocol over stdio. Reusing the server\n * avoids repeated JVM startup for each query evaluation.\n *\n * Protocol: The query-server2 uses JSON-RPC with Content-Length headers\n * (same framing as LSP) over stdin/stdout.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildQueryServerArgs, QueryServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A pending request awaiting a response from the query server.\n */\ninterface PendingRequest {\n reject: (_error: Error) => void;\n resolve: (_value: unknown) => void;\n}\n\n/**\n * Client for the CodeQL query-server2 process.\n *\n * Spawns `codeql execute query-server2` and communicates over stdin/stdout\n * using JSON-RPC with Content-Length framing.\n */\nexport class CodeQLQueryServer extends EventEmitter {\n private messageBuffer = '';\n private messageId = 1;\n private pendingRequests = new Map();\n private process: ChildProcess | null = null;\n private readonly config: QueryServerConfig;\n\n constructor(config: QueryServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the query-server2 process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('Query server is already running');\n }\n\n logger.info('Starting CodeQL Query Server (query-server2)...');\n\n const args = buildQueryServerArgs(this.config);\n\n // Build environment with CODEQL_PATH directory prepended to PATH\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('QueryServer2 stderr:', data.toString());\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('Query server process error:', error);\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`Query server exited with code: ${code}`);\n this.rejectAllPending(new Error(`Query server exited with code: ${code}`));\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL Query Server');\n logger.info('CodeQL Query Server started');\n }\n\n /**\n * Send a request to the query server and await the response.\n *\n * @param method - The JSON-RPC method name.\n * @param params - The method parameters.\n * @param timeoutMs - Request timeout in milliseconds (default: 300000 = 5 min).\n * @returns The result from the server.\n */\n sendRequest(method: string, params?: unknown, timeoutMs = 300_000): Promise {\n const id = this.messageId++;\n const message = {\n id,\n jsonrpc: '2.0' as const,\n method,\n params,\n };\n\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { reject, resolve });\n\n try {\n this.sendRaw(message);\n } catch (error) {\n // Clean up immediately \u2014 sendRaw() failed so no response will arrive.\n this.pendingRequests.delete(id);\n reject(error instanceof Error ? error : new Error(String(error)));\n return;\n }\n\n const timer = setTimeout(() => {\n if (this.pendingRequests.has(id)) {\n this.pendingRequests.delete(id);\n reject(new Error(`Query server request timeout for method: ${method}`));\n }\n }, timeoutMs);\n\n // Clear the timeout when the promise settles\n const originalResolve = resolve;\n const originalReject = reject;\n const wrapped = {\n reject: (err: Error) => { clearTimeout(timer); originalReject(err); },\n resolve: (val: unknown) => { clearTimeout(timer); originalResolve(val); },\n };\n this.pendingRequests.set(id, wrapped);\n });\n }\n\n /**\n * Gracefully shut down the query server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL Query Server...');\n\n try {\n await this.sendRequest('shutdown', {}, 5000);\n } catch (error) {\n logger.warn('Error during query server graceful shutdown:', error);\n }\n\n // Force kill if process lingers\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n\n /**\n * Whether the query server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\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 = JSON.parse(messageContent);\n this.handleMessage(message);\n } catch (error) {\n logger.error('Failed to parse query server message:', error);\n }\n\n headerEnd = this.messageBuffer.indexOf('\\r\\n\\r\\n');\n } else {\n break;\n }\n } else {\n logger.error('Invalid query server header:', header);\n this.messageBuffer = '';\n break;\n }\n }\n }\n\n private handleMessage(message: { error?: { message: string }; id?: number; method?: string; params?: unknown; result?: unknown }): void {\n logger.debug('QueryServer2 message:', message);\n\n // Handle responses\n if (message.id !== undefined && this.pendingRequests.has(Number(message.id))) {\n const pending = this.pendingRequests.get(Number(message.id))!;\n this.pendingRequests.delete(Number(message.id));\n\n if (message.error) {\n pending.reject(new Error(`Query server error: ${message.error.message}`));\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n // Handle notifications (progress, etc.)\n if (message.method) {\n this.emit('notification', { method: message.method, params: message.params });\n }\n }\n\n private rejectAllPending(error: Error): void {\n for (const [id, pending] of this.pendingRequests) {\n pending.reject(error);\n this.pendingRequests.delete(id);\n }\n }\n\n private sendRaw(message: object): void {\n if (!this.process?.stdin) {\n throw new Error('Query server is not running');\n }\n\n const body = JSON.stringify(message);\n const contentLength = Buffer.byteLength(body, 'utf8');\n const frame = `Content-Length: ${contentLength}\\r\\n\\r\\n${body}`;\n this.process.stdin.write(frame);\n }\n}\n", "/**\n * CodeQL CLI Server client.\n *\n * Manages a long-lived `codeql execute cli-server` process that executes CLI\n * commands without repeated JVM startup overhead. Commands are serialized as\n * JSON arrays followed by a NUL byte, and responses are NUL-terminated JSON.\n *\n * Inspired by the `CodeQLCliServer` class in github/vscode-codeql.\n */\n\nimport { ChildProcess, spawn } from 'child_process';\nimport { delimiter } from 'path';\nimport { EventEmitter } from 'events';\nimport { clearTimeout, setTimeout } from 'timers';\nimport { buildCLIServerArgs, CLIServerConfig } from './server-config';\nimport { getResolvedCodeQLDir } from './cli-executor';\nimport { logger } from '../utils/logger';\nimport { waitForProcessReady } from '../utils/process-ready';\n\n/**\n * A queued command waiting to be sent to the CLI server.\n */\ninterface QueuedCommand {\n args: string[];\n reject: (_error: Error) => void;\n resolve: (_value: string) => void;\n}\n\n/**\n * Client for the CodeQL CLI Server process.\n *\n * The cli-server uses a simple NUL-delimited protocol:\n * - **Request**: JSON array of command arguments, followed by a NUL byte.\n * - **Response**: command stdout, terminated by a NUL byte on stdout.\n * stderr is forwarded as-is.\n */\nexport class CodeQLCLIServer extends EventEmitter {\n private commandInProgress = false;\n private commandQueue: Array<() => void> = [];\n private readonly config: CLIServerConfig;\n private currentReject: ((_error: Error) => void) | null = null;\n private currentResolve: ((_value: string) => void) | null = null;\n private nullBuffer = Buffer.alloc(1);\n private process: ChildProcess | null = null;\n private stdoutBuffer = '';\n\n constructor(config: CLIServerConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Start the cli-server process.\n */\n async start(): Promise {\n if (this.process) {\n throw new Error('CLI server is already running');\n }\n\n logger.info('Starting CodeQL CLI Server...');\n\n const args = buildCLIServerArgs(this.config);\n\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.process = spawn('codeql', args, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: spawnEnv,\n });\n\n this.process.stdout?.on('data', (data: Buffer) => {\n this.handleStdout(data);\n });\n\n this.process.stderr?.on('data', (data: Buffer) => {\n logger.debug('CLIServer stderr:', data.toString());\n });\n\n this.process.on('error', (error: Error) => {\n logger.error('CLI server process error:', error);\n if (this.currentReject) {\n this.currentReject(error);\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.emit('error', error);\n });\n\n this.process.on('exit', (code: number | null) => {\n logger.info(`CLI server exited with code: ${code}`);\n if (this.currentReject) {\n this.currentReject(new Error(`CLI server exited unexpectedly with code: ${code}`));\n this.currentReject = null;\n this.currentResolve = null;\n }\n this.process = null;\n this.emit('exit', code);\n });\n\n // Wait for the JVM to initialise (resolves on first stderr/stdout output)\n await waitForProcessReady(this.process, 'CodeQL CLI Server');\n logger.info('CodeQL CLI Server started');\n }\n\n /**\n * Run a CodeQL CLI command through the persistent server.\n *\n * Commands are serialized and queued; only one command runs at a time.\n *\n * @param args - The full command arguments (e.g. `['resolve', 'qlpacks']`).\n * @returns The stdout output from the command.\n */\n runCommand(args: string[]): Promise {\n return new Promise((resolve, reject) => {\n const execute = () => {\n this.executeCommand({ args, reject, resolve });\n };\n\n if (this.commandInProgress) {\n this.commandQueue.push(execute);\n } else {\n execute();\n }\n });\n }\n\n /**\n * Gracefully shut down the CLI server.\n */\n async shutdown(): Promise {\n if (!this.process) {\n return;\n }\n\n logger.info('Shutting down CodeQL CLI Server...');\n\n try {\n // Send shutdown command\n this.process.stdin?.write(JSON.stringify(['shutdown']), 'utf8');\n this.process.stdin?.write(this.nullBuffer);\n } catch (error) {\n logger.warn('Error during CLI server shutdown request:', error);\n }\n\n // Give it a moment, then force kill\n await new Promise((resolve) => {\n const timer = setTimeout(() => {\n if (this.process) {\n this.process.kill('SIGTERM');\n this.process = null;\n }\n resolve();\n }, 2000);\n\n if (this.process) {\n this.process.once('exit', () => {\n clearTimeout(timer);\n this.process = null;\n resolve();\n });\n } else {\n clearTimeout(timer);\n resolve();\n }\n });\n\n this.commandInProgress = false;\n this.commandQueue = [];\n logger.info('CodeQL CLI Server stopped');\n }\n\n /**\n * Whether the CLI server process is running.\n */\n isRunning(): boolean {\n return this.process !== null && !this.process.killed;\n }\n\n // ---- private helpers ----\n\n private executeCommand(cmd: QueuedCommand): void {\n if (!this.process?.stdin) {\n cmd.reject(new Error('CLI server is not running'));\n return;\n }\n\n this.commandInProgress = true;\n this.currentResolve = cmd.resolve;\n this.currentReject = cmd.reject;\n\n try {\n this.process.stdin.write(JSON.stringify(cmd.args), 'utf8');\n this.process.stdin.write(this.nullBuffer);\n } catch (error) {\n this.commandInProgress = false;\n this.currentResolve = null;\n this.currentReject = null;\n cmd.reject(error instanceof Error ? error : new Error(String(error)));\n this.runNext();\n }\n }\n\n private handleStdout(data: Buffer): void {\n this.stdoutBuffer += data.toString();\n\n // Process all NUL-delimited responses in the buffer\n let nulIndex = this.stdoutBuffer.indexOf('\\0');\n while (nulIndex !== -1) {\n const result = this.stdoutBuffer.substring(0, nulIndex);\n this.stdoutBuffer = this.stdoutBuffer.substring(nulIndex + 1);\n\n if (this.currentResolve) {\n this.currentResolve(result);\n this.currentResolve = null;\n this.currentReject = null;\n }\n\n this.commandInProgress = false;\n this.runNext();\n\n nulIndex = this.stdoutBuffer.indexOf('\\0');\n }\n }\n\n private runNext(): void {\n const next = this.commandQueue.shift();\n if (next) {\n next();\n }\n }\n}\n", "/**\n * CodeQL Server Manager\n *\n * Manages the lifecycle of CodeQL background server processes:\n * - language-server (LSP-based QL validation)\n * - query-server2 (query evaluation)\n * - cli-server (JVM reuse for CLI commands)\n *\n * Servers are keyed by a hash of their configuration. When a caller requests\n * a server with a different configuration, the old server is shut down and a\n * new one is started. Session-specific cache directories provide isolation.\n */\n\nimport { mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n CLIServerConfig,\n CodeQLServerType,\n computeConfigHash,\n LanguageServerConfig,\n QueryServerConfig,\n ServerConfig,\n} from './server-config';\nimport { CodeQLLanguageServer } from './language-server';\nimport { CodeQLQueryServer } from './query-server';\nimport { CodeQLCLIServer } from './cli-server';\nimport { getProjectTmpDir } from '../utils/temp-dir';\nimport { logger } from '../utils/logger';\n\n/**\n * Entry in the managed servers map.\n */\ninterface ManagedServer {\n configHash: string;\n server: CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer;\n sessionId: string;\n type: CodeQLServerType;\n}\n\n/**\n * Options for creating a session-specific cache layout.\n */\nexport interface SessionCacheOptions {\n /** Override the session ID (defaults to a random UUID). */\n sessionId?: string;\n}\n\n/**\n * Manages CodeQL background server processes with config-aware caching.\n *\n * Callers should use `getLanguageServer()`, `getQueryServer()`, or\n * `getCLIServer()` to obtain a running server. If the requested\n * configuration differs from the currently running server of that type, the\n * old server is stopped and replaced.\n */\nexport class CodeQLServerManager {\n /** Keyed by `CodeQLServerType` \u2014 at most one per type at a time. */\n private servers = new Map();\n\n /** In-flight `getOrRestart` promises, keyed by server type, to serialize concurrent calls. */\n private pendingStarts = new Map>();\n\n /** The session ID used for cache isolation. */\n private sessionId: string;\n\n /** Root directory for session-specific caches. */\n private sessionCacheDir: string;\n\n constructor(options?: SessionCacheOptions) {\n this.sessionId = options?.sessionId ?? randomUUID();\n this.sessionCacheDir = join(\n getProjectTmpDir('codeql-cache'),\n this.sessionId,\n );\n // Pre-create the cache directory tree\n for (const subdir of ['compilation-cache', 'logs', 'query-cache']) {\n mkdirSync(join(this.sessionCacheDir, subdir), { recursive: true });\n }\n logger.info(`CodeQLServerManager initialized (session: ${this.sessionId})`);\n }\n\n // ---- Public API ----\n\n /**\n * Get the current session ID.\n */\n getSessionId(): string {\n return this.sessionId;\n }\n\n /**\n * Get the session-specific cache directory.\n */\n getCacheDir(): string {\n return this.sessionCacheDir;\n }\n\n /**\n * Return the session-specific log directory.\n */\n getLogDir(): string {\n return join(this.sessionCacheDir, 'logs');\n }\n\n /**\n * Get or create a Language Server with the given configuration.\n *\n * If a language server is already running with the same config it is reused.\n * If the config has changed the old server is shut down first.\n */\n async getLanguageServer(config: LanguageServerConfig): Promise {\n const enriched = this.enrichConfig(config) as LanguageServerConfig;\n return this.getOrRestart('language', enriched, () => {\n // Convert LanguageServerConfig to the LanguageServerOptions the existing class expects\n return new CodeQLLanguageServer({\n loglevel: enriched.loglevel,\n logdir: enriched.logdir,\n searchPath: enriched.searchPath,\n synchronous: enriched.synchronous,\n verbosity: enriched.verbosity,\n });\n }) as Promise;\n }\n\n /**\n * Get or create a Query Server with the given configuration.\n */\n async getQueryServer(config: QueryServerConfig): Promise {\n const enriched = this.enrichConfig(config) as QueryServerConfig;\n return this.getOrRestart('query', enriched, () => {\n return new CodeQLQueryServer(enriched);\n }) as Promise;\n }\n\n /**\n * Get or create a CLI Server with the given configuration.\n */\n async getCLIServer(config: CLIServerConfig): Promise {\n const enriched = this.enrichConfig(config) as CLIServerConfig;\n return this.getOrRestart('cli', enriched, () => {\n return new CodeQLCLIServer(enriched);\n }) as Promise;\n }\n\n /**\n * Shut down a specific server type.\n */\n async shutdownServer(type: CodeQLServerType): Promise {\n const managed = this.servers.get(type);\n if (!managed) return;\n\n logger.info(`Shutting down ${type} server (session: ${managed.sessionId})`);\n await this.stopServer(managed);\n this.servers.delete(type);\n }\n\n /**\n * Shut down all managed servers.\n */\n async shutdownAll(): Promise {\n logger.info(`Shutting down all servers for session: ${this.sessionId}`);\n const shutdownPromises = Array.from(this.servers.entries()).map(\n async ([type, managed]) => {\n try {\n await this.stopServer(managed);\n } catch (error) {\n logger.error(`Error shutting down ${type} server:`, error);\n }\n },\n );\n await Promise.all(shutdownPromises);\n this.servers.clear();\n logger.info('All servers shut down');\n }\n\n /**\n * Check whether a server of the given type is currently running.\n */\n isRunning(type: CodeQLServerType): boolean {\n const managed = this.servers.get(type);\n if (!managed) return false;\n return managed.server.isRunning();\n }\n\n /**\n * Get status information for all managed servers.\n */\n getStatus(): Record {\n const status: Record = {\n cli: null,\n language: null,\n query: null,\n };\n for (const [type, managed] of this.servers) {\n status[type] = {\n configHash: managed.configHash,\n running: managed.server.isRunning(),\n sessionId: managed.sessionId,\n };\n }\n return status as Record;\n }\n\n // ---- Private helpers ----\n\n /**\n * Eagerly start the language server so the JVM is warm when the first\n * LSP tool call arrives. Uses the default configuration that\n * `lsp-handlers.ts` / `lsp-diagnostics.ts` would create on the first\n * `getLanguageServer()` call. The server is stored in the managed-servers\n * map and reused by subsequent tool invocations.\n *\n * This is fire-and-forget: errors are logged but do not prevent the MCP\n * server from starting.\n */\n async warmUpLanguageServer(): Promise {\n try {\n // Lazy-import to avoid circular dependency at module level\n const { packageRootDir } = await import('../utils/package-paths');\n const { resolve } = await import('path');\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: 'WARN',\n searchPath: resolve(packageRootDir, 'ql'),\n };\n logger.info('Warming up language server (background JVM start)...');\n await this.getLanguageServer(config);\n logger.info('Language server warm-up complete');\n } catch (error) {\n logger.warn('Language server warm-up failed (will retry on first tool call):', error);\n }\n }\n\n /**\n * Eagerly start the CLI server so the JVM is warm when the first\n * `executeCodeQLCommand()` call routes through it.\n *\n * The CLI server uses only session-scoped `commonCaches` and `logdir`,\n * both injected by `enrichConfig()`. Passing an empty config is\n * intentional \u2014 it matches what `executeCodeQLCommand()` will request.\n *\n * Fire-and-forget: errors are logged but do not block startup.\n */\n async warmUpCLIServer(): Promise {\n try {\n logger.info('Warming up CLI server (background JVM start)...');\n await this.getCLIServer({});\n logger.info('CLI server warm-up complete');\n } catch (error) {\n logger.warn('CLI server warm-up failed (will retry on first tool call):', error);\n }\n }\n\n /**\n * Enrich a config with session-specific defaults for commonCaches and logdir.\n */\n private enrichConfig(config: T): T {\n return {\n ...config,\n commonCaches: config.commonCaches ?? this.sessionCacheDir,\n logdir: config.logdir ?? this.getLogDir(),\n };\n }\n\n /**\n * Get an existing server if its config matches, otherwise stop the old\n * one and start a new server.\n *\n * Concurrent calls for the same server type are serialized via\n * `pendingStarts` to avoid spawning duplicate server processes.\n */\n private async getOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n // If another call is already starting a server of this type, wait for it\n // to settle (success or failure) and then re-check whether the result is\n // still usable.\n const inflight = this.pendingStarts.get(type);\n if (inflight) {\n try { await inflight; } catch { /* swallow \u2014 original caller handles the rejection */ }\n }\n\n const work = this.doGetOrRestart(type, config, factory);\n this.pendingStarts.set(type, work);\n try {\n return await work;\n } finally {\n // Ensure `work` has settled before removing the pendingStarts entry so\n // that concurrent callers waiting on the same promise see a consistent\n // map state. The try/catch avoids re-throwing a rejection that the\n // outer `try` block already handles.\n try { await work; } catch { /* already handled */ }\n if (this.pendingStarts.get(type) === work) {\n this.pendingStarts.delete(type);\n }\n }\n }\n\n /**\n * Core logic for getOrRestart, separated to allow serialization.\n */\n private async doGetOrRestart(\n type: CodeQLServerType,\n config: ServerConfig,\n factory: () => CodeQLCLIServer | CodeQLLanguageServer | CodeQLQueryServer,\n ): Promise {\n const hash = computeConfigHash(type, config);\n const existing = this.servers.get(type);\n\n // Reuse if config matches and server is still running\n if (existing && existing.configHash === hash && existing.server.isRunning()) {\n logger.debug(`Reusing existing ${type} server (hash: ${hash.substring(0, 8)})`);\n return existing.server;\n }\n\n // Config changed or server died \u2014 stop the old one\n if (existing) {\n logger.info(`${type} server config changed or dead, restarting...`);\n await this.stopServer(existing);\n this.servers.delete(type);\n }\n\n // Start a new server\n const server = factory();\n await server.start();\n\n this.servers.set(type, {\n configHash: hash,\n server,\n sessionId: this.sessionId,\n type,\n });\n\n logger.info(`${type} server started (hash: ${hash.substring(0, 8)})`);\n return server;\n }\n\n /**\n * Stop a managed server, ignoring errors.\n */\n private async stopServer(managed: ManagedServer): Promise {\n try {\n await managed.server.shutdown();\n } catch (error) {\n logger.warn(`Error stopping ${managed.type} server:`, error);\n // Best-effort \u2014 don't propagate\n }\n }\n}\n\n/**\n * Global server manager singleton.\n *\n * Initialized lazily by `getServerManager()`. The MCP server entry point\n * should call `initServerManager()` at startup and `shutdownServerManager()`\n * at graceful shutdown.\n */\nlet globalServerManager: CodeQLServerManager | null = null;\n\n/**\n * Initialize the global server manager (idempotent).\n */\nexport function initServerManager(options?: SessionCacheOptions): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager(options);\n }\n return globalServerManager;\n}\n\n/**\n * Get the global server manager, creating it if needed.\n */\nexport function getServerManager(): CodeQLServerManager {\n if (!globalServerManager) {\n globalServerManager = new CodeQLServerManager();\n }\n return globalServerManager;\n}\n\n/**\n * Shut down the global server manager and all its servers.\n */\nexport async function shutdownServerManager(): Promise {\n if (globalServerManager) {\n await globalServerManager.shutdownAll();\n globalServerManager = null;\n }\n}\n\n/**\n * Reset the global server manager (for testing only).\n */\nexport function resetServerManager(): void {\n globalServerManager = null;\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 * CodeQL subcommands that MUST run as fresh processes.\n *\n * These cannot use the cli-server because they:\n * - Spawn extractors or other long-running child processes (database create, test extract)\n * - Produce multi-event NUL-delimited streams (test run)\n * - Are compound orchestration commands (database analyze)\n *\n * Everything else is routed through the persistent cli-server JVM for\n * sub-second execution instead of 2-5 s JVM cold-start per invocation.\n */\nconst FRESH_PROCESS_SUBCOMMANDS = new Set([\n 'database analyze',\n 'database create',\n 'test extract',\n 'test run',\n]);\n\n/**\n * Execute a CodeQL command.\n *\n * By default, commands are routed through the persistent `codeql execute\n * cli-server` process managed by {@link CodeQLServerManager}, eliminating\n * repeated JVM startup overhead (~2-5 s savings per call).\n *\n * Commands listed in {@link FRESH_PROCESS_SUBCOMMANDS} (e.g. `database create`,\n * `test run`) are always executed as fresh processes because they either spawn\n * child extractors, produce streaming output, or require a dedicated working\n * directory.\n *\n * If the cli-server is not available (e.g. during early startup before\n * `initServerManager()` is called), the function falls back transparently to\n * a fresh process.\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 // Determine whether this subcommand can use the persistent cli-server.\n // Commands that need a specific CWD also must use a fresh process because\n // the cli-server's CWD is fixed at startup.\n const canUseCLIServer = !FRESH_PROCESS_SUBCOMMANDS.has(subcommand) && !cwd;\n\n if (canUseCLIServer) {\n try {\n // Lazy-import to avoid circular dependency at module level.\n // Use getServerManager() (not initServerManager()) \u2014 if the manager\n // hasn't been initialized yet (e.g. during tests or early startup),\n // this creates one, but we only attempt to *use* the cli-server if\n // it is already running (warmed up at MCP server startup). We never\n // block on starting a new cli-server here \u2014 that would add JVM\n // startup latency to the first fresh-process-fallback call.\n const { getServerManager } = await import('./server-manager');\n const manager = getServerManager();\n\n if (manager.isRunning('cli')) {\n const cliServer = await manager.getCLIServer({});\n const sanitizedArgs = sanitizeCLIArguments(args);\n\n logger.info(`Executing CodeQL command via cli-server: ${subcommand}`, { args: sanitizedArgs });\n\n const stdout = await cliServer.runCommand(sanitizedArgs);\n\n return {\n stdout,\n stderr: '',\n success: true,\n exitCode: 0,\n };\n } else {\n logger.debug(`cli-server not yet running for \"${subcommand}\", using fresh process`);\n }\n } catch (error) {\n // If the cli-server call fails, check whether it's a command-level\n // error (the CLI returned non-zero) or a transport/startup error.\n // For transport errors we fall back to a fresh process; for command\n // errors we return the failure directly.\n const message = error instanceof Error ? error.message : String(error);\n\n // Transport-level errors that warrant a fallback:\n if (message.includes('CLI server is not running') ||\n message.includes('CLI server exited') ||\n message.includes('failed to start')) {\n logger.warn(`cli-server unavailable for \"${subcommand}\", falling back to fresh process: ${message}`);\n // Fall through to fresh-process execution below\n } else {\n // Command-level error \u2014 return it as a failed result\n logger.error(`cli-server command failed for \"${subcommand}\": ${message}`);\n return {\n stdout: '',\n stderr: message,\n success: false,\n error: message,\n exitCode: 1,\n };\n }\n }\n }\n\n // Fresh-process execution (for FRESH_PROCESS_SUBCOMMANDS, CWD-specific\n // calls, or as a fallback when the cli-server is unavailable).\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 { registerLSPTools } from './tools/lsp';\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 { initServerManager, shutdownServerManager } from './lib/server-manager';\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 LSP-based tools (diagnostics, completion, definition, references)\n registerLSPTools(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 // Initialize the CodeQL background server manager and eagerly start the\n // language server and CLI server JVMs so they are warm when the first tool\n // calls arrive. This avoids 2-60 s cold-start penalties per JVM.\n const manager = initServerManager();\n Promise.all([\n manager.warmUpLanguageServer(),\n manager.warmUpCLIServer(),\n ]).catch(() => { /* individual errors logged inside each warm-up method */ });\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 // Shut down all CodeQL background servers first\n await shutdownServerManager();\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 { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } 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 the user's effective workspace\n // directory. In monorepo layouts this is the repo root; in npm-\n // installed layouts it falls back to process.cwd().\n if (tests && Array.isArray(tests)) {\n const userDir = getUserWorkspaceDir();\n positionalArgs = [...positionalArgs, ...(tests as string[]).map(\n t => isAbsolute(t) ? t : resolve(userDir, 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(getUserWorkspaceDir(), 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 user's effective workspace\n // directory rather than a potentially read-only package root.\n cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), 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 * 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 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 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_lsp_diagnostics 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 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 * CodeQL LSP Diagnostics tool for MCP server.\n *\n * Provides real-time QL code validation through LSP communication.\n * Renamed from `codeql_language_server_eval` to `codeql_lsp_diagnostics`\n * for consistency with the `codeql_lsp_*` tool naming convention.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { Diagnostic, LanguageServerOptions } from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getProjectTmpDir } from '../../utils/temp-dir';\nimport { join } from 'path';\nimport { pathToFileURL } from 'url';\nimport { getInitializedLanguageServer } from './lsp-server-helper';\n\nexport interface LspDiagnosticsParams {\n qlCode: string;\n serverOptions?: LanguageServerOptions;\n workspaceUri?: string;\n}\n\nexport interface LspDiagnosticsResult {\n diagnostics: Diagnostic[];\n formattedOutput: string;\n isValid: boolean;\n summary: {\n errorCount: number;\n hintCount: number;\n infoCount: number;\n warningCount: number;\n };\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 * Evaluate QL code using the CodeQL Language Server and return diagnostics.\n */\nexport async function lspDiagnostics({\n qlCode,\n workspaceUri,\n serverOptions = {}\n}: LspDiagnosticsParams): Promise {\n try {\n logger.info('Evaluating QL code via Language Server...');\n\n const languageServer = await getInitializedLanguageServer({\n serverOptions,\n workspaceUri,\n });\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 hintCount: diagnostics.filter(d => d.severity === 4).length,\n infoCount: diagnostics.filter(d => d.severity === 3).length,\n warningCount: diagnostics.filter(d => d.severity === 2).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 diagnostics,\n formattedOutput,\n isValid,\n summary,\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 language server via the server manager.\n */\nexport async function shutdownDiagnosticsServer(): Promise {\n const { getServerManager } = await import('../../lib/server-manager');\n const manager = getServerManager();\n await manager.shutdownServer('language');\n}\n\n/**\n * Register the codeql_lsp_diagnostics tool with the MCP server.\n */\nexport function registerLspDiagnosticsTool(server: McpServer): void {\n server.tool(\n 'codeql_lsp_diagnostics',\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. Note: inline ql_code is evaluated as a virtual document and cannot resolve pack imports (e.g. `import javascript`). For validating queries with imports, use codeql_query_compile on the actual file instead.',\n {\n log_level: z.enum(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE', 'ALL']).optional().describe('Language server log level'),\n ql_code: z.string().describe('The CodeQL (QL) code to evaluate for syntax and semantic errors'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\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 lspDiagnostics({\n qlCode: ql_code,\n serverOptions,\n workspaceUri: workspace_uri,\n });\n\n // Return structured result\n const responseContent = {\n diagnostics: result.diagnostics.map(d => ({\n code: d.code,\n column: d.range.start.character + 1, // Convert to 1-based column numbers\n line: d.range.start.line + 1, // Convert to 1-based line numbers\n message: d.message,\n severity: getSeverityName(d.severity),\n source: d.source,\n })),\n formattedOutput: result.formattedOutput,\n isValid: result.isValid,\n summary: result.summary,\n };\n\n return {\n content: [\n {\n text: JSON.stringify(responseContent, null, 2),\n type: 'text',\n }\n ],\n };\n\n } catch (error) {\n logger.error('Error in codeql_lsp_diagnostics tool:', error);\n return {\n content: [\n {\n text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n type: 'text',\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // NOTE: Cleanup is handled centrally by shutdownServerManager() in\n // codeql-development-mcp-server.ts (setupGracefulShutdown). Registering\n // additional process.on('SIGINT'/'SIGTERM') handlers here would\n // accumulate on repeated calls and is unnecessary.\n}\n", "/**\n * Shared helper for obtaining a running, initialized CodeQL Language Server.\n *\n * Both `lsp-diagnostics.ts` and `lsp-handlers.ts` need to:\n * 1. Build a `LanguageServerConfig` with sensible defaults\n * 2. Obtain a server instance from the `CodeQLServerManager`\n * 3. Resolve a workspace URI (relative \u2192 absolute \u2192 `file://`)\n * 4. Initialize the server with the resolved workspace\n *\n * Centralizing this logic avoids duplication and ensures consistent\n * default behaviour across all LSP tools.\n */\n\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport { CodeQLLanguageServer, LanguageServerOptions } from '../../lib/language-server';\nimport { LanguageServerConfig } from '../../lib/server-config';\nimport { getServerManager } from '../../lib/server-manager';\nimport { logger } from '../../utils/logger';\n\n/**\n * Options accepted by {@link getInitializedLanguageServer}.\n */\nexport interface InitializedServerOptions {\n /** Language-server-level options (loglevel, searchPath, etc.). */\n serverOptions?: LanguageServerOptions;\n /** Workspace URI \u2014 may be a `file://` URI, absolute path, or relative path. */\n workspaceUri?: string;\n}\n\n/**\n * Return a running, initialized `CodeQLLanguageServer`.\n *\n * - Resolves `searchPath` to the bundled `ql` directory when not provided.\n * - Converts relative / bare-directory `workspaceUri` paths to `file://` URIs\n * resolved against `getUserWorkspaceDir()` (respects `CODEQL_MCP_WORKSPACE`).\n * - Falls back to the bundled `ql` directory when no workspace is given.\n * - Delegates lifecycle management to the global `CodeQLServerManager`.\n */\nexport async function getInitializedLanguageServer(\n opts: InitializedServerOptions = {},\n): Promise {\n const { packageRootDir: pkgRoot, getUserWorkspaceDir } = await import('../../utils/package-paths');\n const options = opts.serverOptions ?? {};\n\n const config: LanguageServerConfig = {\n checkErrors: 'ON_CHANGE',\n loglevel: options.loglevel ?? 'WARN',\n searchPath: options.searchPath ?? resolve(pkgRoot, 'ql'),\n synchronous: options.synchronous,\n verbosity: options.verbosity,\n };\n\n const manager = getServerManager();\n const server = await manager.getLanguageServer(config);\n\n // Normalize workspace URI: convert relative / bare directory paths to\n // file:// URIs against getUserWorkspaceDir() (respects CODEQL_MCP_WORKSPACE).\n let effectiveUri = opts.workspaceUri;\n if (effectiveUri && !effectiveUri.startsWith('file://')) {\n const absWorkspace = isAbsolute(effectiveUri)\n ? effectiveUri\n : resolve(getUserWorkspaceDir(), effectiveUri);\n effectiveUri = pathToFileURL(absWorkspace).href;\n }\n effectiveUri = effectiveUri ?? pathToFileURL(resolve(pkgRoot, 'ql')).href;\n\n await server.initialize(effectiveUri);\n logger.debug(`Language server initialized with workspace: ${effectiveUri}`);\n\n return server;\n}\n", "/**\n * CodeQL LSP tool handlers.\n *\n * Bridges MCP tool invocations to LSP requests on the CodeQL Language Server.\n * Each handler acquires a language server via the CodeQLServerManager,\n * opens the requested document, sends the LSP request, and returns the result.\n */\n\nimport { readFile } from 'fs/promises';\nimport { isAbsolute, resolve } from 'path';\nimport { pathToFileURL } from 'url';\n\nimport {\n CompletionItem,\n LSPLocation,\n TextDocumentPositionParams,\n} from '../../lib/language-server';\nimport { logger } from '../../utils/logger';\nimport { getUserWorkspaceDir } from '../../utils/package-paths';\nimport { getInitializedLanguageServer } from './lsp-server-helper';\n\n/**\n * Common parameters for LSP tool invocations.\n */\nexport interface LSPToolParams {\n /** 0-based character offset within the line. */\n character: number;\n /** Optional override for the file content (if not reading from disk). */\n fileContent?: string;\n /**\n * Path to the QL file. May be absolute or relative.\n * Relative paths are resolved against `getUserWorkspaceDir()`\n * (respects the `CODEQL_MCP_WORKSPACE` environment variable).\n */\n filePath: string;\n /** 0-based line number in the document. */\n line: number;\n /** Optional search path for CodeQL libraries. */\n searchPath?: string;\n /** Optional workspace URI for context. */\n workspaceUri?: string;\n}\n\n/**\n * Get a running, initialized language server for the given parameters.\n */\nasync function getInitializedServer(params: LSPToolParams) {\n return getInitializedLanguageServer({\n serverOptions: { searchPath: params.searchPath },\n workspaceUri: params.workspaceUri,\n });\n}\n\n/**\n * Resolve the file path to an absolute path and file:// URI.\n */\nfunction prepareDocumentPosition(\n params: LSPToolParams,\n): { absPath: string; docUri: string } {\n // Resolve relative paths against getUserWorkspaceDir() so that\n // CODEQL_MCP_WORKSPACE is respected and behaviour is consistent across tools.\n const absPath = isAbsolute(params.filePath)\n ? params.filePath\n : resolve(getUserWorkspaceDir(), params.filePath);\n const docUri = pathToFileURL(absPath).href;\n\n return { absPath, docUri };\n}\n\n/**\n * Read file content and open the document in the language server.\n */\nasync function openDocumentForPosition(\n server: Awaited>,\n params: LSPToolParams,\n absPath: string,\n docUri: string,\n): Promise {\n // Read file content from disk or use provided content\n let text: string;\n if (params.fileContent) {\n text = params.fileContent;\n } else {\n try {\n text = await readFile(absPath, 'utf-8');\n } catch (error) {\n throw new Error(`Cannot read file: ${absPath}: ${error instanceof Error ? error.message : error}`);\n }\n }\n\n // Open the document so the language server knows about it\n server.openDocument(docUri, text);\n\n return {\n position: { character: params.character, line: params.line },\n textDocument: { uri: docUri },\n };\n}\n\n/**\n * Get code completions at a position.\n */\nexport async function lspCompletion(params: LSPToolParams): Promise {\n logger.info(`LSP completion at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getCompletions(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Go to definition of a symbol at a position.\n */\nexport async function lspDefinition(params: LSPToolParams): Promise {\n logger.info(`LSP definition at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getDefinition(positionParams);\n } finally {\n server.closeDocument(docUri);\n }\n}\n\n/**\n * Find all references to a symbol at a position.\n */\nexport async function lspReferences(params: LSPToolParams): Promise {\n logger.info(`LSP references at ${params.filePath}:${params.line}:${params.character}`);\n const server = await getInitializedServer(params);\n const { absPath, docUri } = prepareDocumentPosition(params);\n const positionParams = await openDocumentForPosition(server, params, absPath, docUri);\n\n try {\n return await server.getReferences({\n ...positionParams,\n context: { includeDeclaration: true },\n });\n } finally {\n server.closeDocument(docUri);\n }\n}\n", "/**\n * CodeQL LSP MCP tool definitions.\n *\n * Registers four LSP-based tools:\n * - codeql_lsp_completion \u2013 code completions at cursor position\n * - codeql_lsp_definition \u2013 go to definition\n * - codeql_lsp_diagnostics \u2013 QL code validation via LSP diagnostics\n * - codeql_lsp_references \u2013 find all references\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { registerLspDiagnosticsTool } from './lsp-diagnostics';\nimport {\n lspCompletion,\n lspDefinition,\n lspReferences,\n} from './lsp-handlers';\nimport { logger } from '../../utils/logger';\n\n/**\n * Shared Zod schema for the common LSP tool parameters.\n */\nconst lspParamsSchema = {\n character: z.number().int().min(0).describe('0-based character offset within the line'),\n file_content: z.string().optional().describe('Optional file content override (reads from disk if omitted)'),\n file_path: z.string().describe('Path to the CodeQL (.ql/.qll) file. Relative paths are resolved against the user workspace directory (see CODEQL_MCP_WORKSPACE).'),\n line: z.number().int().min(0).describe('0-based line number in the document'),\n search_path: z.string().optional().describe('Optional search path for CodeQL libraries'),\n workspace_uri: z.string().optional().describe('Optional workspace URI for context (defaults to ./ql directory)'),\n};\n\n/**\n * Helper to build the handler params from the raw MCP tool input.\n */\nfunction toHandlerParams(input: {\n character: number;\n file_content?: string;\n file_path: string;\n line: number;\n search_path?: string;\n workspace_uri?: string;\n}) {\n return {\n character: input.character,\n fileContent: input.file_content,\n filePath: input.file_path,\n line: input.line,\n searchPath: input.search_path,\n workspaceUri: input.workspace_uri,\n };\n}\n\n/**\n * Register all LSP-based tools with the MCP server.\n */\nexport function registerLSPTools(server: McpServer): void {\n // --- codeql_lsp_diagnostics (relocated from codeql_language_server_eval) ---\n registerLspDiagnosticsTool(server);\n\n // --- codeql_lsp_completion ---\n server.tool(\n 'codeql_lsp_completion',\n 'Get code completions at a cursor position in a CodeQL file. Returns completion items with labels, documentation, and insert text. The file must be a .ql or .qll file. IMPORTANT: Set workspace_uri to the pack or workspace root directory for dependency resolution; without it, completions for imported libraries will be empty.',\n lspParamsSchema,\n async (input) => {\n try {\n const items = await lspCompletion(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n completionCount: items.length,\n items: items.map((item) => ({\n detail: item.detail,\n documentation: item.documentation,\n insertText: item.insertText,\n kind: item.kind,\n label: item.label,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_completion error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_definition ---\n server.tool(\n 'codeql_lsp_definition',\n 'Go to the definition of a CodeQL symbol at a given position. Returns one or more file locations where the symbol is defined. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspDefinition(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n definitionCount: locations.length,\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_definition error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\n };\n }\n },\n );\n\n // --- codeql_lsp_references ---\n server.tool(\n 'codeql_lsp_references',\n 'Find all references to a CodeQL symbol at a given position. Returns file locations of all usages, including the declaration. Set workspace_uri to the pack root for dependency resolution.',\n lspParamsSchema,\n async (input) => {\n try {\n const locations = await lspReferences(toHandlerParams(input));\n return {\n content: [{\n text: JSON.stringify({\n locations: locations.map((loc) => ({\n endCharacter: loc.range.end.character,\n endLine: loc.range.end.line + 1,\n startCharacter: loc.range.start.character,\n startLine: loc.range.start.line + 1,\n uri: loc.uri,\n })),\n referenceCount: locations.length,\n }, null, 2),\n type: 'text' as const,\n }],\n };\n } catch (error) {\n logger.error('codeql_lsp_references error:', error);\n return {\n content: [{ text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, type: 'text' as const }],\n isError: true,\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// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Exported parameter schemas for each workflow prompt.\n//\n// Extracting the schemas makes it easy to unit-test required vs optional\n// validation independently of the MCP server registration.\n//\n// **Convention for VS Code UX consistency**:\n// Every prompt MUST expose at least one parameter \u2013 even if all parameters\n// are optional \u2013 so that VS Code always displays the parameter input dialog\n// and allows the user to customize the prompt before Copilot Chat processes\n// it. The `description` field on each Zod schema member doubles as the\n// placeholder text shown in the VS Code input box.\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Schema for test_driven_development prompt parameters.\n *\n * - `language` is **required** \u2013 the TDD workflow is language-specific.\n * - `queryName` is optional \u2013 defaults to '[QueryName]' if omitted.\n */\nexport const testDrivenDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the query'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for tools_query_workflow prompt parameters.\n *\n * - `language` and `database` are **required**.\n * - `sourceFiles`, `sourceFunction`, `targetFunction` are optional context.\n */\nexport const toolsQueryWorkflowSchema = z.object({\n database: z\n .string()\n .describe('Path to the CodeQL database'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language for the tools queries'),\n sourceFiles: z\n .string()\n .optional()\n .describe('Comma-separated source file names for PrintAST (e.g., \"main.js,utils.js\")'),\n sourceFunction: z\n .string()\n .optional()\n .describe('Function name for PrintCFG or CallGraphFrom (e.g., \"processData\")'),\n targetFunction: z\n .string()\n .optional()\n .describe('Function name for CallGraphTo (e.g., \"validate\")'),\n});\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 *\n * - `queryPath` and `language` are **required**.\n * - `workshopName` and `numStages` are optional.\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 * Schema for ql_tdd_basic prompt parameters.\n *\n * All parameters are optional \u2013 but at least one should be present so the\n * VS Code quick-pick dialog appears.\n */\nexport const qlTddBasicSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for ql_tdd_advanced prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlTddAdvancedSchema = z.object({\n database: z\n .string()\n .optional()\n .describe('Path to the CodeQL database for analysis'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query (optional)'),\n queryName: z\n .string()\n .optional()\n .describe('Name of the query to develop'),\n});\n\n/**\n * Schema for sarif_rank_false_positives / sarif_rank_true_positives.\n *\n * Both parameters are optional.\n */\nexport const sarifRankSchema = z.object({\n queryId: z\n .string()\n .optional()\n .describe('CodeQL query/rule identifier'),\n sarifPath: z\n .string()\n .optional()\n .describe('Path to the SARIF file to analyze'),\n});\n\n/**\n * Schema for explain_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n * - `databasePath` is optional.\n */\nexport const explainCodeqlQuerySchema = z.object({\n databasePath: z\n .string()\n .optional()\n .describe('Optional path to a real CodeQL database for profiling'),\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for document_codeql_query prompt parameters.\n *\n * - `queryPath` and `language` are **required**.\n */\nexport const documentCodeqlQuerySchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .describe('Programming language of the query'),\n queryPath: z\n .string()\n .describe('Path to the CodeQL query file (.ql or .qlref)'),\n});\n\n/**\n * Schema for ql_lsp_iterative_development prompt parameters.\n *\n * All parameters are optional.\n */\nexport const qlLspIterativeDevelopmentSchema = z.object({\n language: z\n .enum(SUPPORTED_LANGUAGES)\n .optional()\n .describe('Programming language for the query'),\n queryPath: z\n .string()\n .optional()\n .describe('Path to the query file being developed'),\n workspaceUri: z\n .string()\n .optional()\n .describe('Workspace URI for LSP dependency resolution'),\n});\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Prompt names (exported for testing)\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Names of every workflow prompt registered with the MCP server. */\nexport const WORKFLOW_PROMPT_NAMES = [\n 'document_codeql_query',\n 'explain_codeql_query',\n 'ql_lsp_iterative_development',\n 'ql_tdd_advanced',\n 'ql_tdd_basic',\n 'sarif_rank_false_positives',\n 'sarif_rank_true_positives',\n 'test_driven_development',\n 'tools_query_workflow',\n 'workshop_creation_workflow',\n] as const;\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 *\n * **UX note**: Every prompt schema is passed to `server.prompt()` so that\n * VS Code always displays the parameter-input quick-pick before the prompt\n * is sent to Copilot Chat. This lets users review and customise the values.\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 testDrivenDevelopmentSchema.shape,\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 toolsQueryWorkflowSchema.shape,\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 qlTddBasicSchema.shape,\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 qlTddAdvancedSchema.shape,\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 sarifRankSchema.shape,\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 sarifRankSchema.shape,\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 explainCodeqlQuerySchema.shape,\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 documentCodeqlQuerySchema.shape,\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 // LSP-powered Iterative Development Prompt\n server.prompt(\n 'ql_lsp_iterative_development',\n 'Iterative CodeQL query development using LSP tools for completion, navigation, and validation',\n qlLspIterativeDevelopmentSchema.shape,\n async ({ language, queryPath, workspaceUri }) => {\n const template = loadPromptTemplate('ql-lsp-iterative-development.prompt.md');\n\n let contextSection = '## Your Development Context\\n\\n';\n if (language) {\n contextSection += `- **Language**: ${language}\\n`;\n }\n if (queryPath) {\n contextSection += `- **Query Path**: ${queryPath}\\n`;\n }\n if (workspaceUri) {\n contextSection += `- **Workspace URI**: ${workspaceUri}\\n`;\n }\n if (language || queryPath || workspaceUri) {\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 logger.info(`Registered ${WORKFLOW_PROMPT_NAMES.length} 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 { getProjectTmpBase } from '../utils/temp-dir';\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(getProjectTmpBase(), '.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": ["type", "resolve", "setTimeout", "resolve", "setTimeout", "clearTimeout", "join", "resolve", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "resolve", "spawn", "delimiter", "EventEmitter", "clearTimeout", "setTimeout", "resolve", "mkdirSync", "join", "type", "packageRootDir", "resolve", "existsSync", "delimiter", "dirname", "isAbsolute", "binary", "getServerManager", "resolve", "pathToFileURL", "z", "readFileSync", "dirname", "isAbsolute", "mkdirSync", "mkdirSync", "existsSync", "join", "resolve", "timestamp", "writeFileSync", "existsSync", "mkdirSync", "basename", "dirname", "isAbsolute", "join", "resolve", "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", "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", "z", "join", "pathToFileURL", "isAbsolute", "resolve", "pathToFileURL", "getUserWorkspaceDir", "pathToFileURL", "join", "z", "readFile", "isAbsolute", "resolve", "pathToFileURL", "isAbsolute", "resolve", "pathToFileURL", "readFile", "z", "z", "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", "randomUUID", "z", "join", "mkdirSync", "writeFileSync", "randomUUID", "z", "timestamp", "randomUUID", "resolve", "pathToFileURL"] } diff --git a/server/src/lib/server-manager.ts b/server/src/lib/server-manager.ts index 61416746..cc23d0e4 100644 --- a/server/src/lib/server-manager.ts +++ b/server/src/lib/server-manager.ts @@ -289,6 +289,11 @@ export class CodeQLServerManager { try { return await work; } finally { + // Ensure `work` has settled before removing the pendingStarts entry so + // that concurrent callers waiting on the same promise see a consistent + // map state. The try/catch avoids re-throwing a rejection that the + // outer `try` block already handles. + try { await work; } catch { /* already handled */ } if (this.pendingStarts.get(type) === work) { this.pendingStarts.delete(type); } diff --git a/server/test/src/lib/server-manager.test.ts b/server/test/src/lib/server-manager.test.ts index 1933ba13..91e60871 100644 --- a/server/test/src/lib/server-manager.test.ts +++ b/server/test/src/lib/server-manager.test.ts @@ -179,6 +179,65 @@ describe('CodeQLServerManager', () => { expect(server1).toBe(server2); expect(manager.isRunning('language')).toBe(true); }); + + it('should allow a retry after a failed start', async () => { + const { spawn } = await import('child_process'); + const manager = new CodeQLServerManager({ sessionId: 'ls-fail-retry' }); + const config = { searchPath: '/ql' }; + + // First call: spawn throws so the start rejects + (spawn as ReturnType).mockImplementationOnce(() => { + throw new Error('mock spawn failure'); + }); + + await expect(manager.getLanguageServer(config)).rejects.toThrow('mock spawn failure'); + expect(manager.isRunning('language')).toBe(false); + + // Second call: spawn works again — should succeed, not hang on a + // stale pendingStarts entry. + const server = await manager.getLanguageServer(config); + expect(server).toBeDefined(); + expect(server.isRunning()).toBe(true); + }); + + it('should not leak pendingStarts when concurrent calls race and the first rejects', async () => { + const { spawn } = await import('child_process'); + const manager = new CodeQLServerManager({ sessionId: 'ls-race-reject' }); + const config = { searchPath: '/ql' }; + + let callCount = 0; + const originalImpl = (spawn as ReturnType).getMockImplementation(); + (spawn as ReturnType).mockImplementation((...args: unknown[]) => { + callCount++; + if (callCount === 1) { + // First spawn fails — simulates a transient error + throw new Error('transient spawn failure'); + } + // Subsequent spawns succeed using the original mock implementation + if (originalImpl) return originalImpl(...args); + // Fallback: should not happen, but satisfy the type checker + throw new Error('no original implementation'); + }); + + // Fire two concurrent requests — first will reject, second should + // still succeed because pendingStarts is cleaned up properly. + const results = await Promise.allSettled([ + manager.getLanguageServer(config), + manager.getLanguageServer(config), + ]); + + // At least one call should have succeeded + const fulfilled = results.filter(r => r.status === 'fulfilled'); + expect(fulfilled.length).toBeGreaterThanOrEqual(1); + + // The manager should have a running language server afterwards + expect(manager.isRunning('language')).toBe(true); + + // Restore original mock + if (originalImpl) { + (spawn as ReturnType).mockImplementation(originalImpl); + } + }); }); describe('getQueryServer', () => {