diff --git a/.dockerignore b/.dockerignore index f96454d..3b532bd 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,3 +8,4 @@ !tsconfig.json !type-defs.graphql !jest.config.ts +!mcp/ diff --git a/CLAUDE.md b/CLAUDE.md index 499054b..eb7327b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -146,9 +146,58 @@ The project includes comprehensive documentation in the `docs/` directory follow - [Integrate Blob API](docs/how-to/integrate-blob-api.md) - Frontend integration guide - **Explanation** (`docs/explanation/`) - Conceptual deep dives - [Query Optimization](docs/explanation/query-optimization.md) - CALL {} subquery pattern for variable-length path queries + - [Diff System](docs/explanation/diff-system.md) - max_depth semantics, the filter gotcha (Blob nodes), and the max_depth=1 rule for leaf-node types **When working on Cypher queries or the graph data model, ALWAYS consult [docs/reference/data-model.md](docs/reference/data-model.md) first.** +## MCP Server (`mcp/`) + +The MCP (Model Context Protocol) server exposes OSWatcher tools to AI assistants. It is a **separate Docker service** — not part of the `api` container. + +- **Location**: `graphql-api/mcp/`, with its own `Dockerfile`, `package.json`, `tsconfig.json` and codegen. The root `tsconfig.json` excludes it. +- **Compose service**: defined in `oswatcher-hub/compose.dev.yml` as `mcp`, port 3001, built from `context: ../graphql-api`. The two repos must be siblings on disk. +- **Rebuilding**: must be rebuilt explicitly — `docker compose -f compose.yml -f compose.dev.yml up --build mcp -d`. Rebuilding `api` does NOT rebuild `mcp`. +- **GraphQL client**: calls the API at `GRAPHQL_API_URL` (`http://api:4000/graphql` in Docker). The API is unauthenticated, so no credential is forwarded and the SDK is built once at module scope. +- **Codegen**: `npm run generate` (not `codegen`) regenerates `src/graphql/generated/sdk.ts` from `src/graphql/queries.graphql`. It reads the schema from a **running** API on port 4000. + +### Tools (17 total) + +Task-shaped tools take `(ref, path, ...)` and resolve the chain internally. The hash-based tools are retained as an escape hatch for entity combinations the task-shaped ones do not reach. + +| Tool | Description | +|------|-------------| +| `list_branches` | List OS branches with optional name filter | +| `list_commits` | List commits on a branch | +| `get_commit_capabilities` | Which data kinds were extracted for a snapshot | +| `list_tree` | List a directory's subdirectories and files | +| `list_registry_key` | List a registry key's subkeys and values, by hive name | +| `get_struct` | A struct's full field layout, by name | +| `list_structs` | Structs a PE file defines, optionally by name | +| `list_symbols` | Symbols a PE file exports, optionally by name | +| `git_log` | How one entity changed across commit history | +| `diff_versions` | Filesystem diff between two refs at a path | +| `search` | Substring search across filesystem/registry/symbols/structs | +| `search_next` | Next page of a search session | +| `search_close` | End a search session early | +| `traverse_path` | Raw: walk the filesystem from a ref to a path | +| `get_winreg_root` | Raw: follow `HAS_WINREG` from a Blob hash | +| `get_blobs_with_symbols` | Raw: PE blobs that carry PDB data | +| `diff_nodes` | Raw: diff on node hashes, any entity type | + +### Key design constraints + +**Filesystem diff filter**: `DiffNodesAt` **must** pass `filter: ["Tree", "Blob"]` when diffing filesystems. Without it, the Java procedure (`oswatcher.diffTreesRecursive`) defaults to filtering only `Tree` nodes and silently drops every `Blob` leaf. See `docs/explanation/diff-system.md`. + +**`max_depth=1` required for Symbol, Struct and StructField diffs**: the Java procedure adds `parentLabel` to the filter and recurses into Struct/Symbol nodes, but their children are `StructField`, not `Struct`/`Symbol`. Without `max_depth=1` the diff silently returns 0 results. + +**UNCHANGED status filter for a full C type layout**: to reconstruct a whole struct (e.g. `_EPROCESS`, 261 fields) pass `status_filter: ["NEW", "MOD", "DEL", "UNCHANGED"]`. Without it only the delta comes back (~5 items). + +**Search sessions are process-local**: `src/search-session.ts` holds them in a `Map`, so the API cannot be horizontally scaled while sessions are in use. + +**Resolution lives in the MCP layer**: `mcp/src/resolve.ts` composes existing GraphQL queries client-side. 0.1 adds no custom resolvers to the API beyond paginated search: the API is a stable open-source artifact with a second consumer (the frontend, which composes the same queries client-side), and the hops are localhost-cheap inside the compose network. + +**One pagination envelope**: every paginated tool returns `{ items, has_more, next_cursor }` over three different mechanisms. `list_tree` and `list_registry_key` page two connections at once and pack both cursors into one opaque composite cursor, see `mcp/src/pagination.ts`. + ## Important Patterns ### Module System diff --git a/docs/explanation/diff-system.md b/docs/explanation/diff-system.md new file mode 100644 index 0000000..f94e948 --- /dev/null +++ b/docs/explanation/diff-system.md @@ -0,0 +1,95 @@ +# Diff System: Behavior and Known Gotchas + +## Overview + +The diff system computes changes between two filesystem snapshots. It spans three layers: + +1. **GraphQL resolver** (`src/resolvers.ts` → `diffNodesAt`): validates input with a zod schema +2. **TypeScript diff logic** (`src/diff/diff.ts` → `diffNodesAtInternal`, `diffTreesIterative`): resolves paths, calls the Neo4j procedure +3. **Java Neo4j procedure** (`oswatcher-procedures` → `oswatcher.diffTreesRecursive`): recursive graph traversal + +## `max_depth` Semantics + +| Value | Behavior | +|-------|----------| +| `0` | Compare the root node only (no children). Returns a single MOD/NEW/DEL entry. | +| `1` | Immediate children only. No recursion into subdirectories. | +| `N > 1` | Children + N-1 levels of descendants. | +| `-1` (or omitted) | Unlimited recursive diff. Returns all changed leaf nodes. | + +Note: the Java procedure's `canRecurse` logic is **shifted by 1**: `max_depth=1` means "children only, no recursion", not "recurse one level deep". + +## `max_depth` Is Unrestricted + +`diffNodesAt` applies no authorization to `max_depth`. Every value, including +the unlimited default, is allowed. There is no authentication model in this API +at all. `src/auth/` was removed on 2026-09-08 along with Auth0. + +The `filter` and `max_depth=1` gotchas below are **not** auth rules. They are +behaviours of the Java procedure `oswatcher.diffTreesRecursive`, and they apply +identically to every caller. + +## `with_intermediates` and `status_filter` + +- `with_intermediates=false` (default): only leaf nodes (Blobs, WinRegValues, etc.) are returned. Intermediate directory nodes are not emitted even if they changed. +- `with_intermediates=true`: emit intermediate Tree/WinRegKey nodes as MOD/NEW/DEL in addition to their leaves. +- `status_filter`: restrict results to `NEW`, `MOD`, `DEL`, or `UNCHANGED`. Empty = all except UNCHANGED (UNCHANGED requires explicit opt-in). + +## The `filter` Parameter and the Blob Gotcha + +The `filter` parameter controls which child node labels are collected at each level of the recursive traversal (in `collectNodeInfo` in the Java procedure). + +**Critical behavior**: if `filter=[]` (empty), the Java procedure adds `parentLabel` (e.g. `"Tree"`) to it automatically: + +```java +effectiveFilter.add(parentLabel); // always adds "Tree" for filesystem diffs +``` + +This means without an explicit filter, only `Tree` children are collected, and `Blob` nodes are silently skipped. + +**Consequence**: +- `max_depth=1`: works fine (no recursion occurs), Tree children are returned as MOD/DEL/NEW directly +- `max_depth=-1`: returns **0 results** (recursion only visits Tree→Tree chains, Blob leaves are never collected, and with `with_intermediates=false` nothing is emitted) + +**Fix**: always pass `filter: ["Tree", "Blob"]` for filesystem diffs. The MCP's `DiffNodesAt` query does this by default (see `mcp/src/tools/diff.ts`). + +For non-filesystem diffs (registry, symbols, structs), use the appropriate labels: +- Registry: `["WinRegKey", "WinRegValue"]` +- Symbols: `["Symbol"]` +- Structs (list): `["Struct"]` +- Struct fields: `["StructField"]` + +## `max_depth=1` Rule for Leaf-Node Types + +**Always pass `max_depth=1` for Symbol, Struct, and StructField diffs.** Without it, diffs return 0 results. + +Root cause: the Java procedure adds `parentLabel` to `effectiveFilter` and uses `isRecursableLabel` to decide whether to recurse into a node. `Struct` and `Symbol` are recursable, so the procedure recurses into them looking for children of the same label type. But Struct children are `StructField`, not `Struct`; Symbol nodes have no children of the same type. Without `max_depth=1`, the procedure exhausts all recursion levels and emits nothing. + +With `max_depth=1`, recursion is cut off after the immediate children, exactly what is needed for flat lists of Symbols/Structs/StructFields. + +| Entity | `parent_label` | `filter` | `max_depth` | +|--------|---------------|----------|-------------| +| Filesystem | `Tree` | `["Tree", "Blob"]` | omit (-1) | +| Registry | `WinRegKey` | `["WinRegKey", "WinRegValue"]` | omit (-1) | +| Symbols | `Blob` | `["Symbol"]` | **1 (required)** | +| Structs list | `Blob` | `["Struct"]` | **1 (required)** | +| Struct fields | `Blob` | `["StructField"]` | **1 (required)** | + +## Reconstructing Full C Type Layout + +Struct field diffs with `status_filter` omitted (or `["NEW","MOD","DEL"]`) return only delta fields. To reconstruct the complete C type layout, pass `status_filter: ["NEW", "MOD", "DEL", "UNCHANGED"]`. + +Example: `_EPROCESS` between win11-24h2 and win11-25h2 (5 changed fields vs 261 total fields). + +## Path Resolution + +Before calling the Java procedure, `diffNodesAtInternal` resolves the `at_path` argument by traversing from the filesystem root hash to the target node using `get_path_entry()`. If the path doesn't exist in either tree, the function returns early with `total_count: 0, items: []`. This is normal (e.g. a path that only exists in one version). + +## MCP vs Frontend + +The MCP's `diff_versions` tool (`mcp/src/tools/diff.ts`) hardcodes +`parentLabel="Tree"` and `filter=["Tree", "Blob"]`, which is correct for +filesystem diffs. `diff_nodes` (`mcp/src/tools/diff-nodes.ts`) takes both from +the caller, which is what makes it usable for registry, symbol and struct diffs. + +The frontend passes the `filter` parameter explicitly depending on the view (filesystem, registry, symbols, structs). Do not change the MCP defaults without verifying the filter handles all relevant child label types. diff --git a/docs/superpowers/specs/2026-09-08-mcp-server-0.1-design.md b/docs/superpowers/specs/2026-09-08-mcp-server-0.1-design.md new file mode 100644 index 0000000..60ab458 --- /dev/null +++ b/docs/superpowers/specs/2026-09-08-mcp-server-0.1-design.md @@ -0,0 +1,362 @@ +# MCP Server 0.1: Design + +**Date:** 2026-09-08 +**Status:** Approved, ready for implementation planning +**Scope:** `graphql-api` (gitlab `oswatcher/graphql-api`) and `oswatcher-hub` (github `OSWatcher/oswatcher`) + +## Goal + +Bring the OSWatcher MCP server to a functional, validated 0.1 release: rebased onto the +post-Auth0 open-source `master`, exposing enough of the GraphQL API that an LLM can carry +out a complete OS investigation, and validated against a real corpus. + +## Current state + +The work exists on two branches: + +| Repo | Branch | Pushed | Base | Position | +|---|---|---|---|---| +| `graphql-api` | `feat/mcp-server` | **No, local only** | `b1b9b57` (PR #65) | 10 ahead, 9 behind | +| `oswatcher-hub` | `wip/mcp-server` | Yes (origin) | `ade2f9d` (PR #122) | 1 ahead, 1 behind | + +`graphql-api/feat/mcp-server` carries two things: + +1. **`mcp/` subproject**: a standalone Node 25 ESM TypeScript MCP server using + `@modelcontextprotocol/sdk` over Streamable HTTP (stateless), Express endpoints + `POST /mcp` and `GET /health` on port 3001, a codegen-generated GraphQL SDK, jest tests + using nock, and 10 registered tools. +2. **Server-side paginated search**: `src/search-session.ts`, the `searchWithSession` and + `searchNext` queries, the `searchClose` mutation, and the `PaginatedSearchResult` type. + +`oswatcher-hub/wip/mcp-server` is a single commit adding an `mcp` service to +`compose.dev.yml`, building from `../graphql-api` with `mcp/Dockerfile`, Traefik-routed at +`mcp.localhost:3001`. + +### What changed underneath + +`origin/master` of `graphql-api` moved 9 commits ahead, and those commits removed the +entire auth model: + +- `dda22be chore: remove Auth0 (#66)`, `115bbd7 chore: open-source readiness pass` +- `fcdfa48 chore: remove PostHog (#69)`, `5aa9265 feat: drop the CORS origin allow-list (#68)` +- `1f8ec91 chore: remove blob download branch restriction (#70)` + +Verified on `origin/master`: + +- `src/auth/` is gone; no `auth0`, `jwt`, `jose` or `oauth` dependency remains. +- HTTP context is `async ({ req }) => ({ req })` (`src/index.ts:335`); WebSocket context is + `async () => ({})` (`src/index.ts:145`). There is no `jwt` in either. +- `diffNodesAt` has no auth gates: every `max_depth` value is allowed. +- `GET /blob/:hash` streams any blob from MinIO with no authorization check. + +## Non-goals for 0.1 + +Recorded explicitly so they are not rediscovered as gaps: + +- **Blob download and file contents.** Deferred. The oswatcher-hub PR #123 description + mentions a separate Winbindex-based file-content thread, which looks like the 0.2 path. +- **Horizontal scaling of search sessions.** Documented as a constraint, not fixed. +- **A published MCP docker image.** 0.1 requires sibling source checkouts. +- **MCP resources, prompts and sampling.** 0.1 is tools only. +- **Authentication.** There is nothing to authenticate against. + +## Decisions + +### D1: Task-shaped read tools, thin tools kept as escape hatch + +New read tools take `(ref, path, name)` and resolve the chain internally. The existing thin +hash-based tools (`traverse_path`, `get_winreg_root`, `diff_nodes`) are retained for +composition and for entity combinations the task-shaped tools do not reach. + +This mirrors the split already present between `diff_versions` (resolves refs) and +`diff_nodes` (raw hashes). It partially reverses the previous "Do not collapse these steps" +rule in `CLAUDE.md`, which was written when the surface was diff-only. + +Rationale: with thin tools alone, "show me the `_EPROCESS` layout in win11-24h2" costs five +round trips and dumps a multi-thousand-row `getBlobsWithSymbols` result into context to find +one blob hash. + +### D2: Resolution logic lives in the MCP layer, not in new GraphQL resolvers + +A `mcp/src/resolve.ts` helper composes existing GraphQL queries client-side. 0.1 adds no new +custom resolvers to `graphql-api` beyond the paginated-search code already on the branch. + +Rationale: `graphql-api` master is a stable open-source artifact with a second consumer (the +frontend, which already composes these same queries client-side with an Apollo cache). The +MCP is the component in flux. Hops are localhost-cheap inside the compose network. The +alternative, adding `getStruct`/`listTree` resolvers, would grow the public schema purely for +MCP's benefit and require a separate resolver test suite. + +### D3: The `include_updates` JWT gate is deleted, not adapted + +`feat/mcp-server`'s `searchWithSession` resolver contains: + +```ts +if (input.commit_range.include_updates === true && !context.jwt) { + throw new Error("Commit traversal with include_updates requires authentication..."); +} +``` + +Since `context.jwt` is now always `undefined`, `!context.jwt` is always `true`. Replaying +this unchanged ships a `search` tool that throws on every call passing `include_updates: +true`, and `include_updates` is a parameter the MCP `search` tool exposes to the LLM. This is +a release blocker, not cleanup. `include_updates` becomes unconditionally allowed. + +### D4: Uniform pagination envelope over three mechanisms + +Every paginated tool returns `{ items, has_more, next_cursor }`, so the LLM learns one +pattern. Underneath: search uses server-side sessions, `list_*` tools use Neo4j connection +cursors, `git_log` uses limit/offset. + +`search_next` and `search_close` remain distinct tools because search sessions have a +lifecycle the others do not: they expire after 5 minutes of inactivity, connection cursors do +not. Each description states this in one line. Search's `results` field is renamed `items` +for consistency. + +### D5: `search-session.ts` carries through the rebase unchanged + +Sessions live in a process-local `Map`, so the API cannot be horizontally scaled while +sessions are in use. This is documented rather than fixed for 0.1. The pattern earns its +keep: `search` streams results from an async generator over a 6.9M-node graph, which cannot +be offset/limited. + +## Tool surface + +17 tools. 10 existing, 7 new. + +### Retained unchanged + +`list_branches`, `list_commits`, `diff_versions`, `search`, `search_next`, `search_close`, +`traverse_path`, `get_winreg_root`, `get_blobs_with_symbols`, `diff_nodes`. + +`diff_nodes`, `traverse_path` and `get_winreg_root` gain a line in their descriptions: +"Prefer `get_struct` / `list_tree` / `list_registry_key` unless you need raw hash access." +Without it an LLM reaches for the low-level tool it encountered first. + +### New + +| Tool | Signature | Resolution chain (hops) | +|---|---|---| +| `list_tree` | `(ref, path, limit?, cursor?)` | resolveRef, traversePath, `child_trees`/`child_blobsConnection` (3) | +| `list_registry_key` | `(ref, hive, key_path, limit?, cursor?)` | resolveRef, traversePath(hive file), winreg root, traversePath(key), `child_keys`/`child_valuesConnection` (5) | +| `get_struct` | `(ref, blob_path, struct_name)` | resolveRef, traversePath, structByName, `fieldsConnection` (4) | +| `list_structs` | `(ref, blob_path, name?, limit?, cursor?)` | resolveRef, traversePath, `has_structConnection` (3) | +| `list_symbols` | `(ref, blob_path, name?, limit?, cursor?)` | resolveRef, traversePath, `has_symbolConnection` (3) | +| `git_log` | `(path, entity_type, commit_range, limit?, offset?, status_filter?, order?)` | 1:1 with `gitLog` (1) | +| `get_commit_capabilities` | `(ref)` | 1:1 with `getCommitExtractedDataLabels` (1) | + +Notes: + +- **`get_struct` is the highest-value addition.** Reading a struct today requires calling + `diff_nodes` with the same hash on both sides plus `status_filter: ["UNCHANGED"]`, abusing + a diff tool to perform a read. +- **`git_log` closes the largest capability gap.** "When did this entity last change, and + across which update" is the question OSWatcher exists to answer, and the MCP currently + cannot ask it. +- **`hive` is an enum**, `SAM | SECURITY | SOFTWARE | SYSTEM | DEFAULT`, mapped internally to + `/Windows/System32/config/*`. An LLM knows `HKLM\SOFTWARE`; requiring it to know the + on-disk hive location is a memorisation tax. +- **By-name lookups are merged into the list tools.** The frontend has separate + `FetchSymbolByName` / `FetchStructByName` queries, but `list_symbols(ref, blob_path, + name?)` with optional exact-match edge filtering (`where: { edge: { name: $name } }`) + covers both cases in one tool. +- `list_commits` is retained alongside `git_log`. They answer different questions: which + snapshots exist, versus what changed at a path. + +All task-shaped tools take `ref` (branch name or 40-character commit hash) as their first +argument and absolute paths beginning with `/`. That uniformity is what lets an LLM +generalise from one tool to the next. + +### Composite cursors for two-connection tools + +`list_tree` and `list_registry_key` each paginate two connections at once +(`child_trees` + `child_blobs`, and `child_keys` + `child_values`), but the D4 envelope +exposes a single `next_cursor`. Resolution: `limit` applies **per connection**, and +`pagination.ts` encodes both underlying `endCursor` values into one opaque composite cursor +that the LLM passes back unchanged. `has_more` is the OR of the two `hasNextPage` flags. A +connection that is already exhausted is simply not requested on the next page. + +Response shapes stay structured rather than flattened, because the distinction matters to +the caller: + +``` +list_tree -> { directories: [{name, hash}], files: [{name, hash}], has_more, next_cursor } +list_registry_key -> { subkeys: [{name, hash}], values: [{name, type, value}], has_more, next_cursor } +``` + +The read query shapes are all proven by the frontend's `src/queries.ts` +(`~/Projets/frontend`), including connection cursor pagination (`first`/`after`, +`pageInfo.endCursor`, `totalCount`) and edge-name filtering. + +## Architecture + +### Module layout + +`mcp/src/server.ts` is 545 lines for 10 tools, of which roughly 340 are a copy-pasted +try/catch and `JSON.stringify` envelope repeated per handler. At 17 tools that becomes ~580 +lines of duplication. + +Restructure: + +- Each `mcp/src/tools/*.ts` exports `{ name, description, schema, handler }`, co-locating the + long tool descriptions with the code they describe. +- `mcp/src/server.ts` becomes a manifest that iterates the tool modules and applies the + content/error envelope once. Target: under 100 lines. +- **New** `mcp/src/resolve.ts`: `resolveRef`, `resolveTreeHash(ref, path)`, + `resolveBlobHash(ref, path)`, `resolveHiveRoot(ref, hive)`. This is where D2's multi-hop + chains live, used by five or more tools. `tools/resolve-ref.ts` moves here; it was never a + registered tool, only an internal helper in the wrong directory. +- **New** `mcp/src/pagination.ts`: the D4 envelope. Normalises connection `pageInfo`, + `gitLog` offsets and search sessions into one shape. + +### Client simplification + +`mcp/src/graphql/client.ts` forwards the incoming `Authorization` header to the GraphQL API. +Against an unauthenticated API this is dead weight: drop it, and hoist SDK construction to +module scope since it becomes request-invariant. `createServer(sdk)` stays per-request, +because an `McpServer` binds to a single transport on `connect`. + +## Rebase plan + +**Before anything: `git push -u gitlab feat/mcp-server`.** The branch exists only on one +laptop. + +Rebase onto `origin/master` and collapse the 10 commits into three. They were never pushed, +so the history is free to rewrite, and replaying them as-is preserves fixups of bugs nobody +ever saw (`Fix MCP build:`, `Fix MCP recursive diff returning 0 results`) alongside an auth +model that no longer exists. + +1. `feat: add paginated search sessions`, the graphql-api side +2. `feat: add MCP server exposing OS intelligence to AI agents`, the `mcp/` subproject +3. `docs: document diff system semantics and MCP constraints` + +### Conflicts and resolutions + +| File | Conflict | Resolution | +|---|---|---| +| `src/resolvers.ts` | gates `include_updates` on `context.jwt`, which no longer exists | Delete the gate (D3). Signature becomes `(_source, args)`, dropping the unused `context` param to match every other resolver on master | +| `src/index.ts` | branch context lines still import `createAuth0JwtVerifier` and `extractTokenFromConnectionParams` from the deleted `src/auth/`; branch also adds session env vars | Take master's import block wholesale, add only the `search-session.js` import. Re-apply `MAX_SEARCH_SESSIONS` and `SEARCH_SESSION_TTL_MS` into master's rewritten `cleanEnv` block. Keep the `drainServer` cleanup hook | +| `CLAUDE.md` | branch appends an MCP section to a file master rewrote to drop Auth0 | Take master's, re-add a corrected MCP section | +| `type-defs.graphql`, `src/validation.ts`, `tsconfig.json`, `.dockerignore` | additive | apply clean | + +### Now-wrong code that is not a conflict + +- `docs/explanation/diff-system.md`: the "Auth Requirements" section claims recursive diffs + require authentication. False on master. Rewrite it. The `filter` and `max_depth=1` + gotchas stay: those are Java procedure behaviour, not auth. +- `mcp/CLAUDE.md` section: says 8 tools (there are 10), documents auth forwarding, describes + the Auth0 architecture. Rewritten as part of the docs work. +- Regenerate `mcp/src/graphql/generated/sdk.ts` via `npm run generate` against post-rebase + `type-defs.graphql` and confirm the diff is a no-op. + +## Testing + +### Layer 1: unit (jest + nock) + +Extends the existing `mcp/tests/*.test.ts` pattern. One test file per new tool, plus +dedicated files for `resolve.ts` and `pagination.ts`, which carry the multi-hop logic and are +therefore where bugs will live. + +Two tests assert the **outgoing request body**, which is the honest use of a mock: + +- filesystem diffs send `filter: ["Tree", "Blob"]` +- struct and symbol diff paths send `max_depth: 1` + +### Layer 2: live end-to-end + +`docker compose up -d` in oswatcher-hub auto-seeds the corpus since PR #123 merged +(2.4 GB dump, 6,960,880 nodes, 41,413,801 relationships). Bring the stack up with the rebased +`mcp` service, attach with: + +``` +claude mcp add --transport http oswatcher http://localhost:3001/mcp +``` + +then drive the acceptance scenarios below, recording for each: the tool calls made, the +round-trip count, **whether the LLM picked the right tool unaided**, and result sanity. That +third column is the real test of the tool naming and description work. + +Results are recorded in `docs/reference/mcp-validation-0.1.md`. + +## Acceptance criteria + +| # | Scenario | Exercises | +|---|---|---| +| 1 | What OS versions are tracked? | `list_branches` | +| 2 | What is in `/Windows/System32/drivers`? | `list_tree` | +| 3 | Show `_EPROCESS` in `ntoskrnl.exe` | `get_struct`, expect ~261 fields | +| 4 | How did `_EPROCESS` change 24h2 to 25h2? | `diff_nodes` with `max_depth: 1` | +| 5 | What is under `HKLM\SOFTWARE\...\Run`? | `list_registry_key` | +| 6 | Registry diff across versions | `traverse_path`, `get_winreg_root`, `diff_nodes` | +| 7 | Address of `NtCreateFile` in `ntdll.dll` | `list_symbols(name=...)` | +| 8 | When did `ntdll.dll` change? | `git_log` | +| 9 | Search "Defender", page through results | `search`, `search_next` | +| 10 | Filesystem diff at `/` between two commits | `diff_versions` | + +**Scenarios 3, 4 and 10 must assert non-empty results, not merely absence of an exception.** +Both bugs that already bit this branch fail by returning a plausible empty list: the empty +`filter` silently drops Blob leaf nodes, and a missing `max_depth: 1` makes Struct diffs +return nothing. A test checking only for absence of errors passes against both. This is +precisely why mocked tests alone cannot validate 0.1. + +**0.1 is done when:** the branch is rebased and merged, 17 tools are registered, unit tests +pass including the two gotcha regressions, and all 10 scenarios have been run live against +the seeded corpus with results recorded. + +## Delivery sequence + +### Step 0: two probes + +1. `git push -u gitlab feat/mcp-server`, so the rebase has a recoverable point. +2. Bring the seeded corpus up and verify it contains PDB data: run `getBlobsWithSymbols` on a + branch and confirm `_EPROCESS` resolves. Scenarios 3, 4 and 7, a third of the acceptance + list and the entire justification for `get_struct`, depend on symbol and struct data being + present in the dump. If it is filesystem-and-registry only, the tool priorities change, + and that must be known before the tools are written. + +### graphql-api (gitlab): four PRs + +1. **Rebase onto master.** Three collapsed commits, no new tools. Shippable alone: it answers + "do the existing 10 tools still work with auth gone?" without new-feature noise. +2. **Refactor.** Tool manifest, `resolve.ts`, `pagination.ts`. No behaviour change; the + existing suite is the proof. Kept separate from PR 3 because a refactor tangled with new + features cannot be reviewed as a refactor. +3. **The 7 new tools**, their tests, and docs. +4. **Validation.** The scenario run, `docs/reference/mcp-validation-0.1.md`, and whatever + fixes the live run surfaces. + +### oswatcher-hub (github): one PR + +Rebase `wip/mcp-server` (1 commit) onto master, which has moved by one (the db-seed merge), +and rename the branch `feat/mcp-server`. Un-WIP only after graphql-api PR 1 lands, since that +is when `../graphql-api/mcp/` exists. + +The compose service builds from a **sibling checkout** (`context: ../graphql-api`), so +`graphql-api` and `oswatcher-hub` must be adjacent on disk. Acceptable for development, but +it means the MCP cannot be run without a source checkout. A published image is a 0.2 concern. + +### Documentation + +- `graphql-api/CLAUDE.md`: rewrite the MCP section (17 tools, no auth forwarding, the new + module layout), keeping the procedure gotchas. +- `graphql-api/docs/explanation/diff-system.md`: rewrite "Auth Requirements". +- **New** `graphql-api/mcp/README.md`: how to run, how to attach to Claude Code, the tool + table. There is none today. +- `oswatcher-hub/docs/architecture.md`: add the `mcp` service to the service table. + +## Risks + +| Risk | Mitigation | +|---|---| +| The seeded corpus may lack PDB/struct data, invalidating scenarios 3, 4 and 7 | Step 0 probe, before any tool is written | +| The corpus dump is a Dropbox link throttled at roughly 20 GB/day (about 8 downloads) | Seed once and snapshot the volume rather than recreating it per test run | +| `@modelcontextprotocol/sdk ^1.12.1` and `node:25-alpine3.22` both date from March 2026 | Version check during the rebase, not mid-validation | +| 17 tools with partially overlapping semantics create tool-choice noise | The escape-hatch pointer lines, plus the "picked the right tool unaided" column in the validation run | + +## Open questions for 0.2 + +- Blob download and file contents, including the Winbindex thread referenced in oswatcher-hub + PR #123. +- Whether search sessions should move to a shared store, or whether search should be + reshaped to avoid server-side state entirely. +- A published MCP image, so the server can run without sibling source checkouts. diff --git a/mcp/.gitignore b/mcp/.gitignore new file mode 100644 index 0000000..6435f7a --- /dev/null +++ b/mcp/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +dist/ +src/graphql/generated/* +!src/graphql/generated/sdk.ts diff --git a/mcp/Dockerfile b/mcp/Dockerfile new file mode 100644 index 0000000..a468338 --- /dev/null +++ b/mcp/Dockerfile @@ -0,0 +1,16 @@ +FROM node:25-alpine3.22 + +WORKDIR /app + +# Build context is graphql-api/ root, so mcp files are under mcp/ +COPY mcp/package*.json ./ + +RUN npm install + +COPY mcp/ . + +RUN npm run build + +EXPOSE 3001 + +CMD ["npm", "start"] diff --git a/mcp/README.md b/mcp/README.md new file mode 100644 index 0000000..c2151a9 --- /dev/null +++ b/mcp/README.md @@ -0,0 +1,73 @@ +# OSWatcher MCP Server + +An MCP (Model Context Protocol) server that exposes OSWatcher's OS intelligence graph to AI assistants as a set of tools. It sits in front of the `api` GraphQL service and lets an assistant answer questions like "what changed in `ntdll.dll` between these two Windows builds" or "what is the field layout of `_EPROCESS` in this snapshot" without the assistant having to know Cypher or the underlying graph schema. + +It is a separate Docker service from `api` (this directory has its own `Dockerfile`, `package.json`, `tsconfig.json` and codegen; the root `tsconfig.json` excludes it), and it talks to the API over plain GraphQL. It carries no authentication of its own: the API it calls is unauthenticated, and access control is expected to sit in front of whatever exposes the MCP server's HTTP endpoint. + +## How it works + +Each tool call resolves a small chain of GraphQL queries against the graph and returns a plain JSON result over MCP. `src/resolve.ts` does that resolution client-side (branch or commit ref to filesystem hash, path to node hash, and so on), the same way the OSWatcher frontend composes queries with its own Apollo cache. 0.1 adds no resolvers to the API beyond paginated search: the API stays a stable, open-source artifact with two consumers (the frontend and this server), and the extra GraphQL round trips are cheap because both services sit in the same compose network. + +## Running it + +The server is meant to run as the `mcp` service in the OSWatcher compose stack (`compose.dev.yml`), on port 3001, built with `context: ../graphql-api`. That means this repository (`graphql-api`) and the compose stack's repository must be checked out as sibling directories on disk. + +Because `mcp` is a separate service from `api`, rebuilding `api` does not rebuild it. After changing anything under `mcp/`, rebuild explicitly: + +```bash +docker compose -f compose.yml -f compose.dev.yml up --build mcp -d +``` + +The server reads `GRAPHQL_API_URL` for the GraphQL endpoint to call (`http://api:4000/graphql` inside the compose network) and `MCP_PORT` for the port it listens on (defaults to 3001). It exposes `POST /mcp` for the MCP protocol itself and `GET /health` for a plain liveness check. + +## Attaching it to Claude Code + +Once the `mcp` service is up and reachable at `http://localhost:3001`, register it as an HTTP MCP server: + +```bash +claude mcp add --transport http oswatcher http://localhost:3001/mcp +``` + +## Tools (17 total) + +Task-shaped tools take `(ref, path, ...)` and resolve the chain internally. The hash-based tools are retained as an escape hatch for entity combinations the task-shaped ones do not reach. + +| Tool | Description | +|------|-------------| +| `list_branches` | List OS branches with optional name filter | +| `list_commits` | List commits on a branch | +| `get_commit_capabilities` | Which data kinds were extracted for a snapshot | +| `list_tree` | List a directory's subdirectories and files | +| `list_registry_key` | List a registry key's subkeys and values, by hive name | +| `get_struct` | A struct's full field layout, by name | +| `list_structs` | Structs a PE file defines, optionally by name | +| `list_symbols` | Symbols a PE file exports, optionally by name | +| `git_log` | How one entity changed across commit history | +| `diff_versions` | Filesystem diff between two refs at a path | +| `search` | Substring search across filesystem/registry/symbols/structs | +| `search_next` | Next page of a search session | +| `search_close` | End a search session early | +| `traverse_path` | Raw: walk the filesystem from a ref to a path | +| `get_winreg_root` | Raw: follow `HAS_WINREG` from a Blob hash | +| `get_blobs_with_symbols` | Raw: PE blobs that carry PDB data | +| `diff_nodes` | Raw: diff on node hashes, any entity type | + +Every paginated tool returns the same `{ items, has_more, next_cursor }` envelope (or, for the two-connection tools `list_tree` and `list_registry_key`, the same shape but with `directories`/`files` or `subkeys`/`values` in place of `items`), regardless of whether the underlying mechanism is a Neo4j connection cursor, `git_log`'s offset, or a `search` session ID. Pass `next_cursor` back as the tool's `cursor` (or `offset`, for `git_log`) unchanged to get the next page. + +## Regenerating the SDK + +The typed GraphQL client at `src/graphql/generated/sdk.ts` is generated from `src/graphql/queries.graphql` against the API's live schema: + +```bash +npm run generate +``` + +This reads the schema from a **running** API on `http://localhost:4000/graphql` (see `codegen.yml`), so start the `api` service before running it. Regenerate after adding or changing any query in `queries.graphql`. + +Other useful scripts (see `package.json`): `npm run build` (compiles with `tsc`), `npm test` (Jest), `npm start` (runs the built server from `dist/`). + +## Constraints + +**Search sessions are process-local.** `src/search-session.ts` holds open search sessions in an in-memory `Map`, so the API cannot be horizontally scaled while sessions are in use. This does not affect `mcp` itself scaling, only the `api` service it depends on for `search`/`search_next`/`search_close`. + +**0.1 requires a source checkout.** No image is published for this service yet: it is built locally from this repository via the `Dockerfile` in this directory, as part of the sibling-checkout compose setup described above. There is no way to pull and run it standalone today. diff --git a/mcp/codegen.yml b/mcp/codegen.yml new file mode 100644 index 0000000..13db074 --- /dev/null +++ b/mcp/codegen.yml @@ -0,0 +1,10 @@ +schema: http://localhost:4000/graphql +documents: "src/graphql/queries.graphql" +generates: + src/graphql/generated/sdk.ts: + plugins: + - "typescript" + - "typescript-operations" + - "typescript-generic-sdk" + config: + documentMode: documentNode diff --git a/mcp/jest.config.ts b/mcp/jest.config.ts new file mode 100644 index 0000000..b04b471 --- /dev/null +++ b/mcp/jest.config.ts @@ -0,0 +1,16 @@ +export default { + testEnvironment: "node", + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { + useESM: true, + }, + ], + }, + extensionsToTreatAsEsm: [".ts"], + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, + testPathIgnorePatterns: ["/dist/"], +}; diff --git a/mcp/package-lock.json b/mcp/package-lock.json new file mode 100644 index 0000000..3e4d84b --- /dev/null +++ b/mcp/package-lock.json @@ -0,0 +1,11763 @@ +{ + "name": "oswatcher-mcp-server", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "oswatcher-mcp-server", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.12.1", + "express": "^5.1.0", + "graphql": "16.11.0", + "zod": "^3.24.0" + }, + "devDependencies": { + "@graphql-codegen/cli": "^5.0.3", + "@graphql-codegen/typescript": "^4.1.0", + "@graphql-codegen/typescript-generic-sdk": "^4.0.1", + "@graphql-codegen/typescript-operations": "^4.3.0", + "@types/express": "^5.0.3", + "@types/jest": "30.0.0", + "jest": "30.1.3", + "nock": "^14.0.5", + "prettier": "3.6.2", + "ts-jest": "29.4.1", + "typescript": "5.9.2" + }, + "engines": { + "node": ">= 25.0.0" + } + }, + "node_modules/@ardatan/relay-compiler": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-13.0.0.tgz", + "integrity": "sha512-ite4+xng5McO8MflWCi0un0YmnorTujsDnfPfhzYzAgoJ+jkI1pZj6jtmTl8Jptyi1H+Pa0zlatJIsxDD++ETA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10", + "immutable": "^5.1.5", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.28.6.tgz", + "integrity": "sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@envelop/core": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.5.1.tgz", + "integrity": "sha512-3DQg8sFskDo386TkL5j12jyRAdip/8yzK3x7YGbZBgobZ4aKXrvDU0GppU0SnmrpQnNaiTUsxBs9LKkwQ/eyvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/instrumentation": "^1.0.0", + "@envelop/types": "^5.2.1", + "@whatwg-node/promise-helpers": "^1.2.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/instrumentation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@envelop/instrumentation/-/instrumentation-1.0.0.tgz", + "integrity": "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/types": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@envelop/types/-/types-5.2.1.tgz", + "integrity": "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", + "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@graphql-codegen/add": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.3.tgz", + "integrity": "sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/add/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/cli": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-5.0.7.tgz", + "integrity": "sha512-h/sxYvSaWtxZxo8GtaA8SvcHTyViaaPd7dweF/hmRDpaQU1o3iU3EZxlcJ+oLTunU0tSMFsnrIXm/mhXxI11Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/client-preset": "^4.8.2", + "@graphql-codegen/core": "^4.0.2", + "@graphql-codegen/plugin-helpers": "^5.1.1", + "@graphql-tools/apollo-engine-loader": "^8.0.0", + "@graphql-tools/code-file-loader": "^8.0.0", + "@graphql-tools/git-loader": "^8.0.0", + "@graphql-tools/github-loader": "^8.0.0", + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.1.0", + "@graphql-tools/prisma-loader": "^8.0.0", + "@graphql-tools/url-loader": "^8.0.0", + "@graphql-tools/utils": "^10.0.0", + "@whatwg-node/fetch": "^0.10.0", + "chalk": "^4.1.0", + "cosmiconfig": "^8.1.3", + "debounce": "^1.2.0", + "detect-indent": "^6.0.0", + "graphql-config": "^5.1.1", + "inquirer": "^8.0.0", + "is-glob": "^4.0.1", + "jiti": "^1.17.1", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^4.0.5", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^2.2.3", + "tslib": "^2.4.0", + "yaml": "^2.3.1", + "yargs": "^17.0.0" + }, + "bin": { + "gql-gen": "cjs/bin.js", + "graphql-code-generator": "cjs/bin.js", + "graphql-codegen": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/client-preset": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-4.8.3.tgz", + "integrity": "sha512-QpEsPSO9fnRxA6Z66AmBuGcwHjZ6dYSxYo5ycMlYgSPzAbyG8gn/kWljofjJfWqSY+T/lRn+r8IXTH14ml24vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7", + "@graphql-codegen/add": "^5.0.3", + "@graphql-codegen/gql-tag-operations": "4.0.17", + "@graphql-codegen/plugin-helpers": "^5.1.1", + "@graphql-codegen/typed-document-node": "^5.1.2", + "@graphql-codegen/typescript": "^4.1.6", + "@graphql-codegen/typescript-operations": "^4.6.1", + "@graphql-codegen/visitor-plugin-common": "^5.8.0", + "@graphql-tools/documents": "^1.0.0", + "@graphql-tools/utils": "^10.0.0", + "@graphql-typed-document-node/core": "3.2.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/client-preset/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-4.0.2.tgz", + "integrity": "sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/core/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/gql-tag-operations": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.17.tgz", + "integrity": "sha512-2pnvPdIG6W9OuxkrEZ6hvZd142+O3B13lvhrZ48yyEBh2ujtmKokw0eTwDHtlXUqjVS0I3q7+HB2y12G/m69CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/gql-tag-operations/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/plugin-helpers": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.1.1.tgz", + "integrity": "sha512-28GHODK2HY1NhdyRcPP3sCz0Kqxyfiz7boIZ8qIxFYmpLYnlDgiYok5fhFLVSZihyOpCs4Fa37gVHf/Q4I2FEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^10.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/plugin-helpers/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/schema-ast": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.1.0.tgz", + "integrity": "sha512-kZVn0z+th9SvqxfKYgztA6PM7mhnSZaj4fiuBWvMTqA+QqQ9BBed6Pz41KuD/jr0gJtnlr2A4++/0VlpVbCTmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/schema-ast/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/typed-document-node": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-5.1.2.tgz", + "integrity": "sha512-jaxfViDqFRbNQmfKwUY8hDyjnLTw2Z7DhGutxoOiiAI0gE/LfPe0LYaVFKVmVOOD7M3bWxoWfu4slrkbWbUbEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typed-document-node/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/typescript": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-4.1.6.tgz", + "integrity": "sha512-vpw3sfwf9A7S+kIUjyFxuvrywGxd4lmwmyYnnDVjVE4kSQ6Td3DpqaPTy8aNQ6O96vFoi/bxbZS2BW49PwSUUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/schema-ast": "^4.0.2", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-generic-sdk/-/typescript-generic-sdk-4.1.0.tgz", + "integrity": "sha512-e2YYHr+tEglPwQDnpvp7USpPfwHC+ZMFiH5uDI4LygbLm0SIwh4vjwG8dt9eTkB+T20lgVQUy9EXaTzgTBiR9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^3.0.0", + "@graphql-codegen/visitor-plugin-common": "2.13.8", + "auto-bind": "~4.0.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-tag": "^2.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/@ardatan/relay-compiler": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz", + "integrity": "sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.14.0", + "@babel/generator": "^7.14.0", + "@babel/parser": "^7.14.0", + "@babel/runtime": "^7.0.0", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.0.0", + "babel-preset-fbjs": "^3.4.0", + "chalk": "^4.0.0", + "fb-watchman": "^2.0.0", + "fbjs": "^3.0.0", + "glob": "^7.1.1", + "immutable": "~3.7.6", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "relay-runtime": "12.0.0", + "signedsource": "^1.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "relay-compiler": "bin/relay-compiler" + }, + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/@graphql-codegen/plugin-helpers": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-3.1.2.tgz", + "integrity": "sha512-emOQiHyIliVOIjKVKdsI5MXj312zmRDwmHpyUTZMjfpvxq/UVAHUJIVdVf+lnjjrI+LXBTgMlTWTgHQfmICxjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^9.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.4.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/@graphql-codegen/plugin-helpers/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "2.13.8", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-2.13.8.tgz", + "integrity": "sha512-IQWu99YV4wt8hGxIbBQPtqRuaWZhkQRG2IZKbMoSvh0vGeWb3dB0n0hSgKaOOxDY+tljtOf9MTcUYvJslQucMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^3.1.2", + "@graphql-tools/optimize": "^1.3.0", + "@graphql-tools/relay-operation-optimizer": "^6.5.0", + "@graphql-tools/utils": "^9.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.4.0" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/@graphql-codegen/visitor-plugin-common/node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/@graphql-tools/optimize": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-1.4.0.tgz", + "integrity": "sha512-dJs/2XvZp+wgHH8T5J2TqptT9/6uVzIYvA6uFACha+ufvdMBedkfR4b4GbT8jAKLRARiqRTxy3dctnwkTM2tdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "6.5.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.5.18.tgz", + "integrity": "sha512-mc5VPyTeV+LwiM+DNvoDQfPqwQYhPV/cl5jOBjTgSniyaq8/86aODfMkrE2OduhQ5E00hqrkuL2Fdrgk0w1QJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ardatan/relay-compiler": "12.0.0", + "@graphql-tools/utils": "^9.2.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/typescript-generic-sdk/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@graphql-codegen/typescript-operations": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-4.6.1.tgz", + "integrity": "sha512-k92laxhih7s0WZ8j5WMIbgKwhe64C0As6x+PdcvgZFMudDJ7rPJ/hFqJ9DCRxNjXoHmSjnr6VUuQZq4lT1RzCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/typescript": "^4.1.6", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/typescript-operations/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/typescript/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.8.0.tgz", + "integrity": "sha512-lC1E1Kmuzi3WZUlYlqB4fP6+CvbKH9J+haU1iWmgsBx5/sO2ROeXJG4Dmt8gP03bI2BwjiwV5WxCEMlyeuzLnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.0.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.6.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@graphql-codegen/visitor-plugin-common/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-hive/signal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-1.0.0.tgz", + "integrity": "sha512-RiwLMc89lTjvyLEivZ/qxAC5nBHoS2CtsWFSOsN35sxG9zoo5Z+JsFHM8MlvmO9yt+MJNIyC5MLE1rsbOphlag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader": { + "version": "8.0.28", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.28.tgz", + "integrity": "sha512-MzgDrUuoxp6dZeo54zLBL3cEJKJtM3N/2RqK0rbPxPq5X2z6TUA7EGg8vIFTUkt5xelAsUrm8/4ai41ZDdxOng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/fetch": "^0.10.13", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/batch-execute": { + "version": "9.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.19.tgz", + "integrity": "sha512-VGamgY4PLzSx48IHPoblRw0oTaBa7S26RpZXt0Y4NN90ytoE0LutlpB2484RbkfcTjv9wa64QD474+YP1kEgGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^10.9.1", + "@whatwg-node/promise-helpers": "^1.3.0", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader": { + "version": "8.1.28", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.28.tgz", + "integrity": "sha512-BL3Ft/PFlXDE5nNuqA36hYci7Cx+8bDrPDc8X3VSpZy9iKFBY+oQ+IwqnEHCkt8OSp2n2V0gqTg4u3fcQP1Kwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.27", + "@graphql-tools/utils": "^11.0.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/delegate": { + "version": "10.2.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.2.23.tgz", + "integrity": "sha512-xrPtl7f1LxS+B6o+W7ueuQh67CwRkfl+UKJncaslnqYdkxKmNBB4wnzVcW8ZsRdwbsla/v43PtwAvSlzxCzq2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/batch-execute": "^9.0.19", + "@graphql-tools/executor": "^1.4.9", + "@graphql-tools/schema": "^10.0.25", + "@graphql-tools/utils": "^10.9.1", + "@repeaterjs/repeater": "^3.0.6", + "@whatwg-node/promise-helpers": "^1.3.0", + "dataloader": "^2.2.3", + "dset": "^3.1.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/documents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.1.tgz", + "integrity": "sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.1.tgz", + "integrity": "sha512-n94Qcu875Mji9GQ52n5UbgOTxlgvFJicBPYD+FRks9HKIQpdNPjkkrKZUYNG51XKa+bf03rxNflm4+wXhoHHrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@graphql-typed-document-node/core": "^3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-common": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.4.tgz", + "integrity": "sha512-SEH/OWR+sHbknqZyROCFHcRrbZeUAyjCsgpVWCRjqjqRbiJiXq6TxNIIOmpXgkrXWW/2Ev4Wms6YSGJXjdCs6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/core": "^5.2.3", + "@graphql-tools/utils": "^10.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-2.0.7.tgz", + "integrity": "sha512-J27za7sKF6RjhmvSOwOQFeNhNHyP4f4niqPnerJmq73OtLx9Y2PGOhkXOEB0PjhvPJceuttkD2O1yMgEkTGs3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-common": "^0.0.6", + "@graphql-tools/utils": "^10.9.1", + "@whatwg-node/disposablestack": "^0.0.6", + "graphql-ws": "^6.0.6", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.8.1", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws/node_modules/@graphql-tools/executor-common": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.6.tgz", + "integrity": "sha512-JAH/R1zf77CSkpYATIJw+eOJwsbWocdDjY+avY7G+P5HCXxwQjAjWVkJI1QJBQYjPQDVxwf1fmTZlIN3VOadow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/core": "^5.3.0", + "@graphql-tools/utils": "^10.9.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-http": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.3.3.tgz", + "integrity": "sha512-LIy+l08/Ivl8f8sMiHW2ebyck59JzyzO/yF9SFS4NH6MJZUezA1xThUXCDIKhHiD56h/gPojbkpcFvM2CbNE7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-hive/signal": "^1.0.0", + "@graphql-tools/executor-common": "^0.0.4", + "@graphql-tools/utils": "^10.8.1", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.4", + "@whatwg-node/promise-helpers": "^1.3.0", + "meros": "^1.2.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.1.25", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.25.tgz", + "integrity": "sha512-6uf4AEXO0QMxJ7AWKVPqEZXgYBJaiz5vf29X0boG8QtcqWy8mqkXKWLND2Swdx0SbEx0efoGFcjuKufUcB0ASQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@types/ws": "^8.0.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.19.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader": { + "version": "8.0.32", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.32.tgz", + "integrity": "sha512-H5HTp2vevv0rRMEnCJBVmVF8md3LpJI1C1+d6OtzvmuONJ8mOX2mkf9rtoqwiztynVegaDUekvMFsc9k5iE2WA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.27", + "@graphql-tools/utils": "^11.0.0", + "is-glob": "4.0.3", + "micromatch": "^4.0.8", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader": { + "version": "8.0.22", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-8.0.22.tgz", + "integrity": "sha512-uQ4JNcNPsyMkTIgzeSbsoT9hogLjYrZooLUYd173l5eUGUi49EAcsGdiBCKaKfEjanv410FE8hjaHr7fjSRkJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-http": "^1.1.9", + "@graphql-tools/graphql-tag-pluck": "^8.3.21", + "@graphql-tools/utils": "^10.9.1", + "@whatwg-node/fetch": "^0.10.0", + "@whatwg-node/promise-helpers": "^1.0.0", + "sync-fetch": "0.6.0-2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/sync-fetch": { + "version": "0.6.0-2", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0-2.tgz", + "integrity": "sha512-c7AfkZ9udatCuAy9RSfiGPpeOKKUAUK5e1cXadLOGUjasdxqYqAK0jTNkM/FSEyJ3a5Ra27j/tw/PS0qLmaF/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^3.3.2", + "timeout-signal": "^2.0.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "8.1.12", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.12.tgz", + "integrity": "sha512-Nma7gBgJoUbqXWTmdHjouo36tjzewA8MptVcHoH7widzkciaUVzBhriHzqICFB/dVxig//g9MX8s1XawZo7UAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/import": "^7.1.12", + "@graphql-tools/utils": "^11.0.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.27", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.27.tgz", + "integrity": "sha512-CJ0WVXhGYsfFngpRrAAcjRHyxSDHx4dEz2W15bkwvt9he/AWhuyXm07wuGcoLrl0q0iQp1BiRjU7D8SxWZo3JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "@graphql-tools/utils": "^11.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.12.tgz", + "integrity": "sha512-QSsdPsdJ7yCgQ5XODyKYpC7NlB9R1Koi0R3418PT7GiRm+9O8gYXSs/23dumcOnpiLrnf4qR2aytBn1+JOAhnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader": { + "version": "8.0.26", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.26.tgz", + "integrity": "sha512-kwy9IFi5QtXXTLBgWkvA1RqsZeJDn0CxsTbhNlziCzmga9fNo7qtZ18k9FYIq3EIoQQlok+b7W7yeyJATA2xhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load": { + "version": "8.1.8", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.8.tgz", + "integrity": "sha512-gxO662b64qZSToK3N6XUxWG5E6HOUjlg5jEnmGvD4bMtGJ0HwEe/BaVZbBQemCfLkxYjwRIBiVfOY9o0JyjZJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/schema": "^10.0.31", + "@graphql-tools/utils": "^11.0.0", + "p-limit": "3.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.1.7.tgz", + "integrity": "sha512-Y5E1vTbTabvcXbkakdFUt4zUIzB1fyaEnVmIWN0l0GMed2gdD01TpZWLUm4RNAxpturvolrb24oGLQrBbPLSoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/optimize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", + "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/prisma-loader": { + "version": "8.0.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-8.0.17.tgz", + "integrity": "sha512-fnuTLeQhqRbA156pAyzJYN0KxCjKYRU5bz1q/SKOwElSnAU4k7/G1kyVsWLh7fneY78LoMNH5n+KlFV8iQlnyg==", + "deprecated": "This package was intended to be used with an older versions of Prisma.\\nThe newer versions of Prisma has a different approach to GraphQL integration.\\nTherefore, this package is no longer needed and has been deprecated and removed.\\nLearn more: https://www.prisma.io/graphql", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/url-loader": "^8.0.15", + "@graphql-tools/utils": "^10.5.6", + "@types/js-yaml": "^4.0.0", + "@whatwg-node/fetch": "^0.10.0", + "chalk": "^4.1.0", + "debug": "^4.3.1", + "dotenv": "^16.0.0", + "graphql-request": "^6.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "jose": "^5.0.0", + "js-yaml": "^4.0.0", + "lodash": "^4.17.20", + "scuid": "^1.1.0", + "tslib": "^2.4.0", + "yaml-ast-parser": "^0.0.43" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.1.1.tgz", + "integrity": "sha512-va+ZieMlz6Fj18xUbwyQkZ34PsnzIdPT6Ccy1BNOQw1iclQwk52HejLMZeE/4fH+4cu80Q2HXi5+FjCKpmnJCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ardatan/relay-compiler": "^13.0.0", + "@graphql-tools/utils": "^11.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/relay-operation-optimizer/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "10.0.31", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.31.tgz", + "integrity": "sha512-ZewRgWhXef6weZ0WiP7/MV47HXiuFbFpiDUVLQl6mgXsWSsGELKFxQsyUCBos60Qqy1JEFAIu3Ns6GGYjGkqkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/merge": "^9.1.7", + "@graphql-tools/utils": "^11.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader": { + "version": "8.0.33", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.33.tgz", + "integrity": "sha512-Fu626qcNHcqAj8uYd7QRarcJn5XZ863kmxsg1sm0fyjyfBJnsvC7ddFt6Hayz5kxVKfsnjxiDfPMXanvsQVBKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-graphql-ws": "^2.0.1", + "@graphql-tools/executor-http": "^1.1.9", + "@graphql-tools/executor-legacy-ws": "^1.1.19", + "@graphql-tools/utils": "^10.9.1", + "@graphql-tools/wrap": "^10.0.16", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.10.0", + "@whatwg-node/promise-helpers": "^1.0.0", + "isomorphic-ws": "^5.0.0", + "sync-fetch": "0.6.0-2", + "tslib": "^2.4.0", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@graphql-tools/url-loader/node_modules/sync-fetch": { + "version": "0.6.0-2", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0-2.tgz", + "integrity": "sha512-c7AfkZ9udatCuAy9RSfiGPpeOKKUAUK5e1cXadLOGUjasdxqYqAK0jTNkM/FSEyJ3a5Ra27j/tw/PS0qLmaF/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^3.3.2", + "timeout-signal": "^2.0.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@graphql-tools/utils": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.11.0.tgz", + "integrity": "sha512-iBFR9GXIs0gCD+yc3hoNswViL1O5josI33dUqiNStFI/MHLCEPduasceAcazRH77YONKNiviHBV8f7OgcT4o2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/wrap": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.1.4.tgz", + "integrity": "sha512-7pyNKqXProRjlSdqOtrbnFRMQAVamCmEREilOXtZujxY6kYit3tvWWSjUrcIOheltTffoRh7EQSjpy2JDCzasg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/delegate": "^10.2.23", + "@graphql-tools/schema": "^10.0.25", + "@graphql-tools/utils": "^10.9.1", + "@whatwg-node/promise-helpers": "^1.3.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.12", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.12.tgz", + "integrity": "sha512-txsUW4SQ1iilgE0l9/e9VQWmELXifEFvmdA1j6WFh/aFPj99hIntrSsq/if0UWyGVkmrRPKA1wCeP+UCr1B9Uw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.1.2.tgz", + "integrity": "sha512-BGMAxj8VRmoD0MoA/jo9alMXSRoqW8KPeqOfEo1ncxnRLatTBCpRoOwlwlEMdudp68Q6WSGwYrrLtTGOh8fLzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.1.0", + "jest-util": "30.0.5", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/console/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/console/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/console/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.1.3.tgz", + "integrity": "sha512-LIQz7NEDDO1+eyOA2ZmkiAyYvZuo6s1UxD/e2IHldR6D7UYogVq3arTmli07MkENLq6/3JEQjp0mA8rrHHJ8KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.1.2", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.1.3", + "@jest/test-result": "30.1.3", + "@jest/transform": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.0.5", + "jest-config": "30.1.3", + "jest-haste-map": "30.1.0", + "jest-message-util": "30.1.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.1.3", + "jest-resolve-dependencies": "30.1.3", + "jest-runner": "30.1.3", + "jest-runtime": "30.1.3", + "jest-snapshot": "30.1.2", + "jest-util": "30.0.5", + "jest-validate": "30.1.0", + "jest-watcher": "30.1.3", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", + "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.1.2.tgz", + "integrity": "sha512-N8t1Ytw4/mr9uN28OnVf0SYE2dGhaIxOVYcwsf9IInBKjvofAjbFRvedvBBlyTYk2knbJTiEjEJ2PyyDIBnd9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-mock": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment/node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/expect": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.1.2.tgz", + "integrity": "sha512-tyaIExOwQRCxPCGNC05lIjWJztDwk2gPDNSDGg1zitXJJ8dC3++G/CRjE5mb2wQsf89+lsgAgqxxNpDLiCViTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.1.2", + "jest-snapshot": "30.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", + "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/@jest/expect-utils": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.1.2.tgz", + "integrity": "sha512-HXy1qT/bfdjCv7iC336ExbqqYtZvljrV8odNdso7dWK9bSeHtLlvwWWC3YSybSPL03Gg5rug6WLCZAZFH72m0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/expect/node_modules/expect": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.1.2.tgz", + "integrity": "sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.1.2", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.1.2", + "jest-message-util": "30.1.0", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-diff": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.1.2.tgz", + "integrity": "sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-matcher-utils": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.1.2.tgz", + "integrity": "sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.1.2", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/expect/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.1.2.tgz", + "integrity": "sha512-Beljfv9AYkr9K+ETX9tvV61rJTY706BhBUtiaepQHeEGfe0DbpvUA5Z3fomwc5Xkhns6NWrcFDZn+72fLieUnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.1.0", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/fake-timers/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.1.2.tgz", + "integrity": "sha512-teNTPZ8yZe3ahbYnvnVRDeOjr+3pu2uiAtNtrEsiMjVPPj+cXd5E/fr8BL7v/T7F31vYdEHrI5cC/2OoO/vM9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.1.2", + "@jest/expect": "30.1.2", + "@jest/types": "30.0.5", + "jest-mock": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.1.3.tgz", + "integrity": "sha512-VWEQmJWfXMOrzdFEOyGjUEOuVXllgZsoPtEHZzfdNz18RmzJ5nlR6kp8hDdY8dDS1yGOXAY7DHT+AOHIPSBV0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.1.2", + "@jest/test-result": "30.1.3", + "@jest/transform": "30.1.2", + "@jest/types": "30.0.5", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.1.0", + "jest-util": "30.0.5", + "jest-worker": "30.1.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/reporters/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.1.2.tgz", + "integrity": "sha512-vHoMTpimcPSR7OxS2S0V1Cpg8eKDRxucHjoWl5u4RQcnxqQrV3avETiFpl8etn4dqxEGarBeHbIBety/f8mLXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.1.3.tgz", + "integrity": "sha512-P9IV8T24D43cNRANPPokn7tZh0FAFnYS2HIfi5vK18CjRkTDR9Y3e1BoEcAJnl4ghZZF4Ecda4M/k41QkvurEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.1.2", + "@jest/types": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.1.3.tgz", + "integrity": "sha512-82J+hzC0qeQIiiZDThh+YUadvshdBswi5nuyXlEmXzrhw5ZQSRHeQ5LpVMD/xc8B3wPePvs6VMzHnntxL+4E3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.1.3", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.1.2.tgz", + "integrity": "sha512-UYYFGifSgfjujf1Cbd3iU/IQoSd6uwsj8XHj5DSDf5ERDcWMdJOPTkHWXj4U+Z/uMagyOQZ6Vne8C4nRIrCxqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.0.5", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.0", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.1.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.0.5", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@jest/types": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", + "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.28.0.tgz", + "integrity": "sha512-gmloF+i+flI8ouQK7MWW4mOwuMh4RePBuPFAEPC6+pdqyWOUMDOixb6qZ69owLJpz6XmyllCouc4t8YWO+E2Nw==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/jose": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", + "integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", + "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@repeaterjs/repeater": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.6.tgz", + "integrity": "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@whatwg-node/disposablestack": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", + "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/fetch": { + "version": "0.10.13", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.13.tgz", + "integrity": "sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/node-fetch": "^0.8.3", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/node-fetch": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.8.5.tgz", + "integrity": "sha512-4xzCl/zphPqlp9tASLVeUhB5+WJHbuWGYpfoC2q1qh5dw0AqZBW7L27V5roxYWijPxj4sspRAAoOH3d2ztaHUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^3.1.1", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/promise-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", + "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-jest": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.1.2.tgz", + "integrity": "sha512-IQCus1rt9kaSh7PQxLYRY5NmkNrNlU2TpabzwV7T2jljnpdHOcmnYYv8QmE04Li4S3a2Lj8/yXyET5pBarPr6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.1.2", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.0", + "babel-preset-jest": "30.0.1", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", + "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-fbjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", + "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", + "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.0.1", + "babel-preset-current-node-syntax": "^1.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.12.tgz", + "integrity": "sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001782", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001782.tgz", + "integrity": "sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/change-case-all": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.15.tgz", + "integrity": "sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "change-case": "^4.1.2", + "is-lower-case": "^2.0.2", + "is-upper-case": "^2.0.2", + "lower-case": "^2.0.2", + "lower-case-first": "^2.0.2", + "sponge-case": "^1.0.1", + "swap-case": "^2.0.2", + "title-case": "^3.0.3", + "upper-case": "^2.0.2", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-inspect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.1.tgz", + "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/dataloader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", + "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.328", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.328.tgz", + "integrity": "sha512-QNQ5l45DzYytThO21403XN3FvK0hOkWDG8viNf6jqS42msJ8I4tGDSpBCgvDRRPnkffafiwAym2X2eHeGD2V0w==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.3.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz", + "integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==", + "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphql": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", + "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-config": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.1.6.tgz", + "integrity": "sha512-fCkYnm4Kdq3un0YIM4BCZHVR5xl0UeLP6syxxO7KAstdY7QVyVvTHP0kRPDYEP1v08uwtJVgis5sj3IOTLOniQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.1.0", + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/url-loader": "^9.0.0", + "@graphql-tools/utils": "^11.0.0", + "cosmiconfig": "^8.1.0", + "jiti": "^2.0.0", + "minimatch": "^10.0.0", + "string-env-interpolation": "^1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "cosmiconfig-toml-loader": "^1.0.0", + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "cosmiconfig-toml-loader": { + "optional": true + } + } + }, + "node_modules/graphql-config/node_modules/@graphql-hive/signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-2.0.0.tgz", + "integrity": "sha512-Pz8wB3K0iU6ae9S1fWfsmJX24CcGeTo6hE7T44ucmV/ALKRj+bxClmqrYcDT7v3f0d12Rh4FAXBb6gon+WkDpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/batch-execute": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-10.0.7.tgz", + "integrity": "sha512-vKo9XUiy2sc5tzMupXoxZbu5afVY/9yJ0+yLrM5Dhh38yHYULf3z9VC1eAwW0kj8pWpOo8d8CV3jpleGwv83PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/delegate": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-12.0.12.tgz", + "integrity": "sha512-/vgLWhIwm+Mgo5VUOJQj6EOpaxXRQmA7mk8j6/8vBbPi56LoYA/UPRygcpEnm9EuXTspFKCTBil+xqThU3EmqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/batch-execute": "^10.0.7", + "@graphql-tools/executor": "^1.4.13", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-common": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-1.0.6.tgz", + "integrity": "sha512-23/K5C+LSlHDI0mj2SwCJ33RcELCcyDUgABm1Z8St7u/4Z5+95i925H/NAjUyggRjiaY8vYtNiMOPE49aPX1sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/core": "^5.4.0", + "@graphql-tools/utils": "^11.0.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-graphql-ws": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-3.1.5.tgz", + "integrity": "sha512-WXRsfwu9AkrORD9nShrd61OwwxeQ5+eXYcABRR3XPONFIS8pWQfDJGGqxql9/227o/s0DV5SIfkBURb5Knzv+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/disposablestack": "^0.0.6", + "graphql-ws": "^6.0.6", + "isows": "^1.0.7", + "tslib": "^2.8.1", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/executor-http": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-3.1.2.tgz", + "integrity": "sha512-iVY3bg9OaV/UiaAIhaL1mywTl2VH1v5A/krZkLrEa+TjbU93IMCHUMP7T4EH97CbWxRQuILUiZHdTcMfsXKXqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-hive/signal": "^2.0.0", + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.3.2", + "meros": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/url-loader": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-9.0.6.tgz", + "integrity": "sha512-QdJI3f7ANDMYfYazRgJzzybznjOrQAOuDXweC9xmKgPZoTqNxEAsatiy69zcpTf6092taJLyrqRH6R7xUTzf4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-graphql-ws": "^3.1.2", + "@graphql-tools/executor-http": "^3.0.6", + "@graphql-tools/executor-legacy-ws": "^1.1.25", + "@graphql-tools/utils": "^11.0.0", + "@graphql-tools/wrap": "^11.1.1", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.0.0", + "isomorphic-ws": "^5.0.0", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0", + "ws": "^8.19.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/utils": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.0.0.tgz", + "integrity": "sha512-bM1HeZdXA2C3LSIeLOnH/bcqSgbQgKEDrjxODjqi3y58xai2TkNrtYcQSoWzGbt9VMN1dORGjR7Vem8SPnUFQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/@graphql-tools/wrap": { + "version": "11.1.12", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-11.1.12.tgz", + "integrity": "sha512-PJ0tuiGbEOOZAJk2/pTKyzMEbwBncPBfO7Z84tCPzM/CAR4ZlAXbXjaXOw4fdi0ReUDyOG06Z8DGgEQjr68dKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/delegate": "^12.0.12", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/graphql-config/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/graphql-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-6.1.0.tgz", + "integrity": "sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.2.0", + "cross-fetch": "^3.1.5" + }, + "peerDependencies": { + "graphql": "14 - 16" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/graphql-ws": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.8.tgz", + "integrity": "sha512-m3EOaNsUBXwAnkBWbzPfe0Nq8pXUfxsWnolC54sru3FzHvhTZL0Ouf/BoQsaGAXqM+YPerXOJ47BUnmgmoupCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@fastify/websocket": "^10 || ^11", + "crossws": "~0.3", + "graphql": "^15.10.1 || ^16", + "ws": "^8" + }, + "peerDependenciesMeta": { + "@fastify/websocket": { + "optional": true + }, + "crossws": { + "optional": true + }, + "ws": { + "optional": true + } + } + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/hono": { + "version": "4.12.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.9.tgz", + "integrity": "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz", + "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/external-editor": "^1.0.0", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz", + "integrity": "sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz", + "integrity": "sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.1.3.tgz", + "integrity": "sha512-Ry+p2+NLk6u8Agh5yVqELfUJvRfV51hhVBRIB5yZPY7mU0DGBmOuFG5GebZbMbm86cdQNK0fhJuDX8/1YorISQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.1.3", + "@jest/types": "30.0.5", + "import-local": "^3.2.0", + "jest-cli": "30.1.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.0.5.tgz", + "integrity": "sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.0.5", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-circus": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.1.3.tgz", + "integrity": "sha512-Yf3dnhRON2GJT4RYzM89t/EXIWNxKTpWTL9BfF3+geFetWP4XSvJjiU1vrWplOiUkmq8cHLiwuhz+XuUp9DscA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.1.2", + "@jest/expect": "30.1.2", + "@jest/test-result": "30.1.3", + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.1.0", + "jest-matcher-utils": "30.1.2", + "jest-message-util": "30.1.0", + "jest-runtime": "30.1.3", + "jest-snapshot": "30.1.2", + "jest-util": "30.0.5", + "p-limit": "^3.1.0", + "pretty-format": "30.0.5", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/jest-diff": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.1.2.tgz", + "integrity": "sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-matcher-utils": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.1.2.tgz", + "integrity": "sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.1.2", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-cli": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.1.3.tgz", + "integrity": "sha512-G8E2Ol3OKch1DEeIBl41NP7OiC6LBhfg25Btv+idcusmoUSpqUkbrneMqbW9lVpI/rCKb/uETidb7DNteheuAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.1.3", + "@jest/test-result": "30.1.3", + "@jest/types": "30.0.5", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.1.3", + "jest-util": "30.0.5", + "jest-validate": "30.1.0", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-cli/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-config": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.1.3.tgz", + "integrity": "sha512-M/f7gqdQEPgZNA181Myz+GXCe8jXcJsGjCMXUzRj22FIXsZOyHNte84e0exntOvdPaeh9tA0w+B8qlP2fAezfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.1.3", + "@jest/types": "30.0.5", + "babel-jest": "30.1.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.1.3", + "jest-docblock": "30.0.1", + "jest-environment-node": "30.1.2", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.1.3", + "jest-runner": "30.1.3", + "jest-util": "30.0.5", + "jest-validate": "30.1.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-config/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", + "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.3.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.0.1.tgz", + "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.1.0.tgz", + "integrity": "sha512-A+9FKzxPluqogNahpCv04UJvcZ9B3HamqpDNWNKDjtxVRYB8xbZLFuCr8JAJFpNp83CA0anGQFlpQna9Me+/tQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.0.5", + "chalk": "^4.1.2", + "jest-util": "30.0.5", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.1.2.tgz", + "integrity": "sha512-w8qBiXtqGWJ9xpJIA98M0EIoq079GOQRQUyse5qg1plShUCQ0Ek1VTTcczqKrn3f24TFAgFtT+4q3aOXvjbsuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.1.2", + "@jest/fake-timers": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-mock": "30.0.5", + "jest-util": "30.0.5", + "jest-validate": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-haste-map": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.1.0.tgz", + "integrity": "sha512-JLeM84kNjpRkggcGpQLsV7B8W4LNUWz7oDNVnY1Vjj22b5/fAb3kk3htiD+4Na8bmJmjJR7rBtS2Rmq/NEcADg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.0.5", + "jest-worker": "30.1.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-haste-map/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-leak-detector": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.1.0.tgz", + "integrity": "sha512-AoFvJzwxK+4KohH60vRuHaqXfWmeBATFZpzpmzNmYTtmRMiyGPVhkXpBqxUQunw+dQB48bDf4NpUs6ivVbRv1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", + "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.3.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", + "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.3.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3", + "pretty-format": "30.3.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-mock": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", + "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.1.3.tgz", + "integrity": "sha512-DI4PtTqzw9GwELFS41sdMK32Ajp3XZQ8iygeDMWkxlRhm7uUTOFSZFVZABFuxr0jvspn8MAYy54NxZCsuCTSOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.1.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.0.5", + "jest-validate": "30.1.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.1.3.tgz", + "integrity": "sha512-DNfq3WGmuRyHRHfEet+Zm3QOmVFtIarUOQHHryKPc0YL9ROfgWZxl4+aZq/VAzok2SS3gZdniP+dO4zgo59hBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-runner": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.1.3.tgz", + "integrity": "sha512-dd1ORcxQraW44Uz029TtXj85W11yvLpDuIzNOlofrC8GN+SgDlgY4BvyxJiVeuabA1t6idjNbX59jLd2oplOGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.1.2", + "@jest/environment": "30.1.2", + "@jest/test-result": "30.1.3", + "@jest/transform": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.0.1", + "jest-environment-node": "30.1.2", + "jest-haste-map": "30.1.0", + "jest-leak-detector": "30.1.0", + "jest-message-util": "30.1.0", + "jest-resolve": "30.1.3", + "jest-runtime": "30.1.3", + "jest-util": "30.0.5", + "jest-watcher": "30.1.3", + "jest-worker": "30.1.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-runner/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.1.3.tgz", + "integrity": "sha512-WS8xgjuNSphdIGnleQcJ3AKE4tBKOVP+tKhCD0u+Tb2sBmsU8DxfbBpZX7//+XOz81zVs4eFpJQwBNji2Y07DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.1.2", + "@jest/fake-timers": "30.1.2", + "@jest/globals": "30.1.2", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.1.3", + "@jest/transform": "30.1.2", + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.1.0", + "jest-message-util": "30.1.0", + "jest-mock": "30.0.5", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.1.3", + "jest-snapshot": "30.1.2", + "jest-util": "30.0.5", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-runtime/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.1.2.tgz", + "integrity": "sha512-4q4+6+1c8B6Cy5pGgFvjDy/Pa6VYRiGu0yQafKkJ9u6wQx4G5PqI2QR6nxTl43yy7IWsINwz6oT4o6tD12a8Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.1.2", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.1.2", + "@jest/transform": "30.1.2", + "@jest/types": "30.0.5", + "babel-preset-current-node-syntax": "^1.1.0", + "chalk": "^4.1.2", + "expect": "30.1.2", + "graceful-fs": "^4.2.11", + "jest-diff": "30.1.2", + "jest-matcher-utils": "30.1.2", + "jest-message-util": "30.1.0", + "jest-util": "30.0.5", + "pretty-format": "30.0.5", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/expect-utils": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.1.2.tgz", + "integrity": "sha512-HXy1qT/bfdjCv7iC336ExbqqYtZvljrV8odNdso7dWK9bSeHtLlvwWWC3YSybSPL03Gg5rug6WLCZAZFH72m0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/expect": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.1.2.tgz", + "integrity": "sha512-xvHszRavo28ejws8FpemjhwswGj4w/BetHIL8cU49u4sGyXDw2+p3YbeDbj6xzlxi6kWTjIRSTJ+9sNXPnF0Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.1.2", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.1.2", + "jest-message-util": "30.1.0", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.1.2.tgz", + "integrity": "sha512-4+prq+9J61mOVXCa4Qp8ZjavdxzrWQXrI80GNxP8f4tkI2syPuPrJgdRPZRrfUTRvIoUwcmNLbqEJy9W800+NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { + "version": "30.1.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.1.2.tgz", + "integrity": "sha512-7ai16hy4rSbDjvPTuUhuV8nyPBd6EX34HkBsBcBX2lENCuAQ0qKCPb/+lt8OSWUa9WWmGYLy41PrEzkwRwoGZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.1.2", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-message-util": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.0.5", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.0.5", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-mock": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/@jest/types": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.1.0.tgz", + "integrity": "sha512-7P3ZlCFW/vhfQ8pE7zW6Oi4EzvuB4sgR72Q1INfW9m0FGo0GADYlPwIkf4CyPq7wq85g+kPMtPOHNAdWHeBOaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.0.5", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "30.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.1.3.tgz", + "integrity": "sha512-6jQUZCP1BTL2gvG9E4YF06Ytq4yMb4If6YoQGRR6PpjtqOXSP3sKe2kqwB6SQ+H9DezOfZaSLnmka1NtGm3fCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.1.3", + "@jest/types": "30.0.5", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.0.5", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-watcher/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-worker": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.1.0.tgz", + "integrity": "sha512-uvWcSjlwAAgIu133Tt77A05H7RIk3Ho8tZL50bQM2AkvLdluw9NG48lRCl3Dt+MOH719n/0nnb5YxUwcuJiKRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.0.5", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/node_modules/jest-util": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.0.5", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jose": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/json-to-pretty-yaml": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", + "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "remedial": "^1.0.7", + "remove-trailing-spaces": "^1.0.6" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-2.0.2.tgz", + "integrity": "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/meros": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.2.tgz", + "integrity": "sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=13" + }, + "peerDependencies": { + "@types/node": ">=13" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/nock": { + "version": "14.0.11", + "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.11.tgz", + "integrity": "sha512-u5xUnYE+UOOBA6SpELJheMCtj2Laqx15Vl70QxKo43Wz/6nMHXS7PrEioXLjXAwhmawdEMNImwKCcPhBJWbKVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mswjs/interceptors": "^0.41.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">=18.20.0 <20 || >=20.12.1" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.0.tgz", + "integrity": "sha512-PuseHIvAnz3bjrM2rGJtSgo1zjgxapTLZ7x2pjhzWwlp4SJQgK3f3iZIQwkpEnBaKz6seKBADpM4B4ySkuYypg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/relay-runtime": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-12.0.0.tgz", + "integrity": "sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "fbjs": "^3.0.0", + "invariant": "^2.2.4" + } + }, + "node_modules/remedial": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", + "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "engines": { + "node": "*" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" + }, + "node_modules/remove-trailing-spaces": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.9.tgz", + "integrity": "sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/scuid/-/scuid-1.1.0.tgz", + "integrity": "sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/signedsource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", + "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sponge-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-1.0.1.tgz", + "integrity": "sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-env-interpolation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz", + "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swap-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-2.0.2.tgz", + "integrity": "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/sync-fetch": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0.tgz", + "integrity": "sha512-IELLEvzHuCfc1uTsshPK58ViSdNqXxlml1U+fmwJIKLYKOr/rAtBrorE2RYm5IHaMpDNlmC0fr1LAvdXvyheEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^3.3.2", + "timeout-signal": "^2.0.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/sync-fetch/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/timeout-signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timeout-signal/-/timeout-signal-2.0.0.tgz", + "integrity": "sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/title-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", + "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-jest": { + "version": "29.4.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.1.tgz", + "integrity": "sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.2", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-log": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-2.2.7.tgz", + "integrity": "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", + "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unixify/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + } + } +} diff --git a/mcp/package.json b/mcp/package.json new file mode 100644 index 0000000..50a8882 --- /dev/null +++ b/mcp/package.json @@ -0,0 +1,43 @@ +{ + "name": "oswatcher-mcp-server", + "version": "1.0.0", + "description": "MCP server exposing OSWatcher OS intelligence data to AI agents", + "type": "module", + "engines": { + "node": ">= 25.0.0" + }, + "scripts": { + "build": "npx tsc", + "start": "node dist/index.js", + "serve": "npm run build && npm start", + "generate": "graphql-codegen --config codegen.yml", + "test": "node --experimental-vm-modules node_modules/.bin/jest", + "test:watch": "node --experimental-vm-modules node_modules/.bin/jest --watch", + "format": "prettier --write 'src/**/*.ts' 'tests/**/*.ts'", + "format-check": "prettier --check 'src/**/*.ts' 'tests/**/*.ts'" + }, + "private": true, + "license": "Apache-2.0", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.12.1", + "express": "^5.1.0", + "graphql": "16.11.0", + "zod": "^3.24.0" + }, + "devDependencies": { + "@graphql-codegen/cli": "^5.0.3", + "@graphql-codegen/typescript": "^4.1.0", + "@graphql-codegen/typescript-operations": "^4.3.0", + "@graphql-codegen/typescript-generic-sdk": "^4.0.1", + "@types/express": "^5.0.3", + "@types/jest": "30.0.0", + "jest": "30.1.3", + "nock": "^14.0.5", + "prettier": "3.6.2", + "ts-jest": "29.4.1", + "typescript": "5.9.2" + }, + "prettier": { + "tabWidth": 4 + } +} diff --git a/mcp/src/graphql/client.ts b/mcp/src/graphql/client.ts new file mode 100644 index 0000000..aeb6dcb --- /dev/null +++ b/mcp/src/graphql/client.ts @@ -0,0 +1,49 @@ +import { DocumentNode, print } from "graphql"; +import { getSdk } from "./generated/sdk.js"; + +const GRAPHQL_API_URL = + process.env.GRAPHQL_API_URL || "http://localhost:4000/graphql"; + +interface GraphQLResponse { + data?: T; + errors?: Array<{ message: string }>; +} + +export type GraphqlSdk = ReturnType; + +// The GraphQL API is public, read-only and unauthenticated, so there is no +// credential to forward and the SDK is request-invariant. +export function createSdk(): GraphqlSdk { + async function requester(doc: DocumentNode, vars?: V): Promise { + const response = await fetch(GRAPHQL_API_URL, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + query: print(doc), + variables: vars, + }), + }); + + if (!response.ok) { + throw new Error( + `GraphQL API returned ${response.status}: ${response.statusText}`, + ); + } + + const json = (await response.json()) as GraphQLResponse; + + if (json.errors?.length) { + throw new Error( + `GraphQL error: ${json.errors.map((e) => e.message).join(", ")}`, + ); + } + + if (!json.data) { + throw new Error("GraphQL response missing data"); + } + + return json.data; + } + + return getSdk(requester); +} diff --git a/mcp/src/graphql/generated/sdk.ts b/mcp/src/graphql/generated/sdk.ts new file mode 100644 index 0000000..3f20ace --- /dev/null +++ b/mcp/src/graphql/generated/sdk.ts @@ -0,0 +1,7994 @@ +import { DocumentNode } from "graphql"; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { + [K in keyof T]: T[K]; +}; +export type MakeOptional = Omit & { + [SubKey in K]?: Maybe; +}; +export type MakeMaybe = Omit & { + [SubKey in K]: Maybe; +}; +export type MakeEmpty< + T extends { [key: string]: unknown }, + K extends keyof T, +> = { [_ in K]?: never }; +export type Incremental = + | T + | { + [P in keyof T]?: P extends " $fragmentName" | "__typename" + ? T[P] + : never; + }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string }; + String: { input: string; output: string }; + Boolean: { input: boolean; output: boolean }; + Int: { input: number; output: number }; + Float: { input: number; output: number }; + DateTime: { input: any; output: any }; + JSON: { input: any; output: any }; +}; + +export type Blob = Hashable & { + __typename?: "Blob"; + has_struct: Array; + has_structAggregate?: Maybe; + has_structConnection: BlobHas_StructConnection; + has_symbol: Array; + has_symbolAggregate?: Maybe; + has_symbolConnection: BlobHas_SymbolConnection; + has_winreg?: Maybe; + has_winregAggregate?: Maybe; + has_winregConnection: BlobHas_WinregConnection; + hash: Scalars["String"]["output"]; +}; + +export type BlobHas_StructArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type BlobHas_StructAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type BlobHas_StructConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type BlobHas_SymbolArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type BlobHas_SymbolAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type BlobHas_SymbolConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type BlobHas_WinregArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type BlobHas_WinregAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type BlobHas_WinregConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type BlobEdge = { + __typename?: "BlobEdge"; + cursor: Scalars["String"]["output"]; + node: Blob; +}; + +export type BlobHas_StructAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type BlobHas_StructConnection = { + __typename?: "BlobHas_structConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type BlobHas_StructConnectionSort = { + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type BlobHas_StructConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type BlobHas_StructNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; + kind_AVERAGE_LENGTH_EQUAL?: InputMaybe; + kind_AVERAGE_LENGTH_GT?: InputMaybe; + kind_AVERAGE_LENGTH_GTE?: InputMaybe; + kind_AVERAGE_LENGTH_LT?: InputMaybe; + kind_AVERAGE_LENGTH_LTE?: InputMaybe; + kind_LONGEST_LENGTH_EQUAL?: InputMaybe; + kind_LONGEST_LENGTH_GT?: InputMaybe; + kind_LONGEST_LENGTH_GTE?: InputMaybe; + kind_LONGEST_LENGTH_LT?: InputMaybe; + kind_LONGEST_LENGTH_LTE?: InputMaybe; + kind_SHORTEST_LENGTH_EQUAL?: InputMaybe; + kind_SHORTEST_LENGTH_GT?: InputMaybe; + kind_SHORTEST_LENGTH_GTE?: InputMaybe; + kind_SHORTEST_LENGTH_LT?: InputMaybe; + kind_SHORTEST_LENGTH_LTE?: InputMaybe; + size_AVERAGE_EQUAL?: InputMaybe; + size_AVERAGE_GT?: InputMaybe; + size_AVERAGE_GTE?: InputMaybe; + size_AVERAGE_LT?: InputMaybe; + size_AVERAGE_LTE?: InputMaybe; + size_MAX_EQUAL?: InputMaybe; + size_MAX_GT?: InputMaybe; + size_MAX_GTE?: InputMaybe; + size_MAX_LT?: InputMaybe; + size_MAX_LTE?: InputMaybe; + size_MIN_EQUAL?: InputMaybe; + size_MIN_GT?: InputMaybe; + size_MIN_GTE?: InputMaybe; + size_MIN_LT?: InputMaybe; + size_MIN_LTE?: InputMaybe; + size_SUM_EQUAL?: InputMaybe; + size_SUM_GT?: InputMaybe; + size_SUM_GTE?: InputMaybe; + size_SUM_LT?: InputMaybe; + size_SUM_LTE?: InputMaybe; +}; + +export type BlobHas_StructRelationship = { + __typename?: "BlobHas_structRelationship"; + cursor: Scalars["String"]["output"]; + node: Struct; + properties: HasNameRel; +}; + +export type BlobHas_SymbolAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type BlobHas_SymbolConnection = { + __typename?: "BlobHas_symbolConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type BlobHas_SymbolConnectionSort = { + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type BlobHas_SymbolConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type BlobHas_SymbolNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + address_AVERAGE_LENGTH_EQUAL?: InputMaybe; + address_AVERAGE_LENGTH_GT?: InputMaybe; + address_AVERAGE_LENGTH_GTE?: InputMaybe; + address_AVERAGE_LENGTH_LT?: InputMaybe; + address_AVERAGE_LENGTH_LTE?: InputMaybe; + address_LONGEST_LENGTH_EQUAL?: InputMaybe; + address_LONGEST_LENGTH_GT?: InputMaybe; + address_LONGEST_LENGTH_GTE?: InputMaybe; + address_LONGEST_LENGTH_LT?: InputMaybe; + address_LONGEST_LENGTH_LTE?: InputMaybe; + address_SHORTEST_LENGTH_EQUAL?: InputMaybe; + address_SHORTEST_LENGTH_GT?: InputMaybe; + address_SHORTEST_LENGTH_GTE?: InputMaybe; + address_SHORTEST_LENGTH_LT?: InputMaybe; + address_SHORTEST_LENGTH_LTE?: InputMaybe; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type BlobHas_SymbolRelationship = { + __typename?: "BlobHas_symbolRelationship"; + cursor: Scalars["String"]["output"]; + node: Symbol; + properties: HasNameRel; +}; + +export type BlobHas_WinregAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + node?: InputMaybe; +}; + +export type BlobHas_WinregConnection = { + __typename?: "BlobHas_winregConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type BlobHas_WinregConnectionSort = { + node?: InputMaybe; +}; + +export type BlobHas_WinregConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + node?: InputMaybe; +}; + +export type BlobHas_WinregNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type BlobHas_WinregRelationship = { + __typename?: "BlobHas_winregRelationship"; + cursor: Scalars["String"]["output"]; + node: WinRegKey; +}; + +export type BlobOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more BlobSort objects to sort Blobs by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>; +}; + +/** Fields to sort Blobs by. The order in which sorts are applied is not guaranteed when specifying many fields in one BlobSort object. */ +export type BlobSort = { + hash?: InputMaybe; +}; + +export type BlobStructHas_StructAggregationSelection = { + __typename?: "BlobStructHas_structAggregationSelection"; + count: Scalars["Int"]["output"]; + edge?: Maybe; + node?: Maybe; +}; + +export type BlobStructHas_StructEdgeAggregateSelection = { + __typename?: "BlobStructHas_structEdgeAggregateSelection"; + name: StringAggregateSelection; +}; + +export type BlobStructHas_StructNodeAggregateSelection = { + __typename?: "BlobStructHas_structNodeAggregateSelection"; + hash: StringAggregateSelection; + kind: StringAggregateSelection; + size: IntAggregateSelection; +}; + +export type BlobSymbolHas_SymbolAggregationSelection = { + __typename?: "BlobSymbolHas_symbolAggregationSelection"; + count: Scalars["Int"]["output"]; + edge?: Maybe; + node?: Maybe; +}; + +export type BlobSymbolHas_SymbolEdgeAggregateSelection = { + __typename?: "BlobSymbolHas_symbolEdgeAggregateSelection"; + name: StringAggregateSelection; +}; + +export type BlobSymbolHas_SymbolNodeAggregateSelection = { + __typename?: "BlobSymbolHas_symbolNodeAggregateSelection"; + address: StringAggregateSelection; + hash: StringAggregateSelection; +}; + +export type BlobWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + has_structAggregate?: InputMaybe; + /** Return Blobs where all of the related BlobHas_structConnections match this filter */ + has_structConnection_ALL?: InputMaybe; + /** Return Blobs where none of the related BlobHas_structConnections match this filter */ + has_structConnection_NONE?: InputMaybe; + /** Return Blobs where one of the related BlobHas_structConnections match this filter */ + has_structConnection_SINGLE?: InputMaybe; + /** Return Blobs where some of the related BlobHas_structConnections match this filter */ + has_structConnection_SOME?: InputMaybe; + /** Return Blobs where all of the related Structs match this filter */ + has_struct_ALL?: InputMaybe; + /** Return Blobs where none of the related Structs match this filter */ + has_struct_NONE?: InputMaybe; + /** Return Blobs where one of the related Structs match this filter */ + has_struct_SINGLE?: InputMaybe; + /** Return Blobs where some of the related Structs match this filter */ + has_struct_SOME?: InputMaybe; + has_symbolAggregate?: InputMaybe; + /** Return Blobs where all of the related BlobHas_symbolConnections match this filter */ + has_symbolConnection_ALL?: InputMaybe; + /** Return Blobs where none of the related BlobHas_symbolConnections match this filter */ + has_symbolConnection_NONE?: InputMaybe; + /** Return Blobs where one of the related BlobHas_symbolConnections match this filter */ + has_symbolConnection_SINGLE?: InputMaybe; + /** Return Blobs where some of the related BlobHas_symbolConnections match this filter */ + has_symbolConnection_SOME?: InputMaybe; + /** Return Blobs where all of the related Symbols match this filter */ + has_symbol_ALL?: InputMaybe; + /** Return Blobs where none of the related Symbols match this filter */ + has_symbol_NONE?: InputMaybe; + /** Return Blobs where one of the related Symbols match this filter */ + has_symbol_SINGLE?: InputMaybe; + /** Return Blobs where some of the related Symbols match this filter */ + has_symbol_SOME?: InputMaybe; + has_winreg?: InputMaybe; + has_winregAggregate?: InputMaybe; + has_winregConnection?: InputMaybe; + has_winregConnection_NOT?: InputMaybe; + has_winreg_NOT?: InputMaybe; + hash?: InputMaybe; + hash_CONTAINS?: InputMaybe; + hash_ENDS_WITH?: InputMaybe; + hash_IN?: InputMaybe>; + hash_STARTS_WITH?: InputMaybe; +}; + +export type BlobWinRegKeyHas_WinregAggregationSelection = { + __typename?: "BlobWinRegKeyHas_winregAggregationSelection"; + count: Scalars["Int"]["output"]; + node?: Maybe; +}; + +export type BlobWinRegKeyHas_WinregNodeAggregateSelection = { + __typename?: "BlobWinRegKeyHas_winregNodeAggregateSelection"; + hash: StringAggregateSelection; +}; + +export type BlobWithSymbols = { + __typename?: "BlobWithSymbols"; + blob_hash: Scalars["String"]["output"]; + blob_path: Scalars["String"]["output"]; +}; + +export type BlobsConnection = { + __typename?: "BlobsConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type Branch = { + __typename?: "Branch"; + name: Scalars["String"]["output"]; + tracks?: Maybe; + tracksAggregate?: Maybe; + tracksConnection: BranchTracksConnection; +}; + +export type BranchTracksArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type BranchTracksAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type BranchTracksConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type BranchAggregateSelection = { + __typename?: "BranchAggregateSelection"; + count: Scalars["Int"]["output"]; + name: StringAggregateSelection; +}; + +export type BranchCommitTracksAggregationSelection = { + __typename?: "BranchCommitTracksAggregationSelection"; + count: Scalars["Int"]["output"]; + node?: Maybe; +}; + +export type BranchCommitTracksNodeAggregateSelection = { + __typename?: "BranchCommitTracksNodeAggregateSelection"; + date: DateTimeAggregateSelection; + description: StringAggregateSelection; + hash: StringAggregateSelection; + name: StringAggregateSelection; +}; + +export type BranchEdge = { + __typename?: "BranchEdge"; + cursor: Scalars["String"]["output"]; + node: Branch; +}; + +export type BranchOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more BranchSort objects to sort Branches by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>; +}; + +/** Fields to sort Branches by. The order in which sorts are applied is not guaranteed when specifying many fields in one BranchSort object. */ +export type BranchSort = { + name?: InputMaybe; +}; + +export type BranchTracksAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + node?: InputMaybe; +}; + +export type BranchTracksConnection = { + __typename?: "BranchTracksConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type BranchTracksConnectionSort = { + node?: InputMaybe; +}; + +export type BranchTracksConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + node?: InputMaybe; +}; + +export type BranchTracksNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + date_MAX_EQUAL?: InputMaybe; + date_MAX_GT?: InputMaybe; + date_MAX_GTE?: InputMaybe; + date_MAX_LT?: InputMaybe; + date_MAX_LTE?: InputMaybe; + date_MIN_EQUAL?: InputMaybe; + date_MIN_GT?: InputMaybe; + date_MIN_GTE?: InputMaybe; + date_MIN_LT?: InputMaybe; + date_MIN_LTE?: InputMaybe; + description_AVERAGE_LENGTH_EQUAL?: InputMaybe; + description_AVERAGE_LENGTH_GT?: InputMaybe; + description_AVERAGE_LENGTH_GTE?: InputMaybe; + description_AVERAGE_LENGTH_LT?: InputMaybe; + description_AVERAGE_LENGTH_LTE?: InputMaybe; + description_LONGEST_LENGTH_EQUAL?: InputMaybe; + description_LONGEST_LENGTH_GT?: InputMaybe; + description_LONGEST_LENGTH_GTE?: InputMaybe; + description_LONGEST_LENGTH_LT?: InputMaybe; + description_LONGEST_LENGTH_LTE?: InputMaybe; + description_SHORTEST_LENGTH_EQUAL?: InputMaybe; + description_SHORTEST_LENGTH_GT?: InputMaybe; + description_SHORTEST_LENGTH_GTE?: InputMaybe; + description_SHORTEST_LENGTH_LT?: InputMaybe; + description_SHORTEST_LENGTH_LTE?: InputMaybe; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; + name_AVERAGE_LENGTH_EQUAL?: InputMaybe; + name_AVERAGE_LENGTH_GT?: InputMaybe; + name_AVERAGE_LENGTH_GTE?: InputMaybe; + name_AVERAGE_LENGTH_LT?: InputMaybe; + name_AVERAGE_LENGTH_LTE?: InputMaybe; + name_LONGEST_LENGTH_EQUAL?: InputMaybe; + name_LONGEST_LENGTH_GT?: InputMaybe; + name_LONGEST_LENGTH_GTE?: InputMaybe; + name_LONGEST_LENGTH_LT?: InputMaybe; + name_LONGEST_LENGTH_LTE?: InputMaybe; + name_SHORTEST_LENGTH_EQUAL?: InputMaybe; + name_SHORTEST_LENGTH_GT?: InputMaybe; + name_SHORTEST_LENGTH_GTE?: InputMaybe; + name_SHORTEST_LENGTH_LT?: InputMaybe; + name_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type BranchTracksRelationship = { + __typename?: "BranchTracksRelationship"; + cursor: Scalars["String"]["output"]; + node: Commit; +}; + +export type BranchWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + name?: InputMaybe; + name_CONTAINS?: InputMaybe; + name_ENDS_WITH?: InputMaybe; + name_IN?: InputMaybe>; + name_STARTS_WITH?: InputMaybe; + tracks?: InputMaybe; + tracksAggregate?: InputMaybe; + tracksConnection?: InputMaybe; + tracksConnection_NOT?: InputMaybe; + tracks_NOT?: InputMaybe; +}; + +export type BranchesConnection = { + __typename?: "BranchesConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type Commit = Hashable & { + __typename?: "Commit"; + date: Scalars["DateTime"]["output"]; + description?: Maybe; + filesystem?: Maybe; + filesystemAggregate?: Maybe; + filesystemConnection: CommitFilesystemConnection; + hash: Scalars["String"]["output"]; + name: Scalars["String"]["output"]; + next: Array; + nextAggregate?: Maybe; + nextConnection: CommitNextConnection; + previous?: Maybe; + previousAggregate?: Maybe; + previousConnection: CommitPreviousConnection; +}; + +export type CommitFilesystemArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type CommitFilesystemAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type CommitFilesystemConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type CommitNextArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type CommitNextAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type CommitNextConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type CommitPreviousArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type CommitPreviousAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type CommitPreviousConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type CommitAggregateSelection = { + __typename?: "CommitAggregateSelection"; + count: Scalars["Int"]["output"]; + date: DateTimeAggregateSelection; + description: StringAggregateSelection; + hash: StringAggregateSelection; + name: StringAggregateSelection; +}; + +export type CommitCommitNextAggregationSelection = { + __typename?: "CommitCommitNextAggregationSelection"; + count: Scalars["Int"]["output"]; + node?: Maybe; +}; + +export type CommitCommitNextNodeAggregateSelection = { + __typename?: "CommitCommitNextNodeAggregateSelection"; + date: DateTimeAggregateSelection; + description: StringAggregateSelection; + hash: StringAggregateSelection; + name: StringAggregateSelection; +}; + +export type CommitCommitPreviousAggregationSelection = { + __typename?: "CommitCommitPreviousAggregationSelection"; + count: Scalars["Int"]["output"]; + node?: Maybe; +}; + +export type CommitCommitPreviousNodeAggregateSelection = { + __typename?: "CommitCommitPreviousNodeAggregateSelection"; + date: DateTimeAggregateSelection; + description: StringAggregateSelection; + hash: StringAggregateSelection; + name: StringAggregateSelection; +}; + +export type CommitEdge = { + __typename?: "CommitEdge"; + cursor: Scalars["String"]["output"]; + node: Commit; +}; + +export type CommitFilesystemAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + node?: InputMaybe; +}; + +export type CommitFilesystemConnection = { + __typename?: "CommitFilesystemConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type CommitFilesystemConnectionSort = { + node?: InputMaybe; +}; + +export type CommitFilesystemConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + node?: InputMaybe; +}; + +export type CommitFilesystemNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type CommitFilesystemRelationship = { + __typename?: "CommitFilesystemRelationship"; + cursor: Scalars["String"]["output"]; + node: Tree; +}; + +export enum CommitHistoryDirection { + Backward = "BACKWARD", + Forward = "FORWARD", +} + +export type CommitNextAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + node?: InputMaybe; +}; + +export type CommitNextConnection = { + __typename?: "CommitNextConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type CommitNextConnectionSort = { + node?: InputMaybe; +}; + +export type CommitNextConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + node?: InputMaybe; +}; + +export type CommitNextNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + date_MAX_EQUAL?: InputMaybe; + date_MAX_GT?: InputMaybe; + date_MAX_GTE?: InputMaybe; + date_MAX_LT?: InputMaybe; + date_MAX_LTE?: InputMaybe; + date_MIN_EQUAL?: InputMaybe; + date_MIN_GT?: InputMaybe; + date_MIN_GTE?: InputMaybe; + date_MIN_LT?: InputMaybe; + date_MIN_LTE?: InputMaybe; + description_AVERAGE_LENGTH_EQUAL?: InputMaybe; + description_AVERAGE_LENGTH_GT?: InputMaybe; + description_AVERAGE_LENGTH_GTE?: InputMaybe; + description_AVERAGE_LENGTH_LT?: InputMaybe; + description_AVERAGE_LENGTH_LTE?: InputMaybe; + description_LONGEST_LENGTH_EQUAL?: InputMaybe; + description_LONGEST_LENGTH_GT?: InputMaybe; + description_LONGEST_LENGTH_GTE?: InputMaybe; + description_LONGEST_LENGTH_LT?: InputMaybe; + description_LONGEST_LENGTH_LTE?: InputMaybe; + description_SHORTEST_LENGTH_EQUAL?: InputMaybe; + description_SHORTEST_LENGTH_GT?: InputMaybe; + description_SHORTEST_LENGTH_GTE?: InputMaybe; + description_SHORTEST_LENGTH_LT?: InputMaybe; + description_SHORTEST_LENGTH_LTE?: InputMaybe; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; + name_AVERAGE_LENGTH_EQUAL?: InputMaybe; + name_AVERAGE_LENGTH_GT?: InputMaybe; + name_AVERAGE_LENGTH_GTE?: InputMaybe; + name_AVERAGE_LENGTH_LT?: InputMaybe; + name_AVERAGE_LENGTH_LTE?: InputMaybe; + name_LONGEST_LENGTH_EQUAL?: InputMaybe; + name_LONGEST_LENGTH_GT?: InputMaybe; + name_LONGEST_LENGTH_GTE?: InputMaybe; + name_LONGEST_LENGTH_LT?: InputMaybe; + name_LONGEST_LENGTH_LTE?: InputMaybe; + name_SHORTEST_LENGTH_EQUAL?: InputMaybe; + name_SHORTEST_LENGTH_GT?: InputMaybe; + name_SHORTEST_LENGTH_GTE?: InputMaybe; + name_SHORTEST_LENGTH_LT?: InputMaybe; + name_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type CommitNextRelationship = { + __typename?: "CommitNextRelationship"; + cursor: Scalars["String"]["output"]; + node: Commit; +}; + +export type CommitOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more CommitSort objects to sort Commits by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>; +}; + +export type CommitPreviousAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + node?: InputMaybe; +}; + +export type CommitPreviousConnection = { + __typename?: "CommitPreviousConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type CommitPreviousConnectionSort = { + node?: InputMaybe; +}; + +export type CommitPreviousConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + node?: InputMaybe; +}; + +export type CommitPreviousNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + date_MAX_EQUAL?: InputMaybe; + date_MAX_GT?: InputMaybe; + date_MAX_GTE?: InputMaybe; + date_MAX_LT?: InputMaybe; + date_MAX_LTE?: InputMaybe; + date_MIN_EQUAL?: InputMaybe; + date_MIN_GT?: InputMaybe; + date_MIN_GTE?: InputMaybe; + date_MIN_LT?: InputMaybe; + date_MIN_LTE?: InputMaybe; + description_AVERAGE_LENGTH_EQUAL?: InputMaybe; + description_AVERAGE_LENGTH_GT?: InputMaybe; + description_AVERAGE_LENGTH_GTE?: InputMaybe; + description_AVERAGE_LENGTH_LT?: InputMaybe; + description_AVERAGE_LENGTH_LTE?: InputMaybe; + description_LONGEST_LENGTH_EQUAL?: InputMaybe; + description_LONGEST_LENGTH_GT?: InputMaybe; + description_LONGEST_LENGTH_GTE?: InputMaybe; + description_LONGEST_LENGTH_LT?: InputMaybe; + description_LONGEST_LENGTH_LTE?: InputMaybe; + description_SHORTEST_LENGTH_EQUAL?: InputMaybe; + description_SHORTEST_LENGTH_GT?: InputMaybe; + description_SHORTEST_LENGTH_GTE?: InputMaybe; + description_SHORTEST_LENGTH_LT?: InputMaybe; + description_SHORTEST_LENGTH_LTE?: InputMaybe; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; + name_AVERAGE_LENGTH_EQUAL?: InputMaybe; + name_AVERAGE_LENGTH_GT?: InputMaybe; + name_AVERAGE_LENGTH_GTE?: InputMaybe; + name_AVERAGE_LENGTH_LT?: InputMaybe; + name_AVERAGE_LENGTH_LTE?: InputMaybe; + name_LONGEST_LENGTH_EQUAL?: InputMaybe; + name_LONGEST_LENGTH_GT?: InputMaybe; + name_LONGEST_LENGTH_GTE?: InputMaybe; + name_LONGEST_LENGTH_LT?: InputMaybe; + name_LONGEST_LENGTH_LTE?: InputMaybe; + name_SHORTEST_LENGTH_EQUAL?: InputMaybe; + name_SHORTEST_LENGTH_GT?: InputMaybe; + name_SHORTEST_LENGTH_GTE?: InputMaybe; + name_SHORTEST_LENGTH_LT?: InputMaybe; + name_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type CommitPreviousRelationship = { + __typename?: "CommitPreviousRelationship"; + cursor: Scalars["String"]["output"]; + node: Commit; +}; + +export type CommitRange = { + branch?: InputMaybe; + direction?: InputMaybe; + endRef?: InputMaybe; + include_updates?: InputMaybe; + startRef: Scalars["String"]["input"]; +}; + +/** Fields to sort Commits by. The order in which sorts are applied is not guaranteed when specifying many fields in one CommitSort object. */ +export type CommitSort = { + date?: InputMaybe; + description?: InputMaybe; + hash?: InputMaybe; + name?: InputMaybe; +}; + +export type CommitTreeFilesystemAggregationSelection = { + __typename?: "CommitTreeFilesystemAggregationSelection"; + count: Scalars["Int"]["output"]; + node?: Maybe; +}; + +export type CommitTreeFilesystemNodeAggregateSelection = { + __typename?: "CommitTreeFilesystemNodeAggregateSelection"; + hash: StringAggregateSelection; +}; + +export type CommitWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + date?: InputMaybe; + date_GT?: InputMaybe; + date_GTE?: InputMaybe; + date_IN?: InputMaybe>; + date_LT?: InputMaybe; + date_LTE?: InputMaybe; + description?: InputMaybe; + description_CONTAINS?: InputMaybe; + description_ENDS_WITH?: InputMaybe; + description_IN?: InputMaybe>>; + description_STARTS_WITH?: InputMaybe; + filesystem?: InputMaybe; + filesystemAggregate?: InputMaybe; + filesystemConnection?: InputMaybe; + filesystemConnection_NOT?: InputMaybe; + filesystem_NOT?: InputMaybe; + hash?: InputMaybe; + hash_CONTAINS?: InputMaybe; + hash_ENDS_WITH?: InputMaybe; + hash_IN?: InputMaybe>; + hash_STARTS_WITH?: InputMaybe; + name?: InputMaybe; + name_CONTAINS?: InputMaybe; + name_ENDS_WITH?: InputMaybe; + name_IN?: InputMaybe>; + name_STARTS_WITH?: InputMaybe; + nextAggregate?: InputMaybe; + /** Return Commits where all of the related CommitNextConnections match this filter */ + nextConnection_ALL?: InputMaybe; + /** Return Commits where none of the related CommitNextConnections match this filter */ + nextConnection_NONE?: InputMaybe; + /** Return Commits where one of the related CommitNextConnections match this filter */ + nextConnection_SINGLE?: InputMaybe; + /** Return Commits where some of the related CommitNextConnections match this filter */ + nextConnection_SOME?: InputMaybe; + /** Return Commits where all of the related Commits match this filter */ + next_ALL?: InputMaybe; + /** Return Commits where none of the related Commits match this filter */ + next_NONE?: InputMaybe; + /** Return Commits where one of the related Commits match this filter */ + next_SINGLE?: InputMaybe; + /** Return Commits where some of the related Commits match this filter */ + next_SOME?: InputMaybe; + previous?: InputMaybe; + previousAggregate?: InputMaybe; + previousConnection?: InputMaybe; + previousConnection_NOT?: InputMaybe; + previous_NOT?: InputMaybe; +}; + +export type CommitsConnection = { + __typename?: "CommitsConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type DataType = Hashable & { + __typename?: "DataType"; + array_counter?: Maybe; + bit_length?: Maybe; + bit_position?: Maybe; + has_data_type?: Maybe; + has_data_typeAggregate?: Maybe; + has_data_typeConnection: DataTypeHas_Data_TypeConnection; + hash: Scalars["String"]["output"]; + name?: Maybe; + type: Scalars["String"]["output"]; +}; + +export type DataTypeHas_Data_TypeArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type DataTypeHas_Data_TypeAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type DataTypeHas_Data_TypeConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type DataTypeAggregateSelection = { + __typename?: "DataTypeAggregateSelection"; + array_counter: IntAggregateSelection; + bit_length: IntAggregateSelection; + bit_position: IntAggregateSelection; + count: Scalars["Int"]["output"]; + hash: StringAggregateSelection; + name: StringAggregateSelection; + type: StringAggregateSelection; +}; + +export type DataTypeDataTypeHas_Data_TypeAggregationSelection = { + __typename?: "DataTypeDataTypeHas_data_typeAggregationSelection"; + count: Scalars["Int"]["output"]; + node?: Maybe; +}; + +export type DataTypeDataTypeHas_Data_TypeNodeAggregateSelection = { + __typename?: "DataTypeDataTypeHas_data_typeNodeAggregateSelection"; + array_counter: IntAggregateSelection; + bit_length: IntAggregateSelection; + bit_position: IntAggregateSelection; + hash: StringAggregateSelection; + name: StringAggregateSelection; + type: StringAggregateSelection; +}; + +export type DataTypeEdge = { + __typename?: "DataTypeEdge"; + cursor: Scalars["String"]["output"]; + node: DataType; +}; + +export type DataTypeHas_Data_TypeAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + node?: InputMaybe; +}; + +export type DataTypeHas_Data_TypeConnection = { + __typename?: "DataTypeHas_data_typeConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type DataTypeHas_Data_TypeConnectionSort = { + node?: InputMaybe; +}; + +export type DataTypeHas_Data_TypeConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + node?: InputMaybe; +}; + +export type DataTypeHas_Data_TypeNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + array_counter_AVERAGE_EQUAL?: InputMaybe; + array_counter_AVERAGE_GT?: InputMaybe; + array_counter_AVERAGE_GTE?: InputMaybe; + array_counter_AVERAGE_LT?: InputMaybe; + array_counter_AVERAGE_LTE?: InputMaybe; + array_counter_MAX_EQUAL?: InputMaybe; + array_counter_MAX_GT?: InputMaybe; + array_counter_MAX_GTE?: InputMaybe; + array_counter_MAX_LT?: InputMaybe; + array_counter_MAX_LTE?: InputMaybe; + array_counter_MIN_EQUAL?: InputMaybe; + array_counter_MIN_GT?: InputMaybe; + array_counter_MIN_GTE?: InputMaybe; + array_counter_MIN_LT?: InputMaybe; + array_counter_MIN_LTE?: InputMaybe; + array_counter_SUM_EQUAL?: InputMaybe; + array_counter_SUM_GT?: InputMaybe; + array_counter_SUM_GTE?: InputMaybe; + array_counter_SUM_LT?: InputMaybe; + array_counter_SUM_LTE?: InputMaybe; + bit_length_AVERAGE_EQUAL?: InputMaybe; + bit_length_AVERAGE_GT?: InputMaybe; + bit_length_AVERAGE_GTE?: InputMaybe; + bit_length_AVERAGE_LT?: InputMaybe; + bit_length_AVERAGE_LTE?: InputMaybe; + bit_length_MAX_EQUAL?: InputMaybe; + bit_length_MAX_GT?: InputMaybe; + bit_length_MAX_GTE?: InputMaybe; + bit_length_MAX_LT?: InputMaybe; + bit_length_MAX_LTE?: InputMaybe; + bit_length_MIN_EQUAL?: InputMaybe; + bit_length_MIN_GT?: InputMaybe; + bit_length_MIN_GTE?: InputMaybe; + bit_length_MIN_LT?: InputMaybe; + bit_length_MIN_LTE?: InputMaybe; + bit_length_SUM_EQUAL?: InputMaybe; + bit_length_SUM_GT?: InputMaybe; + bit_length_SUM_GTE?: InputMaybe; + bit_length_SUM_LT?: InputMaybe; + bit_length_SUM_LTE?: InputMaybe; + bit_position_AVERAGE_EQUAL?: InputMaybe; + bit_position_AVERAGE_GT?: InputMaybe; + bit_position_AVERAGE_GTE?: InputMaybe; + bit_position_AVERAGE_LT?: InputMaybe; + bit_position_AVERAGE_LTE?: InputMaybe; + bit_position_MAX_EQUAL?: InputMaybe; + bit_position_MAX_GT?: InputMaybe; + bit_position_MAX_GTE?: InputMaybe; + bit_position_MAX_LT?: InputMaybe; + bit_position_MAX_LTE?: InputMaybe; + bit_position_MIN_EQUAL?: InputMaybe; + bit_position_MIN_GT?: InputMaybe; + bit_position_MIN_GTE?: InputMaybe; + bit_position_MIN_LT?: InputMaybe; + bit_position_MIN_LTE?: InputMaybe; + bit_position_SUM_EQUAL?: InputMaybe; + bit_position_SUM_GT?: InputMaybe; + bit_position_SUM_GTE?: InputMaybe; + bit_position_SUM_LT?: InputMaybe; + bit_position_SUM_LTE?: InputMaybe; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; + name_AVERAGE_LENGTH_EQUAL?: InputMaybe; + name_AVERAGE_LENGTH_GT?: InputMaybe; + name_AVERAGE_LENGTH_GTE?: InputMaybe; + name_AVERAGE_LENGTH_LT?: InputMaybe; + name_AVERAGE_LENGTH_LTE?: InputMaybe; + name_LONGEST_LENGTH_EQUAL?: InputMaybe; + name_LONGEST_LENGTH_GT?: InputMaybe; + name_LONGEST_LENGTH_GTE?: InputMaybe; + name_LONGEST_LENGTH_LT?: InputMaybe; + name_LONGEST_LENGTH_LTE?: InputMaybe; + name_SHORTEST_LENGTH_EQUAL?: InputMaybe; + name_SHORTEST_LENGTH_GT?: InputMaybe; + name_SHORTEST_LENGTH_GTE?: InputMaybe; + name_SHORTEST_LENGTH_LT?: InputMaybe; + name_SHORTEST_LENGTH_LTE?: InputMaybe; + type_AVERAGE_LENGTH_EQUAL?: InputMaybe; + type_AVERAGE_LENGTH_GT?: InputMaybe; + type_AVERAGE_LENGTH_GTE?: InputMaybe; + type_AVERAGE_LENGTH_LT?: InputMaybe; + type_AVERAGE_LENGTH_LTE?: InputMaybe; + type_LONGEST_LENGTH_EQUAL?: InputMaybe; + type_LONGEST_LENGTH_GT?: InputMaybe; + type_LONGEST_LENGTH_GTE?: InputMaybe; + type_LONGEST_LENGTH_LT?: InputMaybe; + type_LONGEST_LENGTH_LTE?: InputMaybe; + type_SHORTEST_LENGTH_EQUAL?: InputMaybe; + type_SHORTEST_LENGTH_GT?: InputMaybe; + type_SHORTEST_LENGTH_GTE?: InputMaybe; + type_SHORTEST_LENGTH_LT?: InputMaybe; + type_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type DataTypeHas_Data_TypeRelationship = { + __typename?: "DataTypeHas_data_typeRelationship"; + cursor: Scalars["String"]["output"]; + node: DataType; +}; + +export type DataTypeOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more DataTypeSort objects to sort DataTypes by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>; +}; + +/** Fields to sort DataTypes by. The order in which sorts are applied is not guaranteed when specifying many fields in one DataTypeSort object. */ +export type DataTypeSort = { + array_counter?: InputMaybe; + bit_length?: InputMaybe; + bit_position?: InputMaybe; + hash?: InputMaybe; + name?: InputMaybe; + type?: InputMaybe; +}; + +export type DataTypeWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + array_counter?: InputMaybe; + array_counter_GT?: InputMaybe; + array_counter_GTE?: InputMaybe; + array_counter_IN?: InputMaybe>>; + array_counter_LT?: InputMaybe; + array_counter_LTE?: InputMaybe; + bit_length?: InputMaybe; + bit_length_GT?: InputMaybe; + bit_length_GTE?: InputMaybe; + bit_length_IN?: InputMaybe>>; + bit_length_LT?: InputMaybe; + bit_length_LTE?: InputMaybe; + bit_position?: InputMaybe; + bit_position_GT?: InputMaybe; + bit_position_GTE?: InputMaybe; + bit_position_IN?: InputMaybe>>; + bit_position_LT?: InputMaybe; + bit_position_LTE?: InputMaybe; + has_data_type?: InputMaybe; + has_data_typeAggregate?: InputMaybe; + has_data_typeConnection?: InputMaybe; + has_data_typeConnection_NOT?: InputMaybe; + has_data_type_NOT?: InputMaybe; + hash?: InputMaybe; + hash_CONTAINS?: InputMaybe; + hash_ENDS_WITH?: InputMaybe; + hash_IN?: InputMaybe>; + hash_STARTS_WITH?: InputMaybe; + name?: InputMaybe; + name_CONTAINS?: InputMaybe; + name_ENDS_WITH?: InputMaybe; + name_IN?: InputMaybe>>; + name_STARTS_WITH?: InputMaybe; + type?: InputMaybe; + type_CONTAINS?: InputMaybe; + type_ENDS_WITH?: InputMaybe; + type_IN?: InputMaybe>; + type_STARTS_WITH?: InputMaybe; +}; + +export type DataTypesConnection = { + __typename?: "DataTypesConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type DateTimeAggregateSelection = { + __typename?: "DateTimeAggregateSelection"; + max?: Maybe; + min?: Maybe; +}; + +export type DiffItem = { + __typename?: "DiffItem"; + new_props?: Maybe; + old_props?: Maybe; + path: Scalars["String"]["output"]; + status: DiffStatus; + type: NodeType; +}; + +export type DiffNodesAtResult = { + __typename?: "DiffNodesAtResult"; + items: Array; + total_count: Scalars["Int"]["output"]; +}; + +export type DiffNodesOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + status_filter?: InputMaybe>; +}; + +export enum DiffStatus { + Del = "DEL", + Mod = "MOD", + New = "NEW", + Unchanged = "UNCHANGED", +} + +export enum EntityType { + Filesystem = "FILESYSTEM", + Registry = "REGISTRY", + Struct = "STRUCT", + Symbol = "SYMBOL", +} + +export type GitLogEntry = { + __typename?: "GitLogEntry"; + base_commit?: Maybe; + diff: DiffItem; + diffee_commit: Commit; +}; + +export type GitLogOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + order?: InputMaybe; + status_filter?: InputMaybe>; +}; + +export enum GitLogOrder { + Asc = "ASC", + Desc = "DESC", +} + +export type GitLogResult = { + __typename?: "GitLogResult"; + entries: Array; + has_more: Scalars["Boolean"]["output"]; + total_count: Scalars["Int"]["output"]; +}; + +/** + * The edge properties for the following fields: + * * Tree.child_blobs + * * Tree.child_trees + * * WinRegKey.child_values + * * WinRegKey.child_keys + */ +export type HasFilenameRel = { + __typename?: "HasFilenameRel"; + name: Scalars["String"]["output"]; +}; + +export type HasFilenameRelAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + name_AVERAGE_LENGTH_EQUAL?: InputMaybe; + name_AVERAGE_LENGTH_GT?: InputMaybe; + name_AVERAGE_LENGTH_GTE?: InputMaybe; + name_AVERAGE_LENGTH_LT?: InputMaybe; + name_AVERAGE_LENGTH_LTE?: InputMaybe; + name_LONGEST_LENGTH_EQUAL?: InputMaybe; + name_LONGEST_LENGTH_GT?: InputMaybe; + name_LONGEST_LENGTH_GTE?: InputMaybe; + name_LONGEST_LENGTH_LT?: InputMaybe; + name_LONGEST_LENGTH_LTE?: InputMaybe; + name_SHORTEST_LENGTH_EQUAL?: InputMaybe; + name_SHORTEST_LENGTH_GT?: InputMaybe; + name_SHORTEST_LENGTH_GTE?: InputMaybe; + name_SHORTEST_LENGTH_LT?: InputMaybe; + name_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type HasFilenameRelSort = { + name?: InputMaybe; +}; + +export type HasFilenameRelWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + name?: InputMaybe; + name_CONTAINS?: InputMaybe; + name_ENDS_WITH?: InputMaybe; + name_IN?: InputMaybe>; + name_STARTS_WITH?: InputMaybe; +}; + +/** + * The edge properties for the following fields: + * * Blob.has_symbol + * * Blob.has_struct + * * Symbol.blob + * * Struct.fields + * * Struct.blob + * * StructField.struct + */ +export type HasNameRel = { + __typename?: "HasNameRel"; + name: Scalars["String"]["output"]; +}; + +export type HasNameRelAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + name_AVERAGE_LENGTH_EQUAL?: InputMaybe; + name_AVERAGE_LENGTH_GT?: InputMaybe; + name_AVERAGE_LENGTH_GTE?: InputMaybe; + name_AVERAGE_LENGTH_LT?: InputMaybe; + name_AVERAGE_LENGTH_LTE?: InputMaybe; + name_LONGEST_LENGTH_EQUAL?: InputMaybe; + name_LONGEST_LENGTH_GT?: InputMaybe; + name_LONGEST_LENGTH_GTE?: InputMaybe; + name_LONGEST_LENGTH_LT?: InputMaybe; + name_LONGEST_LENGTH_LTE?: InputMaybe; + name_SHORTEST_LENGTH_EQUAL?: InputMaybe; + name_SHORTEST_LENGTH_GT?: InputMaybe; + name_SHORTEST_LENGTH_GTE?: InputMaybe; + name_SHORTEST_LENGTH_LT?: InputMaybe; + name_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type HasNameRelSort = { + name?: InputMaybe; +}; + +export type HasNameRelWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + name?: InputMaybe; + name_CONTAINS?: InputMaybe; + name_ENDS_WITH?: InputMaybe; + name_IN?: InputMaybe>; + name_STARTS_WITH?: InputMaybe; +}; + +export type Hashable = { + hash: Scalars["String"]["output"]; +}; + +export type HashableAggregateSelection = { + __typename?: "HashableAggregateSelection"; + count: Scalars["Int"]["output"]; + hash: StringAggregateSelection; +}; + +export type HashableEdge = { + __typename?: "HashableEdge"; + cursor: Scalars["String"]["output"]; + node: Hashable; +}; + +export enum HashableImplementation { + Blob = "Blob", + Commit = "Commit", + DataType = "DataType", + Struct = "Struct", + StructField = "StructField", + Symbol = "Symbol", + Tree = "Tree", + WinRegKey = "WinRegKey", + WinRegValue = "WinRegValue", +} + +export type HashableNodeProps = { + __typename?: "HashableNodeProps"; + hash: Scalars["String"]["output"]; + properties: Scalars["JSON"]["output"]; +}; + +export type HashableOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more HashableSort objects to sort Hashables by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>>; +}; + +/** Fields to sort Hashables by. The order in which sorts are applied is not guaranteed when specifying many fields in one HashableSort object. */ +export type HashableSort = { + hash?: InputMaybe; +}; + +export type HashableWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash?: InputMaybe; + hash_CONTAINS?: InputMaybe; + hash_ENDS_WITH?: InputMaybe; + hash_IN?: InputMaybe>; + hash_STARTS_WITH?: InputMaybe; + typename_IN?: InputMaybe>; +}; + +export type HashablesConnection = { + __typename?: "HashablesConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type IntAggregateSelection = { + __typename?: "IntAggregateSelection"; + average?: Maybe; + max?: Maybe; + min?: Maybe; + sum?: Maybe; +}; + +export type Mutation = { + __typename?: "Mutation"; + searchClose: Scalars["Boolean"]["output"]; +}; + +export type MutationSearchCloseArgs = { + session_id: Scalars["String"]["input"]; +}; + +export enum NodeType { + Blob = "Blob", + DataType = "DataType", + Struct = "Struct", + StructField = "StructField", + Symbol = "Symbol", + Tree = "Tree", + WinRegKey = "WinRegKey", + WinRegValue = "WinRegValue", +} + +/** Pagination information (Relay) */ +export type PageInfo = { + __typename?: "PageInfo"; + endCursor?: Maybe; + hasNextPage: Scalars["Boolean"]["output"]; + hasPreviousPage: Scalars["Boolean"]["output"]; + startCursor?: Maybe; +}; + +export type PaginatedSearchResult = { + __typename?: "PaginatedSearchResult"; + has_more: Scalars["Boolean"]["output"]; + results: Array; + session_id?: Maybe; + total_fetched: Scalars["Int"]["output"]; +}; + +export type Query = { + __typename?: "Query"; + blobs: Array; + blobsConnection: BlobsConnection; + branches: Array; + branchesAggregate: BranchAggregateSelection; + branchesConnection: BranchesConnection; + commits: Array; + commitsAggregate: CommitAggregateSelection; + commitsConnection: CommitsConnection; + dataTypes: Array; + dataTypesAggregate: DataTypeAggregateSelection; + dataTypesConnection: DataTypesConnection; + diffNodesAt: DiffNodesAtResult; + fetchCommitHistory: Array; + getBlobsWithSymbols: Array; + getCommitExtractedDataLabels: Array; + gitLog: GitLogResult; + hashables: Array; + hashablesAggregate: HashableAggregateSelection; + hashablesConnection: HashablesConnection; + search: Array; + searchNext: PaginatedSearchResult; + searchWithSession: PaginatedSearchResult; + structFields: Array; + structFieldsAggregate: StructFieldAggregateSelection; + structFieldsConnection: StructFieldsConnection; + structs: Array; + structsAggregate: StructAggregateSelection; + structsConnection: StructsConnection; + symbols: Array; + symbolsAggregate: SymbolAggregateSelection; + symbolsConnection: SymbolsConnection; + traversePath?: Maybe; + trees: Array; + treesAggregate: TreeAggregateSelection; + treesConnection: TreesConnection; + winRegKeys: Array; + winRegKeysAggregate: WinRegKeyAggregateSelection; + winRegKeysConnection: WinRegKeysConnection; + winRegValues: Array; + winRegValuesAggregate: WinRegValueAggregateSelection; + winRegValuesConnection: WinRegValuesConnection; +}; + +export type QueryBlobsArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QueryBlobsConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type QueryBranchesArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QueryBranchesAggregateArgs = { + where?: InputMaybe; +}; + +export type QueryBranchesConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type QueryCommitsArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QueryCommitsAggregateArgs = { + where?: InputMaybe; +}; + +export type QueryCommitsConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type QueryDataTypesArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QueryDataTypesAggregateArgs = { + where?: InputMaybe; +}; + +export type QueryDataTypesConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type QueryDiffNodesAtArgs = { + at_path: Scalars["String"]["input"]; + base_node_hash: Scalars["String"]["input"]; + diffee_node_hash: Scalars["String"]["input"]; + filter?: InputMaybe>; + max_depth?: InputMaybe; + options?: InputMaybe; + parent_label: Scalars["String"]["input"]; + with_intermediates?: InputMaybe; +}; + +export type QueryFetchCommitHistoryArgs = { + commit_hash: Scalars["String"]["input"]; + direction?: InputMaybe; +}; + +export type QueryGetBlobsWithSymbolsArgs = { + commit_hash: Scalars["String"]["input"]; +}; + +export type QueryGetCommitExtractedDataLabelsArgs = { + commit_hash: Scalars["String"]["input"]; +}; + +export type QueryGitLogArgs = { + commit_range: CommitRange; + context: EntityType; + options?: InputMaybe; + path: Scalars["String"]["input"]; +}; + +export type QueryHashablesArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QueryHashablesAggregateArgs = { + where?: InputMaybe; +}; + +export type QueryHashablesConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type QuerySearchArgs = { + input: SearchInput; +}; + +export type QuerySearchNextArgs = { + session_id: Scalars["String"]["input"]; +}; + +export type QuerySearchWithSessionArgs = { + input: SearchInput; + page_size?: InputMaybe; +}; + +export type QueryStructFieldsArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QueryStructFieldsAggregateArgs = { + where?: InputMaybe; +}; + +export type QueryStructFieldsConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type QueryStructsArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QueryStructsAggregateArgs = { + where?: InputMaybe; +}; + +export type QueryStructsConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type QuerySymbolsArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QuerySymbolsAggregateArgs = { + where?: InputMaybe; +}; + +export type QuerySymbolsConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type QueryTraversePathArgs = { + parent_label: Scalars["String"]["input"]; + path: Scalars["String"]["input"]; + tree_hash: Scalars["String"]["input"]; +}; + +export type QueryTreesArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QueryTreesAggregateArgs = { + where?: InputMaybe; +}; + +export type QueryTreesConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type QueryWinRegKeysArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QueryWinRegKeysAggregateArgs = { + where?: InputMaybe; +}; + +export type QueryWinRegKeysConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type QueryWinRegValuesArgs = { + options?: InputMaybe; + where?: InputMaybe; +}; + +export type QueryWinRegValuesAggregateArgs = { + where?: InputMaybe; +}; + +export type QueryWinRegValuesConnectionArgs = { + after?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>>; + where?: InputMaybe; +}; + +export type SearchInput = { + case_sensitive?: InputMaybe; + commit_range: CommitRange; + entity_types?: InputMaybe>; + search_term: Scalars["String"]["input"]; +}; + +export type SearchResult = { + __typename?: "SearchResult"; + blob_hash: Scalars["String"]["output"]; + blob_path: Scalars["String"]["output"]; + commit_hash: Scalars["String"]["output"]; + commit_name: Scalars["String"]["output"]; + entity_path?: Maybe; + node_hash: Scalars["String"]["output"]; + type: EntityType; +}; + +/** An enum for sorting in either ascending or descending order. */ +export enum SortDirection { + /** Sort by field values in ascending order. */ + Asc = "ASC", + /** Sort by field values in descending order. */ + Desc = "DESC", +} + +export type StringAggregateSelection = { + __typename?: "StringAggregateSelection"; + longest?: Maybe; + shortest?: Maybe; +}; + +export type Struct = Hashable & { + __typename?: "Struct"; + blob: Blob; + blobAggregate?: Maybe; + blobConnection: StructBlobConnection; + fields: Array; + fieldsAggregate?: Maybe; + fieldsConnection: StructFieldsConnection; + hash: Scalars["String"]["output"]; + kind: Scalars["String"]["output"]; + size: Scalars["Int"]["output"]; +}; + +export type StructBlobArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type StructBlobAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type StructBlobConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type StructFieldsArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type StructFieldsAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type StructFieldsConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type StructAggregateSelection = { + __typename?: "StructAggregateSelection"; + count: Scalars["Int"]["output"]; + hash: StringAggregateSelection; + kind: StringAggregateSelection; + size: IntAggregateSelection; +}; + +export type StructBlobAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type StructBlobBlobAggregationSelection = { + __typename?: "StructBlobBlobAggregationSelection"; + count: Scalars["Int"]["output"]; + edge?: Maybe; + node?: Maybe; +}; + +export type StructBlobBlobEdgeAggregateSelection = { + __typename?: "StructBlobBlobEdgeAggregateSelection"; + name: StringAggregateSelection; +}; + +export type StructBlobBlobNodeAggregateSelection = { + __typename?: "StructBlobBlobNodeAggregateSelection"; + hash: StringAggregateSelection; +}; + +export type StructBlobConnection = { + __typename?: "StructBlobConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type StructBlobConnectionSort = { + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type StructBlobConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type StructBlobNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type StructBlobRelationship = { + __typename?: "StructBlobRelationship"; + cursor: Scalars["String"]["output"]; + node: Blob; + properties: HasNameRel; +}; + +export type StructEdge = { + __typename?: "StructEdge"; + cursor: Scalars["String"]["output"]; + node: Struct; +}; + +export type StructField = Hashable & { + __typename?: "StructField"; + data_type: Scalars["JSON"]["output"]; + hash: Scalars["String"]["output"]; + offset: Scalars["Int"]["output"]; + struct: Struct; + structAggregate?: Maybe; + structConnection: StructFieldStructConnection; +}; + +export type StructFieldStructArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type StructFieldStructAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type StructFieldStructConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type StructFieldAggregateSelection = { + __typename?: "StructFieldAggregateSelection"; + count: Scalars["Int"]["output"]; + hash: StringAggregateSelection; + offset: IntAggregateSelection; +}; + +export type StructFieldEdge = { + __typename?: "StructFieldEdge"; + cursor: Scalars["String"]["output"]; + node: StructField; +}; + +export type StructFieldOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more StructFieldSort objects to sort StructFields by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>; +}; + +/** Fields to sort StructFields by. The order in which sorts are applied is not guaranteed when specifying many fields in one StructFieldSort object. */ +export type StructFieldSort = { + data_type?: InputMaybe; + hash?: InputMaybe; + offset?: InputMaybe; +}; + +export type StructFieldStructAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type StructFieldStructConnection = { + __typename?: "StructFieldStructConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type StructFieldStructConnectionSort = { + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type StructFieldStructConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type StructFieldStructNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; + kind_AVERAGE_LENGTH_EQUAL?: InputMaybe; + kind_AVERAGE_LENGTH_GT?: InputMaybe; + kind_AVERAGE_LENGTH_GTE?: InputMaybe; + kind_AVERAGE_LENGTH_LT?: InputMaybe; + kind_AVERAGE_LENGTH_LTE?: InputMaybe; + kind_LONGEST_LENGTH_EQUAL?: InputMaybe; + kind_LONGEST_LENGTH_GT?: InputMaybe; + kind_LONGEST_LENGTH_GTE?: InputMaybe; + kind_LONGEST_LENGTH_LT?: InputMaybe; + kind_LONGEST_LENGTH_LTE?: InputMaybe; + kind_SHORTEST_LENGTH_EQUAL?: InputMaybe; + kind_SHORTEST_LENGTH_GT?: InputMaybe; + kind_SHORTEST_LENGTH_GTE?: InputMaybe; + kind_SHORTEST_LENGTH_LT?: InputMaybe; + kind_SHORTEST_LENGTH_LTE?: InputMaybe; + size_AVERAGE_EQUAL?: InputMaybe; + size_AVERAGE_GT?: InputMaybe; + size_AVERAGE_GTE?: InputMaybe; + size_AVERAGE_LT?: InputMaybe; + size_AVERAGE_LTE?: InputMaybe; + size_MAX_EQUAL?: InputMaybe; + size_MAX_GT?: InputMaybe; + size_MAX_GTE?: InputMaybe; + size_MAX_LT?: InputMaybe; + size_MAX_LTE?: InputMaybe; + size_MIN_EQUAL?: InputMaybe; + size_MIN_GT?: InputMaybe; + size_MIN_GTE?: InputMaybe; + size_MIN_LT?: InputMaybe; + size_MIN_LTE?: InputMaybe; + size_SUM_EQUAL?: InputMaybe; + size_SUM_GT?: InputMaybe; + size_SUM_GTE?: InputMaybe; + size_SUM_LT?: InputMaybe; + size_SUM_LTE?: InputMaybe; +}; + +export type StructFieldStructRelationship = { + __typename?: "StructFieldStructRelationship"; + cursor: Scalars["String"]["output"]; + node: Struct; + properties: HasNameRel; +}; + +export type StructFieldStructStructAggregationSelection = { + __typename?: "StructFieldStructStructAggregationSelection"; + count: Scalars["Int"]["output"]; + edge?: Maybe; + node?: Maybe; +}; + +export type StructFieldStructStructEdgeAggregateSelection = { + __typename?: "StructFieldStructStructEdgeAggregateSelection"; + name: StringAggregateSelection; +}; + +export type StructFieldStructStructNodeAggregateSelection = { + __typename?: "StructFieldStructStructNodeAggregateSelection"; + hash: StringAggregateSelection; + kind: StringAggregateSelection; + size: IntAggregateSelection; +}; + +export type StructFieldWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + data_type?: InputMaybe; + data_type_IN?: InputMaybe>; + hash?: InputMaybe; + hash_CONTAINS?: InputMaybe; + hash_ENDS_WITH?: InputMaybe; + hash_IN?: InputMaybe>; + hash_STARTS_WITH?: InputMaybe; + offset?: InputMaybe; + offset_GT?: InputMaybe; + offset_GTE?: InputMaybe; + offset_IN?: InputMaybe>; + offset_LT?: InputMaybe; + offset_LTE?: InputMaybe; + struct?: InputMaybe; + structAggregate?: InputMaybe; + structConnection?: InputMaybe; + structConnection_NOT?: InputMaybe; + struct_NOT?: InputMaybe; +}; + +export type StructFieldsAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type StructFieldsConnection = { + __typename?: "StructFieldsConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type StructFieldsConnectionSort = { + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type StructFieldsConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type StructFieldsNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; + offset_AVERAGE_EQUAL?: InputMaybe; + offset_AVERAGE_GT?: InputMaybe; + offset_AVERAGE_GTE?: InputMaybe; + offset_AVERAGE_LT?: InputMaybe; + offset_AVERAGE_LTE?: InputMaybe; + offset_MAX_EQUAL?: InputMaybe; + offset_MAX_GT?: InputMaybe; + offset_MAX_GTE?: InputMaybe; + offset_MAX_LT?: InputMaybe; + offset_MAX_LTE?: InputMaybe; + offset_MIN_EQUAL?: InputMaybe; + offset_MIN_GT?: InputMaybe; + offset_MIN_GTE?: InputMaybe; + offset_MIN_LT?: InputMaybe; + offset_MIN_LTE?: InputMaybe; + offset_SUM_EQUAL?: InputMaybe; + offset_SUM_GT?: InputMaybe; + offset_SUM_GTE?: InputMaybe; + offset_SUM_LT?: InputMaybe; + offset_SUM_LTE?: InputMaybe; +}; + +export type StructFieldsRelationship = { + __typename?: "StructFieldsRelationship"; + cursor: Scalars["String"]["output"]; + node: StructField; + properties: HasNameRel; +}; + +export type StructOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more StructSort objects to sort Structs by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>; +}; + +/** Fields to sort Structs by. The order in which sorts are applied is not guaranteed when specifying many fields in one StructSort object. */ +export type StructSort = { + hash?: InputMaybe; + kind?: InputMaybe; + size?: InputMaybe; +}; + +export type StructStructFieldFieldsAggregationSelection = { + __typename?: "StructStructFieldFieldsAggregationSelection"; + count: Scalars["Int"]["output"]; + edge?: Maybe; + node?: Maybe; +}; + +export type StructStructFieldFieldsEdgeAggregateSelection = { + __typename?: "StructStructFieldFieldsEdgeAggregateSelection"; + name: StringAggregateSelection; +}; + +export type StructStructFieldFieldsNodeAggregateSelection = { + __typename?: "StructStructFieldFieldsNodeAggregateSelection"; + hash: StringAggregateSelection; + offset: IntAggregateSelection; +}; + +export type StructWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + blob?: InputMaybe; + blobAggregate?: InputMaybe; + blobConnection?: InputMaybe; + blobConnection_NOT?: InputMaybe; + blob_NOT?: InputMaybe; + fieldsAggregate?: InputMaybe; + /** Return Structs where all of the related StructFieldsConnections match this filter */ + fieldsConnection_ALL?: InputMaybe; + /** Return Structs where none of the related StructFieldsConnections match this filter */ + fieldsConnection_NONE?: InputMaybe; + /** Return Structs where one of the related StructFieldsConnections match this filter */ + fieldsConnection_SINGLE?: InputMaybe; + /** Return Structs where some of the related StructFieldsConnections match this filter */ + fieldsConnection_SOME?: InputMaybe; + /** Return Structs where all of the related StructFields match this filter */ + fields_ALL?: InputMaybe; + /** Return Structs where none of the related StructFields match this filter */ + fields_NONE?: InputMaybe; + /** Return Structs where one of the related StructFields match this filter */ + fields_SINGLE?: InputMaybe; + /** Return Structs where some of the related StructFields match this filter */ + fields_SOME?: InputMaybe; + hash?: InputMaybe; + hash_CONTAINS?: InputMaybe; + hash_ENDS_WITH?: InputMaybe; + hash_IN?: InputMaybe>; + hash_STARTS_WITH?: InputMaybe; + kind?: InputMaybe; + kind_CONTAINS?: InputMaybe; + kind_ENDS_WITH?: InputMaybe; + kind_IN?: InputMaybe>; + kind_STARTS_WITH?: InputMaybe; + size?: InputMaybe; + size_GT?: InputMaybe; + size_GTE?: InputMaybe; + size_IN?: InputMaybe>; + size_LT?: InputMaybe; + size_LTE?: InputMaybe; +}; + +export type StructsConnection = { + __typename?: "StructsConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type Subscription = { + __typename?: "Subscription"; + gitLogStream: GitLogEntry; + searchStream: SearchResult; +}; + +export type SubscriptionGitLogStreamArgs = { + commit_range: CommitRange; + context: EntityType; + options?: InputMaybe; + path: Scalars["String"]["input"]; +}; + +export type SubscriptionSearchStreamArgs = { + input: SearchInput; +}; + +export type Symbol = Hashable & { + __typename?: "Symbol"; + address: Scalars["String"]["output"]; + blob: Blob; + blobAggregate?: Maybe; + blobConnection: SymbolBlobConnection; + hash: Scalars["String"]["output"]; +}; + +export type SymbolBlobArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type SymbolBlobAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type SymbolBlobConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type SymbolAggregateSelection = { + __typename?: "SymbolAggregateSelection"; + address: StringAggregateSelection; + count: Scalars["Int"]["output"]; + hash: StringAggregateSelection; +}; + +export type SymbolBlobAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type SymbolBlobBlobAggregationSelection = { + __typename?: "SymbolBlobBlobAggregationSelection"; + count: Scalars["Int"]["output"]; + edge?: Maybe; + node?: Maybe; +}; + +export type SymbolBlobBlobEdgeAggregateSelection = { + __typename?: "SymbolBlobBlobEdgeAggregateSelection"; + name: StringAggregateSelection; +}; + +export type SymbolBlobBlobNodeAggregateSelection = { + __typename?: "SymbolBlobBlobNodeAggregateSelection"; + hash: StringAggregateSelection; +}; + +export type SymbolBlobConnection = { + __typename?: "SymbolBlobConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type SymbolBlobConnectionSort = { + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type SymbolBlobConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type SymbolBlobNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type SymbolBlobRelationship = { + __typename?: "SymbolBlobRelationship"; + cursor: Scalars["String"]["output"]; + node: Blob; + properties: HasNameRel; +}; + +export type SymbolEdge = { + __typename?: "SymbolEdge"; + cursor: Scalars["String"]["output"]; + node: Symbol; +}; + +export type SymbolOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more SymbolSort objects to sort Symbols by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>; +}; + +/** Fields to sort Symbols by. The order in which sorts are applied is not guaranteed when specifying many fields in one SymbolSort object. */ +export type SymbolSort = { + address?: InputMaybe; + hash?: InputMaybe; +}; + +export type SymbolWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + address?: InputMaybe; + address_CONTAINS?: InputMaybe; + address_ENDS_WITH?: InputMaybe; + address_IN?: InputMaybe>; + address_STARTS_WITH?: InputMaybe; + blob?: InputMaybe; + blobAggregate?: InputMaybe; + blobConnection?: InputMaybe; + blobConnection_NOT?: InputMaybe; + blob_NOT?: InputMaybe; + hash?: InputMaybe; + hash_CONTAINS?: InputMaybe; + hash_ENDS_WITH?: InputMaybe; + hash_IN?: InputMaybe>; + hash_STARTS_WITH?: InputMaybe; +}; + +export type SymbolsConnection = { + __typename?: "SymbolsConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type Tree = Hashable & { + __typename?: "Tree"; + child_blobs: Array; + child_blobsAggregate?: Maybe; + child_blobsConnection: TreeChild_BlobsConnection; + child_trees: Array; + child_treesAggregate?: Maybe; + child_treesConnection: TreeChild_TreesConnection; + hash: Scalars["String"]["output"]; +}; + +export type TreeChild_BlobsArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type TreeChild_BlobsAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type TreeChild_BlobsConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type TreeChild_TreesArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type TreeChild_TreesAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type TreeChild_TreesConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type TreeAggregateSelection = { + __typename?: "TreeAggregateSelection"; + count: Scalars["Int"]["output"]; + hash: StringAggregateSelection; +}; + +export type TreeBlobChild_BlobsAggregationSelection = { + __typename?: "TreeBlobChild_blobsAggregationSelection"; + count: Scalars["Int"]["output"]; + edge?: Maybe; + node?: Maybe; +}; + +export type TreeBlobChild_BlobsEdgeAggregateSelection = { + __typename?: "TreeBlobChild_blobsEdgeAggregateSelection"; + name: StringAggregateSelection; +}; + +export type TreeBlobChild_BlobsNodeAggregateSelection = { + __typename?: "TreeBlobChild_blobsNodeAggregateSelection"; + hash: StringAggregateSelection; +}; + +export type TreeChild_BlobsAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type TreeChild_BlobsConnection = { + __typename?: "TreeChild_blobsConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type TreeChild_BlobsConnectionSort = { + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type TreeChild_BlobsConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type TreeChild_BlobsNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type TreeChild_BlobsRelationship = { + __typename?: "TreeChild_blobsRelationship"; + cursor: Scalars["String"]["output"]; + node: Blob; + properties: HasFilenameRel; +}; + +export type TreeChild_TreesAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type TreeChild_TreesConnection = { + __typename?: "TreeChild_treesConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type TreeChild_TreesConnectionSort = { + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type TreeChild_TreesConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type TreeChild_TreesNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type TreeChild_TreesRelationship = { + __typename?: "TreeChild_treesRelationship"; + cursor: Scalars["String"]["output"]; + node: Tree; + properties: HasFilenameRel; +}; + +export type TreeEdge = { + __typename?: "TreeEdge"; + cursor: Scalars["String"]["output"]; + node: Tree; +}; + +export type TreeOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more TreeSort objects to sort Trees by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>; +}; + +/** Fields to sort Trees by. The order in which sorts are applied is not guaranteed when specifying many fields in one TreeSort object. */ +export type TreeSort = { + hash?: InputMaybe; +}; + +export type TreeTreeChild_TreesAggregationSelection = { + __typename?: "TreeTreeChild_treesAggregationSelection"; + count: Scalars["Int"]["output"]; + edge?: Maybe; + node?: Maybe; +}; + +export type TreeTreeChild_TreesEdgeAggregateSelection = { + __typename?: "TreeTreeChild_treesEdgeAggregateSelection"; + name: StringAggregateSelection; +}; + +export type TreeTreeChild_TreesNodeAggregateSelection = { + __typename?: "TreeTreeChild_treesNodeAggregateSelection"; + hash: StringAggregateSelection; +}; + +export type TreeWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + child_blobsAggregate?: InputMaybe; + /** Return Trees where all of the related TreeChild_blobsConnections match this filter */ + child_blobsConnection_ALL?: InputMaybe; + /** Return Trees where none of the related TreeChild_blobsConnections match this filter */ + child_blobsConnection_NONE?: InputMaybe; + /** Return Trees where one of the related TreeChild_blobsConnections match this filter */ + child_blobsConnection_SINGLE?: InputMaybe; + /** Return Trees where some of the related TreeChild_blobsConnections match this filter */ + child_blobsConnection_SOME?: InputMaybe; + /** Return Trees where all of the related Blobs match this filter */ + child_blobs_ALL?: InputMaybe; + /** Return Trees where none of the related Blobs match this filter */ + child_blobs_NONE?: InputMaybe; + /** Return Trees where one of the related Blobs match this filter */ + child_blobs_SINGLE?: InputMaybe; + /** Return Trees where some of the related Blobs match this filter */ + child_blobs_SOME?: InputMaybe; + child_treesAggregate?: InputMaybe; + /** Return Trees where all of the related TreeChild_treesConnections match this filter */ + child_treesConnection_ALL?: InputMaybe; + /** Return Trees where none of the related TreeChild_treesConnections match this filter */ + child_treesConnection_NONE?: InputMaybe; + /** Return Trees where one of the related TreeChild_treesConnections match this filter */ + child_treesConnection_SINGLE?: InputMaybe; + /** Return Trees where some of the related TreeChild_treesConnections match this filter */ + child_treesConnection_SOME?: InputMaybe; + /** Return Trees where all of the related Trees match this filter */ + child_trees_ALL?: InputMaybe; + /** Return Trees where none of the related Trees match this filter */ + child_trees_NONE?: InputMaybe; + /** Return Trees where one of the related Trees match this filter */ + child_trees_SINGLE?: InputMaybe; + /** Return Trees where some of the related Trees match this filter */ + child_trees_SOME?: InputMaybe; + hash?: InputMaybe; + hash_CONTAINS?: InputMaybe; + hash_ENDS_WITH?: InputMaybe; + hash_IN?: InputMaybe>; + hash_STARTS_WITH?: InputMaybe; +}; + +export type TreesConnection = { + __typename?: "TreesConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type WinRegKey = Hashable & { + __typename?: "WinRegKey"; + child_keys: Array; + child_keysAggregate?: Maybe; + child_keysConnection: WinRegKeyChild_KeysConnection; + child_values: Array; + child_valuesAggregate?: Maybe; + child_valuesConnection: WinRegKeyChild_ValuesConnection; + hash: Scalars["String"]["output"]; +}; + +export type WinRegKeyChild_KeysArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type WinRegKeyChild_KeysAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type WinRegKeyChild_KeysConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type WinRegKeyChild_ValuesArgs = { + directed?: InputMaybe; + options?: InputMaybe; + where?: InputMaybe; +}; + +export type WinRegKeyChild_ValuesAggregateArgs = { + directed?: InputMaybe; + where?: InputMaybe; +}; + +export type WinRegKeyChild_ValuesConnectionArgs = { + after?: InputMaybe; + directed?: InputMaybe; + first?: InputMaybe; + sort?: InputMaybe>; + where?: InputMaybe; +}; + +export type WinRegKeyAggregateSelection = { + __typename?: "WinRegKeyAggregateSelection"; + count: Scalars["Int"]["output"]; + hash: StringAggregateSelection; +}; + +export type WinRegKeyChild_KeysAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type WinRegKeyChild_KeysConnection = { + __typename?: "WinRegKeyChild_keysConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type WinRegKeyChild_KeysConnectionSort = { + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type WinRegKeyChild_KeysConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type WinRegKeyChild_KeysNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type WinRegKeyChild_KeysRelationship = { + __typename?: "WinRegKeyChild_keysRelationship"; + cursor: Scalars["String"]["output"]; + node: WinRegKey; + properties: HasFilenameRel; +}; + +export type WinRegKeyChild_ValuesAggregateInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + count?: InputMaybe; + count_GT?: InputMaybe; + count_GTE?: InputMaybe; + count_LT?: InputMaybe; + count_LTE?: InputMaybe; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type WinRegKeyChild_ValuesConnection = { + __typename?: "WinRegKeyChild_valuesConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type WinRegKeyChild_ValuesConnectionSort = { + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type WinRegKeyChild_ValuesConnectionWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + edge?: InputMaybe; + node?: InputMaybe; +}; + +export type WinRegKeyChild_ValuesNodeAggregationWhereInput = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash_AVERAGE_LENGTH_EQUAL?: InputMaybe; + hash_AVERAGE_LENGTH_GT?: InputMaybe; + hash_AVERAGE_LENGTH_GTE?: InputMaybe; + hash_AVERAGE_LENGTH_LT?: InputMaybe; + hash_AVERAGE_LENGTH_LTE?: InputMaybe; + hash_LONGEST_LENGTH_EQUAL?: InputMaybe; + hash_LONGEST_LENGTH_GT?: InputMaybe; + hash_LONGEST_LENGTH_GTE?: InputMaybe; + hash_LONGEST_LENGTH_LT?: InputMaybe; + hash_LONGEST_LENGTH_LTE?: InputMaybe; + hash_SHORTEST_LENGTH_EQUAL?: InputMaybe; + hash_SHORTEST_LENGTH_GT?: InputMaybe; + hash_SHORTEST_LENGTH_GTE?: InputMaybe; + hash_SHORTEST_LENGTH_LT?: InputMaybe; + hash_SHORTEST_LENGTH_LTE?: InputMaybe; + type_AVERAGE_LENGTH_EQUAL?: InputMaybe; + type_AVERAGE_LENGTH_GT?: InputMaybe; + type_AVERAGE_LENGTH_GTE?: InputMaybe; + type_AVERAGE_LENGTH_LT?: InputMaybe; + type_AVERAGE_LENGTH_LTE?: InputMaybe; + type_LONGEST_LENGTH_EQUAL?: InputMaybe; + type_LONGEST_LENGTH_GT?: InputMaybe; + type_LONGEST_LENGTH_GTE?: InputMaybe; + type_LONGEST_LENGTH_LT?: InputMaybe; + type_LONGEST_LENGTH_LTE?: InputMaybe; + type_SHORTEST_LENGTH_EQUAL?: InputMaybe; + type_SHORTEST_LENGTH_GT?: InputMaybe; + type_SHORTEST_LENGTH_GTE?: InputMaybe; + type_SHORTEST_LENGTH_LT?: InputMaybe; + type_SHORTEST_LENGTH_LTE?: InputMaybe; + value_AVERAGE_LENGTH_EQUAL?: InputMaybe; + value_AVERAGE_LENGTH_GT?: InputMaybe; + value_AVERAGE_LENGTH_GTE?: InputMaybe; + value_AVERAGE_LENGTH_LT?: InputMaybe; + value_AVERAGE_LENGTH_LTE?: InputMaybe; + value_LONGEST_LENGTH_EQUAL?: InputMaybe; + value_LONGEST_LENGTH_GT?: InputMaybe; + value_LONGEST_LENGTH_GTE?: InputMaybe; + value_LONGEST_LENGTH_LT?: InputMaybe; + value_LONGEST_LENGTH_LTE?: InputMaybe; + value_SHORTEST_LENGTH_EQUAL?: InputMaybe; + value_SHORTEST_LENGTH_GT?: InputMaybe; + value_SHORTEST_LENGTH_GTE?: InputMaybe; + value_SHORTEST_LENGTH_LT?: InputMaybe; + value_SHORTEST_LENGTH_LTE?: InputMaybe; +}; + +export type WinRegKeyChild_ValuesRelationship = { + __typename?: "WinRegKeyChild_valuesRelationship"; + cursor: Scalars["String"]["output"]; + node: WinRegValue; + properties: HasFilenameRel; +}; + +export type WinRegKeyEdge = { + __typename?: "WinRegKeyEdge"; + cursor: Scalars["String"]["output"]; + node: WinRegKey; +}; + +export type WinRegKeyOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more WinRegKeySort objects to sort WinRegKeys by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>; +}; + +/** Fields to sort WinRegKeys by. The order in which sorts are applied is not guaranteed when specifying many fields in one WinRegKeySort object. */ +export type WinRegKeySort = { + hash?: InputMaybe; +}; + +export type WinRegKeyWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + child_keysAggregate?: InputMaybe; + /** Return WinRegKeys where all of the related WinRegKeyChild_keysConnections match this filter */ + child_keysConnection_ALL?: InputMaybe; + /** Return WinRegKeys where none of the related WinRegKeyChild_keysConnections match this filter */ + child_keysConnection_NONE?: InputMaybe; + /** Return WinRegKeys where one of the related WinRegKeyChild_keysConnections match this filter */ + child_keysConnection_SINGLE?: InputMaybe; + /** Return WinRegKeys where some of the related WinRegKeyChild_keysConnections match this filter */ + child_keysConnection_SOME?: InputMaybe; + /** Return WinRegKeys where all of the related WinRegKeys match this filter */ + child_keys_ALL?: InputMaybe; + /** Return WinRegKeys where none of the related WinRegKeys match this filter */ + child_keys_NONE?: InputMaybe; + /** Return WinRegKeys where one of the related WinRegKeys match this filter */ + child_keys_SINGLE?: InputMaybe; + /** Return WinRegKeys where some of the related WinRegKeys match this filter */ + child_keys_SOME?: InputMaybe; + child_valuesAggregate?: InputMaybe; + /** Return WinRegKeys where all of the related WinRegKeyChild_valuesConnections match this filter */ + child_valuesConnection_ALL?: InputMaybe; + /** Return WinRegKeys where none of the related WinRegKeyChild_valuesConnections match this filter */ + child_valuesConnection_NONE?: InputMaybe; + /** Return WinRegKeys where one of the related WinRegKeyChild_valuesConnections match this filter */ + child_valuesConnection_SINGLE?: InputMaybe; + /** Return WinRegKeys where some of the related WinRegKeyChild_valuesConnections match this filter */ + child_valuesConnection_SOME?: InputMaybe; + /** Return WinRegKeys where all of the related WinRegValues match this filter */ + child_values_ALL?: InputMaybe; + /** Return WinRegKeys where none of the related WinRegValues match this filter */ + child_values_NONE?: InputMaybe; + /** Return WinRegKeys where one of the related WinRegValues match this filter */ + child_values_SINGLE?: InputMaybe; + /** Return WinRegKeys where some of the related WinRegValues match this filter */ + child_values_SOME?: InputMaybe; + hash?: InputMaybe; + hash_CONTAINS?: InputMaybe; + hash_ENDS_WITH?: InputMaybe; + hash_IN?: InputMaybe>; + hash_STARTS_WITH?: InputMaybe; +}; + +export type WinRegKeyWinRegKeyChild_KeysAggregationSelection = { + __typename?: "WinRegKeyWinRegKeyChild_keysAggregationSelection"; + count: Scalars["Int"]["output"]; + edge?: Maybe; + node?: Maybe; +}; + +export type WinRegKeyWinRegKeyChild_KeysEdgeAggregateSelection = { + __typename?: "WinRegKeyWinRegKeyChild_keysEdgeAggregateSelection"; + name: StringAggregateSelection; +}; + +export type WinRegKeyWinRegKeyChild_KeysNodeAggregateSelection = { + __typename?: "WinRegKeyWinRegKeyChild_keysNodeAggregateSelection"; + hash: StringAggregateSelection; +}; + +export type WinRegKeyWinRegValueChild_ValuesAggregationSelection = { + __typename?: "WinRegKeyWinRegValueChild_valuesAggregationSelection"; + count: Scalars["Int"]["output"]; + edge?: Maybe; + node?: Maybe; +}; + +export type WinRegKeyWinRegValueChild_ValuesEdgeAggregateSelection = { + __typename?: "WinRegKeyWinRegValueChild_valuesEdgeAggregateSelection"; + name: StringAggregateSelection; +}; + +export type WinRegKeyWinRegValueChild_ValuesNodeAggregateSelection = { + __typename?: "WinRegKeyWinRegValueChild_valuesNodeAggregateSelection"; + hash: StringAggregateSelection; + type: StringAggregateSelection; + value: StringAggregateSelection; +}; + +export type WinRegKeysConnection = { + __typename?: "WinRegKeysConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type WinRegValue = Hashable & { + __typename?: "WinRegValue"; + hash: Scalars["String"]["output"]; + type: Scalars["String"]["output"]; + value: Scalars["String"]["output"]; +}; + +export type WinRegValueAggregateSelection = { + __typename?: "WinRegValueAggregateSelection"; + count: Scalars["Int"]["output"]; + hash: StringAggregateSelection; + type: StringAggregateSelection; + value: StringAggregateSelection; +}; + +export type WinRegValueEdge = { + __typename?: "WinRegValueEdge"; + cursor: Scalars["String"]["output"]; + node: WinRegValue; +}; + +export type WinRegValueOptions = { + limit?: InputMaybe; + offset?: InputMaybe; + /** Specify one or more WinRegValueSort objects to sort WinRegValues by. The sorts will be applied in the order in which they are arranged in the array. */ + sort?: InputMaybe>; +}; + +/** Fields to sort WinRegValues by. The order in which sorts are applied is not guaranteed when specifying many fields in one WinRegValueSort object. */ +export type WinRegValueSort = { + hash?: InputMaybe; + type?: InputMaybe; + value?: InputMaybe; +}; + +export type WinRegValueWhere = { + AND?: InputMaybe>; + NOT?: InputMaybe; + OR?: InputMaybe>; + hash?: InputMaybe; + hash_CONTAINS?: InputMaybe; + hash_ENDS_WITH?: InputMaybe; + hash_IN?: InputMaybe>; + hash_STARTS_WITH?: InputMaybe; + type?: InputMaybe; + type_CONTAINS?: InputMaybe; + type_ENDS_WITH?: InputMaybe; + type_IN?: InputMaybe>; + type_STARTS_WITH?: InputMaybe; + value?: InputMaybe; + value_CONTAINS?: InputMaybe; + value_ENDS_WITH?: InputMaybe; + value_IN?: InputMaybe>; + value_STARTS_WITH?: InputMaybe; +}; + +export type WinRegValuesConnection = { + __typename?: "WinRegValuesConnection"; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars["Int"]["output"]; +}; + +export type FetchBranchesQueryVariables = Exact<{ [key: string]: never }>; + +export type FetchBranchesQuery = { + __typename?: "Query"; + branches: Array<{ + __typename?: "Branch"; + name: string; + tracks?: { + __typename?: "Commit"; + hash: string; + name: string; + date: any; + } | null; + }>; +}; + +export type ResolveCommitRefQueryVariables = Exact<{ + ref: Scalars["String"]["input"]; +}>; + +export type ResolveCommitRefQuery = { + __typename?: "Query"; + branches: Array<{ + __typename?: "Branch"; + name: string; + tracks?: { + __typename?: "Commit"; + hash: string; + filesystem?: { __typename?: "Tree"; hash: string } | null; + } | null; + }>; + commits: Array<{ + __typename?: "Commit"; + hash: string; + filesystem?: { __typename?: "Tree"; hash: string } | null; + }>; +}; + +export type SearchQueryVariables = Exact<{ + input: SearchInput; +}>; + +export type SearchQuery = { + __typename?: "Query"; + search: Array<{ + __typename?: "SearchResult"; + type: EntityType; + commit_name: string; + commit_hash: string; + blob_path: string; + blob_hash: string; + entity_path?: string | null; + node_hash: string; + }>; +}; + +export type FetchCommitHistoryQueryVariables = Exact<{ + commitHash: Scalars["String"]["input"]; + direction?: InputMaybe; +}>; + +export type FetchCommitHistoryQuery = { + __typename?: "Query"; + fetchCommitHistory: Array<{ + __typename?: "Commit"; + hash: string; + name: string; + description?: string | null; + date: any; + previous?: { __typename?: "Commit"; hash: string } | null; + next: Array<{ __typename?: "Commit"; hash: string }>; + }>; +}; + +export type DiffNodesAtQueryVariables = Exact<{ + parentLabel: Scalars["String"]["input"]; + baseNodeHash: Scalars["String"]["input"]; + diffeeNodeHash: Scalars["String"]["input"]; + atPath: Scalars["String"]["input"]; + maxDepth?: InputMaybe; + withIntermediates?: InputMaybe; + filter?: InputMaybe< + Array | Scalars["String"]["input"] + >; + options?: InputMaybe; +}>; + +export type DiffNodesAtQuery = { + __typename?: "Query"; + diffNodesAt: { + __typename?: "DiffNodesAtResult"; + total_count: number; + items: Array<{ + __typename?: "DiffItem"; + status: DiffStatus; + path: string; + type: NodeType; + old_props?: { + __typename?: "HashableNodeProps"; + hash: string; + properties: any; + } | null; + new_props?: { + __typename?: "HashableNodeProps"; + hash: string; + properties: any; + } | null; + }>; + }; +}; + +export type TraversePathQueryVariables = Exact<{ + parentLabel: Scalars["String"]["input"]; + treeHash: Scalars["String"]["input"]; + path: Scalars["String"]["input"]; +}>; + +export type TraversePathQuery = { + __typename?: "Query"; + traversePath?: string | null; +}; + +export type GetBlobWinRegRootQueryVariables = Exact<{ + hash: Scalars["String"]["input"]; +}>; + +export type GetBlobWinRegRootQuery = { + __typename?: "Query"; + blobs: Array<{ + __typename?: "Blob"; + hash: string; + has_winreg?: { __typename?: "WinRegKey"; hash: string } | null; + }>; +}; + +export type GetBlobsWithSymbolsQueryVariables = Exact<{ + commitHash: Scalars["String"]["input"]; +}>; + +export type GetBlobsWithSymbolsQuery = { + __typename?: "Query"; + getBlobsWithSymbols: Array<{ + __typename?: "BlobWithSymbols"; + blob_hash: string; + blob_path: string; + }>; +}; + +export type SearchWithSessionQueryVariables = Exact<{ + input: SearchInput; + pageSize?: InputMaybe; +}>; + +export type SearchWithSessionQuery = { + __typename?: "Query"; + searchWithSession: { + __typename?: "PaginatedSearchResult"; + session_id?: string | null; + has_more: boolean; + total_fetched: number; + results: Array<{ + __typename?: "SearchResult"; + type: EntityType; + commit_name: string; + commit_hash: string; + blob_path: string; + blob_hash: string; + entity_path?: string | null; + node_hash: string; + }>; + }; +}; + +export type SearchNextQueryVariables = Exact<{ + sessionId: Scalars["String"]["input"]; +}>; + +export type SearchNextQuery = { + __typename?: "Query"; + searchNext: { + __typename?: "PaginatedSearchResult"; + session_id?: string | null; + has_more: boolean; + total_fetched: number; + results: Array<{ + __typename?: "SearchResult"; + type: EntityType; + commit_name: string; + commit_hash: string; + blob_path: string; + blob_hash: string; + entity_path?: string | null; + node_hash: string; + }>; + }; +}; + +export type SearchCloseMutationVariables = Exact<{ + sessionId: Scalars["String"]["input"]; +}>; + +export type SearchCloseMutation = { + __typename?: "Mutation"; + searchClose: boolean; +}; + +export type FetchStructByNameQueryVariables = Exact<{ + blobHash: Scalars["String"]["input"]; + structName: Scalars["String"]["input"]; +}>; + +export type FetchStructByNameQuery = { + __typename?: "Query"; + blobs: Array<{ + __typename?: "Blob"; + has_structConnection: { + __typename?: "BlobHas_structConnection"; + edges: Array<{ + __typename?: "BlobHas_structRelationship"; + properties: { __typename?: "HasNameRel"; name: string }; + node: { + __typename?: "Struct"; + hash: string; + size: number; + kind: string; + }; + }>; + }; + }>; +}; + +export type FetchStructFieldsQueryVariables = Exact<{ + structHash: Scalars["String"]["input"]; +}>; + +export type FetchStructFieldsQuery = { + __typename?: "Query"; + structs: Array<{ + __typename?: "Struct"; + fieldsConnection: { + __typename?: "StructFieldsConnection"; + totalCount: number; + edges: Array<{ + __typename?: "StructFieldsRelationship"; + properties: { __typename?: "HasNameRel"; name: string }; + node: { + __typename?: "StructField"; + hash: string; + offset: number; + data_type: any; + }; + }>; + }; + }>; +}; + +export type ListStructsQueryVariables = Exact<{ + blobHash: Scalars["String"]["input"]; + first?: InputMaybe; + after?: InputMaybe; +}>; + +export type ListStructsQuery = { + __typename?: "Query"; + blobs: Array<{ + __typename?: "Blob"; + has_structConnection: { + __typename?: "BlobHas_structConnection"; + totalCount: number; + edges: Array<{ + __typename?: "BlobHas_structRelationship"; + properties: { __typename?: "HasNameRel"; name: string }; + node: { + __typename?: "Struct"; + hash: string; + size: number; + kind: string; + }; + }>; + pageInfo: { + __typename?: "PageInfo"; + hasNextPage: boolean; + endCursor?: string | null; + }; + }; + }>; +}; + +export type ListStructsByNameQueryVariables = Exact<{ + blobHash: Scalars["String"]["input"]; + structName: Scalars["String"]["input"]; + first?: InputMaybe; + after?: InputMaybe; +}>; + +export type ListStructsByNameQuery = { + __typename?: "Query"; + blobs: Array<{ + __typename?: "Blob"; + has_structConnection: { + __typename?: "BlobHas_structConnection"; + totalCount: number; + edges: Array<{ + __typename?: "BlobHas_structRelationship"; + properties: { __typename?: "HasNameRel"; name: string }; + node: { + __typename?: "Struct"; + hash: string; + size: number; + kind: string; + }; + }>; + pageInfo: { + __typename?: "PageInfo"; + hasNextPage: boolean; + endCursor?: string | null; + }; + }; + }>; +}; + +export type ListSymbolsQueryVariables = Exact<{ + blobHash: Scalars["String"]["input"]; + first?: InputMaybe; + after?: InputMaybe; +}>; + +export type ListSymbolsQuery = { + __typename?: "Query"; + blobs: Array<{ + __typename?: "Blob"; + has_symbolConnection: { + __typename?: "BlobHas_symbolConnection"; + totalCount: number; + edges: Array<{ + __typename?: "BlobHas_symbolRelationship"; + properties: { __typename?: "HasNameRel"; name: string }; + node: { __typename?: "Symbol"; hash: string; address: string }; + }>; + pageInfo: { + __typename?: "PageInfo"; + hasNextPage: boolean; + endCursor?: string | null; + }; + }; + }>; +}; + +export type ListSymbolsByNameQueryVariables = Exact<{ + blobHash: Scalars["String"]["input"]; + symbolName: Scalars["String"]["input"]; + first?: InputMaybe; + after?: InputMaybe; +}>; + +export type ListSymbolsByNameQuery = { + __typename?: "Query"; + blobs: Array<{ + __typename?: "Blob"; + has_symbolConnection: { + __typename?: "BlobHas_symbolConnection"; + totalCount: number; + edges: Array<{ + __typename?: "BlobHas_symbolRelationship"; + properties: { __typename?: "HasNameRel"; name: string }; + node: { __typename?: "Symbol"; hash: string; address: string }; + }>; + pageInfo: { + __typename?: "PageInfo"; + hasNextPage: boolean; + endCursor?: string | null; + }; + }; + }>; +}; + +export type ListTreeQueryVariables = Exact<{ + treeHash: Scalars["String"]["input"]; + first?: InputMaybe; + afterTrees?: InputMaybe; + afterBlobs?: InputMaybe; + includeTrees: Scalars["Boolean"]["input"]; + includeBlobs: Scalars["Boolean"]["input"]; +}>; + +export type ListTreeQuery = { + __typename?: "Query"; + trees: Array<{ + __typename?: "Tree"; + child_treesConnection?: { + __typename?: "TreeChild_treesConnection"; + totalCount: number; + edges: Array<{ + __typename?: "TreeChild_treesRelationship"; + properties: { __typename?: "HasFilenameRel"; name: string }; + node: { __typename?: "Tree"; hash: string }; + }>; + pageInfo: { + __typename?: "PageInfo"; + hasNextPage: boolean; + endCursor?: string | null; + }; + }; + child_blobsConnection?: { + __typename?: "TreeChild_blobsConnection"; + totalCount: number; + edges: Array<{ + __typename?: "TreeChild_blobsRelationship"; + properties: { __typename?: "HasFilenameRel"; name: string }; + node: { __typename?: "Blob"; hash: string }; + }>; + pageInfo: { + __typename?: "PageInfo"; + hasNextPage: boolean; + endCursor?: string | null; + }; + }; + }>; +}; + +export type ListRegistryKeyQueryVariables = Exact<{ + keyHash: Scalars["String"]["input"]; + first?: InputMaybe; + afterKeys?: InputMaybe; + afterValues?: InputMaybe; + includeKeys: Scalars["Boolean"]["input"]; + includeValues: Scalars["Boolean"]["input"]; +}>; + +export type ListRegistryKeyQuery = { + __typename?: "Query"; + winRegKeys: Array<{ + __typename?: "WinRegKey"; + child_keysConnection?: { + __typename?: "WinRegKeyChild_keysConnection"; + totalCount: number; + edges: Array<{ + __typename?: "WinRegKeyChild_keysRelationship"; + properties: { __typename?: "HasFilenameRel"; name: string }; + node: { __typename?: "WinRegKey"; hash: string }; + }>; + pageInfo: { + __typename?: "PageInfo"; + hasNextPage: boolean; + endCursor?: string | null; + }; + }; + child_valuesConnection?: { + __typename?: "WinRegKeyChild_valuesConnection"; + totalCount: number; + edges: Array<{ + __typename?: "WinRegKeyChild_valuesRelationship"; + properties: { __typename?: "HasFilenameRel"; name: string }; + node: { + __typename?: "WinRegValue"; + hash: string; + type: string; + value: string; + }; + }>; + pageInfo: { + __typename?: "PageInfo"; + hasNextPage: boolean; + endCursor?: string | null; + }; + }; + }>; +}; + +export type TraverseRegistryPathQueryVariables = Exact<{ + rootHash: Scalars["String"]["input"]; + path: Scalars["String"]["input"]; +}>; + +export type TraverseRegistryPathQuery = { + __typename?: "Query"; + traversePath?: string | null; +}; + +export type GitLogQueryVariables = Exact<{ + path: Scalars["String"]["input"]; + context: EntityType; + commitRange: CommitRange; + options?: InputMaybe; +}>; + +export type GitLogQuery = { + __typename?: "Query"; + gitLog: { + __typename?: "GitLogResult"; + total_count: number; + has_more: boolean; + entries: Array<{ + __typename?: "GitLogEntry"; + base_commit?: { + __typename?: "Commit"; + hash: string; + name: string; + date: any; + } | null; + diffee_commit: { + __typename?: "Commit"; + hash: string; + name: string; + date: any; + }; + diff: { + __typename?: "DiffItem"; + path: string; + status: DiffStatus; + type: NodeType; + old_props?: { + __typename?: "HashableNodeProps"; + hash: string; + properties: any; + } | null; + new_props?: { + __typename?: "HashableNodeProps"; + hash: string; + properties: any; + } | null; + }; + }>; + }; +}; + +export type GetCommitCapabilitiesQueryVariables = Exact<{ + commitHash: Scalars["String"]["input"]; +}>; + +export type GetCommitCapabilitiesQuery = { + __typename?: "Query"; + getCommitExtractedDataLabels: Array; +}; + +export const FetchBranchesDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "FetchBranches" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "branches" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "name" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "tracks" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "date", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ResolveCommitRefDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ResolveCommitRef" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "ref" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "branches" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "name", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "ref", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "name" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "tracks" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "filesystem", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { kind: "Name", value: "commits" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "ref", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "hash" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "filesystem" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const SearchDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "Search" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "input" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "SearchInput" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "search" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "input" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "input" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "type" }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "commit_name", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "commit_hash", + }, + }, + { + kind: "Field", + name: { kind: "Name", value: "blob_path" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "blob_hash" }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "entity_path", + }, + }, + { + kind: "Field", + name: { kind: "Name", value: "node_hash" }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const FetchCommitHistoryDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "FetchCommitHistory" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "commitHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "direction" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "CommitHistoryDirection" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "fetchCommitHistory" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "commit_hash" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "commitHash" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "direction" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "direction" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "hash" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "name" }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "description", + }, + }, + { + kind: "Field", + name: { kind: "Name", value: "date" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "previous" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { kind: "Name", value: "next" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const DiffNodesAtDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "DiffNodesAt" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "parentLabel" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "baseNodeHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "diffeeNodeHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "atPath" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "maxDepth" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "withIntermediates" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "Boolean" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "filter" }, + }, + type: { + kind: "ListType", + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "options" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "DiffNodesOptions" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "diffNodesAt" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "parent_label" }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "parentLabel", + }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "base_node_hash" }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "baseNodeHash", + }, + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "diffee_node_hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "diffeeNodeHash", + }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "at_path" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "atPath" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "max_depth" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "maxDepth" }, + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "with_intermediates", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "withIntermediates", + }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "filter" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "filter" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "options" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "options" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "total_count", + }, + }, + { + kind: "Field", + name: { kind: "Name", value: "items" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "status", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "path", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "type", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "old_props", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "new_props", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const TraversePathDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "TraversePath" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "parentLabel" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "treeHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "path" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "traversePath" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "parent_label" }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "parentLabel", + }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "tree_hash" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "treeHash" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "path" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "path" }, + }, + }, + ], + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const GetBlobWinRegRootDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "GetBlobWinRegRoot" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "hash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "blobs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "hash", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "hash" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "has_winreg" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const GetBlobsWithSymbolsDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "GetBlobsWithSymbols" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "commitHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "getBlobsWithSymbols" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "commit_hash" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "commitHash" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "blob_hash" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "blob_path" }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const SearchWithSessionDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "SearchWithSession" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "input" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "SearchInput" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "pageSize" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "searchWithSession" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "input" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "input" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "page_size" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "pageSize" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "session_id" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "results" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "type", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "commit_name", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "commit_hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "blob_path", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "blob_hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "entity_path", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node_hash", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { kind: "Name", value: "has_more" }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "total_fetched", + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const SearchNextDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "SearchNext" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "sessionId" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "searchNext" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "session_id" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "sessionId" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "session_id" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "results" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "type", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "commit_name", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "commit_hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "blob_path", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "blob_hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "entity_path", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node_hash", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { kind: "Name", value: "has_more" }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "total_fetched", + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const SearchCloseDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "mutation", + name: { kind: "Name", value: "SearchClose" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "sessionId" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "searchClose" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "session_id" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "sessionId" }, + }, + }, + ], + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const FetchStructByNameDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "FetchStructByName" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "blobHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "structName" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "blobs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "blobHash", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "has_structConnection", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "where", + }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "edge", + }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "name", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "structName", + }, + }, + }, + ], + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "edges", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "size", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "kind", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const FetchStructFieldsDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "FetchStructFields" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "structHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "structs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "structHash", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "fieldsConnection", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "totalCount", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "edges", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "offset", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "data_type", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ListStructsDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ListStructs" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "blobHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "first" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "after" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "blobs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "blobHash", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "has_structConnection", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "first", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "first", + }, + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "after", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "after", + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "totalCount", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "edges", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "size", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "kind", + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "pageInfo", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hasNextPage", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "endCursor", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ListStructsByNameDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ListStructsByName" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "blobHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "structName" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "first" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "after" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "blobs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "blobHash", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "has_structConnection", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "where", + }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "edge", + }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "name", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "structName", + }, + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "first", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "first", + }, + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "after", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "after", + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "totalCount", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "edges", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "size", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "kind", + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "pageInfo", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hasNextPage", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "endCursor", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ListSymbolsDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ListSymbols" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "blobHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "first" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "after" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "blobs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "blobHash", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "has_symbolConnection", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "first", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "first", + }, + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "after", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "after", + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "totalCount", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "edges", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "address", + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "pageInfo", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hasNextPage", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "endCursor", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ListSymbolsByNameDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ListSymbolsByName" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "blobHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "symbolName" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "first" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "after" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "blobs" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "blobHash", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "has_symbolConnection", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "where", + }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "edge", + }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "name", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "symbolName", + }, + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "first", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "first", + }, + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "after", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "after", + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "totalCount", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "edges", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "address", + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "pageInfo", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hasNextPage", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "endCursor", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ListTreeDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ListTree" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "treeHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "first" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "afterTrees" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "afterBlobs" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "includeTrees" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Boolean" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "includeBlobs" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Boolean" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "trees" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "treeHash", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "child_treesConnection", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "first", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "first", + }, + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "after", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "afterTrees", + }, + }, + }, + ], + directives: [ + { + kind: "Directive", + name: { + kind: "Name", + value: "include", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "if", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "includeTrees", + }, + }, + }, + ], + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "totalCount", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "edges", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "pageInfo", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hasNextPage", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "endCursor", + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "child_blobsConnection", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "first", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "first", + }, + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "after", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "afterBlobs", + }, + }, + }, + ], + directives: [ + { + kind: "Directive", + name: { + kind: "Name", + value: "include", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "if", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "includeBlobs", + }, + }, + }, + ], + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "totalCount", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "edges", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "pageInfo", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hasNextPage", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "endCursor", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const ListRegistryKeyDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "ListRegistryKey" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "keyHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "first" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "Int" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "afterKeys" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "afterValues" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "includeKeys" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Boolean" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "includeValues" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "Boolean" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "winRegKeys" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "where" }, + value: { + kind: "ObjectValue", + fields: [ + { + kind: "ObjectField", + name: { + kind: "Name", + value: "hash", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "keyHash", + }, + }, + }, + ], + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "child_keysConnection", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "first", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "first", + }, + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "after", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "afterKeys", + }, + }, + }, + ], + directives: [ + { + kind: "Directive", + name: { + kind: "Name", + value: "include", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "if", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "includeKeys", + }, + }, + }, + ], + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "totalCount", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "edges", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "pageInfo", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hasNextPage", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "endCursor", + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "child_valuesConnection", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "first", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "first", + }, + }, + }, + { + kind: "Argument", + name: { + kind: "Name", + value: "after", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "afterValues", + }, + }, + }, + ], + directives: [ + { + kind: "Directive", + name: { + kind: "Name", + value: "include", + }, + arguments: [ + { + kind: "Argument", + name: { + kind: "Name", + value: "if", + }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "includeValues", + }, + }, + }, + ], + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "totalCount", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "edges", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "node", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "type", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "value", + }, + }, + ], + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "pageInfo", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hasNextPage", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "endCursor", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const TraverseRegistryPathDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "TraverseRegistryPath" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "rootHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "path" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "traversePath" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "parent_label" }, + value: { + kind: "StringValue", + value: "WinRegKey", + block: false, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "tree_hash" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "rootHash" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "path" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "path" }, + }, + }, + ], + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const GitLogDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "GitLog" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "path" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "context" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "EntityType" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "commitRange" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "CommitRange" }, + }, + }, + }, + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "options" }, + }, + type: { + kind: "NamedType", + name: { kind: "Name", value: "GitLogOptions" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { kind: "Name", value: "gitLog" }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "path" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "path" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "context" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "context" }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "commit_range" }, + value: { + kind: "Variable", + name: { + kind: "Name", + value: "commitRange", + }, + }, + }, + { + kind: "Argument", + name: { kind: "Name", value: "options" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "options" }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "total_count", + }, + }, + { + kind: "Field", + name: { kind: "Name", value: "has_more" }, + }, + { + kind: "Field", + name: { kind: "Name", value: "entries" }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "base_commit", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "date", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "diffee_commit", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "name", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "date", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "diff", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "path", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "status", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "type", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "old_props", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + }, + ], + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "new_props", + }, + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "hash", + }, + }, + { + kind: "Field", + name: { + kind: "Name", + value: "properties", + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export const GetCommitCapabilitiesDocument = { + kind: "Document", + definitions: [ + { + kind: "OperationDefinition", + operation: "query", + name: { kind: "Name", value: "GetCommitCapabilities" }, + variableDefinitions: [ + { + kind: "VariableDefinition", + variable: { + kind: "Variable", + name: { kind: "Name", value: "commitHash" }, + }, + type: { + kind: "NonNullType", + type: { + kind: "NamedType", + name: { kind: "Name", value: "String" }, + }, + }, + }, + ], + selectionSet: { + kind: "SelectionSet", + selections: [ + { + kind: "Field", + name: { + kind: "Name", + value: "getCommitExtractedDataLabels", + }, + arguments: [ + { + kind: "Argument", + name: { kind: "Name", value: "commit_hash" }, + value: { + kind: "Variable", + name: { kind: "Name", value: "commitHash" }, + }, + }, + ], + }, + ], + }, + }, + ], +} as unknown as DocumentNode; +export type Requester = ( + doc: DocumentNode, + vars?: V, + options?: C, +) => Promise | AsyncIterable; +export function getSdk(requester: Requester) { + return { + FetchBranches( + variables?: FetchBranchesQueryVariables, + options?: C, + ): Promise { + return requester( + FetchBranchesDocument, + variables, + options, + ) as Promise; + }, + ResolveCommitRef( + variables: ResolveCommitRefQueryVariables, + options?: C, + ): Promise { + return requester< + ResolveCommitRefQuery, + ResolveCommitRefQueryVariables + >( + ResolveCommitRefDocument, + variables, + options, + ) as Promise; + }, + Search( + variables: SearchQueryVariables, + options?: C, + ): Promise { + return requester( + SearchDocument, + variables, + options, + ) as Promise; + }, + FetchCommitHistory( + variables: FetchCommitHistoryQueryVariables, + options?: C, + ): Promise { + return requester< + FetchCommitHistoryQuery, + FetchCommitHistoryQueryVariables + >( + FetchCommitHistoryDocument, + variables, + options, + ) as Promise; + }, + DiffNodesAt( + variables: DiffNodesAtQueryVariables, + options?: C, + ): Promise { + return requester( + DiffNodesAtDocument, + variables, + options, + ) as Promise; + }, + TraversePath( + variables: TraversePathQueryVariables, + options?: C, + ): Promise { + return requester( + TraversePathDocument, + variables, + options, + ) as Promise; + }, + GetBlobWinRegRoot( + variables: GetBlobWinRegRootQueryVariables, + options?: C, + ): Promise { + return requester< + GetBlobWinRegRootQuery, + GetBlobWinRegRootQueryVariables + >( + GetBlobWinRegRootDocument, + variables, + options, + ) as Promise; + }, + GetBlobsWithSymbols( + variables: GetBlobsWithSymbolsQueryVariables, + options?: C, + ): Promise { + return requester< + GetBlobsWithSymbolsQuery, + GetBlobsWithSymbolsQueryVariables + >( + GetBlobsWithSymbolsDocument, + variables, + options, + ) as Promise; + }, + SearchWithSession( + variables: SearchWithSessionQueryVariables, + options?: C, + ): Promise { + return requester< + SearchWithSessionQuery, + SearchWithSessionQueryVariables + >( + SearchWithSessionDocument, + variables, + options, + ) as Promise; + }, + SearchNext( + variables: SearchNextQueryVariables, + options?: C, + ): Promise { + return requester( + SearchNextDocument, + variables, + options, + ) as Promise; + }, + SearchClose( + variables: SearchCloseMutationVariables, + options?: C, + ): Promise { + return requester( + SearchCloseDocument, + variables, + options, + ) as Promise; + }, + FetchStructByName( + variables: FetchStructByNameQueryVariables, + options?: C, + ): Promise { + return requester< + FetchStructByNameQuery, + FetchStructByNameQueryVariables + >( + FetchStructByNameDocument, + variables, + options, + ) as Promise; + }, + FetchStructFields( + variables: FetchStructFieldsQueryVariables, + options?: C, + ): Promise { + return requester< + FetchStructFieldsQuery, + FetchStructFieldsQueryVariables + >( + FetchStructFieldsDocument, + variables, + options, + ) as Promise; + }, + ListStructs( + variables: ListStructsQueryVariables, + options?: C, + ): Promise { + return requester( + ListStructsDocument, + variables, + options, + ) as Promise; + }, + ListStructsByName( + variables: ListStructsByNameQueryVariables, + options?: C, + ): Promise { + return requester< + ListStructsByNameQuery, + ListStructsByNameQueryVariables + >( + ListStructsByNameDocument, + variables, + options, + ) as Promise; + }, + ListSymbols( + variables: ListSymbolsQueryVariables, + options?: C, + ): Promise { + return requester( + ListSymbolsDocument, + variables, + options, + ) as Promise; + }, + ListSymbolsByName( + variables: ListSymbolsByNameQueryVariables, + options?: C, + ): Promise { + return requester< + ListSymbolsByNameQuery, + ListSymbolsByNameQueryVariables + >( + ListSymbolsByNameDocument, + variables, + options, + ) as Promise; + }, + ListTree( + variables: ListTreeQueryVariables, + options?: C, + ): Promise { + return requester( + ListTreeDocument, + variables, + options, + ) as Promise; + }, + ListRegistryKey( + variables: ListRegistryKeyQueryVariables, + options?: C, + ): Promise { + return requester< + ListRegistryKeyQuery, + ListRegistryKeyQueryVariables + >( + ListRegistryKeyDocument, + variables, + options, + ) as Promise; + }, + TraverseRegistryPath( + variables: TraverseRegistryPathQueryVariables, + options?: C, + ): Promise { + return requester< + TraverseRegistryPathQuery, + TraverseRegistryPathQueryVariables + >( + TraverseRegistryPathDocument, + variables, + options, + ) as Promise; + }, + GitLog( + variables: GitLogQueryVariables, + options?: C, + ): Promise { + return requester( + GitLogDocument, + variables, + options, + ) as Promise; + }, + GetCommitCapabilities( + variables: GetCommitCapabilitiesQueryVariables, + options?: C, + ): Promise { + return requester< + GetCommitCapabilitiesQuery, + GetCommitCapabilitiesQueryVariables + >( + GetCommitCapabilitiesDocument, + variables, + options, + ) as Promise; + }, + }; +} +export type Sdk = ReturnType; diff --git a/mcp/src/graphql/queries.graphql b/mcp/src/graphql/queries.graphql new file mode 100644 index 0000000..2c9db11 --- /dev/null +++ b/mcp/src/graphql/queries.graphql @@ -0,0 +1,432 @@ +query FetchBranches { + branches { + name + tracks { + hash + name + date + } + } +} + +query ResolveCommitRef($ref: String!) { + branches(where: { name: $ref }) { + name + tracks { + hash + filesystem { + hash + } + } + } + commits(where: { hash: $ref }) { + hash + filesystem { + hash + } + } +} + +query Search($input: SearchInput!) { + search(input: $input) { + type + commit_name + commit_hash + blob_path + blob_hash + entity_path + node_hash + } +} + +query FetchCommitHistory( + $commitHash: String! + $direction: CommitHistoryDirection +) { + fetchCommitHistory(commit_hash: $commitHash, direction: $direction) { + hash + name + description + date + previous { + hash + } + next { + hash + } + } +} + +query DiffNodesAt( + $parentLabel: String! + $baseNodeHash: String! + $diffeeNodeHash: String! + $atPath: String! + $maxDepth: Int + $withIntermediates: Boolean + $filter: [String!] + $options: DiffNodesOptions +) { + diffNodesAt( + parent_label: $parentLabel + base_node_hash: $baseNodeHash + diffee_node_hash: $diffeeNodeHash + at_path: $atPath + max_depth: $maxDepth + with_intermediates: $withIntermediates + filter: $filter + options: $options + ) { + total_count + items { + status + path + type + old_props { + hash + properties + } + new_props { + hash + properties + } + } + } +} + +query TraversePath($parentLabel: String!, $treeHash: String!, $path: String!) { + traversePath(parent_label: $parentLabel, tree_hash: $treeHash, path: $path) +} + +query GetBlobWinRegRoot($hash: String!) { + blobs(where: { hash: $hash }) { + hash + has_winreg { + hash + } + } +} + +query GetBlobsWithSymbols($commitHash: String!) { + getBlobsWithSymbols(commit_hash: $commitHash) { + blob_hash + blob_path + } +} + +query SearchWithSession($input: SearchInput!, $pageSize: Int) { + searchWithSession(input: $input, page_size: $pageSize) { + session_id + results { + type + commit_name + commit_hash + blob_path + blob_hash + entity_path + node_hash + } + has_more + total_fetched + } +} + +query SearchNext($sessionId: String!) { + searchNext(session_id: $sessionId) { + session_id + results { + type + commit_name + commit_hash + blob_path + blob_hash + entity_path + node_hash + } + has_more + total_fetched + } +} + +mutation SearchClose($sessionId: String!) { + searchClose(session_id: $sessionId) +} + +query FetchStructByName($blobHash: String!, $structName: String!) { + blobs(where: { hash: $blobHash }) { + has_structConnection(where: { edge: { name: $structName } }) { + edges { + properties { + name + } + node { + hash + size + kind + } + } + } + } +} + +query FetchStructFields($structHash: String!) { + structs(where: { hash: $structHash }) { + fieldsConnection { + totalCount + edges { + properties { + name + } + node { + hash + offset + data_type + } + } + } + } +} + +query ListStructs($blobHash: String!, $first: Int, $after: String) { + blobs(where: { hash: $blobHash }) { + has_structConnection(first: $first, after: $after) { + totalCount + edges { + properties { + name + } + node { + hash + size + kind + } + } + pageInfo { + hasNextPage + endCursor + } + } + } +} + +query ListStructsByName( + $blobHash: String! + $structName: String! + $first: Int + $after: String +) { + blobs(where: { hash: $blobHash }) { + has_structConnection( + where: { edge: { name: $structName } } + first: $first + after: $after + ) { + totalCount + edges { + properties { + name + } + node { + hash + size + kind + } + } + pageInfo { + hasNextPage + endCursor + } + } + } +} + +query ListSymbols($blobHash: String!, $first: Int, $after: String) { + blobs(where: { hash: $blobHash }) { + has_symbolConnection(first: $first, after: $after) { + totalCount + edges { + properties { + name + } + node { + hash + address + } + } + pageInfo { + hasNextPage + endCursor + } + } + } +} + +query ListSymbolsByName( + $blobHash: String! + $symbolName: String! + $first: Int + $after: String +) { + blobs(where: { hash: $blobHash }) { + has_symbolConnection( + where: { edge: { name: $symbolName } } + first: $first + after: $after + ) { + totalCount + edges { + properties { + name + } + node { + hash + address + } + } + pageInfo { + hasNextPage + endCursor + } + } + } +} + +query ListTree( + $treeHash: String! + $first: Int + $afterTrees: String + $afterBlobs: String + $includeTrees: Boolean! + $includeBlobs: Boolean! +) { + trees(where: { hash: $treeHash }) { + child_treesConnection(first: $first, after: $afterTrees) + @include(if: $includeTrees) { + totalCount + edges { + properties { + name + } + node { + hash + } + } + pageInfo { + hasNextPage + endCursor + } + } + child_blobsConnection(first: $first, after: $afterBlobs) + @include(if: $includeBlobs) { + totalCount + edges { + properties { + name + } + node { + hash + } + } + pageInfo { + hasNextPage + endCursor + } + } + } +} + +query ListRegistryKey( + $keyHash: String! + $first: Int + $afterKeys: String + $afterValues: String + $includeKeys: Boolean! + $includeValues: Boolean! +) { + winRegKeys(where: { hash: $keyHash }) { + child_keysConnection(first: $first, after: $afterKeys) + @include(if: $includeKeys) { + totalCount + edges { + properties { + name + } + node { + hash + } + } + pageInfo { + hasNextPage + endCursor + } + } + child_valuesConnection(first: $first, after: $afterValues) + @include(if: $includeValues) { + totalCount + edges { + properties { + name + } + node { + hash + type + value + } + } + pageInfo { + hasNextPage + endCursor + } + } + } +} + +query TraverseRegistryPath($rootHash: String!, $path: String!) { + traversePath(parent_label: "WinRegKey", tree_hash: $rootHash, path: $path) +} + +query GitLog( + $path: String! + $context: EntityType! + $commitRange: CommitRange! + $options: GitLogOptions +) { + gitLog( + path: $path + context: $context + commit_range: $commitRange + options: $options + ) { + total_count + has_more + entries { + base_commit { + hash + name + date + } + diffee_commit { + hash + name + date + } + diff { + path + status + type + old_props { + hash + properties + } + new_props { + hash + properties + } + } + } + } +} + +query GetCommitCapabilities($commitHash: String!) { + getCommitExtractedDataLabels(commit_hash: $commitHash) +} diff --git a/mcp/src/index.ts b/mcp/src/index.ts new file mode 100644 index 0000000..1d12b7e --- /dev/null +++ b/mcp/src/index.ts @@ -0,0 +1,36 @@ +import express from "express"; +import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; +import { createSdk } from "./graphql/client.js"; +import { createServer } from "./server.js"; + +const MCP_PORT = parseInt(process.env.MCP_PORT || "3001", 10); + +// Request-invariant: no per-request credential to bind. +const sdk = createSdk(); + +const app = express(); +app.use(express.json()); + +app.post("/mcp", async (req, res) => { + // A new McpServer per request: an McpServer binds to a single transport + // on connect, and the transport is stateless. + const mcpServer = createServer(sdk); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, // stateless + }); + + res.on("close", () => { + transport.close(); + }); + + await mcpServer.connect(transport); + await transport.handleRequest(req, res, req.body); +}); + +app.get("/health", (_req, res) => { + res.json({ status: "ok" }); +}); + +app.listen(MCP_PORT, () => { + console.log(`OSWatcher MCP server listening on port ${MCP_PORT}`); +}); diff --git a/mcp/src/pagination.ts b/mcp/src/pagination.ts new file mode 100644 index 0000000..2205c64 --- /dev/null +++ b/mcp/src/pagination.ts @@ -0,0 +1,109 @@ +/** + * D4: every paginated tool returns the same envelope, so an LLM learns one + * pattern. Underneath there are three mechanisms: Neo4j connection cursors, + * gitLog's limit/offset, and search's server-side sessions. + */ +export interface Page { + items: T[]; + has_more: boolean; + next_cursor: string | null; +} + +export interface PageInfo { + hasNextPage: boolean; + endCursor?: string | null; +} + +/** One Neo4j connection: the cursor is the connection's own endCursor. */ +export function singlePage(items: T[], pageInfo: PageInfo): Page { + return { + items, + has_more: pageInfo.hasNextPage, + next_cursor: pageInfo.hasNextPage ? (pageInfo.endCursor ?? null) : null, + }; +} + +/** gitLog: the cursor is the offset to pass back. */ +export function offsetPage( + items: T[], + offset: number, + hasMore: boolean, +): Page { + return { + items, + has_more: hasMore, + next_cursor: hasMore ? String(offset + items.length) : null, + }; +} + +/** + * Composite cursor for tools that page two connections at once. A value is the + * cursor to resume after; "" means "not started, request with no after"; null + * means exhausted, so that connection is not requested again. + */ +export type CursorState = Record; + +export function encodeCursor(state: CursorState): string { + return Buffer.from(JSON.stringify(state), "utf-8").toString("base64url"); +} + +export function decodeCursor( + cursor: string | undefined, + keys: string[], +): CursorState { + if (!cursor) { + return Object.fromEntries(keys.map((k) => [k, ""])); + } + + let parsed: unknown; + try { + parsed = JSON.parse(Buffer.from(cursor, "base64url").toString("utf-8")); + } catch { + throw new Error( + "Invalid cursor. Pass back the next_cursor value from the previous page unchanged, or omit it to start over.", + ); + } + + if ( + typeof parsed !== "object" || + parsed === null || + Array.isArray(parsed) + ) { + throw new Error( + "Invalid cursor. Pass back the next_cursor value from the previous page unchanged, or omit it to start over.", + ); + } + + const payload = parsed as Record; + return Object.fromEntries( + keys.map((k) => [ + k, + typeof payload[k] === "string" ? (payload[k] as string) : null, + ]), + ); +} + +/** + * Fold this page's pageInfo back into the cursor state. A connection that was + * not requested (no entry in `results`) stays exhausted; a requested one that + * came back without pageInfo is treated as exhausted rather than looping. + */ +export function advanceCursor( + previous: CursorState, + results: Record, +): CursorState { + const next: CursorState = {}; + for (const key of Object.keys(previous)) { + if (previous[key] === null) { + next[key] = null; + continue; + } + const info = results[key]; + next[key] = info?.hasNextPage ? (info.endCursor ?? null) : null; + } + return next; +} + +export function compositeHasMore(state: CursorState): boolean { + return Object.values(state).some((v) => v !== null); +} diff --git a/mcp/src/resolve.ts b/mcp/src/resolve.ts new file mode 100644 index 0000000..8655219 --- /dev/null +++ b/mcp/src/resolve.ts @@ -0,0 +1,119 @@ +import type { GraphqlSdk } from "./graphql/client.js"; + +export interface ResolvedCommitRef { + commitHash: string; + filesystemHash: string; +} + +/** + * Resolve a branch name or 40-character commit hash to its commit hash and + * filesystem root hash. One GraphQL round trip: the query asks for both a + * branch and a commit match and takes whichever answers. + */ +export async function resolveCommitRef( + sdk: GraphqlSdk, + ref: string, +): Promise { + const result = await sdk.ResolveCommitRef({ ref }); + const branchMatch = result.branches[0]; + + if (branchMatch?.tracks?.filesystem?.hash) { + return { + commitHash: branchMatch.tracks.hash, + filesystemHash: branchMatch.tracks.filesystem.hash, + }; + } + + const commitMatch = result.commits[0]; + if (commitMatch?.filesystem?.hash) { + return { + commitHash: commitMatch.hash, + filesystemHash: commitMatch.filesystem.hash, + }; + } + + if (branchMatch && !branchMatch.tracks) { + throw new Error(`Branch "${ref}" has no tracked commit`); + } + + throw new Error(`Branch or commit not found: ${ref}`); +} + +/** + * Resolve (ref, absolute path) to the hash of the node at that path, or null. + * traversePath returns a bare hash with no label, so the caller decides what it + * expected to find; resolveTreeHash and resolveBlobHash only differ in wording. + */ +export async function resolveNodeHash( + sdk: GraphqlSdk, + ref: string, + path: string, +): Promise { + const { filesystemHash } = await resolveCommitRef(sdk, ref); + const result = await sdk.TraversePath({ + parentLabel: "Tree", + treeHash: filesystemHash, + path, + }); + return result.traversePath ?? null; +} + +export async function resolveTreeHash( + sdk: GraphqlSdk, + ref: string, + path: string, +): Promise { + const hash = await resolveNodeHash(sdk, ref, path); + if (!hash) { + throw new Error(`Directory not found in "${ref}": ${path}`); + } + return hash; +} + +export async function resolveBlobHash( + sdk: GraphqlSdk, + ref: string, + path: string, +): Promise { + const hash = await resolveNodeHash(sdk, ref, path); + if (!hash) { + throw new Error(`File not found in "${ref}": ${path}`); + } + return hash; +} + +export type Hive = "SAM" | "SECURITY" | "SOFTWARE" | "SYSTEM" | "DEFAULT"; + +/** + * An LLM knows `HKLM\SOFTWARE`; requiring it to know the on-disk hive location + * is a memorisation tax. The tools take the hive name and map it here. + */ +export const HIVE_PATHS: Record = { + SAM: "/Windows/System32/config/SAM", + SECURITY: "/Windows/System32/config/SECURITY", + SOFTWARE: "/Windows/System32/config/SOFTWARE", + SYSTEM: "/Windows/System32/config/SYSTEM", + DEFAULT: "/Windows/System32/config/DEFAULT", +}; + +/** Resolve a hive to its WinRegKey root hash: traversePath then HAS_WINREG. */ +export async function resolveHiveRoot( + sdk: GraphqlSdk, + ref: string, + hive: Hive, +): Promise { + const path = HIVE_PATHS[hive]; + const blobHash = await resolveNodeHash(sdk, ref, path); + if (!blobHash) { + throw new Error( + `Hive ${hive} not found in "${ref}" (expected at ${path})`, + ); + } + + const result = await sdk.GetBlobWinRegRoot({ hash: blobHash }); + const winregHash = result.blobs[0]?.has_winreg?.hash; + if (!winregHash) { + throw new Error(`Hive ${hive} in "${ref}" has no parsed registry data`); + } + return winregHash; +} diff --git a/mcp/src/server.ts b/mcp/src/server.ts new file mode 100644 index 0000000..7630308 --- /dev/null +++ b/mcp/src/server.ts @@ -0,0 +1,46 @@ +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { GraphqlSdk } from "./graphql/client.js"; +import { tools } from "./tools/index.js"; + +export function createServer(sdk: GraphqlSdk): McpServer { + const server = new McpServer({ + name: "oswatcher", + version: "1.0.0", + }); + + for (const tool of tools) { + server.tool( + tool.name, + tool.description, + tool.schema, + async (args: any) => { + try { + const result = await tool.handler(sdk, args); + return { + content: [ + { + type: "text" as const, + text: + typeof result === "string" + ? result + : JSON.stringify(result, null, 2), + }, + ], + }; + } catch (error) { + return { + content: [ + { + type: "text" as const, + text: `Error: ${error instanceof Error ? error.message : String(error)}`, + }, + ], + isError: true, + }; + } + }, + ); + } + + return server; +} diff --git a/mcp/src/tools/blobs-with-symbols.ts b/mcp/src/tools/blobs-with-symbols.ts new file mode 100644 index 0000000..1275f3e --- /dev/null +++ b/mcp/src/tools/blobs-with-symbols.ts @@ -0,0 +1,47 @@ +import { z } from "zod"; +import { resolveCommitRef } from "../resolve.js"; +import { defineTool } from "../types.js"; +import type { GraphqlSdk } from "../graphql/client.js"; + +export interface BlobWithSymbols { + blob_hash: string; + blob_path: string; +} + +export async function getBlobsWithSymbols( + sdk: GraphqlSdk, + ref: string, +): Promise { + const { commitHash } = await resolveCommitRef(sdk, ref); + + const result = await sdk.GetBlobsWithSymbols({ commitHash }); + + return result.getBlobsWithSymbols.map((b) => ({ + blob_hash: b.blob_hash, + blob_path: b.blob_path, + })); +} + +export default defineTool({ + name: "get_blobs_with_symbols", + description: `Return all PE Blob files in a commit that have associated PDB symbols or struct data. + +Use this tool to discover blob hashes before calling diff_nodes for symbol or struct diffs. + +Symbols diff procedure: + 1. get_blobs_with_symbols(base_ref) → find blob matching target PE by blob_path suffix → blob_hash_A + 2. get_blobs_with_symbols(diffee_ref) → blob_hash_B + 3. diff_nodes(blob_hash_A, blob_hash_B, parent_label="Blob", filter=["Symbol"], max_depth=1) + +Structs list diff procedure: + Same as symbols but filter=["Struct"] and max_depth=1 (required) + +Struct fields diff for a specific struct (e.g. _EPROCESS): + Same blob resolution, then: + diff_nodes(..., parent_label="Blob", filter=["StructField"], at_path="/_EPROCESS", max_depth=1) + Add status_filter=["NEW","MOD","DEL","UNCHANGED"] to reconstruct the full C type layout.`, + schema: { + ref: z.string().min(1).describe("Branch name or commit hash"), + }, + handler: (sdk, { ref }) => getBlobsWithSymbols(sdk, ref), +}); diff --git a/mcp/src/tools/branches.ts b/mcp/src/tools/branches.ts new file mode 100644 index 0000000..b4e8784 --- /dev/null +++ b/mcp/src/tools/branches.ts @@ -0,0 +1,46 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { defineTool } from "../types.js"; + +export interface BranchResult { + name: string; + headCommit: { + hash: string; + name: string; + date: string; + } | null; +} + +export async function listBranches( + sdk: GraphqlSdk, + search?: string, +): Promise { + const result = await sdk.FetchBranches(); + + let branches = result.branches.map((b) => ({ + name: b.name, + headCommit: b.tracks + ? { hash: b.tracks.hash, name: b.tracks.name, date: b.tracks.date } + : null, + })); + + if (search) { + const term = search.toLowerCase(); + branches = branches.filter((b) => b.name.toLowerCase().includes(term)); + } + + return branches; +} + +export default defineTool({ + name: "list_branches", + description: + "List available OS branches (operating system versions tracked by OSWatcher).", + schema: { + search: z + .string() + .optional() + .describe("Case-insensitive substring filter on branch name"), + }, + handler: (sdk, { search }) => listBranches(sdk, search), +}); diff --git a/mcp/src/tools/commit-capabilities.ts b/mcp/src/tools/commit-capabilities.ts new file mode 100644 index 0000000..5bc3df6 --- /dev/null +++ b/mcp/src/tools/commit-capabilities.ts @@ -0,0 +1,35 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { resolveCommitRef } from "../resolve.js"; +import { defineTool } from "../types.js"; + +export interface CommitCapabilities { + commit_hash: string; + labels: string[]; +} + +export async function getCommitCapabilities( + sdk: GraphqlSdk, + ref: string, +): Promise { + const { commitHash } = await resolveCommitRef(sdk, ref); + const result = await sdk.GetCommitCapabilities({ commitHash }); + return { + commit_hash: commitHash, + labels: result.getCommitExtractedDataLabels, + }; +} + +export default defineTool({ + name: "get_commit_capabilities", + description: `List which kinds of data were extracted for an OS snapshot: node labels such as Tree, Blob, WinRegKey, Symbol, Struct. + +Call this first when you are unsure whether a snapshot has registry or PDB data at all. It saves discovering the absence through an empty result from list_registry_key or list_symbols.`, + schema: { + ref: z + .string() + .min(1) + .describe("Branch name or 40-character commit hash"), + }, + handler: (sdk, { ref }) => getCommitCapabilities(sdk, ref), +}); diff --git a/mcp/src/tools/commits.ts b/mcp/src/tools/commits.ts new file mode 100644 index 0000000..68c3843 --- /dev/null +++ b/mcp/src/tools/commits.ts @@ -0,0 +1,70 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { CommitHistoryDirection } from "../graphql/generated/sdk.js"; +import { defineTool } from "../types.js"; + +export interface CommitResult { + hash: string; + name: string; + description: string | null; + date: string; +} + +export async function listCommits( + sdk: GraphqlSdk, + branch: string, + limit?: number, +): Promise { + // Resolve branch name to HEAD commit hash + const branchesResult = await sdk.FetchBranches(); + const matched = branchesResult.branches.find( + (b) => b.name.toLowerCase() === branch.toLowerCase(), + ); + + if (!matched) { + const available = branchesResult.branches.map((b) => b.name).join(", "); + throw new Error( + `Branch "${branch}" not found. Available branches: ${available}`, + ); + } + + if (!matched.tracks) { + throw new Error(`Branch "${branch}" has no commits`); + } + + const headHash = matched.tracks.hash; + + // Fetch commit history starting from HEAD + const historyResult = await sdk.FetchCommitHistory({ + commitHash: headHash, + direction: CommitHistoryDirection.Backward, + }); + + let commits = historyResult.fetchCommitHistory.map((c) => ({ + hash: c.hash, + name: c.name, + description: c.description ?? null, + date: c.date, + })); + + if (limit && limit > 0) { + commits = commits.slice(0, limit); + } + + return commits; +} + +export default defineTool({ + name: "list_commits", + description: "List commits (OS snapshots/updates) on a branch", + schema: { + branch: z.string().describe("Branch name (e.g. 'windows_11_23h2')"), + limit: z + .number() + .int() + .positive() + .optional() + .describe("Maximum number of commits to return"), + }, + handler: (sdk, { branch, limit }) => listCommits(sdk, branch, limit), +}); diff --git a/mcp/src/tools/diff-nodes.ts b/mcp/src/tools/diff-nodes.ts new file mode 100644 index 0000000..26d4a53 --- /dev/null +++ b/mcp/src/tools/diff-nodes.ts @@ -0,0 +1,198 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { DiffStatus } from "../graphql/generated/sdk.js"; +import { defineTool } from "../types.js"; + +export interface DiffNodesResultItem { + status: DiffStatus; + path: string; + type: string; + old_props: { + hash: string; + properties: unknown; + } | null; + new_props: { + hash: string; + properties: unknown; + } | null; +} + +export interface DiffNodesResult { + total_count: number; + items: DiffNodesResultItem[]; +} + +interface DiffNodesParams { + sdk: GraphqlSdk; + base_node_hash: string; + diffee_node_hash: string; + parent_label: string; + filter: string[]; + at_path?: string; + max_depth?: number; + limit?: number; + offset?: number; + status_filter?: string[]; + with_intermediates?: boolean; +} + +function mapStatusFilter(statusFilter?: string[]): DiffStatus[] | undefined { + if (!statusFilter || statusFilter.length === 0) { + return undefined; + } + + const mapping: Record = { + NEW: DiffStatus.New, + MOD: DiffStatus.Mod, + DEL: DiffStatus.Del, + UNCHANGED: DiffStatus.Unchanged, + }; + + return statusFilter.map((status) => { + const upper = status.toUpperCase(); + const mapped = mapping[upper]; + if (!mapped) { + throw new Error( + `Invalid diff status "${status}". Valid statuses: NEW, MOD, DEL, UNCHANGED`, + ); + } + return mapped; + }); +} + +export async function diffNodes( + params: DiffNodesParams, +): Promise { + const { sdk } = params; + + const response = await sdk.DiffNodesAt({ + parentLabel: params.parent_label, + baseNodeHash: params.base_node_hash, + diffeeNodeHash: params.diffee_node_hash, + atPath: params.at_path ?? "/", + maxDepth: params.max_depth, + withIntermediates: params.with_intermediates ?? false, + filter: params.filter, + options: + params.limit !== undefined || + params.offset !== undefined || + params.status_filter?.length + ? { + limit: params.limit, + offset: params.offset, + status_filter: mapStatusFilter(params.status_filter), + } + : undefined, + }); + + return { + total_count: response.diffNodesAt.total_count, + items: response.diffNodesAt.items.map((item) => ({ + status: item.status, + path: item.path, + type: item.type, + old_props: item.old_props + ? { + hash: item.old_props.hash, + properties: item.old_props.properties, + } + : null, + new_props: item.new_props + ? { + hash: item.new_props.hash, + properties: item.new_props.properties, + } + : null, + })), + }; +} + +export default defineTool({ + name: "diff_nodes", + description: `Lower-level diff operating on raw node hashes: any entity type (filesystem Tree/Blob, registry WinRegKey, symbols, structs). + +Unlike diff_versions (which resolves refs and is filesystem-only), this tool accepts raw node hashes and an explicit parent_label + filter. + +parent_label and filter combinations: + Entity | parent_label | filter | max_depth + --------------|---------------|---------------------------------|---------- + Filesystem | Tree | ["Tree", "Blob"] | (omit) + Registry | WinRegKey | ["WinRegKey", "WinRegValue"] | (omit) + Symbols | Blob | ["Symbol"] | 1 (required) + Structs list | Blob | ["Struct"] | 1 (required) + Struct fields | Blob | ["StructField"] | 1 (required) + +IMPORTANT: Always pass an explicit filter (an empty filter silently drops leaf nodes). + +IMPORTANT: max_depth=1 is required for Symbol, Struct, and StructField diffs. Without it +the procedure recurses into children looking for the same label type and returns nothing +(Symbol/Struct/StructField nodes have no children of the same label). + +For struct field diffs scoped to a specific struct, pass at_path with the struct name: + at_path="/_EPROCESS" (note the leading slash) + +Struct field status_filter guidance: +- Omit status_filter (or use ["NEW","MOD","DEL"]) for delta-only: what changed +- Pass status_filter=["NEW","MOD","DEL","UNCHANGED"] to reconstruct the full C type layout + +Prefer get_struct / list_tree / list_registry_key / list_symbols unless you need raw hash access.`, + schema: { + base_node_hash: z + .string() + .min(1) + .describe( + "Base side node hash (from traverse_path or get_blobs_with_symbols)", + ), + diffee_node_hash: z + .string() + .min(1) + .describe( + "Diffee side node hash (from traverse_path or get_blobs_with_symbols)", + ), + parent_label: z + .string() + .min(1) + .describe("Node label of the root: 'Tree', 'WinRegKey', or 'Blob'"), + filter: z + .array(z.string()) + .min(1) + .describe("Node labels to include in results (must not be empty)"), + at_path: z + .string() + .optional() + .describe( + "Scope diff to a sub-path (default: '/'). For struct fields use e.g. '/_EPROCESS'", + ), + max_depth: z + .number() + .int() + .min(0) + .max(100) + .optional() + .describe("Depth of child traversal"), + limit: z + .number() + .int() + .positive() + .max(10000) + .optional() + .describe("Maximum number of diff items to return"), + offset: z + .number() + .int() + .nonnegative() + .optional() + .describe("Number of diff items to skip"), + status_filter: z + .array(z.enum(["NEW", "MOD", "DEL", "UNCHANGED"])) + .optional() + .describe("Optional diff statuses to include"), + with_intermediates: z + .boolean() + .optional() + .describe( + "Include intermediary directory nodes in recursive diffs", + ), + }, + handler: (sdk, params) => diffNodes({ ...params, sdk }), +}); diff --git a/mcp/src/tools/diff.ts b/mcp/src/tools/diff.ts new file mode 100644 index 0000000..1d5bb40 --- /dev/null +++ b/mcp/src/tools/diff.ts @@ -0,0 +1,176 @@ +import { z } from "zod"; +import { DiffStatus } from "../graphql/generated/sdk.js"; +import { resolveCommitRef } from "../resolve.js"; +import { defineTool } from "../types.js"; +import type { GraphqlSdk } from "../graphql/client.js"; + +export interface DiffVersionsResultItem { + status: DiffStatus; + path: string; + type: string; + old_props: { + hash: string; + properties: unknown; + } | null; + new_props: { + hash: string; + properties: unknown; + } | null; +} + +export interface DiffVersionsResult { + base_commit_hash: string; + diffee_commit_hash: string; + total_count: number; + items: DiffVersionsResultItem[]; +} + +interface DiffVersionsParams { + sdk: GraphqlSdk; + base_ref: string; + diffee_ref: string; + path: string; + max_depth?: number; + limit?: number; + offset?: number; + status_filter?: string[]; + with_intermediates?: boolean; +} + +function mapStatusFilter( + statusFilter?: string[], +): DiffStatus[] | null | undefined { + if (!statusFilter || statusFilter.length === 0) { + return undefined; + } + + const mapping: Record = { + NEW: DiffStatus.New, + MOD: DiffStatus.Mod, + DEL: DiffStatus.Del, + UNCHANGED: DiffStatus.Unchanged, + }; + + return statusFilter.map((status) => { + const upper = status.toUpperCase(); + const mapped = mapping[upper]; + if (!mapped) { + throw new Error( + `Invalid diff status "${status}". Valid statuses: NEW, MOD, DEL, UNCHANGED`, + ); + } + return mapped; + }); +} + +export async function diffVersions( + params: DiffVersionsParams, +): Promise { + const { sdk } = params; + const [base, diffee] = await Promise.all([ + resolveCommitRef(sdk, params.base_ref), + resolveCommitRef(sdk, params.diffee_ref), + ]); + + const response = await sdk.DiffNodesAt({ + parentLabel: "Tree", + baseNodeHash: base.filesystemHash, + diffeeNodeHash: diffee.filesystemHash, + atPath: params.path, + maxDepth: params.max_depth, + withIntermediates: params.with_intermediates ?? false, + filter: ["Tree", "Blob"], + options: + params.limit !== undefined || + params.offset !== undefined || + params.status_filter?.length + ? { + limit: params.limit, + offset: params.offset, + status_filter: mapStatusFilter(params.status_filter), + } + : undefined, + }); + + return { + base_commit_hash: base.commitHash, + diffee_commit_hash: diffee.commitHash, + total_count: response.diffNodesAt.total_count, + items: response.diffNodesAt.items.map((item) => ({ + status: item.status, + path: item.path, + type: item.type, + old_props: item.old_props + ? { + hash: item.old_props.hash, + properties: item.old_props.properties, + } + : null, + new_props: item.new_props + ? { + hash: item.new_props.hash, + properties: item.new_props.properties, + } + : null, + })), + }; +} + +export default defineTool({ + name: "diff_versions", + description: + "Compute a filesystem diff between two commits or branches at a specific path", + schema: { + base_ref: z + .string() + .min(1) + .describe( + "Older side of the comparison: commit hash or branch name", + ), + diffee_ref: z + .string() + .min(1) + .describe( + "Newer side of the comparison: commit hash or branch name", + ), + path: z + .string() + .startsWith("/") + .describe( + "Absolute filesystem path to diff, e.g. '/' or '/Windows/System32'", + ), + max_depth: z + .number() + .int() + .min(0) + .max(100) + .optional() + .describe( + "Depth of child traversal. If omitted, GraphQL applies its own default and auth rules.", + ), + limit: z + .number() + .int() + .positive() + .max(10000) + .optional() + .describe("Maximum number of diff items to return"), + offset: z + .number() + .int() + .nonnegative() + .optional() + .describe("Number of diff items to skip before returning results"), + status_filter: z + .array(z.enum(["NEW", "MOD", "DEL", "UNCHANGED"])) + .optional() + .describe("Optional diff statuses to include"), + with_intermediates: z + .boolean() + .optional() + .describe( + "Include intermediary directory nodes in recursive diffs", + ), + }, + handler: (sdk, params) => diffVersions({ ...params, sdk }), +}); diff --git a/mcp/src/tools/get-struct.ts b/mcp/src/tools/get-struct.ts new file mode 100644 index 0000000..6629c8b --- /dev/null +++ b/mcp/src/tools/get-struct.ts @@ -0,0 +1,95 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { resolveBlobHash } from "../resolve.js"; +import { defineTool } from "../types.js"; + +export interface StructField { + name: string; + offset: number; + data_type: unknown; +} + +export interface StructResult { + name: string; + hash: string; + size: number; + kind: string; + field_count: number; + fields: StructField[]; +} + +export async function getStruct( + sdk: GraphqlSdk, + ref: string, + blob_path: string, + struct_name: string, +): Promise { + const blobHash = await resolveBlobHash(sdk, ref, blob_path); + + const byName = await sdk.FetchStructByName({ + blobHash, + structName: struct_name, + }); + + const blob = byName.blobs[0]; + if (!blob) { + throw new Error(`${blob_path} has no PDB symbol or struct data`); + } + + const edge = blob.has_structConnection.edges[0]; + if (!edge) { + throw new Error( + `Struct "${struct_name}" not found in ${blob_path}. Use list_structs to see what is available.`, + ); + } + + const fieldsResult = await sdk.FetchStructFields({ + structHash: edge.node.hash, + }); + + const fields = (fieldsResult.structs[0]?.fieldsConnection.edges ?? []) + .map((e) => ({ + name: e.properties.name, + offset: e.node.offset, + data_type: e.node.data_type, + })) + .sort((a, b) => a.offset - b.offset); + + return { + name: edge.properties.name, + hash: edge.node.hash, + size: edge.node.size, + kind: edge.node.kind, + field_count: fields.length, + fields, + }; +} + +export default defineTool({ + name: "get_struct", + description: `Read a C struct's full field layout from a PE file's PDB data, by name. + +Returns every field with its name, byte offset and type, sorted by offset (the complete type layout, not a delta). + +Example: get_struct(ref="windows_11_24h2", blob_path="/Windows/System32/ntoskrnl.exe", struct_name="_EPROCESS") + +Use list_structs to discover which structs a PE file exposes. To compare a struct across two OS versions, use diff_nodes with filter=["StructField"], at_path="/" and max_depth=1.`, + schema: { + ref: z + .string() + .min(1) + .describe("Branch name or 40-character commit hash"), + blob_path: z + .string() + .startsWith("/") + .describe( + "Absolute path to the PE file, e.g. '/Windows/System32/ntoskrnl.exe'", + ), + struct_name: z + .string() + .min(1) + .describe("Exact struct name, e.g. '_EPROCESS'"), + }, + handler: (sdk, { ref, blob_path, struct_name }) => + getStruct(sdk, ref, blob_path, struct_name), +}); diff --git a/mcp/src/tools/git-log.ts b/mcp/src/tools/git-log.ts new file mode 100644 index 0000000..17fe824 --- /dev/null +++ b/mcp/src/tools/git-log.ts @@ -0,0 +1,139 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { Page, offsetPage } from "../pagination.js"; +import { defineTool } from "../types.js"; + +export interface GitLogCommit { + hash: string; + name: string; + date: string; +} + +export interface GitLogItem { + base_commit: GitLogCommit | null; + diffee_commit: GitLogCommit; + status: string; + path: string; + type: string; + old_props: { hash: string; properties: unknown } | null; + new_props: { hash: string; properties: unknown } | null; +} + +export interface GitLogParams { + path: string; + entity_type: string; + commit_range: Record; + limit?: number; + offset?: number; + status_filter?: string[]; + order?: string; +} + +export async function gitLog( + sdk: GraphqlSdk, + params: GitLogParams, +): Promise & { total_count: number }> { + const offset = params.offset ?? 0; + + const response = await sdk.GitLog({ + path: params.path, + // The GraphQL argument is named `context`; the tool exposes it as + // `entity_type`, which is what it actually is. + context: params.entity_type as any, + commitRange: params.commit_range as any, + options: { + limit: params.limit, + offset, + status_filter: params.status_filter as any, + order: params.order as any, + }, + }); + + const result = response.gitLog; + const items: GitLogItem[] = result.entries.map((e) => ({ + base_commit: e.base_commit ?? null, + diffee_commit: e.diffee_commit, + status: e.diff.status, + path: e.diff.path, + type: e.diff.type, + old_props: e.diff.old_props ?? null, + new_props: e.diff.new_props ?? null, + })); + + return { + ...offsetPage(items, offset, result.has_more), + total_count: result.total_count, + }; +} + +export default defineTool({ + name: "git_log", + description: `Track how one entity changed across commit history: when it last changed, in which update, and what changed. + +This is the "when did this change" tool. Example: git_log(path="/Windows/System32/ntdll.dll", entity_type="FILESYSTEM", commit_range={startRef: "windows_11_24h2"}). + +\`entity_type\` selects which graph the path lives in: FILESYSTEM for files and directories, REGISTRY for registry keys, STRUCT or SYMBOL for PDB entities. + +\`commit_range\` is the same shape \`search\` takes: {startRef, direction, include_updates, branch, endRef}. startRef is a branch name or a 40-character commit hash; direction defaults to BACKWARD. + +An entry with a null base_commit is the entity's first appearance in the traversed history. \`next_cursor\` is the offset for the next page, pass it back as \`offset\`. + +Related but different: list_commits tells you which snapshots exist; git_log tells you what changed at a path across them.`, + schema: { + path: z + .string() + .startsWith("/") + .describe("Absolute path of the entity to track"), + entity_type: z + .enum(["FILESYSTEM", "REGISTRY", "STRUCT", "SYMBOL"]) + .describe("Which graph the path lives in"), + commit_range: z + .object({ + startRef: z + .string() + .min(1) + .describe("Branch name or 40-character commit hash"), + direction: z + .enum(["BACKWARD", "FORWARD"]) + .optional() + .describe("Traversal direction (default: BACKWARD)"), + include_updates: z + .boolean() + .optional() + .describe("Traverse update/patch branches"), + branch: z + .string() + .nullish() + .describe("Constrain traversal to a tracked branch"), + endRef: z + .string() + .nullish() + .describe("Commit hash bounding the range"), + }) + .describe("Commit range to traverse"), + limit: z + .number() + .int() + .positive() + .max(500) + .optional() + .describe("Entries per page (default: 50)"), + offset: z + .number() + .int() + .nonnegative() + .optional() + .describe( + "Entries to skip; pass back the previous next_cursor here", + ), + status_filter: z + .array(z.enum(["NEW", "MOD", "DEL", "UNCHANGED"])) + .optional() + .describe("Restrict to specific change types"), + order: z + .enum(["ASC", "DESC"]) + .optional() + .describe("DESC = newest first (default), ASC = oldest first"), + }, + handler: (sdk, params) => gitLog(sdk, params as GitLogParams), +}); diff --git a/mcp/src/tools/index.ts b/mcp/src/tools/index.ts new file mode 100644 index 0000000..897ad53 --- /dev/null +++ b/mcp/src/tools/index.ts @@ -0,0 +1,38 @@ +import type { ToolModule } from "../types.js"; +import listBranches from "./branches.js"; +import listCommits from "./commits.js"; +import diffVersions from "./diff.js"; +import search from "./search.js"; +import searchNext from "./search-next.js"; +import searchClose from "./search-close.js"; +import traversePath from "./traverse-path.js"; +import getWinregRoot from "./winreg-root.js"; +import getBlobsWithSymbols from "./blobs-with-symbols.js"; +import diffNodes from "./diff-nodes.js"; +import getStruct from "./get-struct.js"; +import listStructs from "./list-structs.js"; +import listSymbols from "./list-symbols.js"; +import listTree from "./list-tree.js"; +import listRegistryKey from "./list-registry-key.js"; +import gitLog from "./git-log.js"; +import getCommitCapabilities from "./commit-capabilities.js"; + +export const tools: ToolModule[] = [ + listBranches, + listCommits, + diffVersions, + search, + searchNext, + searchClose, + traversePath, + getWinregRoot, + getBlobsWithSymbols, + diffNodes, + getStruct, + listStructs, + listSymbols, + listTree, + listRegistryKey, + gitLog, + getCommitCapabilities, +]; diff --git a/mcp/src/tools/list-registry-key.ts b/mcp/src/tools/list-registry-key.ts new file mode 100644 index 0000000..4628dd0 --- /dev/null +++ b/mcp/src/tools/list-registry-key.ts @@ -0,0 +1,141 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { resolveHiveRoot } from "../resolve.js"; +import type { Hive } from "../resolve.js"; +import { + advanceCursor, + compositeHasMore, + decodeCursor, + encodeCursor, +} from "../pagination.js"; +import { defineTool } from "../types.js"; + +export interface Subkey { + name: string; + hash: string; +} + +export interface RegValue { + name: string; + type: string; + value: string; +} + +export interface ListRegistryKeyResult { + subkeys: Subkey[]; + values: RegValue[]; + has_more: boolean; + next_cursor: string | null; +} + +const KEYS = ["keys", "values"]; +const DEFAULT_LIMIT = 100; + +export async function listRegistryKey( + sdk: GraphqlSdk, + ref: string, + hive: Hive, + key_path: string, + limit?: number, + cursor?: string, +): Promise { + const rootHash = await resolveHiveRoot(sdk, ref, hive); + + let keyHash = rootHash; + if (key_path !== "/") { + const traversed = await sdk.TraverseRegistryPath({ + rootHash, + path: key_path, + }); + if (!traversed.traversePath) { + throw new Error( + `Registry key not found in ${hive} ("${ref}"): ${key_path}`, + ); + } + keyHash = traversed.traversePath; + } + + const state = decodeCursor(cursor, KEYS); + const includeKeys = state.keys !== null; + const includeValues = state.values !== null; + + const result = await sdk.ListRegistryKey({ + keyHash, + first: limit ?? DEFAULT_LIMIT, + afterKeys: state.keys || undefined, + afterValues: state.values || undefined, + includeKeys, + includeValues, + }); + + const key = result.winRegKeys[0]; + if (!key) { + throw new Error( + `Registry key not found in ${hive} ("${ref}"): ${key_path}`, + ); + } + + const subkeys = key.child_keysConnection; + const values = key.child_valuesConnection; + + const next = advanceCursor(state, { + keys: subkeys?.pageInfo, + values: values?.pageInfo, + }); + const has_more = compositeHasMore(next); + + return { + subkeys: (subkeys?.edges ?? []).map((e) => ({ + name: e.properties.name, + hash: e.node.hash, + })), + values: (values?.edges ?? []).map((e) => ({ + name: e.properties.name, + type: e.node.type, + value: e.node.value, + })), + has_more, + next_cursor: has_more ? encodeCursor(next) : null, + }; +} + +export default defineTool({ + name: "list_registry_key", + description: `List the subkeys and values under a Windows registry key in an OS snapshot. + +\`hive\` is the hive name, not its on-disk file: SAM, SECURITY, SOFTWARE, SYSTEM or DEFAULT. \`key_path\` is the path below that hive root, so HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run is hive="SOFTWARE", key_path="/Microsoft/Windows/CurrentVersion/Run". Pass key_path="/" for the hive root. + +\`limit\` applies per category, so a limit of 100 can return up to 100 subkeys and 100 values. Pass \`next_cursor\` back as \`cursor\` unchanged. + +To diff a registry subtree across two versions, use traverse_path + get_winreg_root + diff_nodes with parent_label="WinRegKey" and filter=["WinRegKey","WinRegValue"].`, + schema: { + ref: z + .string() + .min(1) + .describe("Branch name or 40-character commit hash"), + hive: z + .enum(["SAM", "SECURITY", "SOFTWARE", "SYSTEM", "DEFAULT"]) + .describe("Registry hive name"), + key_path: z + .string() + .startsWith("/") + .describe( + "Key path below the hive root, e.g. '/Microsoft/Windows/CurrentVersion/Run'. Use '/' for the hive root.", + ), + limit: z + .number() + .int() + .positive() + .max(500) + .optional() + .describe("Entries per category per page (default: 100)"), + cursor: z + .string() + .optional() + .describe( + "next_cursor from the previous page, passed back unchanged", + ), + }, + handler: (sdk, { ref, hive, key_path, limit, cursor }) => + listRegistryKey(sdk, ref, hive, key_path, limit, cursor), +}); diff --git a/mcp/src/tools/list-structs.ts b/mcp/src/tools/list-structs.ts new file mode 100644 index 0000000..721cce0 --- /dev/null +++ b/mcp/src/tools/list-structs.ts @@ -0,0 +1,94 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { resolveBlobHash } from "../resolve.js"; +import { Page, singlePage } from "../pagination.js"; +import { defineTool } from "../types.js"; + +export interface StructItem { + name: string; + hash: string; + size: number; + kind: string; +} + +const DEFAULT_LIMIT = 50; + +export async function listStructs( + sdk: GraphqlSdk, + ref: string, + blob_path: string, + name?: string, + limit?: number, + cursor?: string, +): Promise & { total_count: number }> { + const blobHash = await resolveBlobHash(sdk, ref, blob_path); + const first = limit ?? DEFAULT_LIMIT; + + const result = name + ? await sdk.ListStructsByName({ + blobHash, + structName: name, + first, + after: cursor, + }) + : await sdk.ListStructs({ blobHash, first, after: cursor }); + + const connection = result.blobs[0]?.has_structConnection; + if (!connection) { + throw new Error(`${blob_path} has no PDB symbol or struct data`); + } + + const items = connection.edges.map((e) => ({ + name: e.properties.name, + hash: e.node.hash, + size: e.node.size, + kind: e.node.kind, + })); + + return { + ...singlePage(items, connection.pageInfo), + total_count: connection.totalCount, + }; +} + +export default defineTool({ + name: "list_structs", + description: `List the C structs a PE file's PDB data defines, with their size and kind. + +Use this to discover struct names before calling get_struct, which returns a single struct's full field layout. + +Pass \`name\` for an exact-match lookup. Pass \`next_cursor\` back as \`cursor\` for the next page; \`total_count\` reports the full size of the list.`, + schema: { + ref: z + .string() + .min(1) + .describe("Branch name or 40-character commit hash"), + blob_path: z + .string() + .startsWith("/") + .describe( + "Absolute path to the PE file, e.g. '/Windows/System32/ntoskrnl.exe'", + ), + name: z + .string() + .optional() + .describe( + "Exact struct name for a direct lookup, e.g. '_EPROCESS'", + ), + limit: z + .number() + .int() + .positive() + .max(500) + .optional() + .describe("Results per page (default: 50)"), + cursor: z + .string() + .optional() + .describe( + "next_cursor from the previous page, passed back unchanged", + ), + }, + handler: (sdk, { ref, blob_path, name, limit, cursor }) => + listStructs(sdk, ref, blob_path, name, limit, cursor), +}); diff --git a/mcp/src/tools/list-symbols.ts b/mcp/src/tools/list-symbols.ts new file mode 100644 index 0000000..2de5616 --- /dev/null +++ b/mcp/src/tools/list-symbols.ts @@ -0,0 +1,90 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { resolveBlobHash } from "../resolve.js"; +import { Page, singlePage } from "../pagination.js"; +import { defineTool } from "../types.js"; + +export interface SymbolItem { + name: string; + hash: string; + address: string; +} + +const DEFAULT_LIMIT = 50; + +export async function listSymbols( + sdk: GraphqlSdk, + ref: string, + blob_path: string, + name?: string, + limit?: number, + cursor?: string, +): Promise & { total_count: number }> { + const blobHash = await resolveBlobHash(sdk, ref, blob_path); + const first = limit ?? DEFAULT_LIMIT; + + const result = name + ? await sdk.ListSymbolsByName({ + blobHash, + symbolName: name, + first, + after: cursor, + }) + : await sdk.ListSymbols({ blobHash, first, after: cursor }); + + const connection = result.blobs[0]?.has_symbolConnection; + if (!connection) { + throw new Error(`${blob_path} has no PDB symbol or struct data`); + } + + const items = connection.edges.map((e) => ({ + name: e.properties.name, + hash: e.node.hash, + address: e.node.address, + })); + + return { + ...singlePage(items, connection.pageInfo), + total_count: connection.totalCount, + }; +} + +export default defineTool({ + name: "list_symbols", + description: `List the PDB symbols exported by a PE file, with their addresses. + +Pass \`name\` for an exact-match lookup: list_symbols(ref="windows_11_24h2", blob_path="/Windows/System32/ntdll.dll", name="NtCreateFile") answers "what is the address of NtCreateFile". + +Without \`name\` this pages the whole symbol table, which is large; ntdll.dll alone has thousands. \`total_count\` reports the full size. Pass \`next_cursor\` back as \`cursor\` for the next page.`, + schema: { + ref: z + .string() + .min(1) + .describe("Branch name or 40-character commit hash"), + blob_path: z + .string() + .startsWith("/") + .describe( + "Absolute path to the PE file, e.g. '/Windows/System32/ntdll.dll'", + ), + name: z + .string() + .optional() + .describe("Exact symbol name for a direct lookup"), + limit: z + .number() + .int() + .positive() + .max(500) + .optional() + .describe("Results per page (default: 50)"), + cursor: z + .string() + .optional() + .describe( + "next_cursor from the previous page, passed back unchanged", + ), + }, + handler: (sdk, { ref, blob_path, name, limit, cursor }) => + listSymbols(sdk, ref, blob_path, name, limit, cursor), +}); diff --git a/mcp/src/tools/list-tree.ts b/mcp/src/tools/list-tree.ts new file mode 100644 index 0000000..e677e0f --- /dev/null +++ b/mcp/src/tools/list-tree.ts @@ -0,0 +1,114 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { resolveTreeHash } from "../resolve.js"; +import { + advanceCursor, + compositeHasMore, + decodeCursor, + encodeCursor, +} from "../pagination.js"; +import { defineTool } from "../types.js"; + +export interface Entry { + name: string; + hash: string; +} + +export interface ListTreeResult { + directories: Entry[]; + files: Entry[]; + has_more: boolean; + next_cursor: string | null; +} + +const KEYS = ["trees", "blobs"]; +const DEFAULT_LIMIT = 100; + +export async function listTree( + sdk: GraphqlSdk, + ref: string, + path: string, + limit?: number, + cursor?: string, +): Promise { + const treeHash = await resolveTreeHash(sdk, ref, path); + const state = decodeCursor(cursor, KEYS); + + // A connection that is already exhausted is simply not requested. + const includeTrees = state.trees !== null; + const includeBlobs = state.blobs !== null; + + const result = await sdk.ListTree({ + treeHash, + first: limit ?? DEFAULT_LIMIT, + afterTrees: state.trees || undefined, + afterBlobs: state.blobs || undefined, + includeTrees, + includeBlobs, + }); + + const tree = result.trees[0]; + if (!tree) { + throw new Error( + `${path} is not a directory in "${ref}" (or it holds no entries)`, + ); + } + + const trees = tree.child_treesConnection; + const blobs = tree.child_blobsConnection; + + const next = advanceCursor(state, { + trees: trees?.pageInfo, + blobs: blobs?.pageInfo, + }); + const has_more = compositeHasMore(next); + + return { + directories: (trees?.edges ?? []).map((e) => ({ + name: e.properties.name, + hash: e.node.hash, + })), + files: (blobs?.edges ?? []).map((e) => ({ + name: e.properties.name, + hash: e.node.hash, + })), + has_more, + next_cursor: has_more ? encodeCursor(next) : null, + }; +} + +export default defineTool({ + name: "list_tree", + description: `List the contents of a directory in an OS snapshot: subdirectories and files, with their node hashes. + +Example: list_tree(ref="windows_11_24h2", path="/Windows/System32/drivers") + +\`limit\` applies per category, so a limit of 100 can return up to 100 directories and 100 files. Pass \`next_cursor\` back as \`cursor\` unchanged to get the next page; it encodes the position of both lists at once. + +The returned hashes are what \`diff_nodes\` takes if you need a raw diff at this level.`, + schema: { + ref: z + .string() + .min(1) + .describe("Branch name or 40-character commit hash"), + path: z + .string() + .startsWith("/") + .describe("Absolute directory path, e.g. '/Windows/System32'"), + limit: z + .number() + .int() + .positive() + .max(500) + .optional() + .describe("Entries per category per page (default: 100)"), + cursor: z + .string() + .optional() + .describe( + "next_cursor from the previous page, passed back unchanged", + ), + }, + handler: (sdk, { ref, path, limit, cursor }) => + listTree(sdk, ref, path, limit, cursor), +}); diff --git a/mcp/src/tools/search-close.ts b/mcp/src/tools/search-close.ts new file mode 100644 index 0000000..e1c109e --- /dev/null +++ b/mcp/src/tools/search-close.ts @@ -0,0 +1,26 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { defineTool } from "../types.js"; + +export async function searchClose( + sdk: GraphqlSdk, + session_id: string, +): Promise { + const result = await sdk.SearchClose({ sessionId: session_id }); + return result.searchClose; +} + +export default defineTool({ + name: "search_close", + description: + "Close a search session to free server resources. Sessions auto-expire after 5 minutes of inactivity, so this is optional but recommended when done searching.", + schema: { + session_id: z.string().describe("Session ID to close"), + }, + handler: async (sdk, { session_id }) => { + const closed = await searchClose(sdk, session_id); + return closed + ? "Session closed successfully." + : "Session not found (may have already expired)."; + }, +}); diff --git a/mcp/src/tools/search-next.ts b/mcp/src/tools/search-next.ts new file mode 100644 index 0000000..df18680 --- /dev/null +++ b/mcp/src/tools/search-next.ts @@ -0,0 +1,39 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { SearchResponse } from "./search.js"; +import { defineTool } from "../types.js"; + +export async function searchNext( + sdk: GraphqlSdk, + session_id: string, +): Promise { + const result = await sdk.SearchNext({ sessionId: session_id }); + + const page = result.searchNext; + return { + session_id: page.session_id ?? null, + results: page.results.map((r) => ({ + type: r.type, + commit_name: r.commit_name, + commit_hash: r.commit_hash, + blob_path: r.blob_path, + blob_hash: r.blob_hash, + entity_path: r.entity_path, + node_hash: r.node_hash, + })), + has_more: page.has_more, + total_fetched: page.total_fetched, + }; +} + +export default defineTool({ + name: "search_next", + description: + "Fetch the next page of results from a paginated search session. Returns the same format as search. When has_more is false, the session is automatically closed.", + schema: { + session_id: z + .string() + .describe("Session ID returned by a previous search call"), + }, + handler: (sdk, { session_id }) => searchNext(sdk, session_id), +}); diff --git a/mcp/src/tools/search.ts b/mcp/src/tools/search.ts new file mode 100644 index 0000000..84a627b --- /dev/null +++ b/mcp/src/tools/search.ts @@ -0,0 +1,157 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { + CommitHistoryDirection, + EntityType, +} from "../graphql/generated/sdk.js"; +import { defineTool } from "../types.js"; + +export interface SearchResult { + type: string; + commit_name: string; + commit_hash: string; + blob_path: string; + blob_hash: string; + entity_path?: string | null; + node_hash: string; +} + +export interface SearchResponse { + session_id: string | null; + results: SearchResult[]; + has_more: boolean; + total_fetched: number; +} + +const DEFAULT_LIMIT = 50; + +export async function search(params: { + sdk: GraphqlSdk; + search_term: string; + start_ref: string; + direction?: string; + include_updates?: boolean; + branch?: string; + end_ref?: string; + entity_types?: string[]; + case_sensitive?: boolean; + limit?: number; +}): Promise { + const { sdk } = params; + const direction = + params.direction === "FORWARD" + ? CommitHistoryDirection.Forward + : CommitHistoryDirection.Backward; + + const entity_types = params.entity_types?.map((t) => { + const mapping: Record = { + FILESYSTEM: EntityType.Filesystem, + REGISTRY: EntityType.Registry, + STRUCT: EntityType.Struct, + SYMBOL: EntityType.Symbol, + }; + if (!mapping[t]) { + throw new Error( + `Invalid entity type "${t}". Valid types: FILESYSTEM, REGISTRY, STRUCT, SYMBOL`, + ); + } + return mapping[t]; + }); + + const pageSize = params.limit ?? DEFAULT_LIMIT; + + const result = await sdk.SearchWithSession({ + input: { + commit_range: { + startRef: params.start_ref, + direction, + include_updates: params.include_updates ?? false, + branch: params.branch ?? null, + endRef: params.end_ref ?? null, + }, + search_term: params.search_term, + entity_types: entity_types ?? null, + case_sensitive: params.case_sensitive ?? false, + }, + pageSize, + }); + + const page = result.searchWithSession; + return { + session_id: page.session_id ?? null, + results: page.results.map((r) => ({ + type: r.type, + commit_name: r.commit_name, + commit_hash: r.commit_hash, + blob_path: r.blob_path, + blob_hash: r.blob_hash, + entity_path: r.entity_path, + node_hash: r.node_hash, + })), + has_more: page.has_more, + total_fetched: page.total_fetched, + }; +} + +export default defineTool({ + name: "search", + description: + "Search for files, registry keys, symbols, or structs across OS versions by substring match. `start_ref` accepts either a branch name or a 40-character commit hash. If the value is not a 40-character hash, it is treated as a branch name. To search a single snapshot, resolve and pass the exact commit hash (optionally set `end_ref` to the same hash). `entity_types` must use uppercase enum values: `FILESYSTEM`, `REGISTRY`, `STRUCT`, `SYMBOL`. Returns paginated results with a session_id. Use search_next to fetch more results, search_close to end the session.", + schema: { + search_term: z + .string() + .min(1) + .max(500) + .describe( + "Substring to search for (e.g. 'ntdll.dll', 'Defender', '_EPROCESS')", + ), + start_ref: z + .string() + .describe( + "Starting point for commit traversal: either a branch name or an exact 40-character commit hash. Non-hash values are treated as branch names.", + ), + direction: z + .enum(["BACKWARD", "FORWARD"]) + .optional() + .describe( + "Commit traversal direction from start_ref (default: BACKWARD). This controls history traversal, not single-snapshot selection.", + ), + include_updates: z + .boolean() + .optional() + .describe( + "Whether to traverse update or patch branches in commit history. `false` does not mean single-commit search; it only keeps traversal directed.", + ), + branch: z + .string() + .optional() + .describe( + "Optional branch filter to constrain traversal to commits reachable from a specific tracked branch.", + ), + end_ref: z + .string() + .optional() + .describe( + "Optional commit hash to bound the search range. For a single-snapshot search, use the same 40-character commit hash for both start_ref and end_ref.", + ), + entity_types: z + .array(z.enum(["FILESYSTEM", "REGISTRY", "STRUCT", "SYMBOL"])) + .optional() + .describe( + "Entity types to search (default: all types). Must use uppercase enum values: FILESYSTEM, REGISTRY, STRUCT, SYMBOL.", + ), + case_sensitive: z + .boolean() + .optional() + .describe("Case-sensitive matching (default: false)"), + limit: z + .number() + .int() + .positive() + .optional() + .describe( + "Max results per page (default: 50). Use search_next with the returned session_id to get more results.", + ), + }, + handler: (sdk, params) => search({ ...params, sdk }), +}); diff --git a/mcp/src/tools/traverse-path.ts b/mcp/src/tools/traverse-path.ts new file mode 100644 index 0000000..2d5aa5b --- /dev/null +++ b/mcp/src/tools/traverse-path.ts @@ -0,0 +1,46 @@ +import { z } from "zod"; +import { resolveCommitRef } from "../resolve.js"; +import { defineTool } from "../types.js"; +import type { GraphqlSdk } from "../graphql/client.js"; + +export interface TraversePathResult { + hash: string | null; +} + +export async function traversePath( + sdk: GraphqlSdk, + ref: string, + path: string, +): Promise { + const { filesystemHash } = await resolveCommitRef(sdk, ref); + + const result = await sdk.TraversePath({ + parentLabel: "Tree", + treeHash: filesystemHash, + path, + }); + + return { hash: result.traversePath ?? null }; +} + +export default defineTool({ + name: "traverse_path", + description: `Walk the filesystem hierarchy of a commit to an absolute path and return its node hash. + +Returns the hash of the node (Tree or Blob) located at the given path within the commit's filesystem. +Returns null if the path does not exist. + +Use this to locate specific files or directories before calling diff_nodes or get_winreg_root. + +Prefer get_struct / list_tree / list_registry_key / list_symbols unless you need raw hash access.`, + schema: { + ref: z.string().min(1).describe("Branch name or commit hash"), + path: z + .string() + .startsWith("/") + .describe( + "Absolute filesystem path to locate, e.g. '/Windows/System32/config/SAM'", + ), + }, + handler: (sdk, { ref, path }) => traversePath(sdk, ref, path), +}); diff --git a/mcp/src/tools/winreg-root.ts b/mcp/src/tools/winreg-root.ts new file mode 100644 index 0000000..8bb917c --- /dev/null +++ b/mcp/src/tools/winreg-root.ts @@ -0,0 +1,46 @@ +import { z } from "zod"; +import { GraphqlSdk } from "../graphql/client.js"; +import { defineTool } from "../types.js"; + +export interface WinregRootResult { + winreg_hash: string | null; +} + +export async function getWinregRoot( + sdk: GraphqlSdk, + blob_hash: string, +): Promise { + const result = await sdk.GetBlobWinRegRoot({ hash: blob_hash }); + const blob = result.blobs[0]; + return { winreg_hash: blob?.has_winreg?.hash ?? null }; +} + +export default defineTool({ + name: "get_winreg_root", + description: `Resolve a Blob hash to its Windows registry root (WinRegKey) hash by following the HAS_WINREG relationship. + +Use this after traverse_path to get the registry root hash needed for diff_nodes registry diffs. + +Known Windows registry hive locations: + HKEY_LOCAL_MACHINE/SAM → /Windows/System32/config/SAM + HKEY_LOCAL_MACHINE/SECURITY → /Windows/System32/config/SECURITY + HKEY_LOCAL_MACHINE/SOFTWARE → /Windows/System32/config/SOFTWARE + HKEY_LOCAL_MACHINE/SYSTEM → /Windows/System32/config/SYSTEM + HKEY_USERS/.DEFAULT → /Windows/System32/config/DEFAULT + +Registry diff procedure: + 1. traverse_path(base_ref, "/Windows/System32/config/SOFTWARE") → hash_A + 2. get_winreg_root(hash_A) → winreg_hash_A + 3. traverse_path(diffee_ref, "/Windows/System32/config/SOFTWARE") → hash_B + 4. get_winreg_root(hash_B) → winreg_hash_B + 5. diff_nodes(winreg_hash_A, winreg_hash_B, parent_label="WinRegKey", filter=["WinRegKey","WinRegValue"]) + +Prefer get_struct / list_tree / list_registry_key / list_symbols unless you need raw hash access.`, + schema: { + blob_hash: z + .string() + .min(1) + .describe("Blob node hash (from traverse_path)"), + }, + handler: (sdk, { blob_hash }) => getWinregRoot(sdk, blob_hash), +}); diff --git a/mcp/src/types.ts b/mcp/src/types.ts new file mode 100644 index 0000000..b33f3e7 --- /dev/null +++ b/mcp/src/types.ts @@ -0,0 +1,23 @@ +import type { z } from "zod"; +import type { GraphqlSdk } from "./graphql/client.js"; + +/** + * A tool is a self-describing module. server.ts iterates these and applies the + * content/error envelope once, instead of repeating it per handler. + */ +export interface ToolModule { + name: string; + description: string; + schema: S; + handler: ( + sdk: GraphqlSdk, + args: z.objectOutputType, + ) => Promise; +} + +/** Identity helper that pins S so handler args are inferred from the schema. */ +export function defineTool( + tool: ToolModule, +): ToolModule { + return tool; +} diff --git a/mcp/tests/blobs-with-symbols.test.ts b/mcp/tests/blobs-with-symbols.test.ts new file mode 100644 index 0000000..39642a0 --- /dev/null +++ b/mcp/tests/blobs-with-symbols.test.ts @@ -0,0 +1,80 @@ +import { jest } from "@jest/globals"; + +const mockResolveCommitRef = jest.fn(); +const mockGetBlobsWithSymbols = jest.fn(); + +jest.unstable_mockModule("../src/resolve.js", () => ({ + resolveCommitRef: mockResolveCommitRef, +})); + +const { getBlobsWithSymbols } = await import( + "../src/tools/blobs-with-symbols.js" +); +const sdk = { + GetBlobsWithSymbols: mockGetBlobsWithSymbols, +} as any; + +describe("getBlobsWithSymbols", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("returns blobs with symbols for a commit ref", async () => { + mockResolveCommitRef.mockResolvedValue({ + commitHash: "c".repeat(40), + filesystemHash: "f".repeat(40), + }); + mockGetBlobsWithSymbols.mockResolvedValue({ + getBlobsWithSymbols: [ + { + blob_hash: "hash1", + blob_path: "/Windows/System32/ntdll.dll", + }, + { + blob_hash: "hash2", + blob_path: "/Windows/System32/kernel32.dll", + }, + ], + }); + + const result = await getBlobsWithSymbols(sdk, "windows_11_23h2"); + + expect(mockResolveCommitRef).toHaveBeenCalledWith( + sdk, + "windows_11_23h2", + ); + expect(mockGetBlobsWithSymbols).toHaveBeenCalledWith({ + commitHash: "c".repeat(40), + }); + expect(result).toEqual([ + { blob_hash: "hash1", blob_path: "/Windows/System32/ntdll.dll" }, + { blob_hash: "hash2", blob_path: "/Windows/System32/kernel32.dll" }, + ]); + }); + + it("returns empty array when no blobs have symbols", async () => { + mockResolveCommitRef.mockResolvedValue({ + commitHash: "c".repeat(40), + filesystemHash: "f".repeat(40), + }); + mockGetBlobsWithSymbols.mockResolvedValue({ + getBlobsWithSymbols: [], + }); + + const result = await getBlobsWithSymbols(sdk, "some_ref"); + + expect(result).toEqual([]); + }); + + it("throws when ref cannot be resolved", async () => { + mockResolveCommitRef.mockRejectedValue( + new Error("Branch or commit not found: missing"), + ); + + await expect(getBlobsWithSymbols(sdk, "missing")).rejects.toThrow( + "Branch or commit not found: missing", + ); + + expect(mockGetBlobsWithSymbols).not.toHaveBeenCalled(); + }); +}); diff --git a/mcp/tests/branches.test.ts b/mcp/tests/branches.test.ts new file mode 100644 index 0000000..b13bd5e --- /dev/null +++ b/mcp/tests/branches.test.ts @@ -0,0 +1,102 @@ +import { jest } from "@jest/globals"; + +const mockFetchBranches = jest.fn(); +const sdk = { + FetchBranches: mockFetchBranches, +} as any; + +const { listBranches } = await import("../src/tools/branches.js"); + +const MOCK_BRANCHES_RESPONSE = { + branches: [ + { + name: "windows_11_23h2", + tracks: { + hash: "aaaa".repeat(10), + name: "Windows 11 23H2", + date: "2023-10-31T00:00:00Z", + }, + }, + { + name: "windows_10_22h2", + tracks: { + hash: "bbbb".repeat(10), + name: "Windows 10 22H2", + date: "2022-10-18T00:00:00Z", + }, + }, + { + name: "ubuntu_22.04", + tracks: { + hash: "cccc".repeat(10), + name: "Ubuntu 22.04", + date: "2022-04-21T00:00:00Z", + }, + }, + { + name: "empty_branch", + tracks: null, + }, + ], +}; + +describe("listBranches", () => { + beforeEach(() => { + mockFetchBranches.mockReset(); + mockFetchBranches.mockResolvedValue(MOCK_BRANCHES_RESPONSE); + }); + + it("returns all branches without search filter", async () => { + const result = await listBranches(sdk); + + expect(mockFetchBranches).toHaveBeenCalledTimes(1); + expect(result).toHaveLength(4); + expect(result[0]).toEqual({ + name: "windows_11_23h2", + headCommit: { + hash: "aaaa".repeat(10), + name: "Windows 11 23H2", + date: "2023-10-31T00:00:00Z", + }, + }); + }); + + it("filters branches by search term (case-insensitive)", async () => { + const result = await listBranches(sdk, "windows"); + + expect(result).toHaveLength(2); + expect(result.map((b) => b.name)).toEqual([ + "windows_11_23h2", + "windows_10_22h2", + ]); + }); + + it("filters with uppercase search term", async () => { + const result = await listBranches(sdk, "UBUNTU"); + + expect(result).toHaveLength(1); + expect(result[0].name).toBe("ubuntu_22.04"); + }); + + it("returns empty array when no branches match", async () => { + const result = await listBranches(sdk, "nonexistent"); + + expect(result).toHaveLength(0); + }); + + it("handles branches with null tracks", async () => { + const result = await listBranches(sdk); + const emptyBranch = result.find((b) => b.name === "empty_branch"); + + expect(emptyBranch).toBeDefined(); + expect(emptyBranch!.headCommit).toBeNull(); + }); + + it("propagates GraphQL errors", async () => { + mockFetchBranches.mockRejectedValue( + new Error("GraphQL error: Service unavailable"), + ); + + await expect(listBranches(sdk)).rejects.toThrow("Service unavailable"); + }); +}); diff --git a/mcp/tests/client.test.ts b/mcp/tests/client.test.ts new file mode 100644 index 0000000..da52516 --- /dev/null +++ b/mcp/tests/client.test.ts @@ -0,0 +1,54 @@ +import { jest } from "@jest/globals"; +import nock from "nock"; +import { createSdk } from "../src/graphql/client.js"; + +const API = "http://localhost:4000"; + +describe("createSdk", () => { + afterEach(() => { + nock.cleanAll(); + }); + + it("sends no Authorization header even when a caller forces a credential in", async () => { + // The API is public and unauthenticated. Nothing in this client may + // transmit a credential, including one a caller supplies by mistake or + // through an untyped call site. + let seenAuth: string | undefined = "unset"; + + nock(API) + .post("/graphql") + .reply(function () { + seenAuth = this.req.headers.authorization as string | undefined; + return [200, { data: { branches: [] } }]; + }); + + const sdk = ( + createSdk as unknown as ( + auth?: string, + ) => ReturnType + )("Bearer super-secret"); + await sdk.FetchBranches(); + + expect(seenAuth).toBeUndefined(); + }); + + it("throws with the GraphQL error message", async () => { + nock(API) + .post("/graphql") + .reply(200, { errors: [{ message: "boom" }] }); + + const sdk = createSdk(); + await expect(sdk.FetchBranches()).rejects.toThrow( + "GraphQL error: boom", + ); + }); + + it("throws on a non-2xx response", async () => { + nock(API).post("/graphql").reply(502, "bad gateway"); + + const sdk = createSdk(); + await expect(sdk.FetchBranches()).rejects.toThrow( + "GraphQL API returned 502", + ); + }); +}); diff --git a/mcp/tests/commit-capabilities.test.ts b/mcp/tests/commit-capabilities.test.ts new file mode 100644 index 0000000..2796252 --- /dev/null +++ b/mcp/tests/commit-capabilities.test.ts @@ -0,0 +1,42 @@ +import { jest } from "@jest/globals"; + +const mockResolveCommitRef = jest.fn(); + +jest.unstable_mockModule("../src/resolve.js", () => ({ + resolveCommitRef: mockResolveCommitRef, +})); + +const { getCommitCapabilities } = await import( + "../src/tools/commit-capabilities.js" +); + +const COMMIT = "a".repeat(40); + +describe("getCommitCapabilities", () => { + beforeEach(() => jest.clearAllMocks()); + + it("resolves the ref and returns the extracted data labels", async () => { + mockResolveCommitRef.mockResolvedValue({ + commitHash: COMMIT, + filesystemHash: "f".repeat(40), + }); + const sdk = { + GetCommitCapabilities: jest.fn().mockResolvedValue({ + getCommitExtractedDataLabels: [ + "Tree", + "Blob", + "WinRegKey", + "Struct", + ], + }), + } as any; + + await expect(getCommitCapabilities(sdk, "win11")).resolves.toEqual({ + commit_hash: COMMIT, + labels: ["Tree", "Blob", "WinRegKey", "Struct"], + }); + expect(sdk.GetCommitCapabilities).toHaveBeenCalledWith({ + commitHash: COMMIT, + }); + }); +}); diff --git a/mcp/tests/commits.test.ts b/mcp/tests/commits.test.ts new file mode 100644 index 0000000..ee215c5 --- /dev/null +++ b/mcp/tests/commits.test.ts @@ -0,0 +1,147 @@ +import { jest } from "@jest/globals"; + +const mockFetchBranches = jest.fn(); +const mockFetchCommitHistory = jest.fn(); + +jest.unstable_mockModule("../src/graphql/generated/sdk.js", () => ({ + CommitHistoryDirection: { + Forward: "FORWARD", + Backward: "BACKWARD", + }, +})); + +const { listCommits } = await import("../src/tools/commits.js"); +const sdk = { + FetchBranches: mockFetchBranches, + FetchCommitHistory: mockFetchCommitHistory, +} as any; + +const MOCK_BRANCHES_RESPONSE = { + branches: [ + { + name: "windows_11_23h2", + tracks: { + hash: "aaaa".repeat(10), + name: "Windows 11 23H2", + date: "2023-10-31T00:00:00Z", + }, + }, + { + name: "ubuntu_22.04", + tracks: { + hash: "bbbb".repeat(10), + name: "Ubuntu 22.04", + date: "2022-04-21T00:00:00Z", + }, + }, + ], +}; + +const MOCK_COMMIT_HISTORY = { + fetchCommitHistory: [ + { + hash: "aaaa".repeat(10), + name: "Windows 11 23H2", + description: "Initial release", + date: "2023-10-31T00:00:00Z", + previous: { hash: "1111".repeat(10) }, + next: [], + }, + { + hash: "1111".repeat(10), + name: "KB5031354", + description: "October 2023 update", + date: "2023-10-10T00:00:00Z", + previous: { hash: "2222".repeat(10) }, + next: [{ hash: "aaaa".repeat(10) }], + }, + { + hash: "2222".repeat(10), + name: "KB5030219", + description: null, + date: "2023-09-12T00:00:00Z", + previous: null, + next: [{ hash: "1111".repeat(10) }], + }, + ], +}; + +describe("listCommits", () => { + beforeEach(() => { + mockFetchBranches.mockReset(); + mockFetchCommitHistory.mockReset(); + mockFetchBranches.mockResolvedValue(MOCK_BRANCHES_RESPONSE); + mockFetchCommitHistory.mockResolvedValue(MOCK_COMMIT_HISTORY); + }); + + it("resolves branch and returns commit history", async () => { + const result = await listCommits(sdk, "windows_11_23h2"); + + expect(mockFetchBranches).toHaveBeenCalledTimes(1); + expect(mockFetchCommitHistory).toHaveBeenCalledWith({ + commitHash: "aaaa".repeat(10), + direction: "BACKWARD", + }); + expect(result).toHaveLength(3); + expect(result[0]).toEqual({ + hash: "aaaa".repeat(10), + name: "Windows 11 23H2", + description: "Initial release", + date: "2023-10-31T00:00:00Z", + }); + }); + + it("resolves branch name case-insensitively", async () => { + const result = await listCommits(sdk, "Windows_11_23H2"); + + expect(result).toHaveLength(3); + }); + + it("applies limit to results", async () => { + const result = await listCommits(sdk, "windows_11_23h2", 2); + + expect(result).toHaveLength(2); + expect(result[0].name).toBe("Windows 11 23H2"); + expect(result[1].name).toBe("KB5031354"); + }); + + it("throws for unknown branch", async () => { + await expect(listCommits(sdk, "nonexistent")).rejects.toThrow( + 'Branch "nonexistent" not found', + ); + + expect(mockFetchCommitHistory).not.toHaveBeenCalled(); + }); + + it("includes available branches in error message", async () => { + await expect(listCommits(sdk, "nonexistent")).rejects.toThrow( + "windows_11_23h2, ubuntu_22.04", + ); + }); + + it("handles null description", async () => { + const result = await listCommits(sdk, "windows_11_23h2"); + + expect(result[2].description).toBeNull(); + }); + + it("propagates GraphQL errors from branches query", async () => { + mockFetchBranches.mockRejectedValue( + new Error("GraphQL error: Connection refused"), + ); + + await expect(listCommits(sdk, "windows_11_23h2")).rejects.toThrow( + "Connection refused", + ); + }); + + it("propagates GraphQL errors from commit history query", async () => { + mockFetchCommitHistory.mockRejectedValue( + new Error("GraphQL error: Invalid commit hash"), + ); + + await expect(listCommits(sdk, "windows_11_23h2")).rejects.toThrow( + "Invalid commit hash", + ); + }); +}); diff --git a/mcp/tests/diff-nodes.test.ts b/mcp/tests/diff-nodes.test.ts new file mode 100644 index 0000000..33652c6 --- /dev/null +++ b/mcp/tests/diff-nodes.test.ts @@ -0,0 +1,181 @@ +import { jest } from "@jest/globals"; + +const mockDiffNodesAt = jest.fn(); + +jest.unstable_mockModule("../src/graphql/generated/sdk.js", () => ({ + DiffStatus: { + New: "NEW", + Mod: "MOD", + Del: "DEL", + Unchanged: "UNCHANGED", + }, +})); + +const { diffNodes } = await import("../src/tools/diff-nodes.js"); +const sdk = { + DiffNodesAt: mockDiffNodesAt, +} as any; + +describe("diffNodes", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("diffs registry nodes with WinRegKey parent_label", async () => { + mockDiffNodesAt.mockResolvedValue({ + diffNodesAt: { + total_count: 2, + items: [ + { + status: "MOD", + path: "HKLM/SOFTWARE/Microsoft", + type: "WinRegKey", + old_props: { hash: "old1", properties: {} }, + new_props: { hash: "new1", properties: {} }, + }, + { + status: "NEW", + path: "HKLM/SOFTWARE/Microsoft/NewKey", + type: "WinRegKey", + old_props: null, + new_props: { hash: "new2", properties: {} }, + }, + ], + }, + }); + + const result = await diffNodes({ + sdk, + base_node_hash: "basehash", + diffee_node_hash: "diffeehash", + parent_label: "WinRegKey", + filter: ["WinRegKey", "WinRegValue"], + }); + + expect(mockDiffNodesAt).toHaveBeenCalledWith({ + parentLabel: "WinRegKey", + baseNodeHash: "basehash", + diffeeNodeHash: "diffeehash", + atPath: "/", + maxDepth: undefined, + withIntermediates: false, + filter: ["WinRegKey", "WinRegValue"], + options: undefined, + }); + expect(result.total_count).toBe(2); + expect(result.items).toHaveLength(2); + }); + + it("diffs symbols with Blob parent_label and at_path for struct fields", async () => { + mockDiffNodesAt.mockResolvedValue({ + diffNodesAt: { + total_count: 1, + items: [ + { + status: "MOD", + path: "_EPROCESS/Pcb", + type: "StructField", + old_props: { hash: "old1", properties: { offset: 0 } }, + new_props: { hash: "new1", properties: { offset: 8 } }, + }, + ], + }, + }); + + const result = await diffNodes({ + sdk, + base_node_hash: "blobhash_a", + diffee_node_hash: "blobhash_b", + parent_label: "Blob", + filter: ["StructField"], + at_path: "/_EPROCESS", + }); + + expect(mockDiffNodesAt).toHaveBeenCalledWith({ + parentLabel: "Blob", + baseNodeHash: "blobhash_a", + diffeeNodeHash: "blobhash_b", + atPath: "/_EPROCESS", + maxDepth: undefined, + withIntermediates: false, + filter: ["StructField"], + options: undefined, + }); + expect(result.total_count).toBe(1); + }); + + it("forwards pagination and status filter options", async () => { + mockDiffNodesAt.mockResolvedValue({ + diffNodesAt: { total_count: 0, items: [] }, + }); + + await diffNodes({ + sdk, + base_node_hash: "a", + diffee_node_hash: "b", + parent_label: "Tree", + filter: ["Tree", "Blob"], + limit: 50, + offset: 10, + status_filter: ["NEW", "MOD"], + }); + + expect(mockDiffNodesAt).toHaveBeenCalledWith( + expect.objectContaining({ + options: { + limit: 50, + offset: 10, + status_filter: ["NEW", "MOD"], + }, + }), + ); + }); + + it("throws on invalid status filter", async () => { + await expect( + diffNodes({ + sdk, + base_node_hash: "a", + diffee_node_hash: "b", + parent_label: "WinRegKey", + filter: ["WinRegKey"], + status_filter: ["INVALID"], + }), + ).rejects.toThrow('Invalid diff status "INVALID"'); + }); +}); + +describe("diffNodes request body (regression)", () => { + it.each([ + ["Symbol", ["Symbol"]], + ["Struct", ["Struct"]], + ["StructField", ["StructField"]], + ])( + "forwards max_depth 1 and filter %s verbatim", + async (_label, filter) => { + // max_depth=1 is required for these labels: without it the procedure + // recurses looking for children of the same label, finds none, and + // returns 0 results. + mockDiffNodesAt.mockResolvedValue({ + diffNodesAt: { total_count: 0, items: [] }, + }); + + await diffNodes({ + sdk, + base_node_hash: "a".repeat(40), + diffee_node_hash: "b".repeat(40), + parent_label: "Blob", + filter, + max_depth: 1, + }); + + expect(mockDiffNodesAt).toHaveBeenCalledWith( + expect.objectContaining({ + maxDepth: 1, + filter, + parentLabel: "Blob", + }), + ); + }, + ); +}); diff --git a/mcp/tests/diff.test.ts b/mcp/tests/diff.test.ts new file mode 100644 index 0000000..b3f1b70 --- /dev/null +++ b/mcp/tests/diff.test.ts @@ -0,0 +1,231 @@ +import { jest } from "@jest/globals"; + +const mockResolveCommitRef = jest.fn(); +const mockDiffNodesAt = jest.fn(); + +jest.unstable_mockModule("../src/graphql/generated/sdk.js", () => ({ + DiffStatus: { + New: "NEW", + Mod: "MOD", + Del: "DEL", + Unchanged: "UNCHANGED", + }, +})); + +const { diffVersions } = await import("../src/tools/diff.js"); +const sdk = { + ResolveCommitRef: mockResolveCommitRef, + DiffNodesAt: mockDiffNodesAt, +} as any; + +describe("diffVersions", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("resolves branch refs and diffs filesystem paths", async () => { + mockResolveCommitRef + .mockResolvedValueOnce({ + branches: [ + { + name: "windows_11_23h2", + tracks: { + hash: "a".repeat(40), + filesystem: { hash: "1".repeat(40) }, + }, + }, + ], + commits: [], + }) + .mockResolvedValueOnce({ + branches: [], + commits: [ + { + hash: "b".repeat(40), + filesystem: { hash: "2".repeat(40) }, + }, + ], + }); + + mockDiffNodesAt.mockResolvedValue({ + diffNodesAt: { + total_count: 1, + items: [ + { + status: "MOD", + path: "ntdll.dll", + type: "Blob", + old_props: { + hash: "oldhash", + properties: { hash: "oldhash" }, + }, + new_props: { + hash: "newhash", + properties: { hash: "newhash" }, + }, + }, + ], + }, + }); + + const result = await diffVersions({ + sdk, + base_ref: "windows_11_23h2", + diffee_ref: "b".repeat(40), + path: "/Windows/System32", + }); + + expect(mockResolveCommitRef).toHaveBeenNthCalledWith(1, { + ref: "windows_11_23h2", + }); + expect(mockResolveCommitRef).toHaveBeenNthCalledWith(2, { + ref: "b".repeat(40), + }); + expect(mockDiffNodesAt).toHaveBeenCalledWith({ + parentLabel: "Tree", + baseNodeHash: "1".repeat(40), + diffeeNodeHash: "2".repeat(40), + atPath: "/Windows/System32", + maxDepth: undefined, + withIntermediates: false, + filter: ["Tree", "Blob"], + options: undefined, + }); + expect(result).toEqual({ + base_commit_hash: "a".repeat(40), + diffee_commit_hash: "b".repeat(40), + total_count: 1, + items: [ + { + status: "MOD", + path: "ntdll.dll", + type: "Blob", + old_props: { + hash: "oldhash", + properties: { hash: "oldhash" }, + }, + new_props: { + hash: "newhash", + properties: { hash: "newhash" }, + }, + }, + ], + }); + }); + + it("forwards diff options and status filters", async () => { + mockResolveCommitRef.mockResolvedValue({ + branches: [], + commits: [ + { + hash: "c".repeat(40), + filesystem: { hash: "3".repeat(40) }, + }, + ], + }); + mockDiffNodesAt.mockResolvedValue({ + diffNodesAt: { + total_count: 0, + items: [], + }, + }); + + await diffVersions({ + sdk, + base_ref: "c".repeat(40), + diffee_ref: "c".repeat(40), + path: "/", + max_depth: 0, + limit: 25, + offset: 10, + status_filter: ["NEW", "MOD"], + with_intermediates: true, + }); + + expect(mockDiffNodesAt).toHaveBeenCalledWith({ + parentLabel: "Tree", + baseNodeHash: "3".repeat(40), + diffeeNodeHash: "3".repeat(40), + atPath: "/", + maxDepth: 0, + withIntermediates: true, + filter: ["Tree", "Blob"], + options: { + limit: 25, + offset: 10, + status_filter: ["NEW", "MOD"], + }, + }); + }); + + it("throws when ref cannot be resolved", async () => { + mockResolveCommitRef.mockResolvedValue({ + branches: [], + commits: [], + }); + + await expect( + diffVersions({ + sdk, + base_ref: "missing", + diffee_ref: "present", + path: "/", + }), + ).rejects.toThrow("Branch or commit not found: missing"); + + expect(mockDiffNodesAt).not.toHaveBeenCalled(); + }); + + it("throws on invalid status filter", async () => { + mockResolveCommitRef.mockResolvedValue({ + branches: [], + commits: [ + { + hash: "d".repeat(40), + filesystem: { hash: "4".repeat(40) }, + }, + ], + }); + + await expect( + diffVersions({ + sdk, + base_ref: "d".repeat(40), + diffee_ref: "d".repeat(40), + path: "/", + status_filter: ["INVALID"], + }), + ).rejects.toThrow('Invalid diff status "INVALID"'); + }); +}); + +describe("diffVersions request body (regression)", () => { + it("always sends filter: ['Tree', 'Blob'], even when the caller passes none", async () => { + // An empty filter makes the Java procedure add only parentLabel + // ("Tree"), silently dropping every Blob leaf and returning 0 results + // for a recursive diff. + mockDiffNodesAt.mockResolvedValue({ + diffNodesAt: { total_count: 0, items: [] }, + }); + mockResolveCommitRef.mockResolvedValue({ + branches: [], + commits: [ + { hash: "a".repeat(40), filesystem: { hash: "f".repeat(40) } }, + ], + }); + + await diffVersions({ + sdk, + base_ref: "win11-24h2", + diffee_ref: "win11-25h2", + path: "/", + }); + + expect(mockDiffNodesAt).toHaveBeenCalledWith( + expect.objectContaining({ + parentLabel: "Tree", + filter: ["Tree", "Blob"], + }), + ); + }); +}); diff --git a/mcp/tests/get-struct.test.ts b/mcp/tests/get-struct.test.ts new file mode 100644 index 0000000..b48b2b6 --- /dev/null +++ b/mcp/tests/get-struct.test.ts @@ -0,0 +1,176 @@ +import { jest } from "@jest/globals"; + +const mockResolveBlobHash = jest.fn(); + +jest.unstable_mockModule("../src/resolve.js", () => ({ + resolveBlobHash: mockResolveBlobHash, +})); + +const { getStruct } = await import("../src/tools/get-struct.js"); + +const BLOB = "b".repeat(40); +const STRUCT = "s".repeat(40); + +function makeSdk(overrides: Record = {}) { + return { + FetchStructByName: jest.fn().mockResolvedValue({ + blobs: [ + { + has_structConnection: { + edges: [ + { + properties: { name: "_EPROCESS" }, + node: { + hash: STRUCT, + size: 2048, + kind: "struct", + }, + }, + ], + }, + }, + ], + }), + FetchStructFields: jest.fn().mockResolvedValue({ + structs: [ + { + fieldsConnection: { + totalCount: 2, + edges: [ + { + properties: { name: "Pcb" }, + node: { + hash: "f1", + offset: 0, + data_type: { type: "struct" }, + }, + }, + { + properties: { name: "UniqueProcessId" }, + node: { + hash: "f2", + offset: 1088, + data_type: { type: "pointer" }, + }, + }, + ], + }, + }, + ], + }), + ...overrides, + } as any; +} + +describe("getStruct", () => { + beforeEach(() => { + jest.clearAllMocks(); + mockResolveBlobHash.mockResolvedValue(BLOB); + }); + + it("returns the struct with its full field layout", async () => { + const sdk = makeSdk(); + + const result = await getStruct( + sdk, + "win11-24h2", + "/Windows/System32/ntoskrnl.exe", + "_EPROCESS", + ); + + expect(mockResolveBlobHash).toHaveBeenCalledWith( + sdk, + "win11-24h2", + "/Windows/System32/ntoskrnl.exe", + ); + expect(sdk.FetchStructByName).toHaveBeenCalledWith({ + blobHash: BLOB, + structName: "_EPROCESS", + }); + expect(sdk.FetchStructFields).toHaveBeenCalledWith({ + structHash: STRUCT, + }); + expect(result).toEqual({ + name: "_EPROCESS", + hash: STRUCT, + size: 2048, + kind: "struct", + field_count: 2, + fields: [ + { name: "Pcb", offset: 0, data_type: { type: "struct" } }, + { + name: "UniqueProcessId", + offset: 1088, + data_type: { type: "pointer" }, + }, + ], + }); + }); + + it("sorts fields by offset", async () => { + const sdk = makeSdk({ + FetchStructFields: jest.fn().mockResolvedValue({ + structs: [ + { + fieldsConnection: { + totalCount: 2, + edges: [ + { + properties: { name: "b" }, + node: { + hash: "f2", + offset: 16, + data_type: {}, + }, + }, + { + properties: { name: "a" }, + node: { + hash: "f1", + offset: 0, + data_type: {}, + }, + }, + ], + }, + }, + ], + }), + }); + + const result = await getStruct(sdk, "win11-24h2", "/x.exe", "_S"); + + expect(result.fields.map((f) => f.name)).toEqual(["a", "b"]); + }); + + it("throws a named error when the struct is absent from the blob", async () => { + const sdk = makeSdk({ + FetchStructByName: jest.fn().mockResolvedValue({ + blobs: [{ has_structConnection: { edges: [] } }], + }), + }); + + await expect( + getStruct( + sdk, + "win11-24h2", + "/Windows/System32/ntoskrnl.exe", + "_NOPE", + ), + ).rejects.toThrow( + 'Struct "_NOPE" not found in /Windows/System32/ntoskrnl.exe', + ); + }); + + it("throws when the blob carries no PDB data at all", async () => { + const sdk = makeSdk({ + FetchStructByName: jest.fn().mockResolvedValue({ blobs: [] }), + }); + + await expect( + getStruct(sdk, "win11-24h2", "/Windows/notapdb.txt", "_EPROCESS"), + ).rejects.toThrow( + "/Windows/notapdb.txt has no PDB symbol or struct data", + ); + }); +}); diff --git a/mcp/tests/git-log.test.ts b/mcp/tests/git-log.test.ts new file mode 100644 index 0000000..2305b24 --- /dev/null +++ b/mcp/tests/git-log.test.ts @@ -0,0 +1,116 @@ +import { jest } from "@jest/globals"; +import { gitLog } from "../src/tools/git-log.js"; + +const entry = { + base_commit: { hash: "b".repeat(40), name: "24h2", date: "2026-01-01" }, + diffee_commit: { hash: "d".repeat(40), name: "25h2", date: "2026-06-01" }, + diff: { + path: "/Windows/System32/ntdll.dll", + status: "MOD", + type: "Blob", + old_props: { hash: "o1", properties: { size: 1 } }, + new_props: { hash: "n1", properties: { size: 2 } }, + }, +}; + +describe("gitLog", () => { + it("maps entity_type onto the GraphQL `context` argument and flattens the entry", async () => { + const sdk = { + GitLog: jest.fn().mockResolvedValue({ + gitLog: { total_count: 3, has_more: true, entries: [entry] }, + }), + } as any; + + const page = await gitLog(sdk, { + path: "/Windows/System32/ntdll.dll", + entity_type: "FILESYSTEM", + commit_range: { startRef: "windows_11", direction: "BACKWARD" }, + limit: 1, + }); + + expect(sdk.GitLog).toHaveBeenCalledWith({ + path: "/Windows/System32/ntdll.dll", + context: "FILESYSTEM", + commitRange: { startRef: "windows_11", direction: "BACKWARD" }, + options: { + limit: 1, + offset: 0, + status_filter: undefined, + order: undefined, + }, + }); + expect(page.total_count).toBe(3); + expect(page.has_more).toBe(true); + expect(page.next_cursor).toBe("1"); + expect(page.items).toEqual([ + { + base_commit: entry.base_commit, + diffee_commit: entry.diffee_commit, + status: "MOD", + path: "/Windows/System32/ntdll.dll", + type: "Blob", + old_props: entry.diff.old_props, + new_props: entry.diff.new_props, + }, + ]); + }); + + it("advances next_cursor from the supplied offset", async () => { + const sdk = { + GitLog: jest.fn().mockResolvedValue({ + gitLog: { + total_count: 30, + has_more: true, + entries: [entry, entry], + }, + }), + } as any; + + const page = await gitLog(sdk, { + path: "/x", + entity_type: "FILESYSTEM", + commit_range: { startRef: "b" }, + limit: 2, + offset: 10, + }); + + expect(page.next_cursor).toBe("12"); + }); + + it("nulls next_cursor on the last page", async () => { + const sdk = { + GitLog: jest.fn().mockResolvedValue({ + gitLog: { total_count: 1, has_more: false, entries: [entry] }, + }), + } as any; + + const page = await gitLog(sdk, { + path: "/x", + entity_type: "FILESYSTEM", + commit_range: { startRef: "b" }, + }); + + expect(page.has_more).toBe(false); + expect(page.next_cursor).toBeNull(); + }); + + it("carries a first appearance through with a null base_commit", async () => { + const sdk = { + GitLog: jest.fn().mockResolvedValue({ + gitLog: { + total_count: 1, + has_more: false, + entries: [{ ...entry, base_commit: null }], + }, + }), + } as any; + + const page = await gitLog(sdk, { + path: "/x", + entity_type: "FILESYSTEM", + commit_range: { startRef: "b" }, + }); + + expect(page.items[0].base_commit).toBeNull(); + }); +}); diff --git a/mcp/tests/list-registry-key.test.ts b/mcp/tests/list-registry-key.test.ts new file mode 100644 index 0000000..571cf6e --- /dev/null +++ b/mcp/tests/list-registry-key.test.ts @@ -0,0 +1,184 @@ +import { jest } from "@jest/globals"; + +const mockResolveHiveRoot = jest.fn(); + +jest.unstable_mockModule("../src/resolve.js", () => ({ + resolveHiveRoot: mockResolveHiveRoot, +})); + +const { listRegistryKey } = await import("../src/tools/list-registry-key.js"); + +const ROOT = "r".repeat(40); + +const bothConnections = { + winRegKeys: [ + { + child_keysConnection: { + totalCount: 1, + edges: [ + { + properties: { name: "OptionalComponents" }, + node: { hash: "k1" }, + }, + ], + pageInfo: { hasNextPage: false, endCursor: "kc" }, + }, + child_valuesConnection: { + totalCount: 2, + edges: [ + { + properties: { name: "SecurityHealth" }, + node: { + hash: "v1", + type: "REG_EXPAND_SZ", + value: "%windir%\\system32\\SecurityHealthSystray.exe", + }, + }, + ], + pageInfo: { hasNextPage: true, endCursor: "vc" }, + }, + }, + ], +}; + +describe("listRegistryKey", () => { + beforeEach(() => { + jest.clearAllMocks(); + mockResolveHiveRoot.mockResolvedValue(ROOT); + }); + + it("traverses below the hive root and splits subkeys from values", async () => { + const sdk = { + TraverseRegistryPath: jest + .fn() + .mockResolvedValue({ traversePath: "key1" }), + ListRegistryKey: jest.fn().mockResolvedValue(bothConnections), + } as any; + + const page = await listRegistryKey( + sdk, + "win11", + "SOFTWARE", + "/Microsoft/Windows/CurrentVersion/Run", + 50, + ); + + expect(mockResolveHiveRoot).toHaveBeenCalledWith( + sdk, + "win11", + "SOFTWARE", + ); + expect(sdk.TraverseRegistryPath).toHaveBeenCalledWith({ + rootHash: ROOT, + path: "/Microsoft/Windows/CurrentVersion/Run", + }); + expect(sdk.ListRegistryKey).toHaveBeenCalledWith({ + keyHash: "key1", + first: 50, + afterKeys: undefined, + afterValues: undefined, + includeKeys: true, + includeValues: true, + }); + expect(page.subkeys).toEqual([ + { name: "OptionalComponents", hash: "k1" }, + ]); + expect(page.values).toEqual([ + { + name: "SecurityHealth", + type: "REG_EXPAND_SZ", + value: "%windir%\\system32\\SecurityHealthSystray.exe", + }, + ]); + expect(page.has_more).toBe(true); + }); + + it("skips the second traversal for the hive root itself", async () => { + const sdk = { + TraverseRegistryPath: jest.fn(), + ListRegistryKey: jest.fn().mockResolvedValue(bothConnections), + } as any; + + await listRegistryKey(sdk, "win11", "SYSTEM", "/"); + + expect(sdk.TraverseRegistryPath).not.toHaveBeenCalled(); + expect(sdk.ListRegistryKey).toHaveBeenCalledWith( + expect.objectContaining({ keyHash: ROOT }), + ); + }); + + it("stops requesting an exhausted connection on the next page", async () => { + const second = { + winRegKeys: [ + { + child_valuesConnection: { + totalCount: 2, + edges: [ + { + properties: { name: "OneDrive" }, + node: { + hash: "v2", + type: "REG_SZ", + value: "C:\\OneDrive.exe", + }, + }, + ], + pageInfo: { hasNextPage: false, endCursor: "vc2" }, + }, + }, + ], + }; + const sdk = { + TraverseRegistryPath: jest + .fn() + .mockResolvedValue({ traversePath: "key1" }), + ListRegistryKey: jest + .fn() + .mockResolvedValueOnce(bothConnections) + .mockResolvedValueOnce(second), + } as any; + + const page1 = await listRegistryKey( + sdk, + "win11", + "SOFTWARE", + "/Run", + 1, + ); + const page2 = await listRegistryKey( + sdk, + "win11", + "SOFTWARE", + "/Run", + 1, + page1.next_cursor!, + ); + + expect(sdk.ListRegistryKey).toHaveBeenLastCalledWith({ + keyHash: "key1", + first: 1, + afterKeys: undefined, + afterValues: "vc", + includeKeys: false, + includeValues: true, + }); + expect(page2.subkeys).toEqual([]); + expect(page2.has_more).toBe(false); + expect(page2.next_cursor).toBeNull(); + }); + + it("throws when the key path does not exist in the hive", async () => { + const sdk = { + TraverseRegistryPath: jest + .fn() + .mockResolvedValue({ traversePath: null }), + ListRegistryKey: jest.fn(), + } as any; + + await expect( + listRegistryKey(sdk, "win11", "SOFTWARE", "/Nope"), + ).rejects.toThrow( + 'Registry key not found in SOFTWARE ("win11"): /Nope', + ); + }); +}); diff --git a/mcp/tests/list-structs.test.ts b/mcp/tests/list-structs.test.ts new file mode 100644 index 0000000..840d68c --- /dev/null +++ b/mcp/tests/list-structs.test.ts @@ -0,0 +1,143 @@ +import { jest } from "@jest/globals"; + +const mockResolveBlobHash = jest.fn(); + +jest.unstable_mockModule("../src/resolve.js", () => ({ + resolveBlobHash: mockResolveBlobHash, +})); + +const { listStructs } = await import("../src/tools/list-structs.js"); + +const BLOB = "b".repeat(40); + +function connection( + edges: any[], + hasNextPage: boolean, + endCursor: string | null, + totalCount: number, +) { + return { + blobs: [ + { + has_structConnection: { + totalCount, + edges, + pageInfo: { hasNextPage, endCursor }, + }, + }, + ], + }; +} + +describe("listStructs", () => { + beforeEach(() => { + jest.clearAllMocks(); + mockResolveBlobHash.mockResolvedValue(BLOB); + }); + + it("pages the unfiltered connection", async () => { + const sdk = { + ListStructs: jest + .fn() + .mockResolvedValue( + connection( + [ + { + properties: { name: "_EPROCESS" }, + node: { + hash: "s1", + size: 1856, + kind: "struct", + }, + }, + ], + true, + "cur1", + 9000, + ), + ), + ListStructsByName: jest.fn(), + } as any; + + const page = await listStructs( + sdk, + "win11", + "/Windows/System32/ntoskrnl.exe", + undefined, + 1, + ); + + expect(sdk.ListStructs).toHaveBeenCalledWith({ + blobHash: BLOB, + first: 1, + after: undefined, + }); + expect(sdk.ListStructsByName).not.toHaveBeenCalled(); + expect(page).toEqual({ + items: [ + { name: "_EPROCESS", hash: "s1", size: 1856, kind: "struct" }, + ], + has_more: true, + next_cursor: "cur1", + total_count: 9000, + }); + }); + + it("uses the by-name document when name is given, and forwards the cursor", async () => { + const sdk = { + ListStructs: jest.fn(), + ListStructsByName: jest + .fn() + .mockResolvedValue( + connection( + [ + { + properties: { name: "_EPROCESS" }, + node: { + hash: "s1", + size: 1856, + kind: "struct", + }, + }, + ], + false, + "cur2", + 1, + ), + ), + } as any; + + const page = await listStructs( + sdk, + "win11", + "/Windows/System32/ntoskrnl.exe", + "_EPROCESS", + 50, + "cur1", + ); + + expect(sdk.ListStructsByName).toHaveBeenCalledWith({ + blobHash: BLOB, + structName: "_EPROCESS", + first: 50, + after: "cur1", + }); + expect(sdk.ListStructs).not.toHaveBeenCalled(); + expect(page.has_more).toBe(false); + expect(page.next_cursor).toBeNull(); + expect(page.total_count).toBe(1); + }); + + it("throws when the blob has no PDB data", async () => { + const sdk = { + ListStructs: jest.fn().mockResolvedValue({ blobs: [] }), + ListStructsByName: jest.fn(), + } as any; + + await expect( + listStructs(sdk, "win11", "/Windows/readme.txt"), + ).rejects.toThrow( + "/Windows/readme.txt has no PDB symbol or struct data", + ); + }); +}); diff --git a/mcp/tests/list-symbols.test.ts b/mcp/tests/list-symbols.test.ts new file mode 100644 index 0000000..03e22d3 --- /dev/null +++ b/mcp/tests/list-symbols.test.ts @@ -0,0 +1,133 @@ +import { jest } from "@jest/globals"; + +const mockResolveBlobHash = jest.fn(); + +jest.unstable_mockModule("../src/resolve.js", () => ({ + resolveBlobHash: mockResolveBlobHash, +})); + +const { listSymbols } = await import("../src/tools/list-symbols.js"); + +const BLOB = "b".repeat(40); + +function connection( + edges: any[], + hasNextPage: boolean, + endCursor: string | null, + totalCount: number, +) { + return { + blobs: [ + { + has_symbolConnection: { + totalCount, + edges, + pageInfo: { hasNextPage, endCursor }, + }, + }, + ], + }; +} + +describe("listSymbols", () => { + beforeEach(() => { + jest.clearAllMocks(); + mockResolveBlobHash.mockResolvedValue(BLOB); + }); + + it("pages the unfiltered connection", async () => { + const sdk = { + ListSymbols: jest + .fn() + .mockResolvedValue( + connection( + [ + { + properties: { name: "NtCreateFile" }, + node: { hash: "s1", address: "0x1000" }, + }, + ], + true, + "cur1", + 9000, + ), + ), + ListSymbolsByName: jest.fn(), + } as any; + + const page = await listSymbols( + sdk, + "win11", + "/Windows/System32/ntdll.dll", + undefined, + 1, + ); + + expect(sdk.ListSymbols).toHaveBeenCalledWith({ + blobHash: BLOB, + first: 1, + after: undefined, + }); + expect(sdk.ListSymbolsByName).not.toHaveBeenCalled(); + expect(page).toEqual({ + items: [{ name: "NtCreateFile", hash: "s1", address: "0x1000" }], + has_more: true, + next_cursor: "cur1", + total_count: 9000, + }); + }); + + it("uses the by-name document when name is given, and forwards the cursor", async () => { + const sdk = { + ListSymbols: jest.fn(), + ListSymbolsByName: jest + .fn() + .mockResolvedValue( + connection( + [ + { + properties: { name: "NtCreateFile" }, + node: { hash: "s1", address: "0x1000" }, + }, + ], + false, + "cur2", + 1, + ), + ), + } as any; + + const page = await listSymbols( + sdk, + "win11", + "/Windows/System32/ntdll.dll", + "NtCreateFile", + 50, + "cur1", + ); + + expect(sdk.ListSymbolsByName).toHaveBeenCalledWith({ + blobHash: BLOB, + symbolName: "NtCreateFile", + first: 50, + after: "cur1", + }); + expect(sdk.ListSymbols).not.toHaveBeenCalled(); + expect(page.has_more).toBe(false); + expect(page.next_cursor).toBeNull(); + expect(page.total_count).toBe(1); + }); + + it("throws when the blob has no PDB data", async () => { + const sdk = { + ListSymbols: jest.fn().mockResolvedValue({ blobs: [] }), + ListSymbolsByName: jest.fn(), + } as any; + + await expect( + listSymbols(sdk, "win11", "/Windows/readme.txt"), + ).rejects.toThrow( + "/Windows/readme.txt has no PDB symbol or struct data", + ); + }); +}); diff --git a/mcp/tests/list-tree.test.ts b/mcp/tests/list-tree.test.ts new file mode 100644 index 0000000..6bd6e07 --- /dev/null +++ b/mcp/tests/list-tree.test.ts @@ -0,0 +1,146 @@ +import { jest } from "@jest/globals"; + +const mockResolveTreeHash = jest.fn(); + +jest.unstable_mockModule("../src/resolve.js", () => ({ + resolveTreeHash: mockResolveTreeHash, +})); + +const { listTree } = await import("../src/tools/list-tree.js"); + +const TREE = "t".repeat(40); + +describe("listTree", () => { + beforeEach(() => { + jest.clearAllMocks(); + mockResolveTreeHash.mockResolvedValue(TREE); + }); + + it("requests both connections on the first page and splits the result", async () => { + const sdk = { + ListTree: jest.fn().mockResolvedValue({ + trees: [ + { + child_treesConnection: { + totalCount: 1, + edges: [ + { + properties: { name: "en-US" }, + node: { hash: "d1" }, + }, + ], + pageInfo: { hasNextPage: false, endCursor: "dc" }, + }, + child_blobsConnection: { + totalCount: 2, + edges: [ + { + properties: { name: "ntfs.sys" }, + node: { hash: "b1" }, + }, + ], + pageInfo: { hasNextPage: true, endCursor: "bc" }, + }, + }, + ], + }), + } as any; + + const page = await listTree( + sdk, + "win11", + "/Windows/System32/drivers", + 1, + ); + + expect(sdk.ListTree).toHaveBeenCalledWith({ + treeHash: TREE, + first: 1, + afterTrees: undefined, + afterBlobs: undefined, + includeTrees: true, + includeBlobs: true, + }); + expect(page.directories).toEqual([{ name: "en-US", hash: "d1" }]); + expect(page.files).toEqual([{ name: "ntfs.sys", hash: "b1" }]); + expect(page.has_more).toBe(true); + expect(typeof page.next_cursor).toBe("string"); + }); + + it("stops requesting a connection that is already exhausted", async () => { + const first = { + trees: [ + { + child_treesConnection: { + totalCount: 1, + edges: [ + { + properties: { name: "en-US" }, + node: { hash: "d1" }, + }, + ], + pageInfo: { hasNextPage: false, endCursor: "dc" }, + }, + child_blobsConnection: { + totalCount: 2, + edges: [ + { + properties: { name: "a.sys" }, + node: { hash: "b1" }, + }, + ], + pageInfo: { hasNextPage: true, endCursor: "bc" }, + }, + }, + ], + }; + const second = { + trees: [ + { + child_blobsConnection: { + totalCount: 2, + edges: [ + { + properties: { name: "b.sys" }, + node: { hash: "b2" }, + }, + ], + pageInfo: { hasNextPage: false, endCursor: "bc2" }, + }, + }, + ], + }; + const sdk = { + ListTree: jest + .fn() + .mockResolvedValueOnce(first) + .mockResolvedValueOnce(second), + } as any; + + const page1 = await listTree(sdk, "win11", "/W", 1); + const page2 = await listTree(sdk, "win11", "/W", 1, page1.next_cursor!); + + expect(sdk.ListTree).toHaveBeenLastCalledWith({ + treeHash: TREE, + first: 1, + afterTrees: undefined, + afterBlobs: "bc", + includeTrees: false, + includeBlobs: true, + }); + expect(page2.directories).toEqual([]); + expect(page2.files).toEqual([{ name: "b.sys", hash: "b2" }]); + expect(page2.has_more).toBe(false); + expect(page2.next_cursor).toBeNull(); + }); + + it("throws when the path is not a directory in this ref", async () => { + const sdk = { + ListTree: jest.fn().mockResolvedValue({ trees: [] }), + } as any; + + await expect( + listTree(sdk, "win11", "/Windows/notes.txt"), + ).rejects.toThrow('/Windows/notes.txt is not a directory in "win11"'); + }); +}); diff --git a/mcp/tests/pagination.test.ts b/mcp/tests/pagination.test.ts new file mode 100644 index 0000000..fcace33 --- /dev/null +++ b/mcp/tests/pagination.test.ts @@ -0,0 +1,122 @@ +import { + singlePage, + offsetPage, + encodeCursor, + decodeCursor, + advanceCursor, + compositeHasMore, +} from "../src/pagination.js"; + +describe("singlePage", () => { + it("carries the endCursor when there is a next page", () => { + expect( + singlePage([1, 2], { hasNextPage: true, endCursor: "abc" }), + ).toEqual({ items: [1, 2], has_more: true, next_cursor: "abc" }); + }); + + it("nulls the cursor when the connection is exhausted", () => { + expect( + singlePage([1], { hasNextPage: false, endCursor: "abc" }), + ).toEqual({ items: [1], has_more: false, next_cursor: null }); + }); +}); + +describe("offsetPage", () => { + it("returns the next offset as the cursor", () => { + expect(offsetPage(["a", "b"], 10, true)).toEqual({ + items: ["a", "b"], + has_more: true, + next_cursor: "12", + }); + }); + + it("nulls the cursor on the last page", () => { + expect(offsetPage(["a"], 10, false)).toEqual({ + items: ["a"], + has_more: false, + next_cursor: null, + }); + }); +}); + +describe("cursor codec", () => { + it("round-trips a composite state", () => { + const state = { trees: "t1", blobs: null }; + expect(decodeCursor(encodeCursor(state), ["trees", "blobs"])).toEqual( + state, + ); + }); + + it("produces a url-safe opaque string", () => { + expect(encodeCursor({ trees: "a/b+c=", blobs: null })).toMatch( + /^[A-Za-z0-9_-]+$/, + ); + }); + + it("starts every key at the empty string when no cursor is given", () => { + expect(decodeCursor(undefined, ["trees", "blobs"])).toEqual({ + trees: "", + blobs: "", + }); + }); + + it("rejects a malformed cursor with an actionable message", () => { + expect(() => decodeCursor("not-a-cursor", ["trees"])).toThrow( + "Invalid cursor", + ); + }); + + it("defaults a key missing from the payload to exhausted", () => { + const cursor = encodeCursor({ trees: "t1" }); + expect(decodeCursor(cursor, ["trees", "blobs"])).toEqual({ + trees: "t1", + blobs: null, + }); + }); + + it("rejects a cursor that decodes to something other than an object", () => { + const arrayCursor = Buffer.from("[]", "utf-8").toString("base64url"); + expect(() => decodeCursor(arrayCursor, ["trees"])).toThrow( + "Invalid cursor", + ); + }); +}); + +describe("advanceCursor", () => { + it("keeps a connection that has more and exhausts one that does not", () => { + expect( + advanceCursor( + { trees: "", blobs: "" }, + { + trees: { hasNextPage: true, endCursor: "t2" }, + blobs: { hasNextPage: false, endCursor: "b9" }, + }, + ), + ).toEqual({ trees: "t2", blobs: null }); + }); + + it("leaves an unrequested connection exhausted", () => { + expect( + advanceCursor( + { trees: "t2", blobs: null }, + { trees: { hasNextPage: false, endCursor: "t9" } }, + ), + ).toEqual({ trees: null, blobs: null }); + }); + + it("exhausts a requested connection that returned no pageInfo", () => { + expect( + advanceCursor( + { trees: "", blobs: "" }, + { trees: undefined, blobs: undefined }, + ), + ).toEqual({ trees: null, blobs: null }); + }); +}); + +describe("compositeHasMore", () => { + it("is the OR of the connections still open", () => { + expect(compositeHasMore({ trees: "t2", blobs: null })).toBe(true); + expect(compositeHasMore({ trees: null, blobs: null })).toBe(false); + }); +}); diff --git a/mcp/tests/resolve.test.ts b/mcp/tests/resolve.test.ts new file mode 100644 index 0000000..1323d5a --- /dev/null +++ b/mcp/tests/resolve.test.ts @@ -0,0 +1,155 @@ +import { jest } from "@jest/globals"; +import { + resolveCommitRef, + resolveNodeHash, + resolveTreeHash, + resolveBlobHash, + resolveHiveRoot, + HIVE_PATHS, +} from "../src/resolve.js"; + +const FS = "f".repeat(40); +const COMMIT = "a".repeat(40); + +function makeSdk(overrides: Record = {}) { + return { + ResolveCommitRef: jest.fn().mockResolvedValue({ + branches: [ + { + name: "win11", + tracks: { hash: COMMIT, filesystem: { hash: FS } }, + }, + ], + commits: [], + }), + TraversePath: jest + .fn() + .mockResolvedValue({ traversePath: "node1" }), + GetBlobWinRegRoot: jest.fn().mockResolvedValue({ + blobs: [{ hash: "node1", has_winreg: { hash: "winreg1" } }], + }), + ...overrides, + } as any; +} + +describe("resolveCommitRef", () => { + it("resolves a branch name", async () => { + const sdk = makeSdk(); + await expect(resolveCommitRef(sdk, "win11")).resolves.toEqual({ + commitHash: COMMIT, + filesystemHash: FS, + }); + }); + + it("falls back to a commit hash", async () => { + const sdk = makeSdk({ + ResolveCommitRef: jest.fn().mockResolvedValue({ + branches: [], + commits: [{ hash: COMMIT, filesystem: { hash: FS } }], + }), + }); + await expect(resolveCommitRef(sdk, COMMIT)).resolves.toEqual({ + commitHash: COMMIT, + filesystemHash: FS, + }); + }); + + it("throws when the branch tracks no commit", async () => { + const sdk = makeSdk({ + ResolveCommitRef: jest.fn().mockResolvedValue({ + branches: [{ name: "empty", tracks: null }], + commits: [], + }), + }); + await expect(resolveCommitRef(sdk, "empty")).rejects.toThrow( + 'Branch "empty" has no tracked commit', + ); + }); + + it("throws when nothing matches", async () => { + const sdk = makeSdk({ + ResolveCommitRef: jest + .fn() + .mockResolvedValue({ branches: [], commits: [] }), + }); + await expect(resolveCommitRef(sdk, "nope")).rejects.toThrow( + "Branch or commit not found: nope", + ); + }); +}); + +describe("resolveNodeHash", () => { + it("traverses from the resolved filesystem root", async () => { + const sdk = makeSdk(); + await expect( + resolveNodeHash(sdk, "win11", "/Windows/System32"), + ).resolves.toBe("node1"); + expect(sdk.TraversePath).toHaveBeenCalledWith({ + parentLabel: "Tree", + treeHash: FS, + path: "/Windows/System32", + }); + }); + + it("returns null for a missing path", async () => { + const sdk = makeSdk({ + TraversePath: jest + .fn() + .mockResolvedValue({ traversePath: null }), + }); + await expect( + resolveNodeHash(sdk, "win11", "/nope"), + ).resolves.toBeNull(); + }); +}); + +describe("resolveTreeHash / resolveBlobHash", () => { + it("return the hash when the path exists", async () => { + await expect(resolveTreeHash(makeSdk(), "win11", "/W")).resolves.toBe( + "node1", + ); + await expect( + resolveBlobHash(makeSdk(), "win11", "/W/a.dll"), + ).resolves.toBe("node1"); + }); + + it("throw a path-shaped error when it does not", async () => { + const sdk = makeSdk({ + TraversePath: jest + .fn() + .mockResolvedValue({ traversePath: null }), + }); + await expect(resolveTreeHash(sdk, "win11", "/nope")).rejects.toThrow( + 'Directory not found in "win11": /nope', + ); + await expect(resolveBlobHash(sdk, "win11", "/nope")).rejects.toThrow( + 'File not found in "win11": /nope', + ); + }); +}); + +describe("resolveHiveRoot", () => { + it("maps the hive enum to its on-disk path and follows HAS_WINREG", async () => { + const sdk = makeSdk(); + await expect(resolveHiveRoot(sdk, "win11", "SOFTWARE")).resolves.toBe( + "winreg1", + ); + expect(sdk.TraversePath).toHaveBeenCalledWith({ + parentLabel: "Tree", + treeHash: FS, + path: HIVE_PATHS.SOFTWARE, + }); + expect(HIVE_PATHS.SOFTWARE).toBe("/Windows/System32/config/SOFTWARE"); + }); + + it("throws when the blob carries no registry root", async () => { + const sdk = makeSdk({ + GetBlobWinRegRoot: jest.fn().mockResolvedValue({ + blobs: [{ hash: "node1", has_winreg: null }], + }), + }); + await expect(resolveHiveRoot(sdk, "win11", "SYSTEM")).rejects.toThrow( + 'Hive SYSTEM in "win11" has no parsed registry data', + ); + }); +}); diff --git a/mcp/tests/search.test.ts b/mcp/tests/search.test.ts new file mode 100644 index 0000000..eb70a41 --- /dev/null +++ b/mcp/tests/search.test.ts @@ -0,0 +1,274 @@ +import { jest } from "@jest/globals"; + +const mockSearchWithSession = jest.fn(); + +jest.unstable_mockModule("../src/graphql/generated/sdk.js", () => ({ + CommitHistoryDirection: { + Forward: "FORWARD", + Backward: "BACKWARD", + }, + EntityType: { + Filesystem: "FILESYSTEM", + Registry: "REGISTRY", + Struct: "STRUCT", + Symbol: "SYMBOL", + }, +})); + +const { search } = await import("../src/tools/search.js"); +const sdk = { + SearchWithSession: mockSearchWithSession, +} as any; + +function makePage(overrides: Partial = {}) { + return { + searchWithSession: { + session_id: "session-123", + results: [ + { + type: "FILESYSTEM", + commit_name: "KB-5044285", + commit_hash: "abc123", + blob_path: "/Windows/System32/ntdll.dll", + blob_hash: "def456", + entity_path: null, + node_hash: "def456", + }, + ], + has_more: false, + total_fetched: 1, + ...overrides, + }, + }; +} + +describe("search", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("searches with minimal params", async () => { + mockSearchWithSession.mockResolvedValue(makePage()); + + const result = await search({ + sdk, + search_term: "ntdll.dll", + start_ref: "windows", + }); + + expect(result).toEqual({ + session_id: "session-123", + results: [ + { + type: "FILESYSTEM", + commit_name: "KB-5044285", + commit_hash: "abc123", + blob_path: "/Windows/System32/ntdll.dll", + blob_hash: "def456", + entity_path: null, + node_hash: "def456", + }, + ], + has_more: false, + total_fetched: 1, + }); + + expect(mockSearchWithSession).toHaveBeenCalledWith({ + input: { + commit_range: { + startRef: "windows", + direction: "BACKWARD", + include_updates: false, + branch: null, + endRef: null, + }, + search_term: "ntdll.dll", + entity_types: null, + case_sensitive: false, + }, + pageSize: 50, + }); + }); + + it("passes direction and end_ref", async () => { + mockSearchWithSession.mockResolvedValue( + makePage({ results: [], total_fetched: 0 }), + ); + + await search({ + sdk, + search_term: "kernel32", + start_ref: "abc123", + direction: "FORWARD", + end_ref: "def456", + }); + + expect(mockSearchWithSession).toHaveBeenCalledWith({ + input: { + commit_range: { + startRef: "abc123", + direction: "FORWARD", + include_updates: false, + branch: null, + endRef: "def456", + }, + search_term: "kernel32", + entity_types: null, + case_sensitive: false, + }, + pageSize: 50, + }); + }); + + it("filters by entity types", async () => { + mockSearchWithSession.mockResolvedValue( + makePage({ results: [], total_fetched: 0 }), + ); + + await search({ + sdk, + search_term: "_EPROCESS", + start_ref: "windows", + entity_types: ["STRUCT", "SYMBOL"], + }); + + expect(mockSearchWithSession).toHaveBeenCalledWith({ + input: { + commit_range: { + startRef: "windows", + direction: "BACKWARD", + include_updates: false, + branch: null, + endRef: null, + }, + search_term: "_EPROCESS", + entity_types: ["STRUCT", "SYMBOL"], + case_sensitive: false, + }, + pageSize: 50, + }); + }); + + it("passes include_updates and branch filter", async () => { + mockSearchWithSession.mockResolvedValue( + makePage({ results: [], total_fetched: 0 }), + ); + + await search({ + sdk, + search_term: "KB", + start_ref: "windows_11_23h2", + include_updates: true, + branch: "windows_11_23h2", + }); + + expect(mockSearchWithSession).toHaveBeenCalledWith({ + input: { + commit_range: { + startRef: "windows_11_23h2", + direction: "BACKWARD", + include_updates: true, + branch: "windows_11_23h2", + endRef: null, + }, + search_term: "KB", + entity_types: null, + case_sensitive: false, + }, + pageSize: 50, + }); + }); + + it("passes case_sensitive flag", async () => { + mockSearchWithSession.mockResolvedValue( + makePage({ results: [], total_fetched: 0 }), + ); + + await search({ + sdk, + search_term: "NtDll", + start_ref: "windows", + case_sensitive: true, + }); + + expect(mockSearchWithSession).toHaveBeenCalledWith( + expect.objectContaining({ + input: expect.objectContaining({ + case_sensitive: true, + }), + }), + ); + }); + + it("passes the requested page size", async () => { + mockSearchWithSession.mockResolvedValue( + makePage({ + results: Array.from({ length: 10 }, (_, i) => ({ + type: "FILESYSTEM", + commit_name: `commit-${i}`, + commit_hash: `hash-${i}`, + blob_path: `/path/file-${i}.dll`, + blob_hash: `blob-${i}`, + entity_path: null, + node_hash: `node-${i}`, + })), + has_more: true, + total_fetched: 10, + }), + ); + + const result = await search({ + sdk, + search_term: "file", + start_ref: "windows", + limit: 10, + }); + + expect(result.results).toHaveLength(10); + expect(result.has_more).toBe(true); + expect(result.total_fetched).toBe(10); + expect(mockSearchWithSession).toHaveBeenCalledWith( + expect.objectContaining({ + pageSize: 10, + }), + ); + }); + + it("rejects lowercase entity types", async () => { + await expect( + search({ + sdk, + search_term: "test", + start_ref: "windows", + entity_types: ["filesystem" as any], + }), + ).rejects.toThrow( + 'Invalid entity type "filesystem". Valid types: FILESYSTEM, REGISTRY, STRUCT, SYMBOL', + ); + }); + + it("throws on invalid entity type", async () => { + await expect( + search({ + sdk, + search_term: "test", + start_ref: "windows", + entity_types: ["INVALID" as any], + }), + ).rejects.toThrow('Invalid entity type "INVALID"'); + }); + + it("propagates GraphQL errors", async () => { + mockSearchWithSession.mockRejectedValue( + new Error("GraphQL error: timeout"), + ); + + await expect( + search({ + sdk, + search_term: "test", + start_ref: "windows", + }), + ).rejects.toThrow("GraphQL error: timeout"); + }); +}); diff --git a/mcp/tests/server.test.ts b/mcp/tests/server.test.ts new file mode 100644 index 0000000..44d0804 --- /dev/null +++ b/mcp/tests/server.test.ts @@ -0,0 +1,41 @@ +import { tools } from "../src/tools/index.js"; + +describe("tool manifest", () => { + it("registers every tool exactly once", () => { + const names = tools.map((t) => t.name); + expect(new Set(names).size).toBe(names.length); + }); + + it("gives every tool a name, a description and a schema", () => { + for (const tool of tools) { + expect(tool.name).toMatch(/^[a-z][a-z0-9_]*$/); + expect(tool.description.length).toBeGreaterThan(20); + expect(typeof tool.schema).toBe("object"); + expect(typeof tool.handler).toBe("function"); + } + }); + + it("exposes the expected surface", () => { + expect(tools.map((t) => t.name).sort()).toEqual( + [ + "diff_nodes", + "diff_versions", + "get_blobs_with_symbols", + "get_commit_capabilities", + "get_struct", + "get_winreg_root", + "git_log", + "list_branches", + "list_commits", + "list_registry_key", + "list_structs", + "list_symbols", + "list_tree", + "search", + "search_close", + "search_next", + "traverse_path", + ].sort(), + ); + }); +}); diff --git a/mcp/tests/traverse-path.test.ts b/mcp/tests/traverse-path.test.ts new file mode 100644 index 0000000..024e94b --- /dev/null +++ b/mcp/tests/traverse-path.test.ts @@ -0,0 +1,74 @@ +import { jest } from "@jest/globals"; + +const mockResolveCommitRef = jest.fn(); +const mockTraversePath = jest.fn(); + +jest.unstable_mockModule("../src/resolve.js", () => ({ + resolveCommitRef: mockResolveCommitRef, +})); + +const { traversePath } = await import("../src/tools/traverse-path.js"); +const sdk = { + TraversePath: mockTraversePath, +} as any; + +describe("traversePath", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("returns hash for an existing path", async () => { + mockResolveCommitRef.mockResolvedValue({ + commitHash: "a".repeat(40), + filesystemHash: "f".repeat(40), + }); + mockTraversePath.mockResolvedValue({ + traversePath: "nodehash123", + }); + + const result = await traversePath( + sdk, + "windows_11_23h2", + "/Windows/System32/ntdll.dll", + ); + + expect(mockResolveCommitRef).toHaveBeenCalledWith( + sdk, + "windows_11_23h2", + ); + expect(mockTraversePath).toHaveBeenCalledWith({ + parentLabel: "Tree", + treeHash: "f".repeat(40), + path: "/Windows/System32/ntdll.dll", + }); + expect(result).toEqual({ hash: "nodehash123" }); + }); + + it("returns null hash when path does not exist", async () => { + mockResolveCommitRef.mockResolvedValue({ + commitHash: "a".repeat(40), + filesystemHash: "f".repeat(40), + }); + mockTraversePath.mockResolvedValue({ traversePath: null }); + + const result = await traversePath( + sdk, + "windows_11_23h2", + "/nonexistent/path", + ); + + expect(result).toEqual({ hash: null }); + }); + + it("throws when ref cannot be resolved", async () => { + mockResolveCommitRef.mockRejectedValue( + new Error("Branch or commit not found: missing"), + ); + + await expect(traversePath(sdk, "missing", "/")).rejects.toThrow( + "Branch or commit not found: missing", + ); + + expect(mockTraversePath).not.toHaveBeenCalled(); + }); +}); diff --git a/mcp/tests/winreg-root.test.ts b/mcp/tests/winreg-root.test.ts new file mode 100644 index 0000000..bd0b040 --- /dev/null +++ b/mcp/tests/winreg-root.test.ts @@ -0,0 +1,47 @@ +import { jest } from "@jest/globals"; + +const mockGetBlobWinRegRoot = jest.fn(); + +const { getWinregRoot } = await import("../src/tools/winreg-root.js"); +const sdk = { + GetBlobWinRegRoot: mockGetBlobWinRegRoot, +} as any; + +describe("getWinregRoot", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("returns winreg_hash for a registry hive blob", async () => { + mockGetBlobWinRegRoot.mockResolvedValue({ + blobs: [ + { hash: "blobhash", has_winreg: { hash: "winregroothash" } }, + ], + }); + + const result = await getWinregRoot(sdk, "blobhash"); + + expect(mockGetBlobWinRegRoot).toHaveBeenCalledWith({ + hash: "blobhash", + }); + expect(result).toEqual({ winreg_hash: "winregroothash" }); + }); + + it("returns null winreg_hash for a non-hive blob", async () => { + mockGetBlobWinRegRoot.mockResolvedValue({ + blobs: [{ hash: "blobhash", has_winreg: null }], + }); + + const result = await getWinregRoot(sdk, "blobhash"); + + expect(result).toEqual({ winreg_hash: null }); + }); + + it("returns null winreg_hash when blob is not found", async () => { + mockGetBlobWinRegRoot.mockResolvedValue({ blobs: [] }); + + const result = await getWinregRoot(sdk, "unknownhash"); + + expect(result).toEqual({ winreg_hash: null }); + }); +}); diff --git a/mcp/tsconfig.json b/mcp/tsconfig.json new file mode 100644 index 0000000..f372335 --- /dev/null +++ b/mcp/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "strict": true, + "noImplicitAny": true, + "skipLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "tests"] +} diff --git a/package.json b/package.json index 6dbf06c..2ad6fef 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "format-check": "prettier --check 'src/*.ts'", "lint": "npx eslint . --ext .ts", "ccode": "npm run format && npm run lint", - "test": "jest", - "test:watch": "jest --watch", + "test": "node --experimental-vm-modules node_modules/.bin/jest", + "test:watch": "node --experimental-vm-modules node_modules/.bin/jest --watch", "profile": "node --prof dist/src/index.js" }, "keywords": [], diff --git a/src/index.ts b/src/index.ts index 6358f17..4bfa7e3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,10 +6,15 @@ import { ApolloServerPluginDrainHttpServer } from "@apollo/server/plugin/drainHt import { readFileSync } from "fs"; import neo4j from "neo4j-driver"; import * as dotenv from "dotenv"; -import { cleanEnv, str, url, bool, num } from "envalid"; +import { cleanEnv, bool, num, str, url } from "envalid"; import { createConstraintsIfNotExists } from "./constraints.js"; import { resolvers } from "./resolvers.js"; import { createRestRouter } from "./rest-routes.js"; +import { + configureSessionManager, + startCleanupInterval, + closeAllSessions, +} from "./search-session.js"; // Sensitive registry value redaction (ProductId, DigitalProductId, etc.) is // disabled by default for the open-source release -- see the commented-out // plugin block below and docs/reference/access-restrictions.md. Uncomment @@ -73,7 +78,22 @@ const env = cleanEnv(process.env, { default: 15000, desc: "Timeout for each Winbindex index / symbol-server request", }), + MAX_SEARCH_SESSIONS: num({ + default: 100, + desc: "Maximum concurrent search sessions for paginated search", + }), + SEARCH_SESSION_TTL_MS: num({ + default: 300000, + desc: "Search session TTL in milliseconds (default: 5 min)", + }), +}); + +// Configure search session manager +configureSessionManager({ + maxSessions: env.MAX_SEARCH_SESSIONS, + ttlMs: env.SEARCH_SESSION_TTL_MS, }); +const searchSessionCleanupTimer = startCleanupInterval(); // Neo4j driver instance const driver = neo4j.driver( @@ -240,6 +260,8 @@ async function main() { async serverWillStart() { return { async drainServer() { + clearInterval(searchSessionCleanupTimer); + await closeAllSessions(); await serverCleanup.dispose(); }, }; diff --git a/src/resolvers.ts b/src/resolvers.ts index 951cfed..d7de5d4 100644 --- a/src/resolvers.ts +++ b/src/resolvers.ts @@ -14,6 +14,11 @@ import { } from "./ogm-types.js"; import { get_path_entry } from "./filesystem.js"; import { search } from "./search.js"; +import { + createSession, + fetchNextPage, + closeSession, +} from "./search-session.js"; import { git_log, git_log_stream } from "./git-log/index.js"; import { Driver } from "neo4j-driver"; import { OGM } from "@neo4j/graphql-ogm"; @@ -25,6 +30,9 @@ import { GetCommitCapabilitiesArgsSchema, GetBlobsWithSymbolsArgsSchema, GitLogArgsSchema, + SearchWithSessionArgsSchema, + SearchNextArgsSchema, + SearchCloseArgsSchema, } from "./validation.js"; export const resolvers = (driver: Driver, _ogm: OGM) => { @@ -194,6 +202,15 @@ export const resolvers = (driver: Driver, _ogm: OGM) => { } return results; }, + async searchWithSession(_source: unknown, args: unknown) { + const { input, page_size } = + SearchWithSessionArgsSchema.parse(args); + return createSession(driver, input, page_size, false); + }, + async searchNext(_source: unknown, args: unknown) { + const { session_id } = SearchNextArgsSchema.parse(args); + return fetchNextPage(session_id); + }, async gitLog( _source: unknown, args: unknown, @@ -217,6 +234,12 @@ export const resolvers = (driver: Driver, _ogm: OGM) => { ); }, }, + Mutation: { + async searchClose(_source: unknown, args: unknown) { + const { session_id } = SearchCloseArgsSchema.parse(args); + return closeSession(session_id); + }, + }, DiffItem: { old_props: (parent: DiffItem) => { if (!parent.old_props) return null; diff --git a/src/search-session.ts b/src/search-session.ts new file mode 100644 index 0000000..0880fa2 --- /dev/null +++ b/src/search-session.ts @@ -0,0 +1,240 @@ +import { Driver } from "neo4j-driver"; +import { randomUUID } from "crypto"; +import { search } from "./search.js"; +import { CommitRange, EntityType } from "./ogm-types.js"; + +// Re-export for resolver use +type OmniSearchInput = { + commit_range: CommitRange; + search_term: string; + entity_types?: EntityType[]; + case_sensitive?: boolean; +}; + +type OmniSearchResult = { + type: EntityType; + commit_name: string; + commit_hash: string; + blob_path: string; + blob_hash: string; + entity_path: string | null; + node_hash: string; +}; + +export type PaginatedSearchResult = { + session_id: string | null; + results: OmniSearchResult[]; + has_more: boolean; + total_fetched: number; +}; + +interface SearchSession { + id: string; + generator: AsyncGenerator; + createdAt: number; + lastAccessedAt: number; + totalFetched: number; + pageSize: number; + authenticated: boolean; + buffer: OmniSearchResult | null; + busy: boolean; +} + +const sessions = new Map(); + +const DEFAULT_MAX_SESSIONS = 100; +const DEFAULT_TTL_MS = 5 * 60 * 1000; // 5 minutes +const CLEANUP_INTERVAL_MS = 60 * 1000; // 60 seconds + +let maxSessions = DEFAULT_MAX_SESSIONS; +let ttlMs = DEFAULT_TTL_MS; + +export function configureSessionManager(opts: { + maxSessions?: number; + ttlMs?: number; +}) { + if (opts.maxSessions !== undefined) maxSessions = opts.maxSessions; + if (opts.ttlMs !== undefined) ttlMs = opts.ttlMs; +} + +/** + * Pull up to `count` results from a generator, using the session buffer first. + * Also peeks one ahead to determine has_more accurately. + */ +async function pullResults( + session: SearchSession, + count: number, +): Promise<{ results: OmniSearchResult[]; has_more: boolean }> { + const results: OmniSearchResult[] = []; + + // Consume buffered peek-ahead result first + if (session.buffer !== null) { + results.push(session.buffer); + session.buffer = null; + } + + // Pull remaining results from generator + while (results.length < count) { + const { value, done } = await session.generator.next(); + if (done) { + return { results, has_more: false }; + } + results.push(value); + } + + // Peek one ahead for exact has_more + const { value: peekValue, done: peekDone } = await session.generator.next(); + if (peekDone) { + return { results, has_more: false }; + } + session.buffer = peekValue; + return { results, has_more: true }; +} + +export async function createSession( + driver: Driver, + input: OmniSearchInput, + pageSize: number, + authenticated: boolean, +): Promise { + if (sessions.size >= maxSessions) { + throw new Error( + `Maximum concurrent search sessions (${maxSessions}) reached. Close existing sessions or wait for them to expire.`, + ); + } + + const id = randomUUID(); + const generator = search(driver, input); + const now = Date.now(); + + const session: SearchSession = { + id, + generator, + createdAt: now, + lastAccessedAt: now, + totalFetched: 0, + pageSize, + authenticated, + buffer: null, + busy: false, + }; + + sessions.set(id, session); + + try { + const { results, has_more } = await pullResults(session, pageSize); + session.totalFetched = results.length; + session.lastAccessedAt = Date.now(); + + // If no more results, clean up immediately + if (!has_more) { + await destroySession(session); + } + + return { + session_id: has_more ? id : null, + results, + has_more, + total_fetched: session.totalFetched, + }; + } catch (err) { + // Clean up on error + await destroySession(session); + throw err; + } +} + +export async function fetchNextPage( + sessionId: string, +): Promise { + const session = sessions.get(sessionId); + if (!session) { + throw new Error( + "Search session not found or expired. Start a new search.", + ); + } + + if (session.busy) { + throw new Error( + "Search session is busy processing another request. Please wait.", + ); + } + + session.busy = true; + try { + const { results, has_more } = await pullResults( + session, + session.pageSize, + ); + session.totalFetched += results.length; + session.lastAccessedAt = Date.now(); + + // If no more results, clean up immediately + if (!has_more) { + await destroySession(session); + } + + return { + session_id: has_more ? sessionId : null, + results, + has_more, + total_fetched: session.totalFetched, + }; + } catch (err) { + await destroySession(session); + throw err; + } finally { + session.busy = false; + } +} + +export async function closeSession(sessionId: string): Promise { + const session = sessions.get(sessionId); + if (!session) { + return false; + } + await destroySession(session); + return true; +} + +async function destroySession(session: SearchSession): Promise { + sessions.delete(session.id); + try { + await session.generator.return(undefined); + } catch { + // Ignore errors during cleanup + } +} + +async function expireStale(): Promise { + const now = Date.now(); + const expired: SearchSession[] = []; + + for (const session of sessions.values()) { + if (now - session.lastAccessedAt > ttlMs) { + expired.push(session); + } + } + + for (const session of expired) { + console.log( + `Search session ${session.id} expired (idle ${Math.round((now - session.lastAccessedAt) / 1000)}s)`, + ); + await destroySession(session); + } +} + +export function startCleanupInterval(): NodeJS.Timeout { + return setInterval(() => { + expireStale().catch((err) => { + console.error("Error during search session cleanup:", err); + }); + }, CLEANUP_INTERVAL_MS); +} + +export async function closeAllSessions(): Promise { + const allSessions = Array.from(sessions.values()); + for (const session of allSessions) { + await destroySession(session); + } +} diff --git a/src/validation.ts b/src/validation.ts index 63dfc5b..b85c6b8 100644 --- a/src/validation.ts +++ b/src/validation.ts @@ -133,6 +133,20 @@ export const BlobHashParamSchema = z.object({ hash: GitSHA1Schema, }); +// Paginated search arguments +export const SearchWithSessionArgsSchema = z.object({ + input: SearchInputSchema, + page_size: z.number().int().positive().max(500).default(50), +}); + +export const SearchNextArgsSchema = z.object({ + session_id: z.string().uuid("Invalid session ID format"), +}); + +export const SearchCloseArgsSchema = z.object({ + session_id: z.string().uuid("Invalid session ID format"), +}); + // Blob download arguments (GET /blob/:hash) export const BlobDownloadArgsSchema = BlobHashParamSchema; diff --git a/tests/search-session.test.ts b/tests/search-session.test.ts new file mode 100644 index 0000000..e841a57 --- /dev/null +++ b/tests/search-session.test.ts @@ -0,0 +1,103 @@ +import { jest } from "@jest/globals"; + +const mockSearch = jest.fn(); + +jest.unstable_mockModule("../src/search.js", () => ({ + search: mockSearch, +})); + +const { + configureSessionManager, + createSession, + fetchNextPage, + closeSession, + closeAllSessions, +} = await import("../src/search-session.js"); + +const driver = {} as any; +const input = { + commit_range: { startRef: "main" }, + search_term: "ntdll", +} as any; + +function makeResult(n: number) { + return { + type: "FILESYSTEM", + commit_name: `c${n}`, + commit_hash: "a".repeat(40), + blob_path: `/f${n}`, + blob_hash: "b".repeat(40), + entity_path: null, + node_hash: "c".repeat(40), + }; +} + +async function* gen(count: number) { + for (let i = 0; i < count; i++) { + yield makeResult(i); + } +} + +describe("search sessions", () => { + beforeEach(async () => { + await closeAllSessions(); + jest.clearAllMocks(); + configureSessionManager({ maxSessions: 100, ttlMs: 300000 }); + }); + + it("returns a session id and has_more when results exceed the page size", async () => { + mockSearch.mockReturnValue(gen(5)); + + const page = await createSession(driver, input, 2, false); + + expect(page.results).toHaveLength(2); + expect(page.has_more).toBe(true); + expect(page.total_fetched).toBe(2); + expect(typeof page.session_id).toBe("string"); + }); + + it("closes the session and returns a null session id on the last page", async () => { + mockSearch.mockReturnValue(gen(3)); + + const first = await createSession(driver, input, 2, false); + const second = await fetchNextPage(first.session_id!); + + expect(second.results).toHaveLength(1); + expect(second.has_more).toBe(false); + expect(second.session_id).toBeNull(); + expect(second.total_fetched).toBe(3); + + await expect(fetchNextPage(first.session_id!)).rejects.toThrow( + "Search session not found or expired", + ); + }); + + it("does not create a session when the first page exhausts the generator", async () => { + mockSearch.mockReturnValue(gen(2)); + + const page = await createSession(driver, input, 5, false); + + expect(page.results).toHaveLength(2); + expect(page.has_more).toBe(false); + expect(page.session_id).toBeNull(); + }); + + it("rejects a new session once maxSessions is reached", async () => { + configureSessionManager({ maxSessions: 1 }); + mockSearch.mockReturnValue(gen(10)); + await createSession(driver, input, 1, false); + + mockSearch.mockReturnValue(gen(10)); + await expect(createSession(driver, input, 1, false)).rejects.toThrow( + "Maximum concurrent search sessions (1) reached", + ); + }); + + it("closeSession returns true for a live session and false afterwards", async () => { + mockSearch.mockReturnValue(gen(10)); + const page = await createSession(driver, input, 1, false); + + await expect(closeSession(page.session_id!)).resolves.toBe(true); + await expect(closeSession(page.session_id!)).resolves.toBe(false); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 505a75a..1163f23 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -89,5 +89,6 @@ /* Completeness */ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } + }, + "exclude": ["node_modules", "dist", "mcp"] } \ No newline at end of file diff --git a/type-defs.graphql b/type-defs.graphql index f17907c..4f149e9 100644 --- a/type-defs.graphql +++ b/type-defs.graphql @@ -206,6 +206,13 @@ type SearchResult @query(read: false, aggregate: false) @mutation(operations: [] node_hash: String! } +type PaginatedSearchResult @query(read: false, aggregate: false) @mutation(operations: []) { + session_id: String + results: [SearchResult!]! + has_more: Boolean! + total_fetched: Int! +} + input DiffNodesOptions { limit: Int offset: Int @@ -256,6 +263,10 @@ type Query { getCommitExtractedDataLabels(commit_hash: String!): [String!]! # search search(input: SearchInput!): [SearchResult!]! + # paginated search - creates a session and returns first page + searchWithSession(input: SearchInput!, page_size: Int = 50): PaginatedSearchResult! + # fetch next page from an existing search session + searchNext(session_id: String!): PaginatedSearchResult! # get blobs that have symbols or structs for a given commit getBlobsWithSymbols(commit_hash: String!): [BlobWithSymbols!]! # git log - track entity changes across commit history @@ -280,3 +291,9 @@ type Subscription { options: GitLogOptions = null ): GitLogEntry! } + +# custom Mutations +type Mutation { + # close a search session and free resources + searchClose(session_id: String!): Boolean! +}