diff --git a/.agents/skills/gh-stack/SKILL.md b/.agents/skills/gh-stack/SKILL.md deleted file mode 100644 index 814c458d2..000000000 --- a/.agents/skills/gh-stack/SKILL.md +++ /dev/null @@ -1,872 +0,0 @@ ---- -description: | - Manage stacked branches and pull requests with the gh-stack GitHub CLI extension. Use when the user wants to create, push, rebase, sync, navigate, or view stacks of dependent PRs. Triggers on tasks involving stacked diffs, dependent pull requests, branch chains, or incremental code review workflows. -metadata: - author: github - github-path: skills/gh-stack - github-ref: refs/tags/v0.0.8 - github-repo: https://github.com/github/gh-stack - github-tree-sha: 26320e8be554b0cc1d122c353e8897f0c69739cd - version: 0.0.8 -name: gh-stack ---- -# gh-stack - -`gh stack` is a [GitHub CLI](https://cli.github.com/) extension for managing **stacked branches and pull requests**. A stack is an ordered list of branches where each branch builds on the one below it, rooted on a trunk branch (typically the repo's default branch). Each branch maps to one PR whose base is the branch below it, so reviewers see only the diff for that layer. - -``` -main (trunk) - └── auth-layer → PR #1 (base: main) - bottom (closest to trunk) - └── api-endpoints → PR #2 (base: auth-layer) - └── frontend → PR #3 (base: api-endpoints) - top (furthest from trunk) -``` - -The **bottom** of the stack is the branch closest to the trunk, and the **top** is the branch furthest from the trunk. Each branch inherits from the one below it. Navigation commands (`up`, `down`, `top`, `bottom`) follow this model: `up` moves away from trunk, `down` moves toward it. - -## When to use this skill - -Use this skill when the user wants to: - -- Break a large change into a chain of small, reviewable PRs -- Create, rebase, push, or sync a stack of dependent branches -- Navigate between layers of a branch stack -- View the status of stacked PRs -- Tear down and rebuild a stack to remove, reorder, or rename branches - -## Prerequisites - -The GitHub CLI (`gh`) v2.0+ must be installed and authenticated. Install the extension with: - -```bash -gh extension install github/gh-stack -``` - -Before using `gh stack`, configure git to prevent interactive prompts: - -```bash -git config rerere.enabled true # remember conflict resolutions (skips prompt on init) -git config remote.pushDefault origin # if multiple remotes exist (skips remote picker) -``` - -## Agent rules - -**All `gh stack` commands must be run non-interactively.** Every command invocation must include the flags and positional arguments needed to avoid prompts, TUIs, and interactive menus. If a command would prompt for input, it will hang indefinitely. - -1. **Always supply branch names as positional arguments** to `init`, `add`, and `checkout`. Running these commands without arguments triggers interactive prompts. Branch names are used exactly as given — a name is never prefixed or transformed, so `gh stack add refactor/foo` creates a branch named `refactor/foo`. -2. **Always use `--auto` with `gh stack submit`** to auto-generate PR titles. Without `--auto`, `submit` prompts for a title for each new PR. -3. **Always use `--json` with `gh stack view`.** Without `--json`, the command launches an interactive TUI that cannot be operated by agents. There is no other appropriate flag — always pass `--json`. -4. **Use `--remote ` when multiple remotes are configured**, or pre-configure `git config remote.pushDefault origin`. Without this, `push`, `submit`, `sync`, `link`, and `checkout` trigger an interactive remote picker. -5. **Avoid branches shared across multiple stacks.** If a branch belongs to multiple stacks, commands exit with code 6. Check out a non-shared branch first. -6. **Plan your stack layers by dependency order before writing code.** Foundational changes (models, APIs, shared utilities) go in lower branches; dependent changes (UI, consumers) go in higher branches. Think through the dependency chain before running `gh stack init`. -7. **Use standard `git add` and `git commit` for staging and committing.** This gives you full control over which changes go into each branch. The `-Am` shortcut is available but should not be the default approach—stacked PRs are most effective when each branch contains a deliberate, logical set of changes. -8. **Navigate down the stack when you need to change a lower layer.** If you're working on a frontend branch and realize you need API changes, don't hack around it at the current layer. Navigate to the appropriate branch (`gh stack down`, `gh stack checkout`, or `gh stack bottom`), make and commit the changes there, run `gh stack rebase --upstack`, then navigate back up to continue. -9. **Use `gh stack link` for external tool workflows.** When branches are managed by an external tool (jj, Sapling, etc.), use `gh stack link branch-a branch-b`. `link` does not rely on local tracking state and is intended for API-driven PR and stack management. Provide at least two branches/PRs to create or update a stack, or a stack number followed by the new branches/PRs to append them to the top of an existing stack (e.g. `gh stack link 7 branch-c`). - -**Never do any of the following — each triggers an interactive prompt or TUI that will hang:** -- ❌ `gh stack view` or `gh stack view --short` — always use `gh stack view --json` -- ❌ `gh stack submit` without `--auto` — always use `gh stack submit --auto` -- ❌ `gh stack init` without branch arguments — always provide branch names -- ❌ `gh stack add` without a branch name — always provide a branch name -- ❌ `gh stack checkout` without an argument — always provide a PR number or branch name -- ❌ `gh stack checkout ` when a different local stack already exists on those branches — this triggers an unbypassable conflict resolution prompt; use `gh stack unstack` first to remove the local stack, then retry the checkout - -## Thinking about stack structure - -Each branch in a stack should represent a **discrete, logical unit of work** that can be reviewed independently. The changes within a branch should be cohesive—they belong together and make sense as a single PR. - -### Dependency chain - -Stacked branches form a dependency chain: each branch builds on the one below it. This means **foundational changes must go in lower (earlier) branches**, and code that depends on them goes in higher (later) branches. - -**Plan your layers before writing code.** For example, a full-stack feature might be structured like this (use branch names relevant to your actual task, not these generic ones): - -``` -main (trunk) - └── data-models ← shared types, database schema - └── api-endpoints ← API routes that use the models - └── frontend-ui ← UI components that call the APIs - └── integration ← tests that exercise the full stack -``` - -This is illustrative — choose branch names and layer boundaries that reflect the specific work you're doing. The key principle is: if code in one layer depends on code in another, the dependency must be in the same branch or a lower one. - -### Branch naming - -Choose a clear, descriptive branch name for each layer that reflects the concern it contains (e.g., `auth`, `api-routes`, `frontend`). Branch names are used exactly as you provide them to `init` and `add` — nothing is prepended or transformed. Slashes are allowed and are treated as part of the name (e.g., `gh stack add refactor/foo` creates a branch named `refactor/foo`). - -### Staging changes deliberately - -The main reason to use `git add` and `git commit` directly is to control **which changes go into which branch**. When you have multiple files in your working tree, you can stage a subset for the current branch, commit them, then create a new branch and stage the rest there: - -```bash -# You're on data-models with several new files in your working tree. -# Stage only the model files for this branch: -git add internal/models/user.go internal/models/session.go -git commit -m "Add user and session models" - -git add db/migrations/001_create_users.sql -git commit -m "Add user table migration" - -# Now create a new branch for the API layer and stage the API files there: -gh stack add api-routes # created & switched to the api-routes branch -git add internal/api/routes.go internal/api/handlers.go -git commit -m "Add user API routes" -``` - -This keeps each branch focused on one concern. Multiple commits per branch are fine — the key is that all commits in a branch relate to the same logical concern, and changes that belong to a different concern go in a different branch. - -### When to create a new branch - -Create a new branch (`gh stack add`) when you're starting a **different concern** that depends on what you've built so far. Signs it's time for a new branch: - -- You're switching from backend to frontend work -- You're moving from core logic to tests or documentation -- The next set of changes has a different reviewer audience -- The current branch's PR is already large enough to review - -### One stack, one story - -Think of a stack from the reviewer's perspective: the stack of PRs should **tell a cohesive story** about a feature or project. A reviewer should be able to read the PRs in sequence and understand the progression of changes, with each PR being a small, logical piece of the whole. - -**When to use a single stack:** All the branches are part of the same feature, project, or closely related effort. Even if the work spans multiple concerns (models, API, frontend), they're all building toward the same goal. - -**When to create a separate stack:** The work is unrelated to your current stack — a different feature, a bug fix in an unrelated area, or an independent refactor. Don't mix unrelated work into a single stack just because you happen to be working on both. Start a new stack with `gh stack init` or switch to an existing stack with `gh stack checkout` for each distinct effort. - -Small, incidental fixes (e.g., fixing a typo you noticed) can go in the current stack if they're trivial. But if a change grows into its own project, it deserves its own stack. - -## Quick reference - -| Task | Command | -|------|---------| -| Create a stack | `gh stack init auth` | -| Create a stack of multiple branches | `gh stack init auth api frontend` | -| Adopt existing branches | `gh stack init existing-branch-a existing-branch-b` | -| Set custom trunk | `gh stack init --base develop branch-a` | -| Add a branch to stack | `gh stack add api-routes` | -| Add branch + stage all + commit | `gh stack add -Am "message" api-routes` | -| Push branches to remote | `gh stack push` | -| Push to specific remote | `gh stack push --remote origin` | -| Push branches + create draft PRs | `gh stack submit --auto` | -| Create PRs as ready for review | `gh stack submit --auto --open` | -| Sync (fetch, rebase, push) | `gh stack sync` | -| Sync with specific remote | `gh stack sync --remote origin` | -| Sync and prune merged branches | `gh stack sync --prune` | -| Rebase entire stack | `gh stack rebase` | -| Rebase upstack only | `gh stack rebase --upstack` | -| Rebase without trunk | `gh stack rebase --no-trunk` | -| Continue after conflict | `gh stack rebase --continue` | -| Abort rebase | `gh stack rebase --abort` | -| View stack details (JSON) | `gh stack view --json` | -| Switch branches up/down in stack | `gh stack up [n]` / `gh stack down [n]` | -| Switch to top/bottom branch | `gh stack top` / `gh stack bottom` | -| Check out by stack number | `gh stack checkout 7` | -| Check out by PR | `gh stack checkout 42` | -| Check out by branch (local only) | `gh stack checkout feature-auth` | -| Tear down the current stack to restructure it | `gh stack unstack` | -| Tear down a specific stack by number | `gh stack unstack 7` | - ---- - -## Workflows - -### End-to-end: create a stack from scratch - -```bash -# 1. Initialize a stack with the first branch -gh stack init auth -# → creates auth and checks it out - -# 2. Write code for the first layer (auth) -cat > auth.go << 'EOF' -package auth - -func Middleware(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // verify token - next.ServeHTTP(w, r) - }) -} -EOF - -# 3. Stage and commit using standard git commands -git add auth.go -git commit -m "Add auth middleware" - -# You can make multiple commits on the same branch -cat > auth_test.go << 'EOF' -package auth - -func TestMiddleware(t *testing.T) { - // test auth middleware -} -EOF -git add auth_test.go -git commit -m "Add auth middleware tests" - -# 4. When you're ready for a new concern, add the next branch -gh stack add api-routes -# → creates api-routes - -# 5. Write code for the API layer -cat > api.go << 'EOF' -package api - -func RegisterRoutes(mux *http.ServeMux) { - mux.HandleFunc("/users", handleUsers) -} -EOF -git add api.go -git commit -m "Add API routes" - -# 6. Add a third layer for frontend -gh stack add frontend -# → creates frontend - -cat > frontend.go << 'EOF' -package frontend - -func RenderDashboard(w http.ResponseWriter) { - // calls the API endpoints from the layer below -} -EOF -git add frontend.go -git commit -m "Add frontend dashboard" - -# ── Stack complete: auth → api-routes → frontend ── - -# 7. Push everything and create PRs (drafts by default) -gh stack submit --auto - -# 8. Verify the stack -gh stack view --json -``` - -> **Shortcut:** If you prefer a faster flow, `gh stack add -Am "message" branch-name` combines staging, committing, and branch creation into one command. This is useful for single-commit layers but bypasses deliberate staging. - -### Making mid-stack changes - -This is a critical workflow for agents. When you're working on a higher layer and realize you need to change something in a lower layer (e.g., you're building frontend components but need to add an API endpoint), **navigate down to the correct branch, make the change there, and rebase**. - -```bash -# You're on frontend but need to add an API endpoint - -# 1. Navigate to the API branch -gh stack down -# or: gh stack checkout api-routes - -# 2. Make the change where it belongs -cat > users_api.go << 'EOF' -package api - -func handleGetUser(w http.ResponseWriter, r *http.Request) { - // new endpoint the frontend needs -} -EOF -git add users_api.go -git commit -m "Add get-user endpoint" - -# 3. Rebase everything above to pick up the change -gh stack rebase --upstack - -# 4. Navigate back to where you were working -gh stack top -# or: gh stack checkout frontend - -# 5. Continue working — the API changes are now available -``` - -**Why this matters:** If you make API changes on the frontend branch, those changes will end up in the wrong PR. The API PR won't include them, and the frontend PR will have unrelated API diffs mixed in. Always put changes in the branch where they logically belong. - -### Modify a mid-stack branch and sync - -When you need to revisit a branch after the initial creation (e.g., responding to review feedback): - -```bash -# 1. Navigate to the branch that needs changes -gh stack bottom -# or: gh stack checkout auth -# or: gh stack checkout 42 (by PR number) - -# 2. Make changes and commit -cat > auth.go << 'EOF' -package auth -// updated implementation -EOF -git add auth.go -git commit -m "Fix auth token validation" - -# 3. Rebase everything above this branch -gh stack rebase --upstack - -# 4. Push the updated stack -gh stack push -``` - -### Routine sync after merges - -```bash -# Single command: fetch, rebase, push, sync PR and stack state -gh stack sync - -# Sync and automatically clean up local branches for merged PRs -gh stack sync --prune -``` - -> **Note for agents:** In non-interactive environments, the prune prompt is not shown. Use `--prune` explicitly to delete local branches for merged PRs. - -> **Note for agents:** `sync` also mirrors the stack on GitHub locally. If PRs were added to the stack on github.com, their branches are pulled down and appended to the local stack automatically. If the local and remote stacks have **diverged** (you changed the local stack while the remote stack changed differently), sync can only prompt to resolve it in an interactive terminal — in non-interactive environments it aborts the sync (nothing is pushed or updated) and exits successfully with `ℹ Sync aborted`. Resolve a divergence by unstacking and recreating the stack. - -### Squash-merge recovery - -When a PR is squash-merged on GitHub, the original branch's commits no longer exist in the trunk history. `gh stack` detects this automatically and uses `git rebase --onto` to correctly replay remaining commits. - -```bash -# After PR #1 (auth) is squash-merged on GitHub: -gh stack sync -# → fetches latest, detects the merge, fast-forwards trunk -# → rebases api-routes onto updated trunk (skips merged branch) -# → rebases frontend onto api-routes -# → pushes updated branches -# → reports: "Merged: #1" - -# Verify the result -gh stack view --json -# → auth shows "isMerged": true, "state": "MERGED" -# → api-routes and frontend show updated heads -``` - -If `sync` hits a conflict during this process, it restores all branches to their pre-rebase state and exits with code 3. See [Handle rebase conflicts](#handle-rebase-conflicts-agent-workflow) for the resolution workflow. - -### Handle rebase conflicts (agent workflow) - -```bash -# 1. Start the rebase -gh stack rebase - -# 2. If exit code 3 (conflict): -# - Parse stderr for conflicted file paths -# - Read those files to find <<<<<<< / ======= / >>>>>>> markers -# - Edit files to resolve conflicts -# - Stage resolved files: -git add path/to/resolved-file.go - -# 3. Continue the rebase -gh stack rebase --continue - -# 4. If another conflict occurs, repeat steps 2-3 - -# 5. If unable to resolve, abort to restore everything -gh stack rebase --abort -``` - -### Parsing `--json` output - -```bash -# Get stack state as JSON -output=$(gh stack view --json) - -# Check if any branch needs a rebase, and rebase if so -needs_rebase=$(echo "$output" | jq '[.branches[] | select(.needsRebase == true)] | length') -if [ "$needs_rebase" -gt 0 ]; then - echo "Branches need rebase, rebasing stack..." - gh stack rebase -fi - -# Get all open PR URLs -echo "$output" | jq -r '.branches[] | select(.pr.state == "OPEN") | .pr.url' - -# Find merged branches -echo "$output" | jq -r '.branches[] | select(.isMerged == true) | .name' - -# Get the current branch -echo "$output" | jq -r '.currentBranch' - -# Check if the stack is fully merged (all branches merged) -echo "$output" | jq '[.branches[] | .isMerged] | all' -``` - -### Restructure a stack (remove a branch, reorder, or rename) - -Use `unstack` to tear down the stack, make structural changes, then re-init: - -```bash -# 1. Remove the stack (locally and on GitHub) -gh stack unstack - -# 2. Make structural changes — e.g. delete a branch, reorder, rename -git branch -m old-branch-1 new-branch-1 - -# 3. Re-create the stack with the new structure -gh stack init --base main new-branch-1 new-branch-2 new-branch-3 -``` - ---- - -## Commands - -### Initialize a stack — `gh stack init` - -Creates a new stack. **Always provide at least one branch name as a positional argument** — running without branch arguments triggers interactive prompts that agents cannot use. - -``` -gh stack init [flags] -``` - -```bash -# Create a stack with a new branch -gh stack init auth -# → creates auth and checks it out - -# Create a stack with new branches -gh stack init branch-a branch-b branch-c - -# Use a different trunk branch -gh stack init --base develop branch-a branch-b - -# Adopt existing branches into a stack (handled automatically if the branches exist) -gh stack init branch-a branch-b branch-c -``` - -| Flag | Description | -|------|-------------| -| `-b, --base ` | Trunk branch (defaults to the repo's default branch) | - -**Behavior:** - -- Branch names are created exactly as given (slashes are allowed and kept as-is) -- Creates any branches that don't already exist (branching from the trunk branch) -- Existing branches are adopted automatically; missing branches are created from the trunk -- Checks out the last branch in the list -- Enables `git rerere` so conflict resolutions are remembered across rebases. On first run in a repo, this may trigger a confirmation prompt — pre-configure with `git config rerere.enabled true` to avoid it - ---- - -### Add a branch — `gh stack add` - -Add a new branch on top of the current stack. Must be run while on the topmost branch (or the trunk if the stack has no branches yet). **Always provide a branch name** — running without one triggers an interactive prompt. - -``` -gh stack add [flags] -``` - -**Recommended workflow — create the branch, then use standard git:** - -```bash -# Create a new branch and switch to it -gh stack add api-routes - -# Write code, stage deliberately, and commit -git add internal/api/routes.go internal/api/handlers.go -git commit -m "Add user API routes" - -# Make more commits on the same branch as needed -git add internal/api/middleware.go -git commit -m "Add rate limiting middleware" -``` - -**Shortcut — stage, commit, and branch in one command:** - -```bash -# Create a new branch, stage all changes, and commit -gh stack add -Am "Add API routes" api-routes - -# Create a new branch, stage tracked files only, and commit -gh stack add -um "Fix auth bug" auth-fix -``` - -| Flag | Description | -|------|-------------| -| `-m, --message ` | Create a commit with this message | -| `-A, --all` | Stage all changes including untracked files (requires `-m`) | -| `-u, --update` | Stage tracked files only (requires `-m`) | - -**Behavior notes:** - -- `-A` and `-u` are mutually exclusive. -- When the current branch has no commits (e.g., right after `init`), `add -Am` commits directly on the current branch instead of creating a new one. -- **Branch names are used verbatim.** `gh stack add refactor/foo` creates a branch named `refactor/foo` — names are never prefixed or transformed. When `-m` is given without a branch name, the name is auto-generated from the commit message in date+slug format (e.g., `03-24-add_api_routes`). -- If called from a branch that is not the topmost in the stack, exits with code 5: `"can only add branches on top of the stack"`. Use `gh stack top` to switch first. -- **Uncommitted changes:** When using `gh stack add branch-name` without `-Am`, any uncommitted changes (staged or unstaged) in your working tree carry over to the new branch. This is standard git behavior — the working tree is not touched. Commit or stash changes on the current branch before running `add` if you want a clean starting point on the new branch. - ---- - -### Push branches to remote — `gh stack push` - -Push all stack branches to the remote. - -``` -gh stack push [flags] -``` - -```bash -# Push all branches -gh stack push - -# Push to specific remote -gh stack push --remote upstream -``` - -| Flag | Description | -|------|-------------| -| `--remote ` | Remote to push to (use if multiple remotes exist) | - -**Behavior:** - -- Pushes all active (non-merged) branches atomically (`--force-with-lease --atomic`) -- Does **not** create or update pull requests — use `gh stack submit` for that - -**Output (stderr):** - -- `Pushed N branches` summary - ---- - -### Submit branches and create PRs — `gh stack submit` - -Push all stack branches and create PRs on GitHub. **Always pass `--auto`** — without it, `submit` prompts for a PR title for each new branch. - -```bash -# Submit and auto-title new PRs (required for non-interactive use) -gh stack submit --auto - -# Submit and create PRs as ready for review (not drafts) -gh stack submit --auto --open -``` - -| Flag | Description | -|------|-------------| -| `--auto` | Auto-generate PR titles without prompting (**required** for non-interactive use) | -| `--open` | Mark new and existing PRs as ready for review | -| `--remote ` | Remote to push to (use if multiple remotes exist) | - -**Behavior:** - -- Pushes all active (non-merged) branches atomically (`--force-with-lease --atomic`) -- Creates a new PR for each branch that doesn't have one (base set to the first non-merged ancestor branch) -- After creating PRs, links them together as a **Stack** on GitHub (requires the repository to have stacks enabled) -- If every PR in the stack has already been merged, the stack is complete and can't be extended. `submit` automatically forks your unmerged branches into a **new** stack rooted at the trunk and creates it on GitHub, leaving the merged stack untouched. -- If stacks are not available (exit code 9), the repository does not have stacked PRs enabled. In interactive mode, `submit` offers to create regular (unstacked) PRs instead. In non-interactive mode, it exits with code 9. -- Syncs PR metadata for branches that already have PRs - -**PR title auto-generation (`--auto`):** - -- Single commit on branch → uses the commit subject as the PR title, commit body as PR body -- Multiple commits on branch → humanizes the branch name (hyphens/underscores → spaces) as the title - -**Output (stderr):** - -- `Created PR #N for ` for each newly created PR -- `PR #N for is up to date` for existing PRs -- `Pushed and synced N branches` summary - ---- - -### Link branches as a stack (no local tracking) — `gh stack link` - -Link PRs into a stack on GitHub without creating any local tracking state. This is the recommended approach if you are managing stacked branches with other tools (jj, Sapling, git-town) and want to simply create GitHub Stacked PRs via an API. - -``` -gh stack link [flags] [...] -``` - -```bash -# Link branches into a stack (pushes, creates PRs, creates stack) -gh stack link branch-a branch-b branch-c - -# Use a different base branch and mark PRs as ready for review -gh stack link --base develop --open branch-a branch-b branch-c - -# Link existing PRs by number -gh stack link 10 20 30 - -# Add branches to an existing stack of PRs -gh stack link 42 43 feature-auth feature-ui - -# Append to the top of an existing stack by its stack number -# (7 is a stack number; only the new PRs/branches are listed) -gh stack link 7 48 feature-auth -``` - -When the first argument is a stack number, the remaining arguments are appended to the top of that stack, so you don't have to re-list its current PRs. Arguments already in the stack are skipped; arguments in a different stack are rejected. A numeric first argument is treated as a stack only when it matches an existing stack — otherwise it is a PR or branch. - -| Flag | Description | -|------|---------| -| `--base ` | Base branch for the bottom of the stack (default: `main`) | -| `--open` | Mark new and existing PRs as ready for review | -| `--remote ` | Remote to push to (use if multiple remotes exist) | - -**Behavior:** - -- Arguments are provided in stack order (bottom to top) -- Each argument can be a branch name or a PR number. Numeric arguments are tried as PR numbers first; if no PR with that number exists, the argument is treated as a branch name -- Branch arguments are pushed to the remote automatically (non-force, atomic) -- For branches without open PRs, new PRs are created with auto-generated titles and the correct base branch chaining (first branch uses `--base`, subsequent branches use the previous branch) -- Existing PRs whose base branch doesn't match the expected chain are corrected automatically -- If the PRs are not yet in a stack, a new stack is created. If some PRs are already in a stack, the stack is updated (additive only — existing PRs are never removed) -- Does **not** create or modify any local state - -**Output (stderr):** - -- `Pushing N branches to ...` -- `Found PR #N for branch ` for branches with existing PRs -- `Created PR #N for (base: )` for newly created PRs -- `Updated base branch for PR #N to ` when base branches are corrected -- `Created stack with N PRs` or `Updated stack to N PRs` - ---- - -### Sync the stack — `gh stack sync` - -Fetch, rebase, push, and sync PR state in a single command. This is the recommended command for routine synchronization. - -``` -gh stack sync [flags] -``` - -| Flag | Description | -|------|-------------| -| `--remote ` | Remote to fetch from and push to (use if multiple remotes exist) | -| `--prune` | Delete local branches for merged PRs | - -**What it does (in order):** - -1. **Fetch** latest changes from the remote -2. **Reconcile the remote stack** — mirror the GitHub stack locally. If PRs were added to the stack on GitHub, pull their branches down and append them to the local stack. If the local and remote stacks have diverged, aborts the sync in a non-interactive terminal. In an interactive terminal, offers prompts to resolve any divergence (replace local stack with remote version, delete stack on GitHub so it can be recreated, or cancel). -3. **Fast-forward trunk** to match remote (skips if already up to date, warns if diverged) -4. **Cascade rebase** all stack branches onto their updated parents (only if trunk moved). Handles merged PRs automatically. If a conflict is detected, **all branches are restored** to their pre-rebase state and the command exits with code 3 — see [Handle rebase conflicts](#handle-rebase-conflicts-agent-workflow) for the resolution workflow -5. **Push** all active branches atomically -6. **Sync PR state** from GitHub and report the status of each PR -7. **Sync the stack object** — link the open PRs into a stack on GitHub. If the PRs are not yet in a stack, a new stack is created; if some PRs are already in a stack, it is updated (additive only). This only happens when two or more PRs exist. Sync **never opens PRs** — use `gh stack submit` for that -8. **Prune** — in interactive terminals, prompts to delete local branches for merged PRs. Use `--prune` to skip the prompt. In non-interactive environments, pruning only happens when `--prune` is passed explicitly - -**Output (stderr):** - -- `✓ Fetched latest changes from origin` -- `Pulling N new branches from the remote stack ...` then `✓ Pulled N new branches into the stack from the remote` (when the remote stack is ahead) -- `⚠ Your local stack has diverged from the stack on GitHub` (with `Local:` / `Remote:` chains) when the stacks have diverged -- `ℹ Sync aborted — no changes were made` when a sync is cancelled -- `✓ Trunk main fast-forwarded to ` or `✓ Trunk main is already up to date` -- `✓ Rebased onto ` per branch (if base moved) -- `✓ Pushed N branches` -- `✓ PR #N () — Open` per branch -- `Merged: #N, #M` for merged branches -- `✓ Stack created on GitHub with N PRs` / `✓ Stack updated on GitHub with N PRs` / `✓ Linked to the existing stack on GitHub` (when two or more PRs exist) -- `✓ Pruned (merged)` per pruned branch (when pruning) -- `✓ Stack synced` when the stack object on GitHub was created/updated to match local, or `✓ Branches synced` when only the branches were synced (fewer than two PRs or stacked PRs unavailable) - ---- - -### Rebase the stack — `gh stack rebase` - -Pull from remote and cascade-rebase stack branches. Use this when `sync` reports a conflict or when you need finer control (e.g., rebase only part of the stack). - -``` -gh stack rebase [flags] [branch] -``` - -```bash -# Rebase the entire stack -gh stack rebase - -# Rebase only branches from trunk to current branch -gh stack rebase --downstack - -# Rebase only branches from current branch to top -gh stack rebase --upstack - -# Rebase stack branches without pulling from or rebasing with trunk -gh stack rebase --no-trunk - -# After resolving a conflict: stage files with `git add`, then: -gh stack rebase --continue - -# Abort and restore all branches to pre-rebase state -gh stack rebase --abort -``` - -| Flag | Description | -|------|-------------| -| `--downstack` | Only rebase branches from trunk to the current branch | -| `--upstack` | Only rebase branches from the current branch to the top | -| `--no-trunk` | Skip trunk — only rebase stack branches onto each other (no fetch, no trunk rebase) | -| `--continue` | Continue after resolving conflicts | -| `--abort` | Abort and restore all branches | -| `--remote ` | Remote to fetch from (use if multiple remotes exist) | - -| Argument | Description | -|----------|-------------| -| `[branch]` | Target branch (defaults to the current branch) | - -**Conflict handling:** See [Handle rebase conflicts](#handle-rebase-conflicts-agent-workflow) in the Workflows section for the full resolution workflow. - -**Merged PR detection:** If a branch's PR was merged on GitHub, the rebase automatically handles this using `--onto` mode and correctly replays commits on top of the merge target. - -**Rerere (conflict memory):** `git rerere` is enabled by `init` so previously resolved conflicts are auto-resolved in future rebases. - -**No-trunk mode:** Use `--no-trunk` to skip fetching from the remote and rebasing with the trunk branch. Only inter-branch rebases are performed (branch 2 onto branch 1, branch 3 onto branch 2, etc.). Useful when you only need to align stack branches with each other without pulling upstream changes. - ---- - -### View the stack — `gh stack view` - -Display the current stack's branches, PR status, and recent commits. **Always pass `--json`** — without it, this command launches an interactive TUI that agents cannot operate. - -```bash -# Always use --json -gh stack view --json -``` - -| Flag | Description | -|------|-------------| -| `--json` | Output stack data as JSON to stdout (**required** for non-interactive use) | - -**`--json` output format:** - -```json -{ - "trunk": "main", - "currentBranch": "api-routes", - "branches": [ - { - "name": "auth", - "head": "abc1234...", - "base": "def5678...", - "isCurrent": false, - "isMerged": true, - "needsRebase": false, - "pr": { - "number": 42, - "url": "https://github.com/owner/repo/pull/42", - "state": "MERGED" - } - }, - { - "name": "api-routes", - "head": "789abcd...", - "base": "abc1234...", - "isCurrent": true, - "isMerged": false, - "needsRebase": false, - "pr": { - "number": 43, - "url": "https://github.com/owner/repo/pull/43", - "state": "OPEN" - } - } - ] -} -``` - -Fields per branch: -- `name` — branch name -- `head` — current HEAD SHA -- `base` — parent branch's HEAD SHA at last sync -- `isCurrent` — whether this is the checked-out branch -- `isMerged` — whether the PR has been merged -- `needsRebase` — whether the base branch is not an ancestor (non-linear history) -- `pr` — PR metadata (omitted if no PR exists). `state` is `"OPEN"` or `"MERGED"`. - ---- - -### Navigate the stack - -Move between branches without remembering branch names. These commands are fully non-interactive. - -```bash -gh stack up # Move up one branch (further from trunk) -gh stack up 3 # Move up three branches -gh stack down # Move down one branch (closer to trunk) -gh stack down 2 # Move down two branches -gh stack top # Jump to the top of the stack (furthest from trunk) -gh stack bottom # Jump to the bottom (first non-merged branch above trunk) -``` - -Navigation clamps to stack bounds. Merged branches are skipped when navigating from active branches. - ---- - -### Check out a stack — `gh stack checkout` - -Check out a stack from a pull request number or branch name. **Always provide an argument** — running `gh stack checkout` without arguments triggers an interactive selection menu. - -``` -gh stack checkout -``` - -```bash -# By PR number (pulls from GitHub) -gh stack checkout 42 - -# By branch name (local only) -gh stack checkout feature-auth -``` - -When a PR number is provided (e.g. `123`), the command fetches the stack on GitHub, pulls the branches, and sets up the stack locally. If the stack already exists locally and matches, it switches to the branch. - -> **⚠️ Agent warning:** If the local and remote stacks have different branch compositions, this command triggers an interactive conflict-resolution prompt that cannot be bypassed with a flag. To avoid this: run `gh stack unstack` first to remove the conflicting local stack, then retry `gh stack checkout `. - -When a branch name is provided, the command resolves it against locally tracked stacks only. This is always safe for non-interactive use. - ---- - -### Remove a stack — `gh stack unstack` - -Tear down a stack so you can restructure it — remove a branch, reorder branches, rename branches, or make other large changes. After unstacking, use `gh stack init` to re-create the stack with the desired structure. - -With no argument, the command targets the active stack — the one containing the currently checked out branch — unstacking it on GitHub and removing local tracking. - -Provide a stack number to unstack a specific stack on GitHub. This works from anywhere in the repository, whether or not the stack is checked out locally — the number is unstacked directly through the GitHub API (like `gh stack link`, no local tracking required). If the stack is also tracked locally, its local tracking is removed as well. - -``` -gh stack unstack [] [flags] -``` - -```bash -# Tear down the current stack (locally and on GitHub), then rebuild -gh stack unstack -gh stack init --base main branch-2 branch-1 branch-3 # reordered - -# Unstack a specific stack by its number, from anywhere in the repo -gh stack unstack 7 - -# Only remove local tracking (keep the stack on GitHub) -gh stack unstack --local -``` - -| Flag | Description | -|------|-------------| -| `--local` | Only remove the stack locally (keep it on GitHub); never contacts GitHub | - -> **Note for agents:** `gh stack unstack ` is a remote-first API wrapper — it unstacks on GitHub by number from anywhere in the repo, tracked locally or not, and is safe for non-interactive use. `--local` never contacts GitHub; combining `--local` with a number that isn't tracked locally is an error. An unknown stack number returns a "not found on GitHub" error (exit code 2). - ---- - -## Output conventions - -- **Status messages** go to **stderr** with emoji prefixes: `✓` (success), `✗` (error), `⚠` (warning), `ℹ` (info). -- **Data output** (e.g., `view --json`) goes to **stdout**. -- When piping output, use `2>/dev/null` to suppress status messages if only data output is needed. - -## Exit codes and error recovery - -| Code | Meaning | Agent action | -|------|---------|-------------| -| 0 | Success | Proceed normally | -| 1 | Generic error | Read stderr for details; may indicate commit/push failure | -| 2 | Not in a stack | Run `gh stack init` to create a stack first | -| 3 | Rebase conflict | Parse stderr for conflicted file paths, resolve conflicts, run `gh stack rebase --continue` | -| 4 | GitHub API failure | Check `gh auth status`, retry the command | -| 5 | Invalid arguments | Fix the command invocation (check flags and arguments) | -| 6 | Disambiguation required | A branch belongs to multiple stacks. Run `gh stack checkout ` to switch to a non-shared branch first | -| 7 | Rebase already in progress | Run `gh stack rebase --continue` (after resolving conflicts) or `gh stack rebase --abort` to start over | -| 8 | Stack is locked | Another `gh stack` process is writing the stack file. Wait and retry — the lock times out after 5 seconds | -| 9 | Stacked PRs unavailable | The repository does not have stacked PRs enabled. `submit` will offer to create regular (unstacked) PRs in interactive mode | - -## Known limitations - -1. **Stacks are strictly linear.** Branching stacks (multiple children on a single parent) are not supported. Each branch has exactly one parent and at most one child. If you need parallel workstreams, use separate stacks. -2. **Stack disambiguation cannot be bypassed.** If the current branch is the trunk of multiple stacks, commands error with code 6. Check out a non-shared branch first. -3. **Multiple remotes require `--remote` or config.** If more than one remote is configured, pass `--remote ` or set `remote.pushDefault` in git config before running `push`, `sync`, or `rebase`. -4. **Merging PRs:** Merging Stacked PRs from the CLI is not supported yet. Direct users to open the PR URL in a browser to merge PRs. -5. **Remote stack checkout requires a PR number.** `checkout` with a branch name only works with locally tracked stacks. Use a PR number (e.g. `gh stack checkout 123`) to pull stacks from GitHub. -6. **PR title and body are auto-generated.** There is no flag to set a custom PR title or body during `submit`. The title and body are generated from commit messages plus a footer. Use `gh pr edit` to modify PR title and body after creation. diff --git a/.cursor/environment.json b/.cursor/environment.json deleted file mode 100644 index 23b5526ce..000000000 --- a/.cursor/environment.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "install": "#!/bin/bash\nset -e\n\n# Install Docker (needed for runtime, not for build)\nif ! command -v docker &> /dev/null; then\n curl -fsSL https://get.docker.com | sudo sh\n sudo usermod -aG docker ubuntu\nfi\n\n# Initialize git submodules\ngit submodule update --init --recursive\n\n# Enable corepack for Yarn\ncorepack enable\n\n# Build Zoekt binaries\nmkdir -p bin\ngo build -C vendor/zoekt -o $(pwd)/bin ./cmd/...\n\n# Install dependencies and build shared packages\nyarn install\nyarn build:deps\n\n# Create minimal config.json with public repos and models for E2E testing\ncat > config.json << 'CONFIGEOF'\n{\n \"$schema\": \"https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json\",\n \"connections\": {\n \"github-public\": {\n \"type\": \"github\",\n \"repos\": [\"sourcebot-dev/sourcebot\"]\n }\n },\n \"models\": [\n {\n \"provider\": \"anthropic\",\n \"model\": \"claude-sonnet-4-5\",\n \"displayName\": \"Claude Sonnet 4.5\",\n \"token\": {\n \"env\": \"ANTHROPIC_API_KEY\"\n }\n }\n ]\n}\nCONFIGEOF\n\necho \"[env-setup] Install completed successfully\"", - "start": "#!/bin/bash\nset -e\n\n# Start Docker daemon\nif ! docker info &> /dev/null 2>&1; then\n sudo dockerd > /tmp/dockerd.log 2>&1 &\n sleep 3\n sudo chmod 666 /var/run/docker.sock || true\n # Wait for Docker to be ready\n for i in {1..30}; do\n if docker info &> /dev/null 2>&1; then\n echo \"[start] Docker daemon ready\"\n break\n fi\n sleep 1\n done\nfi\n\n# Start PostgreSQL and Redis containers\ncd /workspace\ndocker compose -f docker-compose-dev.yml up -d\nsleep 5\n\n# Run database migrations\nyarn dev:prisma:migrate:dev\n\n# Start development server\nyarn dev &\n\n# Wait for port 3000 to be ready\necho \"[start] Waiting for http://localhost:3000...\"\nfor i in {1..90}; do\n if curl -s -o /dev/null -w '%{http_code}' http://localhost:3000/ 2>/dev/null | grep -qE '^(200|307)$'; then\n echo \"[start] Server ready on port 3000\"\n break\n fi\n sleep 2\ndone\n\n# Keep container alive\nwait", - "ports": [{"name": "web", "port": 3000}] -} diff --git a/.cursor/rules/cloud_agent.mdc b/.cursor/rules/cloud_agent.mdc deleted file mode 100644 index 322767482..000000000 --- a/.cursor/rules/cloud_agent.mdc +++ /dev/null @@ -1,5 +0,0 @@ ---- -alwaysApply: true ---- -- After creating a GitHub PR, create a follow-up commit with a CHANGELOG.md entry with a single-sentence description of the change. Add new entries only under `## [Unreleased]`, using one of these subsections: Added, Changed, Deprecated, Removed, Fixed, or Security. Create the subsection under `Unreleased` if it does not exist, and place the new entry at the bottom of that subsection. End the entry with the GitHub pull request link formatted as `[#](https://github.com/sourcebot-dev/sourcebot/pull/)` (e.g., `[#696](https://github.com/sourcebot-dev/sourcebot/pull/696)`). Never add entries under a released version header such as `## [x.y.z] - YYYY-MM-DD`, move or rewrite unrelated existing entries, or place the new entry anywhere else. -- When creating a GitHub PR for a given issue, always include "Fixes #" in the body of the GitHub PR description, where is the id of the GitHub issue. \ No newline at end of file diff --git a/.cursor/rules/style.mdc b/.cursor/rules/style.mdc deleted file mode 100644 index 6d3e8046b..000000000 --- a/.cursor/rules/style.mdc +++ /dev/null @@ -1,7 +0,0 @@ ---- -description: -globs: -alwaysApply: true ---- -- Always use 4 spaces for indentation -- Filenames should always be camelCase. Exception: if there are filenames in the same directory with a format other than camelCase, use that format to keep things consistent. \ No newline at end of file diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 5b499f8cb..000000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,64 +0,0 @@ -# Development container for Sourcebot -# Based on Node.js 24 with TypeScript support -FROM mcr.microsoft.com/devcontainers/typescript-node:24 - -ARG GO_VERSION=1.23.4 -ARG CTAGS_VERSION=v6.1.0 - -# Install system dependencies -RUN apt-get update && apt-get install -y --no-install-recommends \ - # Build tools for universal-ctags - autoconf \ - automake \ - pkg-config \ - make \ - gcc \ - g++ \ - libjansson-dev \ - libyaml-dev \ - libseccomp-dev \ - libxml2-dev \ - # PostgreSQL client tools (for debugging) - postgresql-client \ - # Redis CLI tools (for debugging) - redis-tools \ - # Other utilities - curl \ - git \ - && rm -rf /var/lib/apt/lists/* - -# Install Go (detect architecture automatically) -RUN ARCH=$(dpkg --print-architecture) && \ - if [ "$ARCH" = "arm64" ]; then GOARCH="arm64"; else GOARCH="amd64"; fi && \ - curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-${GOARCH}.tar.gz" | tar -C /usr/local -xzf - -ENV PATH="/usr/local/go/bin:${PATH}" -ENV GOPATH="/home/node/go" -ENV PATH="${GOPATH}/bin:${PATH}" - -# Build and install universal-ctags from source -RUN git clone --depth 1 --branch "${CTAGS_VERSION}" https://github.com/universal-ctags/ctags.git /tmp/ctags \ - && cd /tmp/ctags \ - && ./autogen.sh \ - && ./configure \ - && make -j$(nproc) \ - && make install \ - && rm -rf /tmp/ctags - -# Enable corepack for Yarn and disable download prompts -ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0 -RUN corepack enable - -# Create directories that will be mounted as volumes with correct ownership -# This ensures the node user can write to them when volumes are mounted -RUN mkdir -p /home/node/go /home/node/.yarn/berry/cache \ - && chown -R node:node /home/node/go /home/node/.yarn - -# Set working directory -WORKDIR /workspaces/sourcebot - -# Switch to non-root user -USER node - -# Install Claude CLI (native binary) -RUN curl -fsSL https://claude.ai/install.sh | bash -ENV PATH="/home/node/.claude/bin:${PATH}" diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 5a9235e84..000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "Sourcebot Development", - "dockerComposeFile": "docker-compose.yml", - "service": "devcontainer", - "workspaceFolder": "/workspaces/sourcebot", - - "features": { - "ghcr.io/devcontainers/features/git:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {} - }, - - "remoteEnv": { - "AUTH_URL": "https://${localEnv:CODESPACE_NAME}-3000.${localEnv:GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN}" - }, - - "forwardPorts": [3000], - "portsAttributes": { - "3000": { "label": "Web App", "onAutoForward": "notify" } - }, - - "initializeCommand": "git submodule update --init --recursive", - "postCreateCommand": "bash .devcontainer/scripts/post-create.sh", - "postStartCommand": "bash .devcontainer/scripts/post-start.sh", - - "customizations": { - "vscode": { - "extensions": [ - "dbaeumer.vscode-eslint", - "bradlc.vscode-tailwindcss", - "Prisma.prisma", - "esbenp.prettier-vscode", - "golang.go", - "eamodio.gitlens" - ], - "settings": { - "editor.formatOnSave": false, - "editor.defaultFormatter": "esbenp.prettier-vscode", - "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[typescriptreact]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - "[prisma]": { - "editor.defaultFormatter": "Prisma.prisma" - } - } - } - }, - - "remoteUser": "node" -} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml deleted file mode 100644 index 96a9e7ff1..000000000 --- a/.devcontainer/docker-compose.yml +++ /dev/null @@ -1,54 +0,0 @@ -version: '3.8' - -services: - devcontainer: - build: - context: . - dockerfile: Dockerfile - volumes: - - ..:/workspaces/sourcebot:cached - - go-modules:/home/node/go - - yarn-cache:/home/node/.yarn/berry/cache - command: sleep infinity - ports: - - "3000:3000" - environment: - DATABASE_URL: postgresql://postgres:postgres@postgres:5432/postgres - REDIS_URL: redis://redis:6379 - ZOEKT_WEBSERVER_URL: http://localhost:6070 - CTAGS_COMMAND: ctags - AUTH_SECRET: "00000000000000000000000000000000000000000000" - AUTH_URL: http://localhost:3000 - DATA_CACHE_DIR: /workspaces/sourcebot/.sourcebot - SOURCEBOT_ENCRYPTION_KEY: "00000000000000000000000000000000" - NODE_ENV: development - SOURCEBOT_LOG_LEVEL: debug - SOURCEBOT_TELEMETRY_DISABLED: "true" - REVIEW_AGENT_LOGGING_ENABLED: "true" - REVIEW_AGENT_AUTO_REVIEW_ENABLED: "false" - REVIEW_AGENT_REVIEW_COMMAND: review - depends_on: - - postgres - - redis - - postgres: - image: postgres:16-alpine - volumes: - - postgres-data:/var/lib/postgresql/data - environment: - POSTGRES_DB: postgres - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - restart: unless-stopped - - redis: - image: redis:7-alpine - volumes: - - redis-data:/data - restart: unless-stopped - -volumes: - go-modules: - yarn-cache: - postgres-data: - redis-data: diff --git a/.devcontainer/scripts/post-create.sh b/.devcontainer/scripts/post-create.sh deleted file mode 100755 index efa740e2b..000000000 --- a/.devcontainer/scripts/post-create.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash -# post-create.sh - One-time setup after container creation -set -e - -echo "==========================================" -echo "Sourcebot Dev Container: Post-Create Setup" -echo "==========================================" - -cd /workspaces/sourcebot - -# 1. Initialize git submodules (in case initializeCommand didn't run) -echo "" -echo "[1/5] Initializing git submodules..." -git submodule update --init --recursive - -# 2. Build Zoekt and install dependencies (uses Makefile) -echo "" -echo "[2/5] Building Zoekt and installing dependencies..." -make - -echo "" -echo "[3/5] Running database migrations..." -yarn dev:prisma:migrate:dev - -echo "" -echo "[4/5] Creating default config.json..." -cat > config.json << 'EOF' -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "connections": { - "github": { - "type": "github", - "repos": ["sourcebot-dev/sourcebot"] - } - } -} -EOF - -echo "" -echo "[5/5] Configuring Claude Code to skip onboarding..." -# Create or update ~/.claude.json to skip onboarding -if [ -f ~/.claude.json ]; then - # Update existing file - node -e "const fs=require('fs');const cfg=JSON.parse(fs.readFileSync('$HOME/.claude.json','utf8'));cfg.hasCompletedOnboarding=true;fs.writeFileSync('$HOME/.claude.json',JSON.stringify(cfg,null,2));" -else - # Create minimal config with onboarding skipped - cat > ~/.claude.json << 'EOF' -{ - "hasCompletedOnboarding": true -} -EOF -fi - -echo "" -echo "==========================================" -echo "Post-create setup complete!" -echo "" -echo "To start the development server, run:" -echo " yarn dev" -echo "" -echo "Services will be available at:" -echo " - Web App: http://localhost:3000" -echo " - Zoekt: http://localhost:6070" -echo "==========================================" diff --git a/.devcontainer/scripts/post-start.sh b/.devcontainer/scripts/post-start.sh deleted file mode 100755 index 356b81b8a..000000000 --- a/.devcontainer/scripts/post-start.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash -# post-start.sh - Runs each time the container starts -set -e - -echo "==========================================" -echo "Sourcebot Dev Container: Post-Start Check" -echo "==========================================" - -cd /workspaces/sourcebot - -# 1. Wait for PostgreSQL to be ready -echo "" -echo "[1/2] Checking PostgreSQL connection..." -timeout=30 -counter=0 -until pg_isready -h postgres -p 5432 -U postgres > /dev/null 2>&1; do - counter=$((counter + 1)) - if [ $counter -ge $timeout ]; then - echo "ERROR: PostgreSQL did not become ready within ${timeout} seconds" - exit 1 - fi - echo " Waiting for PostgreSQL... ($counter/$timeout)" - sleep 1 -done -echo "PostgreSQL is ready!" - -# 2. Wait for Redis to be ready -echo "" -echo "[2/2] Checking Redis connection..." -counter=0 -until redis-cli -h redis -p 6379 ping > /dev/null 2>&1; do - counter=$((counter + 1)) - if [ $counter -ge $timeout ]; then - echo "ERROR: Redis did not become ready within ${timeout} seconds" - exit 1 - fi - echo " Waiting for Redis... ($counter/$timeout)" - sleep 1 -done -echo "Redis is ready!" - -echo "" -echo "==========================================" -echo "Dev container is ready!" -echo "" -echo "To start development, run:" -echo " yarn dev" -echo "==========================================" diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index cf96f8cb9..000000000 --- a/.dockerignore +++ /dev/null @@ -1,15 +0,0 @@ -Dockerfile -.dockerignore -npm-debug.log -README.md -.git -.sourcebot -packages/web/.next -!packages/web/.next/static -!packages/web/.next/standalone -**/node_modules -**/.env.local -**/.sentryclirc -**/.env.sentry-build-plugin -.yarn -!.yarn/releases \ No newline at end of file diff --git a/.env.development b/.env.development deleted file mode 100644 index 22b6863e7..000000000 --- a/.env.development +++ /dev/null @@ -1,76 +0,0 @@ - -# Prisma -DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres" - -# Zoekt -ZOEKT_WEBSERVER_URL="http://localhost:6070" -# The command to use for generating ctags. -CTAGS_COMMAND=ctags - -# Auth.JS -# You can generate a new secret with: -# openssl rand -base64 33 -# @see: https://authjs.dev/getting-started/deployment#auth_secret -AUTH_SECRET="00000000000000000000000000000000000000000000" -AUTH_URL="http://localhost:3000" - -DATA_CACHE_DIR=${PWD}/.sourcebot # Path to the sourcebot cache dir (ex. ~/sourcebot/.sourcebot) -SOURCEBOT_PUBLIC_KEY_PATH=${PWD}/public.pem -CONFIG_PATH=${PWD}/config.json # Path to the sourcebot config file (if one exists) - -# Email -# EMAIL_FROM_ADDRESS="" # The from address for transactional emails. -# SMTP_CONNECTION_URL="" # The SMTP connection URL for transactional emails. - -# PostHog -# POSTHOG_PAPIK="" - -# Sentry -# SENTRY_BACKEND_DSN="" -# NEXT_PUBLIC_SENTRY_WEBAPP_DSN="" -# SENTRY_ENVIRONMENT="dev" -# NEXT_PUBLIC_SENTRY_ENVIRONMENT="dev" -# SENTRY_TRACING_ENABLED="false" # Set to "true" to enable server and edge tracing. -# SENTRY_PROFILING_ENABLED="false" # Set to "true" to enable server-side profiling. Requires tracing. -# SENTRY_AUTH_TOKEN= - -# Logtail -# LOGTAIL_TOKEN="" -# LOGTAIL_HOST="" - -# Redis -REDIS_URL="redis://localhost:6379" - -# Agents - -# GITHUB_APP_ID= -# GITHUB_APP_PRIVATE_KEY_PATH= -# GITHUB_APP_WEBHOOK_SECRET= -# OPENAI_API_KEY= -REVIEW_AGENT_LOGGING_ENABLED=true -REVIEW_AGENT_AUTO_REVIEW_ENABLED=false -REVIEW_AGENT_REVIEW_COMMAND=review - -# Misc - -# Generated using: -# openssl rand -base64 24 -SOURCEBOT_ENCRYPTION_KEY="00000000000000000000000000000000" - -SOURCEBOT_LOG_LEVEL="debug" # valid values: info, debug, warn, error -SOURCEBOT_TELEMETRY_DISABLED=true # Disables telemetry collection - -# Code-host fallback tokens -# FALLBACK_GITHUB_CLOUD_TOKEN="" -# FALLBACK_GITLAB_CLOUD_TOKEN="" -# FALLBACK_GITEA_CLOUD_TOKEN="" - -# Controls the number of concurrent indexing jobs that can run at once -# INDEX_CONCURRENCY_MULTIPLE= - -# CONFIG_MAX_REPOS_NO_TOKEN= -NODE_ENV=development - -DEBUG_WRITE_CHAT_MESSAGES_TO_FILE=true - -SOURCEBOT_LIGHTHOUSE_URL=http://localhost:3003 diff --git a/.github/DISCUSSION_TEMPLATE/ideas.yml b/.github/DISCUSSION_TEMPLATE/ideas.yml deleted file mode 100644 index 1911c4912..000000000 --- a/.github/DISCUSSION_TEMPLATE/ideas.yml +++ /dev/null @@ -1,11 +0,0 @@ -body: - - type: textarea - attributes: - label: Describe the feature or potential improvement - description: Please describe the change as clear and concise as possible. Remember to add context as to why you believe this is needed. - validations: - required: true - - type: textarea - attributes: - label: Additional information - description: Add any other information related to the change here. If your idea is related to any issues or discussions, link them here. \ No newline at end of file diff --git a/.github/actions/check-prisma-migrations/action.yml b/.github/actions/check-prisma-migrations/action.yml deleted file mode 100644 index 0a0182f93..000000000 --- a/.github/actions/check-prisma-migrations/action.yml +++ /dev/null @@ -1,114 +0,0 @@ -name: Check Prisma Migrations -description: >- - Verify Prisma migrations apply cleanly in order and reproduce schema.prisma - (drift check), and that no new migration predates the latest on the base - branch (ordering check). Designed to be embedded in an existing job so its - failure turns that job's status red. - -inputs: - base-ref: - description: >- - Base git ref to diff migrations against (e.g. a PR's base branch). When - set, the action skips work on PRs that don't touch migrations and runs the - ordering check. When empty (release builds), the drift check always runs - and the ordering check is skipped. - required: false - default: "" - -runs: - using: composite - steps: - - name: Detect Prisma changes - id: detect - shell: bash - run: | - if [ -z "${{ inputs.base-ref }}" ]; then - echo "changed=true" >> "$GITHUB_OUTPUT" - echo "No base-ref provided — running drift check unconditionally." - exit 0 - fi - git fetch --no-tags --depth=1 origin "+refs/heads/${{ inputs.base-ref }}:refs/remotes/origin/${{ inputs.base-ref }}" - if git diff --name-only "origin/${{ inputs.base-ref }}" HEAD | grep -q '^packages/db/prisma/'; then - echo "changed=true" >> "$GITHUB_OUTPUT" - echo "Prisma changes detected — running migration checks." - else - echo "changed=false" >> "$GITHUB_OUTPUT" - echo "No Prisma changes — skipping migration checks." - fi - - - name: Start Postgres - if: steps.detect.outputs.changed == 'true' - shell: bash - run: | - docker run -d --name prisma-check-pg \ - -e POSTGRES_USER=postgres \ - -e POSTGRES_PASSWORD=postgres \ - -e POSTGRES_DB=sourcebot \ - -p 5432:5432 postgres:16 - for i in $(seq 1 30); do - if docker exec prisma-check-pg pg_isready -U postgres -q; then - echo "Postgres ready." - exit 0 - fi - sleep 2 - done - echo "Postgres failed to become ready." && exit 1 - - - name: Use Node.js - if: steps.detect.outputs.changed == 'true' - uses: actions/setup-node@v4 - with: - node-version: "20.x" - - - name: Install - if: steps.detect.outputs.changed == 'true' - shell: bash - run: yarn install --frozen-lockfile - - # Check 1: migrations apply cleanly in order AND reproduce schema.prisma. - # `migrate deploy` fails if a migration is broken or applies out of sequence; - # `migrate diff` exits 2 when the applied history drifts from the schema. - - name: Apply migrations - if: steps.detect.outputs.changed == 'true' - shell: bash - working-directory: packages/db - env: - DATABASE_URL: postgresql://postgres:postgres@localhost:5432/sourcebot - run: yarn prisma migrate deploy - - - name: Check for schema drift - if: steps.detect.outputs.changed == 'true' - shell: bash - working-directory: packages/db - env: - DATABASE_URL: postgresql://postgres:postgres@localhost:5432/sourcebot - run: | - yarn prisma migrate diff \ - --from-url "$DATABASE_URL" \ - --to-schema-datamodel prisma/schema.prisma \ - --exit-code \ - && echo "✅ No drift: migrations reproduce schema.prisma" \ - || (echo "❌ schema.prisma has changes not captured in a migration. Run: yarn dev:prisma:migrate:dev --name " && exit 1) - - # Check 2 (PRs only): no new migration predates the latest on the base branch. - - name: Check migration ordering - if: steps.detect.outputs.changed == 'true' && inputs.base-ref != '' - shell: bash - run: | - MIG_DIR=packages/db/prisma/migrations - BASE="origin/${{ inputs.base-ref }}" - LATEST_ON_BASE=$(git ls-tree -r --name-only "$BASE" -- "$MIG_DIR" \ - | sed -n "s#$MIG_DIR/\([0-9]\{14\}\)_.*#\1#p" | sort | tail -1) - echo "Latest migration on ${{ inputs.base-ref }}: ${LATEST_ON_BASE:-}" - NEW=$(comm -23 \ - <(ls "$MIG_DIR" | sed -n 's/^\([0-9]\{14\}\)_.*/\1/p' | sort -u) \ - <(git ls-tree -r --name-only "$BASE" -- "$MIG_DIR" | sed -n "s#$MIG_DIR/\([0-9]\{14\}\)_.*#\1#p" | sort -u)) - FAIL=0 - for ts in $NEW; do - if [ -n "$LATEST_ON_BASE" ] && [ "$ts" -lt "$LATEST_ON_BASE" ]; then - echo "❌ New migration $ts predates latest migration on ${{ inputs.base-ref }} ($LATEST_ON_BASE). Rename it with a current timestamp." - FAIL=1 - fi - done - [ "$FAIL" -eq 0 ] && echo "✅ Migration ordering OK" - exit $FAIL diff --git a/.github/scripts/addZoektSyncChangelogEntry.sh b/.github/scripts/addZoektSyncChangelogEntry.sh deleted file mode 100755 index aa4909f6e..000000000 --- a/.github/scripts/addZoektSyncChangelogEntry.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -pr_number="${1:-}" -changelog="${CHANGELOG_PATH:-CHANGELOG.md}" - -if [[ ! "$pr_number" =~ ^[1-9][0-9]*$ ]]; then - echo "Expected a pull request number, got: $pr_number" >&2 - exit 1 -fi - -pr_url="https://github.com/sourcebot-dev/sourcebot/pull/$pr_number" -entry="- Updated the bundled Zoekt version. [#$pr_number]($pr_url)" - -if grep -Fq "$pr_url" "$changelog"; then - echo "Changelog already links to Sourcebot PR #$pr_number." - exit 0 -fi - -changelog_directory=$(dirname "$changelog") -changelog_basename=$(basename "$changelog") -temporary_file=$(mktemp "$changelog_directory/.${changelog_basename}.XXXXXX") -trap 'rm -f "$temporary_file"' EXIT - -if changelog_mode=$(stat -f '%Lp' "$changelog" 2> /dev/null); then - : -else - changelog_mode=$(stat -c '%a' "$changelog") -fi - -awk -v entry="$entry" ' - function flush_changed_section( last, i) { - last = changed_line_count - while (last > 0 && changed_lines[last] == "") { - last-- - } - for (i = 1; i <= last; i++) { - print changed_lines[i] - } - print entry - print "" - changed_line_count = 0 - } - - $0 == "## [Unreleased]" { - in_unreleased = 1 - last_was_blank = 0 - print - next - } - - in_unreleased && $0 == "### Changed" { - found_changed = 1 - in_changed = 1 - print - next - } - - in_changed && /^##(#)? / { - flush_changed_section() - in_changed = 0 - inserted = 1 - if ($0 ~ /^## /) { - in_unreleased = 0 - } - print - next - } - - in_changed { - changed_lines[++changed_line_count] = $0 - next - } - - in_unreleased && !found_changed && /^### (Deprecated|Removed|Fixed|Security)$/ { - print "### Changed" - print entry - print "" - found_changed = 1 - inserted = 1 - print - next - } - - in_unreleased && /^## / { - if (!found_changed) { - print "### Changed" - print entry - print "" - found_changed = 1 - inserted = 1 - } - in_unreleased = 0 - print - next - } - - { - last_was_blank = ($0 == "") - print - } - - END { - if (in_changed) { - flush_changed_section() - inserted = 1 - } else if (in_unreleased && !found_changed) { - if (!last_was_blank) { - print "" - } - print "### Changed" - print entry - found_changed = 1 - inserted = 1 - } - if (!found_changed || !inserted) { - exit 2 - } - } -' "$changelog" > "$temporary_file" || { - echo "Unable to add an Unreleased Changed entry to $changelog." >&2 - exit 1 -} - -chmod "$changelog_mode" "$temporary_file" -mv "$temporary_file" "$changelog" -trap - EXIT -echo "Added the changelog entry for Sourcebot PR #$pr_number." diff --git a/.github/scripts/test-cve-remediation.sh b/.github/scripts/test-cve-remediation.sh index 186504a74..2fe7f2c44 100755 --- a/.github/scripts/test-cve-remediation.sh +++ b/.github/scripts/test-cve-remediation.sh @@ -6,7 +6,6 @@ FILTER="$SCRIPT_DIR/filter-unlinked-cve-issues.jq" DISCOVERY_SCRIPT="$SCRIPT_DIR/find-unlinked-cve-issues.sh" RENDER_SCRIPT="$SCRIPT_DIR/render-cve-remediation-summary.sh" WORKFLOW_FILE="$SCRIPT_DIR/../workflows/_cve-remediation.yml" -CALLER_WORKFLOW_FILE="$SCRIPT_DIR/../workflows/cve-remediation.yml" SYSTEM_PROMPT_FILE="$SCRIPT_DIR/../prompts/cve-remediation-system.md" REVIEWER_MAP_FILE="$SCRIPT_DIR/../cve-reviewers.json" @@ -488,14 +487,6 @@ assert_workflow_not_contains \ assert_workflow_not_contains \ "does not use unavailable job workflow SHA context" \ 'job.workflow_sha' -assert_workflow_contains \ - "passes a numeric manual or scheduled issue limit through an allowed context" \ - "fromJSON(github.event.inputs.max_issues || '50')" \ - "$CALLER_WORKFLOW_FILE" -assert_workflow_not_contains \ - "does not use the unavailable inputs context in a reusable workflow call" \ - '${{ inputs.max_issues' \ - "$CALLER_WORKFLOW_FILE" assert_workflow_contains \ "hands issue metadata to the remediation job through an artifact" \ 'name: cve-remediation-issues' diff --git a/.github/scripts/test-entrypoint-install-id.sh b/.github/scripts/test-entrypoint-install-id.sh deleted file mode 100755 index a0f62f5d0..000000000 --- a/.github/scripts/test-entrypoint-install-id.sh +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" -TEST_ROOT=$(mktemp -d) -trap 'rm -rf "$TEST_ROOT"' EXIT - -FAKE_BIN="$TEST_ROOT/bin" -UUIDGEN_LOG="$TEST_ROOT/uuidgen.log" -CURL_PAYLOAD_FILE="$TEST_ROOT/curl-payload.json" -CURL_REDIRECT_POLICY_LOG="$TEST_ROOT/curl-redirect-policy.log" -mkdir -p "$FAKE_BIN" -: > "$UUIDGEN_LOG" -: > "$CURL_REDIRECT_POLICY_LOG" - -cat > "$FAKE_BIN/uuidgen" <<'EOF' -#!/usr/bin/env bash -if [[ "${UUIDGEN_SHOULD_FAIL:-false}" == "true" ]]; then - exit 1 -fi -printf 'called\n' >> "$UUIDGEN_LOG" -printf 'generated-install-id\n' -EOF - -cat > "$FAKE_BIN/curl" <<'EOF' -#!/usr/bin/env bash -follow_redirects=false -proto_redir="" -payload="" -method="GET" - -while (($# > 0)); do - case "$1" in - -L|--location) - follow_redirects=true - ;; - --proto-redir) - shift - proto_redir="$1" - ;; - -d|--data) - shift - payload="$1" - method="POST" - ;; - -X|--request) - shift - method="$1" - ;; - esac - shift -done - -if [[ -z "$payload" ]]; then - exit 1 -fi -printf '%s\n' "$payload" > "$CURL_PAYLOAD_FILE" - -if [[ "${CURL_REDIRECT_STATUS:-}" =~ ^30(7|8)$ && "${CURL_REDIRECT_URL:-}" == http://* ]]; then - printf '%s|%s|%s|%s\n' "$CURL_REDIRECT_STATUS" "$follow_redirects" "$proto_redir" "$method" >> "$CURL_REDIRECT_POLICY_LOG" - if [[ "$follow_redirects" == "true" && "$proto_redir" != "=https" ]]; then - printf 'followed insecure redirect\n' >> "$CURL_REDIRECT_POLICY_LOG" - fi - exit 1 -fi -EOF - -cat > "$FAKE_BIN/yarn" <<'EOF' -#!/usr/bin/env bash -exit 0 -EOF - -cat > "$FAKE_BIN/mkdir" <<'EOF' -#!/usr/bin/env bash -exit 0 -EOF - -cat > "$FAKE_BIN/supervisord" <<'EOF' -#!/usr/bin/env bash -printf '%s\n' "$SOURCEBOT_INSTALL_ID" > "$RESULT_FILE" -EOF - -chmod +x "$FAKE_BIN/uuidgen" "$FAKE_BIN/curl" "$FAKE_BIN/yarn" "$FAKE_BIN/mkdir" "$FAKE_BIN/supervisord" - -run_entrypoint() { - local data_dir="$1" - local result_file="$2" - shift 2 - - env \ - PATH="$FAKE_BIN:$PATH" \ - UUIDGEN_LOG="$UUIDGEN_LOG" \ - UUIDGEN_SHOULD_FAIL="false" \ - CURL_PAYLOAD_FILE="$CURL_PAYLOAD_FILE" \ - CURL_REDIRECT_POLICY_LOG="$CURL_REDIRECT_POLICY_LOG" \ - CURL_REDIRECT_STATUS="" \ - CURL_REDIRECT_URL="" \ - RESULT_FILE="$result_file" \ - DATA_CACHE_DIR="$data_dir" \ - DATABASE_URL="postgresql://test" \ - REDIS_URL="redis://test" \ - SOURCEBOT_ENCRYPTION_KEY="test-encryption-key" \ - AUTH_SECRET="test-auth-secret" \ - AUTH_URL="http://localhost:3000" \ - SOURCEBOT_TELEMETRY_DISABLED="true" \ - "$@" \ - /bin/sh "$REPO_ROOT/entrypoint.sh" >/dev/null -} - -assert_equals() { - local description="$1" - local actual="$2" - local expected="$3" - - if [[ "$actual" != "$expected" ]]; then - echo "FAIL: $description" - echo "Expected: $expected" - echo "Actual: $actual" - exit 1 - fi -} - -supplied_data="$TEST_ROOT/supplied-data" -supplied_result="$TEST_ROOT/supplied-result" -supplied_id=$'supplied"install\\id\nsecond-line' -mkdir -p "$supplied_data" -run_entrypoint "$supplied_data" "$supplied_result" SOURCEBOT_INSTALL_ID="$supplied_id" SOURCEBOT_TELEMETRY_DISABLED="false" POSTHOG_PAPIK="test-project-key" CURL_REDIRECT_STATUS="307" CURL_REDIRECT_URL="http://insecure.example/capture/" -assert_equals "uses the supplied install ID on first boot" "$(<"$supplied_result")" "$supplied_id" -assert_equals "persists the supplied install ID as valid JSON" "$(jq -r '.install_id' "$supplied_data/.installedv3")" "$supplied_id" -assert_equals "does not generate an ID when one is supplied" "$(wc -l < "$UUIDGEN_LOG" | tr -d ' ')" "0" -if ! jq -e --arg expected "$supplied_id" \ - '.event == "install" and .distinct_id == $expected and .api_key == "test-project-key"' \ - "$CURL_PAYLOAD_FILE" >/dev/null; then - echo "FAIL: install telemetry payload did not safely encode the supplied install ID" - exit 1 -fi -assert_equals "blocks an HTTP 307 redirect without changing the POST method" "$(sed -n '1p' "$CURL_REDIRECT_POLICY_LOG")" "307|true|=https|POST" - -# Exercise the next-boot read and upgrade telemetry paths with the same escaped ID. -jq -n --arg install_id "$supplied_id" \ - '{version: "previous-version", install_id: $install_id}' > "$supplied_data/.installedv3" -supplied_restart_result="$TEST_ROOT/supplied-restart-result" -run_entrypoint "$supplied_data" "$supplied_restart_result" SOURCEBOT_INSTALL_ID="conflicting-install-id" SOURCEBOT_TELEMETRY_DISABLED="false" POSTHOG_PAPIK="test-project-key" CURL_REDIRECT_STATUS="308" CURL_REDIRECT_URL="http://insecure.example/capture/" -assert_equals "reads the escaped install ID on the next boot" "$(<"$supplied_restart_result")" "$supplied_id" -if ! jq -e --arg expected "$supplied_id" \ - '.event == "upgrade" and .distinct_id == $expected and .api_key == "test-project-key"' \ - "$CURL_PAYLOAD_FILE" >/dev/null; then - echo "FAIL: upgrade telemetry payload did not safely encode the persisted install ID" - exit 1 -fi -assert_equals "blocks an HTTP 308 redirect without changing the POST method" "$(sed -n '2p' "$CURL_REDIRECT_POLICY_LOG")" "308|true|=https|POST" -assert_equals "never follows an insecure telemetry redirect" "$(wc -l < "$CURL_REDIRECT_POLICY_LOG" | tr -d ' ')" "2" - -generated_data="$TEST_ROOT/generated-data" -generated_result="$TEST_ROOT/generated-result" -mkdir -p "$generated_data" -run_entrypoint "$generated_data" "$generated_result" SOURCEBOT_INSTALL_ID="" -assert_equals "generates an install ID when none is supplied" "$(<"$generated_result")" "generated-install-id" -assert_equals "persists the generated install ID" "$(jq -r '.install_id' "$generated_data/.installedv3")" "generated-install-id" -assert_equals "generates exactly one install ID" "$(wc -l < "$UUIDGEN_LOG" | tr -d ' ')" "1" - -existing_data="$TEST_ROOT/existing-data" -existing_result="$TEST_ROOT/existing-result" -mkdir -p "$existing_data" -printf '{"version":"existing-version","install_id":"persisted-install-id"}\n' > "$existing_data/.installedv3" -run_entrypoint "$existing_data" "$existing_result" SOURCEBOT_INSTALL_ID="conflicting-install-id" -assert_equals "keeps the persisted install ID after first boot" "$(<"$existing_result")" "persisted-install-id" -assert_equals "does not generate another ID after first boot" "$(wc -l < "$UUIDGEN_LOG" | tr -d ' ')" "1" - -failed_data="$TEST_ROOT/failed-data" -failed_result="$TEST_ROOT/failed-result" -mkdir -p "$failed_data" -if run_entrypoint "$failed_data" "$failed_result" SOURCEBOT_INSTALL_ID="" UUIDGEN_SHOULD_FAIL="true"; then - echo "FAIL: entrypoint succeeded when install ID generation failed" - exit 1 -fi -if [[ -e "$failed_data/.installedv3" ]]; then - echo "FAIL: entrypoint left an invalid first-run file after install ID generation failed" - exit 1 -fi - -echo "Entrypoint install ID tests passed." diff --git a/.github/scripts/testZoektSync.sh b/.github/scripts/testZoektSync.sh deleted file mode 100755 index 043bfe303..000000000 --- a/.github/scripts/testZoektSync.sh +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) -repository_root=$(cd "$script_dir/../.." && pwd) -update_script="$script_dir/updateZoektSubmodule.sh" -changelog_script="$script_dir/addZoektSyncChangelogEntry.sh" -workflow="$repository_root/.github/workflows/syncZoekt.yml" - -fail() { - echo "FAIL: $*" >&2 - exit 1 -} - -assert_contains() { - local file=$1 - local expected=$2 - local description=$3 - - if ! grep -Fq -- "$expected" "$file"; then - fail "$description" - fi -} - -assert_equals() { - local actual=$1 - local expected=$2 - local description=$3 - - if [[ "$actual" != "$expected" ]]; then - fail "$description (expected $expected, got $actual)" - fi -} - -test_root=$(mktemp -d) -trap 'rm -rf "$test_root"' EXIT - -zoekt_remote="$test_root/zoekt.git" -zoekt_upstream="$test_root/zoekt-upstream" -sourcebot_test="$test_root/sourcebot" - -git init --quiet --bare --initial-branch=main "$zoekt_remote" -git init --quiet --initial-branch=main "$zoekt_upstream" -git -C "$zoekt_upstream" config user.name "Zoekt Sync Test" -git -C "$zoekt_upstream" config user.email "zoekt-sync-test@example.com" -git -C "$zoekt_upstream" remote add origin "$zoekt_remote" - -printf '%s\n' first > "$zoekt_upstream/version.txt" -git -C "$zoekt_upstream" add version.txt -git -C "$zoekt_upstream" commit --quiet -m "first" -first_sha=$(git -C "$zoekt_upstream" rev-parse HEAD) -git -C "$zoekt_upstream" push --quiet --set-upstream origin main - -printf '%s\n' second > "$zoekt_upstream/version.txt" -git -C "$zoekt_upstream" commit --quiet -am "second" -second_sha=$(git -C "$zoekt_upstream" rev-parse HEAD) -git -C "$zoekt_upstream" push --quiet origin main - -git init --quiet --initial-branch=main "$sourcebot_test" -git -C "$sourcebot_test" config user.name "Zoekt Sync Test" -git -C "$sourcebot_test" config user.email "zoekt-sync-test@example.com" -git -C "$sourcebot_test" -c protocol.file.allow=always \ - submodule add --quiet "$zoekt_remote" vendor/zoekt -git -C "$sourcebot_test/vendor/zoekt" checkout --quiet --detach "$first_sha" -git -C "$sourcebot_test" add vendor/zoekt -git -C "$sourcebot_test" commit --quiet -m "pin first Zoekt commit" - -( - cd "$sourcebot_test" - "$update_script" "$second_sha" -) -staged_sha=$(git -C "$sourcebot_test" rev-parse :vendor/zoekt) -assert_equals "$staged_sha" "$second_sha" \ - "the updater should stage the requested main-branch commit" -git -C "$sourcebot_test" commit --quiet -m "advance Zoekt" - -( - cd "$sourcebot_test" - "$update_script" "$first_sha" -) -current_sha=$(git -C "$sourcebot_test" rev-parse HEAD:vendor/zoekt) -assert_equals "$current_sha" "$second_sha" \ - "a stale event must not downgrade the Zoekt gitlink" -git -C "$sourcebot_test" diff --quiet || \ - fail "a stale event should leave the worktree unchanged" -git -C "$sourcebot_test" diff --cached --quiet || \ - fail "a stale event should leave the index unchanged" - -git -C "$zoekt_upstream" switch --quiet --detach "$first_sha" -git -C "$zoekt_upstream" switch --quiet -c divergent -printf '%s\n' divergent > "$zoekt_upstream/version.txt" -git -C "$zoekt_upstream" commit --quiet -am "divergent" -divergent_sha=$(git -C "$zoekt_upstream" rev-parse HEAD) -git -C "$zoekt_upstream" push --quiet origin divergent -git -C "$sourcebot_test/vendor/zoekt" fetch --quiet origin divergent - -if ( - cd "$sourcebot_test" - "$update_script" "$divergent_sha" -) 2> "$test_root/divergent-error.txt"; then - fail "the updater should reject a commit outside origin/main" -fi -assert_contains "$test_root/divergent-error.txt" \ - "is not reachable from origin/main" \ - "the non-main error should explain the rejected target" - -git -C "$sourcebot_test/vendor/zoekt" checkout --quiet --detach "$divergent_sha" -git -C "$sourcebot_test" add vendor/zoekt -git -C "$sourcebot_test" commit --quiet -m "pin divergent Zoekt commit" - -if ( - cd "$sourcebot_test" - "$update_script" "$second_sha" -) 2> "$test_root/divergent-history-error.txt"; then - fail "the updater should reject divergent current and target commits" -fi -assert_contains "$test_root/divergent-history-error.txt" \ - "Refusing to move Zoekt between divergent histories" \ - "the divergent-history error should explain the rejected update" - -if ( - cd "$sourcebot_test" - "$update_script" deadbeef -) 2> "$test_root/invalid-error.txt"; then - fail "the updater should reject abbreviated commit SHAs" -fi -assert_contains "$test_root/invalid-error.txt" \ - "Expected a full lowercase Zoekt commit SHA" \ - "the invalid-SHA error should explain the required format" - -changelog_fixture="$test_root/CHANGELOG.md" -cat > "$changelog_fixture" <<'EOF' -# Changelog - -## [Unreleased] - -### Added -- Added something. - -### Removed -- Removed something. - -### Fixed -- Fixed something. - -## [1.0.0] - -### Changed -- Changed something in a released version. - -## [0.9.0] - -### Changed -- Changed something in an older released version. -EOF - -chmod 640 "$changelog_fixture" -CHANGELOG_PATH="$changelog_fixture" "$changelog_script" 42 -assert_contains "$changelog_fixture" \ - "### Changed" \ - "the changelog helper should create the Changed section when absent" -assert_contains "$changelog_fixture" \ - "- Updated the bundled Zoekt version. [#42](https://github.com/sourcebot-dev/sourcebot/pull/42)" \ - "the changelog helper should add the generated PR link" -entry_count=$(grep -Fc "sourcebot/pull/42" "$changelog_fixture") -assert_equals "$entry_count" 1 \ - "the changelog helper should add the PR entry only to Unreleased" -CHANGELOG_PATH="$changelog_fixture" "$changelog_script" 42 -entry_count=$(grep -Fc "sourcebot/pull/42" "$changelog_fixture") -assert_equals "$entry_count" 1 \ - "the changelog helper should not duplicate an existing PR entry" -if changelog_mode=$(stat -f '%Lp' "$changelog_fixture" 2> /dev/null); then - : -else - changelog_mode=$(stat -c '%a' "$changelog_fixture") -fi -assert_equals "$changelog_mode" 640 \ - "the changelog helper should preserve the target file mode" - -empty_changelog_fixture="$test_root/EMPTY_CHANGELOG.md" -cat > "$empty_changelog_fixture" <<'EOF' -# Changelog - -## [Unreleased] -EOF -CHANGELOG_PATH="$empty_changelog_fixture" "$changelog_script" 43 -assert_contains "$empty_changelog_fixture" \ - "- Updated the bundled Zoekt version. [#43](https://github.com/sourcebot-dev/sourcebot/pull/43)" \ - "the changelog helper should handle an empty Unreleased section at EOF" - -ruby -e 'require "yaml"; YAML.parse_file(ARGV.fetch(0))' "$workflow" -assert_contains "$workflow" \ - "types: [zoekt-pr-merged]" \ - "the receiver should handle only Zoekt merge dispatches" -assert_contains "$workflow" \ - 'uses: actions/create-github-app-token@v2' \ - "the receiver should use a GitHub App token" -assert_contains "$workflow" \ - 'permission-pull-requests: write' \ - "the receiver should restrict its app token to required permissions" -assert_contains "$workflow" \ - '--force-with-lease=' \ - "the receiver should protect updates to its stable automation branch" -assert_contains "$workflow" \ - '.github/scripts/updateZoektSubmodule.sh "$ZOEKT_SHA"' \ - "the receiver should validate and stage the requested Zoekt commit" - -echo "All Zoekt sync tests passed." diff --git a/.github/scripts/updateZoektSubmodule.sh b/.github/scripts/updateZoektSubmodule.sh deleted file mode 100755 index d29218072..000000000 --- a/.github/scripts/updateZoektSubmodule.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -target_sha="${1:-}" -submodule_path="${ZOEKT_SUBMODULE_PATH:-vendor/zoekt}" -remote="${ZOEKT_REMOTE:-origin}" -branch="${ZOEKT_BRANCH:-main}" - -if [[ ! "$target_sha" =~ ^[0-9a-f]{40}$ ]]; then - echo "Expected a full lowercase Zoekt commit SHA, got: $target_sha" >&2 - exit 1 -fi - -repository_root=$(git rev-parse --show-toplevel) -cd "$repository_root" - -if ! current_sha=$(git rev-parse "HEAD:$submodule_path"); then - echo "Unable to read the $submodule_path gitlink from HEAD." >&2 - exit 1 -fi - -git -C "$submodule_path" fetch --quiet "$remote" "$branch" -remote_head=$(git -C "$submodule_path" rev-parse FETCH_HEAD) - -if ! git -C "$submodule_path" cat-file -e "$target_sha^{commit}"; then - echo "Zoekt commit $target_sha does not exist." >&2 - exit 1 -fi - -if ! git -C "$submodule_path" merge-base --is-ancestor "$target_sha" "$remote_head"; then - echo "Zoekt commit $target_sha is not reachable from $remote/$branch." >&2 - exit 1 -fi - -if git -C "$submodule_path" merge-base --is-ancestor "$target_sha" "$current_sha"; then - echo "Zoekt is already at or ahead of $target_sha." - exit 0 -fi - -if ! git -C "$submodule_path" merge-base --is-ancestor "$current_sha" "$target_sha"; then - echo "Refusing to move Zoekt between divergent histories: $current_sha -> $target_sha." >&2 - exit 1 -fi - -git -C "$submodule_path" checkout --quiet --detach "$target_sha" -git add -- "$submodule_path" -echo "Staged Zoekt update: $current_sha -> $target_sha" diff --git a/.github/workflows/_build-cloud.yml b/.github/workflows/_build-cloud.yml deleted file mode 100644 index 98857a9e0..000000000 --- a/.github/workflows/_build-cloud.yml +++ /dev/null @@ -1,193 +0,0 @@ -# Internal reusable workflow for building a non-OSS ("cloud") Docker image and -# pushing it to Amazon ECR. -name: Build Cloud Image - -on: - workflow_call: - inputs: - environment: - description: "GitHub Environment supplying the Sentry vars/secrets. Also scopes the OIDC subject used to assume the ECR push role." - required: true - type: string - git_ref: - description: "Git ref to checkout and build" - required: true - type: string - docker_tags: - description: "Docker tags configuration for docker/metadata-action" - required: true - type: string - aws_region: - description: "Region the ECR repository lives in" - required: false - type: string - default: us-west-1 - require_sentry: - description: "Require complete Sentry build configuration and source-map upload credentials" - required: false - type: boolean - default: true - -jobs: - build: - runs-on: ubuntu-latest - environment: ${{ inputs.environment }} - permissions: - contents: read - # Required to request the OIDC token that assumes the AWS role. - id-token: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - ref: ${{ inputs.git_ref }} - submodules: "true" - fetch-depth: 0 - # Nothing after checkout talks to the remote, so don't leave the token - # behind in the workspace's .git/config. - persist-credentials: false - - - name: Resolve build commit SHA - id: commit - run: echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" - - - name: Validate environment configuration - env: - ENVIRONMENT: ${{ inputs.environment }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - AWS_ECR_ROLE_ARN: ${{ vars.AWS_ECR_ROLE_ARN }} - NEXT_PUBLIC_SENTRY_ENVIRONMENT: ${{ vars.NEXT_PUBLIC_SENTRY_ENVIRONMENT }} - NEXT_PUBLIC_SENTRY_WEBAPP_DSN: ${{ vars.NEXT_PUBLIC_SENTRY_WEBAPP_DSN }} - NEXT_PUBLIC_SENTRY_BACKEND_DSN: ${{ vars.NEXT_PUBLIC_SENTRY_BACKEND_DSN }} - SENTRY_ORG: ${{ vars.SENTRY_ORG }} - SENTRY_WEBAPP_PROJECT: ${{ vars.SENTRY_WEBAPP_PROJECT }} - SENTRY_BACKEND_PROJECT: ${{ vars.SENTRY_BACKEND_PROJECT }} - REQUIRE_SENTRY: ${{ inputs.require_sentry }} - run: | - missing=0 - required_names="AWS_ECR_ROLE_ARN" - if [ "$REQUIRE_SENTRY" = "true" ]; then - required_names="$required_names SENTRY_AUTH_TOKEN NEXT_PUBLIC_SENTRY_ENVIRONMENT NEXT_PUBLIC_SENTRY_WEBAPP_DSN NEXT_PUBLIC_SENTRY_BACKEND_DSN SENTRY_ORG SENTRY_WEBAPP_PROJECT SENTRY_BACKEND_PROJECT" - fi - for name in $required_names; do - if [ -z "${!name}" ]; then - echo "::error::${name} is not set on the '${ENVIRONMENT}' environment (or the repository)." - missing=1 - else - echo "ok: ${name}" - fi - done - if [ "$missing" -ne 0 ]; then - echo "::error::Refusing to build: required environment configuration is missing." - exit 1 - fi - if [ "$REQUIRE_SENTRY" != "true" ]; then - echo "Sentry wiring is intentionally disabled for the isolated internal demo image." - fi - - - name: Verify internal GitHub OIDC identity - if: inputs.environment == 'internal' - env: - EXPECTED_OIDC_SUBJECT: repo:sourcebot-dev/sourcebot:environment:internal - run: | - response=$(curl --fail --silent --show-error \ - -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \ - "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=sts.amazonaws.com") - token=$(jq -r '.value' <<<"$response") - OIDC_TOKEN="$token" node - <<'NODE' - const claims = JSON.parse(Buffer.from(process.env.OIDC_TOKEN.split('.')[1], 'base64url')); - console.log(JSON.stringify({ - sub: claims.sub, - aud: claims.aud, - repository: claims.repository, - repository_id: claims.repository_id, - job_workflow_ref: claims.job_workflow_ref, - }, null, 2)); - if (claims.sub !== process.env.EXPECTED_OIDC_SUBJECT) { - console.error(`Unexpected OIDC subject: ${claims.sub}`); - process.exit(1); - } - NODE - - - name: Check Prisma migrations - uses: ./.github/actions/check-prisma-migrations - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: ${{ vars.AWS_ECR_ROLE_ARN }} - aws-region: ${{ inputs.aws_region }} - - - name: Login to Amazon ECR - id: ecr - uses: aws-actions/amazon-ecr-login@v2 - - # Each environment publishes to its own registry (see CicdStack), so a - # staging build can never overwrite a prod tag. - - name: Extract Docker metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ steps.ecr.outputs.registry }}/sourcebot-${{ inputs.environment }} - tags: ${{ inputs.docker_tags }} - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build and push Docker image - uses: docker/build-push-action@v7 - with: - context: . - platforms: linux/amd64 - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - # SENTRY_RELEASE is the commit SHA rather than SOURCEBOT_VERSION so that - # every cloud build gets a distinct release. packages/backend/src/instrument.ts - # reports NEXT_PUBLIC_BUILD_COMMIT_SHA as its release to match; the webapp - # gets SENTRY_RELEASE injected into its bundle by withSentryConfig. - build-args: | - NEXT_PUBLIC_BUILD_COMMIT_SHA=${{ steps.commit.outputs.sha }} - NEXT_PUBLIC_SENTRY_ENVIRONMENT=${{ vars.NEXT_PUBLIC_SENTRY_ENVIRONMENT }} - NEXT_PUBLIC_SENTRY_WEBAPP_DSN=${{ vars.NEXT_PUBLIC_SENTRY_WEBAPP_DSN }} - NEXT_PUBLIC_SENTRY_BACKEND_DSN=${{ vars.NEXT_PUBLIC_SENTRY_BACKEND_DSN }} - NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY=${{ vars.NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY }} - NEXT_PUBLIC_LANGFUSE_BASE_URL=${{ vars.NEXT_PUBLIC_LANGFUSE_BASE_URL }} - SENTRY_ORG=${{ vars.SENTRY_ORG }} - SENTRY_WEBAPP_PROJECT=${{ vars.SENTRY_WEBAPP_PROJECT }} - SENTRY_BACKEND_PROJECT=${{ vars.SENTRY_BACKEND_PROJECT }} - SENTRY_RELEASE=${{ steps.commit.outputs.sha }} - # Passed as a secret, not a build-arg: build args are recorded in layer - # metadata that `mode=max` exports to the cache. @see: Dockerfile - secrets: ${{ inputs.require_sentry && format('sentry_auth_token={0}', secrets.SENTRY_AUTH_TOKEN) || '' }} - # Cache scope is per-environment, and distinct from the OSS build's - # (which is keyed on platform alone). Sharing a scope would let a build - # that never sees SENTRY_AUTH_TOKEN restore layers from one that did. - cache-from: type=gha,scope=cloud-${{ inputs.environment }}-amd64 - cache-to: type=gha,mode=max,scope=cloud-${{ inputs.environment }}-amd64 - - - name: Summarize - env: - ENVIRONMENT: ${{ inputs.environment }} - COMMIT_SHA: ${{ steps.commit.outputs.sha }} - TAGS: ${{ steps.meta.outputs.tags }} - REQUIRE_SENTRY: ${{ inputs.require_sentry }} - run: | - sentry_summary="disabled" - if [ "$REQUIRE_SENTRY" = "true" ]; then - sentry_summary="$COMMIT_SHA" - fi - { - echo "### Pushed to ECR" - echo - echo "| | |" - echo "|---|---|" - echo "| Environment | \`${ENVIRONMENT}\` |" - echo "| Commit | \`${COMMIT_SHA}\` |" - echo "| Sentry | \`${sentry_summary}\` |" - echo - echo '```' - echo "$TAGS" - echo '```' - } >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/_build.yml b/.github/workflows/_build.yml deleted file mode 100644 index 32656ffc8..000000000 --- a/.github/workflows/_build.yml +++ /dev/null @@ -1,153 +0,0 @@ -# Internal reusable workflow for building multi-platform Docker images. -# -# This workflow builds Docker images for linux/amd64 and linux/arm64 platforms, -# pushes them by digest to GHCR, signs them with cosign/Sigstore for supply chain -# security, and uploads build artifacts for subsequent manifest creation. -# -# @ see: https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners - -name: Build Multi-Platform Images - -on: - workflow_call: - inputs: - git_ref: - description: "Git ref to checkout" - required: true - type: string - docker_tags: - description: "Docker tags configuration (JSON array or raw tags)" - required: true - type: string - use_app_token: - description: "Whether to use GitHub App token for checkout" - required: false - type: boolean - default: false - secrets: - release_app_id: - description: "GitHub App ID (required if use_app_token is true)" - required: false - release_app_private_key: - description: "GitHub App private key (required if use_app_token is true)" - required: false - -env: - REGISTRY_IMAGE: ghcr.io/sourcebot-dev/sourcebot - -jobs: - build: - runs-on: ${{ matrix.runs-on}} - environment: oss - permissions: - contents: read - packages: write - # Required for keyless signing with cosign/Sigstore. - # Allows workflow to obtain OIDC token for ephemeral certificate from Fulcio. - id-token: write - strategy: - matrix: - platform: [linux/amd64, linux/arm64] - include: - - platform: linux/amd64 - runs-on: ubuntu-latest - - platform: linux/arm64 - runs-on: ubuntu-24.04-arm - - steps: - - name: Generate GitHub App token - if: inputs.use_app_token - id: generate_token - uses: actions/create-github-app-token@v1 - with: - app-id: ${{ secrets.release_app_id }} - private-key: ${{ secrets.release_app_private_key }} - - - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - - - name: Checkout repository - uses: actions/checkout@v4 - with: - ref: ${{ inputs.git_ref }} - submodules: "true" - fetch-depth: 0 - token: ${{ inputs.use_app_token && steps.generate_token.outputs.token || github.token }} - - # Release backstop: fail the build if migrations drift from schema.prisma. - # Runs once (amd64 only) since the check is platform-independent. base-ref - # is omitted, so the drift check always runs and the (PR-only) ordering - # check is skipped. - - name: Check Prisma migrations - if: matrix.platform == 'linux/amd64' - uses: ./.github/actions/check-prisma-migrations - - # Extract metadata (tags, labels) for Docker - # https://github.com/docker/metadata-action - - name: Extract Docker metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY_IMAGE }} - tags: ${{ inputs.docker_tags }} - - # Install the cosign tool except on PR - # https://github.com/sigstore/cosign-installer - - name: Install cosign - uses: sigstore/cosign-installer@v3.5.0 - with: - cosign-release: "v2.2.4" - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to GitHub Packages Docker Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build Docker image - id: build - uses: docker/build-push-action@v7 - with: - context: . - build-args: | - NEXT_PUBLIC_BUILD_COMMIT_SHA=${{ github.sha }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha,scope=${{ env.PLATFORM_PAIR }} - cache-to: type=gha,mode=max,scope=${{ env.PLATFORM_PAIR }} - platforms: ${{ matrix.platform }} - outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true,annotation.org.opencontainers.image.description=Blazingly fast code search - - - name: Export digest - run: | - mkdir -p /tmp/digests - digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@v4 - with: - name: digests-${{ env.PLATFORM_PAIR }} - path: /tmp/digests/* - if-no-files-found: error - retention-days: 1 - - # Sign the resulting Docker image digest except on PRs. - # This will only write to the public Rekor transparency log when the Docker - # repository is public to avoid leaking data. If you would like to publish - # transparency data even for private images, pass --force to cosign below. - # https://github.com/sigstore/cosign - - name: Sign the published Docker image - env: - # https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable - TAGS: ${{ steps.meta.outputs.tags }} - DIGEST: ${{ steps.build.outputs.digest }} - # This step uses the identity token to provision an ephemeral certificate - # against the sigstore community Fulcio instance. - run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST} - diff --git a/.github/workflows/_merge.yml b/.github/workflows/_merge.yml deleted file mode 100644 index b6ed0edb4..000000000 --- a/.github/workflows/_merge.yml +++ /dev/null @@ -1,59 +0,0 @@ -# Internal reusable workflow for merging platform-specific image digests into a -# single multi-platform manifest and pushing to GHCR. -# -# This workflow takes the individual platform image digests created by _build.yml, -# combines them into a multi-platform manifest, and pushes the final tagged images. - -name: Merge Multi-Platform Manifest - -on: - workflow_call: - inputs: - docker_tags: - description: "Docker tags configuration (JSON array or raw tags)" - required: true - type: string - -env: - REGISTRY_IMAGE: ghcr.io/sourcebot-dev/sourcebot - -jobs: - merge: - runs-on: ubuntu-latest - permissions: - packages: write - steps: - - name: Download digests - uses: actions/download-artifact@v4 - with: - path: /tmp/digests - pattern: digests-* - merge-multiple: true - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Extract Docker metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY_IMAGE }} - tags: ${{ inputs.docker_tags }} - - - name: Login to GitHub Packages Docker Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Create manifest list and push - working-directory: /tmp/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) - - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} - diff --git a/.github/workflows/changelog-reminder.yml b/.github/workflows/changelog-reminder.yml deleted file mode 100644 index afb68c383..000000000 --- a/.github/workflows/changelog-reminder.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: Changelog Reminder - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - -jobs: - remind: - name: Changelog Reminder - runs-on: ubuntu-latest - if: ${{ !github.event.pull_request.draft }} - permissions: - contents: read - pull-requests: write - steps: - - uses: actions/checkout@v4 - - uses: mskelton/changelog-reminder-action@v3 \ No newline at end of file diff --git a/.github/workflows/claude-bug-fixer.yml b/.github/workflows/claude-bug-fixer.yml deleted file mode 100644 index 1137ccbee..000000000 --- a/.github/workflows/claude-bug-fixer.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Claude Bug Fixer - -on: - issues: - types: [labeled] - -jobs: - claude-fix-bug: - if: github.event.label.name == 'bug' - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - issues: write - id-token: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Run Claude Bug Fixer - id: claude-bug-fixer - uses: anthropics/claude-code-action@v1 - with: - anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - allowed_tools: 'Bash,Read,Write,Edit,Glob,Grep' - prompt: | - A bug has been reported in issue #${{ github.event.issue.number }}. - - Issue title: ${{ github.event.issue.title }} - Issue body: - ${{ github.event.issue.body }} - - Please do the following: - 1. Analyze the issue carefully to understand the bug being reported. - 2. Explore the codebase to find the relevant code that is likely causing the bug. - 3. Implement a fix for the bug. - 4. Create a new branch named `fix/issue-${{ github.event.issue.number }}` from main. - 5. Commit your changes to that branch with a descriptive commit message. - 6. Open a **draft** pull request targeting the main branch with: - - A clear title summarizing the fix - - A description explaining what the bug was and how you fixed it - - `Fixes #${{ github.event.issue.number }}` in the PR body - - Important guidelines: - - Only change code that is directly related to fixing the reported bug. Do not refactor or make unrelated improvements. - - If you cannot determine the root cause or the fix is too risky/complex, leave a comment on the issue explaining what you found and why an automated fix isn't appropriate. - - Make sure the fix is complete and the code compiles/passes linting before opening the PR. diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml deleted file mode 100644 index 79fe05647..000000000 --- a/.github/workflows/claude.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Claude Code - -on: - issue_comment: - types: [created] - pull_request_review_comment: - types: [created] - issues: - types: [opened, assigned] - pull_request_review: - types: [submitted] - -jobs: - claude: - if: | - (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || - (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || - (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: read - issues: read - id-token: write - actions: read # Required for Claude to read CI results on PRs - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - - name: Run Claude Code - id: claude - uses: anthropics/claude-code-action@v1 - with: - anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - - # This is an optional setting that allows Claude to read CI results on PRs - additional_permissions: | - actions: read - - # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it. - # prompt: 'Update the pull request description to include a summary of changes.' - - # Optional: Add claude_args to customize behavior and configuration - # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md - # or https://code.claude.com/docs/en/cli-reference for available options - # claude_args: '--allowed-tools Bash(gh pr:*)' - diff --git a/.github/workflows/cve-remediation.yml b/.github/workflows/cve-remediation.yml deleted file mode 100644 index 1a2c4e120..000000000 --- a/.github/workflows/cve-remediation.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Nightly CVE Remediation - -on: - schedule: - # 1:00am Pacific during daylight saving time. - - cron: '0 8 * * *' - workflow_dispatch: - inputs: - max_issues: - description: Maximum number of CVEs without an open linked PR to process. - required: false - type: number - default: 50 - -concurrency: - group: cve-remediation-${{ github.repository }} - cancel-in-progress: false - -permissions: - contents: write - pull-requests: write - id-token: write - actions: read - -jobs: - remediate: - uses: ./.github/workflows/_cve-remediation.yml - with: - max_issues: ${{ fromJSON(github.event.inputs.max_issues || '50') }} - secrets: inherit diff --git a/.github/workflows/docs-broken-links.yml b/.github/workflows/docs-broken-links.yml deleted file mode 100644 index 9f130839e..000000000 --- a/.github/workflows/docs-broken-links.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Check for broken links in docs - -permissions: {} - -on: - pull_request: - branches: ["main"] - paths: - - "docs/**" - -jobs: - check-links: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Use Node.Js - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - - name: Install Mintlify CLI - run: npm i -g mintlify - - - name: Check for broken links - working-directory: docs - run: mintlify broken-links diff --git a/.github/workflows/generate-openapi.yml b/.github/workflows/generate-openapi.yml deleted file mode 100644 index 5f2463466..000000000 --- a/.github/workflows/generate-openapi.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Generate OpenAPI Spec - -on: - pull_request: - branches: ["main"] - paths: - - "packages/web/**" - - "packages/shared/src/version.ts" - -jobs: - generate-openapi: - runs-on: ubuntu-latest - # Skip forks: the default GITHUB_TOKEN can't push back to a fork's branch. - if: github.event.pull_request.head.repo.full_name == github.repository - permissions: - contents: write - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: "true" - ref: ${{ github.head_ref }} - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: '20.x' - cache: 'yarn' - cache-dependency-path: '**/yarn.lock' - - - name: Install - run: yarn install --frozen-lockfile - - - name: Generate OpenAPI spec - run: yarn workspace @sourcebot/web openapi:generate - - - name: Commit regenerated spec if changed - run: | - SPEC=docs/api-reference/sourcebot-public.openapi.json - if [ -z "$(git status --porcelain "$SPEC")" ]; then - echo "OpenAPI spec is up to date." - exit 0 - fi - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add "$SPEC" - git commit -m "chore: regenerate OpenAPI spec" - git push diff --git a/.github/workflows/license-audit.yml b/.github/workflows/license-audit.yml deleted file mode 100644 index b7ad8c67d..000000000 --- a/.github/workflows/license-audit.yml +++ /dev/null @@ -1,198 +0,0 @@ -name: License Audit - -on: - pull_request: - branches: [main] - paths: - - "yarn.lock" - - "package.json" - - "packages/*/package.json" - - "scripts/fetchLicenses.mjs" - - "scripts/summarizeLicenses.mjs" - - "scripts/npmLicenseMap.json" - - "scripts/licenseAuditPrompt.txt" - - "scripts/runLicenseAudit.sh" - workflow_dispatch: - -jobs: - license-audit: - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - id-token: write - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 1 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: "20" - cache: "yarn" - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Fetch licenses - run: node scripts/fetchLicenses.mjs - - - name: Summarize licenses - run: node scripts/summarizeLicenses.mjs - - - name: Read audit prompt - id: read-prompt - run: | - { - echo 'PROMPT<> "$GITHUB_OUTPUT" - - - name: Audit licenses with Claude - uses: anthropics/claude-code-action@v1 - with: - allowed_bots: "github-actions" - anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - claude_args: '--allowedTools "Bash,Read,Write,Glob,Grep,WebFetch"' - prompt: ${{ steps.read-prompt.outputs.PROMPT }} - - - name: Validate audit result - run: | - if [ ! -f license-audit-result.json ]; then - echo "::error::license-audit-result.json was not created by the audit step" - exit 1 - fi - - STATUS=$(node -e "const r = require('./license-audit-result.json'); console.log(r.status)") - UNRESOLVED=$(node -e "const r = require('./license-audit-result.json'); console.log(r.summary.unresolvedCount)") - STRONG=$(node -e "const r = require('./license-audit-result.json'); console.log(r.summary.strongCopyleftCount)") - WEAK=$(node -e "const r = require('./license-audit-result.json'); console.log(r.summary.weakCopyleftCount)") - RESOLVED=$(node -e "const r = require('./license-audit-result.json'); console.log(r.summary.resolvedCount)") - - echo "## License Audit Result: $STATUS" - echo "" - echo "- Resolved: $RESOLVED" - echo "- Unresolved: $UNRESOLVED" - echo "- Strong copyleft: $STRONG" - echo "- Weak copyleft: $WEAK" - - if [ "$STATUS" = "FAIL" ]; then - echo "" - echo "::error::License audit failed. See details below:" - node -e "const r = require('./license-audit-result.json'); r.failReasons.forEach(r => console.log(' - ' + r))" - exit 1 - fi - - - name: Comment on PR - if: always() && github.event_name == 'pull_request' - uses: actions/github-script@v7 - with: - script: | - const fs = require('fs'); - const resultPath = 'license-audit-result.json'; - - // Determine if we should comment - let shouldComment = false; - let body = ''; - - if (!fs.existsSync(resultPath)) { - shouldComment = true; - body = `## License Audit\n\n:x: Audit failed to produce results. Check the workflow logs for details.`; - } else { - const result = JSON.parse(fs.readFileSync(resultPath, 'utf-8')); - const hasWeakCopyleft = result.summary.weakCopyleftCount > 0; - const isFail = result.status === 'FAIL'; - - if (!isFail && !hasWeakCopyleft) { - return; - } - - shouldComment = true; - const icon = isFail ? ':x:' : ':warning:'; - - body = `## License Audit\n\n`; - body += `${icon} **Status: ${result.status}**\n\n`; - body += `| Metric | Count |\n|---|---|\n`; - body += `| Total packages | ${result.summary.totalPackages} |\n`; - body += `| Resolved (non-standard) | ${result.summary.resolvedCount} |\n`; - body += `| Unresolved | ${result.summary.unresolvedCount} |\n`; - body += `| Strong copyleft | ${result.summary.strongCopyleftCount} |\n`; - body += `| Weak copyleft | ${result.summary.weakCopyleftCount} |\n`; - - if (result.failReasons && result.failReasons.length > 0) { - body += `\n### Fail Reasons\n\n`; - for (const reason of result.failReasons) { - body += `- ${reason}\n`; - } - } - - if (result.unresolved && result.unresolved.length > 0) { - body += `\n### Unresolved Packages\n\n`; - body += `| Package | Version | License | Reason |\n|---|---|---|---|\n`; - for (const pkg of result.unresolved) { - body += `| ${pkg.name} | ${pkg.version} | \`${pkg.license}\` | ${pkg.reason} |\n`; - } - } - - if (result.copyleft && result.copyleft.strong && result.copyleft.strong.length > 0) { - body += `\n### Strong Copyleft Packages\n\n`; - body += `| Package | Version | License |\n|---|---|---|\n`; - for (const pkg of result.copyleft.strong) { - body += `| ${pkg.name} | ${pkg.version} | \`${pkg.license}\` |\n`; - } - } - - if (result.copyleft && result.copyleft.weak && result.copyleft.weak.length > 0) { - body += `\n### Weak Copyleft Packages (informational)\n\n`; - body += `| Package | Version | License |\n|---|---|---|\n`; - for (const pkg of result.copyleft.weak) { - body += `| ${pkg.name} | ${pkg.version} | \`${pkg.license}\` |\n`; - } - } - - if (result.resolved && result.resolved.length > 0) { - body += `\n
Resolved Packages (${result.resolved.length})\n\n`; - body += `| Package | Version | Original | Resolved | Source |\n|---|---|---|---|---|\n`; - for (const pkg of result.resolved) { - body += `| ${pkg.name} | ${pkg.version} | \`${pkg.originalLicense}\` | \`${pkg.resolvedLicense}\` | ${pkg.source} |\n`; - } - body += `\n
\n`; - } - } - - if (!shouldComment) return; - - const comments = await github.rest.issues.listComments({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - }); - const existing = comments.data.find(c => c.body.startsWith('## License Audit')); - if (existing) { - await github.rest.issues.updateComment({ - owner: context.repo.owner, - repo: context.repo.repo, - comment_id: existing.id, - body, - }); - } else { - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body, - }); - } - - - name: Upload artifacts - if: always() - uses: actions/upload-artifact@v4 - with: - name: license-audit - path: | - oss-licenses.json - oss-license-summary.json - license-audit-result.json diff --git a/.github/workflows/linear-release.yml b/.github/workflows/linear-release.yml deleted file mode 100644 index ad59125c4..000000000 --- a/.github/workflows/linear-release.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Linear Release - -on: - workflow_run: - workflows: [ "Release Sourcebot (Production)" ] - types: - - completed - -permissions: - contents: read - -jobs: - linear-release: - if: ${{ github.event.workflow_run.conclusion == 'success' }} - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - ref: main - fetch-depth: 0 - - - name: Extract version from release - id: extract_version - run: | - # Get the latest version from CHANGELOG.md (first non-Unreleased version) - VERSION=$(grep -oP '## \[\K[0-9]+\.[0-9]+\.[0-9]+' CHANGELOG.md | head -n 1) - - if [ -z "$VERSION" ]; then - echo "Error: Could not extract version from CHANGELOG.md" - exit 1 - fi - - echo "Detected version: $VERSION" - echo "version=$VERSION" >> $GITHUB_OUTPUT - - - uses: linear/linear-release-action@v0 - with: - access_key: ${{ secrets.LINEAR_ACCESS_KEY }} - version: ${{ steps.extract_version.outputs.version }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 3d194eb91..000000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Lint - -on: - pull_request: - branches: ["main"] - - -jobs: - lint: - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: "true" - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: '20.x' - cache: 'yarn' - cache-dependency-path: '**/yarn.lock' - - - name: Install - run: yarn install --frozen-lockfile - - - name: Lint - run: yarn lint diff --git a/.github/workflows/mirror-sourcebot-private.yml b/.github/workflows/mirror-sourcebot-private.yml deleted file mode 100644 index c26c96a2d..000000000 --- a/.github/workflows/mirror-sourcebot-private.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Mirror to sourcebot-private - -on: - push: - branches: - - main - tags: - - "v*" - - "setup-sourcebot-v*" - # Release commits use `[skip ci]`, which suppresses push-triggered workflows. - workflow_run: - workflows: - - Release Sourcebot (Production) - - Release setup-sourcebot - types: - - completed - workflow_dispatch: - -permissions: - contents: read - -concurrency: - group: mirror-sourcebot-private - cancel-in-progress: false - -jobs: - mirror: - if: github.repository == 'sourcebot-dev/sourcebot' - runs-on: ubuntu-latest - environment: sourcebot-private-mirror - - steps: - - name: Check out complete repository history - uses: actions/checkout@v7 - with: - ref: main - fetch-depth: 0 - fetch-tags: true - persist-credentials: false - - - name: Create mirror installation token - id: app-token - uses: actions/create-github-app-token@v3 - with: - client-id: ${{ vars.MIRROR_APP_CLIENT_ID }} - private-key: ${{ secrets.MIRROR_APP_PRIVATE_KEY }} - owner: sourcebot-dev - repositories: sourcebot-private - permission-contents: write - permission-workflows: write - - - name: Mirror main and tags - env: - MIRROR_TOKEN: ${{ steps.app-token.outputs.token }} - shell: bash - run: | - git remote add private \ - "https://x-access-token:${MIRROR_TOKEN}@github.com/sourcebot-dev/sourcebot-private.git" - - git push --atomic private HEAD:refs/heads/main --tags diff --git a/.github/workflows/pr-gate.yml b/.github/workflows/pr-gate.yml deleted file mode 100644 index a18fef278..000000000 --- a/.github/workflows/pr-gate.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: PR Gate - -# This gate validates that Prisma migrations are in order and that we can build -# the docker container. - -on: - pull_request: - branches: ["main"] - -jobs: - build: - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: "true" - # full history so migration checks can diff against the base branch - fetch-depth: 0 - - # Fails fast (before the docker build) when migrations drift from - # schema.prisma or a new migration is added out of timestamp order. - - name: Check Prisma migrations - uses: ./.github/actions/check-prisma-migrations - with: - base-ref: ${{ github.base_ref }} - - - name: Build Docker image - id: build - uses: docker/build-push-action@v7 - with: - context: . diff --git a/.github/workflows/release-cloud-prod.yml b/.github/workflows/release-cloud-prod.yml deleted file mode 100644 index d9fa0f777..000000000 --- a/.github/workflows/release-cloud-prod.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Release Sourcebot (Cloud - Production) - -permissions: - contents: read - id-token: write - -on: - push: - tags: ["v*.*.*"] - workflow_dispatch: - -concurrency: - group: release-cloud-prod-${{ github.ref }} - cancel-in-progress: false - -jobs: - # The image tags below are only enabled for `v*` tag refs. Fail fast with a - # clear error when dispatched from a branch rather than letting buildx fail - # with "tag is needed when pushing to registry". - validate-ref: - runs-on: ubuntu-latest - steps: - - name: Require a release tag ref - env: - REF: ${{ github.ref }} - run: | - if [[ "$REF" != refs/tags/v* ]]; then - echo "::error::Cloud production releases must run against a release tag (got '$REF'). Re-run with: gh workflow run release-cloud-prod.yml --ref v" - exit 1 - fi - - build: - needs: validate-ref - uses: ./.github/workflows/_build-cloud.yml - with: - environment: prod - git_ref: ${{ github.ref }} - docker_tags: | - type=semver,pattern=v{{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} - type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/v') }} - secrets: inherit diff --git a/.github/workflows/release-cloud-staging.yml b/.github/workflows/release-cloud-staging.yml deleted file mode 100644 index 8aaf39228..000000000 --- a/.github/workflows/release-cloud-staging.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Release Sourcebot (Cloud - Staging) - -permissions: - contents: read - id-token: write - -on: - push: - branches: ["main"] - workflow_dispatch: - -concurrency: - group: release-cloud-staging-${{ github.ref }} - cancel-in-progress: false - -jobs: - build: - uses: ./.github/workflows/_build-cloud.yml - with: - environment: staging - git_ref: ${{ github.ref }} - docker_tags: | - type=raw,value=main,enable=${{ github.ref == 'refs/heads/main' }} - type=sha,format=long,enable=${{ github.ref == 'refs/heads/main' }} - secrets: inherit diff --git a/.github/workflows/release-dev.yml b/.github/workflows/release-dev.yml deleted file mode 100644 index f4ae4072b..000000000 --- a/.github/workflows/release-dev.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Release Sourcebot (Development) - -permissions: - contents: read - packages: write - id-token: write - -on: - push: - branches: ["main"] - -jobs: - build: - uses: ./.github/workflows/_build.yml - with: - git_ref: ${{ github.ref_name }} - docker_tags: type=raw,value=main - use_app_token: false - secrets: inherit - - publish-to-registry: - needs: build - uses: ./.github/workflows/_merge.yml - with: - docker_tags: type=raw,value=main diff --git a/.github/workflows/release-prod.yml b/.github/workflows/release-prod.yml deleted file mode 100644 index 98d7b0479..000000000 --- a/.github/workflows/release-prod.yml +++ /dev/null @@ -1,297 +0,0 @@ -name: Release Sourcebot (Production) - -permissions: - contents: read - packages: write - id-token: write - -on: - workflow_dispatch: - inputs: - bump_type: - description: "Type of version bump to apply" - required: true - type: choice - options: - - patch - - minor - - major - -concurrency: - group: release-sourcebot - cancel-in-progress: false - -env: - # Use docker.io for Docker Hub if empty - REGISTRY_IMAGE: ghcr.io/sourcebot-dev/sourcebot - -jobs: - prepare-release: - runs-on: ubuntu-latest - permissions: - contents: write - outputs: - version: ${{ steps.calculate_version.outputs.version }} - temp_branch: ${{ steps.push_temp_branch.outputs.temp_branch }} - - steps: - - name: Generate GitHub App token - id: generate_token - uses: actions/create-github-app-token@v1 - with: - app-id: ${{ secrets.RELEASE_APP_ID }} - private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} - - - name: Checkout repository - uses: actions/checkout@v4 - with: - ref: main - fetch-depth: 0 - token: ${{ steps.generate_token.outputs.token }} - - - name: Calculate new version - id: calculate_version - run: | - # Extract current version from CHANGELOG.md - CURRENT_VERSION=$(grep -oP '## \[\K[0-9]+\.[0-9]+\.[0-9]+' CHANGELOG.md | head -n 1) - - if [ -z "$CURRENT_VERSION" ]; then - echo "Error: Could not extract current version from CHANGELOG.md" - exit 1 - fi - - echo "Current version: $CURRENT_VERSION" - - # Parse version components - IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION" - - # Apply bump based on input - BUMP_TYPE="${{ inputs.bump_type }}" - case "$BUMP_TYPE" in - major) - MAJOR=$((MAJOR + 1)) - MINOR=0 - PATCH=0 - ;; - minor) - MINOR=$((MINOR + 1)) - PATCH=0 - ;; - patch) - PATCH=$((PATCH + 1)) - ;; - *) - echo "Error: Invalid bump type: $BUMP_TYPE" - exit 1 - ;; - esac - - NEW_VERSION="$MAJOR.$MINOR.$PATCH" - echo "New version: $NEW_VERSION" - - # Export to GITHUB_ENV for use in subsequent steps within this job - echo "VERSION=$NEW_VERSION" >> $GITHUB_ENV - - # Export to GITHUB_OUTPUT for use in other jobs - echo "version=$NEW_VERSION" >> $GITHUB_OUTPUT - - - name: Check if version already exists - run: | - if grep -q "## \[$VERSION\]" CHANGELOG.md; then - echo "Error: Version $VERSION already exists in CHANGELOG.md" - exit 1 - fi - if git tag | grep -q "^v$VERSION$"; then - echo "Error: Tag v$VERSION already exists" - exit 1 - fi - - - name: Update CHANGELOG.md and version.ts - run: | - DATE=$(date +%Y-%m-%d) - - # Insert the new version header after the [Unreleased] line - sed -i "/## \[Unreleased\]/a\\ - \\ - ## [$VERSION] - $DATE" CHANGELOG.md - - echo "Updated CHANGELOG.md with version $VERSION" - cat CHANGELOG.md | head -n 15 - - # Update version.ts - cat > packages/shared/src/version.ts << EOF - // This file is auto-generated by .github/workflows/release-sourcebot.yml - export const SOURCEBOT_VERSION = "v$VERSION"; - EOF - echo "Updated version.ts with version v$VERSION" - cat packages/shared/src/version.ts - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Generate OpenAPI docs - run: yarn openapi:generate - - - name: Configure git - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - - name: Commit changes - run: | - git add CHANGELOG.md packages/shared/src/version.ts docs/api-reference/sourcebot-public.openapi.json - git commit -m "Release v$VERSION" - - - name: Push to temporary branch - id: push_temp_branch - env: - GH_TOKEN: ${{ steps.generate_token.outputs.token }} - run: | - TEMP_BRANCH="release-v$VERSION" - git push origin HEAD:refs/heads/$TEMP_BRANCH - echo "Pushed commit to temporary branch: $TEMP_BRANCH" - echo "temp_branch=$TEMP_BRANCH" >> $GITHUB_OUTPUT - - build: - needs: prepare-release - uses: ./.github/workflows/_build.yml - with: - git_ref: ${{ needs.prepare-release.outputs.temp_branch }} - docker_tags: | - type=raw,value=v${{ needs.prepare-release.outputs.version }} - type=raw,value=latest - use_app_token: true - secrets: - release_app_id: ${{ secrets.RELEASE_APP_ID }} - release_app_private_key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} - - finalize-release: - needs: [prepare-release, build] - runs-on: ubuntu-latest - permissions: - contents: write - - steps: - - name: Generate GitHub App token - id: generate_token - uses: actions/create-github-app-token@v1 - with: - app-id: ${{ secrets.RELEASE_APP_ID }} - private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} - - - name: Checkout temporary branch - uses: actions/checkout@v4 - with: - ref: ${{ needs.prepare-release.outputs.temp_branch }} - fetch-depth: 0 - token: ${{ steps.generate_token.outputs.token }} - - - name: Configure git - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - - name: Fast-forward main to temporary branch - env: - GH_TOKEN: ${{ steps.generate_token.outputs.token }} - VERSION: ${{ needs.prepare-release.outputs.version }} - TEMP_BRANCH: ${{ needs.prepare-release.outputs.temp_branch }} - run: | - # Fetch main branch - git fetch origin main:main - git checkout main - - # Check if fast-forward is possible - if ! git merge-base --is-ancestor main "$TEMP_BRANCH"; then - echo "❌ ERROR: Cannot fast-forward main branch to release commit" - echo "" - echo "This means new commits were pushed to main after the release process started." - echo "" - echo "Recent commits on main that caused the conflict:" - git log --oneline $TEMP_BRANCH..main | head -5 - exit 1 - fi - - # Fast-forward main to release commit - git merge --ff-only "$TEMP_BRANCH" - - echo "✓ Successfully fast-forwarded main to release commit" - - - name: Create annotated tag - env: - VERSION: ${{ needs.prepare-release.outputs.version }} - run: | - git tag -a "v$VERSION" -m "sourcebot v$VERSION" - echo "Created tag v$VERSION" - - - name: Push main and tag - env: - GH_TOKEN: ${{ steps.generate_token.outputs.token }} - run: | - git push origin main - git push origin --tags - echo "Pushed main branch and tags" - - - name: Create GitHub release - env: - GH_TOKEN: ${{ steps.generate_token.outputs.token }} - VERSION: ${{ needs.prepare-release.outputs.version }} - run: | - gh release create "v$VERSION" \ - --verify-tag \ - --generate-notes \ - --latest - - publish-to-registry: - needs: [prepare-release, build, finalize-release] - uses: ./.github/workflows/_merge.yml - with: - docker_tags: | - type=raw,value=v${{ needs.prepare-release.outputs.version }} - type=raw,value=latest - - update-helm-chart: - needs: [finalize-release, publish-to-registry] - permissions: - contents: write - pull-requests: write - uses: sourcebot-dev/sourcebot-helm-chart/.github/workflows/update-sourcebot-version.yaml@main - secrets: inherit - - cleanup: - needs: [prepare-release, build, publish-to-registry, finalize-release, update-helm-chart] - if: always() && needs.prepare-release.outputs.temp_branch != '' - runs-on: ubuntu-latest - permissions: - contents: write - - steps: - - name: Generate GitHub App token - id: generate_token - uses: actions/create-github-app-token@v1 - with: - app-id: ${{ secrets.RELEASE_APP_ID }} - private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} - - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 - token: ${{ steps.generate_token.outputs.token }} - - - name: Delete temporary branch - env: - TEMP_BRANCH: ${{ needs.prepare-release.outputs.temp_branch }} - run: | - # Check if branch exists before attempting to delete - if git ls-remote --heads origin "$TEMP_BRANCH" | grep -q "$TEMP_BRANCH"; then - git push origin --delete "$TEMP_BRANCH" - echo "✓ Deleted temporary branch: $TEMP_BRANCH" - else - echo "ℹ Temporary branch $TEMP_BRANCH does not exist (may have been already deleted)" - fi \ No newline at end of file diff --git a/.github/workflows/release-setup-sourcebot.yml b/.github/workflows/release-setup-sourcebot.yml deleted file mode 100644 index 677262e20..000000000 --- a/.github/workflows/release-setup-sourcebot.yml +++ /dev/null @@ -1,145 +0,0 @@ -name: Release setup-sourcebot - -# Publishes the `setup-sourcebot` CLI (packages/setupWizard) to the public npm -# registry, then bumps the version, commits it to main, tags it, and cuts a -# GitHub release. -# -# Auth model: -# - npm: OIDC Trusted Publishing (no long-lived token). Requires a trusted -# publisher to be configured for `setup-sourcebot` on npmjs.org, -# pointing at this repo + this workflow file. npm CLI >= 11.5.1 is -# required, so we upgrade npm before publishing. -# - git: the existing RELEASE_APP GitHub App token, so the version-bump -# commit and tag can be pushed to protected `main`. - -permissions: - contents: read - -on: - workflow_dispatch: - inputs: - bump_type: - description: "Type of version bump to apply" - required: true - type: choice - options: - - patch - - minor - - major - -concurrency: - group: release-setup-sourcebot - cancel-in-progress: false - -jobs: - release: - runs-on: ubuntu-latest - permissions: - contents: write # push the version-bump commit + tag, create the release - id-token: write # OIDC token for npm Trusted Publishing - defaults: - run: - working-directory: packages/setupWizard - - steps: - - name: Generate GitHub App token - id: generate_token - uses: actions/create-github-app-token@v1 - with: - app-id: ${{ secrets.RELEASE_APP_ID }} - private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} - - - name: Checkout repository - uses: actions/checkout@v4 - with: - ref: main - fetch-depth: 0 - submodules: "true" - token: ${{ steps.generate_token.outputs.token }} - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '24.x' - - - name: Install dependencies - working-directory: . - run: yarn install --frozen-lockfile - - - name: Bump version - id: bump - run: | - # Bump packages/setupWizard/package.json only. --no-git-tag-version - # writes the new version without creating a commit or tag (we do that - # ourselves, with a release-specific tag, further down). - npm version "${{ inputs.bump_type }}" --no-git-tag-version --no-workspaces-update - VERSION=$(node -p "require('./package.json').version") - echo "Bumped setup-sourcebot to $VERSION" - echo "version=$VERSION" >> "$GITHUB_OUTPUT" - - - name: Check tag does not already exist - working-directory: . - env: - TAG: setup-sourcebot-v${{ steps.bump.outputs.version }} - run: | - if git tag | grep -qx "$TAG"; then - echo "Error: tag $TAG already exists" - exit 1 - fi - - - name: Build - working-directory: . - run: | - # setupWizard imports from @sourcebot/schemas (workspace:^), so its - # build must come first. - yarn workspace @sourcebot/schemas run build - yarn workspace setup-sourcebot run build - - - name: Pack tarball - run: | - # Yarn pack rewrites the `workspace:^` protocol to a concrete version - # range in the published manifest — something `npm publish` cannot do - # on its own. We then hand the resulting tarball to npm for OIDC - # publishing. - yarn pack --out /tmp/setup-sourcebot.tgz - - - name: Verify the exact publish artifact - working-directory: . - env: - PACKAGE_TRACKER_ANALYTICS: 'false' - SETUP_TEST_TARBALL: /tmp/setup-sourcebot.tgz - run: | - docker pull docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - yarn workspace setup-sourcebot test - yarn workspace setup-sourcebot test:e2e - yarn workspace setup-sourcebot test:node-compatibility - - - name: Upgrade npm for Trusted Publishing - working-directory: . - run: | - # OIDC Trusted Publishing requires npm >= 11.5.1. - npm install -g npm@latest - npm --version - - - name: Publish to npm - working-directory: . - run: | - npm publish /tmp/setup-sourcebot.tgz --provenance --access public - - - name: Configure git - working-directory: . - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - - - name: Commit, tag, and push - working-directory: . - env: - VERSION: ${{ steps.bump.outputs.version }} - run: | - git add packages/setupWizard/package.json - git commit -m "[skip ci] Release setup-sourcebot v$VERSION" - git tag -a "setup-sourcebot-v$VERSION" -m "setup-sourcebot v$VERSION" - git push origin HEAD:main - git push origin "setup-sourcebot-v$VERSION" - diff --git a/.github/workflows/releaseCloudInternal.yml b/.github/workflows/releaseCloudInternal.yml deleted file mode 100644 index eeb608b5a..000000000 --- a/.github/workflows/releaseCloudInternal.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Release Sourcebot (Cloud - Internal Demo) - -permissions: - contents: read - id-token: write - -on: - workflow_dispatch: - -concurrency: - group: release-cloud-internal - cancel-in-progress: false - -jobs: - build: - uses: ./.github/workflows/_build-cloud.yml - with: - environment: internal - # Pin the checkout and image tags to the same dispatch commit so metadata - # can never identify image contents as a different revision. - git_ref: ${{ github.sha }} - require_sentry: false - docker_tags: | - type=raw,value=main - type=raw,value=sha-${{ github.sha }} diff --git a/.github/workflows/setup-wizard-e2e.yml b/.github/workflows/setup-wizard-e2e.yml deleted file mode 100644 index 0b4e2e39f..000000000 --- a/.github/workflows/setup-wizard-e2e.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: Setup wizard verification - -on: - pull_request: - paths: - - 'packages/setupWizard/**' - - 'packages/schemas/**' - - 'entrypoint.sh' - - 'yarn.lock' - - '.github/workflows/setup-wizard-e2e.yml' - - '.github/workflows/release-setup-sourcebot.yml' - workflow_dispatch: - -permissions: - contents: read - -jobs: - platform: - timeout-minutes: 20 - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - node: ['20.20.0', '22.22.0', '24.x'] - runs-on: ${{ matrix.os }} - env: - PACKAGE_TRACKER_ANALYTICS: 'false' - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - uses: actions/setup-node@v4 - with: - node-version: '24.x' - - run: corepack enable - - run: yarn install --immutable --mode=skip-build - - run: yarn rebuild node-pty - - run: yarn workspace @sourcebot/schemas build - - run: yarn workspace setup-sourcebot build - - name: Pack on the release runtime - shell: bash - env: - SETUP_TEST_TARBALL: ${{ runner.temp }}/setup-sourcebot.tgz - run: | - yarn workspace setup-sourcebot pack --out "$SETUP_TEST_TARBALL" - echo "SETUP_TEST_TARBALL=$SETUP_TEST_TARBALL" >> "$GITHUB_ENV" - - name: Select end-user test runtime - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node }} - - run: corepack enable - - run: yarn workspace setup-sourcebot test - - run: yarn workspace setup-sourcebot test:platform - - name: Linux minimum-runtime regression checks - if: runner.os == 'Linux' && matrix.node != '24.x' - working-directory: packages/setupWizard - run: node --test --test-concurrency=1 tests/e2e/wizard.test.mjs tests/e2e/collectors.test.mjs tests/e2e/docker.test.mjs tests/e2e/safety.test.mjs - - name: Linux packed-artifact and runtime checks - if: runner.os == 'Linux' && matrix.node == '24.x' - run: | - docker pull docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - yarn workspace setup-sourcebot test:e2e - yarn workspace setup-sourcebot test:baseline - node packages/setupWizard/tests/e2e/packageManagers.mjs - - setup-wizard-e2e: - if: always() - needs: [platform] - runs-on: ubuntu-latest - steps: - - name: Require every platform job - env: - RESULT: ${{ needs.platform.result }} - run: test "$RESULT" = success diff --git a/.github/workflows/syncZoekt.yml b/.github/workflows/syncZoekt.yml deleted file mode 100644 index c14d33f81..000000000 --- a/.github/workflows/syncZoekt.yml +++ /dev/null @@ -1,229 +0,0 @@ -name: Sync Zoekt Submodule - -on: - repository_dispatch: - types: [zoekt-pr-merged] - workflow_dispatch: - inputs: - zoekt_sha: - description: Full Zoekt commit SHA to sync. - required: true - type: string - zoekt_pr_number: - description: Merged Zoekt pull request number associated with the SHA. - required: true - type: number - -concurrency: - group: sync-zoekt-submodule - cancel-in-progress: false - -permissions: - contents: read - -jobs: - sync: - runs-on: ubuntu-latest - env: - AUTOMATION_BRANCH: automation/sync-zoekt - ZOEKT_SHA: ${{ github.event.client_payload.zoekt_sha || inputs.zoekt_sha }} - ZOEKT_PR_NUMBER: ${{ github.event.client_payload.zoekt_pr_number || inputs.zoekt_pr_number }} - steps: - - name: Generate GitHub App token - id: app-token - uses: actions/create-github-app-token@v2 - with: - app-id: ${{ secrets.RELEASE_APP_ID }} - private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} - owner: sourcebot-dev - repositories: sourcebot - permission-contents: write - permission-pull-requests: write - - - name: Checkout Sourcebot - uses: actions/checkout@v4 - with: - ref: main - fetch-depth: 0 - persist-credentials: false - - - name: Initialize public Zoekt submodule - run: git submodule update --init --recursive vendor/zoekt - - - name: Configure automation git identity - run: | - git config user.name "sourcebot-sync[bot]" - git config user.email "sourcebot-sync[bot]@users.noreply.github.com" - - - name: Validate dispatch payload - run: | - set -euo pipefail - - if [[ ! "$ZOEKT_SHA" =~ ^[0-9a-f]{40}$ ]]; then - echo "Expected a full lowercase Zoekt commit SHA, got: $ZOEKT_SHA" >&2 - exit 1 - fi - if [[ ! "$ZOEKT_PR_NUMBER" =~ ^[1-9][0-9]*$ ]]; then - echo "Expected a Zoekt pull request number, got: $ZOEKT_PR_NUMBER" >&2 - exit 1 - fi - - - name: Prepare automation branch - id: branch - env: - GH_TOKEN: ${{ steps.app-token.outputs.token }} - run: | - set -euo pipefail - - open_pr_url=$(gh pr list \ - --repo "$GITHUB_REPOSITORY" \ - --state open \ - --head "$AUTOMATION_BRANCH" \ - --json url \ - --jq '.[0].url // ""') - remote_sha=$(git ls-remote \ - --heads origin "refs/heads/$AUTOMATION_BRANCH" \ - | awk '{print $1}') - branch_changed=false - - if [[ -n "$open_pr_url" ]]; then - if [[ -z "$remote_sha" ]]; then - echo "Open sync PR $open_pr_url has no remote branch." >&2 - exit 1 - fi - git fetch origin \ - "refs/heads/$AUTOMATION_BRANCH:refs/remotes/origin/$AUTOMATION_BRANCH" - git switch -C "$AUTOMATION_BRANCH" "origin/$AUTOMATION_BRANCH" - git rebase origin/main - if [[ "$(git rev-parse HEAD)" != "$remote_sha" ]]; then - branch_changed=true - fi - else - git switch -c "$AUTOMATION_BRANCH" - fi - - { - echo "open_pr_url=$open_pr_url" - echo "remote_sha=$remote_sha" - echo "changed=$branch_changed" - } >> "$GITHUB_OUTPUT" - - - name: Update Zoekt submodule - id: update - run: | - set -euo pipefail - - current_sha=$(git rev-parse HEAD:vendor/zoekt) - .github/scripts/updateZoektSubmodule.sh "$ZOEKT_SHA" - if git diff --cached --quiet -- vendor/zoekt; then - { - echo "changed=false" - if [[ "$current_sha" == "$ZOEKT_SHA" ]]; then - echo "target_applied=true" - else - echo "target_applied=false" - fi - } >> "$GITHUB_OUTPUT" - echo "Sourcebot already contains Zoekt $ZOEKT_SHA." >> "$GITHUB_STEP_SUMMARY" - exit 0 - fi - - git commit -m "chore: sync zoekt after upstream PR #$ZOEKT_PR_NUMBER" - { - echo "changed=true" - echo "target_applied=true" - } >> "$GITHUB_OUTPUT" - - - name: Push automation branch - if: steps.update.outputs.changed == 'true' || steps.branch.outputs.changed == 'true' - env: - GH_TOKEN: ${{ steps.app-token.outputs.token }} - REMOTE_SHA: ${{ steps.branch.outputs.remote_sha }} - run: | - set -euo pipefail - - gh auth setup-git - if [[ -n "$REMOTE_SHA" ]]; then - git push \ - --force-with-lease="refs/heads/$AUTOMATION_BRANCH:$REMOTE_SHA" \ - origin "HEAD:refs/heads/$AUTOMATION_BRANCH" - else - git push --set-upstream origin \ - "HEAD:refs/heads/$AUTOMATION_BRANCH" - fi - - - name: Create or update pull request - if: >- - steps.update.outputs.changed == 'true' || - steps.branch.outputs.changed == 'true' || - (steps.update.outputs.target_applied == 'true' && - steps.branch.outputs.open_pr_url != '') - id: pull-request - env: - GH_TOKEN: ${{ steps.app-token.outputs.token }} - OPEN_PR_URL: ${{ steps.branch.outputs.open_pr_url }} - TARGET_APPLIED: ${{ steps.update.outputs.target_applied }} - run: | - set -euo pipefail - - body_file=$(mktemp) - trap 'rm -f "$body_file"' EXIT - cat > "$body_file" <> "$GITHUB_OUTPUT" - - - name: Add changelog entry - if: steps.pull-request.outputs.pr_url != '' - env: - GH_TOKEN: ${{ steps.app-token.outputs.token }} - PR_URL: ${{ steps.pull-request.outputs.pr_url }} - run: | - set -euo pipefail - - pr_number=${PR_URL##*/} - .github/scripts/addZoektSyncChangelogEntry.sh "$pr_number" - if git diff --quiet -- CHANGELOG.md; then - exit 0 - fi - - git add CHANGELOG.md - git commit -m "chore: update changelog for #$pr_number" - gh auth setup-git - git push origin "HEAD:refs/heads/$AUTOMATION_BRANCH" - - - name: Summarize pull request - if: steps.pull-request.outputs.pr_url != '' - env: - PR_URL: ${{ steps.pull-request.outputs.pr_url }} - run: | - synced_sha=$(git rev-parse HEAD:vendor/zoekt) - { - echo "## Zoekt sync" - echo - echo "Updated \`vendor/zoekt\` to \`$synced_sha\`." - echo - echo "Sourcebot pull request: $PR_URL" - } >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index d624ebd3a..000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Test - -on: - pull_request: - branches: ["main"] - - -jobs: - vulnerability-automation: - name: Vulnerability automation - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - name: Test reconciliation behavior - run: .github/scripts/test-vulnerability-triage.sh - - name: Test CVE remediation discovery - run: .github/scripts/test-cve-remediation.sh - - name: Test Zoekt sync automation - run: .github/scripts/testZoektSync.sh - - name: Test entrypoint install ID behavior - run: .github/scripts/test-entrypoint-install-id.sh - - test: - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: "true" - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - - name: Install - run: yarn install --frozen-lockfile - - - name: Test - # The CLI has separate packed-artifact and Node-compatibility gates in setup-wizard-e2e. - # Keep the application workspaces on their existing runtime here. - run: yarn workspaces foreach --all --topological --exclude setup-sourcebot --exclude 'root-workspace-*' run test diff --git a/.github/workflows/update-roadmap-released.yml b/.github/workflows/update-roadmap-released.yml deleted file mode 100644 index e77da88dc..000000000 --- a/.github/workflows/update-roadmap-released.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: Update Roadmap Released - -on: - push: - branches: - - main - workflow_dispatch: - schedule: - - cron: "0 */6 * * *" - -permissions: - pull-requests: read - contents: read - issues: write - -jobs: - update: - runs-on: ubuntu-latest - steps: - - name: Update "Released" section with last 10 merged PRs - uses: actions/github-script@v7 - env: - ROADMAP_ISSUE_NUMBER: "459" - with: - script: | - const issue_number = parseInt(process.env.ROADMAP_ISSUE_NUMBER, 10); - const {owner, repo} = context.repo; - - // Fetch more than 10, then sort by closed_at to be precise - const batchSize = 50; - const { data: prBatch } = await github.rest.pulls.list({ - owner, - repo, - state: "closed", - per_page: batchSize, - sort: "updated", - direction: "desc" - }); - - const last10 = prBatch - .filter(pr => pr.merged_at) // only merged PRs - .sort((a, b) => new Date(b.merged_at) - new Date(a.merged_at)) - .slice(0, 10); - - const list = last10.map(pr => `- #${pr.number}`).join("\n"); - - const start = ""; - const end = ""; - - const mergedUrl = `https://github.com/${owner}/${repo}/pulls?q=is%3Apr+is%3Amerged`; - const replacementBlock = [ - start, - "", - `10 most recent [merged PRs](${mergedUrl}):`, - "", - list, - "", - end - ].join("\n"); - - const { data: issue } = await github.rest.issues.get({ owner, repo, issue_number }); - let body = issue.body || ""; - - if (body.includes(start) && body.includes(end)) { - const pattern = new RegExp(`${start}[\\s\\S]*?${end}`); - body = body.replace(pattern, replacementBlock); - } else { - core.setFailed('Missing RELEASED markers in roadmap issue body. Please add and to the issue.'); - return; - } - - await github.rest.issues.update({ - owner, - repo, - issue_number, - body - }); \ No newline at end of file diff --git a/.github/workflows/vulnerability-triage.yml b/.github/workflows/vulnerability-triage.yml index 3be5c4d6a..d37f2441e 100644 --- a/.github/workflows/vulnerability-triage.yml +++ b/.github/workflows/vulnerability-triage.yml @@ -1,9 +1,6 @@ name: Vulnerability Scan & Triage on: - schedule: - # Run one hour before nightly CVE remediation. - - cron: '0 7 * * *' workflow_dispatch: inputs: image_tag: diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index ece796f5f..000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "vendor/zoekt"] - path = vendor/zoekt - url = https://github.com/sourcebot-dev/zoekt - branch=main diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 5fcd8a70c..000000000 --- a/.prettierrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "tabWidth": 4 -} diff --git a/.trivyignore b/.trivyignore deleted file mode 100644 index 4bb4c0de6..000000000 --- a/.trivyignore +++ /dev/null @@ -1,10 +0,0 @@ -# Trivy vulnerability ignore file -# Docs: https://trivy.dev/latest/docs/configuration/filtering/#by-finding-ids -# Auto-detected by Trivy in the repo root (see trivy.yaml / .github/workflows/vulnerability-triage.yml). -# Each entry should note why it is suppressed. - -# CVE-2026-41305 — PostCSS XSS via unescaped in CSS stringify output. -# postcss is a build-time-only dependency here (Tailwind/Next CSS tooling); we do -# not stringify untrusted CSS ASTs at runtime, so this is not exploitable. -# @see https://github.com/vercel/next.js/issues/93234#issuecomment-4333397286 -CVE-2026-41305 diff --git a/.yarn/releases/yarn-4.7.0.cjs b/.yarn/releases/yarn-4.7.0.cjs deleted file mode 100755 index 04022e16f..000000000 --- a/.yarn/releases/yarn-4.7.0.cjs +++ /dev/null @@ -1,935 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var j3e=Object.create;var gT=Object.defineProperty;var G3e=Object.getOwnPropertyDescriptor;var W3e=Object.getOwnPropertyNames;var Y3e=Object.getPrototypeOf,V3e=Object.prototype.hasOwnProperty;var ve=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var It=(t,e)=>()=>(t&&(e=t(t=0)),e);var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Vt=(t,e)=>{for(var r in e)gT(t,r,{get:e[r],enumerable:!0})},K3e=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of W3e(e))!V3e.call(t,a)&&a!==r&&gT(t,a,{get:()=>e[a],enumerable:!(o=G3e(e,a))||o.enumerable});return t};var et=(t,e,r)=>(r=t!=null?j3e(Y3e(t)):{},K3e(e||!t||!t.__esModule?gT(r,"default",{value:t,enumerable:!0}):r,t));var Si={};Vt(Si,{SAFE_TIME:()=>cW,S_IFDIR:()=>KD,S_IFLNK:()=>JD,S_IFMT:()=>Hu,S_IFREG:()=>ow});var Hu,KD,ow,JD,cW,uW=It(()=>{Hu=61440,KD=16384,ow=32768,JD=40960,cW=456789e3});var sr={};Vt(sr,{EBADF:()=>ho,EBUSY:()=>J3e,EEXIST:()=>t_e,EINVAL:()=>X3e,EISDIR:()=>e_e,ENOENT:()=>Z3e,ENOSYS:()=>z3e,ENOTDIR:()=>$3e,ENOTEMPTY:()=>n_e,EOPNOTSUPP:()=>i_e,EROFS:()=>r_e,ERR_DIR_CLOSED:()=>dT});function Nl(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function J3e(t){return Nl("EBUSY",t)}function z3e(t,e){return Nl("ENOSYS",`${t}, ${e}`)}function X3e(t){return Nl("EINVAL",`invalid argument, ${t}`)}function ho(t){return Nl("EBADF",`bad file descriptor, ${t}`)}function Z3e(t){return Nl("ENOENT",`no such file or directory, ${t}`)}function $3e(t){return Nl("ENOTDIR",`not a directory, ${t}`)}function e_e(t){return Nl("EISDIR",`illegal operation on a directory, ${t}`)}function t_e(t){return Nl("EEXIST",`file already exists, ${t}`)}function r_e(t){return Nl("EROFS",`read-only filesystem, ${t}`)}function n_e(t){return Nl("ENOTEMPTY",`directory not empty, ${t}`)}function i_e(t){return Nl("EOPNOTSUPP",`operation not supported, ${t}`)}function dT(){return Nl("ERR_DIR_CLOSED","Directory handle was closed")}var zD=It(()=>{});var wa={};Vt(wa,{BigIntStatsEntry:()=>cm,DEFAULT_MODE:()=>ET,DirEntry:()=>mT,StatEntry:()=>lm,areStatsEqual:()=>CT,clearStats:()=>XD,convertToBigIntStats:()=>o_e,makeDefaultStats:()=>AW,makeEmptyStats:()=>s_e});function AW(){return new lm}function s_e(){return XD(AW())}function XD(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):yT.types.isDate(r)&&(t[e]=new Date(0))}return t}function o_e(t){let e=new cm;for(let r in t)if(Object.hasOwn(t,r)){let o=t[r];typeof o=="number"?e[r]=BigInt(o):yT.types.isDate(o)&&(e[r]=new Date(o))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function CT(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,o=e;return!(r.atimeNs!==o.atimeNs||r.mtimeNs!==o.mtimeNs||r.ctimeNs!==o.ctimeNs||r.birthtimeNs!==o.birthtimeNs)}var yT,ET,mT,lm,cm,IT=It(()=>{yT=et(ve("util")),ET=33188,mT=class{constructor(){this.name="";this.path="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},lm=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=ET;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},cm=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(ET);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function A_e(t){let e,r;if(e=t.match(c_e))t=e[1];else if(r=t.match(u_e))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function f_e(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(a_e))?t=`/${e[1]}`:(r=t.match(l_e))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t}function ZD(t,e){return t===Ae?pW(e):wT(e)}var aw,Bt,mr,Ae,V,fW,a_e,l_e,c_e,u_e,wT,pW,Ba=It(()=>{aw=et(ve("path")),Bt={root:"/",dot:".",parent:".."},mr={home:"~",nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",pnpData:".pnp.data.json",pnpEsmLoader:".pnp.loader.mjs",rc:".yarnrc.yml",env:".env"},Ae=Object.create(aw.default),V=Object.create(aw.default.posix);Ae.cwd=()=>process.cwd();V.cwd=process.platform==="win32"?()=>wT(process.cwd()):process.cwd;process.platform==="win32"&&(V.resolve=(...t)=>t.length>0&&V.isAbsolute(t[0])?aw.default.posix.resolve(...t):aw.default.posix.resolve(V.cwd(),...t));fW=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};Ae.contains=(t,e)=>fW(Ae,t,e);V.contains=(t,e)=>fW(V,t,e);a_e=/^([a-zA-Z]:.*)$/,l_e=/^\/\/(\.\/)?(.*)$/,c_e=/^\/([a-zA-Z]:.*)$/,u_e=/^\/unc\/(\.dot\/)?(.*)$/;wT=process.platform==="win32"?f_e:t=>t,pW=process.platform==="win32"?A_e:t=>t;Ae.fromPortablePath=pW;Ae.toPortablePath=wT});async function $D(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.indexPath,{recursive:!0});let o=[];for(let a of r)for(let n of r)o.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(o),e.indexPath}async function hW(t,e,r,o,a){let n=t.pathUtils.normalize(e),u=r.pathUtils.normalize(o),A=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:H0,mtime:H0}:await r.lstatPromise(u);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await BT(A,p,t,n,r,u,{...a,didParentExist:!0});for(let w of A)await w();await Promise.all(p.map(w=>w()))}async function BT(t,e,r,o,a,n,u){let A=u.didParentExist?await gW(r,o):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=u.stableTime?{atime:H0,mtime:H0}:p,w;switch(!0){case p.isDirectory():w=await h_e(t,e,r,o,A,a,n,p,u);break;case p.isFile():w=await m_e(t,e,r,o,A,a,n,p,u);break;case p.isSymbolicLink():w=await y_e(t,e,r,o,A,a,n,p,u);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(u.linkStrategy?.type!=="HardlinkFromIndex"||!p.isFile())&&((w||A?.mtime?.getTime()!==E.getTime()||A?.atime?.getTime()!==h.getTime())&&(e.push(()=>r.lutimesPromise(o,h,E)),w=!0),(A===null||(A.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(o,p.mode&511)),w=!0)),w}async function gW(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function h_e(t,e,r,o,a,n,u,A,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(o,{mode:A.mode})}catch(D){if(D.code!=="EEXIST")throw D}}),h=!0);let E=await n.readdirPromise(u),w=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let D of E.sort())await BT(t,e,r,r.pathUtils.join(o,D),n,n.pathUtils.join(u,D),w)&&(h=!0);else(await Promise.all(E.map(async b=>{await BT(t,e,r,r.pathUtils.join(o,b),n,n.pathUtils.join(u,b),w)}))).some(b=>b)&&(h=!0);return h}async function g_e(t,e,r,o,a,n,u,A,p,h){let E=await n.checksumFilePromise(u,{algorithm:"sha1"}),w=420,D=A.mode&511,b=`${E}${D!==w?D.toString(8):""}`,C=r.pathUtils.join(h.indexPath,E.slice(0,2),`${b}.dat`),T;(ue=>(ue[ue.Lock=0]="Lock",ue[ue.Rename=1]="Rename"))(T||={});let N=1,U=await gW(r,C);if(a){let le=U&&a.dev===U.dev&&a.ino===U.ino,ce=U?.mtimeMs!==p_e;if(le&&ce&&h.autoRepair&&(N=0,U=null),!le)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1}let J=!U&&N===1?`${C}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,"0")}`:null,te=!1;return t.push(async()=>{if(!U&&(N===0&&await r.lockPromise(C,async()=>{let le=await n.readFilePromise(u);await r.writeFilePromise(C,le)}),N===1&&J)){let le=await n.readFilePromise(u);await r.writeFilePromise(J,le);try{await r.linkPromise(J,C)}catch(ce){if(ce.code==="EEXIST")te=!0,await r.unlinkPromise(J);else throw ce}}a||await r.linkPromise(C,o)}),e.push(async()=>{U||(await r.lutimesPromise(C,H0,H0),D!==w&&await r.chmodPromise(C,D)),J&&!te&&await r.unlinkPromise(J)}),!1}async function d_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(u);await r.writeFilePromise(o,h)}),!0}async function m_e(t,e,r,o,a,n,u,A,p){return p.linkStrategy?.type==="HardlinkFromIndex"?g_e(t,e,r,o,a,n,u,A,p,p.linkStrategy):d_e(t,e,r,o,a,n,u,A,p)}async function y_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(ZD(r.pathUtils,await n.readlinkPromise(u)),o)}),!0}var H0,p_e,vT=It(()=>{Ba();H0=new Date(456789e3*1e3),p_e=H0.getTime()});function eS(t,e,r,o){let a=()=>{let n=r.shift();if(typeof n>"u")return null;let u=t.pathUtils.join(e,n);return Object.assign(t.statSync(u),{name:n,path:void 0})};return new lw(e,a,o)}var lw,dW=It(()=>{zD();lw=class{constructor(e,r,o={}){this.path=e;this.nextDirent=r;this.opts=o;this.closed=!1}throwIfClosed(){if(this.closed)throw dT()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function mW(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var yW,tS,EW=It(()=>{yW=ve("events");IT();tS=class t extends yW.EventEmitter{constructor(r,o,{bigint:a=!1}={}){super();this.status="ready";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=o,this.bigint=a,this.lastStats=this.stat()}static create(r,o,a){let n=new t(r,o,a);return n.start(),n}start(){mW(this.status,"ready"),this.status="running",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit("change",this.lastStats,this.lastStats)},3)}stop(){mW(this.status,"running"),this.status="stopped",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit("stop")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let r=this.bigint?new cm:new lm;return XD(r)}}makeInterval(r){let o=setInterval(()=>{let a=this.stat(),n=this.lastStats;CT(a,n)||(this.lastStats=a,this.emit("change",a,n))},r.interval);return r.persistent?o:o.unref()}registerChangeListener(r,o){this.addListener("change",r),this.changeListeners.set(r,this.makeInterval(o))}unregisterChangeListener(r){this.removeListener("change",r);let o=this.changeListeners.get(r);typeof o<"u"&&clearInterval(o),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function um(t,e,r,o){let a,n,u,A;switch(typeof r){case"function":a=!1,n=!0,u=5007,A=r;break;default:({bigint:a=!1,persistent:n=!0,interval:u=5007}=r),A=o;break}let p=rS.get(t);typeof p>"u"&&rS.set(t,p=new Map);let h=p.get(e);return typeof h>"u"&&(h=tS.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(A,{persistent:n,interval:u}),h}function q0(t,e,r){let o=rS.get(t);if(typeof o>"u")return;let a=o.get(e);typeof a>"u"||(typeof r>"u"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),o.delete(e)))}function j0(t){let e=rS.get(t);if(!(typeof e>"u"))for(let r of e.keys())q0(t,r)}var rS,DT=It(()=>{EW();rS=new WeakMap});function E_e(t){let e=t.match(/\r?\n/g);if(e===null)return IW.EOL;let r=e.filter(a=>a===`\r -`).length,o=e.length-r;return r>o?`\r -`:` -`}function G0(t,e){return e.replace(/\r?\n/g,E_e(t))}var CW,IW,hf,qu,W0=It(()=>{CW=ve("crypto"),IW=ve("os");vT();Ba();hf=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let o=[e];for(;o.length>0;){let a=o.shift();if((await this.lstatPromise(a)).isDirectory()){let u=await this.readdirPromise(a);if(r)for(let A of u.sort())o.push(this.pathUtils.join(a,A));else throw new Error("Not supported")}else yield a}}async checksumFilePromise(e,{algorithm:r="sha512"}={}){let o=await this.openPromise(e,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,CW.createHash)(r),A=0;for(;(A=await this.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await this.closePromise(o)}}async removePromise(e,{recursive:r=!0,maxRetries:o=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(u=>this.removePromise(this.pathUtils.resolve(e,u))))}for(let n=0;n<=o;n++)try{await this.rmdirPromise(e);break}catch(u){if(u.code!=="EBUSY"&&u.code!=="ENOTEMPTY")throw u;nsetTimeout(A,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let o;try{o=this.lstatSync(e)}catch(a){if(a.code==="ENOENT")return;throw a}if(o.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{await this.mkdirPromise(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=A,r!=null&&await this.chmodPromise(A,r),o!=null)await this.utimesPromise(A,o[0],o[1]);else{let p=await this.statPromise(this.pathUtils.dirname(A));await this.utimesPromise(A,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{this.mkdirSync(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=A,r!=null&&this.chmodSync(A,r),o!=null)this.utimesSync(A,o[0],o[1]);else{let p=this.statSync(this.pathUtils.dirname(A));this.utimesSync(A,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:o=this,overwrite:a=!0,stableSort:n=!1,stableTime:u=!1,linkStrategy:A=null}={}){return await hW(this,e,o,r,{overwrite:a,stableSort:n,stableTime:u,linkStrategy:A})}copySync(e,r,{baseFs:o=this,overwrite:a=!0}={}){let n=o.lstatSync(r),u=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=o.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),o.pathUtils.join(r,h),{baseFs:o,overwrite:a})}else if(n.isFile()){if(!u||a){u&&this.removeSync(e);let p=o.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!u||a){u&&this.removeSync(e);let p=o.readlinkSync(r);this.symlinkSync(ZD(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);let A=n.mode&511;this.chmodSync(e,A)}async changeFilePromise(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,o):this.changeFileTextPromise(e,r,o)}async changeFileBufferPromise(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:o})}async changeFileTextPromise(e,r,{automaticNewlines:o,mode:a}={}){let n="";try{n=await this.readFilePromise(e,"utf8")}catch{}let u=o?G0(n,r):r;n!==u&&await this.writeFilePromise(e,u,{mode:a})}changeFileSync(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,o):this.changeFileTextSync(e,r,o)}changeFileBufferSync(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:o})}changeFileTextSync(e,r,{automaticNewlines:o=!1,mode:a}={}){let n="";try{n=this.readFileSync(e,"utf8")}catch{}let u=o?G0(n,r):r;n!==u&&this.writeFileSync(e,u,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(o){if(o.code==="EXDEV")await this.copyPromise(r,e),await this.removePromise(e);else throw o}}moveSync(e,r){try{this.renameSync(e,r)}catch(o){if(o.code==="EXDEV")this.copySync(r,e),this.removeSync(e);else throw o}}async lockPromise(e,r){let o=`${e}.flock`,a=1e3/60,n=Date.now(),u=null,A=async()=>{let p;try{[p]=await this.readJsonPromise(o)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;u===null;)try{u=await this.openPromise(o,"wx")}catch(p){if(p.code==="EEXIST"){if(!await A())try{await this.unlinkPromise(o);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${o})`)}else throw p}await this.writePromise(u,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(u),await this.unlinkPromise(o)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}async writeJsonPromise(e,r,{compact:o=!1}={}){let a=o?0:2;return await this.writeFilePromise(e,`${JSON.stringify(r,null,a)} -`)}writeJsonSync(e,r,{compact:o=!1}={}){let a=o?0:2;return this.writeFileSync(e,`${JSON.stringify(r,null,a)} -`)}async preserveTimePromise(e,r){let o=await this.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await this.lutimesPromise(e,o.atime,o.mtime)}async preserveTimeSync(e,r){let o=this.lstatSync(e),a=r();typeof a<"u"&&(e=a),this.lutimesSync(e,o.atime,o.mtime)}},qu=class extends hf{constructor(){super(V)}}});var ws,gf=It(()=>{W0();ws=class extends hf{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,o){return this.baseFs.openPromise(this.mapToBase(e),r,o)}openSync(e,r,o){return this.baseFs.openSync(this.mapToBase(e),r,o)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,o,a,n){return await this.baseFs.readPromise(e,r,o,a,n)}readSync(e,r,o,a,n){return this.baseFs.readSync(e,r,o,a,n)}async writePromise(e,r,o,a,n){return typeof r=="string"?await this.baseFs.writePromise(e,r,o):await this.baseFs.writePromise(e,r,o,a,n)}writeSync(e,r,o,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r,o):this.baseFs.writeSync(e,r,o,a,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async fchownPromise(e,r,o){return this.baseFs.fchownPromise(e,r,o)}fchownSync(e,r,o){return this.baseFs.fchownSync(e,r,o)}async chownPromise(e,r,o){return this.baseFs.chownPromise(this.mapToBase(e),r,o)}chownSync(e,r,o){return this.baseFs.chownSync(this.mapToBase(e),r,o)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,o=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),o)}copyFileSync(e,r,o=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),o)}async appendFilePromise(e,r,o){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,o)}appendFileSync(e,r,o){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,o)}async writeFilePromise(e,r,o){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,o)}writeFileSync(e,r,o){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,o)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,o){return this.baseFs.utimesPromise(this.mapToBase(e),r,o)}utimesSync(e,r,o){return this.baseFs.utimesSync(this.mapToBase(e),r,o)}async lutimesPromise(e,r,o){return this.baseFs.lutimesPromise(this.mapToBase(e),r,o)}lutimesSync(e,r,o){return this.baseFs.lutimesSync(this.mapToBase(e),r,o)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(u,a,o)}symlinkSync(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(u,a,o)}async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}watch(e,r,o){return this.baseFs.watch(this.mapToBase(e),r,o)}watchFile(e,r,o){return this.baseFs.watchFile(this.mapToBase(e),r,o)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}}});var ju,wW=It(()=>{gf();ju=class extends ws{constructor(e,{baseFs:r,pathUtils:o}){super(o),this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}}});function BW(t){let e=t;return typeof t.path=="string"&&(e.path=Ae.toPortablePath(t.path)),e}var vW,_n,Y0=It(()=>{vW=et(ve("fs"));W0();Ba();_n=class extends qu{constructor(e=vW.default){super(),this.realFs=e}getExtractHint(){return!1}getRealPath(){return Bt.root}resolve(e){return V.resolve(e)}async openPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.open(Ae.fromPortablePath(e),r,o,this.makeCallback(a,n))})}openSync(e,r,o){return this.realFs.openSync(Ae.fromPortablePath(e),r,o)}async opendirPromise(e,r){return await new Promise((o,a)=>{typeof r<"u"?this.realFs.opendir(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.opendir(Ae.fromPortablePath(e),this.makeCallback(o,a))}).then(o=>{let a=o;return Object.defineProperty(a,"path",{value:e,configurable:!0,writable:!0}),a})}opendirSync(e,r){let a=typeof r<"u"?this.realFs.opendirSync(Ae.fromPortablePath(e),r):this.realFs.opendirSync(Ae.fromPortablePath(e));return Object.defineProperty(a,"path",{value:e,configurable:!0,writable:!0}),a}async readPromise(e,r,o=0,a=0,n=-1){return await new Promise((u,A)=>{this.realFs.read(e,r,o,a,n,(p,h)=>{p?A(p):u(h)})})}readSync(e,r,o,a,n){return this.realFs.readSync(e,r,o,a,n)}async writePromise(e,r,o,a,n){return await new Promise((u,A)=>typeof r=="string"?this.realFs.write(e,r,o,this.makeCallback(u,A)):this.realFs.write(e,r,o,a,n,this.makeCallback(u,A)))}writeSync(e,r,o,a,n){return typeof r=="string"?this.realFs.writeSync(e,r,o):this.realFs.writeSync(e,r,o,a,n)}async closePromise(e){await new Promise((r,o)=>{this.realFs.close(e,this.makeCallback(r,o))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let o=e!==null?Ae.fromPortablePath(e):e;return this.realFs.createReadStream(o,r)}createWriteStream(e,r){let o=e!==null?Ae.fromPortablePath(e):e;return this.realFs.createWriteStream(o,r)}async realpathPromise(e){return await new Promise((r,o)=>{this.realFs.realpath(Ae.fromPortablePath(e),{},this.makeCallback(r,o))}).then(r=>Ae.toPortablePath(r))}realpathSync(e){return Ae.toPortablePath(this.realFs.realpathSync(Ae.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(Ae.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(Ae.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((o,a)=>{this.realFs.access(Ae.fromPortablePath(e),r,this.makeCallback(o,a))})}existsSync(e){return this.realFs.existsSync(Ae.fromPortablePath(e))}async statPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.stat(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.stat(Ae.fromPortablePath(e),this.makeCallback(o,a))})}statSync(e,r){return r?this.realFs.statSync(Ae.fromPortablePath(e),r):this.realFs.statSync(Ae.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.fstat(e,r,this.makeCallback(o,a)):this.realFs.fstat(e,this.makeCallback(o,a))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.lstat(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.lstat(Ae.fromPortablePath(e),this.makeCallback(o,a))})}lstatSync(e,r){return r?this.realFs.lstatSync(Ae.fromPortablePath(e),r):this.realFs.lstatSync(Ae.fromPortablePath(e))}async fchmodPromise(e,r){return await new Promise((o,a)=>{this.realFs.fchmod(e,r,this.makeCallback(o,a))})}fchmodSync(e,r){return this.realFs.fchmodSync(e,r)}async chmodPromise(e,r){return await new Promise((o,a)=>{this.realFs.chmod(Ae.fromPortablePath(e),r,this.makeCallback(o,a))})}chmodSync(e,r){return this.realFs.chmodSync(Ae.fromPortablePath(e),r)}async fchownPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.fchown(e,r,o,this.makeCallback(a,n))})}fchownSync(e,r,o){return this.realFs.fchownSync(e,r,o)}async chownPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.chown(Ae.fromPortablePath(e),r,o,this.makeCallback(a,n))})}chownSync(e,r,o){return this.realFs.chownSync(Ae.fromPortablePath(e),r,o)}async renamePromise(e,r){return await new Promise((o,a)=>{this.realFs.rename(Ae.fromPortablePath(e),Ae.fromPortablePath(r),this.makeCallback(o,a))})}renameSync(e,r){return this.realFs.renameSync(Ae.fromPortablePath(e),Ae.fromPortablePath(r))}async copyFilePromise(e,r,o=0){return await new Promise((a,n)=>{this.realFs.copyFile(Ae.fromPortablePath(e),Ae.fromPortablePath(r),o,this.makeCallback(a,n))})}copyFileSync(e,r,o=0){return this.realFs.copyFileSync(Ae.fromPortablePath(e),Ae.fromPortablePath(r),o)}async appendFilePromise(e,r,o){return await new Promise((a,n)=>{let u=typeof e=="string"?Ae.fromPortablePath(e):e;o?this.realFs.appendFile(u,r,o,this.makeCallback(a,n)):this.realFs.appendFile(u,r,this.makeCallback(a,n))})}appendFileSync(e,r,o){let a=typeof e=="string"?Ae.fromPortablePath(e):e;o?this.realFs.appendFileSync(a,r,o):this.realFs.appendFileSync(a,r)}async writeFilePromise(e,r,o){return await new Promise((a,n)=>{let u=typeof e=="string"?Ae.fromPortablePath(e):e;o?this.realFs.writeFile(u,r,o,this.makeCallback(a,n)):this.realFs.writeFile(u,r,this.makeCallback(a,n))})}writeFileSync(e,r,o){let a=typeof e=="string"?Ae.fromPortablePath(e):e;o?this.realFs.writeFileSync(a,r,o):this.realFs.writeFileSync(a,r)}async unlinkPromise(e){return await new Promise((r,o)=>{this.realFs.unlink(Ae.fromPortablePath(e),this.makeCallback(r,o))})}unlinkSync(e){return this.realFs.unlinkSync(Ae.fromPortablePath(e))}async utimesPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.utimes(Ae.fromPortablePath(e),r,o,this.makeCallback(a,n))})}utimesSync(e,r,o){this.realFs.utimesSync(Ae.fromPortablePath(e),r,o)}async lutimesPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.lutimes(Ae.fromPortablePath(e),r,o,this.makeCallback(a,n))})}lutimesSync(e,r,o){this.realFs.lutimesSync(Ae.fromPortablePath(e),r,o)}async mkdirPromise(e,r){return await new Promise((o,a)=>{this.realFs.mkdir(Ae.fromPortablePath(e),r,this.makeCallback(o,a))})}mkdirSync(e,r){return this.realFs.mkdirSync(Ae.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.rmdir(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.rmdir(Ae.fromPortablePath(e),this.makeCallback(o,a))})}rmdirSync(e,r){return this.realFs.rmdirSync(Ae.fromPortablePath(e),r)}async rmPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.rm(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.rm(Ae.fromPortablePath(e),this.makeCallback(o,a))})}rmSync(e,r){return this.realFs.rmSync(Ae.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((o,a)=>{this.realFs.link(Ae.fromPortablePath(e),Ae.fromPortablePath(r),this.makeCallback(o,a))})}linkSync(e,r){return this.realFs.linkSync(Ae.fromPortablePath(e),Ae.fromPortablePath(r))}async symlinkPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.symlink(Ae.fromPortablePath(e.replace(/\/+$/,"")),Ae.fromPortablePath(r),o,this.makeCallback(a,n))})}symlinkSync(e,r,o){return this.realFs.symlinkSync(Ae.fromPortablePath(e.replace(/\/+$/,"")),Ae.fromPortablePath(r),o)}async readFilePromise(e,r){return await new Promise((o,a)=>{let n=typeof e=="string"?Ae.fromPortablePath(e):e;this.realFs.readFile(n,r,this.makeCallback(o,a))})}readFileSync(e,r){let o=typeof e=="string"?Ae.fromPortablePath(e):e;return this.realFs.readFileSync(o,r)}async readdirPromise(e,r){return await new Promise((o,a)=>{r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdir(Ae.fromPortablePath(e),r,this.makeCallback(n=>o(n.map(BW)),a)):this.realFs.readdir(Ae.fromPortablePath(e),r,this.makeCallback(n=>o(n.map(Ae.toPortablePath)),a)):this.realFs.readdir(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.readdir(Ae.fromPortablePath(e),this.makeCallback(o,a))})}readdirSync(e,r){return r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdirSync(Ae.fromPortablePath(e),r).map(BW):this.realFs.readdirSync(Ae.fromPortablePath(e),r).map(Ae.toPortablePath):this.realFs.readdirSync(Ae.fromPortablePath(e),r):this.realFs.readdirSync(Ae.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,o)=>{this.realFs.readlink(Ae.fromPortablePath(e),this.makeCallback(r,o))}).then(r=>Ae.toPortablePath(r))}readlinkSync(e){return Ae.toPortablePath(this.realFs.readlinkSync(Ae.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((o,a)=>{this.realFs.truncate(Ae.fromPortablePath(e),r,this.makeCallback(o,a))})}truncateSync(e,r){return this.realFs.truncateSync(Ae.fromPortablePath(e),r)}async ftruncatePromise(e,r){return await new Promise((o,a)=>{this.realFs.ftruncate(e,r,this.makeCallback(o,a))})}ftruncateSync(e,r){return this.realFs.ftruncateSync(e,r)}watch(e,r,o){return this.realFs.watch(Ae.fromPortablePath(e),r,o)}watchFile(e,r,o){return this.realFs.watchFile(Ae.fromPortablePath(e),r,o)}unwatchFile(e,r){return this.realFs.unwatchFile(Ae.fromPortablePath(e),r)}makeCallback(e,r){return(o,a)=>{o?r(o):e(a)}}}});var En,DW=It(()=>{Y0();gf();Ba();En=class extends ws{constructor(e,{baseFs:r=new _n}={}){super(V),this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?V.normalize(e):this.baseFs.resolve(V.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}}});var SW,Gu,PW=It(()=>{Y0();gf();Ba();SW=Bt.root,Gu=class extends ws{constructor(e,{baseFs:r=new _n}={}){super(V),this.target=this.pathUtils.resolve(Bt.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Bt.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(SW,e));if(r.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(SW,this.pathUtils.relative(this.target,e))}}});var Am,xW=It(()=>{gf();Am=class extends ws{constructor(r,o){super(o);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var V0,va,Gp,bW=It(()=>{V0=ve("fs");W0();Y0();DT();zD();Ba();va=4278190080,Gp=class extends qu{constructor({baseFs:r=new _n,filter:o=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:u=!0,maxAge:A=5e3,typeCheck:p=V0.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:w}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error("The magic byte must be set to a round value between 1 and 127 included");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=u?new Map:null,this.factoryPromise=E,this.factorySync=w,this.filter=o,this.getMountPoint=h,this.magic=a<<24,this.maxAge=A,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(j0(this),this.mountInstances)for(let[r,{childFs:o}]of this.mountInstances.entries())o.saveAndClose?.(),this.mountInstances.delete(r)}discardAndClose(){if(j0(this),this.mountInstances)for(let[r,{childFs:o}]of this.mountInstances.entries())o.discardAndClose?.(),this.mountInstances.delete(r)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,o){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,o]),a}async openPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,o,a),async(n,{subPath:u})=>this.remapFd(n,await n.openPromise(u,o,a)))}openSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,o,a),(n,{subPath:u})=>this.remapFd(n,n.openSync(u,o,a)))}async opendirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,o),async(a,{subPath:n})=>await a.opendirPromise(n,o),{requireSubpath:!1})}opendirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,o),(a,{subPath:n})=>a.opendirSync(n,o),{requireSubpath:!1})}async readPromise(r,o,a,n,u){if((r&va)!==this.magic)return await this.baseFs.readPromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw ho("read");let[p,h]=A;return await p.readPromise(h,o,a,n,u)}readSync(r,o,a,n,u){if((r&va)!==this.magic)return this.baseFs.readSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw ho("readSync");let[p,h]=A;return p.readSync(h,o,a,n,u)}async writePromise(r,o,a,n,u){if((r&va)!==this.magic)return typeof o=="string"?await this.baseFs.writePromise(r,o,a):await this.baseFs.writePromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw ho("write");let[p,h]=A;return typeof o=="string"?await p.writePromise(h,o,a):await p.writePromise(h,o,a,n,u)}writeSync(r,o,a,n,u){if((r&va)!==this.magic)return typeof o=="string"?this.baseFs.writeSync(r,o,a):this.baseFs.writeSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw ho("writeSync");let[p,h]=A;return typeof o=="string"?p.writeSync(h,o,a):p.writeSync(h,o,a,n,u)}async closePromise(r){if((r&va)!==this.magic)return await this.baseFs.closePromise(r);let o=this.fdMap.get(r);if(typeof o>"u")throw ho("close");this.fdMap.delete(r);let[a,n]=o;return await a.closePromise(n)}closeSync(r){if((r&va)!==this.magic)return this.baseFs.closeSync(r);let o=this.fdMap.get(r);if(typeof o>"u")throw ho("closeSync");this.fdMap.delete(r);let[a,n]=o;return a.closeSync(n)}createReadStream(r,o){return r===null?this.baseFs.createReadStream(r,o):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,o),(a,{archivePath:n,subPath:u})=>{let A=a.createReadStream(u,o);return A.path=Ae.fromPortablePath(this.pathUtils.join(n,u)),A})}createWriteStream(r,o){return r===null?this.baseFs.createWriteStream(r,o):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,o),(a,{subPath:n})=>a.createWriteStream(n,o))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>"u"&&(u=await this.baseFs.realpathPromise(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(Bt.root,await o.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>"u"&&(u=this.baseFs.realpathSync(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(Bt.root,o.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(o,{subPath:a})=>await o.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(o,{subPath:a})=>o.existsSync(a))}async accessPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,o),async(a,{subPath:n})=>await a.accessPromise(n,o))}accessSync(r,o){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,o),(a,{subPath:n})=>a.accessSync(n,o))}async statPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,o),async(a,{subPath:n})=>await a.statPromise(n,o))}statSync(r,o){return this.makeCallSync(r,()=>this.baseFs.statSync(r,o),(a,{subPath:n})=>a.statSync(n,o))}async fstatPromise(r,o){if((r&va)!==this.magic)return this.baseFs.fstatPromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("fstat");let[n,u]=a;return n.fstatPromise(u,o)}fstatSync(r,o){if((r&va)!==this.magic)return this.baseFs.fstatSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("fstatSync");let[n,u]=a;return n.fstatSync(u,o)}async lstatPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,o),async(a,{subPath:n})=>await a.lstatPromise(n,o))}lstatSync(r,o){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,o),(a,{subPath:n})=>a.lstatSync(n,o))}async fchmodPromise(r,o){if((r&va)!==this.magic)return this.baseFs.fchmodPromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("fchmod");let[n,u]=a;return n.fchmodPromise(u,o)}fchmodSync(r,o){if((r&va)!==this.magic)return this.baseFs.fchmodSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("fchmodSync");let[n,u]=a;return n.fchmodSync(u,o)}async chmodPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,o),async(a,{subPath:n})=>await a.chmodPromise(n,o))}chmodSync(r,o){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,o),(a,{subPath:n})=>a.chmodSync(n,o))}async fchownPromise(r,o,a){if((r&va)!==this.magic)return this.baseFs.fchownPromise(r,o,a);let n=this.fdMap.get(r);if(typeof n>"u")throw ho("fchown");let[u,A]=n;return u.fchownPromise(A,o,a)}fchownSync(r,o,a){if((r&va)!==this.magic)return this.baseFs.fchownSync(r,o,a);let n=this.fdMap.get(r);if(typeof n>"u")throw ho("fchownSync");let[u,A]=n;return u.fchownSync(A,o,a)}async chownPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,o,a),async(n,{subPath:u})=>await n.chownPromise(u,o,a))}chownSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,o,a),(n,{subPath:u})=>n.chownSync(u,o,a))}async renamePromise(r,o){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.renamePromise(r,o),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(a,{subPath:n})=>await this.makeCallPromise(o,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await a.renamePromise(n,A)}))}renameSync(r,o){return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.renameSync(r,o),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(a,{subPath:n})=>this.makeCallSync(o,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return a.renameSync(n,A)}))}async copyFilePromise(r,o,a=0){let n=async(u,A,p,h)=>{if(a&V0.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:"EXDEV"});if(a&V0.constants.COPYFILE_EXCL&&await this.existsPromise(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:"EEXIST"});let E;try{E=await u.readFilePromise(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:"EINVAL"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.copyFilePromise(r,o,a),async(u,{subPath:A})=>await n(this.baseFs,r,u,A)),async(u,{subPath:A})=>await this.makeCallPromise(o,async()=>await n(u,A,this.baseFs,o),async(p,{subPath:h})=>u!==p?await n(u,A,p,h):await u.copyFilePromise(A,h,a)))}copyFileSync(r,o,a=0){let n=(u,A,p,h)=>{if(a&V0.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:"EXDEV"});if(a&V0.constants.COPYFILE_EXCL&&this.existsSync(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:"EEXIST"});let E;try{E=u.readFileSync(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:"EINVAL"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.copyFileSync(r,o,a),(u,{subPath:A})=>n(this.baseFs,r,u,A)),(u,{subPath:A})=>this.makeCallSync(o,()=>n(u,A,this.baseFs,o),(p,{subPath:h})=>u!==p?n(u,A,p,h):u.copyFileSync(A,h,a)))}async appendFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,o,a),async(n,{subPath:u})=>await n.appendFilePromise(u,o,a))}appendFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,o,a),(n,{subPath:u})=>n.appendFileSync(u,o,a))}async writeFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,o,a),async(n,{subPath:u})=>await n.writeFilePromise(u,o,a))}writeFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,o,a),(n,{subPath:u})=>n.writeFileSync(u,o,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(o,{subPath:a})=>await o.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(o,{subPath:a})=>o.unlinkSync(a))}async utimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,o,a),async(n,{subPath:u})=>await n.utimesPromise(u,o,a))}utimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,o,a),(n,{subPath:u})=>n.utimesSync(u,o,a))}async lutimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,o,a),async(n,{subPath:u})=>await n.lutimesPromise(u,o,a))}lutimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,o,a),(n,{subPath:u})=>n.lutimesSync(u,o,a))}async mkdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,o),async(a,{subPath:n})=>await a.mkdirPromise(n,o))}mkdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,o),(a,{subPath:n})=>a.mkdirSync(n,o))}async rmdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,o),async(a,{subPath:n})=>await a.rmdirPromise(n,o))}rmdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,o),(a,{subPath:n})=>a.rmdirSync(n,o))}async rmPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.rmPromise(r,o),async(a,{subPath:n})=>await a.rmPromise(n,o))}rmSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,o),(a,{subPath:n})=>a.rmSync(n,o))}async linkPromise(r,o){return await this.makeCallPromise(o,async()=>await this.baseFs.linkPromise(r,o),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,o){return this.makeCallSync(o,()=>this.baseFs.linkSync(r,o),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,o,a){return await this.makeCallPromise(o,async()=>await this.baseFs.symlinkPromise(r,o,a),async(n,{subPath:u})=>await n.symlinkPromise(r,u))}symlinkSync(r,o,a){return this.makeCallSync(o,()=>this.baseFs.symlinkSync(r,o,a),(n,{subPath:u})=>n.symlinkSync(r,u))}async readFilePromise(r,o){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,o),async(a,{subPath:n})=>await a.readFilePromise(n,o))}readFileSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,o),(a,{subPath:n})=>a.readFileSync(n,o))}async readdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,o),async(a,{subPath:n})=>await a.readdirPromise(n,o),{requireSubpath:!1})}readdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,o),(a,{subPath:n})=>a.readdirSync(n,o),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(o,{subPath:a})=>await o.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(o,{subPath:a})=>o.readlinkSync(a))}async truncatePromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,o),async(a,{subPath:n})=>await a.truncatePromise(n,o))}truncateSync(r,o){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,o),(a,{subPath:n})=>a.truncateSync(n,o))}async ftruncatePromise(r,o){if((r&va)!==this.magic)return this.baseFs.ftruncatePromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("ftruncate");let[n,u]=a;return n.ftruncatePromise(u,o)}ftruncateSync(r,o){if((r&va)!==this.magic)return this.baseFs.ftruncateSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("ftruncateSync");let[n,u]=a;return n.ftruncateSync(u,o)}watch(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,o,a),(n,{subPath:u})=>n.watch(u,o,a))}watchFile(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,o,a),()=>um(this,r,o,a))}unwatchFile(r,o){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,o),()=>q0(this,r,o))}async makeCallPromise(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return await o();let u=this.resolve(r),A=this.findMount(u);return A?n&&A.subPath==="/"?await o():await this.getMountPromise(A.archivePath,async p=>await a(p,A)):await o()}makeCallSync(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return o();let u=this.resolve(r),A=this.findMount(u);return!A||n&&A.subPath==="/"?o():this.getMountSync(A.archivePath,p=>a(p,A))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let o="";for(;;){let a=r.substring(o.length),n=this.getMountPoint(a,o);if(!n)return null;if(o=this.pathUtils.join(o,n),!this.isMount.has(o)){if(this.notMount.has(o))continue;try{if(this.typeCheck!==null&&(this.baseFs.statSync(o).mode&V0.constants.S_IFMT)!==this.typeCheck){this.notMount.add(o);continue}}catch{return null}this.isMount.add(o)}return{archivePath:o,subPath:this.pathUtils.join(Bt.root,r.substring(o.length))}}}limitOpenFiles(r){if(this.mountInstances===null)return;let o=Date.now(),a=o+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[u,{childFs:A,expiresAt:p,refCount:h}]of this.mountInstances.entries())if(!(h!==0||A.hasOpenFileHandles?.())){if(o>=p){A.saveAndClose?.(),this.mountInstances.delete(u),n-=1;continue}else if(r===null||n<=0){a=p;break}A.saveAndClose?.(),this.mountInstances.delete(u),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-o).unref())}async getMountPromise(r,o){if(this.mountInstances){let a=this.mountInstances.get(r);if(!a){let n=await this.factoryPromise(this.baseFs,r);a=this.mountInstances.get(r),a||(a={childFs:n(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,a.refCount+=1;try{return await o(a.childFs)}finally{a.refCount-=1}}else{let a=(await this.factoryPromise(this.baseFs,r))();try{return await o(a)}finally{a.saveAndClose?.()}}}getMountSync(r,o){if(this.mountInstances){let a=this.mountInstances.get(r);return a||(a={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,o(a.childFs)}else{let a=this.factorySync(this.baseFs,r);try{return o(a)}finally{a.saveAndClose?.()}}}}});var $t,nS,kW=It(()=>{W0();Ba();$t=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),nS=class t extends hf{static{this.instance=new t}constructor(){super(V)}getExtractHint(){throw $t()}getRealPath(){throw $t()}resolve(){throw $t()}async openPromise(){throw $t()}openSync(){throw $t()}async opendirPromise(){throw $t()}opendirSync(){throw $t()}async readPromise(){throw $t()}readSync(){throw $t()}async writePromise(){throw $t()}writeSync(){throw $t()}async closePromise(){throw $t()}closeSync(){throw $t()}createWriteStream(){throw $t()}createReadStream(){throw $t()}async realpathPromise(){throw $t()}realpathSync(){throw $t()}async readdirPromise(){throw $t()}readdirSync(){throw $t()}async existsPromise(e){throw $t()}existsSync(e){throw $t()}async accessPromise(){throw $t()}accessSync(){throw $t()}async statPromise(){throw $t()}statSync(){throw $t()}async fstatPromise(e){throw $t()}fstatSync(e){throw $t()}async lstatPromise(e){throw $t()}lstatSync(e){throw $t()}async fchmodPromise(){throw $t()}fchmodSync(){throw $t()}async chmodPromise(){throw $t()}chmodSync(){throw $t()}async fchownPromise(){throw $t()}fchownSync(){throw $t()}async chownPromise(){throw $t()}chownSync(){throw $t()}async mkdirPromise(){throw $t()}mkdirSync(){throw $t()}async rmdirPromise(){throw $t()}rmdirSync(){throw $t()}async rmPromise(){throw $t()}rmSync(){throw $t()}async linkPromise(){throw $t()}linkSync(){throw $t()}async symlinkPromise(){throw $t()}symlinkSync(){throw $t()}async renamePromise(){throw $t()}renameSync(){throw $t()}async copyFilePromise(){throw $t()}copyFileSync(){throw $t()}async appendFilePromise(){throw $t()}appendFileSync(){throw $t()}async writeFilePromise(){throw $t()}writeFileSync(){throw $t()}async unlinkPromise(){throw $t()}unlinkSync(){throw $t()}async utimesPromise(){throw $t()}utimesSync(){throw $t()}async lutimesPromise(){throw $t()}lutimesSync(){throw $t()}async readFilePromise(){throw $t()}readFileSync(){throw $t()}async readlinkPromise(){throw $t()}readlinkSync(){throw $t()}async truncatePromise(){throw $t()}truncateSync(){throw $t()}async ftruncatePromise(e,r){throw $t()}ftruncateSync(e,r){throw $t()}watch(){throw $t()}watchFile(){throw $t()}unwatchFile(){throw $t()}}});var Wp,QW=It(()=>{gf();Ba();Wp=class extends ws{constructor(e){super(Ae),this.baseFs=e}mapFromBase(e){return Ae.fromPortablePath(e)}mapToBase(e){return Ae.toPortablePath(e)}}});var C_e,ST,I_e,qs,FW=It(()=>{Y0();gf();Ba();C_e=/^[0-9]+$/,ST=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,I_e=/^([^/]+-)?[a-f0-9]+$/,qs=class t extends ws{static makeVirtualPath(e,r,o){if(V.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!V.basename(r).match(I_e))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let n=V.relative(V.dirname(e),o).split("/"),u=0;for(;u{PT=et(ve("buffer")),RW=ve("url"),TW=ve("util");gf();Ba();iS=class extends ws{constructor(e){super(Ae),this.baseFs=e}mapFromBase(e){return e}mapToBase(e){if(typeof e=="string")return e;if(e instanceof URL)return(0,RW.fileURLToPath)(e);if(Buffer.isBuffer(e)){let r=e.toString();if(!w_e(e,r))throw new Error("Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942");return r}throw new Error(`Unsupported path type: ${(0,TW.inspect)(e)}`)}}});var _W,go,df,Yp,sS,oS,fm,_c,Hc,NW,OW,MW,UW,cw,HW=It(()=>{_W=ve("readline"),go=Symbol("kBaseFs"),df=Symbol("kFd"),Yp=Symbol("kClosePromise"),sS=Symbol("kCloseResolve"),oS=Symbol("kCloseReject"),fm=Symbol("kRefs"),_c=Symbol("kRef"),Hc=Symbol("kUnref"),cw=class{constructor(e,r){this[UW]=1;this[MW]=void 0;this[OW]=void 0;this[NW]=void 0;this[go]=r,this[df]=e}get fd(){return this[df]}async appendFile(e,r){try{this[_c](this.appendFile);let o=(typeof r=="string"?r:r?.encoding)??void 0;return await this[go].appendFilePromise(this.fd,e,o?{encoding:o}:void 0)}finally{this[Hc]()}}async chown(e,r){try{return this[_c](this.chown),await this[go].fchownPromise(this.fd,e,r)}finally{this[Hc]()}}async chmod(e){try{return this[_c](this.chmod),await this[go].fchmodPromise(this.fd,e)}finally{this[Hc]()}}createReadStream(e){return this[go].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[go].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,r,o,a){try{this[_c](this.read);let n;return Buffer.isBuffer(e)?n=e:(e??={},n=e.buffer??Buffer.alloc(16384),r=e.offset||0,o=e.length??n.byteLength,a=e.position??null),r??=0,o??=0,o===0?{bytesRead:o,buffer:n}:{bytesRead:await this[go].readPromise(this.fd,n,r,o,a),buffer:n}}finally{this[Hc]()}}async readFile(e){try{this[_c](this.readFile);let r=(typeof e=="string"?e:e?.encoding)??void 0;return await this[go].readFilePromise(this.fd,r)}finally{this[Hc]()}}readLines(e){return(0,_W.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[_c](this.stat),await this[go].fstatPromise(this.fd,e)}finally{this[Hc]()}}async truncate(e){try{return this[_c](this.truncate),await this[go].ftruncatePromise(this.fd,e)}finally{this[Hc]()}}utimes(e,r){throw new Error("Method not implemented.")}async writeFile(e,r){try{this[_c](this.writeFile);let o=(typeof r=="string"?r:r?.encoding)??void 0;await this[go].writeFilePromise(this.fd,e,o)}finally{this[Hc]()}}async write(...e){try{if(this[_c](this.write),ArrayBuffer.isView(e[0])){let[r,o,a,n]=e;return{bytesWritten:await this[go].writePromise(this.fd,r,o??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,o,a]=e;return{bytesWritten:await this[go].writePromise(this.fd,r,o,a),buffer:r}}}finally{this[Hc]()}}async writev(e,r){try{this[_c](this.writev);let o=0;if(typeof r<"u")for(let a of e){let n=await this.write(a,void 0,void 0,r);o+=n.bytesWritten,r+=n.bytesWritten}else for(let a of e){let n=await this.write(a);o+=n.bytesWritten}return{buffers:e,bytesWritten:o}}finally{this[Hc]()}}readv(e,r){throw new Error("Method not implemented.")}close(){if(this[df]===-1)return Promise.resolve();if(this[Yp])return this[Yp];if(this[fm]--,this[fm]===0){let e=this[df];this[df]=-1,this[Yp]=this[go].closePromise(e).finally(()=>{this[Yp]=void 0})}else this[Yp]=new Promise((e,r)=>{this[sS]=e,this[oS]=r}).finally(()=>{this[Yp]=void 0,this[oS]=void 0,this[sS]=void 0});return this[Yp]}[(go,df,UW=fm,MW=Yp,OW=sS,NW=oS,_c)](e){if(this[df]===-1){let r=new Error("file closed");throw r.code="EBADF",r.syscall=e.name,r}this[fm]++}[Hc](){if(this[fm]--,this[fm]===0){let e=this[df];this[df]=-1,this[go].closePromise(e).then(this[sS],this[oS])}}}});function uw(t,e){e=new iS(e);let r=(o,a,n)=>{let u=o[a];o[a]=n,typeof u?.[pm.promisify.custom]<"u"&&(n[pm.promisify.custom]=u[pm.promisify.custom])};{r(t,"exists",(o,...a)=>{let u=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{e.existsPromise(o).then(A=>{u(A)},()=>{u(!1)})})}),r(t,"read",(...o)=>{let[a,n,u,A,p,h]=o;if(o.length<=3){let E={};o.length<3?h=o[1]:(E=o[1],h=o[2]),{buffer:n=Buffer.alloc(16384),offset:u=0,length:A=n.byteLength,position:p}=E}if(u==null&&(u=0),A|=0,A===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{e.readPromise(a,n,u,A,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let o of qW){let a=o.replace(/Promise$/,"");if(typeof t[a]>"u")continue;let n=e[o];if(typeof n>"u")continue;r(t,a,(...A)=>{let h=typeof A[A.length-1]=="function"?A.pop():()=>{};process.nextTick(()=>{n.apply(e,A).then(E=>{h(null,E)},E=>{h(E)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",o=>{try{return e.existsSync(o)}catch{return!1}}),r(t,"readSync",(...o)=>{let[a,n,u,A,p]=o;return o.length<=3&&({offset:u=0,length:A=n.byteLength,position:p}=o[2]||{}),u==null&&(u=0),A|=0,A===0?0:(p==null&&(p=-1),e.readSync(a,n,u,A,p))});for(let o of B_e){let a=o;if(typeof t[a]>"u")continue;let n=e[o];typeof n>"u"||r(t,a,n.bind(e))}t.realpathSync.native=t.realpathSync}{let o=t.promises;for(let a of qW){let n=a.replace(/Promise$/,"");if(typeof o[n]>"u")continue;let u=e[a];typeof u>"u"||a!=="open"&&r(o,n,(A,...p)=>A instanceof cw?A[n].apply(A,p):u.call(e,A,...p))}r(o,"open",async(...a)=>{let n=await e.openPromise(...a);return new cw(n,e)})}t.read[pm.promisify.custom]=async(o,a,...n)=>({bytesRead:await e.readPromise(o,a,...n),buffer:a}),t.write[pm.promisify.custom]=async(o,a,...n)=>({bytesWritten:await e.writePromise(o,a,...n),buffer:a})}function aS(t,e){let r=Object.create(t);return uw(r,e),r}var pm,B_e,qW,jW=It(()=>{pm=ve("util");LW();HW();B_e=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","fchownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","rmSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),qW=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","fchownPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","rmPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"])});function GW(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${t}${e}`}function WW(){if(xT)return xT;let t=Ae.toPortablePath(YW.default.tmpdir()),e=ae.realpathSync(t);return process.once("exit",()=>{ae.rmtempSync()}),xT={tmpdir:t,realTmpdir:e}}var YW,qc,xT,ae,VW=It(()=>{YW=et(ve("os"));Y0();Ba();qc=new Set,xT=null;ae=Object.assign(new _n,{detachTemp(t){qc.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=WW();for(;;){let o=GW("xfs-");try{this.mkdirSync(V.join(e,o))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=V.join(r,o);if(qc.add(a),typeof t>"u")return a;try{return t(a)}finally{if(qc.has(a)){qc.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=WW();for(;;){let o=GW("xfs-");try{await this.mkdirPromise(V.join(e,o))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=V.join(r,o);if(qc.add(a),typeof t>"u")return a;try{return await t(a)}finally{if(qc.has(a)){qc.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(qc.values()).map(async t=>{try{await ae.removePromise(t,{maxRetries:0}),qc.delete(t)}catch{}}))},rmtempSync(){for(let t of qc)try{ae.removeSync(t),qc.delete(t)}catch{}}})});var Aw={};Vt(Aw,{AliasFS:()=>ju,BasePortableFakeFS:()=>qu,CustomDir:()=>lw,CwdFS:()=>En,FakeFS:()=>hf,Filename:()=>mr,JailFS:()=>Gu,LazyFS:()=>Am,MountFS:()=>Gp,NoFS:()=>nS,NodeFS:()=>_n,PortablePath:()=>Bt,PosixFS:()=>Wp,ProxiedFS:()=>ws,VirtualFS:()=>qs,constants:()=>Si,errors:()=>sr,extendFs:()=>aS,normalizeLineEndings:()=>G0,npath:()=>Ae,opendir:()=>eS,patchFs:()=>uw,ppath:()=>V,setupCopyIndex:()=>$D,statUtils:()=>wa,unwatchAllFiles:()=>j0,unwatchFile:()=>q0,watchFile:()=>um,xfs:()=>ae});var St=It(()=>{uW();zD();IT();vT();dW();DT();W0();Ba();Ba();wW();W0();DW();PW();xW();bW();kW();Y0();QW();gf();FW();jW();VW()});var ZW=_((qPt,XW)=>{XW.exports=zW;zW.sync=D_e;var KW=ve("fs");function v_e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var o=0;o{rY.exports=eY;eY.sync=S_e;var $W=ve("fs");function eY(t,e,r){$W.stat(t,function(o,a){r(o,o?!1:tY(a,e))})}function S_e(t,e){return tY($W.statSync(t),e)}function tY(t,e){return t.isFile()&&P_e(t,e)}function P_e(t,e){var r=t.mode,o=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),u=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),A=parseInt("100",8),p=parseInt("010",8),h=parseInt("001",8),E=A|p,w=r&h||r&p&&a===u||r&A&&o===n||r&E&&n===0;return w}});var sY=_((WPt,iY)=>{var GPt=ve("fs"),lS;process.platform==="win32"||global.TESTING_WINDOWS?lS=ZW():lS=nY();iY.exports=bT;bT.sync=x_e;function bT(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(o,a){bT(t,e||{},function(n,u){n?a(n):o(u)})})}lS(t,e||{},function(o,a){o&&(o.code==="EACCES"||e&&e.ignoreErrors)&&(o=null,a=!1),r(o,a)})}function x_e(t,e){try{return lS.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var fY=_((YPt,AY)=>{var hm=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",oY=ve("path"),b_e=hm?";":":",aY=sY(),lY=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),cY=(t,e)=>{let r=e.colon||b_e,o=t.match(/\//)||hm&&t.match(/\\/)?[""]:[...hm?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],a=hm?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=hm?a.split(r):[""];return hm&&t.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:o,pathExt:n,pathExtExe:a}},uY=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:o,pathExt:a,pathExtExe:n}=cY(t,e),u=[],A=h=>new Promise((E,w)=>{if(h===o.length)return e.all&&u.length?E(u):w(lY(t));let D=o[h],b=/^".*"$/.test(D)?D.slice(1,-1):D,C=oY.join(b,t),T=!b&&/^\.[\\\/]/.test(t)?t.slice(0,2)+C:C;E(p(T,h,0))}),p=(h,E,w)=>new Promise((D,b)=>{if(w===a.length)return D(A(E+1));let C=a[w];aY(h+C,{pathExt:n},(T,N)=>{if(!T&&N)if(e.all)u.push(h+C);else return D(h+C);return D(p(h,E,w+1))})});return r?A(0).then(h=>r(null,h),r):A(0)},k_e=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:o,pathExtExe:a}=cY(t,e),n=[];for(let u=0;u{"use strict";var pY=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"};kT.exports=pY;kT.exports.default=pY});var yY=_((KPt,mY)=>{"use strict";var gY=ve("path"),Q_e=fY(),F_e=hY();function dY(t,e){let r=t.options.env||process.env,o=process.cwd(),a=t.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(t.options.cwd)}catch{}let u;try{u=Q_e.sync(t.command,{path:r[F_e({env:r})],pathExt:e?gY.delimiter:void 0})}catch{}finally{n&&process.chdir(o)}return u&&(u=gY.resolve(a?t.options.cwd:"",u)),u}function R_e(t){return dY(t)||dY(t,!0)}mY.exports=R_e});var EY=_((JPt,FT)=>{"use strict";var QT=/([()\][%!^"`<>&|;, *?])/g;function T_e(t){return t=t.replace(QT,"^$1"),t}function L_e(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),t=t.replace(/(?=(\\+?)?)\1$/,"$1$1"),t=`"${t}"`,t=t.replace(QT,"^$1"),e&&(t=t.replace(QT,"^$1")),t}FT.exports.command=T_e;FT.exports.argument=L_e});var IY=_((zPt,CY)=>{"use strict";CY.exports=/^#!(.*)/});var BY=_((XPt,wY)=>{"use strict";var N_e=IY();wY.exports=(t="")=>{let e=t.match(N_e);if(!e)return null;let[r,o]=e[0].replace(/#! ?/,"").split(" "),a=r.split("/").pop();return a==="env"?o:o?`${a} ${o}`:a}});var DY=_((ZPt,vY)=>{"use strict";var RT=ve("fs"),O_e=BY();function M_e(t){let r=Buffer.alloc(150),o;try{o=RT.openSync(t,"r"),RT.readSync(o,r,0,150,0),RT.closeSync(o)}catch{}return O_e(r.toString())}vY.exports=M_e});var bY=_(($Pt,xY)=>{"use strict";var U_e=ve("path"),SY=yY(),PY=EY(),__e=DY(),H_e=process.platform==="win32",q_e=/\.(?:com|exe)$/i,j_e=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function G_e(t){t.file=SY(t);let e=t.file&&__e(t.file);return e?(t.args.unshift(t.file),t.command=e,SY(t)):t.file}function W_e(t){if(!H_e)return t;let e=G_e(t),r=!q_e.test(e);if(t.options.forceShell||r){let o=j_e.test(e);t.command=U_e.normalize(t.command),t.command=PY.command(t.command),t.args=t.args.map(n=>PY.argument(n,o));let a=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${a}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function Y_e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let o={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?o:W_e(o)}xY.exports=Y_e});var FY=_((ext,QY)=>{"use strict";var TT=process.platform==="win32";function LT(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function V_e(t,e){if(!TT)return;let r=t.emit;t.emit=function(o,a){if(o==="exit"){let n=kY(a,e);if(n)return r.call(t,"error",n)}return r.apply(t,arguments)}}function kY(t,e){return TT&&t===1&&!e.file?LT(e.original,"spawn"):null}function K_e(t,e){return TT&&t===1&&!e.file?LT(e.original,"spawnSync"):null}QY.exports={hookChildProcess:V_e,verifyENOENT:kY,verifyENOENTSync:K_e,notFoundError:LT}});var MT=_((txt,gm)=>{"use strict";var RY=ve("child_process"),NT=bY(),OT=FY();function TY(t,e,r){let o=NT(t,e,r),a=RY.spawn(o.command,o.args,o.options);return OT.hookChildProcess(a,o),a}function J_e(t,e,r){let o=NT(t,e,r),a=RY.spawnSync(o.command,o.args,o.options);return a.error=a.error||OT.verifyENOENTSync(a.status,o),a}gm.exports=TY;gm.exports.spawn=TY;gm.exports.sync=J_e;gm.exports._parse=NT;gm.exports._enoent=OT});var NY=_((rxt,LY)=>{"use strict";function z_e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function K0(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,K0)}z_e(K0,Error);K0.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,D=1;w>",P=cr(">>",!1),y=">&",R=cr(">&",!1),z=">",X=cr(">",!1),$="<<<",se=cr("<<<",!1),be="<&",Fe=cr("<&",!1),lt="<",Et=cr("<",!1),qt=function(L){return{type:"argument",segments:[].concat(...L)}},nr=function(L){return L},Pt="$'",cn=cr("$'",!1),Sr="'",yr=cr("'",!1),Rr=function(L){return[{type:"text",text:L}]},Xr='""',$n=cr('""',!1),Xs=function(){return{type:"text",text:""}},Hi='"',Qs=cr('"',!1),Zs=function(L){return L},bi=function(L){return{type:"arithmetic",arithmetic:L,quoted:!0}},Fs=function(L){return{type:"shell",shell:L,quoted:!0}},$s=function(L){return{type:"variable",...L,quoted:!0}},PA=function(L){return{type:"text",text:L}},gu=function(L){return{type:"arithmetic",arithmetic:L,quoted:!1}},op=function(L){return{type:"shell",shell:L,quoted:!1}},ap=function(L){return{type:"variable",...L,quoted:!1}},Rs=function(L){return{type:"glob",pattern:L}},Nn=/^[^']/,hs=Ni(["'"],!0,!1),Ts=function(L){return L.join("")},pc=/^[^$"]/,hc=Ni(["$",'"'],!0,!1),gc=`\\ -`,xA=cr(`\\ -`,!1),bA=function(){return""},Ro="\\",To=cr("\\",!1),kA=/^[\\$"`]/,pr=Ni(["\\","$",'"',"`"],!1,!1),Me=function(L){return L},ia="\\a",dc=cr("\\a",!1),Er=function(){return"a"},du="\\b",QA=cr("\\b",!1),FA=function(){return"\b"},mc=/^[Ee]/,yc=Ni(["E","e"],!1,!1),Il=function(){return"\x1B"},we="\\f",Tt=cr("\\f",!1),wl=function(){return"\f"},Bi="\\n",Ls=cr("\\n",!1),Ft=function(){return` -`},Bn="\\r",Lo=cr("\\r",!1),ki=function(){return"\r"},vi="\\t",sa=cr("\\t",!1),un=function(){return" "},qn="\\v",Ec=cr("\\v",!1),lp=function(){return"\v"},oa=/^[\\'"?]/,aa=Ni(["\\","'",'"',"?"],!1,!1),la=function(L){return String.fromCharCode(parseInt(L,16))},Ze="\\x",ca=cr("\\x",!1),mu="\\u",Bl=cr("\\u",!1),dn="\\U",No=cr("\\U",!1),RA=function(L){return String.fromCodePoint(parseInt(L,16))},TA=/^[0-7]/,Oo=Ni([["0","7"]],!1,!1),qa=/^[0-9a-fA-f]/,Ot=Ni([["0","9"],["a","f"],["A","f"]],!1,!1),vn=Iu(),Mo="{}",ua=cr("{}",!1),qi=function(){return"{}"},vl="-",Cc=cr("-",!1),Dl="+",Aa=cr("+",!1),Di=".",rs=cr(".",!1),ja=function(L,K,re){return{type:"number",value:(L==="-"?-1:1)*parseFloat(K.join("")+"."+re.join(""))}},yu=function(L,K){return{type:"number",value:(L==="-"?-1:1)*parseInt(K.join(""))}},Sl=function(L){return{type:"variable",...L}},pi=function(L){return{type:"variable",name:L}},Dn=function(L){return L},Pl="*",Je=cr("*",!1),st="/",vt=cr("/",!1),ar=function(L,K,re){return{type:K==="*"?"multiplication":"division",right:re}},ee=function(L,K){return K.reduce((re,ge)=>({left:re,...ge}),L)},ye=function(L,K,re){return{type:K==="+"?"addition":"subtraction",right:re}},Ne="$((",gt=cr("$((",!1),mt="))",Dt=cr("))",!1),er=function(L){return L},sn="$(",ei=cr("$(",!1),Qi=function(L){return L},Sn="${",fa=cr("${",!1),wd=":-",BI=cr(":-",!1),eo=function(L,K){return{name:L,defaultValue:K}},Bd=":-}",cp=cr(":-}",!1),vI=function(L){return{name:L,defaultValue:[]}},to=":+",up=cr(":+",!1),Ap=function(L,K){return{name:L,alternativeValue:K}},Ic=":+}",fp=cr(":+}",!1),s0=function(L){return{name:L,alternativeValue:[]}},o0=function(L){return{name:L}},a0="$",vd=cr("$",!1),Eu=function(L){return e.isGlobPattern(L)},ro=function(L){return L},Ga=/^[a-zA-Z0-9_]/,pp=Ni([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),l0=function(){return xd()},Wa=/^[$@*?#a-zA-Z0-9_\-]/,Ya=Ni(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),Dd=/^[()}<>$|&; \t"']/,LA=Ni(["(",")","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Sd=/^[<>&; \t"']/,Pd=Ni(["<",">","&",";"," "," ",'"',"'"],!1,!1),NA=/^[ \t]/,OA=Ni([" "," "],!1,!1),W=0,xt=0,MA=[{line:1,column:1}],no=0,Cu=[],dt=0,wc;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function xd(){return t.substring(xt,W)}function c0(){return wu(xt,W)}function DI(L,K){throw K=K!==void 0?K:wu(xt,W),UA([u0(L)],t.substring(xt,W),K)}function hp(L,K){throw K=K!==void 0?K:wu(xt,W),oi(L,K)}function cr(L,K){return{type:"literal",text:L,ignoreCase:K}}function Ni(L,K,re){return{type:"class",parts:L,inverted:K,ignoreCase:re}}function Iu(){return{type:"any"}}function pa(){return{type:"end"}}function u0(L){return{type:"other",description:L}}function Bc(L){var K=MA[L],re;if(K)return K;for(re=L-1;!MA[re];)re--;for(K=MA[re],K={line:K.line,column:K.column};reno&&(no=W,Cu=[]),Cu.push(L))}function oi(L,K){return new K0(L,null,null,K)}function UA(L,K,re){return new K0(K0.buildMessage(L,K),L,K,re)}function ha(){var L,K,re;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();return K!==r?(re=Uo(),re===r&&(re=null),re!==r?(xt=L,K=n(re),L=K):(W=L,L=r)):(W=L,L=r),L}function Uo(){var L,K,re,ge,Ye;if(L=W,K=gp(),K!==r){for(re=[],ge=bt();ge!==r;)re.push(ge),ge=bt();re!==r?(ge=A0(),ge!==r?(Ye=ga(),Ye===r&&(Ye=null),Ye!==r?(xt=L,K=u(K,ge,Ye),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)}else W=L,L=r;if(L===r)if(L=W,K=gp(),K!==r){for(re=[],ge=bt();ge!==r;)re.push(ge),ge=bt();re!==r?(ge=A0(),ge===r&&(ge=null),ge!==r?(xt=L,K=A(K,ge),L=K):(W=L,L=r)):(W=L,L=r)}else W=L,L=r;return L}function ga(){var L,K,re,ge,Ye;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r)if(re=Uo(),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();ge!==r?(xt=L,K=p(re),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r;return L}function A0(){var L;return t.charCodeAt(W)===59?(L=h,W++):(L=r,dt===0&&wt(E)),L===r&&(t.charCodeAt(W)===38?(L=w,W++):(L=r,dt===0&&wt(D))),L}function gp(){var L,K,re;return L=W,K=_A(),K!==r?(re=f0(),re===r&&(re=null),re!==r?(xt=L,K=b(K,re),L=K):(W=L,L=r)):(W=L,L=r),L}function f0(){var L,K,re,ge,Ye,At,hr;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r)if(re=bd(),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();if(ge!==r)if(Ye=gp(),Ye!==r){for(At=[],hr=bt();hr!==r;)At.push(hr),hr=bt();At!==r?(xt=L,K=C(re,Ye),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r;return L}function bd(){var L;return t.substr(W,2)===T?(L=T,W+=2):(L=r,dt===0&&wt(N)),L===r&&(t.substr(W,2)===U?(L=U,W+=2):(L=r,dt===0&&wt(J))),L}function _A(){var L,K,re;return L=W,K=Bu(),K!==r?(re=p0(),re===r&&(re=null),re!==r?(xt=L,K=te(K,re),L=K):(W=L,L=r)):(W=L,L=r),L}function p0(){var L,K,re,ge,Ye,At,hr;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r)if(re=vc(),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();if(ge!==r)if(Ye=_A(),Ye!==r){for(At=[],hr=bt();hr!==r;)At.push(hr),hr=bt();At!==r?(xt=L,K=le(re,Ye),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r;return L}function vc(){var L;return t.substr(W,2)===ce?(L=ce,W+=2):(L=r,dt===0&&wt(ue)),L===r&&(t.charCodeAt(W)===124?(L=Ie,W++):(L=r,dt===0&&wt(he))),L}function Dc(){var L,K,re,ge,Ye,At;if(L=W,K=yp(),K!==r)if(t.charCodeAt(W)===61?(re=De,W++):(re=r,dt===0&&wt(Ee)),re!==r)if(ge=HA(),ge!==r){for(Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();Ye!==r?(xt=L,K=g(K,ge),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r;else W=L,L=r;if(L===r)if(L=W,K=yp(),K!==r)if(t.charCodeAt(W)===61?(re=De,W++):(re=r,dt===0&&wt(Ee)),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();ge!==r?(xt=L,K=me(K),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r;return L}function Bu(){var L,K,re,ge,Ye,At,hr,Ir,Rn,ai,ns;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r)if(t.charCodeAt(W)===40?(re=Ce,W++):(re=r,dt===0&&wt(fe)),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();if(ge!==r)if(Ye=Uo(),Ye!==r){for(At=[],hr=bt();hr!==r;)At.push(hr),hr=bt();if(At!==r)if(t.charCodeAt(W)===41?(hr=ie,W++):(hr=r,dt===0&&wt(Z)),hr!==r){for(Ir=[],Rn=bt();Rn!==r;)Ir.push(Rn),Rn=bt();if(Ir!==r){for(Rn=[],ai=On();ai!==r;)Rn.push(ai),ai=On();if(Rn!==r){for(ai=[],ns=bt();ns!==r;)ai.push(ns),ns=bt();ai!==r?(xt=L,K=Se(Ye,Rn),L=K):(W=L,L=r)}else W=L,L=r}else W=L,L=r}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r;if(L===r){for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r)if(t.charCodeAt(W)===123?(re=Re,W++):(re=r,dt===0&&wt(ht)),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();if(ge!==r)if(Ye=Uo(),Ye!==r){for(At=[],hr=bt();hr!==r;)At.push(hr),hr=bt();if(At!==r)if(t.charCodeAt(W)===125?(hr=q,W++):(hr=r,dt===0&&wt(nt)),hr!==r){for(Ir=[],Rn=bt();Rn!==r;)Ir.push(Rn),Rn=bt();if(Ir!==r){for(Rn=[],ai=On();ai!==r;)Rn.push(ai),ai=On();if(Rn!==r){for(ai=[],ns=bt();ns!==r;)ai.push(ns),ns=bt();ai!==r?(xt=L,K=Le(Ye,Rn),L=K):(W=L,L=r)}else W=L,L=r}else W=L,L=r}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r;if(L===r){for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r){for(re=[],ge=Dc();ge!==r;)re.push(ge),ge=Dc();if(re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();if(ge!==r){if(Ye=[],At=Sc(),At!==r)for(;At!==r;)Ye.push(At),At=Sc();else Ye=r;if(Ye!==r){for(At=[],hr=bt();hr!==r;)At.push(hr),hr=bt();At!==r?(xt=L,K=Te(re,Ye),L=K):(W=L,L=r)}else W=L,L=r}else W=L,L=r}else W=L,L=r}else W=L,L=r;if(L===r){for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r){if(re=[],ge=Dc(),ge!==r)for(;ge!==r;)re.push(ge),ge=Dc();else re=r;if(re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();ge!==r?(xt=L,K=ke(re),L=K):(W=L,L=r)}else W=L,L=r}else W=L,L=r}}}return L}function gs(){var L,K,re,ge,Ye;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r){if(re=[],ge=Ci(),ge!==r)for(;ge!==r;)re.push(ge),ge=Ci();else re=r;if(re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();ge!==r?(xt=L,K=Ke(re),L=K):(W=L,L=r)}else W=L,L=r}else W=L,L=r;return L}function Sc(){var L,K,re;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r?(re=On(),re!==r?(xt=L,K=xe(re),L=K):(W=L,L=r)):(W=L,L=r),L===r){for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();K!==r?(re=Ci(),re!==r?(xt=L,K=xe(re),L=K):(W=L,L=r)):(W=L,L=r)}return L}function On(){var L,K,re,ge,Ye;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();return K!==r?(tt.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(He)),re===r&&(re=null),re!==r?(ge=ji(),ge!==r?(Ye=Ci(),Ye!==r?(xt=L,K=x(re,ge,Ye),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L}function ji(){var L;return t.substr(W,2)===I?(L=I,W+=2):(L=r,dt===0&&wt(P)),L===r&&(t.substr(W,2)===y?(L=y,W+=2):(L=r,dt===0&&wt(R)),L===r&&(t.charCodeAt(W)===62?(L=z,W++):(L=r,dt===0&&wt(X)),L===r&&(t.substr(W,3)===$?(L=$,W+=3):(L=r,dt===0&&wt(se)),L===r&&(t.substr(W,2)===be?(L=be,W+=2):(L=r,dt===0&&wt(Fe)),L===r&&(t.charCodeAt(W)===60?(L=lt,W++):(L=r,dt===0&&wt(Et))))))),L}function Ci(){var L,K,re;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();return K!==r?(re=HA(),re!==r?(xt=L,K=xe(re),L=K):(W=L,L=r)):(W=L,L=r),L}function HA(){var L,K,re;if(L=W,K=[],re=vu(),re!==r)for(;re!==r;)K.push(re),re=vu();else K=r;return K!==r&&(xt=L,K=qt(K)),L=K,L}function vu(){var L,K;return L=W,K=An(),K!==r&&(xt=L,K=nr(K)),L=K,L===r&&(L=W,K=h0(),K!==r&&(xt=L,K=nr(K)),L=K,L===r&&(L=W,K=g0(),K!==r&&(xt=L,K=nr(K)),L=K,L===r&&(L=W,K=Gi(),K!==r&&(xt=L,K=nr(K)),L=K))),L}function An(){var L,K,re,ge;return L=W,t.substr(W,2)===Pt?(K=Pt,W+=2):(K=r,dt===0&&wt(cn)),K!==r?(re=fn(),re!==r?(t.charCodeAt(W)===39?(ge=Sr,W++):(ge=r,dt===0&&wt(yr)),ge!==r?(xt=L,K=Rr(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L}function h0(){var L,K,re,ge;return L=W,t.charCodeAt(W)===39?(K=Sr,W++):(K=r,dt===0&&wt(yr)),K!==r?(re=Du(),re!==r?(t.charCodeAt(W)===39?(ge=Sr,W++):(ge=r,dt===0&&wt(yr)),ge!==r?(xt=L,K=Rr(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L}function g0(){var L,K,re,ge;if(L=W,t.substr(W,2)===Xr?(K=Xr,W+=2):(K=r,dt===0&&wt($n)),K!==r&&(xt=L,K=Xs()),L=K,L===r)if(L=W,t.charCodeAt(W)===34?(K=Hi,W++):(K=r,dt===0&&wt(Qs)),K!==r){for(re=[],ge=Va();ge!==r;)re.push(ge),ge=Va();re!==r?(t.charCodeAt(W)===34?(ge=Hi,W++):(ge=r,dt===0&&wt(Qs)),ge!==r?(xt=L,K=Zs(re),L=K):(W=L,L=r)):(W=L,L=r)}else W=L,L=r;return L}function Gi(){var L,K,re;if(L=W,K=[],re=io(),re!==r)for(;re!==r;)K.push(re),re=io();else K=r;return K!==r&&(xt=L,K=Zs(K)),L=K,L}function Va(){var L,K;return L=W,K=Vr(),K!==r&&(xt=L,K=bi(K)),L=K,L===r&&(L=W,K=mp(),K!==r&&(xt=L,K=Fs(K)),L=K,L===r&&(L=W,K=jA(),K!==r&&(xt=L,K=$s(K)),L=K,L===r&&(L=W,K=Su(),K!==r&&(xt=L,K=PA(K)),L=K))),L}function io(){var L,K;return L=W,K=Vr(),K!==r&&(xt=L,K=gu(K)),L=K,L===r&&(L=W,K=mp(),K!==r&&(xt=L,K=op(K)),L=K,L===r&&(L=W,K=jA(),K!==r&&(xt=L,K=ap(K)),L=K,L===r&&(L=W,K=kd(),K!==r&&(xt=L,K=Rs(K)),L=K,L===r&&(L=W,K=dp(),K!==r&&(xt=L,K=PA(K)),L=K)))),L}function Du(){var L,K,re;for(L=W,K=[],Nn.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hs));re!==r;)K.push(re),Nn.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hs));return K!==r&&(xt=L,K=Ts(K)),L=K,L}function Su(){var L,K,re;if(L=W,K=[],re=Ka(),re===r&&(pc.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hc))),re!==r)for(;re!==r;)K.push(re),re=Ka(),re===r&&(pc.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hc)));else K=r;return K!==r&&(xt=L,K=Ts(K)),L=K,L}function Ka(){var L,K,re;return L=W,t.substr(W,2)===gc?(K=gc,W+=2):(K=r,dt===0&&wt(xA)),K!==r&&(xt=L,K=bA()),L=K,L===r&&(L=W,t.charCodeAt(W)===92?(K=Ro,W++):(K=r,dt===0&&wt(To)),K!==r?(kA.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(pr)),re!==r?(xt=L,K=Me(re),L=K):(W=L,L=r)):(W=L,L=r)),L}function fn(){var L,K,re;for(L=W,K=[],re=so(),re===r&&(Nn.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hs)));re!==r;)K.push(re),re=so(),re===r&&(Nn.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hs)));return K!==r&&(xt=L,K=Ts(K)),L=K,L}function so(){var L,K,re;return L=W,t.substr(W,2)===ia?(K=ia,W+=2):(K=r,dt===0&&wt(dc)),K!==r&&(xt=L,K=Er()),L=K,L===r&&(L=W,t.substr(W,2)===du?(K=du,W+=2):(K=r,dt===0&&wt(QA)),K!==r&&(xt=L,K=FA()),L=K,L===r&&(L=W,t.charCodeAt(W)===92?(K=Ro,W++):(K=r,dt===0&&wt(To)),K!==r?(mc.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(yc)),re!==r?(xt=L,K=Il(),L=K):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===we?(K=we,W+=2):(K=r,dt===0&&wt(Tt)),K!==r&&(xt=L,K=wl()),L=K,L===r&&(L=W,t.substr(W,2)===Bi?(K=Bi,W+=2):(K=r,dt===0&&wt(Ls)),K!==r&&(xt=L,K=Ft()),L=K,L===r&&(L=W,t.substr(W,2)===Bn?(K=Bn,W+=2):(K=r,dt===0&&wt(Lo)),K!==r&&(xt=L,K=ki()),L=K,L===r&&(L=W,t.substr(W,2)===vi?(K=vi,W+=2):(K=r,dt===0&&wt(sa)),K!==r&&(xt=L,K=un()),L=K,L===r&&(L=W,t.substr(W,2)===qn?(K=qn,W+=2):(K=r,dt===0&&wt(Ec)),K!==r&&(xt=L,K=lp()),L=K,L===r&&(L=W,t.charCodeAt(W)===92?(K=Ro,W++):(K=r,dt===0&&wt(To)),K!==r?(oa.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(aa)),re!==r?(xt=L,K=Me(re),L=K):(W=L,L=r)):(W=L,L=r),L===r&&(L=Pc()))))))))),L}function Pc(){var L,K,re,ge,Ye,At,hr,Ir,Rn,ai,ns,GA;return L=W,t.charCodeAt(W)===92?(K=Ro,W++):(K=r,dt===0&&wt(To)),K!==r?(re=_o(),re!==r?(xt=L,K=la(re),L=K):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===Ze?(K=Ze,W+=2):(K=r,dt===0&&wt(ca)),K!==r?(re=W,ge=W,Ye=_o(),Ye!==r?(At=ds(),At!==r?(Ye=[Ye,At],ge=Ye):(W=ge,ge=r)):(W=ge,ge=r),ge===r&&(ge=_o()),ge!==r?re=t.substring(re,W):re=ge,re!==r?(xt=L,K=la(re),L=K):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===mu?(K=mu,W+=2):(K=r,dt===0&&wt(Bl)),K!==r?(re=W,ge=W,Ye=ds(),Ye!==r?(At=ds(),At!==r?(hr=ds(),hr!==r?(Ir=ds(),Ir!==r?(Ye=[Ye,At,hr,Ir],ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r),ge!==r?re=t.substring(re,W):re=ge,re!==r?(xt=L,K=la(re),L=K):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===dn?(K=dn,W+=2):(K=r,dt===0&&wt(No)),K!==r?(re=W,ge=W,Ye=ds(),Ye!==r?(At=ds(),At!==r?(hr=ds(),hr!==r?(Ir=ds(),Ir!==r?(Rn=ds(),Rn!==r?(ai=ds(),ai!==r?(ns=ds(),ns!==r?(GA=ds(),GA!==r?(Ye=[Ye,At,hr,Ir,Rn,ai,ns,GA],ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r),ge!==r?re=t.substring(re,W):re=ge,re!==r?(xt=L,K=RA(re),L=K):(W=L,L=r)):(W=L,L=r)))),L}function _o(){var L;return TA.test(t.charAt(W))?(L=t.charAt(W),W++):(L=r,dt===0&&wt(Oo)),L}function ds(){var L;return qa.test(t.charAt(W))?(L=t.charAt(W),W++):(L=r,dt===0&&wt(Ot)),L}function dp(){var L,K,re,ge,Ye;if(L=W,K=[],re=W,t.charCodeAt(W)===92?(ge=Ro,W++):(ge=r,dt===0&&wt(To)),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r),re===r&&(re=W,t.substr(W,2)===Mo?(ge=Mo,W+=2):(ge=r,dt===0&&wt(ua)),ge!==r&&(xt=re,ge=qi()),re=ge,re===r&&(re=W,ge=W,dt++,Ye=Qd(),dt--,Ye===r?ge=void 0:(W=ge,ge=r),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r))),re!==r)for(;re!==r;)K.push(re),re=W,t.charCodeAt(W)===92?(ge=Ro,W++):(ge=r,dt===0&&wt(To)),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r),re===r&&(re=W,t.substr(W,2)===Mo?(ge=Mo,W+=2):(ge=r,dt===0&&wt(ua)),ge!==r&&(xt=re,ge=qi()),re=ge,re===r&&(re=W,ge=W,dt++,Ye=Qd(),dt--,Ye===r?ge=void 0:(W=ge,ge=r),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r)));else K=r;return K!==r&&(xt=L,K=Ts(K)),L=K,L}function qA(){var L,K,re,ge,Ye,At;if(L=W,t.charCodeAt(W)===45?(K=vl,W++):(K=r,dt===0&&wt(Cc)),K===r&&(t.charCodeAt(W)===43?(K=Dl,W++):(K=r,dt===0&&wt(Aa))),K===r&&(K=null),K!==r){if(re=[],tt.test(t.charAt(W))?(ge=t.charAt(W),W++):(ge=r,dt===0&&wt(He)),ge!==r)for(;ge!==r;)re.push(ge),tt.test(t.charAt(W))?(ge=t.charAt(W),W++):(ge=r,dt===0&&wt(He));else re=r;if(re!==r)if(t.charCodeAt(W)===46?(ge=Di,W++):(ge=r,dt===0&&wt(rs)),ge!==r){if(Ye=[],tt.test(t.charAt(W))?(At=t.charAt(W),W++):(At=r,dt===0&&wt(He)),At!==r)for(;At!==r;)Ye.push(At),tt.test(t.charAt(W))?(At=t.charAt(W),W++):(At=r,dt===0&&wt(He));else Ye=r;Ye!==r?(xt=L,K=ja(K,re,Ye),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r}else W=L,L=r;if(L===r){if(L=W,t.charCodeAt(W)===45?(K=vl,W++):(K=r,dt===0&&wt(Cc)),K===r&&(t.charCodeAt(W)===43?(K=Dl,W++):(K=r,dt===0&&wt(Aa))),K===r&&(K=null),K!==r){if(re=[],tt.test(t.charAt(W))?(ge=t.charAt(W),W++):(ge=r,dt===0&&wt(He)),ge!==r)for(;ge!==r;)re.push(ge),tt.test(t.charAt(W))?(ge=t.charAt(W),W++):(ge=r,dt===0&&wt(He));else re=r;re!==r?(xt=L,K=yu(K,re),L=K):(W=L,L=r)}else W=L,L=r;if(L===r&&(L=W,K=jA(),K!==r&&(xt=L,K=Sl(K)),L=K,L===r&&(L=W,K=xl(),K!==r&&(xt=L,K=pi(K)),L=K,L===r)))if(L=W,t.charCodeAt(W)===40?(K=Ce,W++):(K=r,dt===0&&wt(fe)),K!==r){for(re=[],ge=bt();ge!==r;)re.push(ge),ge=bt();if(re!==r)if(ge=Ns(),ge!==r){for(Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();Ye!==r?(t.charCodeAt(W)===41?(At=ie,W++):(At=r,dt===0&&wt(Z)),At!==r?(xt=L,K=Dn(ge),L=K):(W=L,L=r)):(W=L,L=r)}else W=L,L=r;else W=L,L=r}else W=L,L=r}return L}function Pu(){var L,K,re,ge,Ye,At,hr,Ir;if(L=W,K=qA(),K!==r){for(re=[],ge=W,Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();if(Ye!==r)if(t.charCodeAt(W)===42?(At=Pl,W++):(At=r,dt===0&&wt(Je)),At===r&&(t.charCodeAt(W)===47?(At=st,W++):(At=r,dt===0&&wt(vt))),At!==r){for(hr=[],Ir=bt();Ir!==r;)hr.push(Ir),Ir=bt();hr!==r?(Ir=qA(),Ir!==r?(xt=ge,Ye=ar(K,At,Ir),ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)}else W=ge,ge=r;else W=ge,ge=r;for(;ge!==r;){for(re.push(ge),ge=W,Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();if(Ye!==r)if(t.charCodeAt(W)===42?(At=Pl,W++):(At=r,dt===0&&wt(Je)),At===r&&(t.charCodeAt(W)===47?(At=st,W++):(At=r,dt===0&&wt(vt))),At!==r){for(hr=[],Ir=bt();Ir!==r;)hr.push(Ir),Ir=bt();hr!==r?(Ir=qA(),Ir!==r?(xt=ge,Ye=ar(K,At,Ir),ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)}else W=ge,ge=r;else W=ge,ge=r}re!==r?(xt=L,K=ee(K,re),L=K):(W=L,L=r)}else W=L,L=r;return L}function Ns(){var L,K,re,ge,Ye,At,hr,Ir;if(L=W,K=Pu(),K!==r){for(re=[],ge=W,Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();if(Ye!==r)if(t.charCodeAt(W)===43?(At=Dl,W++):(At=r,dt===0&&wt(Aa)),At===r&&(t.charCodeAt(W)===45?(At=vl,W++):(At=r,dt===0&&wt(Cc))),At!==r){for(hr=[],Ir=bt();Ir!==r;)hr.push(Ir),Ir=bt();hr!==r?(Ir=Pu(),Ir!==r?(xt=ge,Ye=ye(K,At,Ir),ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)}else W=ge,ge=r;else W=ge,ge=r;for(;ge!==r;){for(re.push(ge),ge=W,Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();if(Ye!==r)if(t.charCodeAt(W)===43?(At=Dl,W++):(At=r,dt===0&&wt(Aa)),At===r&&(t.charCodeAt(W)===45?(At=vl,W++):(At=r,dt===0&&wt(Cc))),At!==r){for(hr=[],Ir=bt();Ir!==r;)hr.push(Ir),Ir=bt();hr!==r?(Ir=Pu(),Ir!==r?(xt=ge,Ye=ye(K,At,Ir),ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)}else W=ge,ge=r;else W=ge,ge=r}re!==r?(xt=L,K=ee(K,re),L=K):(W=L,L=r)}else W=L,L=r;return L}function Vr(){var L,K,re,ge,Ye,At;if(L=W,t.substr(W,3)===Ne?(K=Ne,W+=3):(K=r,dt===0&&wt(gt)),K!==r){for(re=[],ge=bt();ge!==r;)re.push(ge),ge=bt();if(re!==r)if(ge=Ns(),ge!==r){for(Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();Ye!==r?(t.substr(W,2)===mt?(At=mt,W+=2):(At=r,dt===0&&wt(Dt)),At!==r?(xt=L,K=er(ge),L=K):(W=L,L=r)):(W=L,L=r)}else W=L,L=r;else W=L,L=r}else W=L,L=r;return L}function mp(){var L,K,re,ge;return L=W,t.substr(W,2)===sn?(K=sn,W+=2):(K=r,dt===0&&wt(ei)),K!==r?(re=Uo(),re!==r?(t.charCodeAt(W)===41?(ge=ie,W++):(ge=r,dt===0&&wt(Z)),ge!==r?(xt=L,K=Qi(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L}function jA(){var L,K,re,ge,Ye,At;return L=W,t.substr(W,2)===Sn?(K=Sn,W+=2):(K=r,dt===0&&wt(fa)),K!==r?(re=xl(),re!==r?(t.substr(W,2)===wd?(ge=wd,W+=2):(ge=r,dt===0&&wt(BI)),ge!==r?(Ye=gs(),Ye!==r?(t.charCodeAt(W)===125?(At=q,W++):(At=r,dt===0&&wt(nt)),At!==r?(xt=L,K=eo(re,Ye),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===Sn?(K=Sn,W+=2):(K=r,dt===0&&wt(fa)),K!==r?(re=xl(),re!==r?(t.substr(W,3)===Bd?(ge=Bd,W+=3):(ge=r,dt===0&&wt(cp)),ge!==r?(xt=L,K=vI(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===Sn?(K=Sn,W+=2):(K=r,dt===0&&wt(fa)),K!==r?(re=xl(),re!==r?(t.substr(W,2)===to?(ge=to,W+=2):(ge=r,dt===0&&wt(up)),ge!==r?(Ye=gs(),Ye!==r?(t.charCodeAt(W)===125?(At=q,W++):(At=r,dt===0&&wt(nt)),At!==r?(xt=L,K=Ap(re,Ye),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===Sn?(K=Sn,W+=2):(K=r,dt===0&&wt(fa)),K!==r?(re=xl(),re!==r?(t.substr(W,3)===Ic?(ge=Ic,W+=3):(ge=r,dt===0&&wt(fp)),ge!==r?(xt=L,K=s0(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===Sn?(K=Sn,W+=2):(K=r,dt===0&&wt(fa)),K!==r?(re=xl(),re!==r?(t.charCodeAt(W)===125?(ge=q,W++):(ge=r,dt===0&&wt(nt)),ge!==r?(xt=L,K=o0(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.charCodeAt(W)===36?(K=a0,W++):(K=r,dt===0&&wt(vd)),K!==r?(re=xl(),re!==r?(xt=L,K=o0(re),L=K):(W=L,L=r)):(W=L,L=r)))))),L}function kd(){var L,K,re;return L=W,K=d0(),K!==r?(xt=W,re=Eu(K),re?re=void 0:re=r,re!==r?(xt=L,K=ro(K),L=K):(W=L,L=r)):(W=L,L=r),L}function d0(){var L,K,re,ge,Ye;if(L=W,K=[],re=W,ge=W,dt++,Ye=Ep(),dt--,Ye===r?ge=void 0:(W=ge,ge=r),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r),re!==r)for(;re!==r;)K.push(re),re=W,ge=W,dt++,Ye=Ep(),dt--,Ye===r?ge=void 0:(W=ge,ge=r),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r);else K=r;return K!==r&&(xt=L,K=Ts(K)),L=K,L}function yp(){var L,K,re;if(L=W,K=[],Ga.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(pp)),re!==r)for(;re!==r;)K.push(re),Ga.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(pp));else K=r;return K!==r&&(xt=L,K=l0()),L=K,L}function xl(){var L,K,re;if(L=W,K=[],Wa.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(Ya)),re!==r)for(;re!==r;)K.push(re),Wa.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(Ya));else K=r;return K!==r&&(xt=L,K=l0()),L=K,L}function Qd(){var L;return Dd.test(t.charAt(W))?(L=t.charAt(W),W++):(L=r,dt===0&&wt(LA)),L}function Ep(){var L;return Sd.test(t.charAt(W))?(L=t.charAt(W),W++):(L=r,dt===0&&wt(Pd)),L}function bt(){var L,K;if(L=[],NA.test(t.charAt(W))?(K=t.charAt(W),W++):(K=r,dt===0&&wt(OA)),K!==r)for(;K!==r;)L.push(K),NA.test(t.charAt(W))?(K=t.charAt(W),W++):(K=r,dt===0&&wt(OA));else L=r;return L}if(wc=a(),wc!==r&&W===t.length)return wc;throw wc!==r&&W!1}){try{return(0,OY.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function dm(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:o},a)=>`${AS(r)}${o===";"?a!==t.length-1||e?";":"":" &"}`).join(" ")}function AS(t){return`${mm(t.chain)}${t.then?` ${UT(t.then)}`:""}`}function UT(t){return`${t.type} ${AS(t.line)}`}function mm(t){return`${HT(t)}${t.then?` ${_T(t.then)}`:""}`}function _T(t){return`${t.type} ${mm(t.chain)}`}function HT(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>cS(e)).join(" ")} `:""}${t.args.map(e=>qT(e)).join(" ")}`;case"subshell":return`(${dm(t.subshell)})${t.args.length>0?` ${t.args.map(e=>fw(e)).join(" ")}`:""}`;case"group":return`{ ${dm(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>fw(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>cS(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function cS(t){return`${t.name}=${t.args[0]?J0(t.args[0]):""}`}function qT(t){switch(t.type){case"redirection":return fw(t);case"argument":return J0(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function fw(t){return`${t.subtype} ${t.args.map(e=>J0(e)).join(" ")}`}function J0(t){return t.segments.map(e=>jT(e)).join("")}function jT(t){let e=(o,a)=>a?`"${o}"`:o,r=o=>o===""?"''":o.match(/[()}<>$|&;"'\n\t ]/)?o.match(/['\t\p{C}]/u)?o.match(/'/)?`"${o.replace(/["$\t\p{C}]/u,$_e)}"`:`$'${o.replace(/[\t\p{C}]/u,UY)}'`:`'${o}'`:o;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`$(${dm(t.shell)})`,t.quoted);case"variable":return e(typeof t.defaultValue>"u"?typeof t.alternativeValue>"u"?`\${${t.name}}`:t.alternativeValue.length===0?`\${${t.name}:+}`:`\${${t.name}:+${t.alternativeValue.map(o=>J0(o)).join(" ")}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(o=>J0(o)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${fS(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function fS(t){let e=a=>{switch(a){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${a}"`)}},r=(a,n)=>n?`( ${a} )`:a,o=a=>r(fS(a),!["number","variable"].includes(a.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${o(t.left)} ${e(t.type)} ${o(t.right)}`}}var OY,MY,Z_e,UY,$_e,_Y=It(()=>{OY=et(NY());MY=new Map([["\f","\\f"],[` -`,"\\n"],["\r","\\r"],[" ","\\t"],["\v","\\v"],["\0","\\0"]]),Z_e=new Map([["\\","\\\\"],["$","\\$"],['"','\\"'],...Array.from(MY,([t,e])=>[t,`"$'${e}'"`])]),UY=t=>MY.get(t)??`\\x${t.charCodeAt(0).toString(16).padStart(2,"0")}`,$_e=t=>Z_e.get(t)??`"$'${UY(t)}'"`});var qY=_((dxt,HY)=>{"use strict";function e8e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function z0(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,z0)}e8e(z0,Error);z0.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,D=1;wce&&(ce=J,ue=[]),ue.push(He))}function nt(He,x){return new z0(He,null,null,x)}function Le(He,x,I){return new z0(z0.buildMessage(He,x),He,x,I)}function Te(){var He,x,I,P;return He=J,x=ke(),x!==r?(t.charCodeAt(J)===47?(I=n,J++):(I=r,Ie===0&&q(u)),I!==r?(P=ke(),P!==r?(te=He,x=A(x,P),He=x):(J=He,He=r)):(J=He,He=r)):(J=He,He=r),He===r&&(He=J,x=ke(),x!==r&&(te=He,x=p(x)),He=x),He}function ke(){var He,x,I,P;return He=J,x=Ke(),x!==r?(t.charCodeAt(J)===64?(I=h,J++):(I=r,Ie===0&&q(E)),I!==r?(P=tt(),P!==r?(te=He,x=w(x,P),He=x):(J=He,He=r)):(J=He,He=r)):(J=He,He=r),He===r&&(He=J,x=Ke(),x!==r&&(te=He,x=D(x)),He=x),He}function Ke(){var He,x,I,P,y;return He=J,t.charCodeAt(J)===64?(x=h,J++):(x=r,Ie===0&&q(E)),x!==r?(I=xe(),I!==r?(t.charCodeAt(J)===47?(P=n,J++):(P=r,Ie===0&&q(u)),P!==r?(y=xe(),y!==r?(te=He,x=b(),He=x):(J=He,He=r)):(J=He,He=r)):(J=He,He=r)):(J=He,He=r),He===r&&(He=J,x=xe(),x!==r&&(te=He,x=b()),He=x),He}function xe(){var He,x,I;if(He=J,x=[],C.test(t.charAt(J))?(I=t.charAt(J),J++):(I=r,Ie===0&&q(T)),I!==r)for(;I!==r;)x.push(I),C.test(t.charAt(J))?(I=t.charAt(J),J++):(I=r,Ie===0&&q(T));else x=r;return x!==r&&(te=He,x=b()),He=x,He}function tt(){var He,x,I;if(He=J,x=[],N.test(t.charAt(J))?(I=t.charAt(J),J++):(I=r,Ie===0&&q(U)),I!==r)for(;I!==r;)x.push(I),N.test(t.charAt(J))?(I=t.charAt(J),J++):(I=r,Ie===0&&q(U));else x=r;return x!==r&&(te=He,x=b()),He=x,He}if(he=a(),he!==r&&J===t.length)return he;throw he!==r&&J{jY=et(qY())});var Z0=_((yxt,X0)=>{"use strict";function WY(t){return typeof t>"u"||t===null}function r8e(t){return typeof t=="object"&&t!==null}function n8e(t){return Array.isArray(t)?t:WY(t)?[]:[t]}function i8e(t,e){var r,o,a,n;if(e)for(n=Object.keys(e),r=0,o=n.length;r{"use strict";function pw(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}pw.prototype=Object.create(Error.prototype);pw.prototype.constructor=pw;pw.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};YY.exports=pw});var JY=_((Cxt,KY)=>{"use strict";var VY=Z0();function GT(t,e,r,o,a){this.name=t,this.buffer=e,this.position=r,this.line=o,this.column=a}GT.prototype.getSnippet=function(e,r){var o,a,n,u,A;if(!this.buffer)return null;for(e=e||4,r=r||75,o="",a=this.position;a>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(a-1))===-1;)if(a-=1,this.position-a>r/2-1){o=" ... ",a+=5;break}for(n="",u=this.position;ur/2-1){n=" ... ",u-=5;break}return A=this.buffer.slice(a,u),VY.repeat(" ",e)+o+A+n+` -`+VY.repeat(" ",e+this.position-a+o.length)+"^"};GT.prototype.toString=function(e){var r,o="";return this.name&&(o+='in "'+this.name+'" '),o+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(o+=`: -`+r)),o};KY.exports=GT});var as=_((Ixt,XY)=>{"use strict";var zY=ym(),a8e=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],l8e=["scalar","sequence","mapping"];function c8e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(o){e[String(o)]=r})}),e}function u8e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(a8e.indexOf(r)===-1)throw new zY('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=c8e(e.styleAliases||null),l8e.indexOf(this.kind)===-1)throw new zY('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}XY.exports=u8e});var $0=_((wxt,$Y)=>{"use strict";var ZY=Z0(),gS=ym(),A8e=as();function WT(t,e,r){var o=[];return t.include.forEach(function(a){r=WT(a,e,r)}),t[e].forEach(function(a){r.forEach(function(n,u){n.tag===a.tag&&n.kind===a.kind&&o.push(u)}),r.push(a)}),r.filter(function(a,n){return o.indexOf(n)===-1})}function f8e(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function o(a){t[a.kind][a.tag]=t.fallback[a.tag]=a}for(e=0,r=arguments.length;e{"use strict";var p8e=as();eV.exports=new p8e("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var nV=_((vxt,rV)=>{"use strict";var h8e=as();rV.exports=new h8e("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var sV=_((Dxt,iV)=>{"use strict";var g8e=as();iV.exports=new g8e("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var dS=_((Sxt,oV)=>{"use strict";var d8e=$0();oV.exports=new d8e({explicit:[tV(),nV(),sV()]})});var lV=_((Pxt,aV)=>{"use strict";var m8e=as();function y8e(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function E8e(){return null}function C8e(t){return t===null}aV.exports=new m8e("tag:yaml.org,2002:null",{kind:"scalar",resolve:y8e,construct:E8e,predicate:C8e,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var uV=_((xxt,cV)=>{"use strict";var I8e=as();function w8e(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function B8e(t){return t==="true"||t==="True"||t==="TRUE"}function v8e(t){return Object.prototype.toString.call(t)==="[object Boolean]"}cV.exports=new I8e("tag:yaml.org,2002:bool",{kind:"scalar",resolve:w8e,construct:B8e,predicate:v8e,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var fV=_((bxt,AV)=>{"use strict";var D8e=Z0(),S8e=as();function P8e(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function x8e(t){return 48<=t&&t<=55}function b8e(t){return 48<=t&&t<=57}function k8e(t){if(t===null)return!1;var e=t.length,r=0,o=!1,a;if(!e)return!1;if(a=t[r],(a==="-"||a==="+")&&(a=t[++r]),a==="0"){if(r+1===e)return!0;if(a=t[++r],a==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var gV=_((kxt,hV)=>{"use strict";var pV=Z0(),R8e=as(),T8e=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function L8e(t){return!(t===null||!T8e.test(t)||t[t.length-1]==="_")}function N8e(t){var e,r,o,a;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,a=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(n){a.unshift(parseFloat(n,10))}),e=0,o=1,a.forEach(function(n){e+=n*o,o*=60}),r*e):r*parseFloat(e,10)}var O8e=/^[-+]?[0-9]+e/;function M8e(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(pV.isNegativeZero(t))return"-0.0";return r=t.toString(10),O8e.test(r)?r.replace("e",".e"):r}function U8e(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||pV.isNegativeZero(t))}hV.exports=new R8e("tag:yaml.org,2002:float",{kind:"scalar",resolve:L8e,construct:N8e,predicate:U8e,represent:M8e,defaultStyle:"lowercase"})});var YT=_((Qxt,dV)=>{"use strict";var _8e=$0();dV.exports=new _8e({include:[dS()],implicit:[lV(),uV(),fV(),gV()]})});var VT=_((Fxt,mV)=>{"use strict";var H8e=$0();mV.exports=new H8e({include:[YT()]})});var IV=_((Rxt,CV)=>{"use strict";var q8e=as(),yV=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),EV=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function j8e(t){return t===null?!1:yV.exec(t)!==null||EV.exec(t)!==null}function G8e(t){var e,r,o,a,n,u,A,p=0,h=null,E,w,D;if(e=yV.exec(t),e===null&&(e=EV.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],o=+e[2]-1,a=+e[3],!e[4])return new Date(Date.UTC(r,o,a));if(n=+e[4],u=+e[5],A=+e[6],e[7]){for(p=e[7].slice(0,3);p.length<3;)p+="0";p=+p}return e[9]&&(E=+e[10],w=+(e[11]||0),h=(E*60+w)*6e4,e[9]==="-"&&(h=-h)),D=new Date(Date.UTC(r,o,a,n,u,A,p)),h&&D.setTime(D.getTime()-h),D}function W8e(t){return t.toISOString()}CV.exports=new q8e("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:j8e,construct:G8e,instanceOf:Date,represent:W8e})});var BV=_((Txt,wV)=>{"use strict";var Y8e=as();function V8e(t){return t==="<<"||t===null}wV.exports=new Y8e("tag:yaml.org,2002:merge",{kind:"scalar",resolve:V8e})});var SV=_((Lxt,DV)=>{"use strict";var eg;try{vV=ve,eg=vV("buffer").Buffer}catch{}var vV,K8e=as(),KT=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function J8e(t){if(t===null)return!1;var e,r,o=0,a=t.length,n=KT;for(r=0;r64)){if(e<0)return!1;o+=6}return o%8===0}function z8e(t){var e,r,o=t.replace(/[\r\n=]/g,""),a=o.length,n=KT,u=0,A=[];for(e=0;e>16&255),A.push(u>>8&255),A.push(u&255)),u=u<<6|n.indexOf(o.charAt(e));return r=a%4*6,r===0?(A.push(u>>16&255),A.push(u>>8&255),A.push(u&255)):r===18?(A.push(u>>10&255),A.push(u>>2&255)):r===12&&A.push(u>>4&255),eg?eg.from?eg.from(A):new eg(A):A}function X8e(t){var e="",r=0,o,a,n=t.length,u=KT;for(o=0;o>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]),r=(r<<8)+t[o];return a=n%3,a===0?(e+=u[r>>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]):a===2?(e+=u[r>>10&63],e+=u[r>>4&63],e+=u[r<<2&63],e+=u[64]):a===1&&(e+=u[r>>2&63],e+=u[r<<4&63],e+=u[64],e+=u[64]),e}function Z8e(t){return eg&&eg.isBuffer(t)}DV.exports=new K8e("tag:yaml.org,2002:binary",{kind:"scalar",resolve:J8e,construct:z8e,predicate:Z8e,represent:X8e})});var xV=_((Oxt,PV)=>{"use strict";var $8e=as(),eHe=Object.prototype.hasOwnProperty,tHe=Object.prototype.toString;function rHe(t){if(t===null)return!0;var e=[],r,o,a,n,u,A=t;for(r=0,o=A.length;r{"use strict";var iHe=as(),sHe=Object.prototype.toString;function oHe(t){if(t===null)return!0;var e,r,o,a,n,u=t;for(n=new Array(u.length),e=0,r=u.length;e{"use strict";var lHe=as(),cHe=Object.prototype.hasOwnProperty;function uHe(t){if(t===null)return!0;var e,r=t;for(e in r)if(cHe.call(r,e)&&r[e]!==null)return!1;return!0}function AHe(t){return t!==null?t:{}}QV.exports=new lHe("tag:yaml.org,2002:set",{kind:"mapping",resolve:uHe,construct:AHe})});var Cm=_((_xt,RV)=>{"use strict";var fHe=$0();RV.exports=new fHe({include:[VT()],implicit:[IV(),BV()],explicit:[SV(),xV(),kV(),FV()]})});var LV=_((Hxt,TV)=>{"use strict";var pHe=as();function hHe(){return!0}function gHe(){}function dHe(){return""}function mHe(t){return typeof t>"u"}TV.exports=new pHe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:hHe,construct:gHe,predicate:mHe,represent:dHe})});var OV=_((qxt,NV)=>{"use strict";var yHe=as();function EHe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),o="";return!(e[0]==="/"&&(r&&(o=r[1]),o.length>3||e[e.length-o.length-1]!=="/"))}function CHe(t){var e=t,r=/\/([gim]*)$/.exec(t),o="";return e[0]==="/"&&(r&&(o=r[1]),e=e.slice(1,e.length-o.length-1)),new RegExp(e,o)}function IHe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function wHe(t){return Object.prototype.toString.call(t)==="[object RegExp]"}NV.exports=new yHe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:EHe,construct:CHe,predicate:wHe,represent:IHe})});var _V=_((jxt,UV)=>{"use strict";var mS;try{MV=ve,mS=MV("esprima")}catch{typeof window<"u"&&(mS=window.esprima)}var MV,BHe=as();function vHe(t){if(t===null)return!1;try{var e="("+t+")",r=mS.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function DHe(t){var e="("+t+")",r=mS.parse(e,{range:!0}),o=[],a;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(n){o.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(o,e.slice(a[0]+1,a[1]-1)):new Function(o,"return "+e.slice(a[0],a[1]))}function SHe(t){return t.toString()}function PHe(t){return Object.prototype.toString.call(t)==="[object Function]"}UV.exports=new BHe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:vHe,construct:DHe,predicate:PHe,represent:SHe})});var hw=_((Wxt,qV)=>{"use strict";var HV=$0();qV.exports=HV.DEFAULT=new HV({include:[Cm()],explicit:[LV(),OV(),_V()]})});var aK=_((Yxt,gw)=>{"use strict";var mf=Z0(),JV=ym(),xHe=JY(),zV=Cm(),bHe=hw(),Kp=Object.prototype.hasOwnProperty,yS=1,XV=2,ZV=3,ES=4,JT=1,kHe=2,jV=3,QHe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,FHe=/[\x85\u2028\u2029]/,RHe=/[,\[\]\{\}]/,$V=/^(?:!|!!|![a-z\-]+!)$/i,eK=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function GV(t){return Object.prototype.toString.call(t)}function Wu(t){return t===10||t===13}function rg(t){return t===9||t===32}function Da(t){return t===9||t===32||t===10||t===13}function Im(t){return t===44||t===91||t===93||t===123||t===125}function THe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function LHe(t){return t===120?2:t===117?4:t===85?8:0}function NHe(t){return 48<=t&&t<=57?t-48:-1}function WV(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` -`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"\x1B":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function OHe(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var tK=new Array(256),rK=new Array(256);for(tg=0;tg<256;tg++)tK[tg]=WV(tg)?1:0,rK[tg]=WV(tg);var tg;function MHe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||bHe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function nK(t,e){return new JV(e,new xHe(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function Qr(t,e){throw nK(t,e)}function CS(t,e){t.onWarning&&t.onWarning.call(null,nK(t,e))}var YV={YAML:function(e,r,o){var a,n,u;e.version!==null&&Qr(e,"duplication of %YAML directive"),o.length!==1&&Qr(e,"YAML directive accepts exactly one argument"),a=/^([0-9]+)\.([0-9]+)$/.exec(o[0]),a===null&&Qr(e,"ill-formed argument of the YAML directive"),n=parseInt(a[1],10),u=parseInt(a[2],10),n!==1&&Qr(e,"unacceptable YAML version of the document"),e.version=o[0],e.checkLineBreaks=u<2,u!==1&&u!==2&&CS(e,"unsupported YAML version of the document")},TAG:function(e,r,o){var a,n;o.length!==2&&Qr(e,"TAG directive accepts exactly two arguments"),a=o[0],n=o[1],$V.test(a)||Qr(e,"ill-formed tag handle (first argument) of the TAG directive"),Kp.call(e.tagMap,a)&&Qr(e,'there is a previously declared suffix for "'+a+'" tag handle'),eK.test(n)||Qr(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[a]=n}};function Vp(t,e,r,o){var a,n,u,A;if(e1&&(t.result+=mf.repeat(` -`,e-1))}function UHe(t,e,r){var o,a,n,u,A,p,h,E,w=t.kind,D=t.result,b;if(b=t.input.charCodeAt(t.position),Da(b)||Im(b)||b===35||b===38||b===42||b===33||b===124||b===62||b===39||b===34||b===37||b===64||b===96||(b===63||b===45)&&(a=t.input.charCodeAt(t.position+1),Da(a)||r&&Im(a)))return!1;for(t.kind="scalar",t.result="",n=u=t.position,A=!1;b!==0;){if(b===58){if(a=t.input.charCodeAt(t.position+1),Da(a)||r&&Im(a))break}else if(b===35){if(o=t.input.charCodeAt(t.position-1),Da(o))break}else{if(t.position===t.lineStart&&IS(t)||r&&Im(b))break;if(Wu(b))if(p=t.line,h=t.lineStart,E=t.lineIndent,Yi(t,!1,-1),t.lineIndent>=e){A=!0,b=t.input.charCodeAt(t.position);continue}else{t.position=u,t.line=p,t.lineStart=h,t.lineIndent=E;break}}A&&(Vp(t,n,u,!1),XT(t,t.line-p),n=u=t.position,A=!1),rg(b)||(u=t.position+1),b=t.input.charCodeAt(++t.position)}return Vp(t,n,u,!1),t.result?!0:(t.kind=w,t.result=D,!1)}function _He(t,e){var r,o,a;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,o=a=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(Vp(t,o,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)o=t.position,t.position++,a=t.position;else return!0;else Wu(r)?(Vp(t,o,a,!0),XT(t,Yi(t,!1,e)),o=a=t.position):t.position===t.lineStart&&IS(t)?Qr(t,"unexpected end of the document within a single quoted scalar"):(t.position++,a=t.position);Qr(t,"unexpected end of the stream within a single quoted scalar")}function HHe(t,e){var r,o,a,n,u,A;if(A=t.input.charCodeAt(t.position),A!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=o=t.position;(A=t.input.charCodeAt(t.position))!==0;){if(A===34)return Vp(t,r,t.position,!0),t.position++,!0;if(A===92){if(Vp(t,r,t.position,!0),A=t.input.charCodeAt(++t.position),Wu(A))Yi(t,!1,e);else if(A<256&&tK[A])t.result+=rK[A],t.position++;else if((u=LHe(A))>0){for(a=u,n=0;a>0;a--)A=t.input.charCodeAt(++t.position),(u=THe(A))>=0?n=(n<<4)+u:Qr(t,"expected hexadecimal character");t.result+=OHe(n),t.position++}else Qr(t,"unknown escape sequence");r=o=t.position}else Wu(A)?(Vp(t,r,o,!0),XT(t,Yi(t,!1,e)),r=o=t.position):t.position===t.lineStart&&IS(t)?Qr(t,"unexpected end of the document within a double quoted scalar"):(t.position++,o=t.position)}Qr(t,"unexpected end of the stream within a double quoted scalar")}function qHe(t,e){var r=!0,o,a=t.tag,n,u=t.anchor,A,p,h,E,w,D={},b,C,T,N;if(N=t.input.charCodeAt(t.position),N===91)p=93,w=!1,n=[];else if(N===123)p=125,w=!0,n={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),N=t.input.charCodeAt(++t.position);N!==0;){if(Yi(t,!0,e),N=t.input.charCodeAt(t.position),N===p)return t.position++,t.tag=a,t.anchor=u,t.kind=w?"mapping":"sequence",t.result=n,!0;r||Qr(t,"missed comma between flow collection entries"),C=b=T=null,h=E=!1,N===63&&(A=t.input.charCodeAt(t.position+1),Da(A)&&(h=E=!0,t.position++,Yi(t,!0,e))),o=t.line,Bm(t,e,yS,!1,!0),C=t.tag,b=t.result,Yi(t,!0,e),N=t.input.charCodeAt(t.position),(E||t.line===o)&&N===58&&(h=!0,N=t.input.charCodeAt(++t.position),Yi(t,!0,e),Bm(t,e,yS,!1,!0),T=t.result),w?wm(t,n,D,C,b,T):h?n.push(wm(t,null,D,C,b,T)):n.push(b),Yi(t,!0,e),N=t.input.charCodeAt(t.position),N===44?(r=!0,N=t.input.charCodeAt(++t.position)):r=!1}Qr(t,"unexpected end of the stream within a flow collection")}function jHe(t,e){var r,o,a=JT,n=!1,u=!1,A=e,p=0,h=!1,E,w;if(w=t.input.charCodeAt(t.position),w===124)o=!1;else if(w===62)o=!0;else return!1;for(t.kind="scalar",t.result="";w!==0;)if(w=t.input.charCodeAt(++t.position),w===43||w===45)JT===a?a=w===43?jV:kHe:Qr(t,"repeat of a chomping mode identifier");else if((E=NHe(w))>=0)E===0?Qr(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?Qr(t,"repeat of an indentation width identifier"):(A=e+E-1,u=!0);else break;if(rg(w)){do w=t.input.charCodeAt(++t.position);while(rg(w));if(w===35)do w=t.input.charCodeAt(++t.position);while(!Wu(w)&&w!==0)}for(;w!==0;){for(zT(t),t.lineIndent=0,w=t.input.charCodeAt(t.position);(!u||t.lineIndentA&&(A=t.lineIndent),Wu(w)){p++;continue}if(t.lineIndente)&&p!==0)Qr(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(Bm(t,e,ES,!0,a)&&(C?D=t.result:b=t.result),C||(wm(t,h,E,w,D,b,n,u),w=D=b=null),Yi(t,!0,-1),N=t.input.charCodeAt(t.position)),t.lineIndent>e&&N!==0)Qr(t,"bad indentation of a mapping entry");else if(t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),w=0,D=t.implicitTypes.length;w tag; it should be "'+b.kind+'", not "'+t.kind+'"'),b.resolve(t.result)?(t.result=b.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Qr(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):Qr(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||E}function KHe(t){var e=t.position,r,o,a,n=!1,u;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(u=t.input.charCodeAt(t.position))!==0&&(Yi(t,!0,-1),u=t.input.charCodeAt(t.position),!(t.lineIndent>0||u!==37));){for(n=!0,u=t.input.charCodeAt(++t.position),r=t.position;u!==0&&!Da(u);)u=t.input.charCodeAt(++t.position);for(o=t.input.slice(r,t.position),a=[],o.length<1&&Qr(t,"directive name must not be less than one character in length");u!==0;){for(;rg(u);)u=t.input.charCodeAt(++t.position);if(u===35){do u=t.input.charCodeAt(++t.position);while(u!==0&&!Wu(u));break}if(Wu(u))break;for(r=t.position;u!==0&&!Da(u);)u=t.input.charCodeAt(++t.position);a.push(t.input.slice(r,t.position))}u!==0&&zT(t),Kp.call(YV,o)?YV[o](t,o,a):CS(t,'unknown document directive "'+o+'"')}if(Yi(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Yi(t,!0,-1)):n&&Qr(t,"directives end mark is expected"),Bm(t,t.lineIndent-1,ES,!1,!0),Yi(t,!0,-1),t.checkLineBreaks&&FHe.test(t.input.slice(e,t.position))&&CS(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&IS(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Yi(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var o=iK(t,r);if(typeof e!="function")return o;for(var a=0,n=o.length;a"u"&&(r=e,e=null),sK(t,e,mf.extend({schema:zV},r))}function zHe(t,e){return oK(t,mf.extend({schema:zV},e))}gw.exports.loadAll=sK;gw.exports.load=oK;gw.exports.safeLoadAll=JHe;gw.exports.safeLoad=zHe});var kK=_((Vxt,tL)=>{"use strict";var mw=Z0(),yw=ym(),XHe=hw(),ZHe=Cm(),gK=Object.prototype.toString,dK=Object.prototype.hasOwnProperty,$He=9,dw=10,e6e=13,t6e=32,r6e=33,n6e=34,mK=35,i6e=37,s6e=38,o6e=39,a6e=42,yK=44,l6e=45,EK=58,c6e=61,u6e=62,A6e=63,f6e=64,CK=91,IK=93,p6e=96,wK=123,h6e=124,BK=125,mo={};mo[0]="\\0";mo[7]="\\a";mo[8]="\\b";mo[9]="\\t";mo[10]="\\n";mo[11]="\\v";mo[12]="\\f";mo[13]="\\r";mo[27]="\\e";mo[34]='\\"';mo[92]="\\\\";mo[133]="\\N";mo[160]="\\_";mo[8232]="\\L";mo[8233]="\\P";var g6e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function d6e(t,e){var r,o,a,n,u,A,p;if(e===null)return{};for(r={},o=Object.keys(e),a=0,n=o.length;a0?t.charCodeAt(n-1):null,D=D&&uK(u,A)}else{for(n=0;no&&t[w+1]!==" ",w=n);else if(!vm(u))return wS;A=n>0?t.charCodeAt(n-1):null,D=D&&uK(u,A)}h=h||E&&n-w-1>o&&t[w+1]!==" "}return!p&&!h?D&&!a(t)?DK:SK:r>9&&vK(t)?wS:h?xK:PK}function w6e(t,e,r,o){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&g6e.indexOf(e)!==-1)return"'"+e+"'";var a=t.indent*Math.max(1,r),n=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),u=o||t.flowLevel>-1&&r>=t.flowLevel;function A(p){return y6e(t,p)}switch(I6e(e,u,t.indent,n,A)){case DK:return e;case SK:return"'"+e.replace(/'/g,"''")+"'";case PK:return"|"+AK(e,t.indent)+fK(cK(e,a));case xK:return">"+AK(e,t.indent)+fK(cK(B6e(e,n),a));case wS:return'"'+v6e(e,n)+'"';default:throw new yw("impossible error: invalid scalar style")}}()}function AK(t,e){var r=vK(t)?String(e):"",o=t[t.length-1]===` -`,a=o&&(t[t.length-2]===` -`||t===` -`),n=a?"+":o?"":"-";return r+n+` -`}function fK(t){return t[t.length-1]===` -`?t.slice(0,-1):t}function B6e(t,e){for(var r=/(\n+)([^\n]*)/g,o=function(){var h=t.indexOf(` -`);return h=h!==-1?h:t.length,r.lastIndex=h,pK(t.slice(0,h),e)}(),a=t[0]===` -`||t[0]===" ",n,u;u=r.exec(t);){var A=u[1],p=u[2];n=p[0]===" ",o+=A+(!a&&!n&&p!==""?` -`:"")+pK(p,e),a=n}return o}function pK(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,o,a=0,n,u=0,A=0,p="";o=r.exec(t);)A=o.index,A-a>e&&(n=u>a?u:A,p+=` -`+t.slice(a,n),a=n+1),u=A;return p+=` -`,t.length-a>e&&u>a?p+=t.slice(a,u)+` -`+t.slice(u+1):p+=t.slice(a),p.slice(1)}function v6e(t){for(var e="",r,o,a,n=0;n=55296&&r<=56319&&(o=t.charCodeAt(n+1),o>=56320&&o<=57343)){e+=lK((r-55296)*1024+o-56320+65536),n++;continue}a=mo[r],e+=!a&&vm(r)?t[n]:a||lK(r)}return e}function D6e(t,e,r){var o="",a=t.tag,n,u;for(n=0,u=r.length;n1024&&(E+="? "),E+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),ng(t,e,h,!1,!1)&&(E+=t.dump,o+=E));t.tag=a,t.dump="{"+o+"}"}function x6e(t,e,r,o){var a="",n=t.tag,u=Object.keys(r),A,p,h,E,w,D;if(t.sortKeys===!0)u.sort();else if(typeof t.sortKeys=="function")u.sort(t.sortKeys);else if(t.sortKeys)throw new yw("sortKeys must be a boolean or a function");for(A=0,p=u.length;A1024,w&&(t.dump&&dw===t.dump.charCodeAt(0)?D+="?":D+="? "),D+=t.dump,w&&(D+=ZT(t,e)),ng(t,e+1,E,!0,w)&&(t.dump&&dw===t.dump.charCodeAt(0)?D+=":":D+=": ",D+=t.dump,a+=D));t.tag=n,t.dump=a||"{}"}function hK(t,e,r){var o,a,n,u,A,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,u=a.length;n tag resolver accepts not "'+p+'" style');t.dump=o}return!0}return!1}function ng(t,e,r,o,a,n){t.tag=null,t.dump=r,hK(t,r,!1)||hK(t,r,!0);var u=gK.call(t.dump);o&&(o=t.flowLevel<0||t.flowLevel>e);var A=u==="[object Object]"||u==="[object Array]",p,h;if(A&&(p=t.duplicates.indexOf(r),h=p!==-1),(t.tag!==null&&t.tag!=="?"||h||t.indent!==2&&e>0)&&(a=!1),h&&t.usedDuplicates[p])t.dump="*ref_"+p;else{if(A&&h&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),u==="[object Object]")o&&Object.keys(t.dump).length!==0?(x6e(t,e,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(P6e(t,e,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump));else if(u==="[object Array]"){var E=t.noArrayIndent&&e>0?e-1:e;o&&t.dump.length!==0?(S6e(t,E,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(D6e(t,E,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump))}else if(u==="[object String]")t.tag!=="?"&&w6e(t,t.dump,e,n);else{if(t.skipInvalid)return!1;throw new yw("unacceptable kind of an object to dump "+u)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function b6e(t,e){var r=[],o=[],a,n;for($T(t,r,o),a=0,n=o.length;a{"use strict";var BS=aK(),QK=kK();function vS(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}Fi.exports.Type=as();Fi.exports.Schema=$0();Fi.exports.FAILSAFE_SCHEMA=dS();Fi.exports.JSON_SCHEMA=YT();Fi.exports.CORE_SCHEMA=VT();Fi.exports.DEFAULT_SAFE_SCHEMA=Cm();Fi.exports.DEFAULT_FULL_SCHEMA=hw();Fi.exports.load=BS.load;Fi.exports.loadAll=BS.loadAll;Fi.exports.safeLoad=BS.safeLoad;Fi.exports.safeLoadAll=BS.safeLoadAll;Fi.exports.dump=QK.dump;Fi.exports.safeDump=QK.safeDump;Fi.exports.YAMLException=ym();Fi.exports.MINIMAL_SCHEMA=dS();Fi.exports.SAFE_SCHEMA=Cm();Fi.exports.DEFAULT_SCHEMA=hw();Fi.exports.scan=vS("scan");Fi.exports.parse=vS("parse");Fi.exports.compose=vS("compose");Fi.exports.addConstructor=vS("addConstructor")});var TK=_((Jxt,RK)=>{"use strict";var Q6e=FK();RK.exports=Q6e});var NK=_((zxt,LK)=>{"use strict";function F6e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function ig(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,ig)}F6e(ig,Error);ig.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,D=1;w({[gt]:Ne})))},ce=function(ee){return ee},ue=function(ee){return ee},Ie=oa("correct indentation"),he=" ",De=un(" ",!1),Ee=function(ee){return ee.length===ar*vt},g=function(ee){return ee.length===(ar+1)*vt},me=function(){return ar++,!0},Ce=function(){return ar--,!0},fe=function(){return Lo()},ie=oa("pseudostring"),Z=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,Se=qn(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Re=/^[^\r\n\t ,\][{}:#"']/,ht=qn(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),q=function(){return Lo().replace(/^ *| *$/g,"")},nt="--",Le=un("--",!1),Te=/^[a-zA-Z\/0-9]/,ke=qn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ke=/^[^\r\n\t :,]/,xe=qn(["\r",` -`," "," ",":",","],!0,!1),tt="null",He=un("null",!1),x=function(){return null},I="true",P=un("true",!1),y=function(){return!0},R="false",z=un("false",!1),X=function(){return!1},$=oa("string"),se='"',be=un('"',!1),Fe=function(){return""},lt=function(ee){return ee},Et=function(ee){return ee.join("")},qt=/^[^"\\\0-\x1F\x7F]/,nr=qn(['"',"\\",["\0",""],"\x7F"],!0,!1),Pt='\\"',cn=un('\\"',!1),Sr=function(){return'"'},yr="\\\\",Rr=un("\\\\",!1),Xr=function(){return"\\"},$n="\\/",Xs=un("\\/",!1),Hi=function(){return"/"},Qs="\\b",Zs=un("\\b",!1),bi=function(){return"\b"},Fs="\\f",$s=un("\\f",!1),PA=function(){return"\f"},gu="\\n",op=un("\\n",!1),ap=function(){return` -`},Rs="\\r",Nn=un("\\r",!1),hs=function(){return"\r"},Ts="\\t",pc=un("\\t",!1),hc=function(){return" "},gc="\\u",xA=un("\\u",!1),bA=function(ee,ye,Ne,gt){return String.fromCharCode(parseInt(`0x${ee}${ye}${Ne}${gt}`))},Ro=/^[0-9a-fA-F]/,To=qn([["0","9"],["a","f"],["A","F"]],!1,!1),kA=oa("blank space"),pr=/^[ \t]/,Me=qn([" "," "],!1,!1),ia=oa("white space"),dc=/^[ \t\n\r]/,Er=qn([" "," ",` -`,"\r"],!1,!1),du=`\r -`,QA=un(`\r -`,!1),FA=` -`,mc=un(` -`,!1),yc="\r",Il=un("\r",!1),we=0,Tt=0,wl=[{line:1,column:1}],Bi=0,Ls=[],Ft=0,Bn;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function Lo(){return t.substring(Tt,we)}function ki(){return la(Tt,we)}function vi(ee,ye){throw ye=ye!==void 0?ye:la(Tt,we),mu([oa(ee)],t.substring(Tt,we),ye)}function sa(ee,ye){throw ye=ye!==void 0?ye:la(Tt,we),ca(ee,ye)}function un(ee,ye){return{type:"literal",text:ee,ignoreCase:ye}}function qn(ee,ye,Ne){return{type:"class",parts:ee,inverted:ye,ignoreCase:Ne}}function Ec(){return{type:"any"}}function lp(){return{type:"end"}}function oa(ee){return{type:"other",description:ee}}function aa(ee){var ye=wl[ee],Ne;if(ye)return ye;for(Ne=ee-1;!wl[Ne];)Ne--;for(ye=wl[Ne],ye={line:ye.line,column:ye.column};NeBi&&(Bi=we,Ls=[]),Ls.push(ee))}function ca(ee,ye){return new ig(ee,null,null,ye)}function mu(ee,ye,Ne){return new ig(ig.buildMessage(ee,ye),ee,ye,Ne)}function Bl(){var ee;return ee=RA(),ee}function dn(){var ee,ye,Ne;for(ee=we,ye=[],Ne=No();Ne!==r;)ye.push(Ne),Ne=No();return ye!==r&&(Tt=ee,ye=n(ye)),ee=ye,ee}function No(){var ee,ye,Ne,gt,mt;return ee=we,ye=qa(),ye!==r?(t.charCodeAt(we)===45?(Ne=u,we++):(Ne=r,Ft===0&&Ze(A)),Ne!==r?(gt=Dn(),gt!==r?(mt=Oo(),mt!==r?(Tt=ee,ye=p(mt),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r),ee}function RA(){var ee,ye,Ne;for(ee=we,ye=[],Ne=TA();Ne!==r;)ye.push(Ne),Ne=TA();return ye!==r&&(Tt=ee,ye=h(ye)),ee=ye,ee}function TA(){var ee,ye,Ne,gt,mt,Dt,er,sn,ei;if(ee=we,ye=Dn(),ye===r&&(ye=null),ye!==r){if(Ne=we,t.charCodeAt(we)===35?(gt=E,we++):(gt=r,Ft===0&&Ze(w)),gt!==r){if(mt=[],Dt=we,er=we,Ft++,sn=st(),Ft--,sn===r?er=void 0:(we=er,er=r),er!==r?(t.length>we?(sn=t.charAt(we),we++):(sn=r,Ft===0&&Ze(D)),sn!==r?(er=[er,sn],Dt=er):(we=Dt,Dt=r)):(we=Dt,Dt=r),Dt!==r)for(;Dt!==r;)mt.push(Dt),Dt=we,er=we,Ft++,sn=st(),Ft--,sn===r?er=void 0:(we=er,er=r),er!==r?(t.length>we?(sn=t.charAt(we),we++):(sn=r,Ft===0&&Ze(D)),sn!==r?(er=[er,sn],Dt=er):(we=Dt,Dt=r)):(we=Dt,Dt=r);else mt=r;mt!==r?(gt=[gt,mt],Ne=gt):(we=Ne,Ne=r)}else we=Ne,Ne=r;if(Ne===r&&(Ne=null),Ne!==r){if(gt=[],mt=Je(),mt!==r)for(;mt!==r;)gt.push(mt),mt=Je();else gt=r;gt!==r?(Tt=ee,ye=b(),ee=ye):(we=ee,ee=r)}else we=ee,ee=r}else we=ee,ee=r;if(ee===r&&(ee=we,ye=qa(),ye!==r?(Ne=ua(),Ne!==r?(gt=Dn(),gt===r&&(gt=null),gt!==r?(t.charCodeAt(we)===58?(mt=C,we++):(mt=r,Ft===0&&Ze(T)),mt!==r?(Dt=Dn(),Dt===r&&(Dt=null),Dt!==r?(er=Oo(),er!==r?(Tt=ee,ye=N(Ne,er),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r),ee===r&&(ee=we,ye=qa(),ye!==r?(Ne=qi(),Ne!==r?(gt=Dn(),gt===r&&(gt=null),gt!==r?(t.charCodeAt(we)===58?(mt=C,we++):(mt=r,Ft===0&&Ze(T)),mt!==r?(Dt=Dn(),Dt===r&&(Dt=null),Dt!==r?(er=Oo(),er!==r?(Tt=ee,ye=N(Ne,er),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r),ee===r))){if(ee=we,ye=qa(),ye!==r)if(Ne=qi(),Ne!==r)if(gt=Dn(),gt!==r)if(mt=Cc(),mt!==r){if(Dt=[],er=Je(),er!==r)for(;er!==r;)Dt.push(er),er=Je();else Dt=r;Dt!==r?(Tt=ee,ye=N(Ne,mt),ee=ye):(we=ee,ee=r)}else we=ee,ee=r;else we=ee,ee=r;else we=ee,ee=r;else we=ee,ee=r;if(ee===r)if(ee=we,ye=qa(),ye!==r)if(Ne=qi(),Ne!==r){if(gt=[],mt=we,Dt=Dn(),Dt===r&&(Dt=null),Dt!==r?(t.charCodeAt(we)===44?(er=U,we++):(er=r,Ft===0&&Ze(J)),er!==r?(sn=Dn(),sn===r&&(sn=null),sn!==r?(ei=qi(),ei!==r?(Tt=mt,Dt=te(Ne,ei),mt=Dt):(we=mt,mt=r)):(we=mt,mt=r)):(we=mt,mt=r)):(we=mt,mt=r),mt!==r)for(;mt!==r;)gt.push(mt),mt=we,Dt=Dn(),Dt===r&&(Dt=null),Dt!==r?(t.charCodeAt(we)===44?(er=U,we++):(er=r,Ft===0&&Ze(J)),er!==r?(sn=Dn(),sn===r&&(sn=null),sn!==r?(ei=qi(),ei!==r?(Tt=mt,Dt=te(Ne,ei),mt=Dt):(we=mt,mt=r)):(we=mt,mt=r)):(we=mt,mt=r)):(we=mt,mt=r);else gt=r;gt!==r?(mt=Dn(),mt===r&&(mt=null),mt!==r?(t.charCodeAt(we)===58?(Dt=C,we++):(Dt=r,Ft===0&&Ze(T)),Dt!==r?(er=Dn(),er===r&&(er=null),er!==r?(sn=Oo(),sn!==r?(Tt=ee,ye=le(Ne,gt,sn),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)}else we=ee,ee=r;else we=ee,ee=r}return ee}function Oo(){var ee,ye,Ne,gt,mt,Dt,er;if(ee=we,ye=we,Ft++,Ne=we,gt=st(),gt!==r?(mt=Ot(),mt!==r?(t.charCodeAt(we)===45?(Dt=u,we++):(Dt=r,Ft===0&&Ze(A)),Dt!==r?(er=Dn(),er!==r?(gt=[gt,mt,Dt,er],Ne=gt):(we=Ne,Ne=r)):(we=Ne,Ne=r)):(we=Ne,Ne=r)):(we=Ne,Ne=r),Ft--,Ne!==r?(we=ye,ye=void 0):ye=r,ye!==r?(Ne=Je(),Ne!==r?(gt=vn(),gt!==r?(mt=dn(),mt!==r?(Dt=Mo(),Dt!==r?(Tt=ee,ye=ce(mt),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r),ee===r&&(ee=we,ye=st(),ye!==r?(Ne=vn(),Ne!==r?(gt=RA(),gt!==r?(mt=Mo(),mt!==r?(Tt=ee,ye=ce(gt),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r),ee===r))if(ee=we,ye=vl(),ye!==r){if(Ne=[],gt=Je(),gt!==r)for(;gt!==r;)Ne.push(gt),gt=Je();else Ne=r;Ne!==r?(Tt=ee,ye=ue(ye),ee=ye):(we=ee,ee=r)}else we=ee,ee=r;return ee}function qa(){var ee,ye,Ne;for(Ft++,ee=we,ye=[],t.charCodeAt(we)===32?(Ne=he,we++):(Ne=r,Ft===0&&Ze(De));Ne!==r;)ye.push(Ne),t.charCodeAt(we)===32?(Ne=he,we++):(Ne=r,Ft===0&&Ze(De));return ye!==r?(Tt=we,Ne=Ee(ye),Ne?Ne=void 0:Ne=r,Ne!==r?(ye=[ye,Ne],ee=ye):(we=ee,ee=r)):(we=ee,ee=r),Ft--,ee===r&&(ye=r,Ft===0&&Ze(Ie)),ee}function Ot(){var ee,ye,Ne;for(ee=we,ye=[],t.charCodeAt(we)===32?(Ne=he,we++):(Ne=r,Ft===0&&Ze(De));Ne!==r;)ye.push(Ne),t.charCodeAt(we)===32?(Ne=he,we++):(Ne=r,Ft===0&&Ze(De));return ye!==r?(Tt=we,Ne=g(ye),Ne?Ne=void 0:Ne=r,Ne!==r?(ye=[ye,Ne],ee=ye):(we=ee,ee=r)):(we=ee,ee=r),ee}function vn(){var ee;return Tt=we,ee=me(),ee?ee=void 0:ee=r,ee}function Mo(){var ee;return Tt=we,ee=Ce(),ee?ee=void 0:ee=r,ee}function ua(){var ee;return ee=ja(),ee===r&&(ee=Dl()),ee}function qi(){var ee,ye,Ne;if(ee=ja(),ee===r){if(ee=we,ye=[],Ne=Aa(),Ne!==r)for(;Ne!==r;)ye.push(Ne),Ne=Aa();else ye=r;ye!==r&&(Tt=ee,ye=fe()),ee=ye}return ee}function vl(){var ee;return ee=Di(),ee===r&&(ee=rs(),ee===r&&(ee=ja(),ee===r&&(ee=Dl()))),ee}function Cc(){var ee;return ee=Di(),ee===r&&(ee=ja(),ee===r&&(ee=Aa())),ee}function Dl(){var ee,ye,Ne,gt,mt,Dt;if(Ft++,ee=we,Z.test(t.charAt(we))?(ye=t.charAt(we),we++):(ye=r,Ft===0&&Ze(Se)),ye!==r){for(Ne=[],gt=we,mt=Dn(),mt===r&&(mt=null),mt!==r?(Re.test(t.charAt(we))?(Dt=t.charAt(we),we++):(Dt=r,Ft===0&&Ze(ht)),Dt!==r?(mt=[mt,Dt],gt=mt):(we=gt,gt=r)):(we=gt,gt=r);gt!==r;)Ne.push(gt),gt=we,mt=Dn(),mt===r&&(mt=null),mt!==r?(Re.test(t.charAt(we))?(Dt=t.charAt(we),we++):(Dt=r,Ft===0&&Ze(ht)),Dt!==r?(mt=[mt,Dt],gt=mt):(we=gt,gt=r)):(we=gt,gt=r);Ne!==r?(Tt=ee,ye=q(),ee=ye):(we=ee,ee=r)}else we=ee,ee=r;return Ft--,ee===r&&(ye=r,Ft===0&&Ze(ie)),ee}function Aa(){var ee,ye,Ne,gt,mt;if(ee=we,t.substr(we,2)===nt?(ye=nt,we+=2):(ye=r,Ft===0&&Ze(Le)),ye===r&&(ye=null),ye!==r)if(Te.test(t.charAt(we))?(Ne=t.charAt(we),we++):(Ne=r,Ft===0&&Ze(ke)),Ne!==r){for(gt=[],Ke.test(t.charAt(we))?(mt=t.charAt(we),we++):(mt=r,Ft===0&&Ze(xe));mt!==r;)gt.push(mt),Ke.test(t.charAt(we))?(mt=t.charAt(we),we++):(mt=r,Ft===0&&Ze(xe));gt!==r?(Tt=ee,ye=q(),ee=ye):(we=ee,ee=r)}else we=ee,ee=r;else we=ee,ee=r;return ee}function Di(){var ee,ye;return ee=we,t.substr(we,4)===tt?(ye=tt,we+=4):(ye=r,Ft===0&&Ze(He)),ye!==r&&(Tt=ee,ye=x()),ee=ye,ee}function rs(){var ee,ye;return ee=we,t.substr(we,4)===I?(ye=I,we+=4):(ye=r,Ft===0&&Ze(P)),ye!==r&&(Tt=ee,ye=y()),ee=ye,ee===r&&(ee=we,t.substr(we,5)===R?(ye=R,we+=5):(ye=r,Ft===0&&Ze(z)),ye!==r&&(Tt=ee,ye=X()),ee=ye),ee}function ja(){var ee,ye,Ne,gt;return Ft++,ee=we,t.charCodeAt(we)===34?(ye=se,we++):(ye=r,Ft===0&&Ze(be)),ye!==r?(t.charCodeAt(we)===34?(Ne=se,we++):(Ne=r,Ft===0&&Ze(be)),Ne!==r?(Tt=ee,ye=Fe(),ee=ye):(we=ee,ee=r)):(we=ee,ee=r),ee===r&&(ee=we,t.charCodeAt(we)===34?(ye=se,we++):(ye=r,Ft===0&&Ze(be)),ye!==r?(Ne=yu(),Ne!==r?(t.charCodeAt(we)===34?(gt=se,we++):(gt=r,Ft===0&&Ze(be)),gt!==r?(Tt=ee,ye=lt(Ne),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)),Ft--,ee===r&&(ye=r,Ft===0&&Ze($)),ee}function yu(){var ee,ye,Ne;if(ee=we,ye=[],Ne=Sl(),Ne!==r)for(;Ne!==r;)ye.push(Ne),Ne=Sl();else ye=r;return ye!==r&&(Tt=ee,ye=Et(ye)),ee=ye,ee}function Sl(){var ee,ye,Ne,gt,mt,Dt;return qt.test(t.charAt(we))?(ee=t.charAt(we),we++):(ee=r,Ft===0&&Ze(nr)),ee===r&&(ee=we,t.substr(we,2)===Pt?(ye=Pt,we+=2):(ye=r,Ft===0&&Ze(cn)),ye!==r&&(Tt=ee,ye=Sr()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===yr?(ye=yr,we+=2):(ye=r,Ft===0&&Ze(Rr)),ye!==r&&(Tt=ee,ye=Xr()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===$n?(ye=$n,we+=2):(ye=r,Ft===0&&Ze(Xs)),ye!==r&&(Tt=ee,ye=Hi()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===Qs?(ye=Qs,we+=2):(ye=r,Ft===0&&Ze(Zs)),ye!==r&&(Tt=ee,ye=bi()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===Fs?(ye=Fs,we+=2):(ye=r,Ft===0&&Ze($s)),ye!==r&&(Tt=ee,ye=PA()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===gu?(ye=gu,we+=2):(ye=r,Ft===0&&Ze(op)),ye!==r&&(Tt=ee,ye=ap()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===Rs?(ye=Rs,we+=2):(ye=r,Ft===0&&Ze(Nn)),ye!==r&&(Tt=ee,ye=hs()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===Ts?(ye=Ts,we+=2):(ye=r,Ft===0&&Ze(pc)),ye!==r&&(Tt=ee,ye=hc()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===gc?(ye=gc,we+=2):(ye=r,Ft===0&&Ze(xA)),ye!==r?(Ne=pi(),Ne!==r?(gt=pi(),gt!==r?(mt=pi(),mt!==r?(Dt=pi(),Dt!==r?(Tt=ee,ye=bA(Ne,gt,mt,Dt),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)))))))))),ee}function pi(){var ee;return Ro.test(t.charAt(we))?(ee=t.charAt(we),we++):(ee=r,Ft===0&&Ze(To)),ee}function Dn(){var ee,ye;if(Ft++,ee=[],pr.test(t.charAt(we))?(ye=t.charAt(we),we++):(ye=r,Ft===0&&Ze(Me)),ye!==r)for(;ye!==r;)ee.push(ye),pr.test(t.charAt(we))?(ye=t.charAt(we),we++):(ye=r,Ft===0&&Ze(Me));else ee=r;return Ft--,ee===r&&(ye=r,Ft===0&&Ze(kA)),ee}function Pl(){var ee,ye;if(Ft++,ee=[],dc.test(t.charAt(we))?(ye=t.charAt(we),we++):(ye=r,Ft===0&&Ze(Er)),ye!==r)for(;ye!==r;)ee.push(ye),dc.test(t.charAt(we))?(ye=t.charAt(we),we++):(ye=r,Ft===0&&Ze(Er));else ee=r;return Ft--,ee===r&&(ye=r,Ft===0&&Ze(ia)),ee}function Je(){var ee,ye,Ne,gt,mt,Dt;if(ee=we,ye=st(),ye!==r){for(Ne=[],gt=we,mt=Dn(),mt===r&&(mt=null),mt!==r?(Dt=st(),Dt!==r?(mt=[mt,Dt],gt=mt):(we=gt,gt=r)):(we=gt,gt=r);gt!==r;)Ne.push(gt),gt=we,mt=Dn(),mt===r&&(mt=null),mt!==r?(Dt=st(),Dt!==r?(mt=[mt,Dt],gt=mt):(we=gt,gt=r)):(we=gt,gt=r);Ne!==r?(ye=[ye,Ne],ee=ye):(we=ee,ee=r)}else we=ee,ee=r;return ee}function st(){var ee;return t.substr(we,2)===du?(ee=du,we+=2):(ee=r,Ft===0&&Ze(QA)),ee===r&&(t.charCodeAt(we)===10?(ee=FA,we++):(ee=r,Ft===0&&Ze(mc)),ee===r&&(t.charCodeAt(we)===13?(ee=yc,we++):(ee=r,Ft===0&&Ze(Il)))),ee}let vt=2,ar=0;if(Bn=a(),Bn!==r&&we===t.length)return Bn;throw Bn!==r&&we"u"?!0:typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.keys(t).every(e=>_K(t[e])):!1}function rL(t,e,r){if(t===null)return`null -`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} -`;if(typeof t=="string")return`${MK(t)} -`;if(Array.isArray(t)){if(t.length===0)return`[] -`;let o=" ".repeat(e);return` -${t.map(n=>`${o}- ${rL(n,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let[o,a]=t instanceof DS?[t.data,!1]:[t,!0],n=" ".repeat(e),u=Object.keys(o);a&&u.sort((p,h)=>{let E=OK.indexOf(p),w=OK.indexOf(h);return E===-1&&w===-1?ph?1:0:E!==-1&&w===-1?-1:E===-1&&w!==-1?1:E-w});let A=u.filter(p=>!_K(o[p])).map((p,h)=>{let E=o[p],w=MK(p),D=rL(E,e+1,!0),b=h>0||r?n:"",C=w.length>1024?`? ${w} -${b}:`:`${w}:`,T=D.startsWith(` -`)?D:` ${D}`;return`${b}${C}${T}`}).join(e===0?` -`:"")||` -`;return r?` -${A}`:`${A}`}throw new Error(`Unsupported value type (${t})`)}function Sa(t){try{let e=rL(t,0,!1);return e!==` -`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function L6e(t){return t.endsWith(` -`)||(t+=` -`),(0,UK.parse)(t)}function O6e(t){if(N6e.test(t))return L6e(t);let e=(0,SS.safeLoad)(t,{schema:SS.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Vi(t){return O6e(t)}var SS,UK,T6e,OK,DS,N6e,HK=It(()=>{SS=et(TK()),UK=et(NK()),T6e=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,OK=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],DS=class{constructor(e){this.data=e}};Sa.PreserveOrdering=DS;N6e=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i});var Ew={};Vt(Ew,{parseResolution:()=>pS,parseShell:()=>uS,parseSyml:()=>Vi,stringifyArgument:()=>qT,stringifyArgumentSegment:()=>jT,stringifyArithmeticExpression:()=>fS,stringifyCommand:()=>HT,stringifyCommandChain:()=>mm,stringifyCommandChainThen:()=>_T,stringifyCommandLine:()=>AS,stringifyCommandLineThen:()=>UT,stringifyEnvSegment:()=>cS,stringifyRedirectArgument:()=>fw,stringifyResolution:()=>hS,stringifyShell:()=>dm,stringifyShellLine:()=>dm,stringifySyml:()=>Sa,stringifyValueArgument:()=>J0});var Ol=It(()=>{_Y();GY();HK()});var jK=_((tbt,nL)=>{"use strict";var M6e=t=>{let e=!1,r=!1,o=!1;for(let a=0;a{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=a=>e.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(t)?t=t.map(a=>a.trim()).filter(a=>a.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=M6e(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\d+(\w|$)/g,a=>a.toUpperCase()),r(t))};nL.exports=qK;nL.exports.default=qK});var GK=_((rbt,U6e)=>{U6e.exports=[{name:"Agola CI",constant:"AGOLA",env:"AGOLA_GIT_REF",pr:"AGOLA_PULL_REQUEST_ID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"TF_BUILD",pr:{BUILD_REASON:"PullRequest"}},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codemagic",constant:"CODEMAGIC",env:"CM_BUILD_ID",pr:"CM_PULL_REQUEST"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"Earthly",constant:"EARTHLY",env:"EARTHLY_CI"},{name:"Expo Application Services",constant:"EAS",env:"EAS_BUILD"},{name:"Gerrit",constant:"GERRIT",env:"GERRIT_PROJECT"},{name:"Gitea Actions",constant:"GITEA_ACTIONS",env:"GITEA_ACTIONS"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Google Cloud Build",constant:"GOOGLE_CLOUD_BUILD",env:"BUILDER_OUTPUT"},{name:"Harness CI",constant:"HARNESS",env:"HARNESS_BUILD_ID"},{name:"Heroku",constant:"HEROKU",env:{env:"NODE",includes:"/app/.heroku/node/bin/node"}},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Prow",constant:"PROW",env:"PROW_JOB_ID"},{name:"ReleaseHub",constant:"RELEASEHUB",env:"RELEASE_BUILD_ID"},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Sourcehut",constant:"SOURCEHUT",env:{CI_NAME:"sourcehut"}},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vela",constant:"VELA",env:"VELA",pr:{VELA_PULL_REQUEST:"1"}},{name:"Vercel",constant:"VERCEL",env:{any:["NOW_BUILDER","VERCEL"]},pr:"VERCEL_GIT_PULL_REQUEST_ID"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"},{name:"Woodpecker",constant:"WOODPECKER",env:{CI:"woodpecker"},pr:{CI_BUILD_EVENT:"pull_request"}},{name:"Xcode Cloud",constant:"XCODE_CLOUD",env:"CI_XCODE_PROJECT",pr:"CI_PULL_REQUEST_NUMBER"},{name:"Xcode Server",constant:"XCODE_SERVER",env:"XCS"}]});var sg=_(nl=>{"use strict";var YK=GK(),ls=process.env;Object.defineProperty(nl,"_vendors",{value:YK.map(function(t){return t.constant})});nl.name=null;nl.isPR=null;YK.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(o){return WK(o)});if(nl[t.constant]=r,!!r)switch(nl.name=t.name,typeof t.pr){case"string":nl.isPR=!!ls[t.pr];break;case"object":"env"in t.pr?nl.isPR=t.pr.env in ls&&ls[t.pr.env]!==t.pr.ne:"any"in t.pr?nl.isPR=t.pr.any.some(function(o){return!!ls[o]}):nl.isPR=WK(t.pr);break;default:nl.isPR=null}});nl.isCI=!!(ls.CI!=="false"&&(ls.BUILD_ID||ls.BUILD_NUMBER||ls.CI||ls.CI_APP_ID||ls.CI_BUILD_ID||ls.CI_BUILD_NUMBER||ls.CI_NAME||ls.CONTINUOUS_INTEGRATION||ls.RUN_ID||nl.name));function WK(t){return typeof t=="string"?!!ls[t]:"env"in t?ls[t.env]&&ls[t.env].includes(t.includes):"any"in t?t.any.some(function(e){return!!ls[e]}):Object.keys(t).every(function(e){return ls[e]===t[e]})}});var Vn,pn,og,iL,PS,VK,sL,oL,xS=It(()=>{(function(t){t.StartOfInput="\0",t.EndOfInput="",t.EndOfPartialInput=""})(Vn||(Vn={}));(function(t){t[t.InitialNode=0]="InitialNode",t[t.SuccessNode=1]="SuccessNode",t[t.ErrorNode=2]="ErrorNode",t[t.CustomNode=3]="CustomNode"})(pn||(pn={}));og=-1,iL=/^(-h|--help)(?:=([0-9]+))?$/,PS=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,VK=/^-[a-zA-Z]{2,}$/,sL=/^([^=]+)=([\s\S]*)$/,oL=process.env.DEBUG_CLI==="1"});var it,Dm,bS,aL,kS=It(()=>{xS();it=class extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}},Dm=class extends Error{constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(o=>o.reason!==null&&o.reason===r[0].reason)){let[{reason:o}]=this.candidates;this.message=`${o} - -${this.candidates.map(({usage:a})=>`$ ${a}`).join(` -`)}`}else if(this.candidates.length===1){let[{usage:o}]=this.candidates;this.message=`Command not found; did you mean: - -$ ${o} -${aL(e)}`}else this.message=`Command not found; did you mean one of: - -${this.candidates.map(({usage:o},a)=>`${`${a}.`.padStart(4)} ${o}`).join(` -`)} - -${aL(e)}`}},bS=class extends Error{constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: - -${this.usages.map((o,a)=>`${`${a}.`.padStart(4)} ${o}`).join(` -`)} - -${aL(e)}`}},aL=t=>`While running ${t.filter(e=>e!==Vn.EndOfInput&&e!==Vn.EndOfPartialInput).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`});function _6e(t){let e=t.split(` -`),r=e.filter(a=>a.match(/\S/)),o=r.length>0?r.reduce((a,n)=>Math.min(a,n.length-n.trimStart().length),Number.MAX_VALUE):0;return e.map(a=>a.slice(o).trimRight()).join(` -`)}function yo(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` -`),t=_6e(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 - -`),t=t.replace(/\n(\n)?\n*/g,(o,a)=>a||" "),r&&(t=t.split(/\n/).map(o=>{let a=o.match(/^\s*[*-][\t ]+(.*)/);if(!a)return o.match(/(.{1,80})(?: |$)/g).join(` -`);let n=o.length-o.trimStart().length;return a[1].match(new RegExp(`(.{1,${78-n}})(?: |$)`,"g")).map((u,A)=>" ".repeat(n)+(A===0?"- ":" ")+u).join(` -`)}).join(` - -`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(o,a,n)=>e.code(a+n+a)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(o,a,n)=>e.bold(a+n+a)),t?`${t} -`:""}var lL,KK,JK,cL=It(()=>{lL=Array(80).fill("\u2501");for(let t=0;t<=24;++t)lL[lL.length-t]=`\x1B[38;5;${232+t}m\u2501`;KK={header:t=>`\x1B[1m\u2501\u2501\u2501 ${t}${t.length<75?` ${lL.slice(t.length+5).join("")}`:":"}\x1B[0m`,bold:t=>`\x1B[1m${t}\x1B[22m`,error:t=>`\x1B[31m\x1B[1m${t}\x1B[22m\x1B[39m`,code:t=>`\x1B[36m${t}\x1B[39m`},JK={header:t=>t,bold:t=>t,error:t=>t,code:t=>t}});function Wo(t){return{...t,[Cw]:!0}}function Yu(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function QS(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(!r)return"validation failed";let[,o,a]=r;return e&&(a=a[0].toLowerCase()+a.slice(1)),a=o!=="."||!e?`${o.replace(/^\.(\[|$)/,"$1")}: ${a}`:`: ${a}`,a}function Iw(t,e){return e.length===1?new it(`${t}${QS(e[0],{mergeName:!0})}`):new it(`${t}: -${e.map(r=>` -- ${QS(r)}`).join("")}`)}function ag(t,e,r){if(typeof r>"u")return e;let o=[],a=[],n=A=>{let p=e;return e=A,n.bind(null,p)};if(!r(e,{errors:o,coercions:a,coercion:n}))throw Iw(`Invalid value for ${t}`,o);for(let[,A]of a)A();return e}var Cw,yf=It(()=>{kS();Cw=Symbol("clipanion/isOption")});var Yo={};Vt(Yo,{KeyRelationship:()=>Vu,TypeAssertionError:()=>zp,applyCascade:()=>vw,as:()=>sqe,assert:()=>rqe,assertWithErrors:()=>nqe,cascade:()=>NS,fn:()=>oqe,hasAtLeastOneKey:()=>dL,hasExactLength:()=>eJ,hasForbiddenKeys:()=>Dqe,hasKeyRelationship:()=>Sw,hasMaxLength:()=>lqe,hasMinLength:()=>aqe,hasMutuallyExclusiveKeys:()=>Sqe,hasRequiredKeys:()=>vqe,hasUniqueItems:()=>cqe,isArray:()=>RS,isAtLeast:()=>hL,isAtMost:()=>fqe,isBase64:()=>Cqe,isBoolean:()=>K6e,isDate:()=>z6e,isDict:()=>$6e,isEnum:()=>js,isHexColor:()=>Eqe,isISO8601:()=>yqe,isInExclusiveRange:()=>hqe,isInInclusiveRange:()=>pqe,isInstanceOf:()=>tqe,isInteger:()=>gL,isJSON:()=>Iqe,isLiteral:()=>XK,isLowerCase:()=>gqe,isMap:()=>Z6e,isNegative:()=>uqe,isNullable:()=>Bqe,isNumber:()=>fL,isObject:()=>ZK,isOneOf:()=>pL,isOptional:()=>wqe,isPartial:()=>eqe,isPayload:()=>J6e,isPositive:()=>Aqe,isRecord:()=>LS,isSet:()=>X6e,isString:()=>Pm,isTuple:()=>TS,isUUID4:()=>mqe,isUnknown:()=>AL,isUpperCase:()=>dqe,makeTrait:()=>$K,makeValidator:()=>qr,matchesRegExp:()=>Bw,softAssert:()=>iqe});function Kn(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":typeof t=="symbol"?`<${t.toString()}>`:Array.isArray(t)?"an array":JSON.stringify(t)}function Sm(t,e){if(t.length===0)return"nothing";if(t.length===1)return Kn(t[0]);let r=t.slice(0,-1),o=t[t.length-1],a=t.length>2?`, ${e} `:` ${e} `;return`${r.map(n=>Kn(n)).join(", ")}${a}${Kn(o)}`}function Jp(t,e){var r,o,a;return typeof e=="number"?`${(r=t?.p)!==null&&r!==void 0?r:"."}[${e}]`:H6e.test(e)?`${(o=t?.p)!==null&&o!==void 0?o:""}.${e}`:`${(a=t?.p)!==null&&a!==void 0?a:"."}[${JSON.stringify(e)}]`}function uL(t,e,r){return t===1?e:r}function gr({errors:t,p:e}={},r){return t?.push(`${e??"."}: ${r}`),!1}function Y6e(t,e){return r=>{t[e]=r}}function Ku(t,e){return r=>{let o=t[e];return t[e]=r,Ku(t,e).bind(null,o)}}function ww(t,e,r){let o=()=>(t(r()),a),a=()=>(t(e),o);return o}function AL(){return qr({test:(t,e)=>!0})}function XK(t){return qr({test:(e,r)=>e!==t?gr(r,`Expected ${Kn(t)} (got ${Kn(e)})`):!0})}function Pm(){return qr({test:(t,e)=>typeof t!="string"?gr(e,`Expected a string (got ${Kn(t)})`):!0})}function js(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>typeof a=="string"||typeof a=="number"),o=new Set(e);return o.size===1?XK([...o][0]):qr({test:(a,n)=>o.has(a)?!0:r?gr(n,`Expected one of ${Sm(e,"or")} (got ${Kn(a)})`):gr(n,`Expected a valid enumeration value (got ${Kn(a)})`)})}function K6e(){return qr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return gr(e,"Unbound coercion result");let o=V6e.get(t);if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return gr(e,`Expected a boolean (got ${Kn(t)})`)}return!0}})}function fL(){return qr({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return gr(e,"Unbound coercion result");let o;if(typeof t=="string"){let a;try{a=JSON.parse(t)}catch{}if(typeof a=="number")if(JSON.stringify(a)===t)o=a;else return gr(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return gr(e,`Expected a number (got ${Kn(t)})`)}return!0}})}function J6e(t){return qr({test:(e,r)=>{var o;if(typeof r?.coercions>"u")return gr(r,"The isPayload predicate can only be used with coercion enabled");if(typeof r.coercion>"u")return gr(r,"Unbound coercion result");if(typeof e!="string")return gr(r,`Expected a string (got ${Kn(e)})`);let a;try{a=JSON.parse(e)}catch{return gr(r,`Expected a JSON string (got ${Kn(e)})`)}let n={value:a};return t(a,Object.assign(Object.assign({},r),{coercion:Ku(n,"value")}))?(r.coercions.push([(o=r.p)!==null&&o!==void 0?o:".",r.coercion.bind(null,n.value)]),!0):!1}})}function z6e(){return qr({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return gr(e,"Unbound coercion result");let o;if(typeof t=="string"&&zK.test(t))o=new Date(t);else{let a;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch{}typeof n=="number"&&(a=n)}else typeof t=="number"&&(a=t);if(typeof a<"u")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))o=new Date(a*1e3);else return gr(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return gr(e,`Expected a date (got ${Kn(t)})`)}return!0}})}function RS(t,{delimiter:e}={}){return qr({test:(r,o)=>{var a;let n=r;if(typeof r=="string"&&typeof e<"u"&&typeof o?.coercions<"u"){if(typeof o?.coercion>"u")return gr(o,"Unbound coercion result");r=r.split(e)}if(!Array.isArray(r))return gr(o,`Expected an array (got ${Kn(r)})`);let u=!0;for(let A=0,p=r.length;A{var n,u;if(Object.getPrototypeOf(o).toString()==="[object Set]")if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return gr(a,"Unbound coercion result");let A=[...o],p=[...o];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,w)=>E!==A[w])?new Set(p):o;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",ww(a.coercion,o,h)]),!0}else{let A=!0;for(let p of o)if(A=t(p,Object.assign({},a))&&A,!A&&a?.errors==null)break;return A}if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return gr(a,"Unbound coercion result");let A={value:o};return r(o,Object.assign(Object.assign({},a),{coercion:Ku(A,"value")}))?(a.coercions.push([(u=a.p)!==null&&u!==void 0?u:".",ww(a.coercion,o,()=>new Set(A.value))]),!0):!1}return gr(a,`Expected a set (got ${Kn(o)})`)}})}function Z6e(t,e){let r=RS(TS([t,e])),o=LS(e,{keys:t});return qr({test:(a,n)=>{var u,A,p;if(Object.getPrototypeOf(a).toString()==="[object Map]")if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return gr(n,"Unbound coercion result");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let w=()=>E.some((D,b)=>D[0]!==h[b][0]||D[1]!==h[b][1])?new Map(E):a;return n.coercions.push([(u=n.p)!==null&&u!==void 0?u:".",ww(n.coercion,a,w)]),!0}else{let h=!0;for(let[E,w]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(w,Object.assign(Object.assign({},n),{p:Jp(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return gr(n,"Unbound coercion result");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(A=n.p)!==null&&A!==void 0?A:".",ww(n.coercion,a,()=>new Map(h.value))]),!0):!1:o(a,Object.assign(Object.assign({},n),{coercion:Ku(h,"value")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:".",ww(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return gr(n,`Expected a map (got ${Kn(a)})`)}})}function TS(t,{delimiter:e}={}){let r=eJ(t.length);return qr({test:(o,a)=>{var n;if(typeof o=="string"&&typeof e<"u"&&typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return gr(a,"Unbound coercion result");o=o.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,o)])}if(!Array.isArray(o))return gr(a,`Expected a tuple (got ${Kn(o)})`);let u=r(o,Object.assign({},a));for(let A=0,p=o.length;A{var n;if(Array.isArray(o)&&typeof a?.coercions<"u")return typeof a?.coercion>"u"?gr(a,"Unbound coercion result"):r(o,Object.assign(Object.assign({},a),{coercion:void 0}))?(o=Object.fromEntries(o),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,o)]),!0):!1;if(typeof o!="object"||o===null)return gr(a,`Expected an object (got ${Kn(o)})`);let u=Object.keys(o),A=!0;for(let p=0,h=u.length;p{if(typeof a!="object"||a===null)return gr(n,`Expected an object (got ${Kn(a)})`);let u=new Set([...r,...Object.keys(a)]),A={},p=!0;for(let h of u){if(h==="constructor"||h==="__proto__")p=gr(Object.assign(Object.assign({},n),{p:Jp(n,h)}),"Unsafe property name");else{let E=Object.prototype.hasOwnProperty.call(t,h)?t[h]:void 0,w=Object.prototype.hasOwnProperty.call(a,h)?a[h]:void 0;typeof E<"u"?p=E(w,Object.assign(Object.assign({},n),{p:Jp(n,h),coercion:Ku(a,h)}))&&p:e===null?p=gr(Object.assign(Object.assign({},n),{p:Jp(n,h)}),`Extraneous property (got ${Kn(w)})`):Object.defineProperty(A,h,{enumerable:!0,get:()=>w,set:Y6e(a,h)})}if(!p&&n?.errors==null)break}return e!==null&&(p||n?.errors!=null)&&(p=e(A,n)&&p),p}});return Object.assign(o,{properties:t})}function eqe(t){return ZK(t,{extra:LS(AL())})}function $K(t){return()=>t}function qr({test:t}){return $K(t)()}function rqe(t,e){if(!e(t))throw new zp}function nqe(t,e){let r=[];if(!e(t,{errors:r}))throw new zp({errors:r})}function iqe(t,e){}function sqe(t,e,{coerce:r=!1,errors:o,throw:a}={}){let n=o?[]:void 0;if(!r){if(e(t,{errors:n}))return a?t:{value:t,errors:void 0};if(a)throw new zp({errors:n});return{value:void 0,errors:n??!0}}let u={value:t},A=Ku(u,"value"),p=[];if(!e(t,{errors:n,coercion:A,coercions:p})){if(a)throw new zp({errors:n});return{value:void 0,errors:n??!0}}for(let[,h]of p)h();return a?u.value:{value:u.value,errors:void 0}}function oqe(t,e){let r=TS(t);return(...o)=>{if(!r(o))throw new zp;return e(...o)}}function aqe(t){return qr({test:(e,r)=>e.length>=t?!0:gr(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)})}function lqe(t){return qr({test:(e,r)=>e.length<=t?!0:gr(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)})}function eJ(t){return qr({test:(e,r)=>e.length!==t?gr(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0})}function cqe({map:t}={}){return qr({test:(e,r)=>{let o=new Set,a=new Set;for(let n=0,u=e.length;nt<=0?!0:gr(e,`Expected to be negative (got ${t})`)})}function Aqe(){return qr({test:(t,e)=>t>=0?!0:gr(e,`Expected to be positive (got ${t})`)})}function hL(t){return qr({test:(e,r)=>e>=t?!0:gr(r,`Expected to be at least ${t} (got ${e})`)})}function fqe(t){return qr({test:(e,r)=>e<=t?!0:gr(r,`Expected to be at most ${t} (got ${e})`)})}function pqe(t,e){return qr({test:(r,o)=>r>=t&&r<=e?!0:gr(o,`Expected to be in the [${t}; ${e}] range (got ${r})`)})}function hqe(t,e){return qr({test:(r,o)=>r>=t&&re!==Math.round(e)?gr(r,`Expected to be an integer (got ${e})`):!t&&!Number.isSafeInteger(e)?gr(r,`Expected to be a safe integer (got ${e})`):!0})}function Bw(t){return qr({test:(e,r)=>t.test(e)?!0:gr(r,`Expected to match the pattern ${t.toString()} (got ${Kn(e)})`)})}function gqe(){return qr({test:(t,e)=>t!==t.toLowerCase()?gr(e,`Expected to be all-lowercase (got ${t})`):!0})}function dqe(){return qr({test:(t,e)=>t!==t.toUpperCase()?gr(e,`Expected to be all-uppercase (got ${t})`):!0})}function mqe(){return qr({test:(t,e)=>W6e.test(t)?!0:gr(e,`Expected to be a valid UUID v4 (got ${Kn(t)})`)})}function yqe(){return qr({test:(t,e)=>zK.test(t)?!0:gr(e,`Expected to be a valid ISO 8601 date string (got ${Kn(t)})`)})}function Eqe({alpha:t=!1}){return qr({test:(e,r)=>(t?q6e.test(e):j6e.test(e))?!0:gr(r,`Expected to be a valid hexadecimal color string (got ${Kn(e)})`)})}function Cqe(){return qr({test:(t,e)=>G6e.test(t)?!0:gr(e,`Expected to be a valid base 64 string (got ${Kn(t)})`)})}function Iqe(t=AL()){return qr({test:(e,r)=>{let o;try{o=JSON.parse(e)}catch{return gr(r,`Expected to be a valid JSON string (got ${Kn(e)})`)}return t(o,r)}})}function NS(t,...e){let r=Array.isArray(e[0])?e[0]:e;return qr({test:(o,a)=>{var n,u;let A={value:o},p=typeof a?.coercions<"u"?Ku(A,"value"):void 0,h=typeof a?.coercions<"u"?[]:void 0;if(!t(o,Object.assign(Object.assign({},a),{coercion:p,coercions:h})))return!1;let E=[];if(typeof h<"u")for(let[,w]of h)E.push(w());try{if(typeof a?.coercions<"u"){if(A.value!==o){if(typeof a?.coercion>"u")return gr(a,"Unbound coercion result");a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,A.value)])}(u=a?.coercions)===null||u===void 0||u.push(...h)}return r.every(w=>w(A.value,a))}finally{for(let w of E)w()}}})}function vw(t,...e){let r=Array.isArray(e[0])?e[0]:e;return NS(t,r)}function wqe(t){return qr({test:(e,r)=>typeof e>"u"?!0:t(e,r)})}function Bqe(t){return qr({test:(e,r)=>e===null?!0:t(e,r)})}function vqe(t,e){var r;let o=new Set(t),a=Dw[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return qr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)||p.push(h);return p.length>0?gr(u,`Missing required ${uL(p.length,"property","properties")} ${Sm(p,"and")}`):!0}})}function dL(t,e){var r;let o=new Set(t),a=Dw[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return qr({test:(n,u)=>Object.keys(n).some(h=>a(o,h,n))?!0:gr(u,`Missing at least one property from ${Sm(Array.from(o),"or")}`)})}function Dqe(t,e){var r;let o=new Set(t),a=Dw[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return qr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)&&p.push(h);return p.length>0?gr(u,`Forbidden ${uL(p.length,"property","properties")} ${Sm(p,"and")}`):!0}})}function Sqe(t,e){var r;let o=new Set(t),a=Dw[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return qr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)&&p.push(h);return p.length>1?gr(u,`Mutually exclusive properties ${Sm(p,"and")}`):!0}})}function Sw(t,e,r,o){var a,n;let u=new Set((a=o?.ignore)!==null&&a!==void 0?a:[]),A=Dw[(n=o?.missingIf)!==null&&n!==void 0?n:"missing"],p=new Set(r),h=Pqe[e],E=e===Vu.Forbids?"or":"and";return qr({test:(w,D)=>{let b=new Set(Object.keys(w));if(!A(b,t,w)||u.has(w[t]))return!0;let C=[];for(let T of p)(A(b,T,w)&&!u.has(w[T]))!==h.expect&&C.push(T);return C.length>=1?gr(D,`Property "${t}" ${h.message} ${uL(C.length,"property","properties")} ${Sm(C,E)}`):!0}})}var H6e,q6e,j6e,G6e,W6e,zK,V6e,tqe,pL,zp,Dw,Vu,Pqe,il=It(()=>{H6e=/^[a-zA-Z_][a-zA-Z0-9_]*$/;q6e=/^#[0-9a-f]{6}$/i,j6e=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,G6e=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,W6e=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,zK=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/;V6e=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]);tqe=t=>qr({test:(e,r)=>e instanceof t?!0:gr(r,`Expected an instance of ${t.name} (got ${Kn(e)})`)}),pL=(t,{exclusive:e=!1}={})=>qr({test:(r,o)=>{var a,n,u;let A=[],p=typeof o?.errors<"u"?[]:void 0;for(let h=0,E=t.length;h1?gr(o,`Expected to match exactly a single predicate (matched ${A.join(", ")})`):(u=o?.errors)===null||u===void 0||u.push(...p),!1}});zp=class extends Error{constructor({errors:e}={}){let r="Type mismatch";if(e&&e.length>0){r+=` -`;for(let o of e)r+=` -- ${o}`}super(r)}};Dw={missing:(t,e)=>t.has(e),undefined:(t,e,r)=>t.has(e)&&typeof r[e]<"u",nil:(t,e,r)=>t.has(e)&&r[e]!=null,falsy:(t,e,r)=>t.has(e)&&!!r[e]};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(Vu||(Vu={}));Pqe={[Vu.Forbids]:{expect:!1,message:"forbids using"},[Vu.Requires]:{expect:!0,message:"requires using"}}});var ot,Xp=It(()=>{yf();ot=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:u}=await Promise.resolve().then(()=>(il(),Yo)),A=u(a(n()),r),p=[],h=[];if(!A(this,{errors:p,coercions:h}))throw Iw("Invalid option schema",p);for(let[,w]of h)w()}else if(r!=null)throw new Error("Invalid command schema");let o=await this.execute();return typeof o<"u"?o:0}};ot.isOption=Cw;ot.Default=[]});function Pa(t){oL&&console.log(t)}function rJ(){let t={nodes:[]};for(let e=0;e{if(e.has(o))return;e.add(o);let a=t.nodes[o];for(let u of Object.values(a.statics))for(let{to:A}of u)r(A);for(let[,{to:u}]of a.dynamics)r(u);for(let{to:u}of a.shortcuts)r(u);let n=new Set(a.shortcuts.map(({to:u})=>u));for(;a.shortcuts.length>0;){let{to:u}=a.shortcuts.shift(),A=t.nodes[u];for(let[p,h]of Object.entries(A.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let w of h)E.some(({to:D})=>w.to===D)||E.push(w)}for(let[p,h]of A.dynamics)a.dynamics.some(([E,{to:w}])=>p===E&&h.to===w)||a.dynamics.push([p,h]);for(let p of A.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(pn.InitialNode)}function kqe(t,{prefix:e=""}={}){if(oL){Pa(`${e}Nodes are:`);for(let r=0;rE!==pn.ErrorNode).map(({state:E})=>({usage:E.candidateUsage,reason:null})));if(h.every(({node:E})=>E===pn.ErrorNode))throw new Dm(e,h.map(({state:E})=>({usage:E.candidateUsage,reason:E.errorMessage})));o=Rqe(h)}if(o.length>0){Pa(" Results:");for(let n of o)Pa(` - ${n.node} -> ${JSON.stringify(n.state)}`)}else Pa(" No results");return o}function Fqe(t,e,{endToken:r=Vn.EndOfInput}={}){let o=Qqe(t,[...e,r]);return Tqe(e,o.map(({state:a})=>a))}function Rqe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function Tqe(t,e){let r=e.filter(D=>D.selectedIndex!==null),o=r.filter(D=>!D.partial);if(o.length>0&&(r=o),r.length===0)throw new Error;let a=r.filter(D=>D.selectedIndex===og||D.requiredOptions.every(b=>b.some(C=>D.options.find(T=>T.name===C))));if(a.length===0)throw new Dm(t,r.map(D=>({usage:D.candidateUsage,reason:null})));let n=0;for(let D of a)D.path.length>n&&(n=D.path.length);let u=a.filter(D=>D.path.length===n),A=D=>D.positionals.filter(({extra:b})=>!b).length+D.options.length,p=u.map(D=>({state:D,positionalCount:A(D)})),h=0;for(let{positionalCount:D}of p)D>h&&(h=D);let E=p.filter(({positionalCount:D})=>D===h).map(({state:D})=>D),w=Lqe(E);if(w.length>1)throw new bS(t,w.map(D=>D.candidateUsage));return w[0]}function Lqe(t){let e=[],r=[];for(let o of t)o.selectedIndex===og?r.push(o):e.push(o);return r.length>0&&e.push({...tJ,path:nJ(...r.map(o=>o.path)),options:r.reduce((o,a)=>o.concat(a.options),[])}),e}function nJ(t,e,...r){return e===void 0?Array.from(t):nJ(t.filter((o,a)=>o===e[a]),...r)}function sl(){return{dynamics:[],shortcuts:[],statics:{}}}function iJ(t){return t===pn.SuccessNode||t===pn.ErrorNode}function mL(t,e=0){return{to:iJ(t.to)?t.to:t.to>=pn.CustomNode?t.to+e-pn.CustomNode+1:t.to+e,reducer:t.reducer}}function Nqe(t,e=0){let r=sl();for(let[o,a]of t.dynamics)r.dynamics.push([o,mL(a,e)]);for(let o of t.shortcuts)r.shortcuts.push(mL(o,e));for(let[o,a]of Object.entries(t.statics))r.statics[o]=a.map(n=>mL(n,e));return r}function Bs(t,e,r,o,a){t.nodes[e].dynamics.push([r,{to:o,reducer:a}])}function xm(t,e,r,o){t.nodes[e].shortcuts.push({to:r,reducer:o})}function Vo(t,e,r,o,a){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:o,reducer:a})}function OS(t,e,r,o,a){if(Array.isArray(e)){let[n,...u]=e;return t[n](r,o,a,...u)}else return t[e](r,o,a)}var tJ,Oqe,yL,ol,EL,MS,US=It(()=>{xS();kS();tJ={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:og,partial:!1,tokens:[]};Oqe={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,o)=>!t.ignoreOptions&&e===o,isBatchOption:(t,e,r,o)=>!t.ignoreOptions&&VK.test(e)&&[...e.slice(1)].every(a=>o.has(`-${a}`)),isBoundOption:(t,e,r,o,a)=>{let n=e.match(sL);return!t.ignoreOptions&&!!n&&PS.test(n[1])&&o.has(n[1])&&a.filter(u=>u.nameSet.includes(n[1])).every(u=>u.allowBinding)},isNegatedOption:(t,e,r,o)=>!t.ignoreOptions&&e===`--no-${o.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&iL.test(e),isUnsupportedOption:(t,e,r,o)=>!t.ignoreOptions&&e.startsWith("-")&&PS.test(e)&&!o.has(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!PS.test(e)},yL={setCandidateState:(t,e,r,o)=>({...t,...o}),setSelectedIndex:(t,e,r,o)=>({...t,selectedIndex:o}),setPartialIndex:(t,e,r,o)=>({...t,selectedIndex:o,partial:!0}),pushBatch:(t,e,r,o)=>{let a=t.options.slice(),n=t.tokens.slice();for(let u=1;u{let[,o,a]=e.match(sL),n=t.options.concat({name:o,value:a}),u=t.tokens.concat([{segmentIndex:r,type:"option",slice:[0,o.length],option:o},{segmentIndex:r,type:"assign",slice:[o.length,o.length+1]},{segmentIndex:r,type:"value",slice:[o.length+1,o.length+a.length+1]}]);return{...t,options:n,tokens:u}},pushPath:(t,e,r)=>{let o=t.path.concat(e),a=t.tokens.concat({segmentIndex:r,type:"path"});return{...t,path:o,tokens:a}},pushPositional:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:!1}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushExtra:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:!0}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushExtraNoLimits:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:ol}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushTrue:(t,e,r,o)=>{let a=t.options.concat({name:o,value:!0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:o});return{...t,options:a,tokens:n}},pushFalse:(t,e,r,o)=>{let a=t.options.concat({name:o,value:!1}),n=t.tokens.concat({segmentIndex:r,type:"option",option:o});return{...t,options:a,tokens:n}},pushUndefined:(t,e,r,o)=>{let a=t.options.concat({name:e,value:void 0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:e});return{...t,options:a,tokens:n}},pushStringValue:(t,e,r)=>{var o;let a=t.options[t.options.length-1],n=t.options.slice(),u=t.tokens.concat({segmentIndex:r,type:"value"});return a.value=((o=a.value)!==null&&o!==void 0?o:[]).concat([e]),{...t,options:n,tokens:u}},setStringValue:(t,e,r)=>{let o=t.options[t.options.length-1],a=t.options.slice(),n=t.tokens.concat({segmentIndex:r,type:"value"});return o.value=e,{...t,options:a,tokens:n}},inhibateOptions:t=>({...t,ignoreOptions:!0}),useHelp:(t,e,r,o)=>{let[,,a]=e.match(iL);return typeof a<"u"?{...t,options:[{name:"-c",value:String(o)},{name:"-i",value:a}]}:{...t,options:[{name:"-c",value:String(o)}]}},setError:(t,e,r,o)=>e===Vn.EndOfInput||e===Vn.EndOfPartialInput?{...t,errorMessage:`${o}.`}:{...t,errorMessage:`${o} ("${e}").`},setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return{...t,errorMessage:`Not enough arguments to option ${r.name}.`}}},ol=Symbol(),EL=class{constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:o=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:o,proxy:a})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===ol)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==ol?this.arity.extra.push(e):this.arity.extra!==ol&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===ol)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let o=0;o1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(o))throw new Error(`The arity must be an integer, got ${o}`);if(o<0)throw new Error(`The arity must be positive, got ${o}`);let A=e.reduce((p,h)=>h.length>p.length?h:p,"");for(let p of e)this.allOptionNames.set(p,A);this.options.push({preferredName:A,nameSet:e,description:r,arity:o,hidden:a,required:n,allowBinding:u})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let o=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&o.push(...this.paths[0]),e){for(let{preferredName:u,nameSet:A,arity:p,hidden:h,description:E,required:w}of this.options){if(h)continue;let D=[];for(let C=0;C`:`[${b}]`)}o.push(...this.arity.leading.map(u=>`<${u}>`)),this.arity.extra===ol?o.push("..."):o.push(...this.arity.extra.map(u=>`[${u}]`)),o.push(...this.arity.trailing.map(u=>`<${u}>`))}return{usage:o.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=rJ(),r=pn.InitialNode,o=this.usage().usage,a=this.options.filter(A=>A.required).map(A=>A.nameSet);r=jc(e,sl()),Vo(e,pn.InitialNode,Vn.StartOfInput,r,["setCandidateState",{candidateUsage:o,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",u=this.paths.length>0?this.paths:[[]];for(let A of u){let p=r;if(A.length>0){let D=jc(e,sl());xm(e,p,D),this.registerOptions(e,D),p=D}for(let D=0;D0||!this.arity.proxy){let D=jc(e,sl());Bs(e,p,"isHelp",D,["useHelp",this.cliIndex]),Bs(e,D,"always",D,"pushExtra"),Vo(e,D,Vn.EndOfInput,pn.SuccessNode,["setSelectedIndex",og]),this.registerOptions(e,p)}this.arity.leading.length>0&&(Vo(e,p,Vn.EndOfInput,pn.ErrorNode,["setError","Not enough positional arguments"]),Vo(e,p,Vn.EndOfPartialInput,pn.SuccessNode,["setPartialIndex",this.cliIndex]));let h=p;for(let D=0;D0||D+1!==this.arity.leading.length)&&(Vo(e,b,Vn.EndOfInput,pn.ErrorNode,["setError","Not enough positional arguments"]),Vo(e,b,Vn.EndOfPartialInput,pn.SuccessNode,["setPartialIndex",this.cliIndex])),Bs(e,h,"isNotOptionLike",b,"pushPositional"),h=b}let E=h;if(this.arity.extra===ol||this.arity.extra.length>0){let D=jc(e,sl());if(xm(e,h,D),this.arity.extra===ol){let b=jc(e,sl());this.arity.proxy||this.registerOptions(e,b),Bs(e,h,n,b,"pushExtraNoLimits"),Bs(e,b,n,b,"pushExtraNoLimits"),xm(e,b,D)}else for(let b=0;b0)&&this.registerOptions(e,C),Bs(e,E,n,C,"pushExtra"),xm(e,C,D),E=C}E=D}this.arity.trailing.length>0&&(Vo(e,E,Vn.EndOfInput,pn.ErrorNode,["setError","Not enough positional arguments"]),Vo(e,E,Vn.EndOfPartialInput,pn.SuccessNode,["setPartialIndex",this.cliIndex]));let w=E;for(let D=0;D=0&&e{let u=n?Vn.EndOfPartialInput:Vn.EndOfInput;return Fqe(o,a,{endToken:u})}}}}});function oJ(){return _S.default&&"getColorDepth"in _S.default.WriteStream.prototype?_S.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}function aJ(t){let e=sJ;if(typeof e>"u"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=ve("async_hooks");e=sJ=new r;let o=process.stdout._write;process.stdout._write=function(n,u,A){let p=e.getStore();return typeof p>"u"?o.call(this,n,u,A):p.stdout.write(n,u,A)};let a=process.stderr._write;process.stderr._write=function(n,u,A){let p=e.getStore();return typeof p>"u"?a.call(this,n,u,A):p.stderr.write(n,u,A)}}return r=>e.run(t,r)}var _S,sJ,lJ=It(()=>{_S=et(ve("tty"),1)});var HS,cJ=It(()=>{Xp();HS=class t extends ot{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,r){let o=new t(r);o.path=e.path;for(let a of e.options)switch(a.name){case"-c":o.commands.push(Number(a.value));break;case"-i":o.index=Number(a.value);break}return o}async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: -`),this.context.stdout.write(` -`);let r=0;for(let o of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[o].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` -`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. -`)}}}});async function fJ(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=hJ(t);return Ko.from(r,e).runExit(o,a)}async function pJ(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=hJ(t);return Ko.from(r,e).run(o,a)}function hJ(t){let e,r,o,a;switch(typeof process<"u"&&typeof process.argv<"u"&&(o=process.argv.slice(2)),t.length){case 1:r=t[0];break;case 2:t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],Array.isArray(t[1])?o=t[1]:a=t[1]):(e=t[0],r=t[1]);break;case 3:Array.isArray(t[2])?(e=t[0],r=t[1],o=t[2]):t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],o=t[1],a=t[2]):(e=t[0],r=t[1],a=t[2]);break;default:e=t[0],r=t[1],o=t[2],a=t[3];break}if(typeof o>"u")throw new Error("The argv parameter must be provided when running Clipanion outside of a Node context");return{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}}function AJ(t){return t()}var uJ,Ko,gJ=It(()=>{xS();US();cL();lJ();Xp();cJ();uJ=Symbol("clipanion/errorCommand");Ko=class t{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:o,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new MS({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=o,this.enableCapture=a,this.enableColors=n}static from(e,r={}){let o=new t(r),a=Array.isArray(e)?e:[e];for(let n of a)o.register(n);return o}register(e){var r;let o=new Map,a=new e;for(let p in a){let h=a[p];typeof h=="object"&&h!==null&&h[ot.isOption]&&o.set(p,h)}let n=this.builder.command(),u=n.cliIndex,A=(r=e.paths)!==null&&r!==void 0?r:a.paths;if(typeof A<"u")for(let p of A)n.addPath(p);this.registrations.set(e,{specs:o,builder:n,index:u});for(let[p,{definition:h}]of o.entries())h(n,p);n.setContext({commandClass:e})}process(e,r){let{input:o,context:a,partial:n}=typeof e=="object"&&Array.isArray(e)?{input:e,context:r}:e,{contexts:u,process:A}=this.builder.compile(),p=A(o,{partial:n}),h={...t.defaultContext,...a};switch(p.selectedIndex){case og:{let E=HS.from(p,u);return E.context=h,E.tokens=p.tokens,E}default:{let{commandClass:E}=u[p.selectedIndex],w=this.registrations.get(E);if(typeof w>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let D=new E;D.context=h,D.tokens=p.tokens,D.path=p.path;try{for(let[b,{transformer:C}]of w.specs.entries())D[b]=C(w.builder,b,p,h);return D}catch(b){throw b[uJ]=D,b}}break}}async run(e,r){var o,a;let n,u={...t.defaultContext,...r},A=(o=this.enableColors)!==null&&o!==void 0?o:u.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e,u)}catch(E){return u.stdout.write(this.error(E,{colored:A})),1}if(n.help)return u.stdout.write(this.usage(n,{colored:A,detailed:!0})),0;n.context=u,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),definition:E=>this.definition(E),error:(E,w)=>this.error(E,w),format:E=>this.format(E),process:(E,w)=>this.process(E,{...u,...w}),run:(E,w)=>this.run(E,{...u,...w}),usage:(E,w)=>this.usage(E,w)};let p=this.enableCapture&&(a=aJ(u))!==null&&a!==void 0?a:AJ,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return u.stdout.write(this.error(E,{colored:A,command:n})),1}return h}async runExit(e,r){process.exitCode=await this.run(e,r)}definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:o}=this.getUsageByRegistration(e,{detailed:!1}),{usage:a,options:n}=this.getUsageByRegistration(e,{detailed:!0,inlineOptions:!1}),u=typeof e.usage.category<"u"?yo(e.usage.category,{format:this.format(r),paragraphs:!1}):void 0,A=typeof e.usage.description<"u"?yo(e.usage.description,{format:this.format(r),paragraphs:!1}):void 0,p=typeof e.usage.details<"u"?yo(e.usage.details,{format:this.format(r),paragraphs:!0}):void 0,h=typeof e.usage.examples<"u"?e.usage.examples.map(([E,w])=>[yo(E,{format:this.format(r),paragraphs:!1}),w.replace(/\$0/g,this.binaryName)]):void 0;return{path:o,usage:a,category:u,description:A,details:p,examples:h,options:n}}definitions({colored:e=!1}={}){let r=[];for(let o of this.registrations.keys()){let a=this.definition(o,{colored:e});a&&r.push(a)}return r}usage(e=null,{colored:r,detailed:o=!1,prefix:a="$ "}={}){var n;if(e===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<"u";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h?.some(b=>b.length===0))!==null&&n!==void 0?n:!1))if(e){e=null;break}else e=p;else if(E){e=null;continue}}e&&(o=!0)}let u=e!==null&&e instanceof ot?e.constructor:e,A="";if(u)if(o){let{description:p="",details:h="",examples:E=[]}=u.usage||{};p!==""&&(A+=yo(p,{format:this.format(r),paragraphs:!1}).replace(/^./,b=>b.toUpperCase()),A+=` -`),(h!==""||E.length>0)&&(A+=`${this.format(r).header("Usage")} -`,A+=` -`);let{usage:w,options:D}=this.getUsageByRegistration(u,{inlineOptions:!1});if(A+=`${this.format(r).bold(a)}${w} -`,D.length>0){A+=` -`,A+=`${this.format(r).header("Options")} -`;let b=D.reduce((C,T)=>Math.max(C,T.definition.length),0);A+=` -`;for(let{definition:C,description:T}of D)A+=` ${this.format(r).bold(C.padEnd(b))} ${yo(T,{format:this.format(r),paragraphs:!1})}`}if(h!==""&&(A+=` -`,A+=`${this.format(r).header("Details")} -`,A+=` -`,A+=yo(h,{format:this.format(r),paragraphs:!0})),E.length>0){A+=` -`,A+=`${this.format(r).header("Examples")} -`;for(let[b,C]of E)A+=` -`,A+=yo(b,{format:this.format(r),paragraphs:!1}),A+=`${C.replace(/^/m,` ${this.format(r).bold(a)}`).replace(/\$0/g,this.binaryName)} -`}}else{let{usage:p}=this.getUsageByRegistration(u);A+=`${this.format(r).bold(a)}${p} -`}else{let p=new Map;for(let[D,{index:b}]of this.registrations.entries()){if(typeof D.usage>"u")continue;let C=typeof D.usage.category<"u"?yo(D.usage.category,{format:this.format(r),paragraphs:!1}):null,T=p.get(C);typeof T>"u"&&p.set(C,T=[]);let{usage:N}=this.getUsageByIndex(b);T.push({commandClass:D,usage:N})}let h=Array.from(p.keys()).sort((D,b)=>D===null?-1:b===null?1:D.localeCompare(b,"en",{usage:"sort",caseFirst:"upper"})),E=typeof this.binaryLabel<"u",w=typeof this.binaryVersion<"u";E||w?(E&&w?A+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} - -`:E?A+=`${this.format(r).header(`${this.binaryLabel}`)} -`:A+=`${this.format(r).header(`${this.binaryVersion}`)} -`,A+=` ${this.format(r).bold(a)}${this.binaryName} -`):A+=`${this.format(r).bold(a)}${this.binaryName} -`;for(let D of h){let b=p.get(D).slice().sort((T,N)=>T.usage.localeCompare(N.usage,"en",{usage:"sort",caseFirst:"upper"})),C=D!==null?D.trim():"General commands";A+=` -`,A+=`${this.format(r).header(`${C}`)} -`;for(let{commandClass:T,usage:N}of b){let U=T.usage.description||"undocumented";A+=` -`,A+=` ${this.format(r).bold(N)} -`,A+=` ${yo(U,{format:this.format(r),paragraphs:!1})}`}}A+=` -`,A+=yo("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return A}error(e,r){var o,{colored:a,command:n=(o=e[uJ])!==null&&o!==void 0?o:null}=r===void 0?{}:r;(!e||typeof e!="object"||!("stack"in e))&&(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let u="",A=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");A==="Error"&&(A="Internal Error"),u+=`${this.format(a).error(A)}: ${e.message} -`;let p=e.clipanion;return typeof p<"u"?p.type==="usage"&&(u+=` -`,u+=this.usage(n)):e.stack&&(u+=`${e.stack.replace(/^.*\n/,"")} -`),u}format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:t.defaultContext.colorDepth>1)?KK:JK}getUsageByRegistration(e,r){let o=this.registrations.get(e);if(typeof o>"u")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(o.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}};Ko.defaultContext={env:process.env,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:oJ()}});var Pw,dJ=It(()=>{Xp();Pw=class extends ot{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} -`)}};Pw.paths=[["--clipanion=definitions"]]});var xw,mJ=It(()=>{Xp();xw=class extends ot{async execute(){this.context.stdout.write(this.cli.usage())}};xw.paths=[["-h"],["--help"]]});function qS(t={}){return Wo({definition(e,r){var o;e.addProxy({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){return o.positionals.map(({value:a})=>a)}})}var CL=It(()=>{yf()});var bw,yJ=It(()=>{Xp();CL();bw=class extends ot{constructor(){super(...arguments),this.args=qS()}async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.process(this.args).tokens,null,2)} -`)}};bw.paths=[["--clipanion=tokens"]]});var kw,EJ=It(()=>{Xp();kw=class extends ot{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} -`)}};kw.paths=[["-v"],["--version"]]});var IL={};Vt(IL,{DefinitionsCommand:()=>Pw,HelpCommand:()=>xw,TokensCommand:()=>bw,VersionCommand:()=>kw});var CJ=It(()=>{dJ();mJ();yJ();EJ()});function IJ(t,e,r){let[o,a]=Yu(e,r??{}),{arity:n=1}=a,u=t.split(","),A=new Set(u);return Wo({definition(p){p.addOption({names:u,arity:n,hidden:a?.hidden,description:a?.description,required:a.required})},transformer(p,h,E){let w,D=typeof o<"u"?[...o]:void 0;for(let{name:b,value:C}of E.options)A.has(b)&&(w=b,D=D??[],D.push(C));return typeof D<"u"?ag(w??h,D,a.validator):D}})}var wJ=It(()=>{yf()});function BJ(t,e,r){let[o,a]=Yu(e,r??{}),n=t.split(","),u=new Set(n);return Wo({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:w,value:D}of h.options)u.has(w)&&(E=D);return E}})}var vJ=It(()=>{yf()});function DJ(t,e,r){let[o,a]=Yu(e,r??{}),n=t.split(","),u=new Set(n);return Wo({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:w,value:D}of h.options)u.has(w)&&(E??(E=0),D?E+=1:E=0);return E}})}var SJ=It(()=>{yf()});function PJ(t={}){return Wo({definition(e,r){var o;e.addRest({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){let a=u=>{let A=o.positionals[u];return A.extra===ol||A.extra===!1&&uu)}})}var xJ=It(()=>{US();yf()});function Mqe(t,e,r){let[o,a]=Yu(e,r??{}),{arity:n=1}=a,u=t.split(","),A=new Set(u);return Wo({definition(p){p.addOption({names:u,arity:a.tolerateBoolean?0:n,hidden:a.hidden,description:a.description,required:a.required})},transformer(p,h,E,w){let D,b=o;typeof a.env<"u"&&w.env[a.env]&&(D=a.env,b=w.env[a.env]);for(let{name:C,value:T}of E.options)A.has(C)&&(D=C,b=T);return typeof b=="string"?ag(D??h,b,a.validator):b}})}function Uqe(t={}){let{required:e=!0}=t;return Wo({definition(r,o){var a;r.addPositional({name:(a=t.name)!==null&&a!==void 0?a:o,required:t.required})},transformer(r,o,a){var n;for(let u=0;u{US();yf()});var de={};Vt(de,{Array:()=>IJ,Boolean:()=>BJ,Counter:()=>DJ,Proxy:()=>qS,Rest:()=>PJ,String:()=>bJ,applyValidator:()=>ag,cleanValidationError:()=>QS,formatError:()=>Iw,isOptionSymbol:()=>Cw,makeCommandOption:()=>Wo,rerouteArguments:()=>Yu});var QJ=It(()=>{yf();CL();wJ();vJ();SJ();xJ();kJ()});var Qw={};Vt(Qw,{Builtins:()=>IL,Cli:()=>Ko,Command:()=>ot,Option:()=>de,UsageError:()=>it,formatMarkdownish:()=>yo,run:()=>pJ,runExit:()=>fJ});var Gt=It(()=>{kS();cL();Xp();gJ();CJ();QJ()});var FJ=_((ckt,_qe)=>{_qe.exports={name:"dotenv",version:"16.3.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard","lint-readme":"standard-markdown",pretest:"npm run lint && npm run dts-check",test:"tap tests/*.js --100 -Rspec",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},funding:"https://github.com/motdotla/dotenv?sponsor=1",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@definitelytyped/dtslint":"^0.0.133","@types/node":"^18.11.3",decache:"^4.6.1",sinon:"^14.0.1",standard:"^17.0.0","standard-markdown":"^7.1.0","standard-version":"^9.5.0",tap:"^16.3.0",tar:"^6.1.11",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var NJ=_((ukt,Ef)=>{var RJ=ve("fs"),BL=ve("path"),Hqe=ve("os"),qqe=ve("crypto"),jqe=FJ(),vL=jqe.version,Gqe=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function Wqe(t){let e={},r=t.toString();r=r.replace(/\r\n?/mg,` -`);let o;for(;(o=Gqe.exec(r))!=null;){let a=o[1],n=o[2]||"";n=n.trim();let u=n[0];n=n.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),u==='"'&&(n=n.replace(/\\n/g,` -`),n=n.replace(/\\r/g,"\r")),e[a]=n}return e}function Yqe(t){let e=LJ(t),r=vs.configDotenv({path:e});if(!r.parsed)throw new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);let o=TJ(t).split(","),a=o.length,n;for(let u=0;u=a)throw A}return vs.parse(n)}function Vqe(t){console.log(`[dotenv@${vL}][INFO] ${t}`)}function Kqe(t){console.log(`[dotenv@${vL}][WARN] ${t}`)}function wL(t){console.log(`[dotenv@${vL}][DEBUG] ${t}`)}function TJ(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function Jqe(t,e){let r;try{r=new URL(e)}catch(A){throw A.code==="ERR_INVALID_URL"?new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development"):A}let o=r.password;if(!o)throw new Error("INVALID_DOTENV_KEY: Missing key part");let a=r.searchParams.get("environment");if(!a)throw new Error("INVALID_DOTENV_KEY: Missing environment part");let n=`DOTENV_VAULT_${a.toUpperCase()}`,u=t.parsed[n];if(!u)throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${n} in your .env.vault file.`);return{ciphertext:u,key:o}}function LJ(t){let e=BL.resolve(process.cwd(),".env");return t&&t.path&&t.path.length>0&&(e=t.path),e.endsWith(".vault")?e:`${e}.vault`}function zqe(t){return t[0]==="~"?BL.join(Hqe.homedir(),t.slice(1)):t}function Xqe(t){Vqe("Loading env from encrypted .env.vault");let e=vs._parseVault(t),r=process.env;return t&&t.processEnv!=null&&(r=t.processEnv),vs.populate(r,e,t),{parsed:e}}function Zqe(t){let e=BL.resolve(process.cwd(),".env"),r="utf8",o=!!(t&&t.debug);t&&(t.path!=null&&(e=zqe(t.path)),t.encoding!=null&&(r=t.encoding));try{let a=vs.parse(RJ.readFileSync(e,{encoding:r})),n=process.env;return t&&t.processEnv!=null&&(n=t.processEnv),vs.populate(n,a,t),{parsed:a}}catch(a){return o&&wL(`Failed to load ${e} ${a.message}`),{error:a}}}function $qe(t){let e=LJ(t);return TJ(t).length===0?vs.configDotenv(t):RJ.existsSync(e)?vs._configVault(t):(Kqe(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),vs.configDotenv(t))}function eje(t,e){let r=Buffer.from(e.slice(-64),"hex"),o=Buffer.from(t,"base64"),a=o.slice(0,12),n=o.slice(-16);o=o.slice(12,-16);try{let u=qqe.createDecipheriv("aes-256-gcm",r,a);return u.setAuthTag(n),`${u.update(o)}${u.final()}`}catch(u){let A=u instanceof RangeError,p=u.message==="Invalid key length",h=u.message==="Unsupported state or unable to authenticate data";if(A||p){let E="INVALID_DOTENV_KEY: It must be 64 characters long (or more)";throw new Error(E)}else if(h){let E="DECRYPTION_FAILED: Please check your DOTENV_KEY";throw new Error(E)}else throw console.error("Error: ",u.code),console.error("Error: ",u.message),u}}function tje(t,e,r={}){let o=!!(r&&r.debug),a=!!(r&&r.override);if(typeof e!="object")throw new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");for(let n of Object.keys(e))Object.prototype.hasOwnProperty.call(t,n)?(a===!0&&(t[n]=e[n]),o&&wL(a===!0?`"${n}" is already defined and WAS overwritten`:`"${n}" is already defined and was NOT overwritten`)):t[n]=e[n]}var vs={configDotenv:Zqe,_configVault:Xqe,_parseVault:Yqe,config:$qe,decrypt:eje,parse:Wqe,populate:tje};Ef.exports.configDotenv=vs.configDotenv;Ef.exports._configVault=vs._configVault;Ef.exports._parseVault=vs._parseVault;Ef.exports.config=vs.config;Ef.exports.decrypt=vs.decrypt;Ef.exports.parse=vs.parse;Ef.exports.populate=vs.populate;Ef.exports=vs});var MJ=_((Akt,OJ)=>{"use strict";OJ.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var lg=_((fkt,DL)=>{"use strict";var rje=MJ(),UJ=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,o=()=>{r--,e.length>0&&e.shift()()},a=(A,p,...h)=>{r++;let E=rje(A,...h);p(E),E.then(o,o)},n=(A,p,...h)=>{rnew Promise(h=>n(A,h,...p));return Object.defineProperties(u,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),u};DL.exports=UJ;DL.exports.default=UJ});function Ju(t){return`YN${t.toString(10).padStart(4,"0")}`}function jS(t){let e=Number(t.slice(2));if(typeof vr[e]>"u")throw new Error(`Unknown message name: "${t}"`);return e}var vr,GS=It(()=>{vr=(Me=>(Me[Me.UNNAMED=0]="UNNAMED",Me[Me.EXCEPTION=1]="EXCEPTION",Me[Me.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",Me[Me.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",Me[Me.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",Me[Me.BUILD_DISABLED=5]="BUILD_DISABLED",Me[Me.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",Me[Me.MUST_BUILD=7]="MUST_BUILD",Me[Me.MUST_REBUILD=8]="MUST_REBUILD",Me[Me.BUILD_FAILED=9]="BUILD_FAILED",Me[Me.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",Me[Me.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",Me[Me.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",Me[Me.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",Me[Me.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",Me[Me.REMOTE_INVALID=15]="REMOTE_INVALID",Me[Me.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",Me[Me.RESOLUTION_PACK=17]="RESOLUTION_PACK",Me[Me.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",Me[Me.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",Me[Me.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",Me[Me.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",Me[Me.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",Me[Me.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",Me[Me.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",Me[Me.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",Me[Me.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",Me[Me.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",Me[Me.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",Me[Me.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",Me[Me.FETCH_FAILED=30]="FETCH_FAILED",Me[Me.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",Me[Me.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",Me[Me.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",Me[Me.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",Me[Me.NETWORK_ERROR=35]="NETWORK_ERROR",Me[Me.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",Me[Me.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",Me[Me.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",Me[Me.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",Me[Me.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",Me[Me.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",Me[Me.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",Me[Me.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",Me[Me.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",Me[Me.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",Me[Me.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",Me[Me.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",Me[Me.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",Me[Me.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",Me[Me.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",Me[Me.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",Me[Me.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",Me[Me.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",Me[Me.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",Me[Me.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",Me[Me.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",Me[Me.INVALID_MANIFEST=57]="INVALID_MANIFEST",Me[Me.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",Me[Me.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",Me[Me.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",Me[Me.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",Me[Me.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",Me[Me.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",Me[Me.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",Me[Me.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",Me[Me.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",Me[Me.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",Me[Me.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",Me[Me.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",Me[Me.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",Me[Me.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",Me[Me.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",Me[Me.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",Me[Me.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",Me[Me.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",Me[Me.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",Me[Me.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE",Me[Me.RESOLUTION_MISMATCH=78]="RESOLUTION_MISMATCH",Me[Me.PROLOG_LIMIT_EXCEEDED=79]="PROLOG_LIMIT_EXCEEDED",Me[Me.NETWORK_DISABLED=80]="NETWORK_DISABLED",Me[Me.NETWORK_UNSAFE_HTTP=81]="NETWORK_UNSAFE_HTTP",Me[Me.RESOLUTION_FAILED=82]="RESOLUTION_FAILED",Me[Me.AUTOMERGE_GIT_ERROR=83]="AUTOMERGE_GIT_ERROR",Me[Me.CONSTRAINTS_CHECK_FAILED=84]="CONSTRAINTS_CHECK_FAILED",Me[Me.UPDATED_RESOLUTION_RECORD=85]="UPDATED_RESOLUTION_RECORD",Me[Me.EXPLAIN_PEER_DEPENDENCIES_CTA=86]="EXPLAIN_PEER_DEPENDENCIES_CTA",Me[Me.MIGRATION_SUCCESS=87]="MIGRATION_SUCCESS",Me[Me.VERSION_NOTICE=88]="VERSION_NOTICE",Me[Me.TIPS_NOTICE=89]="TIPS_NOTICE",Me[Me.OFFLINE_MODE_ENABLED=90]="OFFLINE_MODE_ENABLED",Me))(vr||{})});var Fw=_((hkt,_J)=>{var nje="2.0.0",ije=Number.MAX_SAFE_INTEGER||9007199254740991,sje=16,oje=250,aje=["major","premajor","minor","preminor","patch","prepatch","prerelease"];_J.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:sje,MAX_SAFE_BUILD_LENGTH:oje,MAX_SAFE_INTEGER:ije,RELEASE_TYPES:aje,SEMVER_SPEC_VERSION:nje,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Rw=_((gkt,HJ)=>{var lje=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};HJ.exports=lje});var bm=_((Cf,qJ)=>{var{MAX_SAFE_COMPONENT_LENGTH:SL,MAX_SAFE_BUILD_LENGTH:cje,MAX_LENGTH:uje}=Fw(),Aje=Rw();Cf=qJ.exports={};var fje=Cf.re=[],pje=Cf.safeRe=[],tr=Cf.src=[],rr=Cf.t={},hje=0,PL="[a-zA-Z0-9-]",gje=[["\\s",1],["\\d",uje],[PL,cje]],dje=t=>{for(let[e,r]of gje)t=t.split(`${e}*`).join(`${e}{0,${r}}`).split(`${e}+`).join(`${e}{1,${r}}`);return t},Gr=(t,e,r)=>{let o=dje(e),a=hje++;Aje(t,a,e),rr[t]=a,tr[a]=e,fje[a]=new RegExp(e,r?"g":void 0),pje[a]=new RegExp(o,r?"g":void 0)};Gr("NUMERICIDENTIFIER","0|[1-9]\\d*");Gr("NUMERICIDENTIFIERLOOSE","\\d+");Gr("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${PL}*`);Gr("MAINVERSION",`(${tr[rr.NUMERICIDENTIFIER]})\\.(${tr[rr.NUMERICIDENTIFIER]})\\.(${tr[rr.NUMERICIDENTIFIER]})`);Gr("MAINVERSIONLOOSE",`(${tr[rr.NUMERICIDENTIFIERLOOSE]})\\.(${tr[rr.NUMERICIDENTIFIERLOOSE]})\\.(${tr[rr.NUMERICIDENTIFIERLOOSE]})`);Gr("PRERELEASEIDENTIFIER",`(?:${tr[rr.NUMERICIDENTIFIER]}|${tr[rr.NONNUMERICIDENTIFIER]})`);Gr("PRERELEASEIDENTIFIERLOOSE",`(?:${tr[rr.NUMERICIDENTIFIERLOOSE]}|${tr[rr.NONNUMERICIDENTIFIER]})`);Gr("PRERELEASE",`(?:-(${tr[rr.PRERELEASEIDENTIFIER]}(?:\\.${tr[rr.PRERELEASEIDENTIFIER]})*))`);Gr("PRERELEASELOOSE",`(?:-?(${tr[rr.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${tr[rr.PRERELEASEIDENTIFIERLOOSE]})*))`);Gr("BUILDIDENTIFIER",`${PL}+`);Gr("BUILD",`(?:\\+(${tr[rr.BUILDIDENTIFIER]}(?:\\.${tr[rr.BUILDIDENTIFIER]})*))`);Gr("FULLPLAIN",`v?${tr[rr.MAINVERSION]}${tr[rr.PRERELEASE]}?${tr[rr.BUILD]}?`);Gr("FULL",`^${tr[rr.FULLPLAIN]}$`);Gr("LOOSEPLAIN",`[v=\\s]*${tr[rr.MAINVERSIONLOOSE]}${tr[rr.PRERELEASELOOSE]}?${tr[rr.BUILD]}?`);Gr("LOOSE",`^${tr[rr.LOOSEPLAIN]}$`);Gr("GTLT","((?:<|>)?=?)");Gr("XRANGEIDENTIFIERLOOSE",`${tr[rr.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);Gr("XRANGEIDENTIFIER",`${tr[rr.NUMERICIDENTIFIER]}|x|X|\\*`);Gr("XRANGEPLAIN",`[v=\\s]*(${tr[rr.XRANGEIDENTIFIER]})(?:\\.(${tr[rr.XRANGEIDENTIFIER]})(?:\\.(${tr[rr.XRANGEIDENTIFIER]})(?:${tr[rr.PRERELEASE]})?${tr[rr.BUILD]}?)?)?`);Gr("XRANGEPLAINLOOSE",`[v=\\s]*(${tr[rr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${tr[rr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${tr[rr.XRANGEIDENTIFIERLOOSE]})(?:${tr[rr.PRERELEASELOOSE]})?${tr[rr.BUILD]}?)?)?`);Gr("XRANGE",`^${tr[rr.GTLT]}\\s*${tr[rr.XRANGEPLAIN]}$`);Gr("XRANGELOOSE",`^${tr[rr.GTLT]}\\s*${tr[rr.XRANGEPLAINLOOSE]}$`);Gr("COERCEPLAIN",`(^|[^\\d])(\\d{1,${SL}})(?:\\.(\\d{1,${SL}}))?(?:\\.(\\d{1,${SL}}))?`);Gr("COERCE",`${tr[rr.COERCEPLAIN]}(?:$|[^\\d])`);Gr("COERCEFULL",tr[rr.COERCEPLAIN]+`(?:${tr[rr.PRERELEASE]})?(?:${tr[rr.BUILD]})?(?:$|[^\\d])`);Gr("COERCERTL",tr[rr.COERCE],!0);Gr("COERCERTLFULL",tr[rr.COERCEFULL],!0);Gr("LONETILDE","(?:~>?)");Gr("TILDETRIM",`(\\s*)${tr[rr.LONETILDE]}\\s+`,!0);Cf.tildeTrimReplace="$1~";Gr("TILDE",`^${tr[rr.LONETILDE]}${tr[rr.XRANGEPLAIN]}$`);Gr("TILDELOOSE",`^${tr[rr.LONETILDE]}${tr[rr.XRANGEPLAINLOOSE]}$`);Gr("LONECARET","(?:\\^)");Gr("CARETTRIM",`(\\s*)${tr[rr.LONECARET]}\\s+`,!0);Cf.caretTrimReplace="$1^";Gr("CARET",`^${tr[rr.LONECARET]}${tr[rr.XRANGEPLAIN]}$`);Gr("CARETLOOSE",`^${tr[rr.LONECARET]}${tr[rr.XRANGEPLAINLOOSE]}$`);Gr("COMPARATORLOOSE",`^${tr[rr.GTLT]}\\s*(${tr[rr.LOOSEPLAIN]})$|^$`);Gr("COMPARATOR",`^${tr[rr.GTLT]}\\s*(${tr[rr.FULLPLAIN]})$|^$`);Gr("COMPARATORTRIM",`(\\s*)${tr[rr.GTLT]}\\s*(${tr[rr.LOOSEPLAIN]}|${tr[rr.XRANGEPLAIN]})`,!0);Cf.comparatorTrimReplace="$1$2$3";Gr("HYPHENRANGE",`^\\s*(${tr[rr.XRANGEPLAIN]})\\s+-\\s+(${tr[rr.XRANGEPLAIN]})\\s*$`);Gr("HYPHENRANGELOOSE",`^\\s*(${tr[rr.XRANGEPLAINLOOSE]})\\s+-\\s+(${tr[rr.XRANGEPLAINLOOSE]})\\s*$`);Gr("STAR","(<|>)?=?\\s*\\*");Gr("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");Gr("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var WS=_((dkt,jJ)=>{var mje=Object.freeze({loose:!0}),yje=Object.freeze({}),Eje=t=>t?typeof t!="object"?mje:t:yje;jJ.exports=Eje});var xL=_((mkt,YJ)=>{var GJ=/^[0-9]+$/,WJ=(t,e)=>{let r=GJ.test(t),o=GJ.test(e);return r&&o&&(t=+t,e=+e),t===e?0:r&&!o?-1:o&&!r?1:tWJ(e,t);YJ.exports={compareIdentifiers:WJ,rcompareIdentifiers:Cje}});var Eo=_((ykt,zJ)=>{var YS=Rw(),{MAX_LENGTH:VJ,MAX_SAFE_INTEGER:VS}=Fw(),{safeRe:KJ,t:JJ}=bm(),Ije=WS(),{compareIdentifiers:km}=xL(),bL=class t{constructor(e,r){if(r=Ije(r),e instanceof t){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>VJ)throw new TypeError(`version is longer than ${VJ} characters`);YS("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let o=e.trim().match(r.loose?KJ[JJ.LOOSE]:KJ[JJ.FULL]);if(!o)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+o[1],this.minor=+o[2],this.patch=+o[3],this.major>VS||this.major<0)throw new TypeError("Invalid major version");if(this.minor>VS||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>VS||this.patch<0)throw new TypeError("Invalid patch version");o[4]?this.prerelease=o[4].split(".").map(a=>{if(/^[0-9]+$/.test(a)){let n=+a;if(n>=0&&n=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(r===this.prerelease.join(".")&&o===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(a)}}if(r){let n=[r,a];o===!1&&(n=[r]),km(this.prerelease[0],r)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};zJ.exports=bL});var cg=_((Ekt,ZJ)=>{var XJ=Eo(),wje=(t,e,r=!1)=>{if(t instanceof XJ)return t;try{return new XJ(t,e)}catch(o){if(!r)return null;throw o}};ZJ.exports=wje});var ez=_((Ckt,$J)=>{var Bje=cg(),vje=(t,e)=>{let r=Bje(t,e);return r?r.version:null};$J.exports=vje});var rz=_((Ikt,tz)=>{var Dje=cg(),Sje=(t,e)=>{let r=Dje(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};tz.exports=Sje});var sz=_((wkt,iz)=>{var nz=Eo(),Pje=(t,e,r,o,a)=>{typeof r=="string"&&(a=o,o=r,r=void 0);try{return new nz(t instanceof nz?t.version:t,r).inc(e,o,a).version}catch{return null}};iz.exports=Pje});var lz=_((Bkt,az)=>{var oz=cg(),xje=(t,e)=>{let r=oz(t,null,!0),o=oz(e,null,!0),a=r.compare(o);if(a===0)return null;let n=a>0,u=n?r:o,A=n?o:r,p=!!u.prerelease.length;if(!!A.prerelease.length&&!p)return!A.patch&&!A.minor?"major":u.patch?"patch":u.minor?"minor":"major";let E=p?"pre":"";return r.major!==o.major?E+"major":r.minor!==o.minor?E+"minor":r.patch!==o.patch?E+"patch":"prerelease"};az.exports=xje});var uz=_((vkt,cz)=>{var bje=Eo(),kje=(t,e)=>new bje(t,e).major;cz.exports=kje});var fz=_((Dkt,Az)=>{var Qje=Eo(),Fje=(t,e)=>new Qje(t,e).minor;Az.exports=Fje});var hz=_((Skt,pz)=>{var Rje=Eo(),Tje=(t,e)=>new Rje(t,e).patch;pz.exports=Tje});var dz=_((Pkt,gz)=>{var Lje=cg(),Nje=(t,e)=>{let r=Lje(t,e);return r&&r.prerelease.length?r.prerelease:null};gz.exports=Nje});var Ml=_((xkt,yz)=>{var mz=Eo(),Oje=(t,e,r)=>new mz(t,r).compare(new mz(e,r));yz.exports=Oje});var Cz=_((bkt,Ez)=>{var Mje=Ml(),Uje=(t,e,r)=>Mje(e,t,r);Ez.exports=Uje});var wz=_((kkt,Iz)=>{var _je=Ml(),Hje=(t,e)=>_je(t,e,!0);Iz.exports=Hje});var KS=_((Qkt,vz)=>{var Bz=Eo(),qje=(t,e,r)=>{let o=new Bz(t,r),a=new Bz(e,r);return o.compare(a)||o.compareBuild(a)};vz.exports=qje});var Sz=_((Fkt,Dz)=>{var jje=KS(),Gje=(t,e)=>t.sort((r,o)=>jje(r,o,e));Dz.exports=Gje});var xz=_((Rkt,Pz)=>{var Wje=KS(),Yje=(t,e)=>t.sort((r,o)=>Wje(o,r,e));Pz.exports=Yje});var Tw=_((Tkt,bz)=>{var Vje=Ml(),Kje=(t,e,r)=>Vje(t,e,r)>0;bz.exports=Kje});var JS=_((Lkt,kz)=>{var Jje=Ml(),zje=(t,e,r)=>Jje(t,e,r)<0;kz.exports=zje});var kL=_((Nkt,Qz)=>{var Xje=Ml(),Zje=(t,e,r)=>Xje(t,e,r)===0;Qz.exports=Zje});var QL=_((Okt,Fz)=>{var $je=Ml(),eGe=(t,e,r)=>$je(t,e,r)!==0;Fz.exports=eGe});var zS=_((Mkt,Rz)=>{var tGe=Ml(),rGe=(t,e,r)=>tGe(t,e,r)>=0;Rz.exports=rGe});var XS=_((Ukt,Tz)=>{var nGe=Ml(),iGe=(t,e,r)=>nGe(t,e,r)<=0;Tz.exports=iGe});var FL=_((_kt,Lz)=>{var sGe=kL(),oGe=QL(),aGe=Tw(),lGe=zS(),cGe=JS(),uGe=XS(),AGe=(t,e,r,o)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return sGe(t,r,o);case"!=":return oGe(t,r,o);case">":return aGe(t,r,o);case">=":return lGe(t,r,o);case"<":return cGe(t,r,o);case"<=":return uGe(t,r,o);default:throw new TypeError(`Invalid operator: ${e}`)}};Lz.exports=AGe});var Oz=_((Hkt,Nz)=>{var fGe=Eo(),pGe=cg(),{safeRe:ZS,t:$S}=bm(),hGe=(t,e)=>{if(t instanceof fGe)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(e.includePrerelease?ZS[$S.COERCEFULL]:ZS[$S.COERCE]);else{let p=e.includePrerelease?ZS[$S.COERCERTLFULL]:ZS[$S.COERCERTL],h;for(;(h=p.exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||h.index+h[0].length!==r.index+r[0].length)&&(r=h),p.lastIndex=h.index+h[1].length+h[2].length;p.lastIndex=-1}if(r===null)return null;let o=r[2],a=r[3]||"0",n=r[4]||"0",u=e.includePrerelease&&r[5]?`-${r[5]}`:"",A=e.includePrerelease&&r[6]?`+${r[6]}`:"";return pGe(`${o}.${a}.${n}${u}${A}`,e)};Nz.exports=hGe});var Uz=_((qkt,Mz)=>{"use strict";Mz.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var eP=_((jkt,_z)=>{"use strict";_z.exports=xn;xn.Node=ug;xn.create=xn;function xn(t){var e=this;if(e instanceof xn||(e=new xn),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(a){e.push(a)});else if(arguments.length>0)for(var r=0,o=arguments.length;r1)r=e;else if(this.head)o=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=0;o!==null;a++)r=t(r,o.value,a),o=o.next;return r};xn.prototype.reduceReverse=function(t,e){var r,o=this.tail;if(arguments.length>1)r=e;else if(this.tail)o=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=this.length-1;o!==null;a--)r=t(r,o.value,a),o=o.prev;return r};xn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};xn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};xn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new xn;if(ethis.length&&(e=this.length);for(var o=0,a=this.head;a!==null&&othis.length&&(e=this.length);for(var o=this.length,a=this.tail;a!==null&&o>e;o--)a=a.prev;for(;a!==null&&o>t;o--,a=a.prev)r.push(a.value);return r};xn.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var o=0,a=this.head;a!==null&&o{"use strict";var yGe=eP(),Ag=Symbol("max"),wf=Symbol("length"),Qm=Symbol("lengthCalculator"),Nw=Symbol("allowStale"),fg=Symbol("maxAge"),If=Symbol("dispose"),Hz=Symbol("noDisposeOnSet"),Ds=Symbol("lruList"),Gc=Symbol("cache"),jz=Symbol("updateAgeOnGet"),RL=()=>1,LL=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[Ag]=e.max||1/0,o=e.length||RL;if(this[Qm]=typeof o!="function"?RL:o,this[Nw]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[fg]=e.maxAge||0,this[If]=e.dispose,this[Hz]=e.noDisposeOnSet||!1,this[jz]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[Ag]=e||1/0,Lw(this)}get max(){return this[Ag]}set allowStale(e){this[Nw]=!!e}get allowStale(){return this[Nw]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[fg]=e,Lw(this)}get maxAge(){return this[fg]}set lengthCalculator(e){typeof e!="function"&&(e=RL),e!==this[Qm]&&(this[Qm]=e,this[wf]=0,this[Ds].forEach(r=>{r.length=this[Qm](r.value,r.key),this[wf]+=r.length})),Lw(this)}get lengthCalculator(){return this[Qm]}get length(){return this[wf]}get itemCount(){return this[Ds].length}rforEach(e,r){r=r||this;for(let o=this[Ds].tail;o!==null;){let a=o.prev;qz(this,e,o,r),o=a}}forEach(e,r){r=r||this;for(let o=this[Ds].head;o!==null;){let a=o.next;qz(this,e,o,r),o=a}}keys(){return this[Ds].toArray().map(e=>e.key)}values(){return this[Ds].toArray().map(e=>e.value)}reset(){this[If]&&this[Ds]&&this[Ds].length&&this[Ds].forEach(e=>this[If](e.key,e.value)),this[Gc]=new Map,this[Ds]=new yGe,this[wf]=0}dump(){return this[Ds].map(e=>tP(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[Ds]}set(e,r,o){if(o=o||this[fg],o&&typeof o!="number")throw new TypeError("maxAge must be a number");let a=o?Date.now():0,n=this[Qm](r,e);if(this[Gc].has(e)){if(n>this[Ag])return Fm(this,this[Gc].get(e)),!1;let p=this[Gc].get(e).value;return this[If]&&(this[Hz]||this[If](e,p.value)),p.now=a,p.maxAge=o,p.value=r,this[wf]+=n-p.length,p.length=n,this.get(e),Lw(this),!0}let u=new NL(e,r,n,a,o);return u.length>this[Ag]?(this[If]&&this[If](e,r),!1):(this[wf]+=u.length,this[Ds].unshift(u),this[Gc].set(e,this[Ds].head),Lw(this),!0)}has(e){if(!this[Gc].has(e))return!1;let r=this[Gc].get(e).value;return!tP(this,r)}get(e){return TL(this,e,!0)}peek(e){return TL(this,e,!1)}pop(){let e=this[Ds].tail;return e?(Fm(this,e),e.value):null}del(e){Fm(this,this[Gc].get(e))}load(e){this.reset();let r=Date.now();for(let o=e.length-1;o>=0;o--){let a=e[o],n=a.e||0;if(n===0)this.set(a.k,a.v);else{let u=n-r;u>0&&this.set(a.k,a.v,u)}}}prune(){this[Gc].forEach((e,r)=>TL(this,r,!1))}},TL=(t,e,r)=>{let o=t[Gc].get(e);if(o){let a=o.value;if(tP(t,a)){if(Fm(t,o),!t[Nw])return}else r&&(t[jz]&&(o.value.now=Date.now()),t[Ds].unshiftNode(o));return a.value}},tP=(t,e)=>{if(!e||!e.maxAge&&!t[fg])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[fg]&&r>t[fg]},Lw=t=>{if(t[wf]>t[Ag])for(let e=t[Ds].tail;t[wf]>t[Ag]&&e!==null;){let r=e.prev;Fm(t,e),e=r}},Fm=(t,e)=>{if(e){let r=e.value;t[If]&&t[If](r.key,r.value),t[wf]-=r.length,t[Gc].delete(r.key),t[Ds].removeNode(e)}},NL=class{constructor(e,r,o,a,n){this.key=e,this.value=r,this.length=o,this.now=a,this.maxAge=n||0}},qz=(t,e,r,o)=>{let a=r.value;tP(t,a)&&(Fm(t,r),t[Nw]||(a=void 0)),a&&e.call(o,a.value,a.key,t)};Gz.exports=LL});var Ul=_((Wkt,Jz)=>{var OL=class t{constructor(e,r){if(r=CGe(r),e instanceof t)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new t(e.raw,r);if(e instanceof ML)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e.trim().split(/\s+/).join(" "),this.set=this.raw.split("||").map(o=>this.parseRange(o.trim())).filter(o=>o.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let o=this.set[0];if(this.set=this.set.filter(a=>!Vz(a[0])),this.set.length===0)this.set=[o];else if(this.set.length>1){for(let a of this.set)if(a.length===1&&PGe(a[0])){this.set=[a];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){let o=((this.options.includePrerelease&&DGe)|(this.options.loose&&SGe))+":"+e,a=Yz.get(o);if(a)return a;let n=this.options.loose,u=n?xa[Jo.HYPHENRANGELOOSE]:xa[Jo.HYPHENRANGE];e=e.replace(u,OGe(this.options.includePrerelease)),gi("hyphen replace",e),e=e.replace(xa[Jo.COMPARATORTRIM],wGe),gi("comparator trim",e),e=e.replace(xa[Jo.TILDETRIM],BGe),gi("tilde trim",e),e=e.replace(xa[Jo.CARETTRIM],vGe),gi("caret trim",e);let A=e.split(" ").map(w=>xGe(w,this.options)).join(" ").split(/\s+/).map(w=>NGe(w,this.options));n&&(A=A.filter(w=>(gi("loose invalid filter",w,this.options),!!w.match(xa[Jo.COMPARATORLOOSE])))),gi("range list",A);let p=new Map,h=A.map(w=>new ML(w,this.options));for(let w of h){if(Vz(w))return[w];p.set(w.value,w)}p.size>1&&p.has("")&&p.delete("");let E=[...p.values()];return Yz.set(o,E),E}intersects(e,r){if(!(e instanceof t))throw new TypeError("a Range is required");return this.set.some(o=>Kz(o,r)&&e.set.some(a=>Kz(a,r)&&o.every(n=>a.every(u=>n.intersects(u,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new IGe(e,this.options)}catch{return!1}for(let r=0;rt.value==="<0.0.0-0",PGe=t=>t.value==="",Kz=(t,e)=>{let r=!0,o=t.slice(),a=o.pop();for(;r&&o.length;)r=o.every(n=>a.intersects(n,e)),a=o.pop();return r},xGe=(t,e)=>(gi("comp",t,e),t=QGe(t,e),gi("caret",t),t=bGe(t,e),gi("tildes",t),t=RGe(t,e),gi("xrange",t),t=LGe(t,e),gi("stars",t),t),zo=t=>!t||t.toLowerCase()==="x"||t==="*",bGe=(t,e)=>t.trim().split(/\s+/).map(r=>kGe(r,e)).join(" "),kGe=(t,e)=>{let r=e.loose?xa[Jo.TILDELOOSE]:xa[Jo.TILDE];return t.replace(r,(o,a,n,u,A)=>{gi("tilde",t,o,a,n,u,A);let p;return zo(a)?p="":zo(n)?p=`>=${a}.0.0 <${+a+1}.0.0-0`:zo(u)?p=`>=${a}.${n}.0 <${a}.${+n+1}.0-0`:A?(gi("replaceTilde pr",A),p=`>=${a}.${n}.${u}-${A} <${a}.${+n+1}.0-0`):p=`>=${a}.${n}.${u} <${a}.${+n+1}.0-0`,gi("tilde return",p),p})},QGe=(t,e)=>t.trim().split(/\s+/).map(r=>FGe(r,e)).join(" "),FGe=(t,e)=>{gi("caret",t,e);let r=e.loose?xa[Jo.CARETLOOSE]:xa[Jo.CARET],o=e.includePrerelease?"-0":"";return t.replace(r,(a,n,u,A,p)=>{gi("caret",t,a,n,u,A,p);let h;return zo(n)?h="":zo(u)?h=`>=${n}.0.0${o} <${+n+1}.0.0-0`:zo(A)?n==="0"?h=`>=${n}.${u}.0${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.0${o} <${+n+1}.0.0-0`:p?(gi("replaceCaret pr",p),n==="0"?u==="0"?h=`>=${n}.${u}.${A}-${p} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}-${p} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A}-${p} <${+n+1}.0.0-0`):(gi("no pr"),n==="0"?u==="0"?h=`>=${n}.${u}.${A}${o} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A} <${+n+1}.0.0-0`),gi("caret return",h),h})},RGe=(t,e)=>(gi("replaceXRanges",t,e),t.split(/\s+/).map(r=>TGe(r,e)).join(" ")),TGe=(t,e)=>{t=t.trim();let r=e.loose?xa[Jo.XRANGELOOSE]:xa[Jo.XRANGE];return t.replace(r,(o,a,n,u,A,p)=>{gi("xRange",t,o,a,n,u,A,p);let h=zo(n),E=h||zo(u),w=E||zo(A),D=w;return a==="="&&D&&(a=""),p=e.includePrerelease?"-0":"",h?a===">"||a==="<"?o="<0.0.0-0":o="*":a&&D?(E&&(u=0),A=0,a===">"?(a=">=",E?(n=+n+1,u=0,A=0):(u=+u+1,A=0)):a==="<="&&(a="<",E?n=+n+1:u=+u+1),a==="<"&&(p="-0"),o=`${a+n}.${u}.${A}${p}`):E?o=`>=${n}.0.0${p} <${+n+1}.0.0-0`:w&&(o=`>=${n}.${u}.0${p} <${n}.${+u+1}.0-0`),gi("xRange return",o),o})},LGe=(t,e)=>(gi("replaceStars",t,e),t.trim().replace(xa[Jo.STAR],"")),NGe=(t,e)=>(gi("replaceGTE0",t,e),t.trim().replace(xa[e.includePrerelease?Jo.GTE0PRE:Jo.GTE0],"")),OGe=t=>(e,r,o,a,n,u,A,p,h,E,w,D,b)=>(zo(o)?r="":zo(a)?r=`>=${o}.0.0${t?"-0":""}`:zo(n)?r=`>=${o}.${a}.0${t?"-0":""}`:u?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,zo(h)?p="":zo(E)?p=`<${+h+1}.0.0-0`:zo(w)?p=`<${h}.${+E+1}.0-0`:D?p=`<=${h}.${E}.${w}-${D}`:t?p=`<${h}.${E}.${+w+1}-0`:p=`<=${p}`,`${r} ${p}`.trim()),MGe=(t,e,r)=>{for(let o=0;o0){let a=t[o].semver;if(a.major===e.major&&a.minor===e.minor&&a.patch===e.patch)return!0}return!1}return!0}});var Ow=_((Ykt,tX)=>{var Mw=Symbol("SemVer ANY"),HL=class t{static get ANY(){return Mw}constructor(e,r){if(r=zz(r),e instanceof t){if(e.loose===!!r.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),_L("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===Mw?this.value="":this.value=this.operator+this.semver.version,_L("comp",this)}parse(e){let r=this.options.loose?Xz[Zz.COMPARATORLOOSE]:Xz[Zz.COMPARATOR],o=e.match(r);if(!o)throw new TypeError(`Invalid comparator: ${e}`);this.operator=o[1]!==void 0?o[1]:"",this.operator==="="&&(this.operator=""),o[2]?this.semver=new $z(o[2],this.options.loose):this.semver=Mw}toString(){return this.value}test(e){if(_L("Comparator.test",e,this.options.loose),this.semver===Mw||e===Mw)return!0;if(typeof e=="string")try{e=new $z(e,this.options)}catch{return!1}return UL(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof t))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new eX(e.value,r).test(this.value):e.operator===""?e.value===""?!0:new eX(this.value,r).test(e.semver):(r=zz(r),r.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!r.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||UL(this.semver,"<",e.semver,r)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||UL(this.semver,">",e.semver,r)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};tX.exports=HL;var zz=WS(),{safeRe:Xz,t:Zz}=bm(),UL=FL(),_L=Rw(),$z=Eo(),eX=Ul()});var Uw=_((Vkt,rX)=>{var UGe=Ul(),_Ge=(t,e,r)=>{try{e=new UGe(e,r)}catch{return!1}return e.test(t)};rX.exports=_Ge});var iX=_((Kkt,nX)=>{var HGe=Ul(),qGe=(t,e)=>new HGe(t,e).set.map(r=>r.map(o=>o.value).join(" ").trim().split(" "));nX.exports=qGe});var oX=_((Jkt,sX)=>{var jGe=Eo(),GGe=Ul(),WGe=(t,e,r)=>{let o=null,a=null,n=null;try{n=new GGe(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===-1)&&(o=u,a=new jGe(o,r))}),o};sX.exports=WGe});var lX=_((zkt,aX)=>{var YGe=Eo(),VGe=Ul(),KGe=(t,e,r)=>{let o=null,a=null,n=null;try{n=new VGe(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===1)&&(o=u,a=new YGe(o,r))}),o};aX.exports=KGe});var AX=_((Xkt,uX)=>{var qL=Eo(),JGe=Ul(),cX=Tw(),zGe=(t,e)=>{t=new JGe(t,e);let r=new qL("0.0.0");if(t.test(r)||(r=new qL("0.0.0-0"),t.test(r)))return r;r=null;for(let o=0;o{let A=new qL(u.semver.version);switch(u.operator){case">":A.prerelease.length===0?A.patch++:A.prerelease.push(0),A.raw=A.format();case"":case">=":(!n||cX(A,n))&&(n=A);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${u.operator}`)}}),n&&(!r||cX(r,n))&&(r=n)}return r&&t.test(r)?r:null};uX.exports=zGe});var pX=_((Zkt,fX)=>{var XGe=Ul(),ZGe=(t,e)=>{try{return new XGe(t,e).range||"*"}catch{return null}};fX.exports=ZGe});var rP=_(($kt,mX)=>{var $Ge=Eo(),dX=Ow(),{ANY:e5e}=dX,t5e=Ul(),r5e=Uw(),hX=Tw(),gX=JS(),n5e=XS(),i5e=zS(),s5e=(t,e,r,o)=>{t=new $Ge(t,o),e=new t5e(e,o);let a,n,u,A,p;switch(r){case">":a=hX,n=n5e,u=gX,A=">",p=">=";break;case"<":a=gX,n=i5e,u=hX,A="<",p="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(r5e(t,e,o))return!1;for(let h=0;h{b.semver===e5e&&(b=new dX(">=0.0.0")),w=w||b,D=D||b,a(b.semver,w.semver,o)?w=b:u(b.semver,D.semver,o)&&(D=b)}),w.operator===A||w.operator===p||(!D.operator||D.operator===A)&&n(t,D.semver))return!1;if(D.operator===p&&u(t,D.semver))return!1}return!0};mX.exports=s5e});var EX=_((eQt,yX)=>{var o5e=rP(),a5e=(t,e,r)=>o5e(t,e,">",r);yX.exports=a5e});var IX=_((tQt,CX)=>{var l5e=rP(),c5e=(t,e,r)=>l5e(t,e,"<",r);CX.exports=c5e});var vX=_((rQt,BX)=>{var wX=Ul(),u5e=(t,e,r)=>(t=new wX(t,r),e=new wX(e,r),t.intersects(e,r));BX.exports=u5e});var SX=_((nQt,DX)=>{var A5e=Uw(),f5e=Ml();DX.exports=(t,e,r)=>{let o=[],a=null,n=null,u=t.sort((E,w)=>f5e(E,w,r));for(let E of u)A5e(E,e,r)?(n=E,a||(a=E)):(n&&o.push([a,n]),n=null,a=null);a&&o.push([a,null]);let A=[];for(let[E,w]of o)E===w?A.push(E):!w&&E===u[0]?A.push("*"):w?E===u[0]?A.push(`<=${w}`):A.push(`${E} - ${w}`):A.push(`>=${E}`);let p=A.join(" || "),h=typeof e.raw=="string"?e.raw:String(e);return p.length{var PX=Ul(),WL=Ow(),{ANY:jL}=WL,_w=Uw(),YL=Ml(),p5e=(t,e,r={})=>{if(t===e)return!0;t=new PX(t,r),e=new PX(e,r);let o=!1;e:for(let a of t.set){for(let n of e.set){let u=g5e(a,n,r);if(o=o||u!==null,u)continue e}if(o)return!1}return!0},h5e=[new WL(">=0.0.0-0")],xX=[new WL(">=0.0.0")],g5e=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===jL){if(e.length===1&&e[0].semver===jL)return!0;r.includePrerelease?t=h5e:t=xX}if(e.length===1&&e[0].semver===jL){if(r.includePrerelease)return!0;e=xX}let o=new Set,a,n;for(let b of t)b.operator===">"||b.operator===">="?a=bX(a,b,r):b.operator==="<"||b.operator==="<="?n=kX(n,b,r):o.add(b.semver);if(o.size>1)return null;let u;if(a&&n){if(u=YL(a.semver,n.semver,r),u>0)return null;if(u===0&&(a.operator!==">="||n.operator!=="<="))return null}for(let b of o){if(a&&!_w(b,String(a),r)||n&&!_w(b,String(n),r))return null;for(let C of e)if(!_w(b,String(C),r))return!1;return!0}let A,p,h,E,w=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1,D=a&&!r.includePrerelease&&a.semver.prerelease.length?a.semver:!1;w&&w.prerelease.length===1&&n.operator==="<"&&w.prerelease[0]===0&&(w=!1);for(let b of e){if(E=E||b.operator===">"||b.operator===">=",h=h||b.operator==="<"||b.operator==="<=",a){if(D&&b.semver.prerelease&&b.semver.prerelease.length&&b.semver.major===D.major&&b.semver.minor===D.minor&&b.semver.patch===D.patch&&(D=!1),b.operator===">"||b.operator===">="){if(A=bX(a,b,r),A===b&&A!==a)return!1}else if(a.operator===">="&&!_w(a.semver,String(b),r))return!1}if(n){if(w&&b.semver.prerelease&&b.semver.prerelease.length&&b.semver.major===w.major&&b.semver.minor===w.minor&&b.semver.patch===w.patch&&(w=!1),b.operator==="<"||b.operator==="<="){if(p=kX(n,b,r),p===b&&p!==n)return!1}else if(n.operator==="<="&&!_w(n.semver,String(b),r))return!1}if(!b.operator&&(n||a)&&u!==0)return!1}return!(a&&h&&!n&&u!==0||n&&E&&!a&&u!==0||D||w)},bX=(t,e,r)=>{if(!t)return e;let o=YL(t.semver,e.semver,r);return o>0?t:o<0||e.operator===">"&&t.operator===">="?e:t},kX=(t,e,r)=>{if(!t)return e;let o=YL(t.semver,e.semver,r);return o<0?t:o>0||e.operator==="<"&&t.operator==="<="?e:t};QX.exports=p5e});var ni=_((sQt,LX)=>{var VL=bm(),RX=Fw(),d5e=Eo(),TX=xL(),m5e=cg(),y5e=ez(),E5e=rz(),C5e=sz(),I5e=lz(),w5e=uz(),B5e=fz(),v5e=hz(),D5e=dz(),S5e=Ml(),P5e=Cz(),x5e=wz(),b5e=KS(),k5e=Sz(),Q5e=xz(),F5e=Tw(),R5e=JS(),T5e=kL(),L5e=QL(),N5e=zS(),O5e=XS(),M5e=FL(),U5e=Oz(),_5e=Ow(),H5e=Ul(),q5e=Uw(),j5e=iX(),G5e=oX(),W5e=lX(),Y5e=AX(),V5e=pX(),K5e=rP(),J5e=EX(),z5e=IX(),X5e=vX(),Z5e=SX(),$5e=FX();LX.exports={parse:m5e,valid:y5e,clean:E5e,inc:C5e,diff:I5e,major:w5e,minor:B5e,patch:v5e,prerelease:D5e,compare:S5e,rcompare:P5e,compareLoose:x5e,compareBuild:b5e,sort:k5e,rsort:Q5e,gt:F5e,lt:R5e,eq:T5e,neq:L5e,gte:N5e,lte:O5e,cmp:M5e,coerce:U5e,Comparator:_5e,Range:H5e,satisfies:q5e,toComparators:j5e,maxSatisfying:G5e,minSatisfying:W5e,minVersion:Y5e,validRange:V5e,outside:K5e,gtr:J5e,ltr:z5e,intersects:X5e,simplifyRange:Z5e,subset:$5e,SemVer:d5e,re:VL.re,src:VL.src,tokens:VL.t,SEMVER_SPEC_VERSION:RX.SEMVER_SPEC_VERSION,RELEASE_TYPES:RX.RELEASE_TYPES,compareIdentifiers:TX.compareIdentifiers,rcompareIdentifiers:TX.rcompareIdentifiers}});var OX=_((oQt,NX)=>{"use strict";function e9e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function pg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,pg)}e9e(pg,Error);pg.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,D=1;w{switch(Fe[1]){case"|":return be|Fe[3];case"&":return be&Fe[3];case"^":return be^Fe[3]}},$)},D="!",b=Le("!",!1),C=function($){return!$},T="(",N=Le("(",!1),U=")",J=Le(")",!1),te=function($){return $},le=/^[^ \t\n\r()!|&\^]/,ce=Te([" "," ",` -`,"\r","(",")","!","|","&","^"],!0,!1),ue=function($){return e.queryPattern.test($)},Ie=function($){return e.checkFn($)},he=xe("whitespace"),De=/^[ \t\n\r]/,Ee=Te([" "," ",` -`,"\r"],!1,!1),g=0,me=0,Ce=[{line:1,column:1}],fe=0,ie=[],Z=0,Se;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function Re(){return t.substring(me,g)}function ht(){return He(me,g)}function q($,se){throw se=se!==void 0?se:He(me,g),P([xe($)],t.substring(me,g),se)}function nt($,se){throw se=se!==void 0?se:He(me,g),I($,se)}function Le($,se){return{type:"literal",text:$,ignoreCase:se}}function Te($,se,be){return{type:"class",parts:$,inverted:se,ignoreCase:be}}function ke(){return{type:"any"}}function Ke(){return{type:"end"}}function xe($){return{type:"other",description:$}}function tt($){var se=Ce[$],be;if(se)return se;for(be=$-1;!Ce[be];)be--;for(se=Ce[be],se={line:se.line,column:se.column};be<$;)t.charCodeAt(be)===10?(se.line++,se.column=1):se.column++,be++;return Ce[$]=se,se}function He($,se){var be=tt($),Fe=tt(se);return{start:{offset:$,line:be.line,column:be.column},end:{offset:se,line:Fe.line,column:Fe.column}}}function x($){gfe&&(fe=g,ie=[]),ie.push($))}function I($,se){return new pg($,null,null,se)}function P($,se,be){return new pg(pg.buildMessage($,se),$,se,be)}function y(){var $,se,be,Fe,lt,Et,qt,nr;if($=g,se=R(),se!==r){for(be=[],Fe=g,lt=X(),lt!==r?(t.charCodeAt(g)===124?(Et=n,g++):(Et=r,Z===0&&x(u)),Et===r&&(t.charCodeAt(g)===38?(Et=A,g++):(Et=r,Z===0&&x(p)),Et===r&&(t.charCodeAt(g)===94?(Et=h,g++):(Et=r,Z===0&&x(E)))),Et!==r?(qt=X(),qt!==r?(nr=R(),nr!==r?(lt=[lt,Et,qt,nr],Fe=lt):(g=Fe,Fe=r)):(g=Fe,Fe=r)):(g=Fe,Fe=r)):(g=Fe,Fe=r);Fe!==r;)be.push(Fe),Fe=g,lt=X(),lt!==r?(t.charCodeAt(g)===124?(Et=n,g++):(Et=r,Z===0&&x(u)),Et===r&&(t.charCodeAt(g)===38?(Et=A,g++):(Et=r,Z===0&&x(p)),Et===r&&(t.charCodeAt(g)===94?(Et=h,g++):(Et=r,Z===0&&x(E)))),Et!==r?(qt=X(),qt!==r?(nr=R(),nr!==r?(lt=[lt,Et,qt,nr],Fe=lt):(g=Fe,Fe=r)):(g=Fe,Fe=r)):(g=Fe,Fe=r)):(g=Fe,Fe=r);be!==r?(me=$,se=w(se,be),$=se):(g=$,$=r)}else g=$,$=r;return $}function R(){var $,se,be,Fe,lt,Et;return $=g,t.charCodeAt(g)===33?(se=D,g++):(se=r,Z===0&&x(b)),se!==r?(be=R(),be!==r?(me=$,se=C(be),$=se):(g=$,$=r)):(g=$,$=r),$===r&&($=g,t.charCodeAt(g)===40?(se=T,g++):(se=r,Z===0&&x(N)),se!==r?(be=X(),be!==r?(Fe=y(),Fe!==r?(lt=X(),lt!==r?(t.charCodeAt(g)===41?(Et=U,g++):(Et=r,Z===0&&x(J)),Et!==r?(me=$,se=te(Fe),$=se):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r),$===r&&($=z())),$}function z(){var $,se,be,Fe,lt;if($=g,se=X(),se!==r){if(be=g,Fe=[],le.test(t.charAt(g))?(lt=t.charAt(g),g++):(lt=r,Z===0&&x(ce)),lt!==r)for(;lt!==r;)Fe.push(lt),le.test(t.charAt(g))?(lt=t.charAt(g),g++):(lt=r,Z===0&&x(ce));else Fe=r;Fe!==r?be=t.substring(be,g):be=Fe,be!==r?(me=g,Fe=ue(be),Fe?Fe=void 0:Fe=r,Fe!==r?(me=$,se=Ie(be),$=se):(g=$,$=r)):(g=$,$=r)}else g=$,$=r;return $}function X(){var $,se;for(Z++,$=[],De.test(t.charAt(g))?(se=t.charAt(g),g++):(se=r,Z===0&&x(Ee));se!==r;)$.push(se),De.test(t.charAt(g))?(se=t.charAt(g),g++):(se=r,Z===0&&x(Ee));return Z--,$===r&&(se=r,Z===0&&x(he)),$}if(Se=a(),Se!==r&&g===t.length)return Se;throw Se!==r&&g{var{parse:r9e}=OX();nP.makeParser=(t=/[a-z]+/)=>(e,r)=>r9e(e,{queryPattern:t,checkFn:r});nP.parse=nP.makeParser()});var _X=_((lQt,UX)=>{"use strict";UX.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var KL=_((cQt,qX)=>{var Hw=_X(),HX={};for(let t of Object.keys(Hw))HX[Hw[t]]=t;var fr={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};qX.exports=fr;for(let t of Object.keys(fr)){if(!("channels"in fr[t]))throw new Error("missing channels property: "+t);if(!("labels"in fr[t]))throw new Error("missing channel labels property: "+t);if(fr[t].labels.length!==fr[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=fr[t];delete fr[t].channels,delete fr[t].labels,Object.defineProperty(fr[t],"channels",{value:e}),Object.defineProperty(fr[t],"labels",{value:r})}fr.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(e,r,o),n=Math.max(e,r,o),u=n-a,A,p;n===a?A=0:e===n?A=(r-o)/u:r===n?A=2+(o-e)/u:o===n&&(A=4+(e-r)/u),A=Math.min(A*60,360),A<0&&(A+=360);let h=(a+n)/2;return n===a?p=0:h<=.5?p=u/(n+a):p=u/(2-n-a),[A,p*100,h*100]};fr.rgb.hsv=function(t){let e,r,o,a,n,u=t[0]/255,A=t[1]/255,p=t[2]/255,h=Math.max(u,A,p),E=h-Math.min(u,A,p),w=function(D){return(h-D)/6/E+1/2};return E===0?(a=0,n=0):(n=E/h,e=w(u),r=w(A),o=w(p),u===h?a=o-r:A===h?a=1/3+e-o:p===h&&(a=2/3+r-e),a<0?a+=1:a>1&&(a-=1)),[a*360,n*100,h*100]};fr.rgb.hwb=function(t){let e=t[0],r=t[1],o=t[2],a=fr.rgb.hsl(t)[0],n=1/255*Math.min(e,Math.min(r,o));return o=1-1/255*Math.max(e,Math.max(r,o)),[a,n*100,o*100]};fr.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(1-e,1-r,1-o),n=(1-e-a)/(1-a)||0,u=(1-r-a)/(1-a)||0,A=(1-o-a)/(1-a)||0;return[n*100,u*100,A*100,a*100]};function n9e(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}fr.rgb.keyword=function(t){let e=HX[t];if(e)return e;let r=1/0,o;for(let a of Object.keys(Hw)){let n=Hw[a],u=n9e(t,n);u.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,o=o>.04045?((o+.055)/1.055)**2.4:o/12.92;let a=e*.4124+r*.3576+o*.1805,n=e*.2126+r*.7152+o*.0722,u=e*.0193+r*.1192+o*.9505;return[a*100,n*100,u*100]};fr.rgb.lab=function(t){let e=fr.rgb.xyz(t),r=e[0],o=e[1],a=e[2];r/=95.047,o/=100,a/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let n=116*o-16,u=500*(r-o),A=200*(o-a);return[n,u,A]};fr.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a,n,u;if(r===0)return u=o*255,[u,u,u];o<.5?a=o*(1+r):a=o+r-o*r;let A=2*o-a,p=[0,0,0];for(let h=0;h<3;h++)n=e+1/3*-(h-1),n<0&&n++,n>1&&n--,6*n<1?u=A+(a-A)*6*n:2*n<1?u=a:3*n<2?u=A+(a-A)*(2/3-n)*6:u=A,p[h]=u*255;return p};fr.hsl.hsv=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=r,n=Math.max(o,.01);o*=2,r*=o<=1?o:2-o,a*=n<=1?n:2-n;let u=(o+r)/2,A=o===0?2*a/(n+a):2*r/(o+r);return[e,A*100,u*100]};fr.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,o=t[2]/100,a=Math.floor(e)%6,n=e-Math.floor(e),u=255*o*(1-r),A=255*o*(1-r*n),p=255*o*(1-r*(1-n));switch(o*=255,a){case 0:return[o,p,u];case 1:return[A,o,u];case 2:return[u,o,p];case 3:return[u,A,o];case 4:return[p,u,o];case 5:return[o,u,A]}};fr.hsv.hsl=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=Math.max(o,.01),n,u;u=(2-r)*o;let A=(2-r)*a;return n=r*a,n/=A<=1?A:2-A,n=n||0,u/=2,[e,n*100,u*100]};fr.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a=r+o,n;a>1&&(r/=a,o/=a);let u=Math.floor(6*e),A=1-o;n=6*e-u,u&1&&(n=1-n);let p=r+n*(A-r),h,E,w;switch(u){default:case 6:case 0:h=A,E=p,w=r;break;case 1:h=p,E=A,w=r;break;case 2:h=r,E=A,w=p;break;case 3:h=r,E=p,w=A;break;case 4:h=p,E=r,w=A;break;case 5:h=A,E=r,w=p;break}return[h*255,E*255,w*255]};fr.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a=t[3]/100,n=1-Math.min(1,e*(1-a)+a),u=1-Math.min(1,r*(1-a)+a),A=1-Math.min(1,o*(1-a)+a);return[n*255,u*255,A*255]};fr.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a,n,u;return a=e*3.2406+r*-1.5372+o*-.4986,n=e*-.9689+r*1.8758+o*.0415,u=e*.0557+r*-.204+o*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,u=u>.0031308?1.055*u**(1/2.4)-.055:u*12.92,a=Math.min(Math.max(0,a),1),n=Math.min(Math.max(0,n),1),u=Math.min(Math.max(0,u),1),[a*255,n*255,u*255]};fr.xyz.lab=function(t){let e=t[0],r=t[1],o=t[2];e/=95.047,r/=100,o/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let a=116*r-16,n=500*(e-r),u=200*(r-o);return[a,n,u]};fr.lab.xyz=function(t){let e=t[0],r=t[1],o=t[2],a,n,u;n=(e+16)/116,a=r/500+n,u=n-o/200;let A=n**3,p=a**3,h=u**3;return n=A>.008856?A:(n-16/116)/7.787,a=p>.008856?p:(a-16/116)/7.787,u=h>.008856?h:(u-16/116)/7.787,a*=95.047,n*=100,u*=108.883,[a,n,u]};fr.lab.lch=function(t){let e=t[0],r=t[1],o=t[2],a;a=Math.atan2(o,r)*360/2/Math.PI,a<0&&(a+=360);let u=Math.sqrt(r*r+o*o);return[e,u,a]};fr.lch.lab=function(t){let e=t[0],r=t[1],a=t[2]/360*2*Math.PI,n=r*Math.cos(a),u=r*Math.sin(a);return[e,n,u]};fr.rgb.ansi16=function(t,e=null){let[r,o,a]=t,n=e===null?fr.rgb.hsv(t)[2]:e;if(n=Math.round(n/50),n===0)return 30;let u=30+(Math.round(a/255)<<2|Math.round(o/255)<<1|Math.round(r/255));return n===2&&(u+=60),u};fr.hsv.ansi16=function(t){return fr.rgb.ansi16(fr.hsv.rgb(t),t[2])};fr.rgb.ansi256=function(t){let e=t[0],r=t[1],o=t[2];return e===r&&r===o?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(o/255*5)};fr.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,o=(e&1)*r*255,a=(e>>1&1)*r*255,n=(e>>2&1)*r*255;return[o,a,n]};fr.ansi256.rgb=function(t){if(t>=232){let n=(t-232)*10+8;return[n,n,n]}t-=16;let e,r=Math.floor(t/36)/5*255,o=Math.floor((e=t%36)/6)/5*255,a=e%6/5*255;return[r,o,a]};fr.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};fr.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(A=>A+A).join(""));let o=parseInt(r,16),a=o>>16&255,n=o>>8&255,u=o&255;return[a,n,u]};fr.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.max(Math.max(e,r),o),n=Math.min(Math.min(e,r),o),u=a-n,A,p;return u<1?A=n/(1-u):A=0,u<=0?p=0:a===e?p=(r-o)/u%6:a===r?p=2+(o-e)/u:p=4+(e-r)/u,p/=6,p%=1,[p*360,u*100,A*100]};fr.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=r<.5?2*e*r:2*e*(1-r),a=0;return o<1&&(a=(r-.5*o)/(1-o)),[t[0],o*100,a*100]};fr.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=e*r,a=0;return o<1&&(a=(r-o)/(1-o)),[t[0],o*100,a*100]};fr.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100;if(r===0)return[o*255,o*255,o*255];let a=[0,0,0],n=e%1*6,u=n%1,A=1-u,p=0;switch(Math.floor(n)){case 0:a[0]=1,a[1]=u,a[2]=0;break;case 1:a[0]=A,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=u;break;case 3:a[0]=0,a[1]=A,a[2]=1;break;case 4:a[0]=u,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=A}return p=(1-r)*o,[(r*a[0]+p)*255,(r*a[1]+p)*255,(r*a[2]+p)*255]};fr.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e),a=0;return o>0&&(a=e/o),[t[0],a*100,o*100]};fr.hcg.hsl=function(t){let e=t[1]/100,o=t[2]/100*(1-e)+.5*e,a=0;return o>0&&o<.5?a=e/(2*o):o>=.5&&o<1&&(a=e/(2*(1-o))),[t[0],a*100,o*100]};fr.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e);return[t[0],(o-e)*100,(1-o)*100]};fr.hwb.hcg=function(t){let e=t[1]/100,o=1-t[2]/100,a=o-e,n=0;return a<1&&(n=(o-a)/(1-a)),[t[0],a*100,n*100]};fr.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};fr.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};fr.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};fr.gray.hsl=function(t){return[0,0,t[0]]};fr.gray.hsv=fr.gray.hsl;fr.gray.hwb=function(t){return[0,100,t[0]]};fr.gray.cmyk=function(t){return[0,0,0,t[0]]};fr.gray.lab=function(t){return[t[0],0,0]};fr.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,o=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(o.length)+o};fr.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var GX=_((uQt,jX)=>{var iP=KL();function i9e(){let t={},e=Object.keys(iP);for(let r=e.length,o=0;o{var JL=KL(),l9e=GX(),Rm={},c9e=Object.keys(JL);function u9e(t){let e=function(...r){let o=r[0];return o==null?o:(o.length>1&&(r=o),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function A9e(t){let e=function(...r){let o=r[0];if(o==null)return o;o.length>1&&(r=o);let a=t(r);if(typeof a=="object")for(let n=a.length,u=0;u{Rm[t]={},Object.defineProperty(Rm[t],"channels",{value:JL[t].channels}),Object.defineProperty(Rm[t],"labels",{value:JL[t].labels});let e=l9e(t);Object.keys(e).forEach(o=>{let a=e[o];Rm[t][o]=A9e(a),Rm[t][o].raw=u9e(a)})});WX.exports=Rm});var qw=_((fQt,XX)=>{"use strict";var VX=(t,e)=>(...r)=>`\x1B[${t(...r)+e}m`,KX=(t,e)=>(...r)=>{let o=t(...r);return`\x1B[${38+e};5;${o}m`},JX=(t,e)=>(...r)=>{let o=t(...r);return`\x1B[${38+e};2;${o[0]};${o[1]};${o[2]}m`},sP=t=>t,zX=(t,e,r)=>[t,e,r],Tm=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let o=r();return Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0}),o},enumerable:!0,configurable:!0})},zL,Lm=(t,e,r,o)=>{zL===void 0&&(zL=YX());let a=o?10:0,n={};for(let[u,A]of Object.entries(zL)){let p=u==="ansi16"?"ansi":u;u===e?n[p]=t(r,a):typeof A=="object"&&(n[p]=t(A[e],a))}return n};function f9e(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,o]of Object.entries(e)){for(let[a,n]of Object.entries(o))e[a]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},o[a]=e[a],t.set(n[0],n[1]);Object.defineProperty(e,r,{value:o,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="\x1B[39m",e.bgColor.close="\x1B[49m",Tm(e.color,"ansi",()=>Lm(VX,"ansi16",sP,!1)),Tm(e.color,"ansi256",()=>Lm(KX,"ansi256",sP,!1)),Tm(e.color,"ansi16m",()=>Lm(JX,"rgb",zX,!1)),Tm(e.bgColor,"ansi",()=>Lm(VX,"ansi16",sP,!0)),Tm(e.bgColor,"ansi256",()=>Lm(KX,"ansi256",sP,!0)),Tm(e.bgColor,"ansi16m",()=>Lm(JX,"rgb",zX,!0)),e}Object.defineProperty(XX,"exports",{enumerable:!0,get:f9e})});var $X=_((pQt,ZX)=>{"use strict";ZX.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",o=e.indexOf(r+t),a=e.indexOf("--");return o!==-1&&(a===-1||o{"use strict";var p9e=ve("os"),eZ=ve("tty"),_l=$X(),{env:cs}=process,Zp;_l("no-color")||_l("no-colors")||_l("color=false")||_l("color=never")?Zp=0:(_l("color")||_l("colors")||_l("color=true")||_l("color=always"))&&(Zp=1);"FORCE_COLOR"in cs&&(cs.FORCE_COLOR==="true"?Zp=1:cs.FORCE_COLOR==="false"?Zp=0:Zp=cs.FORCE_COLOR.length===0?1:Math.min(parseInt(cs.FORCE_COLOR,10),3));function XL(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function ZL(t,e){if(Zp===0)return 0;if(_l("color=16m")||_l("color=full")||_l("color=truecolor"))return 3;if(_l("color=256"))return 2;if(t&&!e&&Zp===void 0)return 0;let r=Zp||0;if(cs.TERM==="dumb")return r;if(process.platform==="win32"){let o=p9e.release().split(".");return Number(o[0])>=10&&Number(o[2])>=10586?Number(o[2])>=14931?3:2:1}if("CI"in cs)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(o=>o in cs)||cs.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in cs)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(cs.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in cs)return 1;if(cs.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in cs){let o=parseInt((cs.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(cs.TERM_PROGRAM){case"iTerm.app":return o>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(cs.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(cs.TERM)||"COLORTERM"in cs?1:r}function h9e(t){let e=ZL(t,t&&t.isTTY);return XL(e)}tZ.exports={supportsColor:h9e,stdout:XL(ZL(!0,eZ.isatty(1))),stderr:XL(ZL(!0,eZ.isatty(2)))}});var nZ=_((gQt,rZ)=>{"use strict";var g9e=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u="";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},d9e=(t,e,r,o)=>{let a=0,n="";do{let u=t[o-1]==="\r";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\r -`:` -`)+r,a=o+1,o=t.indexOf(` -`,a)}while(o!==-1);return n+=t.substr(a),n};rZ.exports={stringReplaceAll:g9e,stringEncaseCRLFWithFirstIndex:d9e}});var lZ=_((dQt,aZ)=>{"use strict";var m9e=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,iZ=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,y9e=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,E9e=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,C9e=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function oZ(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):C9e.get(t)||t}function I9e(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(y9e))r.push(a[2].replace(E9e,(A,p,h)=>p?oZ(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function w9e(t){iZ.lastIndex=0;let e=[],r;for(;(r=iZ.exec(t))!==null;){let o=r[1];if(r[2]){let a=I9e(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function sZ(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}aZ.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(m9e,(n,u,A,p,h,E)=>{if(u)a.push(oZ(u));else if(p){let w=a.join("");a=[],o.push(r.length===0?w:sZ(t,r)(w)),r.push({inverse:A,styles:w9e(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");o.push(sZ(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),o.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return o.join("")}});var sN=_((mQt,fZ)=>{"use strict";var jw=qw(),{stdout:tN,stderr:rN}=$L(),{stringReplaceAll:B9e,stringEncaseCRLFWithFirstIndex:v9e}=nZ(),cZ=["ansi","ansi","ansi256","ansi16m"],Nm=Object.create(null),D9e=(t,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let r=tN?tN.level:0;t.level=e.level===void 0?r:e.level},nN=class{constructor(e){return uZ(e)}},uZ=t=>{let e={};return D9e(e,t),e.template=(...r)=>x9e(e.template,...r),Object.setPrototypeOf(e,oP.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=nN,e.template};function oP(t){return uZ(t)}for(let[t,e]of Object.entries(jw))Nm[t]={get(){let r=aP(this,iN(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};Nm.visible={get(){let t=aP(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var AZ=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of AZ)Nm[t]={get(){let{level:e}=this;return function(...r){let o=iN(jw.color[cZ[e]][t](...r),jw.color.close,this._styler);return aP(this,o,this._isEmpty)}}};for(let t of AZ){let e="bg"+t[0].toUpperCase()+t.slice(1);Nm[e]={get(){let{level:r}=this;return function(...o){let a=iN(jw.bgColor[cZ[r]][t](...o),jw.bgColor.close,this._styler);return aP(this,a,this._isEmpty)}}}}var S9e=Object.defineProperties(()=>{},{...Nm,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),iN=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},aP=(t,e,r)=>{let o=(...a)=>P9e(o,a.length===1?""+a[0]:a.join(" "));return o.__proto__=S9e,o._generator=t,o._styler=e,o._isEmpty=r,o},P9e=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=B9e(e,r.close,r.open),r=r.parent;let n=e.indexOf(` -`);return n!==-1&&(e=v9e(e,a,o,n)),o+e+a},eN,x9e=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(" ");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";Hl.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;Hl.find=(t,e)=>t.nodes.find(r=>r.type===e);Hl.exceedsLimit=(t,e,r=1,o)=>o===!1||!Hl.isInteger(t)||!Hl.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=o;Hl.escapeNode=(t,e=0,r)=>{let o=t.nodes[e];o&&(r&&o.type===r||o.type==="open"||o.type==="close")&&o.escaped!==!0&&(o.value="\\"+o.value,o.escaped=!0)};Hl.encloseBrace=t=>t.type!=="brace"||t.commas>>0+t.ranges>>0?!1:(t.invalid=!0,!0);Hl.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:!(t.commas>>0+t.ranges>>0)||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;Hl.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;Hl.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);Hl.flatten=(...t)=>{let e=[],r=o=>{for(let a=0;a{"use strict";var pZ=lP();hZ.exports=(t,e={})=>{let r=(o,a={})=>{let n=e.escapeInvalid&&pZ.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A="";if(o.value)return(n||u)&&pZ.isOpenOrClose(o)?"\\"+o.value:o.value;if(o.value)return o.value;if(o.nodes)for(let p of o.nodes)A+=r(p);return A};return r(t)}});var dZ=_((CQt,gZ)=>{"use strict";gZ.exports=function(t){return typeof t=="number"?t-t===0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var DZ=_((IQt,vZ)=>{"use strict";var mZ=dZ(),hg=(t,e,r)=>{if(mZ(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(mZ(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let o={relaxZeros:!0,...r};typeof o.strictZeros=="boolean"&&(o.relaxZeros=o.strictZeros===!1);let a=String(o.relaxZeros),n=String(o.shorthand),u=String(o.capture),A=String(o.wrap),p=t+":"+e+"="+a+n+u+A;if(hg.cache.hasOwnProperty(p))return hg.cache[p].result;let h=Math.min(t,e),E=Math.max(t,e);if(Math.abs(h-E)===1){let T=t+"|"+e;return o.capture?`(${T})`:o.wrap===!1?T:`(?:${T})`}let w=BZ(t)||BZ(e),D={min:t,max:e,a:h,b:E},b=[],C=[];if(w&&(D.isPadded=w,D.maxLen=String(D.max).length),h<0){let T=E<0?Math.abs(E):1;C=yZ(T,Math.abs(h),D,o),h=D.a=0}return E>=0&&(b=yZ(h,E,D,o)),D.negatives=C,D.positives=b,D.result=b9e(C,b,o),o.capture===!0?D.result=`(${D.result})`:o.wrap!==!1&&b.length+C.length>1&&(D.result=`(?:${D.result})`),hg.cache[p]=D,D.result};function b9e(t,e,r){let o=oN(t,e,"-",!1,r)||[],a=oN(e,t,"",!1,r)||[],n=oN(t,e,"-?",!0,r)||[];return o.concat(n).concat(a).join("|")}function k9e(t,e){let r=1,o=1,a=CZ(t,r),n=new Set([e]);for(;t<=a&&a<=e;)n.add(a),r+=1,a=CZ(t,r);for(a=IZ(e+1,o)-1;t1&&A.count.pop(),A.count.push(E.count[0]),A.string=A.pattern+wZ(A.count),u=h+1;continue}r.isPadded&&(w=L9e(h,r,o)),E.string=w+E.pattern+wZ(E.count),n.push(E),u=h+1,A=E}return n}function oN(t,e,r,o,a){let n=[];for(let u of t){let{string:A}=u;!o&&!EZ(e,"string",A)&&n.push(r+A),o&&EZ(e,"string",A)&&n.push(r+A)}return n}function F9e(t,e){let r=[];for(let o=0;oe?1:e>t?-1:0}function EZ(t,e,r){return t.some(o=>o[e]===r)}function CZ(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function IZ(t,e){return t-t%Math.pow(10,e)}function wZ(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function T9e(t,e,r){return`[${t}${e-t===1?"":"-"}${e}]`}function BZ(t){return/^-?(0+)\d/.test(t)}function L9e(t,e,r){if(!e.isPadded)return t;let o=Math.abs(e.maxLen-String(t).length),a=r.relaxZeros!==!1;switch(o){case 0:return"";case 1:return a?"0?":"0";case 2:return a?"0{0,2}":"00";default:return a?`0{0,${o}}`:`0{${o}}`}}hg.cache={};hg.clearCache=()=>hg.cache={};vZ.exports=hg});var cN=_((wQt,RZ)=>{"use strict";var N9e=ve("util"),xZ=DZ(),SZ=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),O9e=t=>e=>t===!0?Number(e):String(e),aN=t=>typeof t=="number"||typeof t=="string"&&t!=="",Ww=t=>Number.isInteger(+t),lN=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},M9e=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,U9e=(t,e,r)=>{if(e>0){let o=t[0]==="-"?"-":"";o&&(t=t.slice(1)),t=o+t.padStart(o?e-1:e,"0")}return r===!1?String(t):t},PZ=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((u,A)=>uA?1:0),t.positives.sort((u,A)=>uA?1:0);let r=e.capture?"":"?:",o="",a="",n;return t.positives.length&&(o=t.positives.join("|")),t.negatives.length&&(a=`-(${r}${t.negatives.join("|")})`),o&&a?n=`${o}|${a}`:n=o||a,e.wrap?`(${r}${n})`:n},bZ=(t,e,r,o)=>{if(r)return xZ(t,e,{wrap:!1,...o});let a=String.fromCharCode(t);if(t===e)return a;let n=String.fromCharCode(e);return`[${a}-${n}]`},kZ=(t,e,r)=>{if(Array.isArray(t)){let o=r.wrap===!0,a=r.capture?"":"?:";return o?`(${a}${t.join("|")})`:t.join("|")}return xZ(t,e,r)},QZ=(...t)=>new RangeError("Invalid range arguments: "+N9e.inspect(...t)),FZ=(t,e,r)=>{if(r.strictRanges===!0)throw QZ([t,e]);return[]},H9e=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},q9e=(t,e,r=1,o={})=>{let a=Number(t),n=Number(e);if(!Number.isInteger(a)||!Number.isInteger(n)){if(o.strictRanges===!0)throw QZ([t,e]);return[]}a===0&&(a=0),n===0&&(n=0);let u=a>n,A=String(t),p=String(e),h=String(r);r=Math.max(Math.abs(r),1);let E=lN(A)||lN(p)||lN(h),w=E?Math.max(A.length,p.length,h.length):0,D=E===!1&&M9e(t,e,o)===!1,b=o.transform||O9e(D);if(o.toRegex&&r===1)return bZ(PZ(t,w),PZ(e,w),!0,o);let C={negatives:[],positives:[]},T=J=>C[J<0?"negatives":"positives"].push(Math.abs(J)),N=[],U=0;for(;u?a>=n:a<=n;)o.toRegex===!0&&r>1?T(a):N.push(U9e(b(a,U),w,D)),a=u?a-r:a+r,U++;return o.toRegex===!0?r>1?_9e(C,o):kZ(N,null,{wrap:!1,...o}):N},j9e=(t,e,r=1,o={})=>{if(!Ww(t)&&t.length>1||!Ww(e)&&e.length>1)return FZ(t,e,o);let a=o.transform||(D=>String.fromCharCode(D)),n=`${t}`.charCodeAt(0),u=`${e}`.charCodeAt(0),A=n>u,p=Math.min(n,u),h=Math.max(n,u);if(o.toRegex&&r===1)return bZ(p,h,!1,o);let E=[],w=0;for(;A?n>=u:n<=u;)E.push(a(n,w)),n=A?n-r:n+r,w++;return o.toRegex===!0?kZ(E,null,{wrap:!1,options:o}):E},uP=(t,e,r,o={})=>{if(e==null&&aN(t))return[t];if(!aN(t)||!aN(e))return FZ(t,e,o);if(typeof r=="function")return uP(t,e,1,{transform:r});if(SZ(r))return uP(t,e,0,r);let a={...o};return a.capture===!0&&(a.wrap=!0),r=r||a.step||1,Ww(r)?Ww(t)&&Ww(e)?q9e(t,e,r,a):j9e(t,e,Math.max(Math.abs(r),1),a):r!=null&&!SZ(r)?H9e(r,a):uP(t,e,1,r)};RZ.exports=uP});var NZ=_((BQt,LZ)=>{"use strict";var G9e=cN(),TZ=lP(),W9e=(t,e={})=>{let r=(o,a={})=>{let n=TZ.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A=n===!0||u===!0,p=e.escapeInvalid===!0?"\\":"",h="";if(o.isOpen===!0||o.isClose===!0)return p+o.value;if(o.type==="open")return A?p+o.value:"(";if(o.type==="close")return A?p+o.value:")";if(o.type==="comma")return o.prev.type==="comma"?"":A?o.value:"|";if(o.value)return o.value;if(o.nodes&&o.ranges>0){let E=TZ.reduce(o.nodes),w=G9e(...E,{...e,wrap:!1,toRegex:!0});if(w.length!==0)return E.length>1&&w.length>1?`(${w})`:w}if(o.nodes)for(let E of o.nodes)h+=r(E,o);return h};return r(t)};LZ.exports=W9e});var UZ=_((vQt,MZ)=>{"use strict";var Y9e=cN(),OZ=cP(),Om=lP(),gg=(t="",e="",r=!1)=>{let o=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?Om.flatten(e).map(a=>`{${a}}`):e;for(let a of t)if(Array.isArray(a))for(let n of a)o.push(gg(n,e,r));else for(let n of e)r===!0&&typeof n=="string"&&(n=`{${n}}`),o.push(Array.isArray(n)?gg(a,n,r):a+n);return Om.flatten(o)},V9e=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,o=(a,n={})=>{a.queue=[];let u=n,A=n.queue;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,A=u.queue;if(a.invalid||a.dollar){A.push(gg(A.pop(),OZ(a,e)));return}if(a.type==="brace"&&a.invalid!==!0&&a.nodes.length===2){A.push(gg(A.pop(),["{}"]));return}if(a.nodes&&a.ranges>0){let w=Om.reduce(a.nodes);if(Om.exceedsLimit(...w,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let D=Y9e(...w,e);D.length===0&&(D=OZ(a,e)),A.push(gg(A.pop(),D)),a.nodes=[];return}let p=Om.encloseBrace(a),h=a.queue,E=a;for(;E.type!=="brace"&&E.type!=="root"&&E.parent;)E=E.parent,h=E.queue;for(let w=0;w{"use strict";_Z.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` -`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var YZ=_((SQt,WZ)=>{"use strict";var K9e=cP(),{MAX_LENGTH:qZ,CHAR_BACKSLASH:uN,CHAR_BACKTICK:J9e,CHAR_COMMA:z9e,CHAR_DOT:X9e,CHAR_LEFT_PARENTHESES:Z9e,CHAR_RIGHT_PARENTHESES:$9e,CHAR_LEFT_CURLY_BRACE:e7e,CHAR_RIGHT_CURLY_BRACE:t7e,CHAR_LEFT_SQUARE_BRACKET:jZ,CHAR_RIGHT_SQUARE_BRACKET:GZ,CHAR_DOUBLE_QUOTE:r7e,CHAR_SINGLE_QUOTE:n7e,CHAR_NO_BREAK_SPACE:i7e,CHAR_ZERO_WIDTH_NOBREAK_SPACE:s7e}=HZ(),o7e=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},o=typeof r.maxLength=="number"?Math.min(qZ,r.maxLength):qZ;if(t.length>o)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${o})`);let a={type:"root",input:t,nodes:[]},n=[a],u=a,A=a,p=0,h=t.length,E=0,w=0,D,b={},C=()=>t[E++],T=N=>{if(N.type==="text"&&A.type==="dot"&&(A.type="text"),A&&A.type==="text"&&N.type==="text"){A.value+=N.value;return}return u.nodes.push(N),N.parent=u,N.prev=A,A=N,N};for(T({type:"bos"});E0){if(u.ranges>0){u.ranges=0;let N=u.nodes.shift();u.nodes=[N,{type:"text",value:K9e(u)}]}T({type:"comma",value:D}),u.commas++;continue}if(D===X9e&&w>0&&u.commas===0){let N=u.nodes;if(w===0||N.length===0){T({type:"text",value:D});continue}if(A.type==="dot"){if(u.range=[],A.value+=D,A.type="range",u.nodes.length!==3&&u.nodes.length!==5){u.invalid=!0,u.ranges=0,A.type="text";continue}u.ranges++,u.args=[];continue}if(A.type==="range"){N.pop();let U=N[N.length-1];U.value+=A.value+D,A=U,u.ranges--;continue}T({type:"dot",value:D});continue}T({type:"text",value:D})}do if(u=n.pop(),u.type!=="root"){u.nodes.forEach(J=>{J.nodes||(J.type==="open"&&(J.isOpen=!0),J.type==="close"&&(J.isClose=!0),J.nodes||(J.type="text"),J.invalid=!0)});let N=n[n.length-1],U=N.nodes.indexOf(u);N.nodes.splice(U,1,...u.nodes)}while(n.length>0);return T({type:"eos"}),a};WZ.exports=o7e});var JZ=_((PQt,KZ)=>{"use strict";var VZ=cP(),a7e=NZ(),l7e=UZ(),c7e=YZ(),al=(t,e={})=>{let r=[];if(Array.isArray(t))for(let o of t){let a=al.create(o,e);Array.isArray(a)?r.push(...a):r.push(a)}else r=[].concat(al.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};al.parse=(t,e={})=>c7e(t,e);al.stringify=(t,e={})=>VZ(typeof t=="string"?al.parse(t,e):t,e);al.compile=(t,e={})=>(typeof t=="string"&&(t=al.parse(t,e)),a7e(t,e));al.expand=(t,e={})=>{typeof t=="string"&&(t=al.parse(t,e));let r=l7e(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};al.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?al.compile(t,e):al.expand(t,e);KZ.exports=al});var Yw=_((xQt,e$)=>{"use strict";var u7e=ve("path"),zu="\\\\/",zZ=`[^${zu}]`,Bf="\\.",A7e="\\+",f7e="\\?",AP="\\/",p7e="(?=.)",XZ="[^/]",AN=`(?:${AP}|$)`,ZZ=`(?:^|${AP})`,fN=`${Bf}{1,2}${AN}`,h7e=`(?!${Bf})`,g7e=`(?!${ZZ}${fN})`,d7e=`(?!${Bf}{0,1}${AN})`,m7e=`(?!${fN})`,y7e=`[^.${AP}]`,E7e=`${XZ}*?`,$Z={DOT_LITERAL:Bf,PLUS_LITERAL:A7e,QMARK_LITERAL:f7e,SLASH_LITERAL:AP,ONE_CHAR:p7e,QMARK:XZ,END_ANCHOR:AN,DOTS_SLASH:fN,NO_DOT:h7e,NO_DOTS:g7e,NO_DOT_SLASH:d7e,NO_DOTS_SLASH:m7e,QMARK_NO_DOT:y7e,STAR:E7e,START_ANCHOR:ZZ},C7e={...$Z,SLASH_LITERAL:`[${zu}]`,QMARK:zZ,STAR:`${zZ}*?`,DOTS_SLASH:`${Bf}{1,2}(?:[${zu}]|$)`,NO_DOT:`(?!${Bf})`,NO_DOTS:`(?!(?:^|[${zu}])${Bf}{1,2}(?:[${zu}]|$))`,NO_DOT_SLASH:`(?!${Bf}{0,1}(?:[${zu}]|$))`,NO_DOTS_SLASH:`(?!${Bf}{1,2}(?:[${zu}]|$))`,QMARK_NO_DOT:`[^.${zu}]`,START_ANCHOR:`(?:^|[${zu}])`,END_ANCHOR:`(?:[${zu}]|$)`},I7e={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};e$.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:I7e,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:u7e.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?C7e:$Z}}});var Vw=_(ba=>{"use strict";var w7e=ve("path"),B7e=process.platform==="win32",{REGEX_BACKSLASH:v7e,REGEX_REMOVE_BACKSLASH:D7e,REGEX_SPECIAL_CHARS:S7e,REGEX_SPECIAL_CHARS_GLOBAL:P7e}=Yw();ba.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);ba.hasRegexChars=t=>S7e.test(t);ba.isRegexChar=t=>t.length===1&&ba.hasRegexChars(t);ba.escapeRegex=t=>t.replace(P7e,"\\$1");ba.toPosixSlashes=t=>t.replace(v7e,"/");ba.removeBackslashes=t=>t.replace(D7e,e=>e==="\\"?"":e);ba.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};ba.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:B7e===!0||w7e.sep==="\\";ba.escapeLast=(t,e,r)=>{let o=t.lastIndexOf(e,r);return o===-1?t:t[o-1]==="\\"?ba.escapeLast(t,e,o-1):`${t.slice(0,o)}\\${t.slice(o)}`};ba.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};ba.wrapOutput=(t,e={},r={})=>{let o=r.contains?"":"^",a=r.contains?"":"$",n=`${o}(?:${t})${a}`;return e.negated===!0&&(n=`(?:^(?!${n}).*$)`),n}});var l$=_((kQt,a$)=>{"use strict";var t$=Vw(),{CHAR_ASTERISK:pN,CHAR_AT:x7e,CHAR_BACKWARD_SLASH:Kw,CHAR_COMMA:b7e,CHAR_DOT:hN,CHAR_EXCLAMATION_MARK:gN,CHAR_FORWARD_SLASH:o$,CHAR_LEFT_CURLY_BRACE:dN,CHAR_LEFT_PARENTHESES:mN,CHAR_LEFT_SQUARE_BRACKET:k7e,CHAR_PLUS:Q7e,CHAR_QUESTION_MARK:r$,CHAR_RIGHT_CURLY_BRACE:F7e,CHAR_RIGHT_PARENTHESES:n$,CHAR_RIGHT_SQUARE_BRACKET:R7e}=Yw(),i$=t=>t===o$||t===Kw,s$=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?1/0:1)},T7e=(t,e)=>{let r=e||{},o=t.length-1,a=r.parts===!0||r.scanToEnd===!0,n=[],u=[],A=[],p=t,h=-1,E=0,w=0,D=!1,b=!1,C=!1,T=!1,N=!1,U=!1,J=!1,te=!1,le=!1,ce=!1,ue=0,Ie,he,De={value:"",depth:0,isGlob:!1},Ee=()=>h>=o,g=()=>p.charCodeAt(h+1),me=()=>(Ie=he,p.charCodeAt(++h));for(;h0&&(fe=p.slice(0,E),p=p.slice(E),w-=E),Ce&&C===!0&&w>0?(Ce=p.slice(0,w),ie=p.slice(w)):C===!0?(Ce="",ie=p):Ce=p,Ce&&Ce!==""&&Ce!=="/"&&Ce!==p&&i$(Ce.charCodeAt(Ce.length-1))&&(Ce=Ce.slice(0,-1)),r.unescape===!0&&(ie&&(ie=t$.removeBackslashes(ie)),Ce&&J===!0&&(Ce=t$.removeBackslashes(Ce)));let Z={prefix:fe,input:t,start:E,base:Ce,glob:ie,isBrace:D,isBracket:b,isGlob:C,isExtglob:T,isGlobstar:N,negated:te,negatedExtglob:le};if(r.tokens===!0&&(Z.maxDepth=0,i$(he)||u.push(De),Z.tokens=u),r.parts===!0||r.tokens===!0){let Se;for(let Re=0;Re{"use strict";var fP=Yw(),ll=Vw(),{MAX_LENGTH:pP,POSIX_REGEX_SOURCE:L7e,REGEX_NON_SPECIAL_CHARS:N7e,REGEX_SPECIAL_CHARS_BACKREF:O7e,REPLACEMENTS:c$}=fP,M7e=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch{return t.map(a=>ll.escapeRegex(a)).join("..")}return r},Mm=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,yN=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=c$[t]||t;let r={...e},o=typeof r.maxLength=="number"?Math.min(pP,r.maxLength):pP,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);let n={type:"bos",value:"",output:r.prepend||""},u=[n],A=r.capture?"":"?:",p=ll.isWindows(e),h=fP.globChars(p),E=fP.extglobChars(h),{DOT_LITERAL:w,PLUS_LITERAL:D,SLASH_LITERAL:b,ONE_CHAR:C,DOTS_SLASH:T,NO_DOT:N,NO_DOT_SLASH:U,NO_DOTS_SLASH:J,QMARK:te,QMARK_NO_DOT:le,STAR:ce,START_ANCHOR:ue}=h,Ie=x=>`(${A}(?:(?!${ue}${x.dot?T:w}).)*?)`,he=r.dot?"":N,De=r.dot?te:le,Ee=r.bash===!0?Ie(r):ce;r.capture&&(Ee=`(${Ee})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let g={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:u};t=ll.removePrefix(t,g),a=t.length;let me=[],Ce=[],fe=[],ie=n,Z,Se=()=>g.index===a-1,Re=g.peek=(x=1)=>t[g.index+x],ht=g.advance=()=>t[++g.index]||"",q=()=>t.slice(g.index+1),nt=(x="",I=0)=>{g.consumed+=x,g.index+=I},Le=x=>{g.output+=x.output!=null?x.output:x.value,nt(x.value)},Te=()=>{let x=1;for(;Re()==="!"&&(Re(2)!=="("||Re(3)==="?");)ht(),g.start++,x++;return x%2===0?!1:(g.negated=!0,g.start++,!0)},ke=x=>{g[x]++,fe.push(x)},Ke=x=>{g[x]--,fe.pop()},xe=x=>{if(ie.type==="globstar"){let I=g.braces>0&&(x.type==="comma"||x.type==="brace"),P=x.extglob===!0||me.length&&(x.type==="pipe"||x.type==="paren");x.type!=="slash"&&x.type!=="paren"&&!I&&!P&&(g.output=g.output.slice(0,-ie.output.length),ie.type="star",ie.value="*",ie.output=Ee,g.output+=ie.output)}if(me.length&&x.type!=="paren"&&(me[me.length-1].inner+=x.value),(x.value||x.output)&&Le(x),ie&&ie.type==="text"&&x.type==="text"){ie.value+=x.value,ie.output=(ie.output||"")+x.value;return}x.prev=ie,u.push(x),ie=x},tt=(x,I)=>{let P={...E[I],conditions:1,inner:""};P.prev=ie,P.parens=g.parens,P.output=g.output;let y=(r.capture?"(":"")+P.open;ke("parens"),xe({type:x,value:I,output:g.output?"":C}),xe({type:"paren",extglob:!0,value:ht(),output:y}),me.push(P)},He=x=>{let I=x.close+(r.capture?")":""),P;if(x.type==="negate"){let y=Ee;if(x.inner&&x.inner.length>1&&x.inner.includes("/")&&(y=Ie(r)),(y!==Ee||Se()||/^\)+$/.test(q()))&&(I=x.close=`)$))${y}`),x.inner.includes("*")&&(P=q())&&/^\.[^\\/.]+$/.test(P)){let R=yN(P,{...e,fastpaths:!1}).output;I=x.close=`)${R})${y})`}x.prev.type==="bos"&&(g.negatedExtglob=!0)}xe({type:"paren",extglob:!0,value:Z,output:I}),Ke("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let x=!1,I=t.replace(O7e,(P,y,R,z,X,$)=>z==="\\"?(x=!0,P):z==="?"?y?y+z+(X?te.repeat(X.length):""):$===0?De+(X?te.repeat(X.length):""):te.repeat(R.length):z==="."?w.repeat(R.length):z==="*"?y?y+z+(X?Ee:""):Ee:y?P:`\\${P}`);return x===!0&&(r.unescape===!0?I=I.replace(/\\/g,""):I=I.replace(/\\+/g,P=>P.length%2===0?"\\\\":P?"\\":"")),I===t&&r.contains===!0?(g.output=t,g):(g.output=ll.wrapOutput(I,g,e),g)}for(;!Se();){if(Z=ht(),Z==="\0")continue;if(Z==="\\"){let P=Re();if(P==="/"&&r.bash!==!0||P==="."||P===";")continue;if(!P){Z+="\\",xe({type:"text",value:Z});continue}let y=/^\\+/.exec(q()),R=0;if(y&&y[0].length>2&&(R=y[0].length,g.index+=R,R%2!==0&&(Z+="\\")),r.unescape===!0?Z=ht():Z+=ht(),g.brackets===0){xe({type:"text",value:Z});continue}}if(g.brackets>0&&(Z!=="]"||ie.value==="["||ie.value==="[^")){if(r.posix!==!1&&Z===":"){let P=ie.value.slice(1);if(P.includes("[")&&(ie.posix=!0,P.includes(":"))){let y=ie.value.lastIndexOf("["),R=ie.value.slice(0,y),z=ie.value.slice(y+2),X=L7e[z];if(X){ie.value=R+X,g.backtrack=!0,ht(),!n.output&&u.indexOf(ie)===1&&(n.output=C);continue}}}(Z==="["&&Re()!==":"||Z==="-"&&Re()==="]")&&(Z=`\\${Z}`),Z==="]"&&(ie.value==="["||ie.value==="[^")&&(Z=`\\${Z}`),r.posix===!0&&Z==="!"&&ie.value==="["&&(Z="^"),ie.value+=Z,Le({value:Z});continue}if(g.quotes===1&&Z!=='"'){Z=ll.escapeRegex(Z),ie.value+=Z,Le({value:Z});continue}if(Z==='"'){g.quotes=g.quotes===1?0:1,r.keepQuotes===!0&&xe({type:"text",value:Z});continue}if(Z==="("){ke("parens"),xe({type:"paren",value:Z});continue}if(Z===")"){if(g.parens===0&&r.strictBrackets===!0)throw new SyntaxError(Mm("opening","("));let P=me[me.length-1];if(P&&g.parens===P.parens+1){He(me.pop());continue}xe({type:"paren",value:Z,output:g.parens?")":"\\)"}),Ke("parens");continue}if(Z==="["){if(r.nobracket===!0||!q().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(Mm("closing","]"));Z=`\\${Z}`}else ke("brackets");xe({type:"bracket",value:Z});continue}if(Z==="]"){if(r.nobracket===!0||ie&&ie.type==="bracket"&&ie.value.length===1){xe({type:"text",value:Z,output:`\\${Z}`});continue}if(g.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(Mm("opening","["));xe({type:"text",value:Z,output:`\\${Z}`});continue}Ke("brackets");let P=ie.value.slice(1);if(ie.posix!==!0&&P[0]==="^"&&!P.includes("/")&&(Z=`/${Z}`),ie.value+=Z,Le({value:Z}),r.literalBrackets===!1||ll.hasRegexChars(P))continue;let y=ll.escapeRegex(ie.value);if(g.output=g.output.slice(0,-ie.value.length),r.literalBrackets===!0){g.output+=y,ie.value=y;continue}ie.value=`(${A}${y}|${ie.value})`,g.output+=ie.value;continue}if(Z==="{"&&r.nobrace!==!0){ke("braces");let P={type:"brace",value:Z,output:"(",outputIndex:g.output.length,tokensIndex:g.tokens.length};Ce.push(P),xe(P);continue}if(Z==="}"){let P=Ce[Ce.length-1];if(r.nobrace===!0||!P){xe({type:"text",value:Z,output:Z});continue}let y=")";if(P.dots===!0){let R=u.slice(),z=[];for(let X=R.length-1;X>=0&&(u.pop(),R[X].type!=="brace");X--)R[X].type!=="dots"&&z.unshift(R[X].value);y=M7e(z,r),g.backtrack=!0}if(P.comma!==!0&&P.dots!==!0){let R=g.output.slice(0,P.outputIndex),z=g.tokens.slice(P.tokensIndex);P.value=P.output="\\{",Z=y="\\}",g.output=R;for(let X of z)g.output+=X.output||X.value}xe({type:"brace",value:Z,output:y}),Ke("braces"),Ce.pop();continue}if(Z==="|"){me.length>0&&me[me.length-1].conditions++,xe({type:"text",value:Z});continue}if(Z===","){let P=Z,y=Ce[Ce.length-1];y&&fe[fe.length-1]==="braces"&&(y.comma=!0,P="|"),xe({type:"comma",value:Z,output:P});continue}if(Z==="/"){if(ie.type==="dot"&&g.index===g.start+1){g.start=g.index+1,g.consumed="",g.output="",u.pop(),ie=n;continue}xe({type:"slash",value:Z,output:b});continue}if(Z==="."){if(g.braces>0&&ie.type==="dot"){ie.value==="."&&(ie.output=w);let P=Ce[Ce.length-1];ie.type="dots",ie.output+=Z,ie.value+=Z,P.dots=!0;continue}if(g.braces+g.parens===0&&ie.type!=="bos"&&ie.type!=="slash"){xe({type:"text",value:Z,output:w});continue}xe({type:"dot",value:Z,output:w});continue}if(Z==="?"){if(!(ie&&ie.value==="(")&&r.noextglob!==!0&&Re()==="("&&Re(2)!=="?"){tt("qmark",Z);continue}if(ie&&ie.type==="paren"){let y=Re(),R=Z;if(y==="<"&&!ll.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(ie.value==="("&&!/[!=<:]/.test(y)||y==="<"&&!/<([!=]|\w+>)/.test(q()))&&(R=`\\${Z}`),xe({type:"text",value:Z,output:R});continue}if(r.dot!==!0&&(ie.type==="slash"||ie.type==="bos")){xe({type:"qmark",value:Z,output:le});continue}xe({type:"qmark",value:Z,output:te});continue}if(Z==="!"){if(r.noextglob!==!0&&Re()==="("&&(Re(2)!=="?"||!/[!=<:]/.test(Re(3)))){tt("negate",Z);continue}if(r.nonegate!==!0&&g.index===0){Te();continue}}if(Z==="+"){if(r.noextglob!==!0&&Re()==="("&&Re(2)!=="?"){tt("plus",Z);continue}if(ie&&ie.value==="("||r.regex===!1){xe({type:"plus",value:Z,output:D});continue}if(ie&&(ie.type==="bracket"||ie.type==="paren"||ie.type==="brace")||g.parens>0){xe({type:"plus",value:Z});continue}xe({type:"plus",value:D});continue}if(Z==="@"){if(r.noextglob!==!0&&Re()==="("&&Re(2)!=="?"){xe({type:"at",extglob:!0,value:Z,output:""});continue}xe({type:"text",value:Z});continue}if(Z!=="*"){(Z==="$"||Z==="^")&&(Z=`\\${Z}`);let P=N7e.exec(q());P&&(Z+=P[0],g.index+=P[0].length),xe({type:"text",value:Z});continue}if(ie&&(ie.type==="globstar"||ie.star===!0)){ie.type="star",ie.star=!0,ie.value+=Z,ie.output=Ee,g.backtrack=!0,g.globstar=!0,nt(Z);continue}let x=q();if(r.noextglob!==!0&&/^\([^?]/.test(x)){tt("star",Z);continue}if(ie.type==="star"){if(r.noglobstar===!0){nt(Z);continue}let P=ie.prev,y=P.prev,R=P.type==="slash"||P.type==="bos",z=y&&(y.type==="star"||y.type==="globstar");if(r.bash===!0&&(!R||x[0]&&x[0]!=="/")){xe({type:"star",value:Z,output:""});continue}let X=g.braces>0&&(P.type==="comma"||P.type==="brace"),$=me.length&&(P.type==="pipe"||P.type==="paren");if(!R&&P.type!=="paren"&&!X&&!$){xe({type:"star",value:Z,output:""});continue}for(;x.slice(0,3)==="/**";){let se=t[g.index+4];if(se&&se!=="/")break;x=x.slice(3),nt("/**",3)}if(P.type==="bos"&&Se()){ie.type="globstar",ie.value+=Z,ie.output=Ie(r),g.output=ie.output,g.globstar=!0,nt(Z);continue}if(P.type==="slash"&&P.prev.type!=="bos"&&!z&&Se()){g.output=g.output.slice(0,-(P.output+ie.output).length),P.output=`(?:${P.output}`,ie.type="globstar",ie.output=Ie(r)+(r.strictSlashes?")":"|$)"),ie.value+=Z,g.globstar=!0,g.output+=P.output+ie.output,nt(Z);continue}if(P.type==="slash"&&P.prev.type!=="bos"&&x[0]==="/"){let se=x[1]!==void 0?"|$":"";g.output=g.output.slice(0,-(P.output+ie.output).length),P.output=`(?:${P.output}`,ie.type="globstar",ie.output=`${Ie(r)}${b}|${b}${se})`,ie.value+=Z,g.output+=P.output+ie.output,g.globstar=!0,nt(Z+ht()),xe({type:"slash",value:"/",output:""});continue}if(P.type==="bos"&&x[0]==="/"){ie.type="globstar",ie.value+=Z,ie.output=`(?:^|${b}|${Ie(r)}${b})`,g.output=ie.output,g.globstar=!0,nt(Z+ht()),xe({type:"slash",value:"/",output:""});continue}g.output=g.output.slice(0,-ie.output.length),ie.type="globstar",ie.output=Ie(r),ie.value+=Z,g.output+=ie.output,g.globstar=!0,nt(Z);continue}let I={type:"star",value:Z,output:Ee};if(r.bash===!0){I.output=".*?",(ie.type==="bos"||ie.type==="slash")&&(I.output=he+I.output),xe(I);continue}if(ie&&(ie.type==="bracket"||ie.type==="paren")&&r.regex===!0){I.output=Z,xe(I);continue}(g.index===g.start||ie.type==="slash"||ie.type==="dot")&&(ie.type==="dot"?(g.output+=U,ie.output+=U):r.dot===!0?(g.output+=J,ie.output+=J):(g.output+=he,ie.output+=he),Re()!=="*"&&(g.output+=C,ie.output+=C)),xe(I)}for(;g.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(Mm("closing","]"));g.output=ll.escapeLast(g.output,"["),Ke("brackets")}for(;g.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(Mm("closing",")"));g.output=ll.escapeLast(g.output,"("),Ke("parens")}for(;g.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(Mm("closing","}"));g.output=ll.escapeLast(g.output,"{"),Ke("braces")}if(r.strictSlashes!==!0&&(ie.type==="star"||ie.type==="bracket")&&xe({type:"maybe_slash",value:"",output:`${b}?`}),g.backtrack===!0){g.output="";for(let x of g.tokens)g.output+=x.output!=null?x.output:x.value,x.suffix&&(g.output+=x.suffix)}return g};yN.fastpaths=(t,e)=>{let r={...e},o=typeof r.maxLength=="number"?Math.min(pP,r.maxLength):pP,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);t=c$[t]||t;let n=ll.isWindows(e),{DOT_LITERAL:u,SLASH_LITERAL:A,ONE_CHAR:p,DOTS_SLASH:h,NO_DOT:E,NO_DOTS:w,NO_DOTS_SLASH:D,STAR:b,START_ANCHOR:C}=fP.globChars(n),T=r.dot?w:E,N=r.dot?D:E,U=r.capture?"":"?:",J={negated:!1,prefix:""},te=r.bash===!0?".*?":b;r.capture&&(te=`(${te})`);let le=he=>he.noglobstar===!0?te:`(${U}(?:(?!${C}${he.dot?h:u}).)*?)`,ce=he=>{switch(he){case"*":return`${T}${p}${te}`;case".*":return`${u}${p}${te}`;case"*.*":return`${T}${te}${u}${p}${te}`;case"*/*":return`${T}${te}${A}${p}${N}${te}`;case"**":return T+le(r);case"**/*":return`(?:${T}${le(r)}${A})?${N}${p}${te}`;case"**/*.*":return`(?:${T}${le(r)}${A})?${N}${te}${u}${p}${te}`;case"**/.*":return`(?:${T}${le(r)}${A})?${u}${p}${te}`;default:{let De=/^(.*?)\.(\w+)$/.exec(he);if(!De)return;let Ee=ce(De[1]);return Ee?Ee+u+De[2]:void 0}}},ue=ll.removePrefix(t,J),Ie=ce(ue);return Ie&&r.strictSlashes!==!0&&(Ie+=`${A}?`),Ie};u$.exports=yN});var p$=_((FQt,f$)=>{"use strict";var U7e=ve("path"),_7e=l$(),EN=A$(),CN=Vw(),H7e=Yw(),q7e=t=>t&&typeof t=="object"&&!Array.isArray(t),Mi=(t,e,r=!1)=>{if(Array.isArray(t)){let E=t.map(D=>Mi(D,e,r));return D=>{for(let b of E){let C=b(D);if(C)return C}return!1}}let o=q7e(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!o)throw new TypeError("Expected pattern to be a non-empty string");let a=e||{},n=CN.isWindows(e),u=o?Mi.compileRe(t,e):Mi.makeRe(t,e,!1,!0),A=u.state;delete u.state;let p=()=>!1;if(a.ignore){let E={...e,ignore:null,onMatch:null,onResult:null};p=Mi(a.ignore,E,r)}let h=(E,w=!1)=>{let{isMatch:D,match:b,output:C}=Mi.test(E,u,e,{glob:t,posix:n}),T={glob:t,state:A,regex:u,posix:n,input:E,output:C,match:b,isMatch:D};return typeof a.onResult=="function"&&a.onResult(T),D===!1?(T.isMatch=!1,w?T:!1):p(E)?(typeof a.onIgnore=="function"&&a.onIgnore(T),T.isMatch=!1,w?T:!1):(typeof a.onMatch=="function"&&a.onMatch(T),w?T:!0)};return r&&(h.state=A),h};Mi.test=(t,e,r,{glob:o,posix:a}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let n=r||{},u=n.format||(a?CN.toPosixSlashes:null),A=t===o,p=A&&u?u(t):t;return A===!1&&(p=u?u(t):t,A=p===o),(A===!1||n.capture===!0)&&(n.matchBase===!0||n.basename===!0?A=Mi.matchBase(t,e,r,a):A=e.exec(p)),{isMatch:!!A,match:A,output:p}};Mi.matchBase=(t,e,r,o=CN.isWindows(r))=>(e instanceof RegExp?e:Mi.makeRe(e,r)).test(U7e.basename(t));Mi.isMatch=(t,e,r)=>Mi(e,r)(t);Mi.parse=(t,e)=>Array.isArray(t)?t.map(r=>Mi.parse(r,e)):EN(t,{...e,fastpaths:!1});Mi.scan=(t,e)=>_7e(t,e);Mi.compileRe=(t,e,r=!1,o=!1)=>{if(r===!0)return t.output;let a=e||{},n=a.contains?"":"^",u=a.contains?"":"$",A=`${n}(?:${t.output})${u}`;t&&t.negated===!0&&(A=`^(?!${A}).*$`);let p=Mi.toRegex(A,e);return o===!0&&(p.state=t),p};Mi.makeRe=(t,e={},r=!1,o=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let a={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(a.output=EN.fastpaths(t,e)),a.output||(a=EN(t,e)),Mi.compileRe(a,e,r,o)};Mi.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Mi.constants=H7e;f$.exports=Mi});var g$=_((RQt,h$)=>{"use strict";h$.exports=p$()});var Xo=_((TQt,E$)=>{"use strict";var m$=ve("util"),y$=JZ(),Xu=g$(),IN=Vw(),d$=t=>t===""||t==="./",Ii=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let o=new Set,a=new Set,n=new Set,u=0,A=E=>{n.add(E.output),r&&r.onResult&&r.onResult(E)};for(let E=0;E!o.has(E));if(r&&h.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(E=>E.replace(/\\/g,"")):e}return h};Ii.match=Ii;Ii.matcher=(t,e)=>Xu(t,e);Ii.isMatch=(t,e,r)=>Xu(e,r)(t);Ii.any=Ii.isMatch;Ii.not=(t,e,r={})=>{e=[].concat(e).map(String);let o=new Set,a=[],n=A=>{r.onResult&&r.onResult(A),a.push(A.output)},u=new Set(Ii(t,e,{...r,onResult:n}));for(let A of a)u.has(A)||o.add(A);return[...o]};Ii.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${m$.inspect(t)}"`);if(Array.isArray(e))return e.some(o=>Ii.contains(t,o,r));if(typeof e=="string"){if(d$(t)||d$(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return Ii.isMatch(t,e,{...r,contains:!0})};Ii.matchKeys=(t,e,r)=>{if(!IN.isObject(t))throw new TypeError("Expected the first argument to be an object");let o=Ii(Object.keys(t),e,r),a={};for(let n of o)a[n]=t[n];return a};Ii.some=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=Xu(String(a),r);if(o.some(u=>n(u)))return!0}return!1};Ii.every=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=Xu(String(a),r);if(!o.every(u=>n(u)))return!1}return!0};Ii.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${m$.inspect(t)}"`);return[].concat(e).every(o=>Xu(o,r)(t))};Ii.capture=(t,e,r)=>{let o=IN.isWindows(r),n=Xu.makeRe(String(t),{...r,capture:!0}).exec(o?IN.toPosixSlashes(e):e);if(n)return n.slice(1).map(u=>u===void 0?"":u)};Ii.makeRe=(...t)=>Xu.makeRe(...t);Ii.scan=(...t)=>Xu.scan(...t);Ii.parse=(t,e)=>{let r=[];for(let o of[].concat(t||[]))for(let a of y$(String(o),e))r.push(Xu.parse(a,e));return r};Ii.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:y$(t,e)};Ii.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return Ii.braces(t,{...e,expand:!0})};E$.exports=Ii});var I$=_((LQt,C$)=>{"use strict";C$.exports=({onlyFirst:t=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}});var hP=_((NQt,w$)=>{"use strict";var j7e=I$();w$.exports=t=>typeof t=="string"?t.replace(j7e(),""):t});var v$=_((OQt,B$)=>{function G7e(){this.__data__=[],this.size=0}B$.exports=G7e});var Um=_((MQt,D$)=>{function W7e(t,e){return t===e||t!==t&&e!==e}D$.exports=W7e});var Jw=_((UQt,S$)=>{var Y7e=Um();function V7e(t,e){for(var r=t.length;r--;)if(Y7e(t[r][0],e))return r;return-1}S$.exports=V7e});var x$=_((_Qt,P$)=>{var K7e=Jw(),J7e=Array.prototype,z7e=J7e.splice;function X7e(t){var e=this.__data__,r=K7e(e,t);if(r<0)return!1;var o=e.length-1;return r==o?e.pop():z7e.call(e,r,1),--this.size,!0}P$.exports=X7e});var k$=_((HQt,b$)=>{var Z7e=Jw();function $7e(t){var e=this.__data__,r=Z7e(e,t);return r<0?void 0:e[r][1]}b$.exports=$7e});var F$=_((qQt,Q$)=>{var eWe=Jw();function tWe(t){return eWe(this.__data__,t)>-1}Q$.exports=tWe});var T$=_((jQt,R$)=>{var rWe=Jw();function nWe(t,e){var r=this.__data__,o=rWe(r,t);return o<0?(++this.size,r.push([t,e])):r[o][1]=e,this}R$.exports=nWe});var zw=_((GQt,L$)=>{var iWe=v$(),sWe=x$(),oWe=k$(),aWe=F$(),lWe=T$();function _m(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var cWe=zw();function uWe(){this.__data__=new cWe,this.size=0}N$.exports=uWe});var U$=_((YQt,M$)=>{function AWe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}M$.exports=AWe});var H$=_((VQt,_$)=>{function fWe(t){return this.__data__.get(t)}_$.exports=fWe});var j$=_((KQt,q$)=>{function pWe(t){return this.__data__.has(t)}q$.exports=pWe});var wN=_((JQt,G$)=>{var hWe=typeof global=="object"&&global&&global.Object===Object&&global;G$.exports=hWe});var ql=_((zQt,W$)=>{var gWe=wN(),dWe=typeof self=="object"&&self&&self.Object===Object&&self,mWe=gWe||dWe||Function("return this")();W$.exports=mWe});var dg=_((XQt,Y$)=>{var yWe=ql(),EWe=yWe.Symbol;Y$.exports=EWe});var z$=_((ZQt,J$)=>{var V$=dg(),K$=Object.prototype,CWe=K$.hasOwnProperty,IWe=K$.toString,Xw=V$?V$.toStringTag:void 0;function wWe(t){var e=CWe.call(t,Xw),r=t[Xw];try{t[Xw]=void 0;var o=!0}catch{}var a=IWe.call(t);return o&&(e?t[Xw]=r:delete t[Xw]),a}J$.exports=wWe});var Z$=_(($Qt,X$)=>{var BWe=Object.prototype,vWe=BWe.toString;function DWe(t){return vWe.call(t)}X$.exports=DWe});var mg=_((eFt,tee)=>{var $$=dg(),SWe=z$(),PWe=Z$(),xWe="[object Null]",bWe="[object Undefined]",eee=$$?$$.toStringTag:void 0;function kWe(t){return t==null?t===void 0?bWe:xWe:eee&&eee in Object(t)?SWe(t):PWe(t)}tee.exports=kWe});var cl=_((tFt,ree)=>{function QWe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}ree.exports=QWe});var gP=_((rFt,nee)=>{var FWe=mg(),RWe=cl(),TWe="[object AsyncFunction]",LWe="[object Function]",NWe="[object GeneratorFunction]",OWe="[object Proxy]";function MWe(t){if(!RWe(t))return!1;var e=FWe(t);return e==LWe||e==NWe||e==TWe||e==OWe}nee.exports=MWe});var see=_((nFt,iee)=>{var UWe=ql(),_We=UWe["__core-js_shared__"];iee.exports=_We});var lee=_((iFt,aee)=>{var BN=see(),oee=function(){var t=/[^.]+$/.exec(BN&&BN.keys&&BN.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function HWe(t){return!!oee&&oee in t}aee.exports=HWe});var vN=_((sFt,cee)=>{var qWe=Function.prototype,jWe=qWe.toString;function GWe(t){if(t!=null){try{return jWe.call(t)}catch{}try{return t+""}catch{}}return""}cee.exports=GWe});var Aee=_((oFt,uee)=>{var WWe=gP(),YWe=lee(),VWe=cl(),KWe=vN(),JWe=/[\\^$.*+?()[\]{}|]/g,zWe=/^\[object .+?Constructor\]$/,XWe=Function.prototype,ZWe=Object.prototype,$We=XWe.toString,eYe=ZWe.hasOwnProperty,tYe=RegExp("^"+$We.call(eYe).replace(JWe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function rYe(t){if(!VWe(t)||YWe(t))return!1;var e=WWe(t)?tYe:zWe;return e.test(KWe(t))}uee.exports=rYe});var pee=_((aFt,fee)=>{function nYe(t,e){return t?.[e]}fee.exports=nYe});var $p=_((lFt,hee)=>{var iYe=Aee(),sYe=pee();function oYe(t,e){var r=sYe(t,e);return iYe(r)?r:void 0}hee.exports=oYe});var dP=_((cFt,gee)=>{var aYe=$p(),lYe=ql(),cYe=aYe(lYe,"Map");gee.exports=cYe});var Zw=_((uFt,dee)=>{var uYe=$p(),AYe=uYe(Object,"create");dee.exports=AYe});var Eee=_((AFt,yee)=>{var mee=Zw();function fYe(){this.__data__=mee?mee(null):{},this.size=0}yee.exports=fYe});var Iee=_((fFt,Cee)=>{function pYe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}Cee.exports=pYe});var Bee=_((pFt,wee)=>{var hYe=Zw(),gYe="__lodash_hash_undefined__",dYe=Object.prototype,mYe=dYe.hasOwnProperty;function yYe(t){var e=this.__data__;if(hYe){var r=e[t];return r===gYe?void 0:r}return mYe.call(e,t)?e[t]:void 0}wee.exports=yYe});var Dee=_((hFt,vee)=>{var EYe=Zw(),CYe=Object.prototype,IYe=CYe.hasOwnProperty;function wYe(t){var e=this.__data__;return EYe?e[t]!==void 0:IYe.call(e,t)}vee.exports=wYe});var Pee=_((gFt,See)=>{var BYe=Zw(),vYe="__lodash_hash_undefined__";function DYe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=BYe&&e===void 0?vYe:e,this}See.exports=DYe});var bee=_((dFt,xee)=>{var SYe=Eee(),PYe=Iee(),xYe=Bee(),bYe=Dee(),kYe=Pee();function Hm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var kee=bee(),QYe=zw(),FYe=dP();function RYe(){this.size=0,this.__data__={hash:new kee,map:new(FYe||QYe),string:new kee}}Qee.exports=RYe});var Tee=_((yFt,Ree)=>{function TYe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}Ree.exports=TYe});var $w=_((EFt,Lee)=>{var LYe=Tee();function NYe(t,e){var r=t.__data__;return LYe(e)?r[typeof e=="string"?"string":"hash"]:r.map}Lee.exports=NYe});var Oee=_((CFt,Nee)=>{var OYe=$w();function MYe(t){var e=OYe(this,t).delete(t);return this.size-=e?1:0,e}Nee.exports=MYe});var Uee=_((IFt,Mee)=>{var UYe=$w();function _Ye(t){return UYe(this,t).get(t)}Mee.exports=_Ye});var Hee=_((wFt,_ee)=>{var HYe=$w();function qYe(t){return HYe(this,t).has(t)}_ee.exports=qYe});var jee=_((BFt,qee)=>{var jYe=$w();function GYe(t,e){var r=jYe(this,t),o=r.size;return r.set(t,e),this.size+=r.size==o?0:1,this}qee.exports=GYe});var mP=_((vFt,Gee)=>{var WYe=Fee(),YYe=Oee(),VYe=Uee(),KYe=Hee(),JYe=jee();function qm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var zYe=zw(),XYe=dP(),ZYe=mP(),$Ye=200;function eVe(t,e){var r=this.__data__;if(r instanceof zYe){var o=r.__data__;if(!XYe||o.length<$Ye-1)return o.push([t,e]),this.size=++r.size,this;r=this.__data__=new ZYe(o)}return r.set(t,e),this.size=r.size,this}Wee.exports=eVe});var yP=_((SFt,Vee)=>{var tVe=zw(),rVe=O$(),nVe=U$(),iVe=H$(),sVe=j$(),oVe=Yee();function jm(t){var e=this.__data__=new tVe(t);this.size=e.size}jm.prototype.clear=rVe;jm.prototype.delete=nVe;jm.prototype.get=iVe;jm.prototype.has=sVe;jm.prototype.set=oVe;Vee.exports=jm});var Jee=_((PFt,Kee)=>{var aVe="__lodash_hash_undefined__";function lVe(t){return this.__data__.set(t,aVe),this}Kee.exports=lVe});var Xee=_((xFt,zee)=>{function cVe(t){return this.__data__.has(t)}zee.exports=cVe});var $ee=_((bFt,Zee)=>{var uVe=mP(),AVe=Jee(),fVe=Xee();function EP(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new uVe;++e{function pVe(t,e){for(var r=-1,o=t==null?0:t.length;++r{function hVe(t,e){return t.has(e)}rte.exports=hVe});var DN=_((FFt,ite)=>{var gVe=$ee(),dVe=tte(),mVe=nte(),yVe=1,EVe=2;function CVe(t,e,r,o,a,n){var u=r&yVe,A=t.length,p=e.length;if(A!=p&&!(u&&p>A))return!1;var h=n.get(t),E=n.get(e);if(h&&E)return h==e&&E==t;var w=-1,D=!0,b=r&EVe?new gVe:void 0;for(n.set(t,e),n.set(e,t);++w{var IVe=ql(),wVe=IVe.Uint8Array;ste.exports=wVe});var ate=_((TFt,ote)=>{function BVe(t){var e=-1,r=Array(t.size);return t.forEach(function(o,a){r[++e]=[a,o]}),r}ote.exports=BVe});var cte=_((LFt,lte)=>{function vVe(t){var e=-1,r=Array(t.size);return t.forEach(function(o){r[++e]=o}),r}lte.exports=vVe});var hte=_((NFt,pte)=>{var ute=dg(),Ate=SN(),DVe=Um(),SVe=DN(),PVe=ate(),xVe=cte(),bVe=1,kVe=2,QVe="[object Boolean]",FVe="[object Date]",RVe="[object Error]",TVe="[object Map]",LVe="[object Number]",NVe="[object RegExp]",OVe="[object Set]",MVe="[object String]",UVe="[object Symbol]",_Ve="[object ArrayBuffer]",HVe="[object DataView]",fte=ute?ute.prototype:void 0,PN=fte?fte.valueOf:void 0;function qVe(t,e,r,o,a,n,u){switch(r){case HVe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case _Ve:return!(t.byteLength!=e.byteLength||!n(new Ate(t),new Ate(e)));case QVe:case FVe:case LVe:return DVe(+t,+e);case RVe:return t.name==e.name&&t.message==e.message;case NVe:case MVe:return t==e+"";case TVe:var A=PVe;case OVe:var p=o&bVe;if(A||(A=xVe),t.size!=e.size&&!p)return!1;var h=u.get(t);if(h)return h==e;o|=kVe,u.set(t,e);var E=SVe(A(t),A(e),o,a,n,u);return u.delete(t),E;case UVe:if(PN)return PN.call(t)==PN.call(e)}return!1}pte.exports=qVe});var CP=_((OFt,gte)=>{function jVe(t,e){for(var r=-1,o=e.length,a=t.length;++r{var GVe=Array.isArray;dte.exports=GVe});var xN=_((UFt,mte)=>{var WVe=CP(),YVe=jl();function VVe(t,e,r){var o=e(t);return YVe(t)?o:WVe(o,r(t))}mte.exports=VVe});var Ete=_((_Ft,yte)=>{function KVe(t,e){for(var r=-1,o=t==null?0:t.length,a=0,n=[];++r{function JVe(){return[]}Cte.exports=JVe});var IP=_((qFt,wte)=>{var zVe=Ete(),XVe=bN(),ZVe=Object.prototype,$Ve=ZVe.propertyIsEnumerable,Ite=Object.getOwnPropertySymbols,eKe=Ite?function(t){return t==null?[]:(t=Object(t),zVe(Ite(t),function(e){return $Ve.call(t,e)}))}:XVe;wte.exports=eKe});var vte=_((jFt,Bte)=>{function tKe(t,e){for(var r=-1,o=Array(t);++r{function rKe(t){return t!=null&&typeof t=="object"}Dte.exports=rKe});var Pte=_((WFt,Ste)=>{var nKe=mg(),iKe=Zu(),sKe="[object Arguments]";function oKe(t){return iKe(t)&&nKe(t)==sKe}Ste.exports=oKe});var e1=_((YFt,kte)=>{var xte=Pte(),aKe=Zu(),bte=Object.prototype,lKe=bte.hasOwnProperty,cKe=bte.propertyIsEnumerable,uKe=xte(function(){return arguments}())?xte:function(t){return aKe(t)&&lKe.call(t,"callee")&&!cKe.call(t,"callee")};kte.exports=uKe});var Fte=_((VFt,Qte)=>{function AKe(){return!1}Qte.exports=AKe});var r1=_((t1,Gm)=>{var fKe=ql(),pKe=Fte(),Lte=typeof t1=="object"&&t1&&!t1.nodeType&&t1,Rte=Lte&&typeof Gm=="object"&&Gm&&!Gm.nodeType&&Gm,hKe=Rte&&Rte.exports===Lte,Tte=hKe?fKe.Buffer:void 0,gKe=Tte?Tte.isBuffer:void 0,dKe=gKe||pKe;Gm.exports=dKe});var n1=_((KFt,Nte)=>{var mKe=9007199254740991,yKe=/^(?:0|[1-9]\d*)$/;function EKe(t,e){var r=typeof t;return e=e??mKe,!!e&&(r=="number"||r!="symbol"&&yKe.test(t))&&t>-1&&t%1==0&&t{var CKe=9007199254740991;function IKe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=CKe}Ote.exports=IKe});var Ute=_((zFt,Mte)=>{var wKe=mg(),BKe=wP(),vKe=Zu(),DKe="[object Arguments]",SKe="[object Array]",PKe="[object Boolean]",xKe="[object Date]",bKe="[object Error]",kKe="[object Function]",QKe="[object Map]",FKe="[object Number]",RKe="[object Object]",TKe="[object RegExp]",LKe="[object Set]",NKe="[object String]",OKe="[object WeakMap]",MKe="[object ArrayBuffer]",UKe="[object DataView]",_Ke="[object Float32Array]",HKe="[object Float64Array]",qKe="[object Int8Array]",jKe="[object Int16Array]",GKe="[object Int32Array]",WKe="[object Uint8Array]",YKe="[object Uint8ClampedArray]",VKe="[object Uint16Array]",KKe="[object Uint32Array]",di={};di[_Ke]=di[HKe]=di[qKe]=di[jKe]=di[GKe]=di[WKe]=di[YKe]=di[VKe]=di[KKe]=!0;di[DKe]=di[SKe]=di[MKe]=di[PKe]=di[UKe]=di[xKe]=di[bKe]=di[kKe]=di[QKe]=di[FKe]=di[RKe]=di[TKe]=di[LKe]=di[NKe]=di[OKe]=!1;function JKe(t){return vKe(t)&&BKe(t.length)&&!!di[wKe(t)]}Mte.exports=JKe});var BP=_((XFt,_te)=>{function zKe(t){return function(e){return t(e)}}_te.exports=zKe});var vP=_((i1,Wm)=>{var XKe=wN(),Hte=typeof i1=="object"&&i1&&!i1.nodeType&&i1,s1=Hte&&typeof Wm=="object"&&Wm&&!Wm.nodeType&&Wm,ZKe=s1&&s1.exports===Hte,kN=ZKe&&XKe.process,$Ke=function(){try{var t=s1&&s1.require&&s1.require("util").types;return t||kN&&kN.binding&&kN.binding("util")}catch{}}();Wm.exports=$Ke});var DP=_((ZFt,Gte)=>{var eJe=Ute(),tJe=BP(),qte=vP(),jte=qte&&qte.isTypedArray,rJe=jte?tJe(jte):eJe;Gte.exports=rJe});var QN=_(($Ft,Wte)=>{var nJe=vte(),iJe=e1(),sJe=jl(),oJe=r1(),aJe=n1(),lJe=DP(),cJe=Object.prototype,uJe=cJe.hasOwnProperty;function AJe(t,e){var r=sJe(t),o=!r&&iJe(t),a=!r&&!o&&oJe(t),n=!r&&!o&&!a&&lJe(t),u=r||o||a||n,A=u?nJe(t.length,String):[],p=A.length;for(var h in t)(e||uJe.call(t,h))&&!(u&&(h=="length"||a&&(h=="offset"||h=="parent")||n&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||aJe(h,p)))&&A.push(h);return A}Wte.exports=AJe});var SP=_((eRt,Yte)=>{var fJe=Object.prototype;function pJe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||fJe;return t===r}Yte.exports=pJe});var FN=_((tRt,Vte)=>{function hJe(t,e){return function(r){return t(e(r))}}Vte.exports=hJe});var Jte=_((rRt,Kte)=>{var gJe=FN(),dJe=gJe(Object.keys,Object);Kte.exports=dJe});var Xte=_((nRt,zte)=>{var mJe=SP(),yJe=Jte(),EJe=Object.prototype,CJe=EJe.hasOwnProperty;function IJe(t){if(!mJe(t))return yJe(t);var e=[];for(var r in Object(t))CJe.call(t,r)&&r!="constructor"&&e.push(r);return e}zte.exports=IJe});var o1=_((iRt,Zte)=>{var wJe=gP(),BJe=wP();function vJe(t){return t!=null&&BJe(t.length)&&!wJe(t)}Zte.exports=vJe});var PP=_((sRt,$te)=>{var DJe=QN(),SJe=Xte(),PJe=o1();function xJe(t){return PJe(t)?DJe(t):SJe(t)}$te.exports=xJe});var RN=_((oRt,ere)=>{var bJe=xN(),kJe=IP(),QJe=PP();function FJe(t){return bJe(t,QJe,kJe)}ere.exports=FJe});var nre=_((aRt,rre)=>{var tre=RN(),RJe=1,TJe=Object.prototype,LJe=TJe.hasOwnProperty;function NJe(t,e,r,o,a,n){var u=r&RJe,A=tre(t),p=A.length,h=tre(e),E=h.length;if(p!=E&&!u)return!1;for(var w=p;w--;){var D=A[w];if(!(u?D in e:LJe.call(e,D)))return!1}var b=n.get(t),C=n.get(e);if(b&&C)return b==e&&C==t;var T=!0;n.set(t,e),n.set(e,t);for(var N=u;++w{var OJe=$p(),MJe=ql(),UJe=OJe(MJe,"DataView");ire.exports=UJe});var are=_((cRt,ore)=>{var _Je=$p(),HJe=ql(),qJe=_Je(HJe,"Promise");ore.exports=qJe});var cre=_((uRt,lre)=>{var jJe=$p(),GJe=ql(),WJe=jJe(GJe,"Set");lre.exports=WJe});var Are=_((ARt,ure)=>{var YJe=$p(),VJe=ql(),KJe=YJe(VJe,"WeakMap");ure.exports=KJe});var a1=_((fRt,yre)=>{var TN=sre(),LN=dP(),NN=are(),ON=cre(),MN=Are(),mre=mg(),Ym=vN(),fre="[object Map]",JJe="[object Object]",pre="[object Promise]",hre="[object Set]",gre="[object WeakMap]",dre="[object DataView]",zJe=Ym(TN),XJe=Ym(LN),ZJe=Ym(NN),$Je=Ym(ON),eze=Ym(MN),yg=mre;(TN&&yg(new TN(new ArrayBuffer(1)))!=dre||LN&&yg(new LN)!=fre||NN&&yg(NN.resolve())!=pre||ON&&yg(new ON)!=hre||MN&&yg(new MN)!=gre)&&(yg=function(t){var e=mre(t),r=e==JJe?t.constructor:void 0,o=r?Ym(r):"";if(o)switch(o){case zJe:return dre;case XJe:return fre;case ZJe:return pre;case $Je:return hre;case eze:return gre}return e});yre.exports=yg});var Sre=_((pRt,Dre)=>{var UN=yP(),tze=DN(),rze=hte(),nze=nre(),Ere=a1(),Cre=jl(),Ire=r1(),ize=DP(),sze=1,wre="[object Arguments]",Bre="[object Array]",xP="[object Object]",oze=Object.prototype,vre=oze.hasOwnProperty;function aze(t,e,r,o,a,n){var u=Cre(t),A=Cre(e),p=u?Bre:Ere(t),h=A?Bre:Ere(e);p=p==wre?xP:p,h=h==wre?xP:h;var E=p==xP,w=h==xP,D=p==h;if(D&&Ire(t)){if(!Ire(e))return!1;u=!0,E=!1}if(D&&!E)return n||(n=new UN),u||ize(t)?tze(t,e,r,o,a,n):rze(t,e,p,r,o,a,n);if(!(r&sze)){var b=E&&vre.call(t,"__wrapped__"),C=w&&vre.call(e,"__wrapped__");if(b||C){var T=b?t.value():t,N=C?e.value():e;return n||(n=new UN),a(T,N,r,o,n)}}return D?(n||(n=new UN),nze(t,e,r,o,a,n)):!1}Dre.exports=aze});var kre=_((hRt,bre)=>{var lze=Sre(),Pre=Zu();function xre(t,e,r,o,a){return t===e?!0:t==null||e==null||!Pre(t)&&!Pre(e)?t!==t&&e!==e:lze(t,e,r,o,xre,a)}bre.exports=xre});var Fre=_((gRt,Qre)=>{var cze=kre();function uze(t,e){return cze(t,e)}Qre.exports=uze});var _N=_((dRt,Rre)=>{var Aze=$p(),fze=function(){try{var t=Aze(Object,"defineProperty");return t({},"",{}),t}catch{}}();Rre.exports=fze});var bP=_((mRt,Lre)=>{var Tre=_N();function pze(t,e,r){e=="__proto__"&&Tre?Tre(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}Lre.exports=pze});var HN=_((yRt,Nre)=>{var hze=bP(),gze=Um();function dze(t,e,r){(r!==void 0&&!gze(t[e],r)||r===void 0&&!(e in t))&&hze(t,e,r)}Nre.exports=dze});var Mre=_((ERt,Ore)=>{function mze(t){return function(e,r,o){for(var a=-1,n=Object(e),u=o(e),A=u.length;A--;){var p=u[t?A:++a];if(r(n[p],p,n)===!1)break}return e}}Ore.exports=mze});var _re=_((CRt,Ure)=>{var yze=Mre(),Eze=yze();Ure.exports=Eze});var qN=_((l1,Vm)=>{var Cze=ql(),Gre=typeof l1=="object"&&l1&&!l1.nodeType&&l1,Hre=Gre&&typeof Vm=="object"&&Vm&&!Vm.nodeType&&Vm,Ize=Hre&&Hre.exports===Gre,qre=Ize?Cze.Buffer:void 0,jre=qre?qre.allocUnsafe:void 0;function wze(t,e){if(e)return t.slice();var r=t.length,o=jre?jre(r):new t.constructor(r);return t.copy(o),o}Vm.exports=wze});var kP=_((IRt,Yre)=>{var Wre=SN();function Bze(t){var e=new t.constructor(t.byteLength);return new Wre(e).set(new Wre(t)),e}Yre.exports=Bze});var jN=_((wRt,Vre)=>{var vze=kP();function Dze(t,e){var r=e?vze(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}Vre.exports=Dze});var QP=_((BRt,Kre)=>{function Sze(t,e){var r=-1,o=t.length;for(e||(e=Array(o));++r{var Pze=cl(),Jre=Object.create,xze=function(){function t(){}return function(e){if(!Pze(e))return{};if(Jre)return Jre(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();zre.exports=xze});var FP=_((DRt,Zre)=>{var bze=FN(),kze=bze(Object.getPrototypeOf,Object);Zre.exports=kze});var GN=_((SRt,$re)=>{var Qze=Xre(),Fze=FP(),Rze=SP();function Tze(t){return typeof t.constructor=="function"&&!Rze(t)?Qze(Fze(t)):{}}$re.exports=Tze});var tne=_((PRt,ene)=>{var Lze=o1(),Nze=Zu();function Oze(t){return Nze(t)&&Lze(t)}ene.exports=Oze});var WN=_((xRt,nne)=>{var Mze=mg(),Uze=FP(),_ze=Zu(),Hze="[object Object]",qze=Function.prototype,jze=Object.prototype,rne=qze.toString,Gze=jze.hasOwnProperty,Wze=rne.call(Object);function Yze(t){if(!_ze(t)||Mze(t)!=Hze)return!1;var e=Uze(t);if(e===null)return!0;var r=Gze.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&rne.call(r)==Wze}nne.exports=Yze});var YN=_((bRt,ine)=>{function Vze(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}ine.exports=Vze});var RP=_((kRt,sne)=>{var Kze=bP(),Jze=Um(),zze=Object.prototype,Xze=zze.hasOwnProperty;function Zze(t,e,r){var o=t[e];(!(Xze.call(t,e)&&Jze(o,r))||r===void 0&&!(e in t))&&Kze(t,e,r)}sne.exports=Zze});var Eg=_((QRt,one)=>{var $ze=RP(),eXe=bP();function tXe(t,e,r,o){var a=!r;r||(r={});for(var n=-1,u=e.length;++n{function rXe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}ane.exports=rXe});var une=_((RRt,cne)=>{var nXe=cl(),iXe=SP(),sXe=lne(),oXe=Object.prototype,aXe=oXe.hasOwnProperty;function lXe(t){if(!nXe(t))return sXe(t);var e=iXe(t),r=[];for(var o in t)o=="constructor"&&(e||!aXe.call(t,o))||r.push(o);return r}cne.exports=lXe});var Km=_((TRt,Ane)=>{var cXe=QN(),uXe=une(),AXe=o1();function fXe(t){return AXe(t)?cXe(t,!0):uXe(t)}Ane.exports=fXe});var pne=_((LRt,fne)=>{var pXe=Eg(),hXe=Km();function gXe(t){return pXe(t,hXe(t))}fne.exports=gXe});var Ene=_((NRt,yne)=>{var hne=HN(),dXe=qN(),mXe=jN(),yXe=QP(),EXe=GN(),gne=e1(),dne=jl(),CXe=tne(),IXe=r1(),wXe=gP(),BXe=cl(),vXe=WN(),DXe=DP(),mne=YN(),SXe=pne();function PXe(t,e,r,o,a,n,u){var A=mne(t,r),p=mne(e,r),h=u.get(p);if(h){hne(t,r,h);return}var E=n?n(A,p,r+"",t,e,u):void 0,w=E===void 0;if(w){var D=dne(p),b=!D&&IXe(p),C=!D&&!b&&DXe(p);E=p,D||b||C?dne(A)?E=A:CXe(A)?E=yXe(A):b?(w=!1,E=dXe(p,!0)):C?(w=!1,E=mXe(p,!0)):E=[]:vXe(p)||gne(p)?(E=A,gne(A)?E=SXe(A):(!BXe(A)||wXe(A))&&(E=EXe(p))):w=!1}w&&(u.set(p,E),a(E,p,o,n,u),u.delete(p)),hne(t,r,E)}yne.exports=PXe});var wne=_((ORt,Ine)=>{var xXe=yP(),bXe=HN(),kXe=_re(),QXe=Ene(),FXe=cl(),RXe=Km(),TXe=YN();function Cne(t,e,r,o,a){t!==e&&kXe(e,function(n,u){if(a||(a=new xXe),FXe(n))QXe(t,e,u,r,Cne,o,a);else{var A=o?o(TXe(t,u),n,u+"",t,e,a):void 0;A===void 0&&(A=n),bXe(t,u,A)}},RXe)}Ine.exports=Cne});var VN=_((MRt,Bne)=>{function LXe(t){return t}Bne.exports=LXe});var Dne=_((URt,vne)=>{function NXe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}vne.exports=NXe});var KN=_((_Rt,Pne)=>{var OXe=Dne(),Sne=Math.max;function MXe(t,e,r){return e=Sne(e===void 0?t.length-1:e,0),function(){for(var o=arguments,a=-1,n=Sne(o.length-e,0),u=Array(n);++a{function UXe(t){return function(){return t}}xne.exports=UXe});var Fne=_((qRt,Qne)=>{var _Xe=bne(),kne=_N(),HXe=VN(),qXe=kne?function(t,e){return kne(t,"toString",{configurable:!0,enumerable:!1,value:_Xe(e),writable:!0})}:HXe;Qne.exports=qXe});var Tne=_((jRt,Rne)=>{var jXe=800,GXe=16,WXe=Date.now;function YXe(t){var e=0,r=0;return function(){var o=WXe(),a=GXe-(o-r);if(r=o,a>0){if(++e>=jXe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}Rne.exports=YXe});var JN=_((GRt,Lne)=>{var VXe=Fne(),KXe=Tne(),JXe=KXe(VXe);Lne.exports=JXe});var One=_((WRt,Nne)=>{var zXe=VN(),XXe=KN(),ZXe=JN();function $Xe(t,e){return ZXe(XXe(t,e,zXe),t+"")}Nne.exports=$Xe});var Une=_((YRt,Mne)=>{var eZe=Um(),tZe=o1(),rZe=n1(),nZe=cl();function iZe(t,e,r){if(!nZe(r))return!1;var o=typeof e;return(o=="number"?tZe(r)&&rZe(e,r.length):o=="string"&&e in r)?eZe(r[e],t):!1}Mne.exports=iZe});var Hne=_((VRt,_ne)=>{var sZe=One(),oZe=Une();function aZe(t){return sZe(function(e,r){var o=-1,a=r.length,n=a>1?r[a-1]:void 0,u=a>2?r[2]:void 0;for(n=t.length>3&&typeof n=="function"?(a--,n):void 0,u&&oZe(r[0],r[1],u)&&(n=a<3?void 0:n,a=1),e=Object(e);++o{var lZe=wne(),cZe=Hne(),uZe=cZe(function(t,e,r,o){lZe(t,e,r,o)});qne.exports=uZe});var qe={};Vt(qe,{AsyncActions:()=>ZN,BufferStream:()=>XN,CachingStrategy:()=>tie,DefaultStream:()=>$N,allSettledSafe:()=>Wc,assertNever:()=>tO,bufferStream:()=>Xm,buildIgnorePattern:()=>mZe,convertMapsToIndexableObjects:()=>LP,dynamicRequire:()=>vf,escapeRegExp:()=>fZe,getArrayWithDefault:()=>u1,getFactoryWithDefault:()=>Al,getMapWithDefault:()=>A1,getSetWithDefault:()=>Jm,groupBy:()=>CZe,isIndexableObject:()=>zN,isPathLike:()=>yZe,isTaggedYarnVersion:()=>AZe,makeDeferred:()=>Zne,mapAndFilter:()=>ul,mapAndFind:()=>eh,mergeIntoTarget:()=>nie,overrideType:()=>pZe,parseBoolean:()=>f1,parseInt:()=>Zm,parseOptionalBoolean:()=>rie,plural:()=>TP,prettifyAsyncErrors:()=>zm,prettifySyncErrors:()=>rO,releaseAfterUseAsync:()=>gZe,replaceEnvVariables:()=>NP,sortMap:()=>Ss,toMerged:()=>EZe,tryParseOptionalBoolean:()=>nO,validateEnum:()=>hZe});function AZe(t){return!!(Jne.default.valid(t)&&t.match(/^[^-]+(-rc\.[0-9]+)?$/))}function TP(t,{one:e,more:r,zero:o=r}){return t===0?o:t===1?e:r}function fZe(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pZe(t){}function tO(t){throw new Error(`Assertion failed: Unexpected object '${t}'`)}function hZe(t,e){let r=Object.values(t);if(!r.includes(e))throw new it(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${r.map(o=>JSON.stringify(o)).join(", ")})`);return e}function ul(t,e){let r=[];for(let o of t){let a=e(o);a!==zne&&r.push(a)}return r}function eh(t,e){for(let r of t){let o=e(r);if(o!==Xne)return o}}function zN(t){return typeof t=="object"&&t!==null}async function Wc(t){let e=await Promise.allSettled(t),r=[];for(let o of e){if(o.status==="rejected")throw o.reason;r.push(o.value)}return r}function LP(t){if(t instanceof Map&&(t=Object.fromEntries(t)),zN(t))for(let e of Object.keys(t)){let r=t[e];zN(r)&&(t[e]=LP(r))}return t}function Al(t,e,r){let o=t.get(e);return typeof o>"u"&&t.set(e,o=r()),o}function u1(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=[]),r}function Jm(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Set),r}function A1(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Map),r}async function gZe(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function zm(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function rO(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function Xm(t){return await new Promise((e,r)=>{let o=[];t.on("error",a=>{r(a)}),t.on("data",a=>{o.push(a)}),t.on("end",()=>{e(Buffer.concat(o))})})}function Zne(){let t,e;return{promise:new Promise((o,a)=>{t=o,e=a}),resolve:t,reject:e}}function $ne(t){return c1(Ae.fromPortablePath(t))}function eie(path){let physicalPath=Ae.fromPortablePath(path),currentCacheEntry=c1.cache[physicalPath];delete c1.cache[physicalPath];let result;try{result=$ne(physicalPath);let freshCacheEntry=c1.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{c1.cache[physicalPath]=currentCacheEntry}return result}function dZe(t){let e=Gne.get(t),r=ae.statSync(t);if(e?.mtime===r.mtimeMs)return e.instance;let o=eie(t);return Gne.set(t,{mtime:r.mtimeMs,instance:o}),o}function vf(t,{cachingStrategy:e=2}={}){switch(e){case 0:return eie(t);case 1:return dZe(t);case 2:return $ne(t);default:throw new Error("Unsupported caching strategy")}}function Ss(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function mZe(t){return t.length===0?null:t.map(e=>`(${Vne.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function NP(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...o)=>{let{variableName:a,colon:n,fallback:u}=o[o.length-1],A=Object.hasOwn(e,a),p=e[a];if(p||A&&!n)return p;if(u!=null)return u;throw new it(`Environment variable not found (${a})`)})}function f1(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${t}" as a boolean`)}}function rie(t){return typeof t>"u"?t:f1(t)}function nO(t){try{return rie(t)}catch{return null}}function yZe(t){return!!(Ae.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}function nie(t,...e){let r=u=>({value:u}),o=r(t),a=e.map(u=>r(u)),{value:n}=(0,Yne.default)(o,...a,(u,A)=>{if(Array.isArray(u)&&Array.isArray(A)){for(let p of A)u.find(h=>(0,Wne.default)(h,p))||u.push(p);return u}});return n}function EZe(...t){return nie({},...t)}function CZe(t,e){let r=Object.create(null);for(let o of t){let a=o[e];r[a]??=[],r[a].push(o)}return r}function Zm(t){return typeof t=="string"?Number.parseInt(t,10):t}var Wne,Yne,Vne,Kne,Jne,eO,zne,Xne,XN,ZN,$N,c1,Gne,tie,Gl=It(()=>{St();Gt();Wne=et(Fre()),Yne=et(jne()),Vne=et(Xo()),Kne=et(lg()),Jne=et(ni()),eO=ve("stream");zne=Symbol();ul.skip=zne;Xne=Symbol();eh.skip=Xne;XN=class extends eO.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(r),a(null,null)}_flush(r){r(null,Buffer.concat(this.chunks))}};ZN=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,Kne.default)(e)}set(e,r){let o=this.deferred.get(e);typeof o>"u"&&this.deferred.set(e,o=Zne());let a=this.limit(()=>r());return this.promises.set(e,a),a.then(()=>{this.promises.get(e)===a&&o.resolve()},n=>{this.promises.get(e)===a&&o.reject(n)}),o.promise}reduce(e,r){let o=this.promises.get(e)??Promise.resolve();this.set(e,()=>r(o))}async wait(){await Promise.all(this.promises.values())}},$N=class extends eO.Transform{constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}_transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,a(null,r)}_flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}},c1=eval("require");Gne=new Map;tie=(o=>(o[o.NoCache=0]="NoCache",o[o.FsTime=1]="FsTime",o[o.Node=2]="Node",o))(tie||{})});var $m,iO,sO,iie=It(()=>{$m=(r=>(r.HARD="HARD",r.SOFT="SOFT",r))($m||{}),iO=(o=>(o.Dependency="Dependency",o.PeerDependency="PeerDependency",o.PeerDependencyMeta="PeerDependencyMeta",o))(iO||{}),sO=(o=>(o.Inactive="inactive",o.Redundant="redundant",o.Active="active",o))(sO||{})});var pe={};Vt(pe,{LogLevel:()=>HP,Style:()=>MP,Type:()=>Ct,addLogFilterSupport:()=>g1,applyColor:()=>Gs,applyHyperlink:()=>ty,applyStyle:()=>Cg,json:()=>Ig,jsonOrPretty:()=>BZe,mark:()=>uO,pretty:()=>Ut,prettyField:()=>$u,prettyList:()=>cO,prettyTruncatedLocatorList:()=>_P,stripAnsi:()=>ey.default,supportsColor:()=>UP,supportsHyperlinks:()=>lO,tuple:()=>Yc});function sie(t){let e=["KiB","MiB","GiB","TiB"],r=e.length;for(;r>1&&t<1024**r;)r-=1;let o=1024**r;return`${Math.floor(t*100/o)/100} ${e[r-1]}`}function Yc(t,e){return[e,t]}function Cg(t,e,r){return t.get("enableColors")&&r&2&&(e=h1.default.bold(e)),e}function Gs(t,e,r){if(!t.get("enableColors"))return e;let o=IZe.get(r);if(o===null)return e;let a=typeof o>"u"?r:aO.level>=3?o[0]:o[1],n=typeof a=="number"?oO.ansi256(a):a.startsWith("#")?oO.hex(a):oO[a];if(typeof n!="function")throw new Error(`Invalid format type ${a}`);return n(e)}function ty(t,e,r){return t.get("enableHyperlinks")?wZe?`\x1B]8;;${r}\x1B\\${e}\x1B]8;;\x1B\\`:`\x1B]8;;${r}\x07${e}\x1B]8;;\x07`:e}function Ut(t,e,r){if(e===null)return Gs(t,"null",Ct.NULL);if(Object.hasOwn(OP,r))return OP[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return Gs(t,e,r)}function cO(t,e,r,{separator:o=", "}={}){return[...e].map(a=>Ut(t,a,r)).join(o)}function Ig(t,e){if(t===null)return null;if(Object.hasOwn(OP,e))return OP[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function BZe(t,e,[r,o]){return t?Ig(r,o):Ut(e,r,o)}function uO(t){return{Check:Gs(t,"\u2713","green"),Cross:Gs(t,"\u2718","red"),Question:Gs(t,"?","cyan")}}function $u(t,{label:e,value:[r,o]}){return`${Ut(t,e,Ct.CODE)}: ${Ut(t,r,o)}`}function _P(t,e,r){let o=[],a=[...e],n=r;for(;a.length>0;){let h=a[0],E=`${jr(t,h)}, `,w=AO(h).length+2;if(o.length>0&&nh).join("").slice(0,-2);let u="X".repeat(a.length.toString().length),A=`and ${u} more.`,p=a.length;for(;o.length>1&&nh).join(""),A.replace(u,Ut(t,p,Ct.NUMBER))].join("")}function g1(t,{configuration:e}){let r=e.get("logFilters"),o=new Map,a=new Map,n=[];for(let w of r){let D=w.get("level");if(typeof D>"u")continue;let b=w.get("code");typeof b<"u"&&o.set(b,D);let C=w.get("text");typeof C<"u"&&a.set(C,D);let T=w.get("pattern");typeof T<"u"&&n.push([oie.default.matcher(T,{contains:!0}),D])}n.reverse();let u=(w,D,b)=>{if(w===null||w===0)return b;let C=a.size>0||n.length>0?(0,ey.default)(D):D;if(a.size>0){let T=a.get(C);if(typeof T<"u")return T??b}if(n.length>0){for(let[T,N]of n)if(T(C))return N??b}if(o.size>0){let T=o.get(Ju(w));if(typeof T<"u")return T??b}return b},A=t.reportInfo,p=t.reportWarning,h=t.reportError,E=function(w,D,b,C){switch(u(D,b,C)){case"info":A.call(w,D,b);break;case"warning":p.call(w,D??0,b);break;case"error":h.call(w,D??0,b);break}};t.reportInfo=function(...w){return E(this,...w,"info")},t.reportWarning=function(...w){return E(this,...w,"warning")},t.reportError=function(...w){return E(this,...w,"error")}}var h1,p1,oie,ey,aie,Ct,MP,aO,UP,lO,oO,IZe,Co,OP,wZe,HP,Wl=It(()=>{St();h1=et(sN()),p1=et(sg());Gt();oie=et(Xo()),ey=et(hP()),aie=ve("util");GS();Io();Ct={NO_HINT:"NO_HINT",ID:"ID",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",INSPECT:"INSPECT",DURATION:"DURATION",SIZE:"SIZE",SIZE_DIFF:"SIZE_DIFF",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN",MARKDOWN_INLINE:"MARKDOWN_INLINE"},MP=(e=>(e[e.BOLD=2]="BOLD",e))(MP||{}),aO=p1.default.GITHUB_ACTIONS?{level:2}:h1.default.supportsColor?{level:h1.default.supportsColor.level}:{level:0},UP=aO.level!==0,lO=UP&&!p1.default.GITHUB_ACTIONS&&!p1.default.CIRCLE&&!p1.default.GITLAB,oO=new h1.default.Instance(aO),IZe=new Map([[Ct.NO_HINT,null],[Ct.NULL,["#a853b5",129]],[Ct.SCOPE,["#d75f00",166]],[Ct.NAME,["#d7875f",173]],[Ct.RANGE,["#00afaf",37]],[Ct.REFERENCE,["#87afff",111]],[Ct.NUMBER,["#ffd700",220]],[Ct.PATH,["#d75fd7",170]],[Ct.URL,["#d75fd7",170]],[Ct.ADDED,["#5faf00",70]],[Ct.REMOVED,["#ff3131",160]],[Ct.CODE,["#87afff",111]],[Ct.SIZE,["#ffd700",220]]]),Co=t=>t;OP={[Ct.ID]:Co({pretty:(t,e)=>typeof e=="number"?Gs(t,`${e}`,Ct.NUMBER):Gs(t,e,Ct.CODE),json:t=>t}),[Ct.INSPECT]:Co({pretty:(t,e)=>(0,aie.inspect)(e,{depth:1/0,colors:t.get("enableColors"),compact:!0,breakLength:1/0}),json:t=>t}),[Ct.NUMBER]:Co({pretty:(t,e)=>Gs(t,`${e}`,Ct.NUMBER),json:t=>t}),[Ct.IDENT]:Co({pretty:(t,e)=>Ui(t,e),json:t=>rn(t)}),[Ct.LOCATOR]:Co({pretty:(t,e)=>jr(t,e),json:t=>Qa(t)}),[Ct.DESCRIPTOR]:Co({pretty:(t,e)=>Jn(t,e),json:t=>ka(t)}),[Ct.RESOLUTION]:Co({pretty:(t,{descriptor:e,locator:r})=>d1(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:ka(t),locator:e!==null?Qa(e):null})}),[Ct.DEPENDENT]:Co({pretty:(t,{locator:e,descriptor:r})=>fO(t,e,r),json:({locator:t,descriptor:e})=>({locator:Qa(t),descriptor:ka(e)})}),[Ct.PACKAGE_EXTENSION]:Co({pretty:(t,e)=>{switch(e.type){case"Dependency":return`${Ui(t,e.parentDescriptor)} \u27A4 ${Gs(t,"dependencies",Ct.CODE)} \u27A4 ${Ui(t,e.descriptor)}`;case"PeerDependency":return`${Ui(t,e.parentDescriptor)} \u27A4 ${Gs(t,"peerDependencies",Ct.CODE)} \u27A4 ${Ui(t,e.descriptor)}`;case"PeerDependencyMeta":return`${Ui(t,e.parentDescriptor)} \u27A4 ${Gs(t,"peerDependenciesMeta",Ct.CODE)} \u27A4 ${Ui(t,Zo(e.selector))} \u27A4 ${Gs(t,e.key,Ct.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case"Dependency":return`${rn(t.parentDescriptor)} > ${rn(t.descriptor)}`;case"PeerDependency":return`${rn(t.parentDescriptor)} >> ${rn(t.descriptor)}`;case"PeerDependencyMeta":return`${rn(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[Ct.SETTING]:Co({pretty:(t,e)=>(t.get(e),ty(t,Gs(t,e,Ct.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[Ct.DURATION]:Co({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),o=Math.ceil((e-r*60*1e3)/1e3);return o===0?`${r}m`:`${r}m ${o}s`}else{let r=Math.floor(e/1e3),o=e-r*1e3;return o===0?`${r}s`:`${r}s ${o}ms`}},json:t=>t}),[Ct.SIZE]:Co({pretty:(t,e)=>Gs(t,sie(e),Ct.NUMBER),json:t=>t}),[Ct.SIZE_DIFF]:Co({pretty:(t,e)=>{let r=e>=0?"+":"-",o=r==="+"?Ct.REMOVED:Ct.ADDED;return Gs(t,`${r} ${sie(Math.max(Math.abs(e),1))}`,o)},json:t=>t}),[Ct.PATH]:Co({pretty:(t,e)=>Gs(t,Ae.fromPortablePath(e),Ct.PATH),json:t=>Ae.fromPortablePath(t)}),[Ct.MARKDOWN]:Co({pretty:(t,{text:e,format:r,paragraphs:o})=>yo(e,{format:r,paragraphs:o}),json:({text:t})=>t}),[Ct.MARKDOWN_INLINE]:Co({pretty:(t,e)=>(e=e.replace(/(`+)((?:.|[\n])*?)\1/g,(r,o,a)=>Ut(t,o+a+o,Ct.CODE)),e=e.replace(/(\*\*)((?:.|[\n])*?)\1/g,(r,o,a)=>Cg(t,a,2)),e),json:t=>t})};wZe=!!process.env.KONSOLE_VERSION;HP=(a=>(a.Error="error",a.Warning="warning",a.Info="info",a.Discard="discard",a))(HP||{})});var lie=_(ry=>{"use strict";Object.defineProperty(ry,"__esModule",{value:!0});ry.splitWhen=ry.flatten=void 0;function vZe(t){return t.reduce((e,r)=>[].concat(e,r),[])}ry.flatten=vZe;function DZe(t,e){let r=[[]],o=0;for(let a of t)e(a)?(o++,r[o]=[]):r[o].push(a);return r}ry.splitWhen=DZe});var cie=_(qP=>{"use strict";Object.defineProperty(qP,"__esModule",{value:!0});qP.isEnoentCodeError=void 0;function SZe(t){return t.code==="ENOENT"}qP.isEnoentCodeError=SZe});var uie=_(jP=>{"use strict";Object.defineProperty(jP,"__esModule",{value:!0});jP.createDirentFromStats=void 0;var pO=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function PZe(t,e){return new pO(t,e)}jP.createDirentFromStats=PZe});var hie=_(Ki=>{"use strict";Object.defineProperty(Ki,"__esModule",{value:!0});Ki.convertPosixPathToPattern=Ki.convertWindowsPathToPattern=Ki.convertPathToPattern=Ki.escapePosixPath=Ki.escapeWindowsPath=Ki.escape=Ki.removeLeadingDotSegment=Ki.makeAbsolute=Ki.unixify=void 0;var xZe=ve("os"),bZe=ve("path"),Aie=xZe.platform()==="win32",kZe=2,QZe=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\()|\\(?![!()*+?@[\]{|}]))/g,FZe=/(\\?)([()[\]{}]|^!|[!+@](?=\())/g,RZe=/^\\\\([.?])/,TZe=/\\(?![!()+@[\]{}])/g;function LZe(t){return t.replace(/\\/g,"/")}Ki.unixify=LZe;function NZe(t,e){return bZe.resolve(t,e)}Ki.makeAbsolute=NZe;function OZe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(kZe)}return t}Ki.removeLeadingDotSegment=OZe;Ki.escape=Aie?hO:gO;function hO(t){return t.replace(FZe,"\\$2")}Ki.escapeWindowsPath=hO;function gO(t){return t.replace(QZe,"\\$2")}Ki.escapePosixPath=gO;Ki.convertPathToPattern=Aie?fie:pie;function fie(t){return hO(t).replace(RZe,"//$1").replace(TZe,"/")}Ki.convertWindowsPathToPattern=fie;function pie(t){return gO(t)}Ki.convertPosixPathToPattern=pie});var die=_((cTt,gie)=>{gie.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var Eie=_((uTt,yie)=>{var MZe=die(),mie={"{":"}","(":")","[":"]"},UZe=function(t){if(t[0]==="!")return!0;for(var e=0,r=-2,o=-2,a=-2,n=-2,u=-2;ee&&(u===-1||u>o||(u=t.indexOf("\\",e),u===-1||u>o)))||a!==-1&&t[e]==="{"&&t[e+1]!=="}"&&(a=t.indexOf("}",e),a>e&&(u=t.indexOf("\\",e),u===-1||u>a))||n!==-1&&t[e]==="("&&t[e+1]==="?"&&/[:!=]/.test(t[e+2])&&t[e+3]!==")"&&(n=t.indexOf(")",e),n>e&&(u=t.indexOf("\\",e),u===-1||u>n))||r!==-1&&t[e]==="("&&t[e+1]!=="|"&&(rr&&(u=t.indexOf("\\",r),u===-1||u>n))))return!0;if(t[e]==="\\"){var A=t[e+1];e+=2;var p=mie[A];if(p){var h=t.indexOf(p,e);h!==-1&&(e=h+1)}if(t[e]==="!")return!0}else e++}return!1},_Ze=function(t){if(t[0]==="!")return!0;for(var e=0;e{"use strict";var HZe=Eie(),qZe=ve("path").posix.dirname,jZe=ve("os").platform()==="win32",dO="/",GZe=/\\/g,WZe=/[\{\[].*[\}\]]$/,YZe=/(^|[^\\])([\{\[]|\([^\)]+$)/,VZe=/\\([\!\*\?\|\[\]\(\)\{\}])/g;Cie.exports=function(e,r){var o=Object.assign({flipBackslashes:!0},r);o.flipBackslashes&&jZe&&e.indexOf(dO)<0&&(e=e.replace(GZe,dO)),WZe.test(e)&&(e+=dO),e+="a";do e=qZe(e);while(HZe(e)||YZe.test(e));return e.replace(VZe,"$1")}});var bie=_(Mr=>{"use strict";Object.defineProperty(Mr,"__esModule",{value:!0});Mr.removeDuplicateSlashes=Mr.matchAny=Mr.convertPatternsToRe=Mr.makeRe=Mr.getPatternParts=Mr.expandBraceExpansion=Mr.expandPatternsWithBraceExpansion=Mr.isAffectDepthOfReadingPattern=Mr.endsWithSlashGlobStar=Mr.hasGlobStar=Mr.getBaseDirectory=Mr.isPatternRelatedToParentDirectory=Mr.getPatternsOutsideCurrentDirectory=Mr.getPatternsInsideCurrentDirectory=Mr.getPositivePatterns=Mr.getNegativePatterns=Mr.isPositivePattern=Mr.isNegativePattern=Mr.convertToNegativePattern=Mr.convertToPositivePattern=Mr.isDynamicPattern=Mr.isStaticPattern=void 0;var KZe=ve("path"),JZe=Iie(),mO=Xo(),wie="**",zZe="\\",XZe=/[*?]|^!/,ZZe=/\[[^[]*]/,$Ze=/(?:^|[^!*+?@])\([^(]*\|[^|]*\)/,e$e=/[!*+?@]\([^(]*\)/,t$e=/,|\.\./,r$e=/(?!^)\/{2,}/g;function Bie(t,e={}){return!vie(t,e)}Mr.isStaticPattern=Bie;function vie(t,e={}){return t===""?!1:!!(e.caseSensitiveMatch===!1||t.includes(zZe)||XZe.test(t)||ZZe.test(t)||$Ze.test(t)||e.extglob!==!1&&e$e.test(t)||e.braceExpansion!==!1&&n$e(t))}Mr.isDynamicPattern=vie;function n$e(t){let e=t.indexOf("{");if(e===-1)return!1;let r=t.indexOf("}",e+1);if(r===-1)return!1;let o=t.slice(e,r);return t$e.test(o)}function i$e(t){return GP(t)?t.slice(1):t}Mr.convertToPositivePattern=i$e;function s$e(t){return"!"+t}Mr.convertToNegativePattern=s$e;function GP(t){return t.startsWith("!")&&t[1]!=="("}Mr.isNegativePattern=GP;function Die(t){return!GP(t)}Mr.isPositivePattern=Die;function o$e(t){return t.filter(GP)}Mr.getNegativePatterns=o$e;function a$e(t){return t.filter(Die)}Mr.getPositivePatterns=a$e;function l$e(t){return t.filter(e=>!yO(e))}Mr.getPatternsInsideCurrentDirectory=l$e;function c$e(t){return t.filter(yO)}Mr.getPatternsOutsideCurrentDirectory=c$e;function yO(t){return t.startsWith("..")||t.startsWith("./..")}Mr.isPatternRelatedToParentDirectory=yO;function u$e(t){return JZe(t,{flipBackslashes:!1})}Mr.getBaseDirectory=u$e;function A$e(t){return t.includes(wie)}Mr.hasGlobStar=A$e;function Sie(t){return t.endsWith("/"+wie)}Mr.endsWithSlashGlobStar=Sie;function f$e(t){let e=KZe.basename(t);return Sie(t)||Bie(e)}Mr.isAffectDepthOfReadingPattern=f$e;function p$e(t){return t.reduce((e,r)=>e.concat(Pie(r)),[])}Mr.expandPatternsWithBraceExpansion=p$e;function Pie(t){let e=mO.braces(t,{expand:!0,nodupes:!0,keepEscaping:!0});return e.sort((r,o)=>r.length-o.length),e.filter(r=>r!=="")}Mr.expandBraceExpansion=Pie;function h$e(t,e){let{parts:r}=mO.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.length===0&&(r=[t]),r[0].startsWith("/")&&(r[0]=r[0].slice(1),r.unshift("")),r}Mr.getPatternParts=h$e;function xie(t,e){return mO.makeRe(t,e)}Mr.makeRe=xie;function g$e(t,e){return t.map(r=>xie(r,e))}Mr.convertPatternsToRe=g$e;function d$e(t,e){return e.some(r=>r.test(t))}Mr.matchAny=d$e;function m$e(t){return t.replace(r$e,"/")}Mr.removeDuplicateSlashes=m$e});var Rie=_((pTt,Fie)=>{"use strict";var y$e=ve("stream"),kie=y$e.PassThrough,E$e=Array.prototype.slice;Fie.exports=C$e;function C$e(){let t=[],e=E$e.call(arguments),r=!1,o=e[e.length-1];o&&!Array.isArray(o)&&o.pipe==null?e.pop():o={};let a=o.end!==!1,n=o.pipeError===!0;o.objectMode==null&&(o.objectMode=!0),o.highWaterMark==null&&(o.highWaterMark=64*1024);let u=kie(o);function A(){for(let E=0,w=arguments.length;E0||(r=!1,p())}function b(C){function T(){C.removeListener("merge2UnpipeEnd",T),C.removeListener("end",T),n&&C.removeListener("error",N),D()}function N(U){u.emit("error",U)}if(C._readableState.endEmitted)return D();C.on("merge2UnpipeEnd",T),C.on("end",T),n&&C.on("error",N),C.pipe(u,{end:!1}),C.resume()}for(let C=0;C{"use strict";Object.defineProperty(WP,"__esModule",{value:!0});WP.merge=void 0;var I$e=Rie();function w$e(t){let e=I$e(t);return t.forEach(r=>{r.once("error",o=>e.emit("error",o))}),e.once("close",()=>Tie(t)),e.once("end",()=>Tie(t)),e}WP.merge=w$e;function Tie(t){t.forEach(e=>e.emit("close"))}});var Nie=_(ny=>{"use strict";Object.defineProperty(ny,"__esModule",{value:!0});ny.isEmpty=ny.isString=void 0;function B$e(t){return typeof t=="string"}ny.isString=B$e;function v$e(t){return t===""}ny.isEmpty=v$e});var Df=_(wo=>{"use strict";Object.defineProperty(wo,"__esModule",{value:!0});wo.string=wo.stream=wo.pattern=wo.path=wo.fs=wo.errno=wo.array=void 0;var D$e=lie();wo.array=D$e;var S$e=cie();wo.errno=S$e;var P$e=uie();wo.fs=P$e;var x$e=hie();wo.path=x$e;var b$e=bie();wo.pattern=b$e;var k$e=Lie();wo.stream=k$e;var Q$e=Nie();wo.string=Q$e});var _ie=_(Bo=>{"use strict";Object.defineProperty(Bo,"__esModule",{value:!0});Bo.convertPatternGroupToTask=Bo.convertPatternGroupsToTasks=Bo.groupPatternsByBaseDirectory=Bo.getNegativePatternsAsPositive=Bo.getPositivePatterns=Bo.convertPatternsToTasks=Bo.generate=void 0;var Vc=Df();function F$e(t,e){let r=Oie(t,e),o=Oie(e.ignore,e),a=Mie(r),n=Uie(r,o),u=a.filter(E=>Vc.pattern.isStaticPattern(E,e)),A=a.filter(E=>Vc.pattern.isDynamicPattern(E,e)),p=EO(u,n,!1),h=EO(A,n,!0);return p.concat(h)}Bo.generate=F$e;function Oie(t,e){let r=t;return e.braceExpansion&&(r=Vc.pattern.expandPatternsWithBraceExpansion(r)),e.baseNameMatch&&(r=r.map(o=>o.includes("/")?o:`**/${o}`)),r.map(o=>Vc.pattern.removeDuplicateSlashes(o))}function EO(t,e,r){let o=[],a=Vc.pattern.getPatternsOutsideCurrentDirectory(t),n=Vc.pattern.getPatternsInsideCurrentDirectory(t),u=CO(a),A=CO(n);return o.push(...IO(u,e,r)),"."in A?o.push(wO(".",n,e,r)):o.push(...IO(A,e,r)),o}Bo.convertPatternsToTasks=EO;function Mie(t){return Vc.pattern.getPositivePatterns(t)}Bo.getPositivePatterns=Mie;function Uie(t,e){return Vc.pattern.getNegativePatterns(t).concat(e).map(Vc.pattern.convertToPositivePattern)}Bo.getNegativePatternsAsPositive=Uie;function CO(t){let e={};return t.reduce((r,o)=>{let a=Vc.pattern.getBaseDirectory(o);return a in r?r[a].push(o):r[a]=[o],r},e)}Bo.groupPatternsByBaseDirectory=CO;function IO(t,e,r){return Object.keys(t).map(o=>wO(o,t[o],e,r))}Bo.convertPatternGroupsToTasks=IO;function wO(t,e,r,o){return{dynamic:o,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Vc.pattern.convertToNegativePattern))}}Bo.convertPatternGroupToTask=wO});var qie=_(YP=>{"use strict";Object.defineProperty(YP,"__esModule",{value:!0});YP.read=void 0;function R$e(t,e,r){e.fs.lstat(t,(o,a)=>{if(o!==null){Hie(r,o);return}if(!a.isSymbolicLink()||!e.followSymbolicLink){BO(r,a);return}e.fs.stat(t,(n,u)=>{if(n!==null){if(e.throwErrorOnBrokenSymbolicLink){Hie(r,n);return}BO(r,a);return}e.markSymbolicLink&&(u.isSymbolicLink=()=>!0),BO(r,u)})})}YP.read=R$e;function Hie(t,e){t(e)}function BO(t,e){t(null,e)}});var jie=_(VP=>{"use strict";Object.defineProperty(VP,"__esModule",{value:!0});VP.read=void 0;function T$e(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let o=e.fs.statSync(t);return e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),o}catch(o){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw o}}VP.read=T$e});var Gie=_(th=>{"use strict";Object.defineProperty(th,"__esModule",{value:!0});th.createFileSystemAdapter=th.FILE_SYSTEM_ADAPTER=void 0;var KP=ve("fs");th.FILE_SYSTEM_ADAPTER={lstat:KP.lstat,stat:KP.stat,lstatSync:KP.lstatSync,statSync:KP.statSync};function L$e(t){return t===void 0?th.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},th.FILE_SYSTEM_ADAPTER),t)}th.createFileSystemAdapter=L$e});var Wie=_(DO=>{"use strict";Object.defineProperty(DO,"__esModule",{value:!0});var N$e=Gie(),vO=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=N$e.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e??r}};DO.default=vO});var wg=_(rh=>{"use strict";Object.defineProperty(rh,"__esModule",{value:!0});rh.statSync=rh.stat=rh.Settings=void 0;var Yie=qie(),O$e=jie(),SO=Wie();rh.Settings=SO.default;function M$e(t,e,r){if(typeof e=="function"){Yie.read(t,PO(),e);return}Yie.read(t,PO(e),r)}rh.stat=M$e;function U$e(t,e){let r=PO(e);return O$e.read(t,r)}rh.statSync=U$e;function PO(t={}){return t instanceof SO.default?t:new SO.default(t)}});var Jie=_((BTt,Kie)=>{var Vie;Kie.exports=typeof queueMicrotask=="function"?queueMicrotask.bind(typeof window<"u"?window:global):t=>(Vie||(Vie=Promise.resolve())).then(t).catch(e=>setTimeout(()=>{throw e},0))});var Xie=_((vTt,zie)=>{zie.exports=H$e;var _$e=Jie();function H$e(t,e){let r,o,a,n=!0;Array.isArray(t)?(r=[],o=t.length):(a=Object.keys(t),r={},o=a.length);function u(p){function h(){e&&e(p,r),e=null}n?_$e(h):h()}function A(p,h,E){r[p]=E,(--o===0||h)&&u(h)}o?a?a.forEach(function(p){t[p](function(h,E){A(p,h,E)})}):t.forEach(function(p,h){p(function(E,w){A(h,E,w)})}):u(null),n=!1}});var xO=_(zP=>{"use strict";Object.defineProperty(zP,"__esModule",{value:!0});zP.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var JP=process.versions.node.split(".");if(JP[0]===void 0||JP[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var Zie=Number.parseInt(JP[0],10),q$e=Number.parseInt(JP[1],10),$ie=10,j$e=10,G$e=Zie>$ie,W$e=Zie===$ie&&q$e>=j$e;zP.IS_SUPPORT_READDIR_WITH_FILE_TYPES=G$e||W$e});var ese=_(XP=>{"use strict";Object.defineProperty(XP,"__esModule",{value:!0});XP.createDirentFromStats=void 0;var bO=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function Y$e(t,e){return new bO(t,e)}XP.createDirentFromStats=Y$e});var kO=_(ZP=>{"use strict";Object.defineProperty(ZP,"__esModule",{value:!0});ZP.fs=void 0;var V$e=ese();ZP.fs=V$e});var QO=_($P=>{"use strict";Object.defineProperty($P,"__esModule",{value:!0});$P.joinPathSegments=void 0;function K$e(t,e,r){return t.endsWith(r)?t+e:t+r+e}$P.joinPathSegments=K$e});var ose=_(nh=>{"use strict";Object.defineProperty(nh,"__esModule",{value:!0});nh.readdir=nh.readdirWithFileTypes=nh.read=void 0;var J$e=wg(),tse=Xie(),z$e=xO(),rse=kO(),nse=QO();function X$e(t,e,r){if(!e.stats&&z$e.IS_SUPPORT_READDIR_WITH_FILE_TYPES){ise(t,e,r);return}sse(t,e,r)}nh.read=X$e;function ise(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(o,a)=>{if(o!==null){ex(r,o);return}let n=a.map(A=>({dirent:A,name:A.name,path:nse.joinPathSegments(t,A.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){FO(r,n);return}let u=n.map(A=>Z$e(A,e));tse(u,(A,p)=>{if(A!==null){ex(r,A);return}FO(r,p)})})}nh.readdirWithFileTypes=ise;function Z$e(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(o,a)=>{if(o!==null){if(e.throwErrorOnBrokenSymbolicLink){r(o);return}r(null,t);return}t.dirent=rse.fs.createDirentFromStats(t.name,a),r(null,t)})}}function sse(t,e,r){e.fs.readdir(t,(o,a)=>{if(o!==null){ex(r,o);return}let n=a.map(u=>{let A=nse.joinPathSegments(t,u,e.pathSegmentSeparator);return p=>{J$e.stat(A,e.fsStatSettings,(h,E)=>{if(h!==null){p(h);return}let w={name:u,path:A,dirent:rse.fs.createDirentFromStats(u,E)};e.stats&&(w.stats=E),p(null,w)})}});tse(n,(u,A)=>{if(u!==null){ex(r,u);return}FO(r,A)})})}nh.readdir=sse;function ex(t,e){t(e)}function FO(t,e){t(null,e)}});var Ase=_(ih=>{"use strict";Object.defineProperty(ih,"__esModule",{value:!0});ih.readdir=ih.readdirWithFileTypes=ih.read=void 0;var $$e=wg(),eet=xO(),ase=kO(),lse=QO();function tet(t,e){return!e.stats&&eet.IS_SUPPORT_READDIR_WITH_FILE_TYPES?cse(t,e):use(t,e)}ih.read=tet;function cse(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(o=>{let a={dirent:o,name:o.name,path:lse.joinPathSegments(t,o.name,e.pathSegmentSeparator)};if(a.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let n=e.fs.statSync(a.path);a.dirent=ase.fs.createDirentFromStats(a.name,n)}catch(n){if(e.throwErrorOnBrokenSymbolicLink)throw n}return a})}ih.readdirWithFileTypes=cse;function use(t,e){return e.fs.readdirSync(t).map(o=>{let a=lse.joinPathSegments(t,o,e.pathSegmentSeparator),n=$$e.statSync(a,e.fsStatSettings),u={name:o,path:a,dirent:ase.fs.createDirentFromStats(o,n)};return e.stats&&(u.stats=n),u})}ih.readdir=use});var fse=_(sh=>{"use strict";Object.defineProperty(sh,"__esModule",{value:!0});sh.createFileSystemAdapter=sh.FILE_SYSTEM_ADAPTER=void 0;var iy=ve("fs");sh.FILE_SYSTEM_ADAPTER={lstat:iy.lstat,stat:iy.stat,lstatSync:iy.lstatSync,statSync:iy.statSync,readdir:iy.readdir,readdirSync:iy.readdirSync};function ret(t){return t===void 0?sh.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},sh.FILE_SYSTEM_ADAPTER),t)}sh.createFileSystemAdapter=ret});var pse=_(TO=>{"use strict";Object.defineProperty(TO,"__esModule",{value:!0});var net=ve("path"),iet=wg(),set=fse(),RO=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=set.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,net.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new iet.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};TO.default=RO});var tx=_(oh=>{"use strict";Object.defineProperty(oh,"__esModule",{value:!0});oh.Settings=oh.scandirSync=oh.scandir=void 0;var hse=ose(),oet=Ase(),LO=pse();oh.Settings=LO.default;function aet(t,e,r){if(typeof e=="function"){hse.read(t,NO(),e);return}hse.read(t,NO(e),r)}oh.scandir=aet;function cet(t,e){let r=NO(e);return oet.read(t,r)}oh.scandirSync=cet;function NO(t={}){return t instanceof LO.default?t:new LO.default(t)}});var dse=_((TTt,gse)=>{"use strict";function uet(t){var e=new t,r=e;function o(){var n=e;return n.next?e=n.next:(e=new t,r=e),n.next=null,n}function a(n){r.next=n,r=n}return{get:o,release:a}}gse.exports=uet});var yse=_((LTt,OO)=>{"use strict";var Aet=dse();function mse(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),!(r>=1))throw new Error("fastqueue concurrency must be equal to or greater than 1");var o=Aet(fet),a=null,n=null,u=0,A=null,p={push:T,drain:Yl,saturated:Yl,pause:E,paused:!1,get concurrency(){return r},set concurrency(ce){if(!(ce>=1))throw new Error("fastqueue concurrency must be equal to or greater than 1");if(r=ce,!p.paused)for(;a&&u=r||p.paused?n?(n.next=Ie,n=Ie):(a=Ie,n=Ie,p.saturated()):(u++,e.call(t,Ie.value,Ie.worked))}function N(ce,ue){var Ie=o.get();Ie.context=t,Ie.release=U,Ie.value=ce,Ie.callback=ue||Yl,Ie.errorHandler=A,u>=r||p.paused?a?(Ie.next=a,a=Ie):(a=Ie,n=Ie,p.saturated()):(u++,e.call(t,Ie.value,Ie.worked))}function U(ce){ce&&o.release(ce);var ue=a;ue&&u<=r?p.paused?u--:(n===a&&(n=null),a=ue.next,ue.next=null,e.call(t,ue.value,ue.worked),n===null&&p.empty()):--u===0&&p.drain()}function J(){a=null,n=null,p.drain=Yl}function te(){a=null,n=null,p.drain(),p.drain=Yl}function le(ce){A=ce}}function Yl(){}function fet(){this.value=null,this.callback=Yl,this.next=null,this.release=Yl,this.context=null,this.errorHandler=null;var t=this;this.worked=function(r,o){var a=t.callback,n=t.errorHandler,u=t.value;t.value=null,t.callback=Yl,t.errorHandler&&n(r,u),a.call(t.context,r,o),t.release(t)}}function pet(t,e,r){typeof t=="function"&&(r=e,e=t,t=null);function o(E,w){e.call(this,E).then(function(D){w(null,D)},w)}var a=mse(t,o,r),n=a.push,u=a.unshift;return a.push=A,a.unshift=p,a.drained=h,a;function A(E){var w=new Promise(function(D,b){n(E,function(C,T){if(C){b(C);return}D(T)})});return w.catch(Yl),w}function p(E){var w=new Promise(function(D,b){u(E,function(C,T){if(C){b(C);return}D(T)})});return w.catch(Yl),w}function h(){if(a.idle())return new Promise(function(D){D()});var E=a.drain,w=new Promise(function(D){a.drain=function(){E(),D()}});return w}}OO.exports=mse;OO.exports.promise=pet});var rx=_(eA=>{"use strict";Object.defineProperty(eA,"__esModule",{value:!0});eA.joinPathSegments=eA.replacePathSegmentSeparator=eA.isAppliedFilter=eA.isFatalError=void 0;function het(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}eA.isFatalError=het;function get(t,e){return t===null||t(e)}eA.isAppliedFilter=get;function det(t,e){return t.split(/[/\\]/).join(e)}eA.replacePathSegmentSeparator=det;function met(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}eA.joinPathSegments=met});var _O=_(UO=>{"use strict";Object.defineProperty(UO,"__esModule",{value:!0});var yet=rx(),MO=class{constructor(e,r){this._root=e,this._settings=r,this._root=yet.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};UO.default=MO});var jO=_(qO=>{"use strict";Object.defineProperty(qO,"__esModule",{value:!0});var Eet=ve("events"),Cet=tx(),Iet=yse(),nx=rx(),wet=_O(),HO=class extends wet.default{constructor(e,r){super(e,r),this._settings=r,this._scandir=Cet.scandir,this._emitter=new Eet.EventEmitter,this._queue=Iet(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,r){let o={directory:e,base:r};this._queue.push(o,a=>{a!==null&&this._handleError(a)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(o,a)=>{if(o!==null){r(o,void 0);return}for(let n of a)this._handleEntry(n,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!nx.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let o=e.path;r!==void 0&&(e.path=nx.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),nx.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&nx.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,r===void 0?void 0:e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};qO.default=HO});var Ese=_(WO=>{"use strict";Object.defineProperty(WO,"__esModule",{value:!0});var Bet=jO(),GO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Bet.default(this._root,this._settings),this._storage=[]}read(e){this._reader.onError(r=>{vet(e,r)}),this._reader.onEntry(r=>{this._storage.push(r)}),this._reader.onEnd(()=>{Det(e,this._storage)}),this._reader.read()}};WO.default=GO;function vet(t,e){t(e)}function Det(t,e){t(null,e)}});var Cse=_(VO=>{"use strict";Object.defineProperty(VO,"__esModule",{value:!0});var Pet=ve("stream"),xet=jO(),YO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new xet.default(this._root,this._settings),this._stream=new Pet.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};VO.default=YO});var Ise=_(JO=>{"use strict";Object.defineProperty(JO,"__esModule",{value:!0});var bet=tx(),ix=rx(),ket=_O(),KO=class extends ket.default{constructor(){super(...arguments),this._scandir=bet.scandirSync,this._storage=[],this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),this._storage}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let o=this._scandir(e,this._settings.fsScandirSettings);for(let a of o)this._handleEntry(a,r)}catch(o){this._handleError(o)}}_handleError(e){if(ix.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let o=e.path;r!==void 0&&(e.path=ix.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),ix.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&ix.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,r===void 0?void 0:e.path)}_pushToStorage(e){this._storage.push(e)}};JO.default=KO});var wse=_(XO=>{"use strict";Object.defineProperty(XO,"__esModule",{value:!0});var Qet=Ise(),zO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Qet.default(this._root,this._settings)}read(){return this._reader.read()}};XO.default=zO});var Bse=_($O=>{"use strict";Object.defineProperty($O,"__esModule",{value:!0});var Fet=ve("path"),Ret=tx(),ZO=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Fet.sep),this.fsScandirSettings=new Ret.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};$O.default=ZO});var ox=_(tA=>{"use strict";Object.defineProperty(tA,"__esModule",{value:!0});tA.Settings=tA.walkStream=tA.walkSync=tA.walk=void 0;var vse=Ese(),Tet=Cse(),Let=wse(),eM=Bse();tA.Settings=eM.default;function Net(t,e,r){if(typeof e=="function"){new vse.default(t,sx()).read(e);return}new vse.default(t,sx(e)).read(r)}tA.walk=Net;function Oet(t,e){let r=sx(e);return new Let.default(t,r).read()}tA.walkSync=Oet;function Met(t,e){let r=sx(e);return new Tet.default(t,r).read()}tA.walkStream=Met;function sx(t={}){return t instanceof eM.default?t:new eM.default(t)}});var ax=_(rM=>{"use strict";Object.defineProperty(rM,"__esModule",{value:!0});var Uet=ve("path"),_et=wg(),Dse=Df(),tM=class{constructor(e){this._settings=e,this._fsStatSettings=new _et.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return Uet.resolve(this._settings.cwd,e)}_makeEntry(e,r){let o={name:r,path:r,dirent:Dse.fs.createDirentFromStats(r,e)};return this._settings.stats&&(o.stats=e),o}_isFatalError(e){return!Dse.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};rM.default=tM});var sM=_(iM=>{"use strict";Object.defineProperty(iM,"__esModule",{value:!0});var Het=ve("stream"),qet=wg(),jet=ox(),Get=ax(),nM=class extends Get.default{constructor(){super(...arguments),this._walkStream=jet.walkStream,this._stat=qet.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let o=e.map(this._getFullEntryPath,this),a=new Het.PassThrough({objectMode:!0});a._write=(n,u,A)=>this._getEntry(o[n],e[n],r).then(p=>{p!==null&&r.entryFilter(p)&&a.push(p),n===o.length-1&&a.end(),A()}).catch(A);for(let n=0;nthis._makeEntry(a,r)).catch(a=>{if(o.errorFilter(a))return null;throw a})}_getStat(e){return new Promise((r,o)=>{this._stat(e,this._fsStatSettings,(a,n)=>a===null?r(n):o(a))})}};iM.default=nM});var Sse=_(aM=>{"use strict";Object.defineProperty(aM,"__esModule",{value:!0});var Wet=ox(),Yet=ax(),Vet=sM(),oM=class extends Yet.default{constructor(){super(...arguments),this._walkAsync=Wet.walk,this._readerStream=new Vet.default(this._settings)}dynamic(e,r){return new Promise((o,a)=>{this._walkAsync(e,r,(n,u)=>{n===null?o(u):a(n)})})}async static(e,r){let o=[],a=this._readerStream.static(e,r);return new Promise((n,u)=>{a.once("error",u),a.on("data",A=>o.push(A)),a.once("end",()=>n(o))})}};aM.default=oM});var Pse=_(cM=>{"use strict";Object.defineProperty(cM,"__esModule",{value:!0});var m1=Df(),lM=class{constructor(e,r,o){this._patterns=e,this._settings=r,this._micromatchOptions=o,this._storage=[],this._fillStorage()}_fillStorage(){for(let e of this._patterns){let r=this._getPatternSegments(e),o=this._splitSegmentsIntoSections(r);this._storage.push({complete:o.length<=1,pattern:e,segments:r,sections:o})}}_getPatternSegments(e){return m1.pattern.getPatternParts(e,this._micromatchOptions).map(o=>m1.pattern.isDynamicPattern(o,this._settings)?{dynamic:!0,pattern:o,patternRe:m1.pattern.makeRe(o,this._micromatchOptions)}:{dynamic:!1,pattern:o})}_splitSegmentsIntoSections(e){return m1.array.splitWhen(e,r=>r.dynamic&&m1.pattern.hasGlobStar(r.pattern))}};cM.default=lM});var xse=_(AM=>{"use strict";Object.defineProperty(AM,"__esModule",{value:!0});var Ket=Pse(),uM=class extends Ket.default{match(e){let r=e.split("/"),o=r.length,a=this._storage.filter(n=>!n.complete||n.segments.length>o);for(let n of a){let u=n.sections[0];if(!n.complete&&o>u.length||r.every((p,h)=>{let E=n.segments[h];return!!(E.dynamic&&E.patternRe.test(p)||!E.dynamic&&E.pattern===p)}))return!0}return!1}};AM.default=uM});var bse=_(pM=>{"use strict";Object.defineProperty(pM,"__esModule",{value:!0});var lx=Df(),Jet=xse(),fM=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,o){let a=this._getMatcher(r),n=this._getNegativePatternsRe(o);return u=>this._filter(e,u,a,n)}_getMatcher(e){return new Jet.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(lx.pattern.isAffectDepthOfReadingPattern);return lx.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,o,a){if(this._isSkippedByDeep(e,r.path)||this._isSkippedSymbolicLink(r))return!1;let n=lx.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(n,o)?!1:this._isSkippedByNegativePatterns(n,a)}_isSkippedByDeep(e,r){return this._settings.deep===1/0?!1:this._getEntryLevel(e,r)>=this._settings.deep}_getEntryLevel(e,r){let o=r.split("/").length;if(e==="")return o;let a=e.split("/").length;return o-a}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!lx.pattern.matchAny(e,r)}};pM.default=fM});var kse=_(gM=>{"use strict";Object.defineProperty(gM,"__esModule",{value:!0});var Bg=Df(),hM=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let o=Bg.pattern.convertPatternsToRe(e,this._micromatchOptions),a=Bg.pattern.convertPatternsToRe(r,Object.assign(Object.assign({},this._micromatchOptions),{dot:!0}));return n=>this._filter(n,o,a)}_filter(e,r,o){let a=Bg.path.removeLeadingDotSegment(e.path);if(this._settings.unique&&this._isDuplicateEntry(a)||this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(a,o))return!1;let n=e.dirent.isDirectory(),u=this._isMatchToPatterns(a,r,n)&&!this._isMatchToPatterns(a,o,n);return this._settings.unique&&u&&this._createIndexRecord(a),u}_isDuplicateEntry(e){return this.index.has(e)}_createIndexRecord(e){this.index.set(e,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let o=Bg.path.makeAbsolute(this._settings.cwd,e);return Bg.pattern.matchAny(o,r)}_isMatchToPatterns(e,r,o){let a=Bg.pattern.matchAny(e,r);return!a&&o?Bg.pattern.matchAny(e+"/",r):a}};gM.default=hM});var Qse=_(mM=>{"use strict";Object.defineProperty(mM,"__esModule",{value:!0});var zet=Df(),dM=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return zet.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};mM.default=dM});var Rse=_(EM=>{"use strict";Object.defineProperty(EM,"__esModule",{value:!0});var Fse=Df(),yM=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=Fse.path.makeAbsolute(this._settings.cwd,r),r=Fse.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};EM.default=yM});var cx=_(IM=>{"use strict";Object.defineProperty(IM,"__esModule",{value:!0});var Xet=ve("path"),Zet=bse(),$et=kse(),ett=Qse(),ttt=Rse(),CM=class{constructor(e){this._settings=e,this.errorFilter=new ett.default(this._settings),this.entryFilter=new $et.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new Zet.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new ttt.default(this._settings)}_getRootDirectory(e){return Xet.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};IM.default=CM});var Tse=_(BM=>{"use strict";Object.defineProperty(BM,"__esModule",{value:!0});var rtt=Sse(),ntt=cx(),wM=class extends ntt.default{constructor(){super(...arguments),this._reader=new rtt.default(this._settings)}async read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return(await this.api(r,e,o)).map(n=>o.transform(n))}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};BM.default=wM});var Lse=_(DM=>{"use strict";Object.defineProperty(DM,"__esModule",{value:!0});var itt=ve("stream"),stt=sM(),ott=cx(),vM=class extends ott.default{constructor(){super(...arguments),this._reader=new stt.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e),a=this.api(r,e,o),n=new itt.Readable({objectMode:!0,read:()=>{}});return a.once("error",u=>n.emit("error",u)).on("data",u=>n.emit("data",o.transform(u))).once("end",()=>n.emit("end")),n.once("close",()=>a.destroy()),n}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};DM.default=vM});var Nse=_(PM=>{"use strict";Object.defineProperty(PM,"__esModule",{value:!0});var att=wg(),ltt=ox(),ctt=ax(),SM=class extends ctt.default{constructor(){super(...arguments),this._walkSync=ltt.walkSync,this._statSync=att.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let o=[];for(let a of e){let n=this._getFullEntryPath(a),u=this._getEntry(n,a,r);u===null||!r.entryFilter(u)||o.push(u)}return o}_getEntry(e,r,o){try{let a=this._getStat(e);return this._makeEntry(a,r)}catch(a){if(o.errorFilter(a))return null;throw a}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};PM.default=SM});var Ose=_(bM=>{"use strict";Object.defineProperty(bM,"__esModule",{value:!0});var utt=Nse(),Att=cx(),xM=class extends Att.default{constructor(){super(...arguments),this._reader=new utt.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return this.api(r,e,o).map(o.transform)}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};bM.default=xM});var Mse=_(oy=>{"use strict";Object.defineProperty(oy,"__esModule",{value:!0});oy.DEFAULT_FILE_SYSTEM_ADAPTER=void 0;var sy=ve("fs"),ftt=ve("os"),ptt=Math.max(ftt.cpus().length,1);oy.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:sy.lstat,lstatSync:sy.lstatSync,stat:sy.stat,statSync:sy.statSync,readdir:sy.readdir,readdirSync:sy.readdirSync};var kM=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,ptt),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0),this.ignore=[].concat(this.ignore)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},oy.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};oy.default=kM});var ux=_((oLt,_se)=>{"use strict";var Use=_ie(),htt=Tse(),gtt=Lse(),dtt=Ose(),QM=Mse(),Vl=Df();async function FM(t,e){Kc(t);let r=RM(t,htt.default,e),o=await Promise.all(r);return Vl.array.flatten(o)}(function(t){t.glob=t,t.globSync=e,t.globStream=r,t.async=t;function e(h,E){Kc(h);let w=RM(h,dtt.default,E);return Vl.array.flatten(w)}t.sync=e;function r(h,E){Kc(h);let w=RM(h,gtt.default,E);return Vl.stream.merge(w)}t.stream=r;function o(h,E){Kc(h);let w=[].concat(h),D=new QM.default(E);return Use.generate(w,D)}t.generateTasks=o;function a(h,E){Kc(h);let w=new QM.default(E);return Vl.pattern.isDynamicPattern(h,w)}t.isDynamicPattern=a;function n(h){return Kc(h),Vl.path.escape(h)}t.escapePath=n;function u(h){return Kc(h),Vl.path.convertPathToPattern(h)}t.convertPathToPattern=u;let A;(function(h){function E(D){return Kc(D),Vl.path.escapePosixPath(D)}h.escapePath=E;function w(D){return Kc(D),Vl.path.convertPosixPathToPattern(D)}h.convertPathToPattern=w})(A=t.posix||(t.posix={}));let p;(function(h){function E(D){return Kc(D),Vl.path.escapeWindowsPath(D)}h.escapePath=E;function w(D){return Kc(D),Vl.path.convertWindowsPathToPattern(D)}h.convertPathToPattern=w})(p=t.win32||(t.win32={}))})(FM||(FM={}));function RM(t,e,r){let o=[].concat(t),a=new QM.default(r),n=Use.generate(o,a),u=new e(a);return n.map(u.read,u)}function Kc(t){if(![].concat(t).every(o=>Vl.string.isString(o)&&!Vl.string.isEmpty(o)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}_se.exports=FM});var bn={};Vt(bn,{checksumFile:()=>fx,checksumPattern:()=>px,makeHash:()=>Ji});function Ji(...t){let e=(0,Ax.createHash)("sha512"),r="";for(let o of t)typeof o=="string"?r+=o:o&&(r&&(e.update(r),r=""),e.update(o));return r&&e.update(r),e.digest("hex")}async function fx(t,{baseFs:e,algorithm:r}={baseFs:ae,algorithm:"sha512"}){let o=await e.openPromise(t,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,Ax.createHash)(r),A=0;for(;(A=await e.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await e.closePromise(o)}}async function px(t,{cwd:e}){let o=(await(0,TM.default)(t,{cwd:Ae.fromPortablePath(e),onlyDirectories:!0})).map(A=>`${A}/**/*`),a=await(0,TM.default)([t,...o],{cwd:Ae.fromPortablePath(e),onlyFiles:!1});a.sort();let n=await Promise.all(a.map(async A=>{let p=[Buffer.from(A)],h=V.join(e,Ae.toPortablePath(A)),E=await ae.lstatPromise(h);return E.isSymbolicLink()?p.push(Buffer.from(await ae.readlinkPromise(h))):E.isFile()&&p.push(await ae.readFilePromise(h)),p.join("\0")})),u=(0,Ax.createHash)("sha512");for(let A of n)u.update(A);return u.digest("hex")}var Ax,TM,ah=It(()=>{St();Ax=ve("crypto"),TM=et(ux())});var G={};Vt(G,{allPeerRequests:()=>P1,areDescriptorsEqual:()=>Wse,areIdentsEqual:()=>w1,areLocatorsEqual:()=>B1,areVirtualPackagesEquivalent:()=>Dtt,bindDescriptor:()=>Btt,bindLocator:()=>vtt,convertDescriptorToLocator:()=>hx,convertLocatorToDescriptor:()=>NM,convertPackageToLocator:()=>Ctt,convertToIdent:()=>Ett,convertToManifestRange:()=>Ltt,copyPackage:()=>E1,devirtualizeDescriptor:()=>C1,devirtualizeLocator:()=>I1,ensureDevirtualizedDescriptor:()=>Itt,ensureDevirtualizedLocator:()=>wtt,getIdentVendorPath:()=>_M,isPackageCompatible:()=>Ex,isVirtualDescriptor:()=>Sf,isVirtualLocator:()=>Jc,makeDescriptor:()=>kn,makeIdent:()=>rA,makeLocator:()=>Ps,makeRange:()=>mx,parseDescriptor:()=>lh,parseFileStyleRange:()=>Rtt,parseIdent:()=>Zo,parseLocator:()=>Pf,parseRange:()=>vg,prettyDependent:()=>fO,prettyDescriptor:()=>Jn,prettyIdent:()=>Ui,prettyLocator:()=>jr,prettyLocatorNoColors:()=>AO,prettyRange:()=>cy,prettyReference:()=>D1,prettyResolution:()=>d1,prettyWorkspace:()=>S1,renamePackage:()=>OM,slugifyIdent:()=>LM,slugifyLocator:()=>ly,sortDescriptors:()=>uy,stringifyDescriptor:()=>ka,stringifyIdent:()=>rn,stringifyLocator:()=>Qa,tryParseDescriptor:()=>v1,tryParseIdent:()=>Yse,tryParseLocator:()=>dx,tryParseRange:()=>Ftt,virtualizeDescriptor:()=>MM,virtualizePackage:()=>UM});function rA(t,e){if(t?.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:Ji(t,e),scope:t,name:e}}function kn(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:Ji(t.identHash,e),range:e}}function Ps(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:Ji(t.identHash,e),reference:e}}function Ett(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function hx(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function NM(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function Ctt(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function OM(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function E1(t){return OM(t,t)}function MM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return kn(t,`virtual:${e}#${t.range}`)}function UM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return OM(t,Ps(t,`virtual:${e}#${t.reference}`))}function Sf(t){return t.range.startsWith(y1)}function Jc(t){return t.reference.startsWith(y1)}function C1(t){if(!Sf(t))throw new Error("Not a virtual descriptor");return kn(t,t.range.replace(gx,""))}function I1(t){if(!Jc(t))throw new Error("Not a virtual descriptor");return Ps(t,t.reference.replace(gx,""))}function Itt(t){return Sf(t)?kn(t,t.range.replace(gx,"")):t}function wtt(t){return Jc(t)?Ps(t,t.reference.replace(gx,"")):t}function Btt(t,e){return t.range.includes("::")?t:kn(t,`${t.range}::${ay.default.stringify(e)}`)}function vtt(t,e){return t.reference.includes("::")?t:Ps(t,`${t.reference}::${ay.default.stringify(e)}`)}function w1(t,e){return t.identHash===e.identHash}function Wse(t,e){return t.descriptorHash===e.descriptorHash}function B1(t,e){return t.locatorHash===e.locatorHash}function Dtt(t,e){if(!Jc(t))throw new Error("Invalid package type");if(!Jc(e))throw new Error("Invalid package type");if(!w1(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let o=e.dependencies.get(r.identHash);if(!o||!Wse(r,o))return!1}return!0}function Zo(t){let e=Yse(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function Yse(t){let e=t.match(Stt);if(!e)return null;let[,r,o]=e;return rA(typeof r<"u"?r:null,o)}function lh(t,e=!1){let r=v1(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function v1(t,e=!1){let r=e?t.match(Ptt):t.match(xtt);if(!r)return null;let[,o,a,n]=r;if(n==="unknown")throw new Error(`Invalid range (${t})`);let u=typeof o<"u"?o:null,A=typeof n<"u"?n:"unknown";return kn(rA(u,a),A)}function Pf(t,e=!1){let r=dx(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function dx(t,e=!1){let r=e?t.match(btt):t.match(ktt);if(!r)return null;let[,o,a,n]=r;if(n==="unknown")throw new Error(`Invalid reference (${t})`);let u=typeof o<"u"?o:null,A=typeof n<"u"?n:"unknown";return Ps(rA(u,a),A)}function vg(t,e){let r=t.match(Qtt);if(r===null)throw new Error(`Invalid range (${t})`);let o=typeof r[1]<"u"?r[1]:null;if(typeof e?.requireProtocol=="string"&&o!==e.requireProtocol)throw new Error(`Invalid protocol (${o})`);if(e?.requireProtocol&&o===null)throw new Error(`Missing protocol (${o})`);let a=typeof r[3]<"u"?decodeURIComponent(r[2]):null;if(e?.requireSource&&a===null)throw new Error(`Missing source (${t})`);let n=typeof r[3]<"u"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),u=e?.parseSelector?ay.default.parse(n):n,A=typeof r[4]<"u"?ay.default.parse(r[4]):null;return{protocol:o,source:a,selector:u,params:A}}function Ftt(t,e){try{return vg(t,e)}catch{return null}}function Rtt(t,{protocol:e}){let{selector:r,params:o}=vg(t,{requireProtocol:e,requireBindings:!0});if(typeof o.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:Pf(o.locator,!0),path:r}}function Hse(t){return t=t.replaceAll("%","%25"),t=t.replaceAll(":","%3A"),t=t.replaceAll("#","%23"),t}function Ttt(t){return t===null?!1:Object.entries(t).length>0}function mx({protocol:t,source:e,selector:r,params:o}){let a="";return t!==null&&(a+=`${t}`),e!==null&&(a+=`${Hse(e)}#`),a+=Hse(r),Ttt(o)&&(a+=`::${ay.default.stringify(o)}`),a}function Ltt(t){let{params:e,protocol:r,source:o,selector:a}=vg(t);for(let n in e)n.startsWith("__")&&delete e[n];return mx({protocol:r,source:o,params:e,selector:a})}function rn(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function ka(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function Qa(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function LM(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function ly(t){let{protocol:e,selector:r}=vg(t.reference),o=e!==null?e.replace(Ntt,""):"exotic",a=qse.default.valid(r),n=a!==null?`${o}-${a}`:`${o}`,u=10;return t.scope?`${LM(t)}-${n}-${t.locatorHash.slice(0,u)}`:`${LM(t)}-${n}-${t.locatorHash.slice(0,u)}`}function Ui(t,e){return e.scope?`${Ut(t,`@${e.scope}/`,Ct.SCOPE)}${Ut(t,e.name,Ct.NAME)}`:`${Ut(t,e.name,Ct.NAME)}`}function yx(t){if(t.startsWith(y1)){let e=yx(t.substring(t.indexOf("#")+1)),r=t.substring(y1.length,y1.length+mtt);return`${e} [${r}]`}else return t.replace(Ott,"?[...]")}function cy(t,e){return`${Ut(t,yx(e),Ct.RANGE)}`}function Jn(t,e){return`${Ui(t,e)}${Ut(t,"@",Ct.RANGE)}${cy(t,e.range)}`}function D1(t,e){return`${Ut(t,yx(e),Ct.REFERENCE)}`}function jr(t,e){return`${Ui(t,e)}${Ut(t,"@",Ct.REFERENCE)}${D1(t,e.reference)}`}function AO(t){return`${rn(t)}@${yx(t.reference)}`}function uy(t){return Ss(t,[e=>rn(e),e=>e.range])}function S1(t,e){return Ui(t,e.anchoredLocator)}function d1(t,e,r){let o=Sf(e)?C1(e):e;return r===null?`${Jn(t,o)} \u2192 ${uO(t).Cross}`:o.identHash===r.identHash?`${Jn(t,o)} \u2192 ${D1(t,r.reference)}`:`${Jn(t,o)} \u2192 ${jr(t,r)}`}function fO(t,e,r){return r===null?`${jr(t,e)}`:`${jr(t,e)} (via ${cy(t,r.range)})`}function _M(t){return`node_modules/${rn(t)}`}function Ex(t,e){return t.conditions?ytt(t.conditions,r=>{let[,o,a]=r.match(Gse),n=e[o];return n?n.includes(a):!0}):!0}function P1(t){let e=new Set;if("children"in t)e.add(t);else for(let r of t.requests.values())e.add(r);for(let r of e)for(let o of r.children.values())e.add(o);return e}var ay,qse,jse,y1,mtt,Gse,ytt,gx,Stt,Ptt,xtt,btt,ktt,Qtt,Ntt,Ott,Io=It(()=>{ay=et(ve("querystring")),qse=et(ni()),jse=et(MX());Wl();ah();Gl();Io();y1="virtual:",mtt=5,Gse=/(os|cpu|libc)=([a-z0-9_-]+)/,ytt=(0,jse.makeParser)(Gse);gx=/^[^#]*#/;Stt=/^(?:@([^/]+?)\/)?([^@/]+)$/;Ptt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,xtt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;btt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,ktt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;Qtt=/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/;Ntt=/:$/;Ott=/\?.*/});var Vse,Kse=It(()=>{Io();Vse={hooks:{reduceDependency:(t,e,r,o,{resolver:a,resolveOptions:n})=>{for(let{pattern:u,reference:A}of e.topLevelWorkspace.manifest.resolutions){if(u.from&&(u.from.fullName!==rn(r)||e.configuration.normalizeLocator(Ps(Zo(u.from.fullName),u.from.description??r.reference)).locatorHash!==r.locatorHash)||u.descriptor.fullName!==rn(t)||e.configuration.normalizeDependency(kn(Pf(u.descriptor.fullName),u.descriptor.description??t.range)).descriptorHash!==t.descriptorHash)continue;return a.bindDescriptor(e.configuration.normalizeDependency(kn(t,A)),e.topLevelWorkspace.anchoredLocator,n)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let o=S1(t.configuration,r);await t.configuration.triggerHook(a=>a.validateWorkspace,r,{reportWarning:(a,n)=>e.reportWarning(a,`${o}: ${n}`),reportError:(a,n)=>e.reportError(a,`${o}: ${n}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let o of r.errors)e.reportWarning(57,o.message)}}}});var ci,Dg=It(()=>{ci=class t{static{this.protocol="workspace:"}supportsDescriptor(e,r){return!!(e.range.startsWith(t.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(t.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[o.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.getWorkspaceByCwd(e.reference.slice(t.protocol.length));return{...e,version:o.manifest.version||"0.0.0",languageName:"unknown",linkType:"SOFT",conditions:null,dependencies:r.project.configuration.normalizeDependencyMap(new Map([...o.manifest.dependencies,...o.manifest.devDependencies])),peerDependencies:new Map([...o.manifest.peerDependencies]),dependenciesMeta:o.manifest.dependenciesMeta,peerDependenciesMeta:o.manifest.peerDependenciesMeta,bin:o.manifest.bin}}}});var Ur={};Vt(Ur,{SemVer:()=>$se.SemVer,clean:()=>Utt,getComparator:()=>Xse,mergeComparators:()=>HM,satisfiesWithPrereleases:()=>nA,simplifyRanges:()=>qM,stringifyComparator:()=>Zse,validRange:()=>Fa});function nA(t,e,r=!1){if(!t)return!1;let o=`${e}${r}`,a=Jse.get(o);if(typeof a>"u")try{a=new xf.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{Jse.set(o,a||null)}else if(a===null)return!1;let n;try{n=new xf.default.SemVer(t,a)}catch{return!1}return a.test(n)?!0:(n.prerelease&&(n.prerelease=[]),a.set.some(u=>{for(let A of u)A.semver.prerelease&&(A.semver.prerelease=[]);return u.every(A=>A.test(n))}))}function Fa(t){if(t.indexOf(":")!==-1)return null;let e=zse.get(t);if(typeof e<"u")return e;try{e=new xf.default.Range(t)}catch{e=null}return zse.set(t,e),e}function Utt(t){let e=Mtt.exec(t);return e?e[1]:null}function Xse(t){if(t.semver===xf.default.Comparator.ANY)return{gt:null,lt:null};switch(t.operator){case"":return{gt:[">=",t.semver],lt:["<=",t.semver]};case">":case">=":return{gt:[t.operator,t.semver],lt:null};case"<":case"<=":return{gt:null,lt:[t.operator,t.semver]};default:throw new Error(`Assertion failed: Unexpected comparator operator (${t.operator})`)}}function HM(t){if(t.length===0)return null;let e=null,r=null;for(let o of t){if(o.gt){let a=e!==null?xf.default.compare(o.gt[1],e[1]):null;(a===null||a>0||a===0&&o.gt[0]===">")&&(e=o.gt)}if(o.lt){let a=r!==null?xf.default.compare(o.lt[1],r[1]):null;(a===null||a<0||a===0&&o.lt[0]==="<")&&(r=o.lt)}}if(e&&r){let o=xf.default.compare(e[1],r[1]);if(o===0&&(e[0]===">"||r[0]==="<")||o>0)return null}return{gt:e,lt:r}}function Zse(t){if(t.gt&&t.lt){if(t.gt[0]===">="&&t.lt[0]==="<="&&t.gt[1].version===t.lt[1].version)return t.gt[1].version;if(t.gt[0]===">="&&t.lt[0]==="<"){if(t.lt[1].version===`${t.gt[1].major+1}.0.0-0`)return`^${t.gt[1].version}`;if(t.lt[1].version===`${t.gt[1].major}.${t.gt[1].minor+1}.0-0`)return`~${t.gt[1].version}`}}let e=[];return t.gt&&e.push(t.gt[0]+t.gt[1].version),t.lt&&e.push(t.lt[0]+t.lt[1].version),e.length?e.join(" "):"*"}function qM(t){let e=t.map(_tt).map(o=>Fa(o).set.map(a=>a.map(n=>Xse(n)))),r=e.shift().map(o=>HM(o)).filter(o=>o!==null);for(let o of e){let a=[];for(let n of r)for(let u of o){let A=HM([n,...u]);A!==null&&a.push(A)}r=a}return r.length===0?null:r.map(o=>Zse(o)).join(" || ")}function _tt(t){let e=t.split("||");if(e.length>1){let r=new Set;for(let o of e)e.some(a=>a!==o&&xf.default.subset(o,a))||r.add(o);if(r.size{xf=et(ni()),$se=et(ni()),Jse=new Map;zse=new Map;Mtt=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/});function eoe(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function toe(t){return t.charCodeAt(0)===65279?t.slice(1):t}function $o(t){return t.replace(/\\/g,"/")}function Cx(t,{yamlCompatibilityMode:e}){return e?nO(t):typeof t>"u"||typeof t=="boolean"?t:null}function roe(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let o=r%2===0?"":"!",a=e.slice(r);return`${o}${t}=${a}`}function jM(t,e){return e.length===1?roe(t,e[0]):`(${e.map(r=>roe(t,r)).join(" | ")})`}var noe,_t,Ay=It(()=>{St();Ol();noe=et(ni());Dg();Gl();bf();Io();_t=class t{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static{this.fileName="package.json"}static{this.allDependencies=["dependencies","devDependencies","peerDependencies"]}static{this.hardDependencies=["dependencies","devDependencies"]}static async tryFind(e,{baseFs:r=new _n}={}){let o=V.join(e,"package.json");try{return await t.fromFile(o,{baseFs:r})}catch(a){if(a.code==="ENOENT")return null;throw a}}static async find(e,{baseFs:r}={}){let o=await t.tryFind(e,{baseFs:r});if(o===null)throw new Error("Manifest not found");return o}static async fromFile(e,{baseFs:r=new _n}={}){let o=new t;return await o.loadFile(e,{baseFs:r}),o}static fromText(e){let r=new t;return r.loadFromText(e),r}loadFromText(e){let r;try{r=JSON.parse(toe(e)||"{}")}catch(o){throw o.message+=` (when parsing ${e})`,o}this.load(r),this.indent=eoe(e)}async loadFile(e,{baseFs:r=new _n}){let o=await r.readFilePromise(e,"utf8"),a;try{a=JSON.parse(toe(o)||"{}")}catch(n){throw n.message+=` (when parsing ${e})`,n}this.load(a),this.indent=eoe(o)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let o=[];if(this.name=null,typeof e.name=="string")try{this.name=Zo(e.name)}catch{o.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let n=[];this.os=n;for(let u of e.os)typeof u!="string"?o.push(new Error("Parsing failed for the 'os' field")):n.push(u)}else this.os=null;if(Array.isArray(e.cpu)){let n=[];this.cpu=n;for(let u of e.cpu)typeof u!="string"?o.push(new Error("Parsing failed for the 'cpu' field")):n.push(u)}else this.cpu=null;if(Array.isArray(e.libc)){let n=[];this.libc=n;for(let u of e.libc)typeof u!="string"?o.push(new Error("Parsing failed for the 'libc' field")):n.push(u)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=$o(e.main):this.main=null,typeof e.module=="string"?this.module=$o(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=$o(e.browser);else{this.browser=new Map;for(let[n,u]of Object.entries(e.browser))this.browser.set($o(n),typeof u=="string"?$o(u):u)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")e.bin.trim()===""?o.push(new Error("Invalid bin field")):this.name!==null?this.bin.set(this.name.name,$o(e.bin)):o.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[n,u]of Object.entries(e.bin)){if(typeof u!="string"||u.trim()===""){o.push(new Error(`Invalid bin definition for '${n}'`));continue}let A=Zo(n);this.bin.set(A.name,$o(u))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[n,u]of Object.entries(e.scripts)){if(typeof u!="string"){o.push(new Error(`Invalid script definition for '${n}'`));continue}this.scripts.set(n,u)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[n,u]of Object.entries(e.dependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Zo(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=kn(A,u);this.dependencies.set(p.identHash,p)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[n,u]of Object.entries(e.devDependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Zo(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=kn(A,u);this.devDependencies.set(p.identHash,p)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[n,u]of Object.entries(e.peerDependencies)){let A;try{A=Zo(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}(typeof u!="string"||!u.startsWith(ci.protocol)&&!Fa(u))&&(o.push(new Error(`Invalid dependency range for '${n}'`)),u="*");let p=kn(A,u);this.peerDependencies.set(p.identHash,p)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&o.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let a=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let n of a){if(typeof n!="string"){o.push(new Error(`Invalid workspace definition for '${n}'`));continue}this.workspaceDefinitions.push({pattern:n})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[n,u]of Object.entries(e.dependenciesMeta)){if(typeof u!="object"||u===null){o.push(new Error(`Invalid meta field for '${n}`));continue}let A=lh(n),p=this.ensureDependencyMeta(A),h=Cx(u.built,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid built meta field for '${n}'`));continue}let E=Cx(u.optional,{yamlCompatibilityMode:r});if(E===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}let w=Cx(u.unplugged,{yamlCompatibilityMode:r});if(w===null){o.push(new Error(`Invalid unplugged meta field for '${n}'`));continue}Object.assign(p,{built:h,optional:E,unplugged:w})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[n,u]of Object.entries(e.peerDependenciesMeta)){if(typeof u!="object"||u===null){o.push(new Error(`Invalid meta field for '${n}'`));continue}let A=lh(n),p=this.ensurePeerDependencyMeta(A),h=Cx(u.optional,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}Object.assign(p,{optional:h})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[n,u]of Object.entries(e.resolutions)){if(typeof u!="string"){o.push(new Error(`Invalid resolution entry for '${n}'`));continue}try{this.resolutions.push({pattern:pS(n),reference:u})}catch(A){o.push(A);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let n of e.files){if(typeof n!="string"){o.push(new Error(`Invalid files entry for '${n}'`));continue}this.files.add(n)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=$o(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=$o(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=$o(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[n,u]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set($o(n),typeof u=="string"?$o(u):u)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,$o(e.publishConfig.bin)]]):o.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[n,u]of Object.entries(e.publishConfig.bin)){if(typeof u!="string"){o.push(new Error(`Invalid bin definition for '${n}'`));continue}this.publishConfig.bin.set(n,$o(u))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let n of e.publishConfig.executableFiles){if(typeof n!="string"){o.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add($o(n))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let n of Object.keys(e.installConfig))n==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:o.push(new Error("Invalid hoisting limits definition")):n=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:o.push(new Error("Invalid selfReferences definition, must be a boolean value")):o.push(new Error(`Unrecognized installConfig key: ${n}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[n,u]of Object.entries(e.optionalDependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Zo(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=kn(A,u);this.dependencies.set(p.identHash,p);let h=kn(A,"unknown"),E=this.ensureDependencyMeta(h);Object.assign(E,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=o}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(jM("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(jM("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(jM("libc",this.libc)),e.length>0?e.join(" & "):null}ensureDependencyMeta(e){if(e.range!=="unknown"&&!noe.default.valid(e.range))throw new Error(`Invalid meta field range for '${ka(e)}'`);let r=rn(e),o=e.range!=="unknown"?e.range:null,a=this.dependenciesMeta.get(r);a||this.dependenciesMeta.set(r,a=new Map);let n=a.get(o);return n||a.set(o,n={}),n}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${ka(e)}'`);let r=rn(e),o=this.peerDependenciesMeta.get(r);return o||this.peerDependenciesMeta.set(r,o={}),o}setRawField(e,r,{after:o=[]}={}){let a=new Set(o.filter(n=>Object.hasOwn(this.raw,n)));if(a.size===0||Object.hasOwn(this.raw,e))this.raw[e]=r;else{let n=this.raw,u=this.raw={},A=!1;for(let p of Object.keys(n))u[p]=n[p],A||(a.delete(p),a.size===0&&(u[e]=r,A=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),this.name!==null?e.name=rn(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let n=this.browser;typeof n=="string"?e.browser=n:n instanceof Map&&(e.browser=Object.assign({},...Array.from(n.keys()).sort().map(u=>({[u]:n.get(u)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(n=>({[n]:this.bin.get(n)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:n})=>n)}:e.workspaces=this.workspaceDefinitions.map(({pattern:n})=>n):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let o=[],a=[];for(let n of this.dependencies.values()){let u=this.dependenciesMeta.get(rn(n)),A=!1;if(r&&u){let p=u.get(null);p&&p.optional&&(A=!0)}A?a.push(n):o.push(n)}o.length>0?e.dependencies=Object.assign({},...uy(o).map(n=>({[rn(n)]:n.range}))):delete e.dependencies,a.length>0?e.optionalDependencies=Object.assign({},...uy(a).map(n=>({[rn(n)]:n.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...uy(this.devDependencies.values()).map(n=>({[rn(n)]:n.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...uy(this.peerDependencies.values()).map(n=>({[rn(n)]:n.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[n,u]of Ss(this.dependenciesMeta.entries(),([A,p])=>A))for(let[A,p]of Ss(u.entries(),([h,E])=>h!==null?`0${h}`:"1")){let h=A!==null?ka(kn(Zo(n),A)):n,E={...p};r&&A===null&&delete E.optional,Object.keys(E).length!==0&&(e.dependenciesMeta[h]=E)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...Ss(this.peerDependenciesMeta.entries(),([n,u])=>n).map(([n,u])=>({[n]:u}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:n,reference:u})=>({[hS(n)]:u}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){e.scripts??={};for(let n of Object.keys(e.scripts))this.scripts.has(n)||delete e.scripts[n];for(let[n,u]of this.scripts.entries())e.scripts[n]=u}else delete e.scripts;return e}}});var soe=_((ILt,ioe)=>{var Htt=ql(),qtt=function(){return Htt.Date.now()};ioe.exports=qtt});var aoe=_((wLt,ooe)=>{var jtt=/\s/;function Gtt(t){for(var e=t.length;e--&&jtt.test(t.charAt(e)););return e}ooe.exports=Gtt});var coe=_((BLt,loe)=>{var Wtt=aoe(),Ytt=/^\s+/;function Vtt(t){return t&&t.slice(0,Wtt(t)+1).replace(Ytt,"")}loe.exports=Vtt});var fy=_((vLt,uoe)=>{var Ktt=mg(),Jtt=Zu(),ztt="[object Symbol]";function Xtt(t){return typeof t=="symbol"||Jtt(t)&&Ktt(t)==ztt}uoe.exports=Xtt});var hoe=_((DLt,poe)=>{var Ztt=coe(),Aoe=cl(),$tt=fy(),foe=NaN,ert=/^[-+]0x[0-9a-f]+$/i,trt=/^0b[01]+$/i,rrt=/^0o[0-7]+$/i,nrt=parseInt;function irt(t){if(typeof t=="number")return t;if($tt(t))return foe;if(Aoe(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Aoe(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=Ztt(t);var r=trt.test(t);return r||rrt.test(t)?nrt(t.slice(2),r?2:8):ert.test(t)?foe:+t}poe.exports=irt});var moe=_((SLt,doe)=>{var srt=cl(),GM=soe(),goe=hoe(),ort="Expected a function",art=Math.max,lrt=Math.min;function crt(t,e,r){var o,a,n,u,A,p,h=0,E=!1,w=!1,D=!0;if(typeof t!="function")throw new TypeError(ort);e=goe(e)||0,srt(r)&&(E=!!r.leading,w="maxWait"in r,n=w?art(goe(r.maxWait)||0,e):n,D="trailing"in r?!!r.trailing:D);function b(ue){var Ie=o,he=a;return o=a=void 0,h=ue,u=t.apply(he,Ie),u}function C(ue){return h=ue,A=setTimeout(U,e),E?b(ue):u}function T(ue){var Ie=ue-p,he=ue-h,De=e-Ie;return w?lrt(De,n-he):De}function N(ue){var Ie=ue-p,he=ue-h;return p===void 0||Ie>=e||Ie<0||w&&he>=n}function U(){var ue=GM();if(N(ue))return J(ue);A=setTimeout(U,T(ue))}function J(ue){return A=void 0,D&&o?b(ue):(o=a=void 0,u)}function te(){A!==void 0&&clearTimeout(A),h=0,o=p=a=A=void 0}function le(){return A===void 0?u:J(GM())}function ce(){var ue=GM(),Ie=N(ue);if(o=arguments,a=this,p=ue,Ie){if(A===void 0)return C(p);if(w)return clearTimeout(A),A=setTimeout(U,e),b(p)}return A===void 0&&(A=setTimeout(U,e)),u}return ce.cancel=te,ce.flush=le,ce}doe.exports=crt});var WM=_((PLt,yoe)=>{var urt=moe(),Art=cl(),frt="Expected a function";function prt(t,e,r){var o=!0,a=!0;if(typeof t!="function")throw new TypeError(frt);return Art(r)&&(o="leading"in r?!!r.leading:o,a="trailing"in r?!!r.trailing:a),urt(t,e,{leading:o,maxWait:e,trailing:a})}yoe.exports=prt});function grt(t){return typeof t.reportCode<"u"}var Eoe,Coe,Ioe,hrt,Jt,Ws,Kl=It(()=>{Eoe=et(WM()),Coe=ve("stream"),Ioe=ve("string_decoder"),hrt=15,Jt=class extends Error{constructor(r,o,a){super(o);this.reportExtra=a;this.reportCode=r}};Ws=class{constructor(){this.cacheHits=new Set;this.cacheMisses=new Set;this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}getRecommendedLength(){return 180}reportCacheHit(e){this.cacheHits.add(e.locatorHash)}reportCacheMiss(e,r){this.cacheMisses.add(e.locatorHash)}static progressViaCounter(e){let r=0,o,a=new Promise(p=>{o=p}),n=p=>{let h=o;a=new Promise(E=>{o=E}),r=p,h()},u=(p=0)=>{n(r+1)},A=async function*(){for(;r{r=u}),a=(0,Eoe.default)(u=>{let A=r;o=new Promise(p=>{r=p}),e=u,A()},1e3/hrt),n=async function*(){for(;;)await o,yield{title:e}}();return{[Symbol.asyncIterator](){return n},hasProgress:!1,hasTitle:!0,setTitle:a}}async startProgressPromise(e,r){let o=this.reportProgress(e);try{return await r(e)}finally{o.stop()}}startProgressSync(e,r){let o=this.reportProgress(e);try{return r(e)}finally{o.stop()}}reportInfoOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedInfos.has(a)||(this.reportedInfos.add(a),this.reportInfo(e,r),o?.reportExtra?.(this))}reportWarningOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedWarnings.has(a)||(this.reportedWarnings.add(a),this.reportWarning(e,r),o?.reportExtra?.(this))}reportErrorOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedErrors.has(a)||(this.reportedErrors.add(a),this.reportError(e,r),o?.reportExtra?.(this))}reportExceptionOnce(e){grt(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(1,e.stack||e.message,{key:e})}createStreamReporter(e=null){let r=new Coe.PassThrough,o=new Ioe.StringDecoder,a="";return r.on("data",n=>{let u=o.write(n),A;do if(A=u.indexOf(` -`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a="",e!==null?this.reportInfo(null,`${e} ${p}`):this.reportInfo(null,p)}while(A!==-1);a+=u}),r.on("end",()=>{let n=o.end();n!==""&&(e!==null?this.reportInfo(null,`${e} ${n}`):this.reportInfo(null,n))}),r}}});var py,YM=It(()=>{Kl();Io();py=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));return o||null}getFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));if(!o)throw new Jt(11,`${jr(r.project.configuration,e)} isn't supported by any available fetcher`);return o}}});var Sg,VM=It(()=>{Io();Sg=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.getResolverByDescriptor(e,o).bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,o){return await this.getResolverByDescriptor(e,o).getCandidates(e,r,o)}async getSatisfying(e,r,o,a){return this.getResolverByDescriptor(e,a).getSatisfying(e,r,o,a)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));return o||null}getResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));if(!o)throw new Error(`${Jn(r.project.configuration,e)} isn't supported by any available resolver`);return o}tryResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));return o||null}getResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));if(!o)throw new Error(`${jr(r.project.configuration,e)} isn't supported by any available resolver`);return o}}});var hy,KM=It(()=>{St();Io();hy=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(o+1),n=Ps(e,a);return r.fetcher.getLocalPath(n,r)}async fetch(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(o+1),n=Ps(e,a),u=await r.fetcher.fetch(n,r);return await this.ensureVirtualLink(e,u,r)}getLocatorFilename(e){return ly(e)}async ensureVirtualLink(e,r,o){let a=r.packageFs.getRealPath(),n=o.project.configuration.get("virtualFolder"),u=this.getLocatorFilename(e),A=qs.makeVirtualPath(n,u,a),p=new ju(A,{baseFs:r.packageFs,pathUtils:V});return{...r,packageFs:p}}}});var Ix,woe=It(()=>{Ix=class t{static{this.protocol="virtual:"}static isVirtualDescriptor(e){return!!e.range.startsWith(t.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(t.protocol)}supportsDescriptor(e,r){return t.isVirtualDescriptor(e)}supportsLocator(e,r){return t.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,o){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,o,a){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}}});var gy,JM=It(()=>{St();Dg();gy=class{supports(e){return!!e.reference.startsWith(ci.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let o=this.getWorkspace(e,r).cwd;return{packageFs:new En(o),prefixPath:Bt.dot,localPath:o}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(ci.protocol.length))}}});function x1(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Boe(t){return typeof t>"u"?3:x1(t)?0:Array.isArray(t)?1:2}function ZM(t,e){return Object.hasOwn(t,e)}function mrt(t){return x1(t)&&ZM(t,"onConflict")&&typeof t.onConflict=="string"}function yrt(t){if(typeof t>"u")return{onConflict:"default",value:t};if(!mrt(t))return{onConflict:"default",value:t};if(ZM(t,"value"))return t;let{onConflict:e,...r}=t;return{onConflict:e,value:r}}function voe(t,e){let r=x1(t)&&ZM(t,e)?t[e]:void 0;return yrt(r)}function dy(t,e){return[t,e,Doe]}function $M(t){return Array.isArray(t)?t[2]===Doe:!1}function zM(t,e){if(x1(t)){let r={};for(let o of Object.keys(t))r[o]=zM(t[o],e);return dy(e,r)}return Array.isArray(t)?dy(e,t.map(r=>zM(r,e))):dy(e,t)}function XM(t,e,r,o,a){let n,u=[],A=a,p=0;for(let E=a-1;E>=o;--E){let[w,D]=t[E],{onConflict:b,value:C}=voe(D,r),T=Boe(C);if(T!==3){if(n??=T,T!==n||b==="hardReset"){p=A;break}if(T===2)return dy(w,C);if(u.unshift([w,C]),b==="reset"){p=E;break}b==="extend"&&E===o&&(o=0),A=E}}if(typeof n>"u")return null;let h=u.map(([E])=>E).join(", ");switch(n){case 1:return dy(h,new Array().concat(...u.map(([E,w])=>w.map(D=>zM(D,E)))));case 0:{let E=Object.assign({},...u.map(([,T])=>T)),w=Object.keys(E),D={},b=t.map(([T,N])=>[T,voe(N,r).value]),C=drt(b,([T,N])=>{let U=Boe(N);return U!==0&&U!==3});if(C!==-1){let T=b.slice(C+1);for(let N of w)D[N]=XM(T,e,N,0,T.length)}else for(let T of w)D[T]=XM(b,e,T,p,b.length);return dy(h,D)}default:throw new Error("Assertion failed: Non-extendable value type")}}function Soe(t){return XM(t.map(([e,r])=>[e,{".":r}]),[],".",0,t.length)}function b1(t){return $M(t)?t[1]:t}function wx(t){let e=$M(t)?t[1]:t;if(Array.isArray(e))return e.map(r=>wx(r));if(x1(e)){let r={};for(let[o,a]of Object.entries(e))r[o]=wx(a);return r}return e}function e4(t){return $M(t)?t[0]:null}var drt,Doe,Poe=It(()=>{drt=(t,e,r)=>{let o=[...t];return o.reverse(),o.findIndex(e,r)};Doe=Symbol()});var Bx={};Vt(Bx,{getDefaultGlobalFolder:()=>r4,getHomeFolder:()=>my,isFolderInside:()=>n4});function r4(){if(process.platform==="win32"){let t=Ae.toPortablePath(process.env.LOCALAPPDATA||Ae.join((0,t4.homedir)(),"AppData","Local"));return V.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=Ae.toPortablePath(process.env.XDG_DATA_HOME);return V.resolve(t,"yarn/berry")}return V.resolve(my(),".yarn/berry")}function my(){return Ae.toPortablePath((0,t4.homedir)()||"/usr/local/share")}function n4(t,e){let r=V.relative(e,t);return r&&!r.startsWith("..")&&!V.isAbsolute(r)}var t4,vx=It(()=>{St();t4=ve("os")});var Qoe=_(yy=>{"use strict";var _Lt=ve("net"),Crt=ve("tls"),i4=ve("http"),xoe=ve("https"),Irt=ve("events"),HLt=ve("assert"),wrt=ve("util");yy.httpOverHttp=Brt;yy.httpsOverHttp=vrt;yy.httpOverHttps=Drt;yy.httpsOverHttps=Srt;function Brt(t){var e=new kf(t);return e.request=i4.request,e}function vrt(t){var e=new kf(t);return e.request=i4.request,e.createSocket=boe,e.defaultPort=443,e}function Drt(t){var e=new kf(t);return e.request=xoe.request,e}function Srt(t){var e=new kf(t);return e.request=xoe.request,e.createSocket=boe,e.defaultPort=443,e}function kf(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||i4.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(o,a,n,u){for(var A=koe(a,n,u),p=0,h=e.requests.length;p=this.maxSockets){n.requests.push(u);return}n.createSocket(u,function(A){A.on("free",p),A.on("close",h),A.on("agentRemove",h),e.onSocket(A);function p(){n.emit("free",A,u)}function h(E){n.removeSocket(A),A.removeListener("free",p),A.removeListener("close",h),A.removeListener("agentRemove",h)}})};kf.prototype.createSocket=function(e,r){var o=this,a={};o.sockets.push(a);var n=s4({},o.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(n.localAddress=e.localAddress),n.proxyAuth&&(n.headers=n.headers||{},n.headers["Proxy-Authorization"]="Basic "+new Buffer(n.proxyAuth).toString("base64")),ch("making CONNECT request");var u=o.request(n);u.useChunkedEncodingByDefault=!1,u.once("response",A),u.once("upgrade",p),u.once("connect",h),u.once("error",E),u.end();function A(w){w.upgrade=!0}function p(w,D,b){process.nextTick(function(){h(w,D,b)})}function h(w,D,b){if(u.removeAllListeners(),D.removeAllListeners(),w.statusCode!==200){ch("tunneling socket could not be established, statusCode=%d",w.statusCode),D.destroy();var C=new Error("tunneling socket could not be established, statusCode="+w.statusCode);C.code="ECONNRESET",e.request.emit("error",C),o.removeSocket(a);return}if(b.length>0){ch("got illegal response body from proxy"),D.destroy();var C=new Error("got illegal response body from proxy");C.code="ECONNRESET",e.request.emit("error",C),o.removeSocket(a);return}return ch("tunneling connection has established"),o.sockets[o.sockets.indexOf(a)]=D,r(D)}function E(w){u.removeAllListeners(),ch(`tunneling socket could not be established, cause=%s -`,w.message,w.stack);var D=new Error("tunneling socket could not be established, cause="+w.message);D.code="ECONNRESET",e.request.emit("error",D),o.removeSocket(a)}};kf.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var o=this.requests.shift();o&&this.createSocket(o,function(a){o.request.onSocket(a)})}};function boe(t,e){var r=this;kf.prototype.createSocket.call(r,t,function(o){var a=t.request.getHeader("host"),n=s4({},r.options,{socket:o,servername:a?a.replace(/:.*$/,""):t.host}),u=Crt.connect(0,n);r.sockets[r.sockets.indexOf(o)]=u,e(u)})}function koe(t,e,r){return typeof t=="string"?{host:t,port:e,localAddress:r}:t}function s4(t){for(var e=1,r=arguments.length;e{Foe.exports=Qoe()});var Ff=_((Qf,Dx)=>{"use strict";Object.defineProperty(Qf,"__esModule",{value:!0});var Toe=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Prt(t){return Toe.includes(t)}var xrt=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Blob","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...Toe];function brt(t){return xrt.includes(t)}var krt=["null","undefined","string","number","bigint","boolean","symbol"];function Qrt(t){return krt.includes(t)}function Ey(t){return e=>typeof e===t}var{toString:Loe}=Object.prototype,k1=t=>{let e=Loe.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&Pe.domElement(t))return"HTMLElement";if(brt(e))return e},ii=t=>e=>k1(e)===t;function Pe(t){if(t===null)return"null";switch(typeof t){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(Pe.observable(t))return"Observable";if(Pe.array(t))return"Array";if(Pe.buffer(t))return"Buffer";let e=k1(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}Pe.undefined=Ey("undefined");Pe.string=Ey("string");var Frt=Ey("number");Pe.number=t=>Frt(t)&&!Pe.nan(t);Pe.bigint=Ey("bigint");Pe.function_=Ey("function");Pe.null_=t=>t===null;Pe.class_=t=>Pe.function_(t)&&t.toString().startsWith("class ");Pe.boolean=t=>t===!0||t===!1;Pe.symbol=Ey("symbol");Pe.numericString=t=>Pe.string(t)&&!Pe.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));Pe.array=(t,e)=>Array.isArray(t)?Pe.function_(e)?t.every(e):!0:!1;Pe.buffer=t=>{var e,r,o,a;return(a=(o=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||o===void 0?void 0:o.call(r,t))!==null&&a!==void 0?a:!1};Pe.blob=t=>ii("Blob")(t);Pe.nullOrUndefined=t=>Pe.null_(t)||Pe.undefined(t);Pe.object=t=>!Pe.null_(t)&&(typeof t=="object"||Pe.function_(t));Pe.iterable=t=>{var e;return Pe.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};Pe.asyncIterable=t=>{var e;return Pe.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};Pe.generator=t=>{var e,r;return Pe.iterable(t)&&Pe.function_((e=t)===null||e===void 0?void 0:e.next)&&Pe.function_((r=t)===null||r===void 0?void 0:r.throw)};Pe.asyncGenerator=t=>Pe.asyncIterable(t)&&Pe.function_(t.next)&&Pe.function_(t.throw);Pe.nativePromise=t=>ii("Promise")(t);var Rrt=t=>{var e,r;return Pe.function_((e=t)===null||e===void 0?void 0:e.then)&&Pe.function_((r=t)===null||r===void 0?void 0:r.catch)};Pe.promise=t=>Pe.nativePromise(t)||Rrt(t);Pe.generatorFunction=ii("GeneratorFunction");Pe.asyncGeneratorFunction=t=>k1(t)==="AsyncGeneratorFunction";Pe.asyncFunction=t=>k1(t)==="AsyncFunction";Pe.boundFunction=t=>Pe.function_(t)&&!t.hasOwnProperty("prototype");Pe.regExp=ii("RegExp");Pe.date=ii("Date");Pe.error=ii("Error");Pe.map=t=>ii("Map")(t);Pe.set=t=>ii("Set")(t);Pe.weakMap=t=>ii("WeakMap")(t);Pe.weakSet=t=>ii("WeakSet")(t);Pe.int8Array=ii("Int8Array");Pe.uint8Array=ii("Uint8Array");Pe.uint8ClampedArray=ii("Uint8ClampedArray");Pe.int16Array=ii("Int16Array");Pe.uint16Array=ii("Uint16Array");Pe.int32Array=ii("Int32Array");Pe.uint32Array=ii("Uint32Array");Pe.float32Array=ii("Float32Array");Pe.float64Array=ii("Float64Array");Pe.bigInt64Array=ii("BigInt64Array");Pe.bigUint64Array=ii("BigUint64Array");Pe.arrayBuffer=ii("ArrayBuffer");Pe.sharedArrayBuffer=ii("SharedArrayBuffer");Pe.dataView=ii("DataView");Pe.enumCase=(t,e)=>Object.values(e).includes(t);Pe.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;Pe.urlInstance=t=>ii("URL")(t);Pe.urlString=t=>{if(!Pe.string(t))return!1;try{return new URL(t),!0}catch{return!1}};Pe.truthy=t=>!!t;Pe.falsy=t=>!t;Pe.nan=t=>Number.isNaN(t);Pe.primitive=t=>Pe.null_(t)||Qrt(typeof t);Pe.integer=t=>Number.isInteger(t);Pe.safeInteger=t=>Number.isSafeInteger(t);Pe.plainObject=t=>{if(Loe.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};Pe.typedArray=t=>Prt(k1(t));var Trt=t=>Pe.safeInteger(t)&&t>=0;Pe.arrayLike=t=>!Pe.nullOrUndefined(t)&&!Pe.function_(t)&&Trt(t.length);Pe.inRange=(t,e)=>{if(Pe.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(Pe.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Lrt=1,Nrt=["innerHTML","ownerDocument","style","attributes","nodeValue"];Pe.domElement=t=>Pe.object(t)&&t.nodeType===Lrt&&Pe.string(t.nodeName)&&!Pe.plainObject(t)&&Nrt.every(e=>e in t);Pe.observable=t=>{var e,r,o,a;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((a=(o=t)["@@observable"])===null||a===void 0?void 0:a.call(o)):!1};Pe.nodeStream=t=>Pe.object(t)&&Pe.function_(t.pipe)&&!Pe.observable(t);Pe.infinite=t=>t===1/0||t===-1/0;var Noe=t=>e=>Pe.integer(e)&&Math.abs(e%2)===t;Pe.evenInteger=Noe(0);Pe.oddInteger=Noe(1);Pe.emptyArray=t=>Pe.array(t)&&t.length===0;Pe.nonEmptyArray=t=>Pe.array(t)&&t.length>0;Pe.emptyString=t=>Pe.string(t)&&t.length===0;var Ort=t=>Pe.string(t)&&!/\S/.test(t);Pe.emptyStringOrWhitespace=t=>Pe.emptyString(t)||Ort(t);Pe.nonEmptyString=t=>Pe.string(t)&&t.length>0;Pe.nonEmptyStringAndNotWhitespace=t=>Pe.string(t)&&!Pe.emptyStringOrWhitespace(t);Pe.emptyObject=t=>Pe.object(t)&&!Pe.map(t)&&!Pe.set(t)&&Object.keys(t).length===0;Pe.nonEmptyObject=t=>Pe.object(t)&&!Pe.map(t)&&!Pe.set(t)&&Object.keys(t).length>0;Pe.emptySet=t=>Pe.set(t)&&t.size===0;Pe.nonEmptySet=t=>Pe.set(t)&&t.size>0;Pe.emptyMap=t=>Pe.map(t)&&t.size===0;Pe.nonEmptyMap=t=>Pe.map(t)&&t.size>0;Pe.propertyKey=t=>Pe.any([Pe.string,Pe.number,Pe.symbol],t);Pe.formData=t=>ii("FormData")(t);Pe.urlSearchParams=t=>ii("URLSearchParams")(t);var Ooe=(t,e,r)=>{if(!Pe.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};Pe.any=(t,...e)=>(Pe.array(t)?t:[t]).some(o=>Ooe(Array.prototype.some,o,e));Pe.all=(t,...e)=>Ooe(Array.prototype.every,t,e);var Mt=(t,e,r,o={})=>{if(!t){let{multipleValues:a}=o,n=a?`received values of types ${[...new Set(r.map(u=>`\`${Pe(u)}\``))].join(", ")}`:`received value of type \`${Pe(r)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${n}.`)}};Qf.assert={undefined:t=>Mt(Pe.undefined(t),"undefined",t),string:t=>Mt(Pe.string(t),"string",t),number:t=>Mt(Pe.number(t),"number",t),bigint:t=>Mt(Pe.bigint(t),"bigint",t),function_:t=>Mt(Pe.function_(t),"Function",t),null_:t=>Mt(Pe.null_(t),"null",t),class_:t=>Mt(Pe.class_(t),"Class",t),boolean:t=>Mt(Pe.boolean(t),"boolean",t),symbol:t=>Mt(Pe.symbol(t),"symbol",t),numericString:t=>Mt(Pe.numericString(t),"string with a number",t),array:(t,e)=>{Mt(Pe.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>Mt(Pe.buffer(t),"Buffer",t),blob:t=>Mt(Pe.blob(t),"Blob",t),nullOrUndefined:t=>Mt(Pe.nullOrUndefined(t),"null or undefined",t),object:t=>Mt(Pe.object(t),"Object",t),iterable:t=>Mt(Pe.iterable(t),"Iterable",t),asyncIterable:t=>Mt(Pe.asyncIterable(t),"AsyncIterable",t),generator:t=>Mt(Pe.generator(t),"Generator",t),asyncGenerator:t=>Mt(Pe.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>Mt(Pe.nativePromise(t),"native Promise",t),promise:t=>Mt(Pe.promise(t),"Promise",t),generatorFunction:t=>Mt(Pe.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>Mt(Pe.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>Mt(Pe.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>Mt(Pe.boundFunction(t),"Function",t),regExp:t=>Mt(Pe.regExp(t),"RegExp",t),date:t=>Mt(Pe.date(t),"Date",t),error:t=>Mt(Pe.error(t),"Error",t),map:t=>Mt(Pe.map(t),"Map",t),set:t=>Mt(Pe.set(t),"Set",t),weakMap:t=>Mt(Pe.weakMap(t),"WeakMap",t),weakSet:t=>Mt(Pe.weakSet(t),"WeakSet",t),int8Array:t=>Mt(Pe.int8Array(t),"Int8Array",t),uint8Array:t=>Mt(Pe.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>Mt(Pe.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>Mt(Pe.int16Array(t),"Int16Array",t),uint16Array:t=>Mt(Pe.uint16Array(t),"Uint16Array",t),int32Array:t=>Mt(Pe.int32Array(t),"Int32Array",t),uint32Array:t=>Mt(Pe.uint32Array(t),"Uint32Array",t),float32Array:t=>Mt(Pe.float32Array(t),"Float32Array",t),float64Array:t=>Mt(Pe.float64Array(t),"Float64Array",t),bigInt64Array:t=>Mt(Pe.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>Mt(Pe.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>Mt(Pe.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>Mt(Pe.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>Mt(Pe.dataView(t),"DataView",t),enumCase:(t,e)=>Mt(Pe.enumCase(t,e),"EnumCase",t),urlInstance:t=>Mt(Pe.urlInstance(t),"URL",t),urlString:t=>Mt(Pe.urlString(t),"string with a URL",t),truthy:t=>Mt(Pe.truthy(t),"truthy",t),falsy:t=>Mt(Pe.falsy(t),"falsy",t),nan:t=>Mt(Pe.nan(t),"NaN",t),primitive:t=>Mt(Pe.primitive(t),"primitive",t),integer:t=>Mt(Pe.integer(t),"integer",t),safeInteger:t=>Mt(Pe.safeInteger(t),"integer",t),plainObject:t=>Mt(Pe.plainObject(t),"plain object",t),typedArray:t=>Mt(Pe.typedArray(t),"TypedArray",t),arrayLike:t=>Mt(Pe.arrayLike(t),"array-like",t),domElement:t=>Mt(Pe.domElement(t),"HTMLElement",t),observable:t=>Mt(Pe.observable(t),"Observable",t),nodeStream:t=>Mt(Pe.nodeStream(t),"Node.js Stream",t),infinite:t=>Mt(Pe.infinite(t),"infinite number",t),emptyArray:t=>Mt(Pe.emptyArray(t),"empty array",t),nonEmptyArray:t=>Mt(Pe.nonEmptyArray(t),"non-empty array",t),emptyString:t=>Mt(Pe.emptyString(t),"empty string",t),emptyStringOrWhitespace:t=>Mt(Pe.emptyStringOrWhitespace(t),"empty string or whitespace",t),nonEmptyString:t=>Mt(Pe.nonEmptyString(t),"non-empty string",t),nonEmptyStringAndNotWhitespace:t=>Mt(Pe.nonEmptyStringAndNotWhitespace(t),"non-empty string and not whitespace",t),emptyObject:t=>Mt(Pe.emptyObject(t),"empty object",t),nonEmptyObject:t=>Mt(Pe.nonEmptyObject(t),"non-empty object",t),emptySet:t=>Mt(Pe.emptySet(t),"empty set",t),nonEmptySet:t=>Mt(Pe.nonEmptySet(t),"non-empty set",t),emptyMap:t=>Mt(Pe.emptyMap(t),"empty map",t),nonEmptyMap:t=>Mt(Pe.nonEmptyMap(t),"non-empty map",t),propertyKey:t=>Mt(Pe.propertyKey(t),"PropertyKey",t),formData:t=>Mt(Pe.formData(t),"FormData",t),urlSearchParams:t=>Mt(Pe.urlSearchParams(t),"URLSearchParams",t),evenInteger:t=>Mt(Pe.evenInteger(t),"even integer",t),oddInteger:t=>Mt(Pe.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>Mt(Pe.directInstanceOf(t,e),"T",t),inRange:(t,e)=>Mt(Pe.inRange(t,e),"in range",t),any:(t,...e)=>Mt(Pe.any(t,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(t,...e)=>Mt(Pe.all(t,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(Pe,{class:{value:Pe.class_},function:{value:Pe.function_},null:{value:Pe.null_}});Object.defineProperties(Qf.assert,{class:{value:Qf.assert.class_},function:{value:Qf.assert.function_},null:{value:Qf.assert.null_}});Qf.default=Pe;Dx.exports=Pe;Dx.exports.default=Pe;Dx.exports.assert=Qf.assert});var Moe=_((GLt,o4)=>{"use strict";var Sx=class extends Error{constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}get isCanceled(){return!0}},Px=class t{static fn(e){return(...r)=>new t((o,a,n)=>{r.push(n),e(...r).then(o,a)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,o)=>{this._reject=o;let a=A=>{this._isPending=!1,r(A)},n=A=>{this._isPending=!1,o(A)},u=A=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(A)};return Object.defineProperties(u,{shouldReject:{get:()=>this._rejectOnCancel,set:A=>{this._rejectOnCancel=A}}}),e(a,n,u)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new Sx(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(Px.prototype,Promise.prototype);o4.exports=Px;o4.exports.CancelError=Sx});var Uoe=_((l4,c4)=>{"use strict";Object.defineProperty(l4,"__esModule",{value:!0});function Mrt(t){return t.encrypted}var a4=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let o=typeof r.connect=="function",a=typeof r.secureConnect=="function",n=typeof r.close=="function",u=()=>{o&&r.connect(),Mrt(t)&&a&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),n&&t.once("close",r.close)};t.writable&&!t.connecting?u():t.connecting?t.once("connect",u):t.destroyed&&n&&r.close(t._hadError)};l4.default=a4;c4.exports=a4;c4.exports.default=a4});var _oe=_((A4,f4)=>{"use strict";Object.defineProperty(A4,"__esModule",{value:!0});var Urt=Uoe(),_rt=Number(process.versions.node.split(".")[0]),u4=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=u=>{let A=u.emit.bind(u);u.emit=(p,...h)=>(p==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,u.emit=A),A(p,...h))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||_rt>=13)&&(e.phases.total=Date.now()-e.start)});let o=u=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let A=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};u.prependOnceListener("lookup",A),Urt.default(u,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(u.removeListener("lookup",A),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?o(t.socket):t.prependOnceListener("socket",o);let a=()=>{var u;e.upload=Date.now(),e.phases.request=e.upload-(u=e.secureConnect,u??e.connect)};return(typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))?a():t.prependOnceListener("finish",a),t.prependOnceListener("response",u=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,u.timings=e,r(u),u.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};A4.default=u4;f4.exports=u4;f4.exports.default=u4});var Voe=_((WLt,g4)=>{"use strict";var{V4MAPPED:Hrt,ADDRCONFIG:qrt,ALL:Yoe,promises:{Resolver:Hoe},lookup:jrt}=ve("dns"),{promisify:p4}=ve("util"),Grt=ve("os"),Cy=Symbol("cacheableLookupCreateConnection"),h4=Symbol("cacheableLookupInstance"),qoe=Symbol("expires"),Wrt=typeof Yoe=="number",joe=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},Yrt=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},Goe=()=>{let t=!1,e=!1;for(let r of Object.values(Grt.networkInterfaces()))for(let o of r)if(!o.internal&&(o.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},Vrt=t=>Symbol.iterator in t,Woe={ttl:!0},Krt={all:!0},xx=class{constructor({cache:e=new Map,maxTtl:r=1/0,fallbackDuration:o=3600,errorTtl:a=.15,resolver:n=new Hoe,lookup:u=jrt}={}){if(this.maxTtl=r,this.errorTtl=a,this._cache=e,this._resolver=n,this._dnsLookup=p4(u),this._resolver instanceof Hoe?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=p4(this._resolver.resolve4.bind(this._resolver)),this._resolve6=p4(this._resolver.resolve6.bind(this._resolver))),this._iface=Goe(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,o<1)this._fallback=!1;else{this._fallback=!0;let A=setInterval(()=>{this._hostnamesToFallback.clear()},o*1e3);A.unref&&A.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,o){if(typeof r=="function"?(o=r,r={}):typeof r=="number"&&(r={family:r}),!o)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(a=>{r.all?o(null,a):o(null,a.address,a.family,a.expires,a.ttl)},o)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let o=await this.query(e);if(r.family===6){let a=o.filter(n=>n.family===6);r.hints&Hrt&&(Wrt&&r.hints&Yoe||a.length===0)?Yrt(o):o=a}else r.family===4&&(o=o.filter(a=>a.family===4));if(r.hints&qrt){let{_iface:a}=this;o=o.filter(n=>n.family===6?a.has6:a.has4)}if(o.length===0){let a=new Error(`cacheableLookup ENOTFOUND ${e}`);throw a.code="ENOTFOUND",a.hostname=e,a}return r.all?o:o[0]}async query(e){let r=await this._cache.get(e);if(!r){let o=this._pending[e];if(o)r=await o;else{let a=this.queryAndCache(e);this._pending[e]=a,r=await a}}return r=r.map(o=>({...o})),r}async _resolve(e){let r=async h=>{try{return await h}catch(E){if(E.code==="ENODATA"||E.code==="ENOTFOUND")return[];throw E}},[o,a]=await Promise.all([this._resolve4(e,Woe),this._resolve6(e,Woe)].map(h=>r(h))),n=0,u=0,A=0,p=Date.now();for(let h of o)h.family=4,h.expires=p+h.ttl*1e3,n=Math.max(n,h.ttl);for(let h of a)h.family=6,h.expires=p+h.ttl*1e3,u=Math.max(u,h.ttl);return o.length>0?a.length>0?A=Math.min(n,u):A=n:A=u,{entries:[...o,...a],cacheTtl:A}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(e,r,o){if(this.maxTtl>0&&o>0){o=Math.min(o,this.maxTtl)*1e3,r[qoe]=Date.now()+o;try{await this._cache.set(e,r,o)}catch(a){this.lookupAsync=async()=>{let n=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw n.cause=a,n}}Vrt(this._cache)&&this._tick(o)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Krt);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let o=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,o),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let o=1/0,a=Date.now();for(let[n,u]of this._cache){let A=u[qoe];a>=A?this._cache.delete(n):A("lookup"in r||(r.lookup=this.lookup),e[Cy](r,o))}uninstall(e){if(joe(e),e[Cy]){if(e[h4]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[Cy],delete e[Cy],delete e[h4]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=Goe(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};g4.exports=xx;g4.exports.default=xx});var zoe=_((YLt,d4)=>{"use strict";var Jrt=typeof URL>"u"?ve("url").URL:URL,zrt="text/plain",Xrt="us-ascii",Koe=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),Zrt=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let o=r[1].split(";"),a=r[2],n=e?"":r[3],u=!1;o[o.length-1]==="base64"&&(o.pop(),u=!0);let A=(o.shift()||"").toLowerCase(),h=[...o.map(E=>{let[w,D=""]=E.split("=").map(b=>b.trim());return w==="charset"&&(D=D.toLowerCase(),D===Xrt)?"":`${w}${D?`=${D}`:""}`}).filter(Boolean)];return u&&h.push("base64"),(h.length!==0||A&&A!==zrt)&&h.unshift(A),`data:${h.join(";")},${u?a.trim():a}${n?`#${n}`:""}`},Joe=(t,e)=>{if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return Zrt(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new Jrt(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash&&(a.hash=""),a.pathname&&(a.pathname=a.pathname.replace(/((?!:).|^)\/{2,}/g,(n,u)=>/^(?!\/)/g.test(u)?`${u}/`:"/")),a.pathname&&(a.pathname=decodeURI(a.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let n=a.pathname.split("/"),u=n[n.length-1];Koe(u,e.removeDirectoryIndex)&&(n=n.slice(0,n.length-1),a.pathname=n.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let n of[...a.searchParams.keys()])Koe(n,e.removeQueryParameters)&&a.searchParams.delete(n);return e.sortQueryParameters&&a.searchParams.sort(),e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,"")),t=a.toString(),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};d4.exports=Joe;d4.exports.default=Joe});var $oe=_((VLt,Zoe)=>{Zoe.exports=Xoe;function Xoe(t,e){if(t&&e)return Xoe(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(o){r[o]=t[o]}),r;function r(){for(var o=new Array(arguments.length),a=0;a{var eae=$oe();m4.exports=eae(bx);m4.exports.strict=eae(tae);bx.proto=bx(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return bx(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return tae(this)},configurable:!0})});function bx(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function tae(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var E4=_((JLt,nae)=>{var $rt=y4(),ent=function(){},tnt=function(t){return t.setHeader&&typeof t.abort=="function"},rnt=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},rae=function(t,e,r){if(typeof e=="function")return rae(t,null,e);e||(e={}),r=$rt(r||ent);var o=t._writableState,a=t._readableState,n=e.readable||e.readable!==!1&&t.readable,u=e.writable||e.writable!==!1&&t.writable,A=function(){t.writable||p()},p=function(){u=!1,n||r.call(t)},h=function(){n=!1,u||r.call(t)},E=function(C){r.call(t,C?new Error("exited with error code: "+C):null)},w=function(C){r.call(t,C)},D=function(){if(n&&!(a&&a.ended))return r.call(t,new Error("premature close"));if(u&&!(o&&o.ended))return r.call(t,new Error("premature close"))},b=function(){t.req.on("finish",p)};return tnt(t)?(t.on("complete",p),t.on("abort",D),t.req?b():t.on("request",b)):u&&!o&&(t.on("end",A),t.on("close",A)),rnt(t)&&t.on("exit",E),t.on("end",h),t.on("finish",p),e.error!==!1&&t.on("error",w),t.on("close",D),function(){t.removeListener("complete",p),t.removeListener("abort",D),t.removeListener("request",b),t.req&&t.req.removeListener("finish",p),t.removeListener("end",A),t.removeListener("close",A),t.removeListener("finish",p),t.removeListener("exit",E),t.removeListener("end",h),t.removeListener("error",w),t.removeListener("close",D)}};nae.exports=rae});var oae=_((zLt,sae)=>{var nnt=y4(),int=E4(),C4=ve("fs"),Q1=function(){},snt=/^v?\.0/.test(process.version),kx=function(t){return typeof t=="function"},ont=function(t){return!snt||!C4?!1:(t instanceof(C4.ReadStream||Q1)||t instanceof(C4.WriteStream||Q1))&&kx(t.close)},ant=function(t){return t.setHeader&&kx(t.abort)},lnt=function(t,e,r,o){o=nnt(o);var a=!1;t.on("close",function(){a=!0}),int(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,ont(t))return t.close(Q1);if(ant(t))return t.abort();if(kx(t.destroy))return t.destroy();o(u||new Error("stream was destroyed"))}}},iae=function(t){t()},cnt=function(t,e){return t.pipe(e)},unt=function(){var t=Array.prototype.slice.call(arguments),e=kx(t[t.length-1]||Q1)&&t.pop()||Q1;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,o=t.map(function(a,n){var u=n0;return lnt(a,u,A,function(p){r||(r=p),p&&o.forEach(iae),!u&&(o.forEach(iae),e(r))})});return t.reduce(cnt)};sae.exports=unt});var lae=_((XLt,aae)=>{"use strict";var{PassThrough:Ant}=ve("stream");aae.exports=t=>{t={...t};let{array:e}=t,{encoding:r}=t,o=r==="buffer",a=!1;e?a=!(r||o):r=r||"utf8",o&&(r=null);let n=new Ant({objectMode:a});r&&n.setEncoding(r);let u=0,A=[];return n.on("data",p=>{A.push(p),a?u=A.length:u+=p.length}),n.getBufferedValue=()=>e?A:o?Buffer.concat(A,u):A.join(""),n.getBufferedLength=()=>u,n}});var cae=_((ZLt,Iy)=>{"use strict";var fnt=oae(),pnt=lae(),Qx=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function Fx(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e={maxBuffer:1/0,...e};let{maxBuffer:r}=e,o;return await new Promise((a,n)=>{let u=A=>{A&&(A.bufferedData=o.getBufferedValue()),n(A)};o=fnt(t,pnt(e),A=>{if(A){u(A);return}a()}),o.on("data",()=>{o.getBufferedLength()>r&&u(new Qx)})}),o.getBufferedValue()}Iy.exports=Fx;Iy.exports.default=Fx;Iy.exports.buffer=(t,e)=>Fx(t,{...e,encoding:"buffer"});Iy.exports.array=(t,e)=>Fx(t,{...e,array:!0});Iy.exports.MaxBufferError=Qx});var Aae=_((eNt,uae)=>{"use strict";var hnt=new Set([200,203,204,206,300,301,308,404,405,410,414,501]),gnt=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),dnt=new Set([500,502,503,504]),mnt={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},ynt={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function Pg(t){let e=parseInt(t,10);return isFinite(e)?e:0}function Ent(t){return t?dnt.has(t.status):!0}function I4(t){let e={};if(!t)return e;let r=t.trim().split(/,/);for(let o of r){let[a,n]=o.split(/=/,2);e[a.trim()]=n===void 0?!0:n.trim().replace(/^"|"$/g,"")}return e}function Cnt(t){let e=[];for(let r in t){let o=t[r];e.push(o===!0?r:r+"="+o)}if(e.length)return e.join(", ")}uae.exports=class{constructor(e,r,{shared:o,cacheHeuristic:a,immutableMinTimeToLive:n,ignoreCargoCult:u,_fromObject:A}={}){if(A){this._fromObject(A);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=o!==!1,this._cacheHeuristic=a!==void 0?a:.1,this._immutableMinTtl=n!==void 0?n:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=I4(r.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=I4(e.headers["cache-control"]),u&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":Cnt(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),r.headers["cache-control"]==null&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&gnt.has(this._status)&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc["max-age"]||this._isShared&&this._rescc["s-maxage"]||this._rescc.public||hnt.has(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=I4(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let o of r)if(e.headers[o]!==this._reqHeaders[o])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let o in e)mnt[o]||(r[o]=e[o]);if(e.connection){let o=e.connection.trim().split(/\s*,\s*/);for(let a of o)delete r[a]}if(r.warning){let o=r.warning.split(/,/).filter(a=>!/^\s*1[0-9][0-9]/.test(a));o.length?r.warning=o.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this._responseTime}age(){let e=this._ageValue(),r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){return Pg(this._resHeaders.age)}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return Pg(this._rescc["s-maxage"])}if(this._rescc["max-age"])return Pg(this._rescc["max-age"]);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this.date();if(this._resHeaders.expires){let o=Date.parse(this._resHeaders.expires);return Number.isNaN(o)||oo)return Math.max(e,(r-o)/1e3*this._cacheHeuristic)}return e}timeToLive(){let e=this.maxAge()-this.age(),r=e+Pg(this._rescc["stale-if-error"]),o=e+Pg(this._rescc["stale-while-revalidate"]);return Math.max(0,e,r,o)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+Pg(this._rescc["stale-if-error"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+Pg(this._rescc["stale-while-revalidate"])>this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let a=r["if-none-match"].split(/,/).filter(n=>!/^\s*W\//.test(n));a.length?r["if-none-match"]=a.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),this._useStaleIfError()&&Ent(r))return{modified:!1,matches:!1,policy:this};if(!r||!r.headers)throw Error("Response headers missing");let o=!1;if(r.status!==void 0&&r.status!=304?o=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?o=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?o=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?o=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(o=!0),!o)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let a={};for(let u in this._resHeaders)a[u]=u in r.headers&&!ynt[u]?r.headers[u]:this._resHeaders[u];let n=Object.assign({},r,{status:this._status,method:this._method,headers:a});return{policy:new this.constructor(e,n,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var Rx=_((tNt,fae)=>{"use strict";fae.exports=t=>{let e={};for(let[r,o]of Object.entries(t))e[r.toLowerCase()]=o;return e}});var hae=_((rNt,pae)=>{"use strict";var Int=ve("stream").Readable,wnt=Rx(),w4=class extends Int{constructor(e,r,o,a){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(o instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof a!="string")throw new TypeError("Argument `url` should be a string");super(),this.statusCode=e,this.headers=wnt(r),this.body=o,this.url=a}_read(){this.push(this.body),this.push(null)}};pae.exports=w4});var dae=_((nNt,gae)=>{"use strict";var Bnt=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];gae.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(Bnt));for(let o of r)o in e||(e[o]=typeof t[o]=="function"?t[o].bind(t):t[o])}});var yae=_((iNt,mae)=>{"use strict";var vnt=ve("stream").PassThrough,Dnt=dae(),Snt=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new vnt;return Dnt(t,e),t.pipe(e)};mae.exports=Snt});var Eae=_(B4=>{B4.stringify=function t(e){if(typeof e>"u")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",o=Array.isArray(e);r=o?"[":"{";var a=!0;for(var n in e){var u=typeof e[n]=="function"||!o&&typeof e[n]>"u";Object.hasOwnProperty.call(e,n)&&!u&&(a||(r+=","),a=!1,o?e[n]==null?r+="null":r+=t(e[n]):e[n]!==void 0&&(r+=t(n)+":"+t(e[n])))}return r+=o?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e>"u"?"null":JSON.stringify(e)};B4.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var Bae=_((oNt,wae)=>{"use strict";var Pnt=ve("events"),Cae=Eae(),xnt=t=>{let e={redis:"@keyv/redis",rediss:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql",etcd:"@keyv/etcd",offline:"@keyv/offline",tiered:"@keyv/tiered"};if(t.adapter||t.uri){let r=t.adapter||/^[^:+]*/.exec(t.uri)[0];return new(ve(e[r]))(t)}return new Map},Iae=["sqlite","postgres","mysql","mongo","redis","tiered"],v4=class extends Pnt{constructor(e,{emitErrors:r=!0,...o}={}){if(super(),this.opts={namespace:"keyv",serialize:Cae.stringify,deserialize:Cae.parse,...typeof e=="string"?{uri:e}:e,...o},!this.opts.store){let n={...this.opts};this.opts.store=xnt(n)}if(this.opts.compression){let n=this.opts.compression;this.opts.serialize=n.serialize.bind(n),this.opts.deserialize=n.deserialize.bind(n)}typeof this.opts.store.on=="function"&&r&&this.opts.store.on("error",n=>this.emit("error",n)),this.opts.store.namespace=this.opts.namespace;let a=n=>async function*(){for await(let[u,A]of typeof n=="function"?n(this.opts.store.namespace):n){let p=await this.opts.deserialize(A);if(!(this.opts.store.namespace&&!u.includes(this.opts.store.namespace))){if(typeof p.expires=="number"&&Date.now()>p.expires){this.delete(u);continue}yield[this._getKeyUnprefix(u),p.value]}}};typeof this.opts.store[Symbol.iterator]=="function"&&this.opts.store instanceof Map?this.iterator=a(this.opts.store):typeof this.opts.store.iterator=="function"&&this.opts.store.opts&&this._checkIterableAdaptar()&&(this.iterator=a(this.opts.store.iterator.bind(this.opts.store)))}_checkIterableAdaptar(){return Iae.includes(this.opts.store.opts.dialect)||Iae.findIndex(e=>this.opts.store.opts.url.includes(e))>=0}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}_getKeyPrefixArray(e){return e.map(r=>`${this.opts.namespace}:${r}`)}_getKeyUnprefix(e){return e.split(":").splice(1).join(":")}get(e,r){let{store:o}=this.opts,a=Array.isArray(e),n=a?this._getKeyPrefixArray(e):this._getKeyPrefix(e);if(a&&o.getMany===void 0){let u=[];for(let A of n)u.push(Promise.resolve().then(()=>o.get(A)).then(p=>typeof p=="string"?this.opts.deserialize(p):this.opts.compression?this.opts.deserialize(p):p).then(p=>{if(p!=null)return typeof p.expires=="number"&&Date.now()>p.expires?this.delete(A).then(()=>{}):r&&r.raw?p:p.value}));return Promise.allSettled(u).then(A=>{let p=[];for(let h of A)p.push(h.value);return p})}return Promise.resolve().then(()=>a?o.getMany(n):o.get(n)).then(u=>typeof u=="string"?this.opts.deserialize(u):this.opts.compression?this.opts.deserialize(u):u).then(u=>{if(u!=null)return a?u.map((A,p)=>{if(typeof A=="string"&&(A=this.opts.deserialize(A)),A!=null){if(typeof A.expires=="number"&&Date.now()>A.expires){this.delete(e[p]).then(()=>{});return}return r&&r.raw?A:A.value}}):typeof u.expires=="number"&&Date.now()>u.expires?this.delete(e).then(()=>{}):r&&r.raw?u:u.value})}set(e,r,o){let a=this._getKeyPrefix(e);typeof o>"u"&&(o=this.opts.ttl),o===0&&(o=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let u=typeof o=="number"?Date.now()+o:null;return typeof r=="symbol"&&this.emit("error","symbol cannot be serialized"),r={value:r,expires:u},this.opts.serialize(r)}).then(u=>n.set(a,u,o)).then(()=>!0)}delete(e){let{store:r}=this.opts;if(Array.isArray(e)){let a=this._getKeyPrefixArray(e);if(r.deleteMany===void 0){let n=[];for(let u of a)n.push(r.delete(u));return Promise.allSettled(n).then(u=>u.every(A=>A.value===!0))}return Promise.resolve().then(()=>r.deleteMany(a))}let o=this._getKeyPrefix(e);return Promise.resolve().then(()=>r.delete(o))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}has(e){let r=this._getKeyPrefix(e),{store:o}=this.opts;return Promise.resolve().then(async()=>typeof o.has=="function"?o.has(r):await o.get(r)!==void 0)}disconnect(){let{store:e}=this.opts;if(typeof e.disconnect=="function")return e.disconnect()}};wae.exports=v4});var Sae=_((lNt,Dae)=>{"use strict";var bnt=ve("events"),Tx=ve("url"),knt=zoe(),Qnt=cae(),D4=Aae(),vae=hae(),Fnt=Rx(),Rnt=yae(),Tnt=Bae(),F1=class t{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new Tnt({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,o)=>{let a;if(typeof r=="string")a=S4(Tx.parse(r)),r={};else if(r instanceof Tx.URL)a=S4(Tx.parse(r.toString())),r={};else{let[w,...D]=(r.path||"").split("?"),b=D.length>0?`?${D.join("?")}`:"";a=S4({...r,pathname:w,search:b})}r={headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1,...r,...Lnt(a)},r.headers=Fnt(r.headers);let n=new bnt,u=knt(Tx.format(a),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),A=`${r.method}:${u}`,p=!1,h=!1,E=w=>{h=!0;let D=!1,b,C=new Promise(N=>{b=()=>{D||(D=!0,N())}}),T=N=>{if(p&&!w.forceRefresh){N.status=N.statusCode;let J=D4.fromObject(p.cachePolicy).revalidatedPolicy(w,N);if(!J.modified){let te=J.policy.responseHeaders();N=new vae(p.statusCode,te,p.body,p.url),N.cachePolicy=J.policy,N.fromCache=!0}}N.fromCache||(N.cachePolicy=new D4(w,N,w),N.fromCache=!1);let U;w.cache&&N.cachePolicy.storable()?(U=Rnt(N),(async()=>{try{let J=Qnt.buffer(N);if(await Promise.race([C,new Promise(ue=>N.once("end",ue))]),D)return;let te=await J,le={cachePolicy:N.cachePolicy.toObject(),url:N.url,statusCode:N.fromCache?p.statusCode:N.statusCode,body:te},ce=w.strictTtl?N.cachePolicy.timeToLive():void 0;w.maxTtl&&(ce=ce?Math.min(ce,w.maxTtl):w.maxTtl),await this.cache.set(A,le,ce)}catch(J){n.emit("error",new t.CacheError(J))}})()):w.cache&&p&&(async()=>{try{await this.cache.delete(A)}catch(J){n.emit("error",new t.CacheError(J))}})(),n.emit("response",U||N),typeof o=="function"&&o(U||N)};try{let N=e(w,T);N.once("error",b),N.once("abort",b),n.emit("request",N)}catch(N){n.emit("error",new t.RequestError(N))}};return(async()=>{let w=async b=>{await Promise.resolve();let C=b.cache?await this.cache.get(A):void 0;if(typeof C>"u")return E(b);let T=D4.fromObject(C.cachePolicy);if(T.satisfiesWithoutRevalidation(b)&&!b.forceRefresh){let N=T.responseHeaders(),U=new vae(C.statusCode,N,C.body,C.url);U.cachePolicy=T,U.fromCache=!0,n.emit("response",U),typeof o=="function"&&o(U)}else p=C,b.headers=T.revalidationHeaders(b),E(b)},D=b=>n.emit("error",new t.CacheError(b));this.cache.once("error",D),n.on("response",()=>this.cache.removeListener("error",D));try{await w(r)}catch(b){r.automaticFailover&&!h&&E(r),n.emit("error",new t.CacheError(b))}})(),n}}};function Lnt(t){let e={...t};return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function S4(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}F1.RequestError=class extends Error{constructor(t){super(t.message),this.name="RequestError",Object.assign(this,t)}};F1.CacheError=class extends Error{constructor(t){super(t.message),this.name="CacheError",Object.assign(this,t)}};Dae.exports=F1});var xae=_((ANt,Pae)=>{"use strict";var Nnt=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];Pae.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(Nnt)),o={};for(let a of r)a in e||(o[a]={get(){let n=t[a];return typeof n=="function"?n.bind(t):n},set(n){t[a]=n},enumerable:!0,configurable:!1});return Object.defineProperties(e,o),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var kae=_((fNt,bae)=>{"use strict";var{Transform:Ont,PassThrough:Mnt}=ve("stream"),P4=ve("zlib"),Unt=xae();bae.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof P4.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let o=!0,a=new Ont({transform(A,p,h){o=!1,h(null,A)},flush(A){A()}}),n=new Mnt({autoDestroy:!1,destroy(A,p){t.destroy(),p(A)}}),u=r?P4.createBrotliDecompress():P4.createUnzip();return u.once("error",A=>{if(o&&!t.readable){n.end();return}n.destroy(A)}),Unt(t,n),t.pipe(a).pipe(u).pipe(n),n}});var b4=_((pNt,Qae)=>{"use strict";var x4=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[o,a]of this.oldCache.entries())this.onEviction(o,a);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};Qae.exports=x4});var Q4=_((hNt,Lae)=>{"use strict";var _nt=ve("events"),Hnt=ve("tls"),qnt=ve("http2"),jnt=b4(),ea=Symbol("currentStreamsCount"),Fae=Symbol("request"),Jl=Symbol("cachedOriginSet"),wy=Symbol("gracefullyClosing"),Gnt=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Wnt=(t,e,r)=>{let o=0,a=t.length;for(;o>>1;r(t[n],e)?o=n+1:a=n}return o},Ynt=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,k4=(t,e)=>{for(let r of t)r[Jl].lengthe[Jl].includes(o))&&r[ea]+e[ea]<=e.remoteSettings.maxConcurrentStreams&&Tae(r)},Vnt=(t,e)=>{for(let r of t)e[Jl].lengthr[Jl].includes(o))&&e[ea]+r[ea]<=r.remoteSettings.maxConcurrentStreams&&Tae(e)},Rae=({agent:t,isFree:e})=>{let r={};for(let o in t.sessions){let n=t.sessions[o].filter(u=>{let A=u[xg.kCurrentStreamsCount]{t[wy]=!0,t[ea]===0&&t.close()},xg=class t extends _nt{constructor({timeout:e=6e4,maxSessions:r=1/0,maxFreeSessions:o=10,maxCachedTlsSessions:a=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=o,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new jnt({maxSize:a})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let o of Gnt)e[o]&&(r+=`:${e[o]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let o=this.queue[e][r];this._sessionsCount{Array.isArray(o)?(o=[...o],a()):o=[{resolve:a,reject:n}];let u=this.normalizeOptions(r),A=t.normalizeOrigin(e,r&&r.servername);if(A===void 0){for(let{reject:E}of o)E(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(u in this.sessions){let E=this.sessions[u],w=-1,D=-1,b;for(let C of E){let T=C.remoteSettings.maxConcurrentStreams;if(T=T||C[wy]||C.destroyed)continue;b||(w=T),N>D&&(b=C,D=N)}}if(b){if(o.length!==1){for(let{reject:C}of o){let T=new Error(`Expected the length of listeners to be 1, got ${o.length}. -Please report this to https://github.com/szmarczak/http2-wrapper/`);C(T)}return}o[0].resolve(b);return}}if(u in this.queue){if(A in this.queue[u]){this.queue[u][A].listeners.push(...o),this._tryToCreateNewSession(u,A);return}}else this.queue[u]={};let p=()=>{u in this.queue&&this.queue[u][A]===h&&(delete this.queue[u][A],Object.keys(this.queue[u]).length===0&&delete this.queue[u])},h=()=>{let E=`${A}:${u}`,w=!1;try{let D=qnt.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(E),...r});D[ea]=0,D[wy]=!1;let b=()=>D[ea]{this.tlsSessionCache.set(E,N)}),D.once("error",N=>{for(let{reject:U}of o)U(N);this.tlsSessionCache.delete(E)}),D.setTimeout(this.timeout,()=>{D.destroy()}),D.once("close",()=>{if(w){C&&this._freeSessionsCount--,this._sessionsCount--;let N=this.sessions[u];N.splice(N.indexOf(D),1),N.length===0&&delete this.sessions[u]}else{let N=new Error("Session closed without receiving a SETTINGS frame");N.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:U}of o)U(N);p()}this._tryToCreateNewSession(u,A)});let T=()=>{if(!(!(u in this.queue)||!b())){for(let N of D[Jl])if(N in this.queue[u]){let{listeners:U}=this.queue[u][N];for(;U.length!==0&&b();)U.shift().resolve(D);let J=this.queue[u];if(J[N].listeners.length===0&&(delete J[N],Object.keys(J).length===0)){delete this.queue[u];break}if(!b())break}}};D.on("origin",()=>{D[Jl]=D.originSet,b()&&(T(),k4(this.sessions[u],D))}),D.once("remoteSettings",()=>{if(D.ref(),D.unref(),this._sessionsCount++,h.destroyed){let N=new Error("Agent has been destroyed");for(let U of o)U.reject(N);D.destroy();return}D[Jl]=D.originSet;{let N=this.sessions;if(u in N){let U=N[u];U.splice(Wnt(U,D,Ynt),0,D)}else N[u]=[D]}this._freeSessionsCount+=1,w=!0,this.emit("session",D),T(),p(),D[ea]===0&&this._freeSessionsCount>this.maxFreeSessions&&D.close(),o.length!==0&&(this.getSession(A,r,o),o.length=0),D.on("remoteSettings",()=>{T(),k4(this.sessions[u],D)})}),D[Fae]=D.request,D.request=(N,U)=>{if(D[wy])throw new Error("The session is gracefully closing. No new streams are allowed.");let J=D[Fae](N,U);return D.ref(),++D[ea],D[ea]===D.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,J.once("close",()=>{if(C=b(),--D[ea],!D.destroyed&&!D.closed&&(Vnt(this.sessions[u],D),b()&&!D.closed)){C||(this._freeSessionsCount++,C=!0);let te=D[ea]===0;te&&D.unref(),te&&(this._freeSessionsCount>this.maxFreeSessions||D[wy])?D.close():(k4(this.sessions[u],D),T())}}),J}}catch(D){for(let b of o)b.reject(D);p()}};h.listeners=o,h.completed=!1,h.destroyed=!1,this.queue[u][A]=h,this._tryToCreateNewSession(u,A)})}request(e,r,o,a){return new Promise((n,u)=>{this.getSession(e,r,[{reject:u,resolve:A=>{try{n(A.request(o,a))}catch(p){u(p)}}}])})}createConnection(e,r){return t.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let o=e.port||443,a=e.hostname||e.host;return typeof r.servername>"u"&&(r.servername=a),Hnt.connect(o,a,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[ea]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let o of r)o.destroy(e);for(let r of Object.values(this.queue))for(let o of Object.values(r))o.destroyed=!0;this.queue={}}get freeSessions(){return Rae({agent:this,isFree:!0})}get busySessions(){return Rae({agent:this,isFree:!1})}};xg.kCurrentStreamsCount=ea;xg.kGracefullyClosing=wy;Lae.exports={Agent:xg,globalAgent:new xg}});var R4=_((gNt,Nae)=>{"use strict";var{Readable:Knt}=ve("stream"),F4=class extends Knt{constructor(e,r){super({highWaterMark:r,autoDestroy:!1}),this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};Nae.exports=F4});var T4=_((dNt,Oae)=>{"use strict";Oae.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var Uae=_((mNt,Mae)=>{"use strict";Mae.exports=(t,e,r)=>{for(let o of r)t.on(o,(...a)=>e.emit(o,...a))}});var Hae=_((yNt,_ae)=>{"use strict";_ae.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var jae=_((CNt,qae)=>{"use strict";var By=(t,e,r)=>{qae.exports[e]=class extends t{constructor(...a){super(typeof r=="string"?r:r(a)),this.name=`${super.name} [${e}]`,this.code=e}}};By(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],o=Array.isArray(r);return o&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${o?"one of":"of"} type ${r}. Received ${typeof t[2]}`});By(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);By(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);By(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);By(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);By(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var U4=_((INt,zae)=>{"use strict";var Jnt=ve("http2"),{Writable:znt}=ve("stream"),{Agent:Gae,globalAgent:Xnt}=Q4(),Znt=R4(),$nt=T4(),eit=Uae(),tit=Hae(),{ERR_INVALID_ARG_TYPE:L4,ERR_INVALID_PROTOCOL:rit,ERR_HTTP_HEADERS_SENT:Wae,ERR_INVALID_HTTP_TOKEN:nit,ERR_HTTP_INVALID_HEADER_VALUE:iit,ERR_INVALID_CHAR:sit}=jae(),{HTTP2_HEADER_STATUS:Yae,HTTP2_HEADER_METHOD:Vae,HTTP2_HEADER_PATH:Kae,HTTP2_METHOD_CONNECT:oit}=Jnt.constants,vo=Symbol("headers"),N4=Symbol("origin"),O4=Symbol("session"),Jae=Symbol("options"),Lx=Symbol("flushedHeaders"),R1=Symbol("jobs"),ait=/^[\^`\-\w!#$%&*+.|~]+$/,lit=/[^\t\u0020-\u007E\u0080-\u00FF]/,M4=class extends znt{constructor(e,r,o){super({autoDestroy:!1});let a=typeof e=="string"||e instanceof URL;if(a&&(e=$nt(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(o=r,r=a?e:{...e}):r={...e,...r},r.h2session)this[O4]=r.h2session;else if(r.agent===!1)this.agent=new Gae({maxFreeSessions:0});else if(typeof r.agent>"u"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new Gae({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=Xnt;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new L4("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new rit(r.protocol,"https:");let n=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,u=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:A}=r;if(r.timeout=void 0,this[vo]=Object.create(null),this[R1]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[p,h]of Object.entries(r.headers))this.setHeader(p,h);r.auth&&!("authorization"in this[vo])&&(this[vo].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[Jae]=r,n===443?(this[N4]=`https://${u}`,":authority"in this[vo]||(this[vo][":authority"]=u)):(this[N4]=`https://${u}:${n}`,":authority"in this[vo]||(this[vo][":authority"]=`${u}:${n}`)),A&&this.setTimeout(A),o&&this.once("response",o),this[Lx]=!1}get method(){return this[vo][Vae]}set method(e){e&&(this[vo][Vae]=e.toUpperCase())}get path(){return this[vo][Kae]}set path(e){e&&(this[vo][Kae]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,o){if(this._mustNotHaveABody){o(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let a=()=>this._request.write(e,r,o);this._request?a():this[R1].push(a)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[R1].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[Lx]||this.destroyed)return;this[Lx]=!0;let e=this.method===oit,r=o=>{if(this._request=o,this.destroyed){o.destroy();return}e||eit(o,this,["timeout","continue","close","error"]);let a=u=>(...A)=>{!this.writable&&!this.destroyed?u(...A):this.once("finish",()=>{u(...A)})};o.once("response",a((u,A,p)=>{let h=new Znt(this.socket,o.readableHighWaterMark);this.res=h,h.req=this,h.statusCode=u[Yae],h.headers=u,h.rawHeaders=p,h.once("end",()=>{this.aborted?(h.aborted=!0,h.emit("aborted")):(h.complete=!0,h.socket=null,h.connection=null)}),e?(h.upgrade=!0,this.emit("connect",h,o,Buffer.alloc(0))?this.emit("close"):o.destroy()):(o.on("data",E=>{!h._dumped&&!h.push(E)&&o.pause()}),o.once("end",()=>{h.push(null)}),this.emit("response",h)||h._dump())})),o.once("headers",a(u=>this.emit("information",{statusCode:u[Yae]}))),o.once("trailers",a((u,A,p)=>{let{res:h}=this;h.trailers=u,h.rawTrailers=p}));let{socket:n}=o.session;this.socket=n,this.connection=n;for(let u of this[R1])u();this.emit("socket",this.socket)};if(this[O4])try{r(this[O4].request(this[vo]))}catch(o){this.emit("error",o)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[N4],this[Jae],this[vo]))}catch(o){this.emit("error",o)}}}getHeader(e){if(typeof e!="string")throw new L4("name","string",e);return this[vo][e.toLowerCase()]}get headersSent(){return this[Lx]}removeHeader(e){if(typeof e!="string")throw new L4("name","string",e);if(this.headersSent)throw new Wae("remove");delete this[vo][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new Wae("set");if(typeof e!="string"||!ait.test(e)&&!tit(e))throw new nit("Header name",e);if(typeof r>"u")throw new iit(r,e);if(lit.test(r))throw new sit("header content",e);this[vo][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let o=()=>this._request.setTimeout(e,r);return this._request?o():this[R1].push(o),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};zae.exports=M4});var Zae=_((wNt,Xae)=>{"use strict";var cit=ve("tls");Xae.exports=(t={},e=cit.connect)=>new Promise((r,o)=>{let a=!1,n,u=async()=>{await p,n.off("timeout",A),n.off("error",o),t.resolveSocket?(r({alpnProtocol:n.alpnProtocol,socket:n,timeout:a}),a&&(await Promise.resolve(),n.emit("timeout"))):(n.destroy(),r({alpnProtocol:n.alpnProtocol,timeout:a}))},A=async()=>{a=!0,u()},p=(async()=>{try{n=await e(t,u),n.on("error",o),n.once("timeout",A)}catch(h){o(h)}})()})});var ele=_((BNt,$ae)=>{"use strict";var uit=ve("net");$ae.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),uit.isIP(e)?"":e}});var nle=_((vNt,H4)=>{"use strict";var tle=ve("http"),_4=ve("https"),Ait=Zae(),fit=b4(),pit=U4(),hit=ele(),git=T4(),Nx=new fit({maxSize:100}),T1=new Map,rle=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let o=()=>{t.emit("free",e,r)};e.on("free",o);let a=()=>{t.removeSocket(e,r)};e.on("close",a);let n=()=>{t.removeSocket(e,r),e.off("close",a),e.off("free",o),e.off("agentRemove",n)};e.on("agentRemove",n),t.emit("free",e,r)},dit=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!Nx.has(e)){if(T1.has(e))return(await T1.get(e)).alpnProtocol;let{path:r,agent:o}=t;t.path=t.socketPath;let a=Ait(t);T1.set(e,a);try{let{socket:n,alpnProtocol:u}=await a;if(Nx.set(e,u),t.path=r,u==="h2")n.destroy();else{let{globalAgent:A}=_4,p=_4.Agent.prototype.createConnection;o?o.createConnection===p?rle(o,n,t):n.destroy():A.createConnection===p?rle(A,n,t):n.destroy()}return T1.delete(e),u}catch(n){throw T1.delete(e),n}}return Nx.get(e)};H4.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=git(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e={ALPNProtocols:["h2","http/1.1"],...t,...e,resolveSocket:!0},!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let o=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||hit(e),e.port=e.port||(o?443:80),e._defaultAgent=o?_4.globalAgent:tle.globalAgent;let a=e.agent;if(a){if(a.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=a[o?"https":"http"]}return o&&await dit(e)==="h2"?(a&&(e.agent=a.http2),new pit(e,r)):tle.request(e,r)};H4.exports.protocolCache=Nx});var sle=_((DNt,ile)=>{"use strict";var mit=ve("http2"),yit=Q4(),q4=U4(),Eit=R4(),Cit=nle(),Iit=(t,e,r)=>new q4(t,e,r),wit=(t,e,r)=>{let o=new q4(t,e,r);return o.end(),o};ile.exports={...mit,ClientRequest:q4,IncomingMessage:Eit,...yit,request:Iit,get:wit,auto:Cit}});var G4=_(j4=>{"use strict";Object.defineProperty(j4,"__esModule",{value:!0});var ole=Ff();j4.default=t=>ole.default.nodeStream(t)&&ole.default.function_(t.getBoundary)});var ule=_(W4=>{"use strict";Object.defineProperty(W4,"__esModule",{value:!0});var lle=ve("fs"),cle=ve("util"),ale=Ff(),Bit=G4(),vit=cle.promisify(lle.stat);W4.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(ale.default.string(t))return Buffer.byteLength(t);if(ale.default.buffer(t))return t.length;if(Bit.default(t))return cle.promisify(t.getLength.bind(t))();if(t instanceof lle.ReadStream){let{size:r}=await vit(t.path);return r===0?void 0:r}}});var V4=_(Y4=>{"use strict";Object.defineProperty(Y4,"__esModule",{value:!0});function Dit(t,e,r){let o={};for(let a of r)o[a]=(...n)=>{e.emit(a,...n)},t.on(a,o[a]);return()=>{for(let a of r)t.off(a,o[a])}}Y4.default=Dit});var Ale=_(K4=>{"use strict";Object.defineProperty(K4,"__esModule",{value:!0});K4.default=()=>{let t=[];return{once(e,r,o){e.once(r,o),t.push({origin:e,event:r,fn:o})},unhandleAll(){for(let e of t){let{origin:r,event:o,fn:a}=e;r.removeListener(o,a)}t.length=0}}}});var ple=_(L1=>{"use strict";Object.defineProperty(L1,"__esModule",{value:!0});L1.TimeoutError=void 0;var Sit=ve("net"),Pit=Ale(),fle=Symbol("reentry"),xit=()=>{},Ox=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`),this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};L1.TimeoutError=Ox;L1.default=(t,e,r)=>{if(fle in t)return xit;t[fle]=!0;let o=[],{once:a,unhandleAll:n}=Pit.default(),u=(w,D,b)=>{var C;let T=setTimeout(D,w,w,b);(C=T.unref)===null||C===void 0||C.call(T);let N=()=>{clearTimeout(T)};return o.push(N),N},{host:A,hostname:p}=r,h=(w,D)=>{t.destroy(new Ox(w,D))},E=()=>{for(let w of o)w();n()};if(t.once("error",w=>{if(E(),t.listenerCount("error")===0)throw w}),t.once("close",E),a(t,"response",w=>{a(w,"end",E)}),typeof e.request<"u"&&u(e.request,h,"request"),typeof e.socket<"u"){let w=()=>{h(e.socket,"socket")};t.setTimeout(e.socket,w),o.push(()=>{t.removeListener("timeout",w)})}return a(t,"socket",w=>{var D;let{socketPath:b}=t;if(w.connecting){let C=!!(b??Sit.isIP((D=p??A)!==null&&D!==void 0?D:"")!==0);if(typeof e.lookup<"u"&&!C&&typeof w.address().address>"u"){let T=u(e.lookup,h,"lookup");a(w,"lookup",T)}if(typeof e.connect<"u"){let T=()=>u(e.connect,h,"connect");C?a(w,"connect",T()):a(w,"lookup",N=>{N===null&&a(w,"connect",T())})}typeof e.secureConnect<"u"&&r.protocol==="https:"&&a(w,"connect",()=>{let T=u(e.secureConnect,h,"secureConnect");a(w,"secureConnect",T)})}if(typeof e.send<"u"){let C=()=>u(e.send,h,"send");w.connecting?a(w,"connect",()=>{a(t,"upload-complete",C())}):a(t,"upload-complete",C())}}),typeof e.response<"u"&&a(t,"upload-complete",()=>{let w=u(e.response,h,"response");a(t,"response",w)}),E}});var gle=_(J4=>{"use strict";Object.defineProperty(J4,"__esModule",{value:!0});var hle=Ff();J4.default=t=>{t=t;let e={protocol:t.protocol,hostname:hle.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return hle.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var dle=_(z4=>{"use strict";Object.defineProperty(z4,"__esModule",{value:!0});var bit=ve("url"),kit=["protocol","host","hostname","port","pathname","search"];z4.default=(t,e)=>{var r,o;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(o=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&o!==void 0?o:""}`}let a=new bit.URL(t);if(e.path){let n=e.path.indexOf("?");n===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,n),e.search=e.path.slice(n+1)),delete e.path}for(let n of kit)e[n]&&(a[n]=e[n].toString());return a}});var mle=_(Z4=>{"use strict";Object.defineProperty(Z4,"__esModule",{value:!0});var X4=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};Z4.default=X4});var eU=_($4=>{"use strict";Object.defineProperty($4,"__esModule",{value:!0});var Qit=async t=>{let e=[],r=0;for await(let o of t)e.push(o),r+=Buffer.byteLength(o);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};$4.default=Qit});var Ele=_(bg=>{"use strict";Object.defineProperty(bg,"__esModule",{value:!0});bg.dnsLookupIpVersionToFamily=bg.isDnsLookupIpVersion=void 0;var yle={auto:0,ipv4:4,ipv6:6};bg.isDnsLookupIpVersion=t=>t in yle;bg.dnsLookupIpVersionToFamily=t=>{if(bg.isDnsLookupIpVersion(t))return yle[t];throw new Error("Invalid DNS lookup IP version")}});var tU=_(Mx=>{"use strict";Object.defineProperty(Mx,"__esModule",{value:!0});Mx.isResponseOk=void 0;Mx.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var Ile=_(rU=>{"use strict";Object.defineProperty(rU,"__esModule",{value:!0});var Cle=new Set;rU.default=t=>{Cle.has(t)||(Cle.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var wle=_(nU=>{"use strict";Object.defineProperty(nU,"__esModule",{value:!0});var mi=Ff(),Fit=(t,e)=>{if(mi.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");mi.assert.any([mi.default.string,mi.default.undefined],t.encoding),mi.assert.any([mi.default.boolean,mi.default.undefined],t.resolveBodyOnly),mi.assert.any([mi.default.boolean,mi.default.undefined],t.methodRewriting),mi.assert.any([mi.default.boolean,mi.default.undefined],t.isStream),mi.assert.any([mi.default.string,mi.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry={...e.retry}:t.retry={calculateDelay:o=>o.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},mi.default.object(r)?(t.retry={...t.retry,...r},t.retry.methods=[...new Set(t.retry.methods.map(o=>o.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):mi.default.number(r)&&(t.retry.limit=r),mi.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(mi.default.number))),mi.default.object(t.pagination)){e&&(t.pagination={...e.pagination,...t.pagination});let{pagination:o}=t;if(!mi.default.function_(o.transform))throw new Error("`options.pagination.transform` must be implemented");if(!mi.default.function_(o.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!mi.default.function_(o.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!mi.default.function_(o.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};nU.default=Fit});var Ble=_(N1=>{"use strict";Object.defineProperty(N1,"__esModule",{value:!0});N1.retryAfterStatusCodes=void 0;N1.retryAfterStatusCodes=new Set([413,429,503]);var Rit=({attemptCount:t,retryOptions:e,error:r,retryAfter:o})=>{if(t>e.limit)return 0;let a=e.methods.includes(r.options.method),n=e.errorCodes.includes(r.code),u=r.response&&e.statusCodes.includes(r.response.statusCode);if(!a||!n&&!u)return 0;if(r.response){if(o)return e.maxRetryAfter===void 0||o>e.maxRetryAfter?0:o;if(r.response.statusCode===413)return 0}let A=Math.random()*100;return 2**(t-1)*1e3+A};N1.default=Rit});var U1=_(Qn=>{"use strict";Object.defineProperty(Qn,"__esModule",{value:!0});Qn.UnsupportedProtocolError=Qn.ReadError=Qn.TimeoutError=Qn.UploadError=Qn.CacheError=Qn.HTTPError=Qn.MaxRedirectsError=Qn.RequestError=Qn.setNonEnumerableProperties=Qn.knownHookEvents=Qn.withoutBody=Qn.kIsNormalizedAlready=void 0;var vle=ve("util"),Dle=ve("stream"),Tit=ve("fs"),uh=ve("url"),Sle=ve("http"),iU=ve("http"),Lit=ve("https"),Nit=_oe(),Oit=Voe(),Ple=Sae(),Mit=kae(),Uit=sle(),_it=Rx(),at=Ff(),Hit=ule(),xle=G4(),qit=V4(),ble=ple(),jit=gle(),kle=dle(),Git=mle(),Wit=eU(),Qle=Ele(),Yit=tU(),Ah=Ile(),Vit=wle(),Kit=Ble(),sU,Ys=Symbol("request"),Hx=Symbol("response"),vy=Symbol("responseSize"),Dy=Symbol("downloadedSize"),Sy=Symbol("bodySize"),Py=Symbol("uploadedSize"),Ux=Symbol("serverResponsesPiped"),Fle=Symbol("unproxyEvents"),Rle=Symbol("isFromCache"),oU=Symbol("cancelTimeouts"),Tle=Symbol("startedReading"),xy=Symbol("stopReading"),_x=Symbol("triggerRead"),fh=Symbol("body"),O1=Symbol("jobs"),Lle=Symbol("originalResponse"),Nle=Symbol("retryTimeout");Qn.kIsNormalizedAlready=Symbol("isNormalizedAlready");var Jit=at.default.string(process.versions.brotli);Qn.withoutBody=new Set(["GET","HEAD"]);Qn.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function zit(t){for(let e in t){let r=t[e];if(!at.default.string(r)&&!at.default.number(r)&&!at.default.boolean(r)&&!at.default.null_(r)&&!at.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function Xit(t){return at.default.object(t)&&!("statusCode"in t)}var aU=new Git.default,Zit=async t=>new Promise((e,r)=>{let o=a=>{r(a)};t.pending||e(),t.once("error",o),t.once("ready",()=>{t.off("error",o),e()})}),$it=new Set([300,301,302,303,304,307,308]),est=["context","body","json","form"];Qn.setNonEnumerableProperties=(t,e)=>{let r={};for(let o of t)if(o)for(let a of est)a in o&&(r[a]={writable:!0,configurable:!0,enumerable:!1,value:o[a]});Object.defineProperties(e,r)};var zi=class extends Error{constructor(e,r,o){var a;if(super(e),Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,o instanceof Kx?(Object.defineProperty(this,"request",{enumerable:!1,value:o}),Object.defineProperty(this,"response",{enumerable:!1,value:o[Hx]}),Object.defineProperty(this,"options",{enumerable:!1,value:o.options})):Object.defineProperty(this,"options",{enumerable:!1,value:o}),this.timings=(a=this.request)===null||a===void 0?void 0:a.timings,at.default.string(r.stack)&&at.default.string(this.stack)){let n=this.stack.indexOf(this.message)+this.message.length,u=this.stack.slice(n).split(` -`).reverse(),A=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` -`).reverse();for(;A.length!==0&&A[0]===u[0];)u.shift();this.stack=`${this.stack.slice(0,n)}${u.reverse().join(` -`)}${A.reverse().join(` -`)}`}}};Qn.RequestError=zi;var qx=class extends zi{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name="MaxRedirectsError"}};Qn.MaxRedirectsError=qx;var jx=class extends zi{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name="HTTPError"}};Qn.HTTPError=jx;var Gx=class extends zi{constructor(e,r){super(e.message,e,r),this.name="CacheError"}};Qn.CacheError=Gx;var Wx=class extends zi{constructor(e,r){super(e.message,e,r),this.name="UploadError"}};Qn.UploadError=Wx;var Yx=class extends zi{constructor(e,r,o){super(e.message,e,o),this.name="TimeoutError",this.event=e.event,this.timings=r}};Qn.TimeoutError=Yx;var M1=class extends zi{constructor(e,r){super(e.message,e,r),this.name="ReadError"}};Qn.ReadError=M1;var Vx=class extends zi{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),this.name="UnsupportedProtocolError"}};Qn.UnsupportedProtocolError=Vx;var tst=["socket","connect","continue","information","upgrade","timeout"],Kx=class extends Dle.Duplex{constructor(e,r={},o){super({autoDestroy:!1,highWaterMark:0}),this[Dy]=0,this[Py]=0,this.requestInitialized=!1,this[Ux]=new Set,this.redirects=[],this[xy]=!1,this[_x]=!1,this[O1]=[],this.retryCount=0,this._progressCallbacks=[];let a=()=>this._unlockWrite(),n=()=>this._lockWrite();this.on("pipe",h=>{h.prependListener("data",a),h.on("data",n),h.prependListener("end",a),h.on("end",n)}),this.on("unpipe",h=>{h.off("data",a),h.off("data",n),h.off("end",a),h.off("end",n)}),this.on("pipe",h=>{h instanceof iU.IncomingMessage&&(this.options.headers={...h.headers,...this.options.headers})});let{json:u,body:A,form:p}=r;if((u||A||p)&&this._lockWrite(),Qn.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,o)}catch(h){at.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(h);return}(async()=>{var h;try{this.options.body instanceof Tit.ReadStream&&await Zit(this.options.body);let{url:E}=this.options;if(!E)throw new TypeError("Missing `url` property");if(this.requestUrl=E.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(h=this[Ys])===null||h===void 0||h.destroy();return}for(let w of this[O1])w();this[O1].length=0,this.requestInitialized=!0}catch(E){if(E instanceof zi){this._beforeError(E);return}this.destroyed||this.destroy(E)}})()}static normalizeArguments(e,r,o){var a,n,u,A,p;let h=r;if(at.default.object(e)&&!at.default.urlInstance(e))r={...o,...e,...r};else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r={...o,...r},e!==void 0&&(r.url=e),at.default.urlInstance(r.url)&&(r.url=new uh.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),at.assert.any([at.default.string,at.default.undefined],r.method),at.assert.any([at.default.object,at.default.undefined],r.headers),at.assert.any([at.default.string,at.default.urlInstance,at.default.undefined],r.prefixUrl),at.assert.any([at.default.object,at.default.undefined],r.cookieJar),at.assert.any([at.default.object,at.default.string,at.default.undefined],r.searchParams),at.assert.any([at.default.object,at.default.string,at.default.undefined],r.cache),at.assert.any([at.default.object,at.default.number,at.default.undefined],r.timeout),at.assert.any([at.default.object,at.default.undefined],r.context),at.assert.any([at.default.object,at.default.undefined],r.hooks),at.assert.any([at.default.boolean,at.default.undefined],r.decompress),at.assert.any([at.default.boolean,at.default.undefined],r.ignoreInvalidCookies),at.assert.any([at.default.boolean,at.default.undefined],r.followRedirect),at.assert.any([at.default.number,at.default.undefined],r.maxRedirects),at.assert.any([at.default.boolean,at.default.undefined],r.throwHttpErrors),at.assert.any([at.default.boolean,at.default.undefined],r.http2),at.assert.any([at.default.boolean,at.default.undefined],r.allowGetBody),at.assert.any([at.default.string,at.default.undefined],r.localAddress),at.assert.any([Qle.isDnsLookupIpVersion,at.default.undefined],r.dnsLookupIpVersion),at.assert.any([at.default.object,at.default.undefined],r.https),at.assert.any([at.default.boolean,at.default.undefined],r.rejectUnauthorized),r.https&&(at.assert.any([at.default.boolean,at.default.undefined],r.https.rejectUnauthorized),at.assert.any([at.default.function_,at.default.undefined],r.https.checkServerIdentity),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.certificateAuthority),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.key),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.certificate),at.assert.any([at.default.string,at.default.undefined],r.https.passphrase),at.assert.any([at.default.string,at.default.buffer,at.default.array,at.default.undefined],r.https.pfx)),at.assert.any([at.default.object,at.default.undefined],r.cacheOptions),at.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===o?.headers?r.headers={...r.headers}:r.headers=_it({...o?.headers,...r.headers}),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==o?.searchParams){let b;if(at.default.string(r.searchParams)||r.searchParams instanceof uh.URLSearchParams)b=new uh.URLSearchParams(r.searchParams);else{zit(r.searchParams),b=new uh.URLSearchParams;for(let C in r.searchParams){let T=r.searchParams[C];T===null?b.append(C,""):T!==void 0&&b.append(C,T)}}(a=o?.searchParams)===null||a===void 0||a.forEach((C,T)=>{b.has(T)||b.append(T,C)}),r.searchParams=b}if(r.username=(n=r.username)!==null&&n!==void 0?n:"",r.password=(u=r.password)!==null&&u!==void 0?u:"",at.default.undefined(r.prefixUrl)?r.prefixUrl=(A=o?.prefixUrl)!==null&&A!==void 0?A:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),at.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=kle.default(r.prefixUrl+r.url,r)}else(at.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=kle.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:b}=r;Object.defineProperty(r,"prefixUrl",{set:T=>{let N=r.url;if(!N.href.startsWith(T))throw new Error(`Cannot change \`prefixUrl\` from ${b} to ${T}: ${N.href}`);r.url=new uh.URL(T+N.href.slice(b.length)),b=T},get:()=>b});let{protocol:C}=r.url;if(C==="unix:"&&(C="http:",r.url=new uh.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),C!=="http:"&&C!=="https:")throw new Vx(r);r.username===""?r.username=r.url.username:r.url.username=r.username,r.password===""?r.password=r.url.password:r.url.password=r.password}let{cookieJar:E}=r;if(E){let{setCookie:b,getCookieString:C}=E;at.assert.function_(b),at.assert.function_(C),b.length===4&&C.length===0&&(b=vle.promisify(b.bind(r.cookieJar)),C=vle.promisify(C.bind(r.cookieJar)),r.cookieJar={setCookie:b,getCookieString:C})}let{cache:w}=r;if(w&&(aU.has(w)||aU.set(w,new Ple((b,C)=>{let T=b[Ys](b,C);return at.default.promise(T)&&(T.once=(N,U)=>{if(N==="error")T.catch(U);else if(N==="abort")(async()=>{try{(await T).once("abort",U)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${N}`);return T}),T},w))),r.cacheOptions={...r.cacheOptions},r.dnsCache===!0)sU||(sU=new Oit.default),r.dnsCache=sU;else if(!at.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${at.default(r.dnsCache)}`);at.default.number(r.timeout)?r.timeout={request:r.timeout}:o&&r.timeout!==o.timeout?r.timeout={...o.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});let D=r.hooks===o?.hooks;r.hooks={...r.hooks};for(let b of Qn.knownHookEvents)if(b in r.hooks)if(at.default.array(r.hooks[b]))r.hooks[b]=[...r.hooks[b]];else throw new TypeError(`Parameter \`${b}\` must be an Array, got ${at.default(r.hooks[b])}`);else r.hooks[b]=[];if(o&&!D)for(let b of Qn.knownHookEvents)o.hooks[b].length>0&&(r.hooks[b]=[...o.hooks[b],...r.hooks[b]]);if("family"in r&&Ah.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),o?.https&&(r.https={...o.https,...r.https}),"rejectUnauthorized"in r&&Ah.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&Ah.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&Ah.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&Ah.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&Ah.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&Ah.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&Ah.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent){for(let b in r.agent)if(b!=="http"&&b!=="https"&&b!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${b}\``)}return r.maxRedirects=(p=r.maxRedirects)!==null&&p!==void 0?p:0,Qn.setNonEnumerableProperties([o,h],r),Vit.default(r,o)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,o=!at.default.undefined(e.form),a=!at.default.undefined(e.json),n=!at.default.undefined(e.body),u=o||a||n,A=Qn.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=A,u){if(A)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([n,o,a].filter(p=>p).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(n&&!(e.body instanceof Dle.Readable)&&!at.default.string(e.body)&&!at.default.buffer(e.body)&&!xle.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(o&&!at.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let p=!at.default.string(r["content-type"]);n?(xle.default(e.body)&&p&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[fh]=e.body):o?(p&&(r["content-type"]="application/x-www-form-urlencoded"),this[fh]=new uh.URLSearchParams(e.form).toString()):(p&&(r["content-type"]="application/json"),this[fh]=e.stringifyJson(e.json));let h=await Hit.default(this[fh],e.headers);at.default.undefined(r["content-length"])&&at.default.undefined(r["transfer-encoding"])&&!A&&!at.default.undefined(h)&&(r["content-length"]=String(h))}}else A?this._lockWrite():this._unlockWrite();this[Sy]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:o}=r;this[Lle]=e,r.decompress&&(e=Mit(e));let a=e.statusCode,n=e;n.statusMessage=n.statusMessage?n.statusMessage:Sle.STATUS_CODES[a],n.url=r.url.toString(),n.requestUrl=this.requestUrl,n.redirectUrls=this.redirects,n.request=this,n.isFromCache=e.fromCache||!1,n.ip=this.ip,n.retryCount=this.retryCount,this[Rle]=n.isFromCache,this[vy]=Number(e.headers["content-length"])||void 0,this[Hx]=e,e.once("end",()=>{this[vy]=this[Dy],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",A=>{e.destroy(),this._beforeError(new M1(A,this))}),e.once("aborted",()=>{this._beforeError(new M1({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let u=e.headers["set-cookie"];if(at.default.object(r.cookieJar)&&u){let A=u.map(async p=>r.cookieJar.setCookie(p,o.toString()));r.ignoreInvalidCookies&&(A=A.map(async p=>p.catch(()=>{})));try{await Promise.all(A)}catch(p){this._beforeError(p);return}}if(r.followRedirect&&e.headers.location&&$it.has(a)){if(e.resume(),this[Ys]&&(this[oU](),delete this[Ys],this[Fle]()),(a===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[fh]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new qx(this));return}try{let p=Buffer.from(e.headers.location,"binary").toString(),h=new uh.URL(p,o),E=h.toString();decodeURI(E),h.hostname!==o.hostname||h.port!==o.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(h.username=r.username,h.password=r.password),this.redirects.push(E),r.url=h;for(let w of r.hooks.beforeRedirect)await w(r,n);this.emit("redirect",n,r),await this._makeRequest()}catch(p){this._beforeError(p);return}return}if(r.isStream&&r.throwHttpErrors&&!Yit.isResponseOk(n)){this._beforeError(new jx(n));return}e.on("readable",()=>{this[_x]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let A of this[Ux])if(!A.headersSent){for(let p in e.headers){let h=r.decompress?p!=="content-encoding":!0,E=e.headers[p];h&&A.setHeader(p,E)}A.statusCode=a}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:o,url:a}=r;Nit.default(e),this[oU]=ble.default(e,o,a);let n=r.cache?"cacheableResponse":"response";e.once(n,p=>{this._onResponse(p)}),e.once("error",p=>{var h;e.destroy(),(h=e.res)===null||h===void 0||h.removeAllListeners("end"),p=p instanceof ble.TimeoutError?new Yx(p,this.timings,this):new zi(p.message,p,this),this._beforeError(p)}),this[Fle]=qit.default(e,this,tst),this[Ys]=e,this.emit("uploadProgress",this.uploadProgress);let u=this[fh],A=this.redirects.length===0?this:e;at.default.nodeStream(u)?(u.pipe(A),u.once("error",p=>{this._beforeError(new Wx(p,this))})):(this._unlockWrite(),at.default.undefined(u)?(this._cannotHaveBody||this._noPipe)&&(A.end(),this._lockWrite()):(this._writeRequest(u,void 0,()=>{}),A.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((o,a)=>{Object.assign(r,jit.default(e)),delete r.url;let n,u=aU.get(r.cache)(r,async A=>{A._readableState.autoDestroy=!1,n&&(await n).emit("cacheableResponse",A),o(A)});r.url=e,u.once("error",a),u.once("request",async A=>{n=A,o(n)})})}async _makeRequest(){var e,r,o,a,n;let{options:u}=this,{headers:A}=u;for(let U in A)if(at.default.undefined(A[U]))delete A[U];else if(at.default.null_(A[U]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${U}\` header`);if(u.decompress&&at.default.undefined(A["accept-encoding"])&&(A["accept-encoding"]=Jit?"gzip, deflate, br":"gzip, deflate"),u.cookieJar){let U=await u.cookieJar.getCookieString(u.url.toString());at.default.nonEmptyString(U)&&(u.headers.cookie=U)}for(let U of u.hooks.beforeRequest){let J=await U(u);if(!at.default.undefined(J)){u.request=()=>J;break}}u.body&&this[fh]!==u.body&&(this[fh]=u.body);let{agent:p,request:h,timeout:E,url:w}=u;if(u.dnsCache&&!("lookup"in u)&&(u.lookup=u.dnsCache.lookup),w.hostname==="unix"){let U=/(?.+?):(?.+)/.exec(`${w.pathname}${w.search}`);if(U?.groups){let{socketPath:J,path:te}=U.groups;Object.assign(u,{socketPath:J,path:te,host:""})}}let D=w.protocol==="https:",b;u.http2?b=Uit.auto:b=D?Lit.request:Sle.request;let C=(e=u.request)!==null&&e!==void 0?e:b,T=u.cache?this._createCacheableRequest:C;p&&!u.http2&&(u.agent=p[D?"https":"http"]),u[Ys]=C,delete u.request,delete u.timeout;let N=u;if(N.shared=(r=u.cacheOptions)===null||r===void 0?void 0:r.shared,N.cacheHeuristic=(o=u.cacheOptions)===null||o===void 0?void 0:o.cacheHeuristic,N.immutableMinTimeToLive=(a=u.cacheOptions)===null||a===void 0?void 0:a.immutableMinTimeToLive,N.ignoreCargoCult=(n=u.cacheOptions)===null||n===void 0?void 0:n.ignoreCargoCult,u.dnsLookupIpVersion!==void 0)try{N.family=Qle.dnsLookupIpVersionToFamily(u.dnsLookupIpVersion)}catch{throw new Error("Invalid `dnsLookupIpVersion` option value")}u.https&&("rejectUnauthorized"in u.https&&(N.rejectUnauthorized=u.https.rejectUnauthorized),u.https.checkServerIdentity&&(N.checkServerIdentity=u.https.checkServerIdentity),u.https.certificateAuthority&&(N.ca=u.https.certificateAuthority),u.https.certificate&&(N.cert=u.https.certificate),u.https.key&&(N.key=u.https.key),u.https.passphrase&&(N.passphrase=u.https.passphrase),u.https.pfx&&(N.pfx=u.https.pfx));try{let U=await T(w,N);at.default.undefined(U)&&(U=b(w,N)),u.request=h,u.timeout=E,u.agent=p,u.https&&("rejectUnauthorized"in u.https&&delete N.rejectUnauthorized,u.https.checkServerIdentity&&delete N.checkServerIdentity,u.https.certificateAuthority&&delete N.ca,u.https.certificate&&delete N.cert,u.https.key&&delete N.key,u.https.passphrase&&delete N.passphrase,u.https.pfx&&delete N.pfx),Xit(U)?this._onRequest(U):this.writable?(this.once("finish",()=>{this._onResponse(U)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(U)}catch(U){throw U instanceof Ple.CacheError?new Gx(U,this):new zi(U.message,U,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new zi(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[xy])return;let{options:r}=this,o=this.retryCount+1;this[xy]=!0,e instanceof zi||(e=new zi(e.message,e,this));let a=e,{response:n}=a;(async()=>{if(n&&!n.body){n.setEncoding(this._readableState.encoding);try{n.rawBody=await Wit.default(n),n.body=n.rawBody.toString()}catch{}}if(this.listenerCount("retry")!==0){let u;try{let A;n&&"retry-after"in n.headers&&(A=Number(n.headers["retry-after"]),Number.isNaN(A)?(A=Date.parse(n.headers["retry-after"])-Date.now(),A<=0&&(A=1)):A*=1e3),u=await r.retry.calculateDelay({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:Kit.default({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:0})})}catch(A){this._error(new zi(A.message,A,this));return}if(u){let A=async()=>{try{for(let p of this.options.hooks.beforeRetry)await p(this.options,a,o)}catch(p){this._error(new zi(p.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",o,e))};this[Nle]=setTimeout(A,u);return}}this._error(a)})()}_read(){this[_x]=!0;let e=this[Hx];if(e&&!this[xy]){e.readableLength&&(this[_x]=!1);let r;for(;(r=e.read())!==null;){this[Dy]+=r.length,this[Tle]=!0;let o=this.downloadProgress;o.percent<1&&this.emit("downloadProgress",o),this.push(r)}}}_write(e,r,o){let a=()=>{this._writeRequest(e,r,o)};this.requestInitialized?a():this[O1].push(a)}_writeRequest(e,r,o){this[Ys].destroyed||(this._progressCallbacks.push(()=>{this[Py]+=Buffer.byteLength(e,r);let a=this.uploadProgress;a.percent<1&&this.emit("uploadProgress",a)}),this[Ys].write(e,r,a=>{!a&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),o(a)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Ys in this)){e();return}if(this[Ys].destroyed){e();return}this[Ys].end(o=>{o||(this[Sy]=this[Py],this.emit("uploadProgress",this.uploadProgress),this[Ys].emit("upload-complete")),e(o)})};this.requestInitialized?r():this[O1].push(r)}_destroy(e,r){var o;this[xy]=!0,clearTimeout(this[Nle]),Ys in this&&(this[oU](),!((o=this[Hx])===null||o===void 0)&&o.complete||this[Ys].destroy()),e!==null&&!at.default.undefined(e)&&!(e instanceof zi)&&(e=new zi(e.message,e,this)),r(e)}get _isAboutToError(){return this[xy]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,o;return((r=(e=this[Ys])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!(!((o=this[Lle])===null||o===void 0)&&o.complete)}get socket(){var e,r;return(r=(e=this[Ys])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[vy]?e=this[Dy]/this[vy]:this[vy]===this[Dy]?e=1:e=0,{percent:e,transferred:this[Dy],total:this[vy]}}get uploadProgress(){let e;return this[Sy]?e=this[Py]/this[Sy]:this[Sy]===this[Py]?e=1:e=0,{percent:e,transferred:this[Py],total:this[Sy]}}get timings(){var e;return(e=this[Ys])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[Rle]}pipe(e,r){if(this[Tle])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof iU.ServerResponse&&this[Ux].add(e),super.pipe(e,r)}unpipe(e){return e instanceof iU.ServerResponse&&this[Ux].delete(e),super.unpipe(e),this}};Qn.default=Kx});var _1=_(zc=>{"use strict";var rst=zc&&zc.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),nst=zc&&zc.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&rst(e,t,r)};Object.defineProperty(zc,"__esModule",{value:!0});zc.CancelError=zc.ParseError=void 0;var Ole=U1(),lU=class extends Ole.RequestError{constructor(e,r){let{options:o}=r.request;super(`${e.message} in "${o.url.toString()}"`,e,r.request),this.name="ParseError"}};zc.ParseError=lU;var cU=class extends Ole.RequestError{constructor(e){super("Promise was canceled",{},e),this.name="CancelError"}get isCanceled(){return!0}};zc.CancelError=cU;nst(U1(),zc)});var Ule=_(uU=>{"use strict";Object.defineProperty(uU,"__esModule",{value:!0});var Mle=_1(),ist=(t,e,r,o)=>{let{rawBody:a}=t;try{if(e==="text")return a.toString(o);if(e==="json")return a.length===0?"":r(a.toString());if(e==="buffer")return a;throw new Mle.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(n){throw new Mle.ParseError(n,t)}};uU.default=ist});var AU=_(ph=>{"use strict";var sst=ph&&ph.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),ost=ph&&ph.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&sst(e,t,r)};Object.defineProperty(ph,"__esModule",{value:!0});var ast=ve("events"),lst=Ff(),cst=Moe(),Jx=_1(),_le=Ule(),Hle=U1(),ust=V4(),Ast=eU(),qle=tU(),fst=["request","response","redirect","uploadProgress","downloadProgress"];function jle(t){let e,r,o=new ast.EventEmitter,a=new cst((u,A,p)=>{let h=E=>{let w=new Hle.default(void 0,t);w.retryCount=E,w._noPipe=!0,p(()=>w.destroy()),p.shouldReject=!1,p(()=>A(new Jx.CancelError(w))),e=w,w.once("response",async C=>{var T;if(C.retryCount=E,C.request.aborted)return;let N;try{N=await Ast.default(w),C.rawBody=N}catch{return}if(w._isAboutToError)return;let U=((T=C.headers["content-encoding"])!==null&&T!==void 0?T:"").toLowerCase(),J=["gzip","deflate","br"].includes(U),{options:te}=w;if(J&&!te.decompress)C.body=N;else try{C.body=_le.default(C,te.responseType,te.parseJson,te.encoding)}catch(le){if(C.body=N.toString(),qle.isResponseOk(C)){w._beforeError(le);return}}try{for(let[le,ce]of te.hooks.afterResponse.entries())C=await ce(C,async ue=>{let Ie=Hle.default.normalizeArguments(void 0,{...ue,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},te);Ie.hooks.afterResponse=Ie.hooks.afterResponse.slice(0,le);for(let De of Ie.hooks.beforeRetry)await De(Ie);let he=jle(Ie);return p(()=>{he.catch(()=>{}),he.cancel()}),he})}catch(le){w._beforeError(new Jx.RequestError(le.message,le,w));return}if(!qle.isResponseOk(C)){w._beforeError(new Jx.HTTPError(C));return}r=C,u(w.options.resolveBodyOnly?C.body:C)});let D=C=>{if(a.isCanceled)return;let{options:T}=w;if(C instanceof Jx.HTTPError&&!T.throwHttpErrors){let{response:N}=C;u(w.options.resolveBodyOnly?N.body:N);return}A(C)};w.once("error",D);let b=w.options.body;w.once("retry",(C,T)=>{var N,U;if(b===((N=T.request)===null||N===void 0?void 0:N.options.body)&&lst.default.nodeStream((U=T.request)===null||U===void 0?void 0:U.options.body)){D(T);return}h(C)}),ust.default(w,o,fst)};h(0)});a.on=(u,A)=>(o.on(u,A),a);let n=u=>{let A=(async()=>{await a;let{options:p}=r.request;return _le.default(r,u,p.parseJson,p.encoding)})();return Object.defineProperties(A,Object.getOwnPropertyDescriptors(a)),A};return a.json=()=>{let{headers:u}=e.options;return!e.writableFinished&&u.accept===void 0&&(u.accept="application/json"),n("json")},a.buffer=()=>n("buffer"),a.text=()=>n("text"),a}ph.default=jle;ost(_1(),ph)});var Gle=_(fU=>{"use strict";Object.defineProperty(fU,"__esModule",{value:!0});var pst=_1();function hst(t,...e){let r=(async()=>{if(t instanceof pst.RequestError)try{for(let a of e)if(a)for(let n of a)t=await n(t)}catch(a){t=a}throw t})(),o=()=>r;return r.json=o,r.text=o,r.buffer=o,r.on=o,r}fU.default=hst});var Vle=_(pU=>{"use strict";Object.defineProperty(pU,"__esModule",{value:!0});var Wle=Ff();function Yle(t){for(let e of Object.values(t))(Wle.default.plainObject(e)||Wle.default.array(e))&&Yle(e);return Object.freeze(t)}pU.default=Yle});var Jle=_(Kle=>{"use strict";Object.defineProperty(Kle,"__esModule",{value:!0})});var hU=_(Xl=>{"use strict";var gst=Xl&&Xl.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),dst=Xl&&Xl.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&gst(e,t,r)};Object.defineProperty(Xl,"__esModule",{value:!0});Xl.defaultHandler=void 0;var zle=Ff(),zl=AU(),mst=Gle(),Xx=U1(),yst=Vle(),Est={RequestError:zl.RequestError,CacheError:zl.CacheError,ReadError:zl.ReadError,HTTPError:zl.HTTPError,MaxRedirectsError:zl.MaxRedirectsError,TimeoutError:zl.TimeoutError,ParseError:zl.ParseError,CancelError:zl.CancelError,UnsupportedProtocolError:zl.UnsupportedProtocolError,UploadError:zl.UploadError},Cst=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:zx}=Xx.default,Xle=(...t)=>{let e;for(let r of t)e=zx(void 0,r,e);return e},Ist=t=>t.isStream?new Xx.default(void 0,t):zl.default(t),wst=t=>"defaults"in t&&"options"in t.defaults,Bst=["get","post","put","patch","head","delete"];Xl.defaultHandler=(t,e)=>e(t);var Zle=(t,e)=>{if(t)for(let r of t)r(e)},$le=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(o=>(a,n)=>{let u,A=o(a,p=>(u=n(p),u));if(A!==u&&!a.isStream&&u){let p=A,{then:h,catch:E,finally:w}=p;Object.setPrototypeOf(p,Object.getPrototypeOf(u)),Object.defineProperties(p,Object.getOwnPropertyDescriptors(u)),p.then=h,p.catch=E,p.finally=w}return A});let e=(o,a={},n)=>{var u,A;let p=0,h=E=>t.handlers[p++](E,p===t.handlers.length?Ist:h);if(zle.default.plainObject(o)){let E={...o,...a};Xx.setNonEnumerableProperties([o,a],E),a=E,o=void 0}try{let E;try{Zle(t.options.hooks.init,a),Zle((u=a.hooks)===null||u===void 0?void 0:u.init,a)}catch(D){E=D}let w=zx(o,a,n??t.options);if(w[Xx.kIsNormalizedAlready]=!0,E)throw new zl.RequestError(E.message,E,w);return h(w)}catch(E){if(a.isStream)throw E;return mst.default(E,t.options.hooks.beforeError,(A=a.hooks)===null||A===void 0?void 0:A.beforeError)}};e.extend=(...o)=>{let a=[t.options],n=[...t._rawHandlers],u;for(let A of o)wst(A)?(a.push(A.defaults.options),n.push(...A.defaults._rawHandlers),u=A.defaults.mutableDefaults):(a.push(A),"handlers"in A&&n.push(...A.handlers),u=A.mutableDefaults);return n=n.filter(A=>A!==Xl.defaultHandler),n.length===0&&n.push(Xl.defaultHandler),$le({options:Xle(...a),handlers:n,mutableDefaults:!!u})};let r=async function*(o,a){let n=zx(o,a,t.options);n.resolveBodyOnly=!1;let u=n.pagination;if(!zle.default.object(u))throw new TypeError("`options.pagination` must be implemented");let A=[],{countLimit:p}=u,h=0;for(;h{let n=[];for await(let u of r(o,a))n.push(u);return n},e.paginate.each=r,e.stream=(o,a)=>e(o,{...a,isStream:!0});for(let o of Bst)e[o]=(a,n)=>e(a,{...n,method:o}),e.stream[o]=(a,n)=>e(a,{...n,method:o,isStream:!0});return Object.assign(e,Est),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:yst.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=Xle,e};Xl.default=$le;dst(Jle(),Xl)});var rce=_((Rf,Zx)=>{"use strict";var vst=Rf&&Rf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),ece=Rf&&Rf.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&vst(e,t,r)};Object.defineProperty(Rf,"__esModule",{value:!0});var Dst=ve("url"),tce=hU(),Sst={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let o of e){let a=o.split(";");if(a[1].includes("next")){r=a[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new Dst.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[tce.defaultHandler],mutableDefaults:!1},gU=tce.default(Sst);Rf.default=gU;Zx.exports=gU;Zx.exports.default=gU;Zx.exports.__esModule=!0;ece(hU(),Rf);ece(AU(),Rf)});var on={};Vt(on,{Method:()=>cce,del:()=>Qst,get:()=>EU,getNetworkSettings:()=>lce,post:()=>CU,put:()=>kst,request:()=>H1});function sce(t){let e=new URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),e.username&&e.password&&(r.proxyAuth=`${e.username}:${e.password}`),{proxy:r}}async function dU(t){return Al(ice,t,()=>ae.readFilePromise(t).then(e=>(ice.set(t,e),e)))}function bst({statusCode:t,statusMessage:e},r){let o=Ut(r,t,Ct.NUMBER),a=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return ty(r,`${o}${e?` (${e})`:""}`,a)}async function $x(t,{configuration:e,customErrorMessage:r}){try{return await t}catch(o){if(o.name!=="HTTPError")throw o;let a=r?.(o,e)??o.response.body?.error;a==null&&(o.message.startsWith("Response code")?a="The remote server failed to provide the requested resource":a=o.message),o.code==="ETIMEDOUT"&&o.event==="socket"&&(a+=`(can be increased via ${Ut(e,"httpTimeout",Ct.SETTING)})`);let n=new Jt(35,a,u=>{o.response&&u.reportError(35,` ${$u(e,{label:"Response Code",value:Yc(Ct.NO_HINT,bst(o.response,e))})}`),o.request&&(u.reportError(35,` ${$u(e,{label:"Request Method",value:Yc(Ct.NO_HINT,o.request.options.method)})}`),u.reportError(35,` ${$u(e,{label:"Request URL",value:Yc(Ct.URL,o.request.requestUrl)})}`)),o.request.redirects.length>0&&u.reportError(35,` ${$u(e,{label:"Request Redirects",value:Yc(Ct.NO_HINT,cO(e,o.request.redirects,Ct.URL))})}`),o.request.retryCount===o.request.options.retry.limit&&u.reportError(35,` ${$u(e,{label:"Request Retry Count",value:Yc(Ct.NO_HINT,`${Ut(e,o.request.retryCount,Ct.NUMBER)} (can be increased via ${Ut(e,"httpRetry",Ct.SETTING)})`)})}`)});throw n.originalError=o,n}}function lce(t,e){let r=[...e.configuration.get("networkSettings")].sort(([u],[A])=>A.length-u.length),o={enableNetwork:void 0,httpsCaFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},a=Object.keys(o),n=typeof t=="string"?new URL(t):t;for(let[u,A]of r)if(yU.default.isMatch(n.hostname,u))for(let p of a){let h=A.get(p);h!==null&&typeof o[p]>"u"&&(o[p]=h)}for(let u of a)typeof o[u]>"u"&&(o[u]=e.configuration.get(u));return o}async function H1(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u="GET",wrapNetworkRequest:A}){let p={target:t,body:e,configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u},h=async()=>await Fst(t,e,p),E=typeof A<"u"?await A(h,p):h;return await(await r.reduceHook(D=>D.wrapNetworkRequest,E,p))()}async function EU(t,{configuration:e,jsonResponse:r,customErrorMessage:o,wrapNetworkRequest:a,...n}){let u=()=>$x(H1(t,null,{configuration:e,wrapNetworkRequest:a,...n}),{configuration:e,customErrorMessage:o}).then(p=>p.body),A=await(typeof a<"u"?u():Al(nce,t,()=>u().then(p=>(nce.set(t,p),p))));return r?JSON.parse(A.toString()):A}async function kst(t,e,{customErrorMessage:r,...o}){return(await $x(H1(t,e,{...o,method:"PUT"}),{customErrorMessage:r,configuration:o.configuration})).body}async function CU(t,e,{customErrorMessage:r,...o}){return(await $x(H1(t,e,{...o,method:"POST"}),{customErrorMessage:r,configuration:o.configuration})).body}async function Qst(t,{customErrorMessage:e,...r}){return(await $x(H1(t,null,{...r,method:"DELETE"}),{customErrorMessage:e,configuration:r.configuration})).body}async function Fst(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u="GET"}){let A=typeof t=="string"?new URL(t):t,p=lce(A,{configuration:r});if(p.enableNetwork===!1)throw new Jt(80,`Request to '${A.href}' has been blocked because of your configuration settings`);if(A.protocol==="http:"&&!yU.default.isMatch(A.hostname,r.get("unsafeHttpWhitelist")))throw new Jt(81,`Unsafe http requests must be explicitly whitelisted in your configuration (${A.hostname})`);let E={agent:{http:p.httpProxy?mU.default.httpOverHttp(sce(p.httpProxy)):Pst,https:p.httpsProxy?mU.default.httpsOverHttp(sce(p.httpsProxy)):xst},headers:o,method:u};E.responseType=n?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!a&&typeof e=="string"?E.body=e:E.json=e);let w=r.get("httpTimeout"),D=r.get("httpRetry"),b=r.get("enableStrictSsl"),C=p.httpsCaFilePath,T=p.httpsCertFilePath,N=p.httpsKeyFilePath,{default:U}=await Promise.resolve().then(()=>et(rce())),J=C?await dU(C):void 0,te=T?await dU(T):void 0,le=N?await dU(N):void 0,ce=U.extend({timeout:{socket:w},retry:D,https:{rejectUnauthorized:b,certificateAuthority:J,certificate:te,key:le},...E});return r.getLimit("networkConcurrency")(()=>ce(A))}var oce,ace,yU,mU,nce,ice,Pst,xst,cce,eb=It(()=>{St();oce=ve("https"),ace=ve("http"),yU=et(Xo()),mU=et(Roe());Kl();Wl();Gl();nce=new Map,ice=new Map,Pst=new ace.Agent({keepAlive:!0}),xst=new oce.Agent({keepAlive:!0});cce=(a=>(a.GET="GET",a.PUT="PUT",a.POST="POST",a.DELETE="DELETE",a))(cce||{})});var Xi={};Vt(Xi,{availableParallelism:()=>wU,getArchitecture:()=>q1,getArchitectureName:()=>Ost,getArchitectureSet:()=>IU,getCaller:()=>Hst,major:()=>Rst,openUrl:()=>Tst});function Nst(){if(process.platform==="darwin"||process.platform==="win32")return null;let t;try{t=ae.readFileSync(Lst)}catch{}if(typeof t<"u"){if(t&&(t.includes("GLIBC")||t.includes("libc")))return"glibc";if(t&&t.includes("musl"))return"musl"}let r=(process.report?.getReport()??{}).sharedObjects??[],o=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return eh(r,a=>{let n=a.match(o);if(!n)return eh.skip;if(n[1])return"glibc";if(n[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")})??null}function q1(){return Ace=Ace??{os:process.platform,cpu:process.arch,libc:Nst()}}function Ost(t=q1()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}-${t.cpu}`}function IU(){let t=q1();return fce=fce??{os:[t.os],cpu:[t.cpu],libc:t.libc?[t.libc]:[]}}function _st(t){let e=Mst.exec(t);if(!e)return null;let r=e[2]&&e[2].indexOf("native")===0,o=e[2]&&e[2].indexOf("eval")===0,a=Ust.exec(e[2]);return o&&a!=null&&(e[2]=a[1],e[3]=a[2],e[4]=a[3]),{file:r?null:e[2],methodName:e[1]||"",arguments:r?[e[2]]:[],line:e[3]?+e[3]:null,column:e[4]?+e[4]:null}}function Hst(){let e=new Error().stack.split(` -`)[3];return _st(e)}function wU(){return typeof tb.default.availableParallelism<"u"?tb.default.availableParallelism():Math.max(1,tb.default.cpus().length)}var tb,Rst,uce,Tst,Lst,Ace,fce,Mst,Ust,rb=It(()=>{St();tb=et(ve("os"));nb();Gl();Rst=Number(process.versions.node.split(".")[0]),uce=new Map([["darwin","open"],["linux","xdg-open"],["win32","explorer.exe"]]).get(process.platform),Tst=typeof uce<"u"?async t=>{try{return await BU(uce,[t],{cwd:V.cwd()}),!0}catch{return!1}}:void 0,Lst="/usr/bin/ldd";Mst=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,Ust=/\((\S*)(?::(\d+))(?::(\d+))\)/});function xU(t,e,r,o,a){let n=b1(r);if(o.isArray||o.type==="ANY"&&Array.isArray(n))return Array.isArray(n)?n.map((u,A)=>vU(t,`${e}[${A}]`,u,o,a)):String(n).split(/,/).map(u=>vU(t,e,u,o,a));if(Array.isArray(n))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return vU(t,e,r,o,a)}function vU(t,e,r,o,a){let n=b1(r);switch(o.type){case"ANY":return wx(n);case"SHAPE":return Wst(t,e,r,o,a);case"MAP":return Yst(t,e,r,o,a)}if(n===null&&!o.isNullable&&o.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if(o.values?.includes(n))return n;let A=(()=>{if(o.type==="BOOLEAN"&&typeof n!="string")return f1(n);if(typeof n!="string")throw new Error(`Expected configuration setting "${e}" to be a string, got ${typeof n}`);let p=NP(n,{env:t.env});switch(o.type){case"ABSOLUTE_PATH":{let h=a,E=e4(r);return E&&E[0]!=="<"&&(h=V.dirname(E)),V.resolve(h,Ae.toPortablePath(p))}case"LOCATOR_LOOSE":return Pf(p,!1);case"NUMBER":return parseInt(p);case"LOCATOR":return Pf(p);case"BOOLEAN":return f1(p);default:return p}})();if(o.values&&!o.values.includes(A))throw new Error(`Invalid value, expected one of ${o.values.join(", ")}`);return A}function Wst(t,e,r,o,a){let n=b1(r);if(typeof n!="object"||Array.isArray(n))throw new it(`Object configuration settings "${e}" must be an object`);let u=bU(t,o,{ignoreArrays:!0});if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=`${e}.${A}`;if(!o.properties[A])throw new it(`Unrecognized configuration settings found: ${e}.${A} - run "yarn config -v" to see the list of settings supported in Yarn`);u.set(A,xU(t,h,p,o.properties[A],a))}return u}function Yst(t,e,r,o,a){let n=b1(r),u=new Map;if(typeof n!="object"||Array.isArray(n))throw new it(`Map configuration settings "${e}" must be an object`);if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=o.normalizeKeys?o.normalizeKeys(A):A,E=`${e}['${h}']`,w=o.valueDefinition;u.set(h,xU(t,E,p,w,a))}return u}function bU(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case"SHAPE":{if(e.isArray&&!r)return[];let o=new Map;for(let[a,n]of Object.entries(e.properties))o.set(a,bU(t,n));return o}case"MAP":return e.isArray&&!r?[]:new Map;case"ABSOLUTE_PATH":return e.default===null?null:t.projectCwd===null?Array.isArray(e.default)?e.default.map(o=>V.normalize(o)):V.isAbsolute(e.default)?V.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(o=>V.resolve(t.projectCwd,o)):V.resolve(t.projectCwd,e.default);default:return e.default}}function sb(t,e,r){if(e.type==="SECRET"&&typeof t=="string"&&r.hideSecrets)return Gst;if(e.type==="ABSOLUTE_PATH"&&typeof t=="string"&&r.getNativePaths)return Ae.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let o=[];for(let a of t)o.push(sb(a,e,r));return o}if(e.type==="MAP"&&t instanceof Map){if(t.size===0)return;let o=new Map;for(let[a,n]of t.entries()){let u=sb(n,e.valueDefinition,r);typeof u<"u"&&o.set(a,u)}return o}if(e.type==="SHAPE"&&t instanceof Map){if(t.size===0)return;let o=new Map;for(let[a,n]of t.entries()){let u=e.properties[a],A=sb(n,u,r);typeof A<"u"&&o.set(a,A)}return o}return t}function Vst(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(ob)&&(e=(0,hce.default)(e.slice(ob.length)),t[e]=r);return t}function SU(){let t=`${ob}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return PU}async function pce(t){try{return await ae.readFilePromise(t)}catch{return Buffer.of()}}async function Kst(t,e){return Buffer.compare(...await Promise.all([pce(t),pce(e)]))===0}async function Jst(t,e){let[r,o]=await Promise.all([ae.statPromise(t),ae.statPromise(e)]);return r.dev===o.dev&&r.ino===o.ino}async function Xst({configuration:t,selfPath:e}){let r=t.get("yarnPath");return t.get("ignorePath")||r===null||r===e||await zst(r,e)?null:r}var hce,Tf,gce,dce,mce,DU,qst,j1,jst,by,ob,PU,Gst,G1,yce,ab,ib,zst,ze,W1=It(()=>{St();Ol();hce=et(jK()),Tf=et(sg());Gt();gce=et(NJ()),dce=ve("module"),mce=et(lg()),DU=ve("stream");Kse();Ay();YM();VM();KM();woe();JM();Dg();Poe();vx();Wl();ah();eb();Gl();rb();bf();Io();qst=function(){if(!Tf.GITHUB_ACTIONS||!process.env.GITHUB_EVENT_PATH)return!1;let t=Ae.toPortablePath(process.env.GITHUB_EVENT_PATH),e;try{e=ae.readJsonSync(t)}catch{return!1}return!(!("repository"in e)||!e.repository||(e.repository.private??!0))}(),j1=new Set(["@yarnpkg/plugin-constraints","@yarnpkg/plugin-exec","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]),jst=new Set(["isTestEnv","injectNpmUser","injectNpmPassword","injectNpm2FaToken","zipDataEpilogue","cacheCheckpointOverride","cacheVersionOverride","lockfileVersionOverride","binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir","registry","ignoreCwd"]),by=/^(?!v)[a-z0-9._-]+$/i,ob="yarn_",PU=".yarnrc.yml",Gst="********",G1=(E=>(E.ANY="ANY",E.BOOLEAN="BOOLEAN",E.ABSOLUTE_PATH="ABSOLUTE_PATH",E.LOCATOR="LOCATOR",E.LOCATOR_LOOSE="LOCATOR_LOOSE",E.NUMBER="NUMBER",E.STRING="STRING",E.SECRET="SECRET",E.SHAPE="SHAPE",E.MAP="MAP",E))(G1||{}),yce=Ct,ab=(r=>(r.JUNCTIONS="junctions",r.SYMLINKS="symlinks",r))(ab||{}),ib={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:"STRING",default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:"ABSOLUTE_PATH",default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:"BOOLEAN",default:!1},globalFolder:{description:"Folder where all system-global files are stored",type:"ABSOLUTE_PATH",default:r4()},cacheFolder:{description:"Folder where the cache files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:"NUMBER",values:["mixed",0,1,2,3,4,5,6,7,8,9],default:0},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:"ABSOLUTE_PATH",default:"./.yarn/__virtual__"},installStatePath:{description:"Path of the file where the install state will be persisted",type:"ABSOLUTE_PATH",default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:"STRING",default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:"STRING",default:SU()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:"BOOLEAN",default:!0},cacheMigrationMode:{description:"Defines the conditions under which Yarn upgrades should cause the cache archives to be regenerated.",type:"STRING",values:["always","match-spec","required-only"],default:"always"},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:"BOOLEAN",default:UP,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:"BOOLEAN",default:lO,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:"BOOLEAN",default:Tf.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:"BOOLEAN",default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:"BOOLEAN",default:!Tf.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:"BOOLEAN",default:!0},enableTips:{description:"If true, installs will print a helpful message every day of the week",type:"BOOLEAN",default:!Tf.isCI,defaultText:""},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:"BOOLEAN",default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:"BOOLEAN",default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:"STRING",default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:"STRING",default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:"STRING",default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:"BOOLEAN",default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:"SHAPE",properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:"BOOLEAN",default:!0},enableNetwork:{description:"If false, Yarn will refuse to use the network if required to",type:"BOOLEAN",default:!0},enableOfflineMode:{description:"If true, Yarn will attempt to retrieve files and metadata from the global cache rather than the network",type:"BOOLEAN",default:!1},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:"STRING",default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:"NUMBER",default:6e4},httpRetry:{description:"Retry times on http failure",type:"NUMBER",default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:"NUMBER",default:50},taskPoolConcurrency:{description:"Maximal amount of concurrent heavy task processing",type:"NUMBER",default:wU()},taskPoolMode:{description:"Execution strategy for heavy tasks",type:"STRING",values:["async","workers"],default:"workers"},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{httpsCaFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:"BOOLEAN",default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null}}}},httpsCaFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:"BOOLEAN",default:!0},logFilters:{description:"Overrides for log levels",type:"SHAPE",isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:"STRING",default:void 0},text:{description:"Code of the texts covered by this override",type:"STRING",default:void 0},pattern:{description:"Code of the patterns covered by this override",type:"STRING",default:void 0},level:{description:"Log level override, set to null to remove override",type:"STRING",values:Object.values(HP),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:"BOOLEAN",default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:"NUMBER",default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:"STRING",default:null},enableHardenedMode:{description:"If true, automatically enable --check-resolutions --refresh-lockfile on installs",type:"BOOLEAN",default:Tf.isPR&&qst,defaultText:""},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:"BOOLEAN",default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:"BOOLEAN",default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:"BOOLEAN",default:!1},enableCacheClean:{description:"If false, disallows the `cache clean` command",type:"BOOLEAN",default:!0},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:"STRING",default:"throw"},injectEnvironmentFiles:{description:"List of all the environment files that Yarn should inject inside the process when it starts",type:"ABSOLUTE_PATH",default:[".env.yarn?"],isArray:!0},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:"MAP",valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:"SHAPE",properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:"MAP",valueDefinition:{description:"A range",type:"STRING"}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:"MAP",valueDefinition:{description:"A semver range",type:"STRING"}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:"MAP",valueDefinition:{description:"The peerDependency meta",type:"SHAPE",properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:"BOOLEAN",default:!1}}}}}}}};zst=process.platform==="win32"?Kst:Jst;ze=class t{constructor(e){this.isCI=Tf.isCI;this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.env={};this.limits=new Map;this.packageExtensions=null;this.startingCwd=e}static{this.deleteProperty=Symbol()}static{this.telemetry=null}static create(e,r,o){let a=new t(e);typeof r<"u"&&!(r instanceof Map)&&(a.projectCwd=r),a.importSettings(ib);let n=typeof o<"u"?o:r instanceof Map?r:new Map;for(let[u,A]of n)a.activatePlugin(u,A);return a}static async find(e,r,{strict:o=!0,usePathCheck:a=null,useRc:n=!0}={}){let u=Vst();delete u.rcFilename;let A=new t(e),p=await t.findRcFiles(e),h=await t.findFolderRcFile(my());h&&(p.find(Ie=>Ie.path===h.path)||p.unshift(h));let E=Soe(p.map(ue=>[ue.path,ue.data])),w=Bt.dot,D=new Set(Object.keys(ib)),b=({yarnPath:ue,ignorePath:Ie,injectEnvironmentFiles:he})=>({yarnPath:ue,ignorePath:Ie,injectEnvironmentFiles:he}),C=({yarnPath:ue,ignorePath:Ie,injectEnvironmentFiles:he,...De})=>{let Ee={};for(let[g,me]of Object.entries(De))D.has(g)&&(Ee[g]=me);return Ee},T=({yarnPath:ue,ignorePath:Ie,...he})=>{let De={};for(let[Ee,g]of Object.entries(he))D.has(Ee)||(De[Ee]=g);return De};if(A.importSettings(b(ib)),A.useWithSource("",b(u),e,{strict:!1}),E){let[ue,Ie]=E;A.useWithSource(ue,b(Ie),w,{strict:!1})}if(a){if(await Xst({configuration:A,selfPath:a})!==null)return A;A.useWithSource("",{ignorePath:!0},e,{strict:!1,overwrite:!0})}let N=await t.findProjectCwd(e);A.startingCwd=e,A.projectCwd=N;let U=Object.assign(Object.create(null),process.env);A.env=U;let J=await Promise.all(A.get("injectEnvironmentFiles").map(async ue=>{let Ie=ue.endsWith("?")?await ae.readFilePromise(ue.slice(0,-1),"utf8").catch(()=>""):await ae.readFilePromise(ue,"utf8");return(0,gce.parse)(Ie)}));for(let ue of J)for(let[Ie,he]of Object.entries(ue))A.env[Ie]=NP(he,{env:U});if(A.importSettings(C(ib)),A.useWithSource("",C(u),e,{strict:o}),E){let[ue,Ie]=E;A.useWithSource(ue,C(Ie),w,{strict:o})}let te=ue=>"default"in ue?ue.default:ue,le=new Map([["@@core",Vse]]);if(r!==null)for(let ue of r.plugins.keys())le.set(ue,te(r.modules.get(ue)));for(let[ue,Ie]of le)A.activatePlugin(ue,Ie);let ce=new Map([]);if(r!==null){let ue=new Map;for(let[De,Ee]of r.modules)ue.set(De,()=>Ee);let Ie=new Set,he=async(De,Ee)=>{let{factory:g,name:me}=vf(De);if(!g||Ie.has(me))return;let Ce=new Map(ue),fe=Z=>{if((0,dce.isBuiltin)(Z))return vf(Z);if(Ce.has(Z))return Ce.get(Z)();throw new it(`This plugin cannot access the package referenced via ${Z} which is neither a builtin, nor an exposed entry`)},ie=await zm(async()=>te(await g(fe)),Z=>`${Z} (when initializing ${me}, defined in ${Ee})`);ue.set(me,()=>ie),Ie.add(me),ce.set(me,ie)};if(u.plugins)for(let De of u.plugins.split(";")){let Ee=V.resolve(e,Ae.toPortablePath(De));await he(Ee,"")}for(let{path:De,cwd:Ee,data:g}of p)if(n&&Array.isArray(g.plugins))for(let me of g.plugins){let Ce=typeof me!="string"?me.path:me,fe=me?.spec??"",ie=me?.checksum??"";if(j1.has(fe))continue;let Z=V.resolve(Ee,Ae.toPortablePath(Ce));if(!await ae.existsPromise(Z)){if(!fe){let ht=Ut(A,V.basename(Z,".cjs"),Ct.NAME),q=Ut(A,".gitignore",Ct.NAME),nt=Ut(A,A.values.get("rcFilename"),Ct.NAME),Le=Ut(A,"https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored",Ct.URL);throw new it(`Missing source for the ${ht} plugin - please try to remove the plugin from ${nt} then reinstall it manually. This error usually occurs because ${q} is incorrect, check ${Le} to make sure your plugin folder isn't gitignored.`)}if(!fe.match(/^https?:/)){let ht=Ut(A,V.basename(Z,".cjs"),Ct.NAME),q=Ut(A,A.values.get("rcFilename"),Ct.NAME);throw new it(`Failed to recognize the source for the ${ht} plugin - please try to delete the plugin from ${q} then reinstall it manually.`)}let Se=await EU(fe,{configuration:A}),Re=Ji(Se);if(ie&&ie!==Re){let ht=Ut(A,V.basename(Z,".cjs"),Ct.NAME),q=Ut(A,A.values.get("rcFilename"),Ct.NAME),nt=Ut(A,`yarn plugin import ${fe}`,Ct.CODE);throw new it(`Failed to fetch the ${ht} plugin from its remote location: its checksum seems to have changed. If this is expected, please remove the plugin from ${q} then run ${nt} to reimport it.`)}await ae.mkdirPromise(V.dirname(Z),{recursive:!0}),await ae.writeFilePromise(Z,Se)}await he(Z,De)}}for(let[ue,Ie]of ce)A.activatePlugin(ue,Ie);if(A.useWithSource("",T(u),e,{strict:o}),E){let[ue,Ie]=E;A.useWithSource(ue,T(Ie),w,{strict:o})}return A.get("enableGlobalCache")&&(A.values.set("cacheFolder",`${A.get("globalFolder")}/cache`),A.sources.set("cacheFolder","")),A}static async findRcFiles(e){let r=SU(),o=[],a=e,n=null;for(;a!==n;){n=a;let u=V.join(n,r);if(ae.existsSync(u)){let A,p;try{p=await ae.readFilePromise(u,"utf8"),A=Vi(p)}catch{let h="";throw p?.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(h=" (in particular, make sure you list the colons after each key name)"),new it(`Parse error when loading ${u}; please check it's proper Yaml${h}`)}o.unshift({path:u,cwd:n,data:A})}a=V.dirname(n)}return o}static async findFolderRcFile(e){let r=V.join(e,mr.rc),o;try{o=await ae.readFilePromise(r,"utf8")}catch(n){if(n.code==="ENOENT")return null;throw n}let a=Vi(o);return{path:r,cwd:e,data:a}}static async findProjectCwd(e){let r=null,o=e,a=null;for(;o!==a;){if(a=o,ae.existsSync(V.join(a,mr.lockfile)))return a;ae.existsSync(V.join(a,mr.manifest))&&(r=a),o=V.dirname(a)}return r}static async updateConfiguration(e,r,o={}){let a=SU(),n=V.join(e,a),u=ae.existsSync(n)?Vi(await ae.readFilePromise(n,"utf8")):{},A=!1,p;if(typeof r=="function"){try{p=r(u)}catch{p=r({})}if(p===u)return!1}else{p=u;for(let h of Object.keys(r)){let E=u[h],w=r[h],D;if(typeof w=="function")try{D=w(E)}catch{D=w(void 0)}else D=w;E!==D&&(D===t.deleteProperty?delete p[h]:p[h]=D,A=!0)}if(!A)return!1}return await ae.changeFilePromise(n,Sa(p),{automaticNewlines:!0}),!0}static async addPlugin(e,r){r.length!==0&&await t.updateConfiguration(e,o=>{let a=o.plugins??[];if(a.length===0)return{...o,plugins:r};let n=[],u=[...r];for(let A of a){let p=typeof A!="string"?A.path:A,h=u.find(E=>E.path===p);h?(n.push(h),u=u.filter(E=>E!==h)):n.push(A)}return n.push(...u),{...o,plugins:n}})}static async updateHomeConfiguration(e){let r=my();return await t.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration<"u"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,o]of Object.entries(e))if(o!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,o),this.values.set(r,bU(this,o))}}useWithSource(e,r,o,a){try{this.use(e,r,o,a)}catch(n){throw n.message+=` (in ${Ut(this,e,Ct.PATH)})`,n}}use(e,r,o,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get("enableStrictSettings");for(let u of["enableStrictSettings",...Object.keys(r)]){let A=r[u],p=e4(A);if(p&&(e=p),typeof A>"u"||u==="plugins"||e===""&&jst.has(u))continue;if(u==="rcFilename")throw new it(`The rcFilename settings can only be set via ${`${ob}RC_FILENAME`.toUpperCase()}, not via a rc file`);let h=this.settings.get(u);if(!h){let w=my(),D=e[0]!=="<"?V.dirname(e):null;if(a&&!(D!==null?w===D:!1))throw new it(`Unrecognized or legacy configuration settings found: ${u} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(u,e);continue}if(this.sources.has(u)&&!(n||h.type==="MAP"||h.isArray&&h.concatenateValues))continue;let E;try{E=xU(this,u,A,h,o)}catch(w){throw w.message+=` in ${Ut(this,e,Ct.PATH)}`,w}if(u==="enableStrictSettings"&&e!==""){a=E;continue}if(h.type==="MAP"){let w=this.values.get(u);this.values.set(u,new Map(n?[...w,...E]:[...E,...w])),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else if(h.isArray&&h.concatenateValues){let w=this.values.get(u);this.values.set(u,n?[...w,...E]:[...E,...w]),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else this.values.set(u,E),this.sources.set(u,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:o=!1}){let a=this.get(e),n=this.settings.get(e);if(typeof n>"u")throw new it(`Couldn't find a configuration settings named "${e}"`);return sb(a,n,{hideSecrets:r,getNativePaths:o})}getSubprocessStreams(e,{header:r,prefix:o,report:a}){let n,u,A=ae.createWriteStream(e);if(this.get("enableInlineBuilds")){let p=a.createStreamReporter(`${o} ${Ut(this,"STDOUT","green")}`),h=a.createStreamReporter(`${o} ${Ut(this,"STDERR","red")}`);n=new DU.PassThrough,n.pipe(p),n.pipe(A),u=new DU.PassThrough,u.pipe(h),u.pipe(A)}else n=A,u=A,typeof r<"u"&&n.write(`${r} -`);return{stdout:n,stderr:u}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let o of r.resolvers||[])e.push(new o);return new Sg([new Ix,new ci,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let o of r.fetchers||[])e.push(new o);return new py([new hy,new gy,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let o of r.linkers||[])e.push(new o);return e}getSupportedArchitectures(){let e=q1(),r=this.get("supportedArchitectures"),o=r.get("os");o!==null&&(o=o.map(u=>u==="current"?e.os:u));let a=r.get("cpu");a!==null&&(a=a.map(u=>u==="current"?e.cpu:u));let n=r.get("libc");return n!==null&&(n=ul(n,u=>u==="current"?e.libc??ul.skip:u)),{os:o,cpu:a,libc:n}}isInteractive({interactive:e,stdout:r}){return r.isTTY?e??this.get("preferInteractive"):!1}async getPackageExtensions(){if(this.packageExtensions!==null)return this.packageExtensions;this.packageExtensions=new Map;let e=this.packageExtensions,r=(o,a,{userProvided:n=!1}={})=>{if(!Fa(o.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let u=new _t;u.load(a,{yamlCompatibilityMode:!0});let A=u1(e,o.identHash),p=[];A.push([o.range,p]);let h={status:"inactive",userProvided:n,parentDescriptor:o};for(let E of u.dependencies.values())p.push({...h,type:"Dependency",descriptor:E});for(let E of u.peerDependencies.values())p.push({...h,type:"PeerDependency",descriptor:E});for(let[E,w]of u.peerDependenciesMeta)for(let[D,b]of Object.entries(w))p.push({...h,type:"PeerDependencyMeta",selector:E,key:D,value:b})};await this.triggerHook(o=>o.registerPackageExtensions,this,r);for(let[o,a]of this.get("packageExtensions"))r(lh(o,!0),LP(a),{userProvided:!0});return e}normalizeLocator(e){return Fa(e.reference)?Ps(e,`${this.get("defaultProtocol")}${e.reference}`):by.test(e.reference)?Ps(e,`${this.get("defaultProtocol")}${e.reference}`):e}normalizeDependency(e){return Fa(e.range)?kn(e,`${this.get("defaultProtocol")}${e.range}`):by.test(e.range)?kn(e,`${this.get("defaultProtocol")}${e.range}`):e}normalizeDependencyMap(e){return new Map([...e].map(([r,o])=>[r,this.normalizeDependency(o)]))}normalizePackage(e,{packageExtensions:r}){let o=E1(e),a=r.get(e.identHash);if(typeof a<"u"){let u=e.version;if(u!==null){for(let[A,p]of a)if(nA(u,A))for(let h of p)switch(h.status==="inactive"&&(h.status="redundant"),h.type){case"Dependency":typeof o.dependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",o.dependencies.set(h.descriptor.identHash,this.normalizeDependency(h.descriptor)));break;case"PeerDependency":typeof o.peerDependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",o.peerDependencies.set(h.descriptor.identHash,h.descriptor));break;case"PeerDependencyMeta":{let E=o.peerDependenciesMeta.get(h.selector);(typeof E>"u"||!Object.hasOwn(E,h.key)||E[h.key]!==h.value)&&(h.status="active",Al(o.peerDependenciesMeta,h.selector,()=>({}))[h.key]=h.value)}break;default:tO(h)}}}let n=u=>u.scope?`${u.scope}__${u.name}`:`${u.name}`;for(let u of o.peerDependenciesMeta.keys()){let A=Zo(u);o.peerDependencies.has(A.identHash)||o.peerDependencies.set(A.identHash,kn(A,"*"))}for(let u of o.peerDependencies.values()){if(u.scope==="types")continue;let A=n(u),p=rA("types",A),h=rn(p);o.peerDependencies.has(p.identHash)||o.peerDependenciesMeta.has(h)||(o.peerDependencies.set(p.identHash,kn(p,"*")),o.peerDependenciesMeta.set(h,{optional:!0}))}return o.dependencies=new Map(Ss(o.dependencies,([,u])=>ka(u))),o.peerDependencies=new Map(Ss(o.peerDependencies,([,u])=>ka(u))),o}getLimit(e){return Al(this.limits,e,()=>(0,mce.default)(this.get(e)))}async triggerHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);n&&await n(...r)}}async triggerMultipleHooks(e,r){for(let o of r)await this.triggerHook(e,...o)}async reduceHook(e,r,...o){let a=r;for(let n of this.plugins.values()){let u=n.hooks;if(!u)continue;let A=e(u);A&&(a=await A(a,...o))}return a}async firstHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);if(!n)continue;let u=await n(...r);if(typeof u<"u")return u}return null}}});var Hr={};Vt(Hr,{EndStrategy:()=>RU,ExecError:()=>lb,PipeError:()=>Y1,execvp:()=>BU,pipevp:()=>Xc});function kg(t){return t!==null&&typeof t.fd=="number"}function kU(){}function QU(){for(let t of Qg)t.kill()}async function Xc(t,e,{cwd:r,env:o=process.env,strict:a=!1,stdin:n=null,stdout:u,stderr:A,end:p=2}){let h=["pipe","pipe","pipe"];n===null?h[0]="ignore":kg(n)&&(h[0]=n),kg(u)&&(h[1]=u),kg(A)&&(h[2]=A);let E=(0,FU.default)(t,e,{cwd:Ae.fromPortablePath(r),env:{...o,PWD:Ae.fromPortablePath(r)},stdio:h});Qg.add(E),Qg.size===1&&(process.on("SIGINT",kU),process.on("SIGTERM",QU)),!kg(n)&&n!==null&&n.pipe(E.stdin),kg(u)||E.stdout.pipe(u,{end:!1}),kg(A)||E.stderr.pipe(A,{end:!1});let w=()=>{for(let D of new Set([u,A]))kg(D)||D.end()};return new Promise((D,b)=>{E.on("error",C=>{Qg.delete(E),Qg.size===0&&(process.off("SIGINT",kU),process.off("SIGTERM",QU)),(p===2||p===1)&&w(),b(C)}),E.on("close",(C,T)=>{Qg.delete(E),Qg.size===0&&(process.off("SIGINT",kU),process.off("SIGTERM",QU)),(p===2||p===1&&C!==0)&&w(),C===0||!a?D({code:TU(C,T)}):b(new Y1({fileName:t,code:C,signal:T}))})})}async function BU(t,e,{cwd:r,env:o=process.env,encoding:a="utf8",strict:n=!1}){let u=["ignore","pipe","pipe"],A=[],p=[],h=Ae.fromPortablePath(r);typeof o.PWD<"u"&&(o={...o,PWD:h});let E=(0,FU.default)(t,e,{cwd:h,env:o,stdio:u});return E.stdout.on("data",w=>{A.push(w)}),E.stderr.on("data",w=>{p.push(w)}),await new Promise((w,D)=>{E.on("error",b=>{let C=ze.create(r),T=Ut(C,t,Ct.PATH);D(new Jt(1,`Process ${T} failed to spawn`,N=>{N.reportError(1,` ${$u(C,{label:"Thrown Error",value:Yc(Ct.NO_HINT,b.message)})}`)}))}),E.on("close",(b,C)=>{let T=a==="buffer"?Buffer.concat(A):Buffer.concat(A).toString(a),N=a==="buffer"?Buffer.concat(p):Buffer.concat(p).toString(a);b===0||!n?w({code:TU(b,C),stdout:T,stderr:N}):D(new lb({fileName:t,code:b,signal:C,stdout:T,stderr:N}))})})}function TU(t,e){let r=Zst.get(e);return typeof r<"u"?128+r:t??1}function $st(t,e,{configuration:r,report:o}){o.reportError(1,` ${$u(r,t!==null?{label:"Exit Code",value:Yc(Ct.NUMBER,t)}:{label:"Exit Signal",value:Yc(Ct.CODE,e)})}`)}var FU,RU,Y1,lb,Qg,Zst,nb=It(()=>{St();FU=et(MT());W1();Kl();Wl();RU=(o=>(o[o.Never=0]="Never",o[o.ErrorCode=1]="ErrorCode",o[o.Always=2]="Always",o))(RU||{}),Y1=class extends Jt{constructor({fileName:e,code:r,signal:o}){let a=ze.create(V.cwd()),n=Ut(a,e,Ct.PATH);super(1,`Child ${n} reported an error`,u=>{$st(r,o,{configuration:a,report:u})}),this.code=TU(r,o)}},lb=class extends Y1{constructor({fileName:e,code:r,signal:o,stdout:a,stderr:n}){super({fileName:e,code:r,signal:o}),this.stdout=a,this.stderr=n}};Qg=new Set;Zst=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]])});function Cce(t){Ece=t}function V1(){return typeof LU>"u"&&(LU=Ece()),LU}var LU,Ece,NU=It(()=>{Ece=()=>{throw new Error("Assertion failed: No libzip instance is available, and no factory was configured")}});var Ice=_((ub,MU)=>{var eot=Object.assign({},ve("fs")),OU=function(){var t=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<"u"&&(t=t||__filename),function(e){e=e||{};var r=typeof e<"u"?e:{},o,a;r.ready=new Promise(function(Je,st){o=Je,a=st});var n={},u;for(u in r)r.hasOwnProperty(u)&&(n[u]=r[u]);var A=[],p="./this.program",h=function(Je,st){throw st},E=!1,w=!0,D="";function b(Je){return r.locateFile?r.locateFile(Je,D):D+Je}var C,T,N,U;w&&(E?D=ve("path").dirname(D)+"/":D=__dirname+"/",C=function(st,vt){var ar=ia(st);return ar?vt?ar:ar.toString():(N||(N=eot),U||(U=ve("path")),st=U.normalize(st),N.readFileSync(st,vt?null:"utf8"))},T=function(st){var vt=C(st,!0);return vt.buffer||(vt=new Uint8Array(vt)),me(vt.buffer),vt},process.argv.length>1&&(p=process.argv[1].replace(/\\/g,"/")),A=process.argv.slice(2),h=function(Je){process.exit(Je)},r.inspect=function(){return"[Emscripten Module object]"});var J=r.print||console.log.bind(console),te=r.printErr||console.warn.bind(console);for(u in n)n.hasOwnProperty(u)&&(r[u]=n[u]);n=null,r.arguments&&(A=r.arguments),r.thisProgram&&(p=r.thisProgram),r.quit&&(h=r.quit);var le=0,ce=function(Je){le=Je},ue;r.wasmBinary&&(ue=r.wasmBinary);var Ie=r.noExitRuntime||!0;typeof WebAssembly!="object"&&Hi("no native wasm support detected");function he(Je,st,vt){switch(st=st||"i8",st.charAt(st.length-1)==="*"&&(st="i32"),st){case"i1":return Ke[Je>>0];case"i8":return Ke[Je>>0];case"i16":return ap((Je>>1)*2);case"i32":return Rs((Je>>2)*4);case"i64":return Rs((Je>>2)*4);case"float":return gu((Je>>2)*4);case"double":return op((Je>>3)*8);default:Hi("invalid type for getValue: "+st)}return null}var De,Ee=!1,g;function me(Je,st){Je||Hi("Assertion failed: "+st)}function Ce(Je){var st=r["_"+Je];return me(st,"Cannot call unknown function "+Je+", make sure it is exported"),st}function fe(Je,st,vt,ar,ee){var ye={string:function(Qi){var Sn=0;if(Qi!=null&&Qi!==0){var fa=(Qi.length<<2)+1;Sn=pi(fa),ht(Qi,Sn,fa)}return Sn},array:function(Qi){var Sn=pi(Qi.length);return Le(Qi,Sn),Sn}};function Ne(Qi){return st==="string"?Se(Qi):st==="boolean"?!!Qi:Qi}var gt=Ce(Je),mt=[],Dt=0;if(ar)for(var er=0;er=vt)&&xe[ar];)++ar;return Z.decode(xe.subarray(Je,ar))}function Re(Je,st,vt,ar){if(!(ar>0))return 0;for(var ee=vt,ye=vt+ar-1,Ne=0;Ne=55296&><=57343){var mt=Je.charCodeAt(++Ne);gt=65536+((gt&1023)<<10)|mt&1023}if(gt<=127){if(vt>=ye)break;st[vt++]=gt}else if(gt<=2047){if(vt+1>=ye)break;st[vt++]=192|gt>>6,st[vt++]=128|gt&63}else if(gt<=65535){if(vt+2>=ye)break;st[vt++]=224|gt>>12,st[vt++]=128|gt>>6&63,st[vt++]=128|gt&63}else{if(vt+3>=ye)break;st[vt++]=240|gt>>18,st[vt++]=128|gt>>12&63,st[vt++]=128|gt>>6&63,st[vt++]=128|gt&63}}return st[vt]=0,vt-ee}function ht(Je,st,vt){return Re(Je,xe,st,vt)}function q(Je){for(var st=0,vt=0;vt=55296&&ar<=57343&&(ar=65536+((ar&1023)<<10)|Je.charCodeAt(++vt)&1023),ar<=127?++st:ar<=2047?st+=2:ar<=65535?st+=3:st+=4}return st}function nt(Je){var st=q(Je)+1,vt=aa(st);return vt&&Re(Je,Ke,vt,st),vt}function Le(Je,st){Ke.set(Je,st)}function Te(Je,st){return Je%st>0&&(Je+=st-Je%st),Je}var ke,Ke,xe,tt,He,x,I,P,y,R;function z(Je){ke=Je,r.HEAP_DATA_VIEW=R=new DataView(Je),r.HEAP8=Ke=new Int8Array(Je),r.HEAP16=tt=new Int16Array(Je),r.HEAP32=x=new Int32Array(Je),r.HEAPU8=xe=new Uint8Array(Je),r.HEAPU16=He=new Uint16Array(Je),r.HEAPU32=I=new Uint32Array(Je),r.HEAPF32=P=new Float32Array(Je),r.HEAPF64=y=new Float64Array(Je)}var X=r.INITIAL_MEMORY||16777216,$,se=[],be=[],Fe=[],lt=!1;function Et(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)Pt(r.preRun.shift());hs(se)}function qt(){lt=!0,hs(be)}function nr(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;)Sr(r.postRun.shift());hs(Fe)}function Pt(Je){se.unshift(Je)}function cn(Je){be.unshift(Je)}function Sr(Je){Fe.unshift(Je)}var yr=0,Rr=null,Xr=null;function $n(Je){yr++,r.monitorRunDependencies&&r.monitorRunDependencies(yr)}function Xs(Je){if(yr--,r.monitorRunDependencies&&r.monitorRunDependencies(yr),yr==0&&(Rr!==null&&(clearInterval(Rr),Rr=null),Xr)){var st=Xr;Xr=null,st()}}r.preloadedImages={},r.preloadedAudios={};function Hi(Je){r.onAbort&&r.onAbort(Je),Je+="",te(Je),Ee=!0,g=1,Je="abort("+Je+"). Build with -s ASSERTIONS=1 for more info.";var st=new WebAssembly.RuntimeError(Je);throw a(st),st}var Qs="data:application/octet-stream;base64,";function Zs(Je){return Je.startsWith(Qs)}var bi="data:application/octet-stream;base64,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QCAAKAJIIgEgASADaiADEAcaAkAgAyAAKAJsIgFNBEAgACABIANrNgJsDAELIABCADcCbAsgACAAKAJoIANrIgE2AmggACAAKAJYIANrNgJYIAEgACgChC5JBEAgACABNgKELgsgAEH8gAEoAgARAwAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJoaiAFaiEFIAEgBCACazYCBAJAAkACQAJAIAEoAhwiBCgCFEEBaw4CAQACCyAEQaABaiAFIAEoAgAgAkHcgAEoAgARCAAMAgsgASABKAIwIAUgASgCACACQcSAASgCABEEADYCMAwBCyAFIAEoAgAgAhAHGgsgASABKAIAIAJqNgIAIAEgASgCCCACajYCCCAAKAI8BSAFCyACaiICNgI8AkAgACgChC4iASACakEDSQ0AIAAoAmggAWshAQJAIAAoAnRBgQhPBEAgACAAIAAoAkggAWoiAi0AACACLQABIAAoAnwRAAA2AlQMAQsgAUUNACAAIAFBAWsgACgChAERAgAaCyAAKAKELiAAKAI8IgJBAUZrIgRFDQAgACABIAQgACgCgAERBQAgACAAKAKELiAEazYChC4gACgCPCECCyACQYUCSw0AIAAoAgAoAgRFDQAgACgCMCEBDAELCwJAIAAoAkQiAiAAKAJAIgNNDQAgAAJ/IAAoAjwgACgCaGoiASADSwRAIAAoAkggAWpBACACIAFrIgNBggIgA0GCAkkbIgMQGSABIANqDAELIAFBggJqIgEgA00NASAAKAJIIANqQQAgAiADayICIAEgA2siAyACIANJGyIDEBkgACgCQCADags2AkALC50CAQF/AkAgAAJ/IAAoAqAuIgFBwABGBEAgACgCBCAAKAIQaiAAKQOYLjcAACAAQgA3A5guIAAgACgCEEEIajYCEEEADAELIAFBIE4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgE2AqAuCyABQRBOBEAgACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACAAKAKgLkEQayIBNgKgLgsgAUEISA0BIAAgACgCECIBQQFqNgIQ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KAJUIgEEfyABQQAgARAiEBkgACgCVAVBAAsQBiAAQQA2AlQLC9wMAgl/AX4jAEFAaiIGJAACQAJAAkACQAJAIAEoAjBBABAjIgVBAkZBACABKAI4QQAQIyIEQQFGGw0AIAVBAUZBACAEQQJGGw0AIAVBAkciAw0BIARBAkcNAQsgASABLwEMQYAQcjsBDEEAIQMMAQsgASABLwEMQf/vA3E7AQxBACEFIANFBEBB9eABIAEoAjAgAEEIahBpIgVFDQILIAJBgAJxBEAgBSEDDAELIARBAkcEQCAFIQMMAQtB9cYBIAEoAjggAEEIahBpIgNFBEAgBRAcDAILIAMgBTYCAAsgASABLwEMQf7/A3EgAS8BUiIFQQBHcjsBDAJAAkACQAJAAn8CQAJAIAEpAyhC/v///w9WDQAgASkDIEL+////D1YNACACQYAEcUUNASABKQNIQv////8PVA0BCyAFQYECa0H//wNxQQNJIQdBAQwBCyAFQYECa0H//wNxIQQgAkGACnFBgApHDQEgBEEDSSEHQQALIQkgBkIcEBciBEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyADEBwMBQsgAkGACHEhBQJAAkAgAkGAAnEEQAJAIAUNACABKQMgQv////8PVg0AIAEpAyhCgICAgBBUDQMLIAQgASkDKBAYIAEpAyAhDAwBCwJAAkACQCAFDQAgASkDIEL/////D1YNACABKQMoIgxC/////w9WDQEgASkDSEKAgICAEFQNBAsgASkDKCIMQv////8PVA0BCyAEIAwQGAsgASkDICIMQv////8PWgRAIAQgDBAYCyABKQNIIgxC/////w9UDQELIAQgDBAYCyAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQCCADEBwMBQtBASEKQQEgBC0AAAR+IAQpAxAFQgALp0H//wNxIAYQRyEFIAQQCCAFIAM2AgAgBw0BDAILIAMhBSAEQQJLDQELIAZCBxAXIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAcDAMLIARBAhANIARBhxJBAhAsIAQgAS0AUhBwIAQgAS8BEBANIAQtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAsgBBAIDAILQYGyAkEHIAYQRyEDIAQQCCADIAU2AgBBASEL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NgIEIABB7A42AhggGiEdDAMLIARB/wFxIgJBwABxRQRAIAggDSADLwECQQJ0aiAdp0F/IAJ0QX9zcUECdGoiAy0AASICayEIIB0gAq2IIR0gAy0AACIERQ0HDAELCyAEQSBxBEAgB0G//gA2AgQgASECDAgLIAdB0f4ANgIEIABB0A42AhggASECDAcLIB1BfyAGdEF/c62DIBt8IhunIQUgCCAEQQ9xIgNrIQggGiAErUIPg4ghHSABIBdrIgYgAjMBAiAaQX8gA3RBf3Otg3ynIgRPDQIgBCAGayIGIBlNDQEgBygCjEdFDQEgB0HR/gA2AgQgAEG5DDYCGAsgASECIAshBQwFCwJAIA5FBEAgDCARIAZraiEDDAELIAYgDk0EQCAMIA4gBmtqIQMMAQsgDCARIAYgDmsiBmtqIQMgBSAGTQ0AIAUgBmshBQJAAkAgASADTSABIA8gAWusIhogBq0iGyAaIBtUGyIapyIGaiICIANLcQ0AIAMgBmogAUsgASADT3ENACABIAMgBhAHGiACIQEMAQsgASADIAMgAWsiASABQR91IgFqIAFzIgIQByACaiEBIBogAq0iHn0iHFANACACIANqIQIDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgASACKQAANwAAIAEgAikAGDcAGCABIAIpABA3ABAgASACKQAINwAIIBpCIH0hGiACQSBqIQIgAUEgaiEBIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAEgAikAADcAACABIAIpABg3ABggASACKQAQNwAQIAEgAikACDcACCABIAIpADg3ADggASACKQAwNwAwIAEgAikAKDcAKCABIAIpACA3ACAgASACKQBYNwBYIAEgAikAUDcAUCABIAIpAEg3AEggASACKQBANwBAIAEgAikAYDcAYCABIAIpAGg3AGggASACKQBwNwBwIAEgAikAeDcAeCACQYABaiECIAFBgAFqIQEgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAEgAikAADcAACABIAIpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCABIAIpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCABIAIoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCABIAIvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCABIAItAAA6AAAgAkEBaiECIAFBAWohAQsgHEIAUg0ACwsgDiEGIAwhAwsgBSAGSwRAAkACQCABIANNIAEgDyABa6wiGiAGrSIbIBogG1QbIhqnIglqIgIgA0txDQAgAyAJaiABSyABIANPcQ0AIAEgAyAJEAcaDAELIAEgAyADIAFrIgEgAUEfdSIBaiABcyIBEAcgAWohAiAaIAGtIh59IhxQDQAgASADaiEBA0ACQCAcIB4gHCAeVBsiG0IgVARAIBshGgwBCyAbIhpCIH0iIEIFiEIBfEIDgyIfUEUEQANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCAaQiB9IRogAUEgaiEBIAJBIGohAiAfQgF9Ih9CAFINAAsLICBC4ABUDQADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggAiABKQA4NwA4IAIgASkAMDcAMCACIAEpACg3ACggAiABKQAgNwAgIAIgASkAWDcAWCACIAEpAFA3AFAgAiABKQBINwBIIAIgASkAQDcAQCACIAEpAGA3AGAgAiABKQBoNwBoIAIgASkAcDcAcCACIAEpAHg3AHggAUGAAWohASACQYABaiECIBpCgAF9IhpCH1YNAAsLIBpCEFoEQCACIAEpAAA3AAAgAiABKQAINwAIIBpCEH0hGiACQRBqIQIgAUEQaiEBCyAaQghaBEAgAiABKQAANwAAIBpCCH0hGiACQQhqIQIgAUEIaiEBCyAaQgRaBEAgAiABKAAANgAAIBpCBH0hGiACQQRqIQIgAUEEaiEBCyAaQgJaBEAgAiABLwAAOwAAIBpCAn0hGiACQQJqIQIgAUECaiEBCyAcIBt9IRwgGlBFBEAgAiABLQAAOgAAIAJBAWohAiABQQFqIQELIBxCAFINAAsLIAUgBmshAUEAIARrIQUCQCAEQQdLBEAgBCEDDAELIAEgBE0EQCAEIQMMAQsgAiAEayEFA0ACQCACIAUpAAA3AAAgBEEBdCEDIAEgBGshASACIARqIQIgBEEDSw0AIAMhBCABIANLDQELC0EAIANrIQULIAIgBWohBAJAIAUgDyACa6wiGiABrSIbIBogG1QbIhqnIgFIIAVBf0pxDQAgBUEBSCABIARqIAJLcQ0AIAIgBCABEAcgAWohAgwDCyACIAQgAyADQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANAiABIARqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAILAkAgASADTSABIA8gAWusIhogBa0iGyAaIBtUGyIapyIEaiICIANLcQ0AIAMgBGogAUsgASADT3ENACABIAMgBBAHGgwCCyABIAMgAyABayIBIAFBH3UiAWogAXMiARAHIAFqIQIgGiABrSIefSIcUA0BIAEgA2ohAQNAAkAgHCAeIBwgHlQbIhtCIFQEQCAbIRoMAQsgGyIaQiB9IiBCBYhCAXxCA4MiH1BFBEADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggGkIgfSEaIAFBIGohASACQSBqIQIgH0IBfSIfQgBSDQALCyAgQuAAVA0AA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIAIgASkAODcAOCACIAEpADA3ADAgAiABKQAoNwAoIAIgASkAIDcAICACIAEpAFg3AFggAiABKQBQNwBQIAIgASkASDcASCACIAEpAEA3AEAgAiABKQBgNwBgIAIgASkAaDcAaCACIAEpAHA3AHAgAiABKQB4NwB4IAFBgAFqIQEgAkGAAWohAiAaQoABfSIaQh9WDQALCyAaQhBaBEAgAiABKQAANwAAIAIgASkACDcACCAaQhB9IRogAkEQaiECIAFBEGohAQsgGkIIWgRAIAIgASkAADcAACAaQgh9IRogAkEIaiECIAFBCGohAQsgGkIEWgRAIAIgASgAADYAACAaQgR9IRogAkEEaiECIAFBBGohAQsgGkICWgRAIAIgAS8AADsAACAaQgJ9IRogAkECaiECIAFBAmohAQsgHCAbfSEcIBpQRQRAIAIgAS0AADoAACACQQFqIQIgAUEBaiEBCyAcUEUNAAsMAQsCQAJAIBYEQAJAIAQgBUkEQCAHKAKYRyAESw0BCyABIARrIQMCQEEAIARrIgVBf0ogDyABa6wiGiAbIBogG1QbIhqnIgIgBUpxDQAgBUEBSCACIANqIAFLcQ0AIAEgAyACEAcgAmohAgwFCyABIAMgBCAEQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANBCABIANqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAQLIBAgAWsiCUEBaiIGIAUgBSAGSxshAyABIARrIQIgAUEHcUUNAiADRQ0CIAEgAi0AADoAACACQQFqIQIgAUEBaiIGQQdxQQAgA0EBayIFGw0BIAYhASAFIQMgCSEGDAILAkAgBCAFSQRAIAcoAphHIARLDQELIAEgASAEayIGKQAANwAAIAEgBUEBa0EHcUEBaiIDaiECIAUgA2siBEUNAyADIAZqIQEDQCACIAEpAAA3AAAgAUEIaiEBIAJBCGohAiAEQQhrIgQNAAsMAwsgASAEIAUQPyECDAILIAEgAi0AADoAASAJQQFrIQYgA0ECayEFIAJBAWohAgJAIAFBAmoiCkEHcUUNACAFRQ0AIAEgAi0AADoAAiAJQQJrIQYgA0EDayEFIAJBAWohAgJAIAFBA2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAAyAJQQNrIQYgA0EEayEFIAJBAWohAgJAIAFBBGoiCkEHcUUNACAFRQ0AIAEgAi0AADoABCAJQQRrIQYgA0EFayEFIAJBAWohAgJAIAFBBWoiCkEHcUUNACAFRQ0AIAEgAi0AADoABSAJQQVrIQYgA0EGayEFIAJBAWohAgJAIAFBBmoiCkEHcUUNACAFRQ0AIAEgAi0AADoABiAJQQZrIQYgA0EHayEFIAJBAWohAgJAIAFBB2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAByAJQQdrIQYgA0EIayEDIAFBCGohASACQQFqIQIMBgsgCiEBIAUhAwwFCyAKIQEgBSEDDAQLIAohASAFIQMMAwsgCiEBIAUhAwwCCyAKIQEgBSEDDAELIAohASAFIQMLAkACQCAGQRdNBEAgA0UNASADQQFrIQUgA0EHcSIEBEADQCABIAItAAA6AAAgA0EBayEDIAFBAWohASACQQFqIQIgBEEBayIEDQALCyAFQQdJDQEDQCABIAItAAA6AAAgASACLQABOgABIAEgAi0AAjoAAiABIAItAAM6AAMgASACLQAEOgAEIAEgAi0ABToABSABIAItAAY6AAYgASACLQAHOgAHIAFBCGohASACQQhqIQIgA0EIayIDDQALDAELIAMNAQsgASECDAELIAEgBCADED8hAgsgCyEFDAELIAEgAy0AAjoAACABQQFqIQILIAUgFE8NACACIBNJDQELCyAAIAI2AgwgACAFIAhBA3ZrIgE2AgAgACATIAJrQYMCajYCECAAIBQgAWtBDmo2AgQgByAIQQdxIgA2AogBIAcgHUJ/IACthkJ/hYM+AoQBC+cFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsi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CyAAIAMtAAAEfiADKQMQBUIAC6dB//8DcSADKAIEEEcLIQUgAxAICyAEQRBqJAAgBQvgAQICfwF+QTAQCSICRQRAIAEEQCABQQA2AgQgAUEONgIAC0EADwsgAkIANwMIIAJBADYCACACQgA3AxAgAkIANwMYIAJCADcDICACQgA3ACUgAFAEQCACDwsCQCAAQv////8AVg0AIACnQQR0EAkiA0UNACACIAM2AgBBACEBQgEhBANAIAMgAUEEdGoiAUIANwIAIAFCADcABSAAIARSBEAgBKchASAEQgF8IQQMAQsLIAIgADcDCCACIAA3AxAgAg8LIAEEQCABQQA2AgQgAUEONgIAC0EAEBAgAhAGQQAL7gECA38BfiMAQRBrIgQkAAJAIARBDGpCBBAXIgNFBEBBfyECDAELAkAgAQRAIAJBgAZxIQUDQAJAIAUgASgCBHFFDQACQCADKQMIQgBUBEAgA0EAOgAADAELIANCADcDECADQQE6AAALIAMgAS8BCBANIAMgAS8BChANIAMtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAtBfyECDAQLQX8hAiAAIARBDGpCBBAbQQBIDQMgATMBCiIGUA0AIAAgASgCDCAGEBtBAEgNAwsgASgCACIBDQALC0EAIQILIAMQCAsgBEEQaiQAIAILPAEBfyAABEAgAUGABnEhAQNAIAEgACgCBHEEQCACIAAvAQpqQQRqIQILIAAoAgAiAA0ACwsgAkH//wNxC5wBAQN/IABFBEBBAA8LIAAhAwNAAn8CQAJAIAAvAQgiAUH04AFNBEAgAUEBRg0BIAFB9cYBRg0BDAILIAFBgbICRg0AIAFB9eABRw0BCyAAKAIAIQEgAEEANgIAIAAoAgwQBiAAEAYgASADIAAgA0YbIQMCQCACRQRAQQAhAgwBCyACIAE2AgALIAEMAQsgACICKAIACyIADQALIAMLsgQCBX8BfgJAAkACQCAAIAGtEBciAQRAIAEtAAANAUEAIQAMAgsgBARAIARBADYCBCAEQQ42AgALQQAPC0EAIQADQCABLQAABH4gASkDCCABKQMQfQVCAAtCBFQNASABEAwhByABIAEQDCIGrRATIghFBEBBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAwNAIAAoAgAhASAAKAIMEAYg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DCAAQRg2AggLDAMLIAAgBiAFLwFqQQAgBCABEQYAIQEgBhALIAFFDQILAkAgDUUEQCABIQMMAQsgACABIAUvAWgQgQEhAyABEAsgA0UNAQsCQCAJRSAMckUEQCADIQEMAQsgACADQQEQgAEhASADEAsgAUUNAQsgASEDDAELQQAhAwsgBUHwAGokACADC4UBAQF/IAFFBEAgAEEIaiIABEAgAEEANgIEIABBEjYCAAtBAA8LQTgQCSIDRQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALQQAPCyADQQA2AhAgA0IANwIIIANCADcDKCADQQA2AgQgAyACNgIAIANCADcDGCADQQA2AjAgACABQTsgAxBCCw8AIAAgASACQQBBABCCAQusAgECfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPCwJAIAJBfUsNACACQf//A3FBCEYNACAAQQhqIgAEQCAAQQA2AgQgAEEQNgIAC0EADwsCQEGwwAAQCSIFBEAgBUEANgIIIAVCADcCACAFQYiBAUGogQEgAxs2AqhAIAUgAjYCFCAFIAM6ABAgBUEAOgAPIAVBADsBDCAFIAMgAkF9SyIGcToADiAFQQggAiAGG0H//wNxIAQgBUGIgQFBqIEBIAMbKAIAEQAAIgI2AqxAIAINASAFEDEgBRAGCyAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgACABQTogBRBCIgAEfyAABSAFKAKsQCAFKAKoQCgCBBEDACAFEDEgBRAGQQALC6ABAQF/IAIgACgCBCIDIAIgA0kbIgIEQCAAIAMgAms2AgQCQAJAAkACQCAAKAIcIgMoAhRBAWsOAgEAAgsgA0GgAWogASAAKAIAIAJB3IABKAIAEQgADAILIAAgACgCMCABIAAoAgAgAkHEgAEoAgARBAA2AjAMAQsgASAAKAIAIAIQBxoLIAAgACgCACACajYCACAAIAAoAgggAmo2AggLC7cCAQR/QX4hAgJAIABFDQAgACgCIEUNACAAKAIkIgRFDQAgACgCHCIBRQ0AIAEoAgAgAEcNAAJAAkAgASgCICIDQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyADQZoFRg0AIANBKkcN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DCABajYCDCAGIAYoAgggAWo2AgggBSAFKAIUIAFqNgIUIAUgBSgCECABazYCECAGIAYoAhAgAWsiATYCECABDQAgBiAGKAIENgIIC0EAIQRBACEJIAMoAhBFDQAMCgsgAygCHCgCJCEGIAMgAygCGCIBQQFqNgIYIAEgBmotAAAhASADIARBAWo2AhAgAygCBCAEaiABOgAAIAEEQCADKAIQIQQMAQsLIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0HnADYCIAsCQCADKAIcKAIsBEAgAygCDCADKAIQIgFBAmpJBH8gBRAKIAMoAhANAkEABSABCyADKAIEaiAFKAIwOwAAIAMgAygCEEECajYCECADQaABakHkgAEoAgARAQAaCyADQfEANgIgIAUQCiADKAIQRQ0BDAcLDAYLIAUoAgQNAQsgAygCPA0AIApFDQEgAygCIEGaBUYNAQsCfyADKAKIASIBRQRAIAMgChCFAQwBCwJAAkACQCADKAKMAUECaw4CAAECCwJ/AkADQAJAAkAgAygCPA0AIAMQLyADKAI8DQAgCg0BQQAMBAsgAygCSCADKAJoai0AACEEIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qQQA6AAAgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtaiAEOgAAIAMgBEECdGoiASABLwHkAUEBajsB5AEgAyADKAI8QQFrNgI8IAMgAygCaEEBaiIBNgJoIAMoAvAtIAMoAvQtRw0BQQAhBCADIAMoAlgiBkEATgR/IAMoAkggBmoFQQALIAEgBmtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEA0BDAILCyADQQA2AoQuIApBBEYEQCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBARAPIAMgAygCaDYCWCADKAIAEApBA0ECIAMoAgAoAhAbDAILIAMoAvAtBEBBACEEIAMgAygCWCIBQQBOBH8gAygCSCABagVBAAsgAygCaCABa0EAEA8gAyADKAJoNgJYIAMoAgAQCiADKAIAKAIQRQ0BC0EBIQQLIAQL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bGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGludmFsaWQgZGlzdGFuY2VzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AEZpbGUgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocwAlcyVzJXMAYnVmZmVyIGVycm9yAE5vIGVycm9yAHN0cmVhbSBlcnJvcgBUZWxsIGVycm9yAEludGVybmFsIGVycm9yAFNlZWsgZXJyb3IAV3JpdGUgZXJyb3IAZmlsZSBlcnJvcgBSZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoADEuMi4xMy56bGliLW5nAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRl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UgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkA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SXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AQcCAAQuFARMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAgERQADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAQfSCAQsCXEQAQbCDAQsQ/////////////////////w==";Zs(bi)||(bi=b(bi));function Fs(Je){try{if(Je==bi&&ue)return new Uint8Array(ue);var st=ia(Je);if(st)return st;if(T)return T(Je);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(vt){Hi(vt)}}function $s(Je,st){var vt,ar,ee;try{ee=Fs(Je),ar=new WebAssembly.Module(ee),vt=new WebAssembly.Instance(ar,st)}catch(Ne){var ye=Ne.toString();throw te("failed to compile wasm module: "+ye),(ye.includes("imported Memory")||ye.includes("memory import"))&&te("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),Ne}return[vt,ar]}function PA(){var Je={a:dc};function st(ee,ye){var Ne=ee.exports;r.asm=Ne,De=r.asm.g,z(De.buffer),$=r.asm.W,cn(r.asm.h),Xs("wasm-instantiate")}if($n("wasm-instantiate"),r.instantiateWasm)try{var vt=r.instantiateWasm(Je,st);return vt}catch(ee){return te("Module.instantiateWasm callback failed with error: "+ee),!1}var ar=$s(bi,Je);return st(ar[0]),r.asm}function gu(Je){return R.getFloat32(Je,!0)}function op(Je){return R.getFloat64(Je,!0)}function ap(Je){return R.getInt16(Je,!0)}function Rs(Je){return R.getInt32(Je,!0)}function Nn(Je,st){R.setInt32(Je,st,!0)}function hs(Je){for(;Je.length>0;){var st=Je.shift();if(typeof st=="function"){st(r);continue}var vt=st.func;typeof vt=="number"?st.arg===void 0?$.get(vt)():$.get(vt)(st.arg):vt(st.arg===void 0?null:st.arg)}}function Ts(Je,st){var vt=new Date(Rs((Je>>2)*4)*1e3);Nn((st>>2)*4,vt.getUTCSeconds()),Nn((st+4>>2)*4,vt.getUTCMinutes()),Nn((st+8>>2)*4,vt.getUTCHours()),Nn((st+12>>2)*4,vt.getUTCDate()),Nn((st+16>>2)*4,vt.getUTCMonth()),Nn((st+20>>2)*4,vt.getUTCFullYear()-1900),Nn((st+24>>2)*4,vt.getUTCDay()),Nn((st+36>>2)*4,0),Nn((st+32>>2)*4,0);var ar=Date.UTC(vt.getUTCFullYear(),0,1,0,0,0,0),ee=(vt.getTime()-ar)/(1e3*60*60*24)|0;return Nn((st+28>>2)*4,ee),Ts.GMTString||(Ts.GMTString=nt("GMT")),Nn((st+40>>2)*4,Ts.GMTString),st}function pc(Je,st){return Ts(Je,st)}function hc(Je,st,vt){xe.copyWithin(Je,st,st+vt)}function gc(Je){try{return De.grow(Je-ke.byteLength+65535>>>16),z(De.buffer),1}catch{}}function xA(Je){var st=xe.length;Je=Je>>>0;var vt=2147483648;if(Je>vt)return!1;for(var ar=1;ar<=4;ar*=2){var ee=st*(1+.2/ar);ee=Math.min(ee,Je+100663296);var ye=Math.min(vt,Te(Math.max(Je,ee),65536)),Ne=gc(ye);if(Ne)return!0}return!1}function bA(Je){ce(Je)}function Ro(Je){var st=Date.now()/1e3|0;return Je&&Nn((Je>>2)*4,st),st}function To(){if(To.called)return;To.called=!0;var Je=new Date().getFullYear(),st=new Date(Je,0,1),vt=new Date(Je,6,1),ar=st.getTimezoneOffset(),ee=vt.getTimezoneOffset(),ye=Math.max(ar,ee);Nn((ja()>>2)*4,ye*60),Nn((rs()>>2)*4,+(ar!=ee));function Ne(sn){var ei=sn.toTimeString().match(/\(([A-Za-z ]+)\)$/);return ei?ei[1]:"GMT"}var gt=Ne(st),mt=Ne(vt),Dt=nt(gt),er=nt(mt);ee>2)*4,Dt),Nn((Di()+4>>2)*4,er)):(Nn((Di()>>2)*4,er),Nn((Di()+4>>2)*4,Dt))}function kA(Je){To();var st=Date.UTC(Rs((Je+20>>2)*4)+1900,Rs((Je+16>>2)*4),Rs((Je+12>>2)*4),Rs((Je+8>>2)*4),Rs((Je+4>>2)*4),Rs((Je>>2)*4),0),vt=new Date(st);Nn((Je+24>>2)*4,vt.getUTCDay());var ar=Date.UTC(vt.getUTCFullYear(),0,1,0,0,0,0),ee=(vt.getTime()-ar)/(1e3*60*60*24)|0;return Nn((Je+28>>2)*4,ee),vt.getTime()/1e3|0}var pr=typeof atob=="function"?atob:function(Je){var st="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",vt="",ar,ee,ye,Ne,gt,mt,Dt,er=0;Je=Je.replace(/[^A-Za-z0-9\+\/\=]/g,"");do Ne=st.indexOf(Je.charAt(er++)),gt=st.indexOf(Je.charAt(er++)),mt=st.indexOf(Je.charAt(er++)),Dt=st.indexOf(Je.charAt(er++)),ar=Ne<<2|gt>>4,ee=(gt&15)<<4|mt>>2,ye=(mt&3)<<6|Dt,vt=vt+String.fromCharCode(ar),mt!==64&&(vt=vt+String.fromCharCode(ee)),Dt!==64&&(vt=vt+String.fromCharCode(ye));while(er0||(Et(),yr>0))return;function st(){Dn||(Dn=!0,r.calledRun=!0,!Ee&&(qt(),o(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),nr()))}r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),st()},1)):st()}if(r.run=Pl,r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return Pl(),e}}();typeof ub=="object"&&typeof MU=="object"?MU.exports=OU:typeof define=="function"&&define.amd?define([],function(){return OU}):typeof ub=="object"&&(ub.createModule=OU)});var Lf,wce,Bce,vce=It(()=>{Lf=["number","number"],wce=(Z=>(Z[Z.ZIP_ER_OK=0]="ZIP_ER_OK",Z[Z.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",Z[Z.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",Z[Z.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",Z[Z.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",Z[Z.ZIP_ER_READ=5]="ZIP_ER_READ",Z[Z.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",Z[Z.ZIP_ER_CRC=7]="ZIP_ER_CRC",Z[Z.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",Z[Z.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",Z[Z.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",Z[Z.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",Z[Z.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",Z[Z.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",Z[Z.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",Z[Z.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",Z[Z.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",Z[Z.ZIP_ER_EOF=17]="ZIP_ER_EOF",Z[Z.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",Z[Z.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",Z[Z.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",Z[Z.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",Z[Z.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",Z[Z.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",Z[Z.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",Z[Z.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",Z[Z.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",Z[Z.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",Z[Z.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",Z[Z.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",Z[Z.ZIP_ER_TELL=30]="ZIP_ER_TELL",Z[Z.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA",Z))(wce||{}),Bce=t=>({get HEAPU8(){return t.HEAPU8},errors:wce,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_EXCL:2,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint32S:t._malloc(4),malloc:t._malloc,free:t._free,getValue:t.getValue,openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...Lf,"number","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...Lf,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...Lf,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...Lf,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...Lf,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...Lf,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number",...Lf,"number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...Lf,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...Lf,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"])},struct:{statS:t.cwrap("zipstruct_statS","number",[]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}})});function UU(t,e){let r=t.indexOf(e);if(r<=0)return null;let o=r;for(;r>=0&&(o=r+e.length,t[o]!==V.sep);){if(t[r-1]===V.sep)return null;r=t.indexOf(e,o)}return t.length>o&&t[o]!==V.sep?null:t.slice(0,o)}var iA,Dce=It(()=>{St();St();sA();iA=class t extends Gp{static async openPromise(e,r){let o=new t(r);try{return await e(o)}finally{o.saveAndClose()}}constructor(e={}){let r=e.fileExtensions,o=e.readOnlyArchives,a=typeof r>"u"?A=>UU(A,".zip"):A=>{for(let p of r){let h=UU(A,p);if(h)return h}return null},n=(A,p)=>new Zi(p,{baseFs:A,readOnly:o,stats:A.statSync(p)}),u=async(A,p)=>{let h={baseFs:A,readOnly:o,stats:await A.statPromise(p)};return()=>new Zi(p,h)};super({...e,factorySync:n,factoryPromise:u,getMountPoint:a})}}});function tot(t){if(typeof t=="string"&&String(+t)===t)return+t;if(typeof t=="number"&&Number.isFinite(t))return t<0?Date.now()/1e3:t;if(Sce.types.isDate(t))return t.getTime()/1e3;throw new Error("Invalid time")}function Ab(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var ta,_U,Sce,HU,Pce,fb,Zi,qU=It(()=>{St();St();St();St();St();St();ta=ve("fs"),_U=ve("stream"),Sce=ve("util"),HU=et(ve("zlib"));NU();Pce="mixed";fb=class extends Error{constructor(e,r){super(e),this.name="Libzip Error",this.code=r}},Zi=class extends qu{constructor(r,o={}){super();this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;let a=o;if(this.level=typeof a.level<"u"?a.level:Pce,r??=Ab(),typeof r=="string"){let{baseFs:A=new _n}=a;this.baseFs=A,this.path=r}else this.path=null,this.baseFs=null;if(o.stats)this.stats=o.stats;else if(typeof r=="string")try{this.stats=this.baseFs.statSync(r)}catch(A){if(A.code==="ENOENT"&&a.create)this.stats=wa.makeDefaultStats();else throw A}else this.stats=wa.makeDefaultStats();this.libzip=V1();let n=this.libzip.malloc(4);try{let A=0;o.readOnly&&(A|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof r=="string"&&(r=a.create?Ab():this.baseFs.readFileSync(r));let p=this.allocateUnattachedSource(r);try{this.zip=this.libzip.openFromSource(p,A,n),this.lzSource=p}catch(h){throw this.libzip.source.free(p),h}if(this.zip===0){let h=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(h,this.libzip.getValue(n,"i32")),this.makeLibzipError(h)}}finally{this.libzip.free(n)}this.listings.set(Bt.root,new Set);let u=this.libzip.getNumEntries(this.zip,0);for(let A=0;Ar)throw new Error("Overread");let n=Buffer.from(this.libzip.HEAPU8.subarray(o,o+r));return process.env.YARN_IS_TEST_ENV&&process.env.YARN_ZIP_DATA_EPILOGUE&&(n=Buffer.concat([n,Buffer.from(process.env.YARN_ZIP_DATA_EPILOGUE)])),n}finally{this.libzip.free(o)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.readOnly){this.discardAndClose();return}let r=this.baseFs.existsSync(this.path)||this.stats.mode===wa.DEFAULT_MODE?void 0:this.stats.mode;this.baseFs.writeFileSync(this.path,this.getBufferAndClose(),{mode:r}),this.ready=!1}resolve(r){return V.resolve(Bt.root,r)}async openPromise(r,o,a){return this.openSync(r,o,a)}openSync(r,o,a){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:r}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(r,o){return this.opendirSync(r,o)}opendirSync(r,o={}){let a=this.resolveFilename(`opendir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`opendir '${r}'`);let n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`opendir '${r}'`);let u=[...n],A=this.openSync(a,"r");return eS(this,a,u,{onClose:()=>{this.closeSync(A)}})}async readPromise(r,o,a,n,u){return this.readSync(r,o,a,n,u)}readSync(r,o,a=0,n=o.byteLength,u=-1){let A=this.fds.get(r);if(typeof A>"u")throw sr.EBADF("read");let p=u===-1||u===null?A.cursor:u,h=this.readFileSync(A.p);h.copy(o,a,p,p+n);let E=Math.max(0,Math.min(h.length-p,n));return(u===-1||u===null)&&(A.cursor+=E),E}async writePromise(r,o,a,n,u){return typeof o=="string"?this.writeSync(r,o,u):this.writeSync(r,o,a,n,u)}writeSync(r,o,a,n,u){throw typeof this.fds.get(r)>"u"?sr.EBADF("read"):new Error("Unimplemented")}async closePromise(r){return this.closeSync(r)}closeSync(r){if(typeof this.fds.get(r)>"u")throw sr.EBADF("read");this.fds.delete(r)}createReadStream(r,{encoding:o}={}){if(r===null)throw new Error("Unimplemented");let a=this.openSync(r,"r"),n=Object.assign(new _U.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(A,p)=>{clearImmediate(u),this.closeSync(a),p(A)}}),{close(){n.destroy()},bytesRead:0,path:r,pending:!1}),u=setImmediate(async()=>{try{let A=await this.readFilePromise(r,o);n.bytesRead=A.length,n.end(A)}catch(A){n.destroy(A)}});return n}createWriteStream(r,{encoding:o}={}){if(this.readOnly)throw sr.EROFS(`open '${r}'`);if(r===null)throw new Error("Unimplemented");let a=[],n=this.openSync(r,"w"),u=Object.assign(new _U.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(A,p)=>{try{A?p(A):(this.writeFileSync(r,Buffer.concat(a),o),p(null))}catch(h){p(h)}finally{this.closeSync(n)}}}),{close(){u.destroy()},bytesWritten:0,path:r,pending:!1});return u.on("data",A=>{let p=Buffer.from(A);u.bytesWritten+=p.length,a.push(p)}),u}async realpathPromise(r){return this.realpathSync(r)}realpathSync(r){let o=this.resolveFilename(`lstat '${r}'`,r);if(!this.entries.has(o)&&!this.listings.has(o))throw sr.ENOENT(`lstat '${r}'`);return o}async existsPromise(r){return this.existsSync(r)}existsSync(r){if(!this.ready)throw sr.EBUSY(`archive closed, existsSync '${r}'`);if(this.symlinkCount===0){let a=V.resolve(Bt.root,r);return this.entries.has(a)||this.listings.has(a)}let o;try{o=this.resolveFilename(`stat '${r}'`,r,void 0,!1)}catch{return!1}return o===void 0?!1:this.entries.has(o)||this.listings.has(o)}async accessPromise(r,o){return this.accessSync(r,o)}accessSync(r,o=ta.constants.F_OK){let a=this.resolveFilename(`access '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`access '${r}'`);if(this.readOnly&&o&ta.constants.W_OK)throw sr.EROFS(`access '${r}'`)}async statPromise(r,o={bigint:!1}){return o.bigint?this.statSync(r,{bigint:!0}):this.statSync(r)}statSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`stat '${r}'`,r,void 0,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw sr.ENOENT(`stat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw sr.ENOTDIR(`stat '${r}'`);return this.statImpl(`stat '${r}'`,a,o)}}async fstatPromise(r,o){return this.fstatSync(r,o)}fstatSync(r,o){let a=this.fds.get(r);if(typeof a>"u")throw sr.EBADF("fstatSync");let{p:n}=a,u=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(u)&&!this.listings.has(u))throw sr.ENOENT(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(u))throw sr.ENOTDIR(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,u,o)}async lstatPromise(r,o={bigint:!1}){return o.bigint?this.lstatSync(r,{bigint:!0}):this.lstatSync(r)}lstatSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`lstat '${r}'`,r,!1,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw sr.ENOENT(`lstat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw sr.ENOTDIR(`lstat '${r}'`);return this.statImpl(`lstat '${r}'`,a,o)}}statImpl(r,o,a={}){let n=this.entries.get(o);if(typeof n<"u"){let u=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,u)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let p=this.stats.uid,h=this.stats.gid,E=this.libzip.struct.statSize(u)>>>0,w=512,D=Math.ceil(E/w),b=(this.libzip.struct.statMtime(u)>>>0)*1e3,C=b,T=b,N=b,U=new Date(C),J=new Date(T),te=new Date(N),le=new Date(b),ce=this.listings.has(o)?ta.constants.S_IFDIR:this.isSymbolicLink(n)?ta.constants.S_IFLNK:ta.constants.S_IFREG,ue=ce===ta.constants.S_IFDIR?493:420,Ie=ce|this.getUnixMode(n,ue)&511,he=this.libzip.struct.statCrc(u),De=Object.assign(new wa.StatEntry,{uid:p,gid:h,size:E,blksize:w,blocks:D,atime:U,birthtime:J,ctime:te,mtime:le,atimeMs:C,birthtimeMs:T,ctimeMs:N,mtimeMs:b,mode:Ie,crc:he});return a.bigint===!0?wa.convertToBigIntStats(De):De}if(this.listings.has(o)){let u=this.stats.uid,A=this.stats.gid,p=0,h=512,E=0,w=this.stats.mtimeMs,D=this.stats.mtimeMs,b=this.stats.mtimeMs,C=this.stats.mtimeMs,T=new Date(w),N=new Date(D),U=new Date(b),J=new Date(C),te=ta.constants.S_IFDIR|493,ce=Object.assign(new wa.StatEntry,{uid:u,gid:A,size:p,blksize:h,blocks:E,atime:T,birthtime:N,ctime:U,mtime:J,atimeMs:w,birthtimeMs:D,ctimeMs:b,mtimeMs:C,mode:te,crc:0});return a.bigint===!0?wa.convertToBigIntStats(ce):ce}throw new Error("Unreachable")}getUnixMode(r,o){if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?o:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(r){let o=this.listings.get(r);if(o)return o;this.registerListing(V.dirname(r)).add(V.basename(r));let n=new Set;return this.listings.set(r,n),n}registerEntry(r,o){this.registerListing(V.dirname(r)).add(V.basename(r)),this.entries.set(r,o)}unregisterListing(r){this.listings.delete(r),this.listings.get(V.dirname(r))?.delete(V.basename(r))}unregisterEntry(r){this.unregisterListing(r);let o=this.entries.get(r);this.entries.delete(r),!(typeof o>"u")&&(this.fileSources.delete(o),this.isSymbolicLink(o)&&this.symlinkCount--)}deleteEntry(r,o){if(this.unregisterEntry(r),this.libzip.delete(this.zip,o)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(r,o,a=!0,n=!0){if(!this.ready)throw sr.EBUSY(`archive closed, ${r}`);let u=V.resolve(Bt.root,o);if(u==="/")return Bt.root;let A=this.entries.get(u);if(a&&A!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(A)){let p=this.getFileSource(A).toString();return this.resolveFilename(r,V.resolve(V.dirname(u),p),!0,n)}else return u;for(;;){let p=this.resolveFilename(r,V.dirname(u),!0,n);if(p===void 0)return p;let h=this.listings.has(p),E=this.entries.has(p);if(!h&&!E){if(n===!1)return;throw sr.ENOENT(r)}if(!h)throw sr.ENOTDIR(r);if(u=V.resolve(p,V.basename(u)),!a||this.symlinkCount===0)break;let w=this.libzip.name.locate(this.zip,u.slice(1),0);if(w===-1)break;if(this.isSymbolicLink(w)){let D=this.getFileSource(w).toString();u=V.resolve(V.dirname(u),D)}else break}return u}allocateBuffer(r){Buffer.isBuffer(r)||(r=Buffer.from(r));let o=this.libzip.malloc(r.byteLength);if(!o)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,o,r.byteLength).set(r),{buffer:o,byteLength:r.byteLength}}allocateUnattachedSource(r){let o=this.libzip.struct.errorS(),{buffer:a,byteLength:n}=this.allocateBuffer(r),u=this.libzip.source.fromUnattachedBuffer(a,n,0,1,o);if(u===0)throw this.libzip.free(o),this.makeLibzipError(o);return u}allocateSource(r){let{buffer:o,byteLength:a}=this.allocateBuffer(r),n=this.libzip.source.fromBuffer(this.zip,o,a,0,1);if(n===0)throw this.libzip.free(o),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(r,o){let a=Buffer.isBuffer(o)?o:Buffer.from(o),n=V.relative(Bt.root,r),u=this.allocateSource(o);try{let A=this.libzip.file.add(this.zip,n,u,this.libzip.ZIP_FL_OVERWRITE);if(A===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let p=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,A,0,p,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(A,a),A}catch(A){throw this.libzip.source.free(u),A}}isSymbolicLink(r){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&ta.constants.S_IFMT)===ta.constants.S_IFLNK}getFileSource(r,o={asyncDecompress:!1}){let a=this.fileSources.get(r);if(typeof a<"u")return a;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,r,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let A=this.libzip.struct.statCompSize(n),p=this.libzip.struct.statCompMethod(n),h=this.libzip.malloc(A);try{let E=this.libzip.fopenIndex(this.zip,r,0,this.libzip.ZIP_FL_COMPRESSED);if(E===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let w=this.libzip.fread(E,h,A,0);if(w===-1)throw this.makeLibzipError(this.libzip.file.getError(E));if(wA)throw new Error("Overread");let D=this.libzip.HEAPU8.subarray(h,h+A),b=Buffer.from(D);if(p===0)return this.fileSources.set(r,b),b;if(o.asyncDecompress)return new Promise((C,T)=>{HU.default.inflateRaw(b,(N,U)=>{N?T(N):(this.fileSources.set(r,U),C(U))})});{let C=HU.default.inflateRawSync(b);return this.fileSources.set(r,C),C}}finally{this.libzip.fclose(E)}}finally{this.libzip.free(h)}}async fchmodPromise(r,o){return this.chmodPromise(this.fdToPath(r,"fchmod"),o)}fchmodSync(r,o){return this.chmodSync(this.fdToPath(r,"fchmodSync"),o)}async chmodPromise(r,o){return this.chmodSync(r,o)}chmodSync(r,o){if(this.readOnly)throw sr.EROFS(`chmod '${r}'`);o&=493;let a=this.resolveFilename(`chmod '${r}'`,r,!1),n=this.entries.get(a);if(typeof n>"u")throw new Error(`Assertion failed: The entry should have been registered (${a})`);let A=this.getUnixMode(n,ta.constants.S_IFREG|0)&-512|o;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,A<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async fchownPromise(r,o,a){return this.chownPromise(this.fdToPath(r,"fchown"),o,a)}fchownSync(r,o,a){return this.chownSync(this.fdToPath(r,"fchownSync"),o,a)}async chownPromise(r,o,a){return this.chownSync(r,o,a)}chownSync(r,o,a){throw new Error("Unimplemented")}async renamePromise(r,o){return this.renameSync(r,o)}renameSync(r,o){throw new Error("Unimplemented")}async copyFilePromise(r,o,a){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=await this.getFileSource(n,{asyncDecompress:!0}),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}copyFileSync(r,o,a=0){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=this.getFileSource(n),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}prepareCopyFile(r,o,a=0){if(this.readOnly)throw sr.EROFS(`copyfile '${r} -> '${o}'`);if(a&ta.constants.COPYFILE_FICLONE_FORCE)throw sr.ENOSYS("unsupported clone operation",`copyfile '${r}' -> ${o}'`);let n=this.resolveFilename(`copyfile '${r} -> ${o}'`,r),u=this.entries.get(n);if(typeof u>"u")throw sr.EINVAL(`copyfile '${r}' -> '${o}'`);let A=this.resolveFilename(`copyfile '${r}' -> ${o}'`,o),p=this.entries.get(A);if(a&(ta.constants.COPYFILE_EXCL|ta.constants.COPYFILE_FICLONE_FORCE)&&typeof p<"u")throw sr.EEXIST(`copyfile '${r}' -> '${o}'`);return{indexSource:u,resolvedDestP:A,indexDest:p}}async appendFilePromise(r,o,a){if(this.readOnly)throw sr.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFilePromise(r,o,a)}appendFileSync(r,o,a={}){if(this.readOnly)throw sr.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFileSync(r,o,a)}fdToPath(r,o){let a=this.fds.get(r)?.p;if(typeof a>"u")throw sr.EBADF(o);return a}async writeFilePromise(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(o=Buffer.concat([await this.getFileSource(A,{asyncDecompress:!0}),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&await this.chmodPromise(p,u)}writeFileSync(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(o=Buffer.concat([this.getFileSource(A),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&this.chmodSync(p,u)}prepareWriteFile(r,o){if(typeof r=="number"&&(r=this.fdToPath(r,"read")),this.readOnly)throw sr.EROFS(`open '${r}'`);let a=this.resolveFilename(`open '${r}'`,r);if(this.listings.has(a))throw sr.EISDIR(`open '${r}'`);let n=null,u=null;typeof o=="string"?n=o:typeof o=="object"&&({encoding:n=null,mode:u=null}=o);let A=this.entries.get(a);return{encoding:n,mode:u,resolvedP:a,index:A}}async unlinkPromise(r){return this.unlinkSync(r)}unlinkSync(r){if(this.readOnly)throw sr.EROFS(`unlink '${r}'`);let o=this.resolveFilename(`unlink '${r}'`,r);if(this.listings.has(o))throw sr.EISDIR(`unlink '${r}'`);let a=this.entries.get(o);if(typeof a>"u")throw sr.EINVAL(`unlink '${r}'`);this.deleteEntry(o,a)}async utimesPromise(r,o,a){return this.utimesSync(r,o,a)}utimesSync(r,o,a){if(this.readOnly)throw sr.EROFS(`utimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r);this.utimesImpl(n,a)}async lutimesPromise(r,o,a){return this.lutimesSync(r,o,a)}lutimesSync(r,o,a){if(this.readOnly)throw sr.EROFS(`lutimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r,!1);this.utimesImpl(n,a)}utimesImpl(r,o){this.listings.has(r)&&(this.entries.has(r)||this.hydrateDirectory(r));let a=this.entries.get(r);if(a===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,a,0,tot(o),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(r,o){return this.mkdirSync(r,o)}mkdirSync(r,{mode:o=493,recursive:a=!1}={}){if(a)return this.mkdirpSync(r,{chmod:o});if(this.readOnly)throw sr.EROFS(`mkdir '${r}'`);let n=this.resolveFilename(`mkdir '${r}'`,r);if(this.entries.has(n)||this.listings.has(n))throw sr.EEXIST(`mkdir '${r}'`);this.hydrateDirectory(n),this.chmodSync(n,o)}async rmdirPromise(r,o){return this.rmdirSync(r,o)}rmdirSync(r,{recursive:o=!1}={}){if(this.readOnly)throw sr.EROFS(`rmdir '${r}'`);if(o){this.removeSync(r);return}let a=this.resolveFilename(`rmdir '${r}'`,r),n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`rmdir '${r}'`);if(n.size>0)throw sr.ENOTEMPTY(`rmdir '${r}'`);let u=this.entries.get(a);if(typeof u>"u")throw sr.EINVAL(`rmdir '${r}'`);this.deleteEntry(r,u)}async rmPromise(r,o){return this.rmSync(r,o)}rmSync(r,{recursive:o=!1}={}){if(this.readOnly)throw sr.EROFS(`rm '${r}'`);if(o){this.removeSync(r);return}let a=this.resolveFilename(`rm '${r}'`,r),n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`rm '${r}'`);if(n.size>0)throw sr.ENOTEMPTY(`rm '${r}'`);let u=this.entries.get(a);if(typeof u>"u")throw sr.EINVAL(`rm '${r}'`);this.deleteEntry(r,u)}hydrateDirectory(r){let o=this.libzip.dir.add(this.zip,V.relative(Bt.root,r));if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(r),this.registerEntry(r,o),o}async linkPromise(r,o){return this.linkSync(r,o)}linkSync(r,o){throw sr.EOPNOTSUPP(`link '${r}' -> '${o}'`)}async symlinkPromise(r,o){return this.symlinkSync(r,o)}symlinkSync(r,o){if(this.readOnly)throw sr.EROFS(`symlink '${r}' -> '${o}'`);let a=this.resolveFilename(`symlink '${r}' -> '${o}'`,o);if(this.listings.has(a))throw sr.EISDIR(`symlink '${r}' -> '${o}'`);if(this.entries.has(a))throw sr.EEXIST(`symlink '${r}' -> '${o}'`);let n=this.setFileSource(a,r);if(this.registerEntry(a,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(ta.constants.S_IFLNK|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=await this.readFileBuffer(r,{asyncDecompress:!0});return o?a.toString(o):a}readFileSync(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=this.readFileBuffer(r);return o?a.toString(o):a}readFileBuffer(r,o={asyncDecompress:!1}){typeof r=="number"&&(r=this.fdToPath(r,"read"));let a=this.resolveFilename(`open '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`open '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(a))throw sr.ENOTDIR(`open '${r}'`);if(this.listings.has(a))throw sr.EISDIR("read");let n=this.entries.get(a);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,o)}async readdirPromise(r,o){return this.readdirSync(r,o)}readdirSync(r,o){let a=this.resolveFilename(`scandir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`scandir '${r}'`);let n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`scandir '${r}'`);if(o?.recursive)if(o?.withFileTypes){let u=Array.from(n,A=>Object.assign(this.statImpl("lstat",V.join(r,A)),{name:A,path:Bt.dot}));for(let A of u){if(!A.isDirectory())continue;let p=V.join(A.path,A.name),h=this.listings.get(V.join(a,p));for(let E of h)u.push(Object.assign(this.statImpl("lstat",V.join(r,p,E)),{name:E,path:p}))}return u}else{let u=[...n];for(let A of u){let p=this.listings.get(V.join(a,A));if(!(typeof p>"u"))for(let h of p)u.push(V.join(A,h))}return u}else return o?.withFileTypes?Array.from(n,u=>Object.assign(this.statImpl("lstat",V.join(r,u)),{name:u,path:void 0})):[...n]}async readlinkPromise(r){let o=this.prepareReadlink(r);return(await this.getFileSource(o,{asyncDecompress:!0})).toString()}readlinkSync(r){let o=this.prepareReadlink(r);return this.getFileSource(o).toString()}prepareReadlink(r){let o=this.resolveFilename(`readlink '${r}'`,r,!1);if(!this.entries.has(o)&&!this.listings.has(o))throw sr.ENOENT(`readlink '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(o))throw sr.ENOTDIR(`open '${r}'`);if(this.listings.has(o))throw sr.EINVAL(`readlink '${r}'`);let a=this.entries.get(o);if(a===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(a))throw sr.EINVAL(`readlink '${r}'`);return a}async truncatePromise(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw sr.EINVAL(`open '${r}'`);let u=await this.getFileSource(n,{asyncDecompress:!0}),A=Buffer.alloc(o,0);return u.copy(A),await this.writeFilePromise(r,A)}truncateSync(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw sr.EINVAL(`open '${r}'`);let u=this.getFileSource(n),A=Buffer.alloc(o,0);return u.copy(A),this.writeFileSync(r,A)}async ftruncatePromise(r,o){return this.truncatePromise(this.fdToPath(r,"ftruncate"),o)}ftruncateSync(r,o){return this.truncateSync(this.fdToPath(r,"ftruncateSync"),o)}watch(r,o,a){let n;switch(typeof o){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=o);break}if(!n)return{on:()=>{},close:()=>{}};let u=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(u)}}}watchFile(r,o,a){let n=V.resolve(Bt.root,r);return um(this,n,o,a)}unwatchFile(r,o){let a=V.resolve(Bt.root,r);return q0(this,a,o)}}});function bce(t,e,r=Buffer.alloc(0),o){let a=new Zi(r),n=w=>w===e||w.startsWith(`${e}/`)?w.slice(0,e.length):null,u=async(w,D)=>()=>a,A=(w,D)=>a,p={...t},h=new _n(p),E=new Gp({baseFs:h,getMountPoint:n,factoryPromise:u,factorySync:A,magicByte:21,maxAge:1/0,typeCheck:o?.typeCheck});return uw(xce.default,new Wp(E)),a}var xce,kce=It(()=>{St();xce=et(ve("fs"));qU()});var Qce=It(()=>{Dce();qU();kce()});var K1={};Vt(K1,{DEFAULT_COMPRESSION_LEVEL:()=>Pce,LibzipError:()=>fb,ZipFS:()=>Zi,ZipOpenFS:()=>iA,getArchivePart:()=>UU,getLibzipPromise:()=>not,getLibzipSync:()=>rot,makeEmptyArchive:()=>Ab,mountMemoryDrive:()=>bce});function rot(){return V1()}async function not(){return V1()}var Fce,sA=It(()=>{NU();Fce=et(Ice());vce();Qce();Cce(()=>{let t=(0,Fce.default)();return Bce(t)})});var J1,Rce=It(()=>{St();Gt();z1();J1=class extends ot{constructor(){super(...arguments);this.cwd=de.String("--cwd",process.cwd(),{description:"The directory to run the command in"});this.commandName=de.String();this.args=de.Proxy()}static{this.usage={description:"run a command using yarn's portable shell",details:` - This command will run a command using Yarn's portable shell. - - Make sure to escape glob patterns, redirections, and other features that might be expanded by your own shell. - - Note: To escape something from Yarn's shell, you might have to escape it twice, the first time from your own shell. - - Note: Don't use this command in Yarn scripts, as Yarn's shell is automatically used. - - For a list of features, visit: https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-shell/README.md. - `,examples:[["Run a simple command","$0 echo Hello"],["Run a command with a glob pattern","$0 echo '*.js'"],["Run a command with a redirection","$0 echo Hello World '>' hello.txt"],["Run a command with an escaped glob pattern (The double escape is needed in Unix shells)",`$0 echo '"*.js"'`],["Run a command with a variable (Double quotes are needed in Unix shells, to prevent them from expanding the variable)",'$0 "GREETING=Hello echo $GREETING World"']]}}async execute(){let r=this.args.length>0?`${this.commandName} ${this.args.join(" ")}`:this.commandName;return await ky(r,[],{cwd:Ae.toPortablePath(this.cwd),stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}}});var fl,Tce=It(()=>{fl=class extends Error{constructor(e){super(e),this.name="ShellError"}}});var gb={};Vt(gb,{fastGlobOptions:()=>Oce,isBraceExpansion:()=>jU,isGlobPattern:()=>iot,match:()=>sot,micromatchOptions:()=>hb});function iot(t){if(!pb.default.scan(t,hb).isGlob)return!1;try{pb.default.parse(t,hb)}catch{return!1}return!0}function sot(t,{cwd:e,baseFs:r}){return(0,Lce.default)(t,{...Oce,cwd:Ae.fromPortablePath(e),fs:aS(Nce.default,new Wp(r))})}function jU(t){return pb.default.scan(t,hb).isBrace}var Lce,Nce,pb,hb,Oce,Mce=It(()=>{St();Lce=et(ux()),Nce=et(ve("fs")),pb=et(Xo()),hb={strictBrackets:!0},Oce={onlyDirectories:!1,onlyFiles:!1}});function GU(){}function WU(){for(let t of Fg)t.kill()}function qce(t,e,r,o){return a=>{let n=a[0]instanceof oA.Transform?"pipe":a[0],u=a[1]instanceof oA.Transform?"pipe":a[1],A=a[2]instanceof oA.Transform?"pipe":a[2],p=(0,_ce.default)(t,e,{...o,stdio:[n,u,A]});return Fg.add(p),Fg.size===1&&(process.on("SIGINT",GU),process.on("SIGTERM",WU)),a[0]instanceof oA.Transform&&a[0].pipe(p.stdin),a[1]instanceof oA.Transform&&p.stdout.pipe(a[1],{end:!1}),a[2]instanceof oA.Transform&&p.stderr.pipe(a[2],{end:!1}),{stdin:p.stdin,promise:new Promise(h=>{p.on("error",E=>{switch(Fg.delete(p),Fg.size===0&&(process.off("SIGINT",GU),process.off("SIGTERM",WU)),E.code){case"ENOENT":a[2].write(`command not found: ${t} -`),h(127);break;case"EACCES":a[2].write(`permission denied: ${t} -`),h(128);break;default:a[2].write(`uncaught error: ${E.message} -`),h(1);break}}),p.on("close",E=>{Fg.delete(p),Fg.size===0&&(process.off("SIGINT",GU),process.off("SIGTERM",WU)),h(E!==null?E:129)})})}}}function jce(t){return e=>{let r=e[0]==="pipe"?new oA.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}function db(t,e){return VU.start(t,e)}function Uce(t,e=null){let r=new oA.PassThrough,o=new Hce.StringDecoder,a="";return r.on("data",n=>{let u=o.write(n),A;do if(A=u.indexOf(` -`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a="",t(e!==null?`${e} ${p}`:p)}while(A!==-1);a+=u}),r.on("end",()=>{let n=o.end();n!==""&&t(e!==null?`${e} ${n}`:n)}),r}function Gce(t,{prefix:e}){return{stdout:Uce(r=>t.stdout.write(`${r} -`),t.stdout.isTTY?e:null),stderr:Uce(r=>t.stderr.write(`${r} -`),t.stderr.isTTY?e:null)}}var _ce,oA,Hce,Fg,Zl,YU,VU,KU=It(()=>{_ce=et(MT()),oA=ve("stream"),Hce=ve("string_decoder"),Fg=new Set;Zl=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},YU=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},VU=class t{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:o,stderr:a}){let n=new t(null,e);return n.stdin=r,n.stdout=o,n.stderr=a,n}pipeTo(e,r=1){let o=new t(this,e),a=new YU;return o.pipe=a,o.stdout=this.stdout,o.stderr=this.stderr,(r&1)===1?this.stdout=a:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)===2?this.stderr=a:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),o}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let o;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");o=this.stderr,e[2]=o.get();let a=this.implementation(e);return this.pipe&&this.pipe.attach(a.stdin),await a.promise.then(n=>(r.close(),o.close(),n))}async run(){let e=[];for(let o=this;o;o=o.ancestor)e.push(o.exec());return(await Promise.all(e))[0]}}});var e2={};Vt(e2,{EntryCommand:()=>J1,ShellError:()=>fl,execute:()=>ky,globUtils:()=>gb});function Wce(t,e,r){let o=new pl.PassThrough({autoDestroy:!0});switch(t){case 0:(e&1)===1&&r.stdin.pipe(o,{end:!1}),(e&2)===2&&r.stdin instanceof pl.Writable&&o.pipe(r.stdin,{end:!1});break;case 1:(e&1)===1&&r.stdout.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stdout,{end:!1});break;case 2:(e&1)===1&&r.stderr.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stderr,{end:!1});break;default:throw new fl(`Bad file descriptor: "${t}"`)}return o}function yb(t,e={}){let r={...t,...e};return r.environment={...t.environment,...e.environment},r.variables={...t.variables,...e.variables},r}async function aot(t,e,r){let o=[],a=new pl.PassThrough;return a.on("data",n=>o.push(n)),await Eb(t,e,yb(r,{stdout:a})),Buffer.concat(o).toString().replace(/[\r\n]+$/,"")}async function Yce(t,e,r){let o=t.map(async n=>{let u=await Rg(n.args,e,r);return{name:n.name,value:u.join(" ")}});return(await Promise.all(o)).reduce((n,u)=>(n[u.name]=u.value,n),{})}function mb(t){return t.match(/[^ \r\n\t]+/g)||[]}async function Zce(t,e,r,o,a=o){switch(t.name){case"$":o(String(process.pid));break;case"#":o(String(e.args.length));break;case"@":if(t.quoted)for(let n of e.args)a(n);else for(let n of e.args){let u=mb(n);for(let A=0;A=0&&n"u"&&(t.defaultValue?u=(await Rg(t.defaultValue,e,r)).join(" "):t.alternativeValue&&(u="")),typeof u>"u")throw A?new fl(`Unbound argument #${n}`):new fl(`Unbound variable "${t.name}"`);if(t.quoted)o(u);else{let p=mb(u);for(let E=0;Eo.push(n));let a=Number(o.join(" "));return Number.isNaN(a)?X1({type:"variable",name:o.join(" ")},e,r):X1({type:"number",value:a},e,r)}else return lot[t.type](await X1(t.left,e,r),await X1(t.right,e,r))}async function Rg(t,e,r){let o=new Map,a=[],n=[],u=E=>{n.push(E)},A=()=>{n.length>0&&a.push(n.join("")),n=[]},p=E=>{u(E),A()},h=(E,w,D)=>{let b=JSON.stringify({type:E,fd:w}),C=o.get(b);typeof C>"u"&&o.set(b,C=[]),C.push(D)};for(let E of t){let w=!1;switch(E.type){case"redirection":{let D=await Rg(E.args,e,r);for(let b of D)h(E.subtype,E.fd,b)}break;case"argument":for(let D of E.segments)switch(D.type){case"text":u(D.text);break;case"glob":u(D.pattern),w=!0;break;case"shell":{let b=await aot(D.shell,e,r);if(D.quoted)u(b);else{let C=mb(b);for(let T=0;T"u")throw new Error("Assertion failed: Expected a glob pattern to have been set");let b=await e.glob.match(D,{cwd:r.cwd,baseFs:e.baseFs});if(b.length===0){let C=jU(D)?". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22":"";throw new fl(`No matches found: "${D}"${C}`)}for(let C of b.sort())p(C)}}if(o.size>0){let E=[];for(let[w,D]of o.entries())E.splice(E.length,0,w,String(D.length),...D);a.splice(0,0,"__ysh_set_redirects",...E,"--")}return a}function Z1(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let o=Ae.fromPortablePath(r.cwd),a=r.environment;typeof a.PWD<"u"&&(a={...a,PWD:o});let[n,...u]=t;if(n==="command")return qce(u[0],u.slice(1),e,{cwd:o,env:a});let A=e.builtins.get(n);if(typeof A>"u")throw new Error(`Assertion failed: A builtin should exist for "${n}"`);return jce(async({stdin:p,stdout:h,stderr:E})=>{let{stdin:w,stdout:D,stderr:b}=r;r.stdin=p,r.stdout=h,r.stderr=E;try{return await A(u,e,r)}finally{r.stdin=w,r.stdout=D,r.stderr=b}})}function cot(t,e,r){return o=>{let a=new pl.PassThrough,n=Eb(t,e,yb(r,{stdin:a}));return{stdin:a,promise:n}}}function uot(t,e,r){return o=>{let a=new pl.PassThrough,n=Eb(t,e,r);return{stdin:a,promise:n}}}function Vce(t,e,r,o){if(e.length===0)return t;{let a;do a=String(Math.random());while(Object.hasOwn(o.procedures,a));return o.procedures={...o.procedures},o.procedures[a]=t,Z1([...e,"__ysh_run_procedure",a],r,o)}}async function Kce(t,e,r){let o=t,a=null,n=null;for(;o;){let u=o.then?{...r}:r,A;switch(o.type){case"command":{let p=await Rg(o.args,e,r),h=await Yce(o.envs,e,r);A=o.envs.length?Z1(p,e,yb(u,{environment:h})):Z1(p,e,u)}break;case"subshell":{let p=await Rg(o.args,e,r),h=cot(o.subshell,e,u);A=Vce(h,p,e,u)}break;case"group":{let p=await Rg(o.args,e,r),h=uot(o.group,e,u);A=Vce(h,p,e,u)}break;case"envs":{let p=await Yce(o.envs,e,r);u.environment={...u.environment,...p},A=Z1(["true"],e,u)}break}if(typeof A>"u")throw new Error("Assertion failed: An action should have been generated");if(a===null)n=db(A,{stdin:new Zl(u.stdin),stdout:new Zl(u.stdout),stderr:new Zl(u.stderr)});else{if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(a){case"|":n=n.pipeTo(A,1);break;case"|&":n=n.pipeTo(A,3);break}}o.then?(a=o.then.type,o=o.then.chain):o=null}if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await n.run()}async function Aot(t,e,r,{background:o=!1}={}){function a(n){let u=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],A=u[n%u.length];return Jce.default.hex(A)}if(o){let n=r.nextBackgroundJobIndex++,u=a(n),A=`[${n}]`,p=u(A),{stdout:h,stderr:E}=Gce(r,{prefix:p});return r.backgroundJobs.push(Kce(t,e,yb(r,{stdout:h,stderr:E})).catch(w=>E.write(`${w.message} -`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${p}, '${u(mm(t))}' has ended -`)})),0}return await Kce(t,e,r)}async function fot(t,e,r,{background:o=!1}={}){let a,n=A=>{a=A,r.variables["?"]=String(A)},u=async A=>{try{return await Aot(A.chain,e,r,{background:o&&typeof A.then>"u"})}catch(p){if(!(p instanceof fl))throw p;return r.stderr.write(`${p.message} -`),1}};for(n(await u(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":a===0&&n(await u(t.then.line));break;case"||":a!==0&&n(await u(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return a}async function Eb(t,e,r){let o=r.backgroundJobs;r.backgroundJobs=[];let a=0;for(let{command:n,type:u}of t){if(a=await fot(n,e,r,{background:u==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(a)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=o,a}function $ce(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>$1(e))||"alternativeValue"in t&&!!t.alternativeValue&&t.alternativeValue.some(e=>$1(e));case"arithmetic":return JU(t.arithmetic);case"shell":return zU(t.shell);default:return!1}}function $1(t){switch(t.type){case"redirection":return t.args.some(e=>$1(e));case"argument":return t.segments.some(e=>$ce(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function JU(t){switch(t.type){case"variable":return $ce(t);case"number":return!1;default:return JU(t.left)||JU(t.right)}}function zU(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let o;switch(r.type){case"subshell":o=zU(r.subshell);break;case"command":o=r.envs.some(a=>a.args.some(n=>$1(n)))||r.args.some(a=>$1(a));break}if(o)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function ky(t,e=[],{baseFs:r=new _n,builtins:o={},cwd:a=Ae.toPortablePath(process.cwd()),env:n=process.env,stdin:u=process.stdin,stdout:A=process.stdout,stderr:p=process.stderr,variables:h={},glob:E=gb}={}){let w={};for(let[C,T]of Object.entries(n))typeof T<"u"&&(w[C]=T);let D=new Map(oot);for(let[C,T]of Object.entries(o))D.set(C,T);u===null&&(u=new pl.PassThrough,u.end());let b=uS(t,E);if(!zU(b)&&b.length>0&&e.length>0){let{command:C}=b[b.length-1];for(;C.then;)C=C.then.line;let T=C.chain;for(;T.then;)T=T.then.chain;T.type==="command"&&(T.args=T.args.concat(e.map(N=>({type:"argument",segments:[{type:"text",text:N}]}))))}return await Eb(b,{args:e,baseFs:r,builtins:D,initialStdin:u,initialStdout:A,initialStderr:p,glob:E},{cwd:a,environment:w,exitCode:null,procedures:{},stdin:u,stdout:A,stderr:p,variables:Object.assign({},h,{"?":0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var Jce,zce,pl,Xce,oot,lot,z1=It(()=>{St();Ol();Jce=et(sN()),zce=ve("os"),pl=ve("stream"),Xce=ve("timers/promises");Rce();Tce();Mce();KU();KU();oot=new Map([["cd",async([t=(0,zce.homedir)(),...e],r,o)=>{let a=V.resolve(o.cwd,Ae.toPortablePath(t));if(!(await r.baseFs.statPromise(a).catch(u=>{throw u.code==="ENOENT"?new fl(`cd: no such file or directory: ${t}`):u})).isDirectory())throw new fl(`cd: not a directory: ${t}`);return o.cwd=a,0}],["pwd",async(t,e,r)=>(r.stdout.write(`${Ae.fromPortablePath(r.cwd)} -`),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,o)=>o.exitCode=parseInt(t??o.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} -`),0)],["sleep",async([t],e,r)=>{if(typeof t>"u")throw new fl("sleep: missing operand");let o=Number(t);if(Number.isNaN(o))throw new fl(`sleep: invalid time interval '${t}'`);return await(0,Xce.setTimeout)(1e3*o,0)}],["unset",async(t,e,r)=>{for(let o of t)delete r.environment[o],delete r.variables[o];return 0}],["__ysh_run_procedure",async(t,e,r)=>{let o=r.procedures[t[0]];return await db(o,{stdin:new Zl(r.stdin),stdout:new Zl(r.stdout),stderr:new Zl(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let o=r.stdin,a=r.stdout,n=r.stderr,u=[],A=[],p=[],h=0;for(;t[h]!=="--";){let w=t[h++],{type:D,fd:b}=JSON.parse(w),C=J=>{switch(b){case null:case 0:u.push(J);break;default:throw new Error(`Unsupported file descriptor: "${b}"`)}},T=J=>{switch(b){case null:case 1:A.push(J);break;case 2:p.push(J);break;default:throw new Error(`Unsupported file descriptor: "${b}"`)}},N=Number(t[h++]),U=h+N;for(let J=h;Je.baseFs.createReadStream(V.resolve(r.cwd,Ae.toPortablePath(t[J]))));break;case"<<<":C(()=>{let te=new pl.PassThrough;return process.nextTick(()=>{te.write(`${t[J]} -`),te.end()}),te});break;case"<&":C(()=>Wce(Number(t[J]),1,r));break;case">":case">>":{let te=V.resolve(r.cwd,Ae.toPortablePath(t[J]));T(te==="/dev/null"?new pl.Writable({autoDestroy:!0,emitClose:!0,write(le,ce,ue){setImmediate(ue)}}):e.baseFs.createWriteStream(te,D===">>"?{flags:"a"}:void 0))}break;case">&":T(Wce(Number(t[J]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${D}"`)}}if(u.length>0){let w=new pl.PassThrough;o=w;let D=b=>{if(b===u.length)w.end();else{let C=u[b]();C.pipe(w,{end:!1}),C.on("end",()=>{D(b+1)})}};D(0)}if(A.length>0){let w=new pl.PassThrough;a=w;for(let D of A)w.pipe(D)}if(p.length>0){let w=new pl.PassThrough;n=w;for(let D of p)w.pipe(D)}let E=await db(Z1(t.slice(h+1),e,r),{stdin:new Zl(o),stdout:new Zl(a),stderr:new Zl(n)}).run();return await Promise.all(A.map(w=>new Promise((D,b)=>{w.on("error",C=>{b(C)}),w.on("close",()=>{D()}),w.end()}))),await Promise.all(p.map(w=>new Promise((D,b)=>{w.on("error",C=>{b(C)}),w.on("close",()=>{D()}),w.end()}))),E}]]);lot={addition:(t,e)=>t+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)}});var Cb=_((MMt,eue)=>{function pot(t,e){for(var r=-1,o=t==null?0:t.length,a=Array(o);++r{var tue=dg(),hot=Cb(),got=jl(),dot=fy(),mot=1/0,rue=tue?tue.prototype:void 0,nue=rue?rue.toString:void 0;function iue(t){if(typeof t=="string")return t;if(got(t))return hot(t,iue)+"";if(dot(t))return nue?nue.call(t):"";var e=t+"";return e=="0"&&1/t==-mot?"-0":e}sue.exports=iue});var t2=_((_Mt,aue)=>{var yot=oue();function Eot(t){return t==null?"":yot(t)}aue.exports=Eot});var XU=_((HMt,lue)=>{function Cot(t,e,r){var o=-1,a=t.length;e<0&&(e=-e>a?0:a+e),r=r>a?a:r,r<0&&(r+=a),a=e>r?0:r-e>>>0,e>>>=0;for(var n=Array(a);++o{var Iot=XU();function wot(t,e,r){var o=t.length;return r=r===void 0?o:r,!e&&r>=o?t:Iot(t,e,r)}cue.exports=wot});var ZU=_((jMt,Aue)=>{var Bot="\\ud800-\\udfff",vot="\\u0300-\\u036f",Dot="\\ufe20-\\ufe2f",Sot="\\u20d0-\\u20ff",Pot=vot+Dot+Sot,xot="\\ufe0e\\ufe0f",bot="\\u200d",kot=RegExp("["+bot+Bot+Pot+xot+"]");function Qot(t){return kot.test(t)}Aue.exports=Qot});var pue=_((GMt,fue)=>{function Fot(t){return t.split("")}fue.exports=Fot});var Iue=_((WMt,Cue)=>{var hue="\\ud800-\\udfff",Rot="\\u0300-\\u036f",Tot="\\ufe20-\\ufe2f",Lot="\\u20d0-\\u20ff",Not=Rot+Tot+Lot,Oot="\\ufe0e\\ufe0f",Mot="["+hue+"]",$U="["+Not+"]",e3="\\ud83c[\\udffb-\\udfff]",Uot="(?:"+$U+"|"+e3+")",gue="[^"+hue+"]",due="(?:\\ud83c[\\udde6-\\uddff]){2}",mue="[\\ud800-\\udbff][\\udc00-\\udfff]",_ot="\\u200d",yue=Uot+"?",Eue="["+Oot+"]?",Hot="(?:"+_ot+"(?:"+[gue,due,mue].join("|")+")"+Eue+yue+")*",qot=Eue+yue+Hot,jot="(?:"+[gue+$U+"?",$U,due,mue,Mot].join("|")+")",Got=RegExp(e3+"(?="+e3+")|"+jot+qot,"g");function Wot(t){return t.match(Got)||[]}Cue.exports=Wot});var Bue=_((YMt,wue)=>{var Yot=pue(),Vot=ZU(),Kot=Iue();function Jot(t){return Vot(t)?Kot(t):Yot(t)}wue.exports=Jot});var Due=_((VMt,vue)=>{var zot=uue(),Xot=ZU(),Zot=Bue(),$ot=t2();function eat(t){return function(e){e=$ot(e);var r=Xot(e)?Zot(e):void 0,o=r?r[0]:e.charAt(0),a=r?zot(r,1).join(""):e.slice(1);return o[t]()+a}}vue.exports=eat});var Pue=_((KMt,Sue)=>{var tat=Due(),rat=tat("toUpperCase");Sue.exports=rat});var t3=_((JMt,xue)=>{var nat=t2(),iat=Pue();function sat(t){return iat(nat(t).toLowerCase())}xue.exports=sat});var bue=_((zMt,Ib)=>{function oat(){var t=0,e=1,r=2,o=3,a=4,n=5,u=6,A=7,p=8,h=9,E=10,w=11,D=12,b=13,C=14,T=15,N=16,U=17,J=0,te=1,le=2,ce=3,ue=4;function Ie(g,me){return 55296<=g.charCodeAt(me)&&g.charCodeAt(me)<=56319&&56320<=g.charCodeAt(me+1)&&g.charCodeAt(me+1)<=57343}function he(g,me){me===void 0&&(me=0);var Ce=g.charCodeAt(me);if(55296<=Ce&&Ce<=56319&&me=1){var fe=g.charCodeAt(me-1),ie=Ce;return 55296<=fe&&fe<=56319?(fe-55296)*1024+(ie-56320)+65536:ie}return Ce}function De(g,me,Ce){var fe=[g].concat(me).concat([Ce]),ie=fe[fe.length-2],Z=Ce,Se=fe.lastIndexOf(C);if(Se>1&&fe.slice(1,Se).every(function(q){return q==o})&&[o,b,U].indexOf(g)==-1)return le;var Re=fe.lastIndexOf(a);if(Re>0&&fe.slice(1,Re).every(function(q){return q==a})&&[D,a].indexOf(ie)==-1)return fe.filter(function(q){return q==a}).length%2==1?ce:ue;if(ie==t&&Z==e)return J;if(ie==r||ie==t||ie==e)return Z==C&&me.every(function(q){return q==o})?le:te;if(Z==r||Z==t||Z==e)return te;if(ie==u&&(Z==u||Z==A||Z==h||Z==E))return J;if((ie==h||ie==A)&&(Z==A||Z==p))return J;if((ie==E||ie==p)&&Z==p)return J;if(Z==o||Z==T)return J;if(Z==n)return J;if(ie==D)return J;var ht=fe.indexOf(o)!=-1?fe.lastIndexOf(o)-1:fe.length-2;return[b,U].indexOf(fe[ht])!=-1&&fe.slice(ht+1,-1).every(function(q){return q==o})&&Z==C||ie==T&&[N,U].indexOf(Z)!=-1?J:me.indexOf(a)!=-1?le:ie==a&&Z==a?J:te}this.nextBreak=function(g,me){if(me===void 0&&(me=0),me<0)return 0;if(me>=g.length-1)return g.length;for(var Ce=Ee(he(g,me)),fe=[],ie=me+1;ie{var aat=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,wb;function lat(){if(wb)return wb;if(typeof Intl.Segmenter<"u"){let t=new Intl.Segmenter("en",{granularity:"grapheme"});return wb=e=>Array.from(t.segment(e),({segment:r})=>r)}else{let t=bue(),e=new t;return wb=r=>e.splitGraphemes(r)}}kue.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let o=r-e,a="",n=0,u=0;for(;t.length>0;){let A=t.match(aat)||[t,t,void 0],p=lat()(A[1]),h=Math.min(e-n,p.length);p=p.slice(h);let E=Math.min(o-u,p.length);a+=p.slice(0,E).join(""),n+=h,u+=E,typeof A[2]<"u"&&(a+=A[2]),t=t.slice(A[0].length)}return a}});var nn,r2=It(()=>{nn=process.env.YARN_IS_TEST_ENV?"0.0.0":"4.7.0"});function Oue(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let a=Ju(t===null?0:t);return!r&&t===null?Ut(e,a,"grey"):a}function r3(t,{configuration:e,json:r}){let o=Oue(t,{configuration:e,json:r});if(!o||t===null||t===0)return o;let a=vr[t],n=`https://yarnpkg.com/advanced/error-codes#${o}---${a}`.toLowerCase();return ty(e,o,n)}async function Qy({configuration:t,stdout:e,forceError:r},o){let a=await Lt.start({configuration:t,stdout:e,includeFooter:!1},async n=>{let u=!1,A=!1;for(let p of o)typeof p.option<"u"&&(p.error||r?(A=!0,n.reportError(50,p.message)):(u=!0,n.reportWarning(50,p.message)),p.callback?.());u&&!A&&n.reportSeparator()});return a.hasErrors()?a.exitCode():null}var Lue,Bb,cat,Fue,Rue,hh,Nue,Tue,uat,Aat,vb,fat,Lt,n2=It(()=>{Lue=et(Que()),Bb=et(sg());GS();Kl();r2();Wl();cat="\xB7",Fue=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Rue=80,hh=Bb.default.GITHUB_ACTIONS?{start:t=>`::group::${t} -`,end:t=>`::endgroup:: -`}:Bb.default.TRAVIS?{start:t=>`travis_fold:start:${t} -`,end:t=>`travis_fold:end:${t} -`}:Bb.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r\x1B[0K${t} -`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r\x1B[0K`}:null,Nue=hh!==null,Tue=new Date,uat=["iTerm.app","Apple_Terminal","WarpTerminal","vscode"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,Aat=t=>t,vb=Aat({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),fat=uat&&Object.keys(vb).find(t=>{let e=vb[t];return!(e.date&&(e.date[0]!==Tue.getDate()||e.date[1]!==Tue.getMonth()+1))})||"default";Lt=class extends Ws{constructor({configuration:r,stdout:o,json:a=!1,forceSectionAlignment:n=!1,includeNames:u=!0,includePrefix:A=!0,includeFooter:p=!0,includeLogs:h=!a,includeInfos:E=h,includeWarnings:w=h}){super();this.uncommitted=new Set;this.warningCount=0;this.errorCount=0;this.timerFooter=[];this.startTime=Date.now();this.indent=0;this.level=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;if(g1(this,{configuration:r}),this.configuration=r,this.forceSectionAlignment=n,this.includeNames=u,this.includePrefix=A,this.includeFooter=p,this.includeInfos=E,this.includeWarnings=w,this.json=a,this.stdout=o,r.get("enableProgressBars")&&!a&&o.isTTY&&o.columns>22){let D=r.get("progressBarStyle")||fat;if(!Object.hasOwn(vb,D))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=vb[D];let b=Math.min(this.getRecommendedLength(),80);this.progressMaxScaledSize=Math.floor(this.progressStyle.size*b/80)}}static async start(r,o){let a=new this(r),n=process.emitWarning;process.emitWarning=(u,A)=>{if(typeof u!="string"){let h=u;u=h.message,A=A??h.name}let p=typeof A<"u"?`${A}: ${u}`:u;a.reportWarning(0,p)},r.includeVersion&&a.reportInfo(0,Cg(r.configuration,`Yarn ${nn}`,2));try{await o(a)}catch(u){a.reportExceptionOnce(u)}finally{await a.finalize(),process.emitWarning=n}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}getRecommendedLength(){let o=this.progressStyle!==null?this.stdout.columns-1:super.getRecommendedLength();return Math.max(40,o-12-this.indent*2)}startSectionSync({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&o?.(p-A)}}async startSectionPromise({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return await n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&o?.(p-A)}}startTimerImpl(r,o,a){return{cb:typeof o=="function"?o:a,reportHeader:()=>{this.level+=1,this.reportInfo(null,`\u250C ${r}`),this.indent+=1,hh!==null&&!this.json&&this.includeInfos&&this.stdout.write(hh.start(r))},reportFooter:A=>{if(this.indent-=1,hh!==null&&!this.json&&this.includeInfos){this.stdout.write(hh.end(r));for(let p of this.timerFooter)p()}this.configuration.get("enableTimers")&&A>200?this.reportInfo(null,`\u2514 Completed in ${Ut(this.configuration,A,Ct.DURATION)}`):this.reportInfo(null,"\u2514 Completed"),this.level-=1},skipIfEmpty:(typeof o=="function"?{}:o).skipIfEmpty}}startTimerSync(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionSync(u,n)}async startTimerPromise(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionPromise(u,n)}reportSeparator(){this.indent===0?this.writeLine(""):this.reportInfo(null,"")}reportInfo(r,o){if(!this.includeInfos)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"",u=`${this.formatPrefix(n,"blueBright")}${o}`;this.json?this.reportJson({type:"info",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(u)}reportWarning(r,o){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"warning",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(`${this.formatPrefix(n,"yellowBright")}${o}`)}reportError(r,o){this.errorCount+=1,this.timerFooter.push(()=>this.reportErrorImpl(r,o)),this.reportErrorImpl(r,o)}reportErrorImpl(r,o){this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"error",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(`${this.formatPrefix(n,"redBright")}${o}`,{truncate:!1})}reportFold(r,o){if(!hh)return;let a=`${hh.start(r)}${o}${hh.end(r)}`;this.timerFooter.push(()=>this.stdout.write(a))}reportProgress(r){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(r.hasProgress&&r.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let o=!1,a=Promise.resolve().then(async()=>{let u={progress:r.hasProgress?0:void 0,title:r.hasTitle?"":void 0};this.progress.set(r,{definition:u,lastScaledSize:r.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:A,title:p}of r)o||u.progress===A&&u.title===p||(u.progress=A,u.title=p,this.refreshProgress());n()}),n=()=>{o||(o=!0,this.progress.delete(r),this.refreshProgress({delta:1}))};return{...a,stop:n}}reportJson(r){this.json&&this.writeLine(`${JSON.stringify(r)}`)}async finalize(){if(!this.includeFooter)return;let r="";this.errorCount>0?r="Failed with errors":this.warningCount>0?r="Done with warnings":r="Done";let o=Ut(this.configuration,Date.now()-this.startTime,Ct.DURATION),a=this.configuration.get("enableTimers")?`${r} in ${o}`:r;this.errorCount>0?this.reportError(0,a):this.warningCount>0?this.reportWarning(0,a):this.reportInfo(0,a)}writeLine(r,{truncate:o}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(r,{truncate:o})} -`),this.writeProgress()}writeLines(r,{truncate:o}={}){this.clearProgress({delta:r.length});for(let a of r)this.stdout.write(`${this.truncate(a,{truncate:o})} -`);this.writeProgress()}commit(){let r=this.uncommitted;this.uncommitted=new Set;for(let o of r)o.committed=!0,o.action()}clearProgress({delta:r=0,clear:o=!1}){this.progressStyle!==null&&this.progress.size+r>0&&(this.stdout.write(`\x1B[${this.progress.size+r}A`),(r>0||o)&&this.stdout.write("\x1B[0J"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let r=Date.now();r-this.progressTime>Rue&&(this.progressFrame=(this.progressFrame+1)%Fue.length,this.progressTime=r);let o=Fue[this.progressFrame];for(let a of this.progress.values()){let n="";if(typeof a.lastScaledSize<"u"){let h=this.progressStyle.chars[0].repeat(a.lastScaledSize),E=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-a.lastScaledSize);n=` ${h}${E}`}let u=this.formatName(null),A=u?`${u}: `:"",p=a.definition.title?` ${a.definition.title}`:"";this.stdout.write(`${Ut(this.configuration,"\u27A4","blueBright")} ${A}${o}${n}${p} -`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},Rue)}refreshProgress({delta:r=0,force:o=!1}={}){let a=!1,n=!1;if(o||this.progress.size===0)a=!0;else for(let u of this.progress.values()){let A=typeof u.definition.progress<"u"?Math.trunc(this.progressMaxScaledSize*u.definition.progress):void 0,p=u.lastScaledSize;u.lastScaledSize=A;let h=u.lastTitle;if(u.lastTitle=u.definition.title,A!==p||(n=h!==u.definition.title)){a=!0;break}}a&&(this.clearProgress({delta:r,clear:n}),this.writeProgress())}truncate(r,{truncate:o}={}){return this.progressStyle===null&&(o=!1),typeof o>"u"&&(o=this.configuration.get("preferTruncatedLines")),o&&(r=(0,Lue.default)(r,0,this.stdout.columns-1)),r}formatName(r){return this.includeNames?Oue(r,{configuration:this.configuration,json:this.json}):""}formatPrefix(r,o){return this.includePrefix?`${Ut(this.configuration,"\u27A4",o)} ${r}${this.formatIndent()}`:""}formatNameWithHyperlink(r){return this.includeNames?r3(r,{configuration:this.configuration,json:this.json}):""}formatIndent(){return this.level>0||!this.forceSectionAlignment?"\u2502 ".repeat(this.indent):`${cat} `}}});var hn={};Vt(hn,{PackageManager:()=>_ue,detectPackageManager:()=>Hue,executePackageAccessibleBinary:()=>Yue,executePackageScript:()=>Db,executePackageShellcode:()=>n3,executeWorkspaceAccessibleBinary:()=>Eat,executeWorkspaceLifecycleScript:()=>Gue,executeWorkspaceScript:()=>jue,getPackageAccessibleBinaries:()=>Sb,getWorkspaceAccessibleBinaries:()=>Wue,hasPackageScript:()=>dat,hasWorkspaceScript:()=>i3,isNodeScript:()=>s3,makeScriptEnv:()=>i2,maybeExecuteWorkspaceLifecycleScript:()=>yat,prepareExternalProject:()=>gat});async function gh(t,e,r,o=[]){if(process.platform==="win32"){let a=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${o.map(n=>`"${n.replace('"','""')}"`).join(" ")} %*`;await ae.writeFilePromise(V.format({dir:t,name:e,ext:".cmd"}),a)}await ae.writeFilePromise(V.join(t,e),`#!/bin/sh -exec "${r}" ${o.map(a=>`'${a.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" -`,{mode:493})}async function Hue(t){let e=await _t.tryFind(t);if(e?.packageManager){let o=dx(e.packageManager);if(o?.name){let a=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[n]=o.reference.split(".");switch(o.name){case"yarn":return{packageManagerField:!0,packageManager:Number(n)===1?"Yarn Classic":"Yarn",reason:a};case"npm":return{packageManagerField:!0,packageManager:"npm",reason:a};case"pnpm":return{packageManagerField:!0,packageManager:"pnpm",reason:a}}}}let r;try{r=await ae.readFilePromise(V.join(t,mr.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:"Yarn",reason:'"__metadata" key found in yarn.lock'}:{packageManager:"Yarn Classic",reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:ae.existsSync(V.join(t,"package-lock.json"))?{packageManager:"npm",reason:`found npm's "package-lock.json" lockfile`}:ae.existsSync(V.join(t,"pnpm-lock.yaml"))?{packageManager:"pnpm",reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function i2({project:t,locator:e,binFolder:r,ignoreCorepack:o,lifecycleScript:a,baseEnv:n=t?.configuration.env??process.env}){let u={};for(let[E,w]of Object.entries(n))typeof w<"u"&&(u[E.toLowerCase()!=="path"?E:"PATH"]=w);let A=Ae.fromPortablePath(r);u.BERRY_BIN_FOLDER=Ae.fromPortablePath(A);let p=process.env.COREPACK_ROOT&&!o?Ae.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([gh(r,"node",process.execPath),...nn!==null?[gh(r,"run",process.execPath,[p,"run"]),gh(r,"yarn",process.execPath,[p]),gh(r,"yarnpkg",process.execPath,[p]),gh(r,"node-gyp",process.execPath,[p,"run","--top-level","node-gyp"])]:[]]),t&&(u.INIT_CWD=Ae.fromPortablePath(t.configuration.startingCwd),u.PROJECT_CWD=Ae.fromPortablePath(t.cwd)),u.PATH=u.PATH?`${A}${Ae.delimiter}${u.PATH}`:`${A}`,u.npm_execpath=`${A}${Ae.sep}yarn`,u.npm_node_execpath=`${A}${Ae.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let E=t.tryWorkspaceByLocator(e),w=E?E.manifest.version??"":t.storedPackages.get(e.locatorHash).version??"";u.npm_package_name=rn(e),u.npm_package_version=w;let D;if(E)D=E.cwd;else{let b=t.storedPackages.get(e.locatorHash);if(!b)throw new Error(`Package for ${jr(t.configuration,e)} not found in the project`);let C=t.configuration.getLinkers(),T={project:t,report:new Lt({stdout:new dh.PassThrough,configuration:t.configuration})},N=C.find(U=>U.supportsPackage(b,T));if(!N)throw new Error(`The package ${jr(t.configuration,b)} isn't supported by any of the available linkers`);D=await N.findPackageLocation(b,T)}u.npm_package_json=Ae.fromPortablePath(V.join(D,mr.manifest))}let h=nn!==null?`yarn/${nn}`:`yarn/${vf("@yarnpkg/core").version}-core`;return u.npm_config_user_agent=`${h} npm/? node/${process.version} ${process.platform} ${process.arch}`,a&&(u.npm_lifecycle_event=a),t&&await t.configuration.triggerHook(E=>E.setupScriptEnvironment,t,u,async(E,w,D)=>await gh(r,E,w,D)),u}async function gat(t,e,{configuration:r,report:o,workspace:a=null,locator:n=null}){await hat(async()=>{await ae.mktempPromise(async u=>{let A=V.join(u,"pack.log"),p=null,{stdout:h,stderr:E}=r.getSubprocessStreams(A,{prefix:Ae.fromPortablePath(t),report:o}),w=n&&Jc(n)?I1(n):n,D=w?Qa(w):"an external project";h.write(`Packing ${D} from sources -`);let b=await Hue(t),C;b!==null?(h.write(`Using ${b.packageManager} for bootstrap. Reason: ${b.reason} - -`),C=b.packageManager):(h.write(`No package manager configuration detected; defaulting to Yarn - -`),C="Yarn");let T=C==="Yarn"&&!b?.packageManagerField;await ae.mktempPromise(async N=>{let U=await i2({binFolder:N,ignoreCorepack:T,baseEnv:{...process.env,COREPACK_ENABLE_AUTO_PIN:"0"}}),te=new Map([["Yarn Classic",async()=>{let ce=a!==null?["workspace",a]:[],ue=V.join(t,mr.manifest),Ie=await ae.readFilePromise(ue),he=await Xc(process.execPath,[process.argv[1],"set","version","classic","--only-if-needed","--yarn-path"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(he.code!==0)return he.code;await ae.writeFilePromise(ue,Ie),await ae.appendFilePromise(V.join(t,".npmignore"),`/.yarn -`),h.write(` -`),delete U.NODE_ENV;let De=await Xc("yarn",["install"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(De.code!==0)return De.code;h.write(` -`);let Ee=await Xc("yarn",[...ce,"pack","--filename",Ae.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return Ee.code!==0?Ee.code:0}],["Yarn",async()=>{let ce=a!==null?["workspace",a]:[];U.YARN_ENABLE_INLINE_BUILDS="1";let ue=V.join(t,mr.lockfile);await ae.existsPromise(ue)||await ae.writeFilePromise(ue,"");let Ie=await Xc("yarn",[...ce,"pack","--install-if-needed","--filename",Ae.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return Ie.code!==0?Ie.code:0}],["npm",async()=>{if(a!==null){let me=new dh.PassThrough,Ce=Xm(me);me.pipe(h,{end:!1});let fe=await Xc("npm",["--version"],{cwd:t,env:U,stdin:p,stdout:me,stderr:E,end:0});if(me.end(),fe.code!==0)return h.end(),E.end(),fe.code;let ie=(await Ce).toString().trim();if(!nA(ie,">=7.x")){let Z=rA(null,"npm"),Se=kn(Z,ie),Re=kn(Z,">=7.x");throw new Error(`Workspaces aren't supported by ${Jn(r,Se)}; please upgrade to ${Jn(r,Re)} (npm has been detected as the primary package manager for ${Ut(r,t,Ct.PATH)})`)}}let ce=a!==null?["--workspace",a]:[];delete U.npm_config_user_agent,delete U.npm_config_production,delete U.NPM_CONFIG_PRODUCTION,delete U.NODE_ENV;let ue=await Xc("npm",["install","--legacy-peer-deps"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(ue.code!==0)return ue.code;let Ie=new dh.PassThrough,he=Xm(Ie);Ie.pipe(h);let De=await Xc("npm",["pack","--silent",...ce],{cwd:t,env:U,stdin:p,stdout:Ie,stderr:E});if(De.code!==0)return De.code;let Ee=(await he).toString().trim().replace(/^.*\n/s,""),g=V.resolve(t,Ae.toPortablePath(Ee));return await ae.renamePromise(g,e),0}]]).get(C);if(typeof te>"u")throw new Error("Assertion failed: Unsupported workflow");let le=await te();if(!(le===0||typeof le>"u"))throw ae.detachTemp(u),new Jt(58,`Packing the package failed (exit code ${le}, logs can be found here: ${Ut(r,A,Ct.PATH)})`)})})})}async function dat(t,e,{project:r}){let o=r.tryWorkspaceByLocator(t);if(o!==null)return i3(o,e);let a=r.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${jr(r.configuration,t)} not found in the project`);return await iA.openPromise(async n=>{let u=r.configuration,A=r.configuration.getLinkers(),p={project:r,report:new Lt({stdout:new dh.PassThrough,configuration:u})},h=A.find(b=>b.supportsPackage(a,p));if(!h)throw new Error(`The package ${jr(r.configuration,a)} isn't supported by any of the available linkers`);let E=await h.findPackageLocation(a,p),w=new En(E,{baseFs:n});return(await _t.find(Bt.dot,{baseFs:w})).scripts.has(e)})}async function Db(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await ae.mktempPromise(async p=>{let{manifest:h,env:E,cwd:w}=await que(t,{project:a,binFolder:p,cwd:o,lifecycleScript:e}),D=h.scripts.get(e);if(typeof D>"u")return 1;let b=async()=>await ky(D,r,{cwd:w,env:E,stdin:n,stdout:u,stderr:A});return await(await a.configuration.reduceHook(T=>T.wrapScriptExecution,b,a,t,e,{script:D,args:r,cwd:w,env:E,stdin:n,stdout:u,stderr:A}))()})}async function n3(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await ae.mktempPromise(async p=>{let{env:h,cwd:E}=await que(t,{project:a,binFolder:p,cwd:o});return await ky(e,r,{cwd:E,env:h,stdin:n,stdout:u,stderr:A})})}async function mat(t,{binFolder:e,cwd:r,lifecycleScript:o}){let a=await i2({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:o});return await o3(e,await Wue(t)),typeof r>"u"&&(r=V.dirname(await ae.realpathPromise(V.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:a,cwd:r}}async function que(t,{project:e,binFolder:r,cwd:o,lifecycleScript:a}){let n=e.tryWorkspaceByLocator(t);if(n!==null)return mat(n,{binFolder:r,cwd:o,lifecycleScript:a});let u=e.storedPackages.get(t.locatorHash);if(!u)throw new Error(`Package for ${jr(e.configuration,t)} not found in the project`);return await iA.openPromise(async A=>{let p=e.configuration,h=e.configuration.getLinkers(),E={project:e,report:new Lt({stdout:new dh.PassThrough,configuration:p})},w=h.find(N=>N.supportsPackage(u,E));if(!w)throw new Error(`The package ${jr(e.configuration,u)} isn't supported by any of the available linkers`);let D=await i2({project:e,locator:t,binFolder:r,lifecycleScript:a});await o3(r,await Sb(t,{project:e}));let b=await w.findPackageLocation(u,E),C=new En(b,{baseFs:A}),T=await _t.find(Bt.dot,{baseFs:C});return typeof o>"u"&&(o=b),{manifest:T,binFolder:r,env:D,cwd:o}})}async function jue(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u}){return await Db(t.anchoredLocator,e,r,{cwd:o,project:t.project,stdin:a,stdout:n,stderr:u})}function i3(t,e){return t.manifest.scripts.has(e)}async function Gue(t,e,{cwd:r,report:o}){let{configuration:a}=t.project,n=null;await ae.mktempPromise(async u=>{let A=V.join(u,`${e}.log`),p=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${Ae.fromPortablePath(t.cwd)}") -`,{stdout:h,stderr:E}=a.getSubprocessStreams(A,{report:o,prefix:jr(a,t.anchoredLocator),header:p});o.reportInfo(36,`Calling the "${e}" lifecycle script`);let w=await jue(t,e,[],{cwd:r,stdin:n,stdout:h,stderr:E});if(h.end(),E.end(),w!==0)throw ae.detachTemp(u),new Jt(36,`${(0,Mue.default)(e)} script failed (exit code ${Ut(a,w,Ct.NUMBER)}, logs can be found here: ${Ut(a,A,Ct.PATH)}); run ${Ut(a,`yarn ${e}`,Ct.CODE)} to investigate`)})}async function yat(t,e,r){i3(t,e)&&await Gue(t,e,r)}function s3(t){let e=V.extname(t);if(e.match(/\.[cm]?[jt]sx?$/))return!0;if(e===".exe"||e===".bin")return!1;let r=Buffer.alloc(4),o;try{o=ae.openSync(t,"r")}catch{return!0}try{ae.readSync(o,r,0,r.length,0)}finally{ae.closeSync(o)}let a=r.readUint32BE();return!(a===3405691582||a===3489328638||a===2135247942||(a&4294901760)===1297743872)}async function Sb(t,{project:e}){let r=e.configuration,o=new Map,a=e.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${jr(r,t)} not found in the project`);let n=new dh.Writable,u=r.getLinkers(),A={project:e,report:new Lt({configuration:r,stdout:n})},p=new Set([t.locatorHash]);for(let E of a.dependencies.values()){let w=e.storedResolutions.get(E.descriptorHash);if(!w)throw new Error(`Assertion failed: The resolution (${Jn(r,E)}) should have been registered`);p.add(w)}let h=await Promise.all(Array.from(p,async E=>{let w=e.storedPackages.get(E);if(!w)throw new Error(`Assertion failed: The package (${E}) should have been registered`);if(w.bin.size===0)return ul.skip;let D=u.find(C=>C.supportsPackage(w,A));if(!D)return ul.skip;let b=null;try{b=await D.findPackageLocation(w,A)}catch(C){if(C.code==="LOCATOR_NOT_INSTALLED")return ul.skip;throw C}return{dependency:w,packageLocation:b}}));for(let E of h){if(E===ul.skip)continue;let{dependency:w,packageLocation:D}=E;for(let[b,C]of w.bin){let T=V.resolve(D,C);o.set(b,[w,Ae.fromPortablePath(T),s3(T)])}}return o}async function Wue(t){return await Sb(t.anchoredLocator,{project:t.project})}async function o3(t,e){await Promise.all(Array.from(e,([r,[,o,a]])=>a?gh(t,r,process.execPath,[o]):gh(t,r,o,[])))}async function Yue(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A,nodeArgs:p=[],packageAccessibleBinaries:h}){h??=await Sb(t,{project:a});let E=h.get(e);if(!E)throw new Error(`Binary not found (${e}) for ${jr(a.configuration,t)}`);return await ae.mktempPromise(async w=>{let[,D]=E,b=await i2({project:a,locator:t,binFolder:w});await o3(b.BERRY_BIN_FOLDER,h);let C=s3(Ae.toPortablePath(D))?Xc(process.execPath,[...p,D,...r],{cwd:o,env:b,stdin:n,stdout:u,stderr:A}):Xc(D,r,{cwd:o,env:b,stdin:n,stdout:u,stderr:A}),T;try{T=await C}finally{await ae.removePromise(b.BERRY_BIN_FOLDER)}return T.code})}async function Eat(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A}){return await Yue(t.anchoredLocator,e,r,{project:t.project,cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A})}var Mue,Uue,dh,_ue,pat,hat,a3=It(()=>{St();St();sA();z1();Mue=et(t3()),Uue=et(lg()),dh=ve("stream");Ay();Kl();n2();r2();nb();Wl();Gl();bf();Io();_ue=(a=>(a.Yarn1="Yarn Classic",a.Yarn2="Yarn",a.Npm="npm",a.Pnpm="pnpm",a))(_ue||{});pat=2,hat=(0,Uue.default)(pat)});var Fy=_((y4t,Kue)=>{"use strict";var Vue=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]);Kue.exports=t=>t?Object.keys(t).map(e=>[Vue.has(e)?Vue.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var Ty=_((E4t,nAe)=>{"use strict";var Jue=typeof process=="object"&&process?process:{stdout:null,stderr:null},Cat=ve("events"),zue=ve("stream"),Xue=ve("string_decoder").StringDecoder,Nf=Symbol("EOF"),Of=Symbol("maybeEmitEnd"),mh=Symbol("emittedEnd"),Pb=Symbol("emittingEnd"),s2=Symbol("emittedError"),xb=Symbol("closed"),Zue=Symbol("read"),bb=Symbol("flush"),$ue=Symbol("flushChunk"),Ra=Symbol("encoding"),Mf=Symbol("decoder"),kb=Symbol("flowing"),o2=Symbol("paused"),Ry=Symbol("resume"),xs=Symbol("bufferLength"),l3=Symbol("bufferPush"),c3=Symbol("bufferShift"),Do=Symbol("objectMode"),So=Symbol("destroyed"),u3=Symbol("emitData"),eAe=Symbol("emitEnd"),A3=Symbol("emitEnd2"),Uf=Symbol("async"),a2=t=>Promise.resolve().then(t),tAe=global._MP_NO_ITERATOR_SYMBOLS_!=="1",Iat=tAe&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),wat=tAe&&Symbol.iterator||Symbol("iterator not implemented"),Bat=t=>t==="end"||t==="finish"||t==="prefinish",vat=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,Dat=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),Qb=class{constructor(e,r,o){this.src=e,this.dest=r,this.opts=o,this.ondrain=()=>e[Ry](),r.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},f3=class extends Qb{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,r,o){super(e,r,o),this.proxyErrors=a=>r.emit("error",a),e.on("error",this.proxyErrors)}};nAe.exports=class rAe extends zue{constructor(e){super(),this[kb]=!1,this[o2]=!1,this.pipes=[],this.buffer=[],this[Do]=e&&e.objectMode||!1,this[Do]?this[Ra]=null:this[Ra]=e&&e.encoding||null,this[Ra]==="buffer"&&(this[Ra]=null),this[Uf]=e&&!!e.async||!1,this[Mf]=this[Ra]?new Xue(this[Ra]):null,this[Nf]=!1,this[mh]=!1,this[Pb]=!1,this[xb]=!1,this[s2]=null,this.writable=!0,this.readable=!0,this[xs]=0,this[So]=!1}get bufferLength(){return this[xs]}get encoding(){return this[Ra]}set encoding(e){if(this[Do])throw new Error("cannot set encoding in objectMode");if(this[Ra]&&e!==this[Ra]&&(this[Mf]&&this[Mf].lastNeed||this[xs]))throw new Error("cannot change encoding");this[Ra]!==e&&(this[Mf]=e?new Xue(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[Mf].write(r)))),this[Ra]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Do]}set objectMode(e){this[Do]=this[Do]||!!e}get async(){return this[Uf]}set async(e){this[Uf]=this[Uf]||!!e}write(e,r,o){if(this[Nf])throw new Error("write after end");if(this[So])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof r=="function"&&(o=r,r="utf8"),r||(r="utf8");let a=this[Uf]?a2:n=>n();return!this[Do]&&!Buffer.isBuffer(e)&&(Dat(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):vat(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),this[Do]?(this.flowing&&this[xs]!==0&&this[bb](!0),this.flowing?this.emit("data",e):this[l3](e),this[xs]!==0&&this.emit("readable"),o&&a(o),this.flowing):e.length?(typeof e=="string"&&!(r===this[Ra]&&!this[Mf].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[Ra]&&(e=this[Mf].write(e)),this.flowing&&this[xs]!==0&&this[bb](!0),this.flowing?this.emit("data",e):this[l3](e),this[xs]!==0&&this.emit("readable"),o&&a(o),this.flowing):(this[xs]!==0&&this.emit("readable"),o&&a(o),this.flowing)}read(e){if(this[So])return null;if(this[xs]===0||e===0||e>this[xs])return this[Of](),null;this[Do]&&(e=null),this.buffer.length>1&&!this[Do]&&(this.encoding?this.buffer=[this.buffer.join("")]:this.buffer=[Buffer.concat(this.buffer,this[xs])]);let r=this[Zue](e||null,this.buffer[0]);return this[Of](),r}[Zue](e,r){return e===r.length||e===null?this[c3]():(this.buffer[0]=r.slice(e),r=r.slice(0,e),this[xs]-=e),this.emit("data",r),!this.buffer.length&&!this[Nf]&&this.emit("drain"),r}end(e,r,o){return typeof e=="function"&&(o=e,e=null),typeof r=="function"&&(o=r,r="utf8"),e&&this.write(e,r),o&&this.once("end",o),this[Nf]=!0,this.writable=!1,(this.flowing||!this[o2])&&this[Of](),this}[Ry](){this[So]||(this[o2]=!1,this[kb]=!0,this.emit("resume"),this.buffer.length?this[bb]():this[Nf]?this[Of]():this.emit("drain"))}resume(){return this[Ry]()}pause(){this[kb]=!1,this[o2]=!0}get destroyed(){return this[So]}get flowing(){return this[kb]}get paused(){return this[o2]}[l3](e){this[Do]?this[xs]+=1:this[xs]+=e.length,this.buffer.push(e)}[c3](){return this.buffer.length&&(this[Do]?this[xs]-=1:this[xs]-=this.buffer[0].length),this.buffer.shift()}[bb](e){do;while(this[$ue](this[c3]()));!e&&!this.buffer.length&&!this[Nf]&&this.emit("drain")}[$ue](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[So])return;let o=this[mh];return r=r||{},e===Jue.stdout||e===Jue.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,o?r.end&&e.end():(this.pipes.push(r.proxyErrors?new f3(this,e,r):new Qb(this,e,r)),this[Uf]?a2(()=>this[Ry]()):this[Ry]()),e}unpipe(e){let r=this.pipes.find(o=>o.dest===e);r&&(this.pipes.splice(this.pipes.indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let o=super.on(e,r);return e==="data"&&!this.pipes.length&&!this.flowing?this[Ry]():e==="readable"&&this[xs]!==0?super.emit("readable"):Bat(e)&&this[mh]?(super.emit(e),this.removeAllListeners(e)):e==="error"&&this[s2]&&(this[Uf]?a2(()=>r.call(this,this[s2])):r.call(this,this[s2])),o}get emittedEnd(){return this[mh]}[Of](){!this[Pb]&&!this[mh]&&!this[So]&&this.buffer.length===0&&this[Nf]&&(this[Pb]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[xb]&&this.emit("close"),this[Pb]=!1)}emit(e,r,...o){if(e!=="error"&&e!=="close"&&e!==So&&this[So])return;if(e==="data")return r?this[Uf]?a2(()=>this[u3](r)):this[u3](r):!1;if(e==="end")return this[eAe]();if(e==="close"){if(this[xb]=!0,!this[mh]&&!this[So])return;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[s2]=r;let n=super.emit("error",r);return this[Of](),n}else if(e==="resume"){let n=super.emit("resume");return this[Of](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let a=super.emit(e,r,...o);return this[Of](),a}[u3](e){for(let o of this.pipes)o.dest.write(e)===!1&&this.pause();let r=super.emit("data",e);return this[Of](),r}[eAe](){this[mh]||(this[mh]=!0,this.readable=!1,this[Uf]?a2(()=>this[A3]()):this[A3]())}[A3](){if(this[Mf]){let r=this[Mf].end();if(r){for(let o of this.pipes)o.dest.write(r);super.emit("data",r)}}for(let r of this.pipes)r.end();let e=super.emit("end");return this.removeAllListeners("end"),e}collect(){let e=[];this[Do]||(e.dataLength=0);let r=this.promise();return this.on("data",o=>{e.push(o),this[Do]||(e.dataLength+=o.length)}),r.then(()=>e)}concat(){return this[Do]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[Do]?Promise.reject(new Error("cannot concat in objectMode")):this[Ra]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(So,()=>r(new Error("stream destroyed"))),this.on("error",o=>r(o)),this.on("end",()=>e())})}[Iat](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[Nf])return Promise.resolve({done:!0});let o=null,a=null,n=h=>{this.removeListener("data",u),this.removeListener("end",A),a(h)},u=h=>{this.removeListener("error",n),this.removeListener("end",A),this.pause(),o({value:h,done:!!this[Nf]})},A=()=>{this.removeListener("error",n),this.removeListener("data",u),o({done:!0})},p=()=>n(new Error("stream destroyed"));return new Promise((h,E)=>{a=E,o=h,this.once(So,p),this.once("error",n),this.once("end",A),this.once("data",u)})}}}[wat](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[So]?(e?this.emit("error",e):this.emit(So),this):(this[So]=!0,this.buffer.length=0,this[xs]=0,typeof this.close=="function"&&!this[xb]&&this.close(),e?this.emit("error",e):this.emit(So),this)}static isStream(e){return!!e&&(e instanceof rAe||e instanceof zue||e instanceof Cat&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var sAe=_((C4t,iAe)=>{var Sat=ve("zlib").constants||{ZLIB_VERNUM:4736};iAe.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Sat))});var x3=_(hl=>{"use strict";var m3=ve("assert"),yh=ve("buffer").Buffer,lAe=ve("zlib"),Tg=hl.constants=sAe(),Pat=Ty(),oAe=yh.concat,Lg=Symbol("_superWrite"),Ny=class extends Error{constructor(e){super("zlib: "+e.message),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},xat=Symbol("opts"),l2=Symbol("flushFlag"),aAe=Symbol("finishFlushFlag"),P3=Symbol("fullFlushFlag"),ui=Symbol("handle"),Fb=Symbol("onError"),Ly=Symbol("sawError"),p3=Symbol("level"),h3=Symbol("strategy"),g3=Symbol("ended"),I4t=Symbol("_defaultFullFlush"),Rb=class extends Pat{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e),this[Ly]=!1,this[g3]=!1,this[xat]=e,this[l2]=e.flush,this[aAe]=e.finishFlush;try{this[ui]=new lAe[r](e)}catch(o){throw new Ny(o)}this[Fb]=o=>{this[Ly]||(this[Ly]=!0,this.close(),this.emit("error",o))},this[ui].on("error",o=>this[Fb](new Ny(o))),this.once("end",()=>this.close)}close(){this[ui]&&(this[ui].close(),this[ui]=null,this.emit("close"))}reset(){if(!this[Ly])return m3(this[ui],"zlib binding closed"),this[ui].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[P3]),this.write(Object.assign(yh.alloc(0),{[l2]:e})))}end(e,r,o){return e&&this.write(e,r),this.flush(this[aAe]),this[g3]=!0,super.end(null,null,o)}get ended(){return this[g3]}write(e,r,o){if(typeof r=="function"&&(o=r,r="utf8"),typeof e=="string"&&(e=yh.from(e,r)),this[Ly])return;m3(this[ui],"zlib binding closed");let a=this[ui]._handle,n=a.close;a.close=()=>{};let u=this[ui].close;this[ui].close=()=>{},yh.concat=h=>h;let A;try{let h=typeof e[l2]=="number"?e[l2]:this[l2];A=this[ui]._processChunk(e,h),yh.concat=oAe}catch(h){yh.concat=oAe,this[Fb](new Ny(h))}finally{this[ui]&&(this[ui]._handle=a,a.close=n,this[ui].close=u,this[ui].removeAllListeners("error"))}this[ui]&&this[ui].on("error",h=>this[Fb](new Ny(h)));let p;if(A)if(Array.isArray(A)&&A.length>0){p=this[Lg](yh.from(A[0]));for(let h=1;h{this.flush(a),n()};try{this[ui].params(e,r)}finally{this[ui].flush=o}this[ui]&&(this[p3]=e,this[h3]=r)}}}},y3=class extends _f{constructor(e){super(e,"Deflate")}},E3=class extends _f{constructor(e){super(e,"Inflate")}},d3=Symbol("_portable"),C3=class extends _f{constructor(e){super(e,"Gzip"),this[d3]=e&&!!e.portable}[Lg](e){return this[d3]?(this[d3]=!1,e[9]=255,super[Lg](e)):super[Lg](e)}},I3=class extends _f{constructor(e){super(e,"Gunzip")}},w3=class extends _f{constructor(e){super(e,"DeflateRaw")}},B3=class extends _f{constructor(e){super(e,"InflateRaw")}},v3=class extends _f{constructor(e){super(e,"Unzip")}},Tb=class extends Rb{constructor(e,r){e=e||{},e.flush=e.flush||Tg.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Tg.BROTLI_OPERATION_FINISH,super(e,r),this[P3]=Tg.BROTLI_OPERATION_FLUSH}},D3=class extends Tb{constructor(e){super(e,"BrotliCompress")}},S3=class extends Tb{constructor(e){super(e,"BrotliDecompress")}};hl.Deflate=y3;hl.Inflate=E3;hl.Gzip=C3;hl.Gunzip=I3;hl.DeflateRaw=w3;hl.InflateRaw=B3;hl.Unzip=v3;typeof lAe.BrotliCompress=="function"?(hl.BrotliCompress=D3,hl.BrotliDecompress=S3):hl.BrotliCompress=hl.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var Oy=_((v4t,cAe)=>{var bat=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;cAe.exports=bat!=="win32"?t=>t:t=>t&&t.replace(/\\/g,"/")});var Lb=_((S4t,uAe)=>{"use strict";var kat=Ty(),b3=Oy(),k3=Symbol("slurp");uAe.exports=class extends kat{constructor(e,r,o){switch(super(),this.pause(),this.extended=r,this.globalExtended=o,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=b3(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=b3(e.linkpath),this.uname=e.uname,this.gname=e.gname,r&&this[k3](r),o&&this[k3](o,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let o=this.remain,a=this.blockRemain;return this.remain=Math.max(0,o-r),this.blockRemain=Math.max(0,a-r),this.ignore?!0:o>=r?super.write(e):super.write(e.slice(0,o))}[k3](e,r){for(let o in e)e[o]!==null&&e[o]!==void 0&&!(r&&o==="path")&&(this[o]=o==="path"||o==="linkpath"?b3(e[o]):e[o])}}});var Q3=_(Nb=>{"use strict";Nb.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);Nb.code=new Map(Array.from(Nb.name).map(t=>[t[1],t[0]]))});var hAe=_((x4t,pAe)=>{"use strict";var Qat=(t,e)=>{if(Number.isSafeInteger(t))t<0?Rat(t,e):Fat(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},Fat=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},Rat=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var o=e.length;o>1;o--){var a=t&255;t=Math.floor(t/256),r?e[o-1]=AAe(a):a===0?e[o-1]=0:(r=!0,e[o-1]=fAe(a))}},Tat=t=>{let e=t[0],r=e===128?Nat(t.slice(1,t.length)):e===255?Lat(t):null;if(r===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(r))throw Error("parsed number outside of javascript safe integer range");return r},Lat=t=>{for(var e=t.length,r=0,o=!1,a=e-1;a>-1;a--){var n=t[a],u;o?u=AAe(n):n===0?u=n:(o=!0,u=fAe(n)),u!==0&&(r-=u*Math.pow(256,e-a-1))}return r},Nat=t=>{for(var e=t.length,r=0,o=e-1;o>-1;o--){var a=t[o];a!==0&&(r+=a*Math.pow(256,e-o-1))}return r},AAe=t=>(255^t)&255,fAe=t=>(255^t)+1&255;pAe.exports={encode:Qat,parse:Tat}});var Uy=_((b4t,dAe)=>{"use strict";var F3=Q3(),My=ve("path").posix,gAe=hAe(),R3=Symbol("slurp"),gl=Symbol("type"),N3=class{constructor(e,r,o,a){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[gl]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,o,a):e&&this.set(e)}decode(e,r,o,a){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=Ng(e,r,100),this.mode=Eh(e,r+100,8),this.uid=Eh(e,r+108,8),this.gid=Eh(e,r+116,8),this.size=Eh(e,r+124,12),this.mtime=T3(e,r+136,12),this.cksum=Eh(e,r+148,12),this[R3](o),this[R3](a,!0),this[gl]=Ng(e,r+156,1),this[gl]===""&&(this[gl]="0"),this[gl]==="0"&&this.path.substr(-1)==="/"&&(this[gl]="5"),this[gl]==="5"&&(this.size=0),this.linkpath=Ng(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=Ng(e,r+265,32),this.gname=Ng(e,r+297,32),this.devmaj=Eh(e,r+329,8),this.devmin=Eh(e,r+337,8),e[r+475]!==0){let u=Ng(e,r+345,155);this.path=u+"/"+this.path}else{let u=Ng(e,r+345,130);u&&(this.path=u+"/"+this.path),this.atime=T3(e,r+476,12),this.ctime=T3(e,r+488,12)}let n=8*32;for(let u=r;u=r+512))throw new Error("need 512 bytes for header");let o=this.ctime||this.atime?130:155,a=Oat(this.path||"",o),n=a[0],u=a[1];this.needPax=a[2],this.needPax=Og(e,r,100,n)||this.needPax,this.needPax=Ch(e,r+100,8,this.mode)||this.needPax,this.needPax=Ch(e,r+108,8,this.uid)||this.needPax,this.needPax=Ch(e,r+116,8,this.gid)||this.needPax,this.needPax=Ch(e,r+124,12,this.size)||this.needPax,this.needPax=L3(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[gl].charCodeAt(0),this.needPax=Og(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=Og(e,r+265,32,this.uname)||this.needPax,this.needPax=Og(e,r+297,32,this.gname)||this.needPax,this.needPax=Ch(e,r+329,8,this.devmaj)||this.needPax,this.needPax=Ch(e,r+337,8,this.devmin)||this.needPax,this.needPax=Og(e,r+345,o,u)||this.needPax,e[r+475]!==0?this.needPax=Og(e,r+345,155,u)||this.needPax:(this.needPax=Og(e,r+345,130,u)||this.needPax,this.needPax=L3(e,r+476,12,this.atime)||this.needPax,this.needPax=L3(e,r+488,12,this.ctime)||this.needPax);let A=8*32;for(let p=r;p{let o=t,a="",n,u=My.parse(t).root||".";if(Buffer.byteLength(o)<100)n=[o,a,!1];else{a=My.dirname(o),o=My.basename(o);do Buffer.byteLength(o)<=100&&Buffer.byteLength(a)<=e?n=[o,a,!1]:Buffer.byteLength(o)>100&&Buffer.byteLength(a)<=e?n=[o.substr(0,99),a,!0]:(o=My.join(My.basename(a),o),a=My.dirname(a));while(a!==u&&!n);n||(n=[t.substr(0,99),"",!0])}return n},Ng=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),T3=(t,e,r)=>Mat(Eh(t,e,r)),Mat=t=>t===null?null:new Date(t*1e3),Eh=(t,e,r)=>t[e]&128?gAe.parse(t.slice(e,e+r)):_at(t,e,r),Uat=t=>isNaN(t)?null:t,_at=(t,e,r)=>Uat(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),Hat={12:8589934591,8:2097151},Ch=(t,e,r,o)=>o===null?!1:o>Hat[r]||o<0?(gAe.encode(o,t.slice(e,e+r)),!0):(qat(t,e,r,o),!1),qat=(t,e,r,o)=>t.write(jat(o,r),e,r,"ascii"),jat=(t,e)=>Gat(Math.floor(t).toString(8),e),Gat=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",L3=(t,e,r,o)=>o===null?!1:Ch(t,e,r,o.getTime()/1e3),Wat=new Array(156).join("\0"),Og=(t,e,r,o)=>o===null?!1:(t.write(o+Wat,e,r,"utf8"),o.length!==Buffer.byteLength(o)||o.length>r);dAe.exports=N3});var Ob=_((k4t,mAe)=>{"use strict";var Yat=Uy(),Vat=ve("path"),c2=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),o=512*Math.ceil(1+r/512),a=Buffer.allocUnsafe(o);for(let n=0;n<512;n++)a[n]=0;new Yat({path:("PaxHeader/"+Vat.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(a),a.write(e,512,r,"utf8");for(let n=r+512;n=Math.pow(10,n)&&(n+=1),n+a+o}};c2.parse=(t,e,r)=>new c2(Kat(Jat(t),e),r);var Kat=(t,e)=>e?Object.keys(t).reduce((r,o)=>(r[o]=t[o],r),e):t,Jat=t=>t.replace(/\n$/,"").split(` -`).reduce(zat,Object.create(null)),zat=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let o=e.split("="),a=o.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!a)return t;let n=o.join("=");return t[a]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(a)?new Date(n*1e3):/^[0-9]+$/.test(n)?+n:n,t};mAe.exports=c2});var _y=_((Q4t,yAe)=>{yAe.exports=t=>{let e=t.length-1,r=-1;for(;e>-1&&t.charAt(e)==="/";)r=e,e--;return r===-1?t:t.slice(0,r)}});var Mb=_((F4t,EAe)=>{"use strict";EAe.exports=t=>class extends t{warn(e,r,o={}){this.file&&(o.file=this.file),this.cwd&&(o.cwd=this.cwd),o.code=r instanceof Error&&r.code||e,o.tarCode=e,!this.strict&&o.recoverable!==!1?(r instanceof Error&&(o=Object.assign(r,o),r=r.message),this.emit("warn",o.tarCode,r,o)):r instanceof Error?this.emit("error",Object.assign(r,o)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),o))}}});var M3=_((T4t,CAe)=>{"use strict";var Ub=["|","<",">","?",":"],O3=Ub.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),Xat=new Map(Ub.map((t,e)=>[t,O3[e]])),Zat=new Map(O3.map((t,e)=>[t,Ub[e]]));CAe.exports={encode:t=>Ub.reduce((e,r)=>e.split(r).join(Xat.get(r)),t),decode:t=>O3.reduce((e,r)=>e.split(r).join(Zat.get(r)),t)}});var U3=_((L4t,wAe)=>{var{isAbsolute:$at,parse:IAe}=ve("path").win32;wAe.exports=t=>{let e="",r=IAe(t);for(;$at(t)||r.root;){let o=t.charAt(0)==="/"&&t.slice(0,4)!=="//?/"?"/":r.root;t=t.substr(o.length),e+=o,r=IAe(t)}return[e,t]}});var vAe=_((N4t,BAe)=>{"use strict";BAe.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&-19),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var J3=_((U4t,MAe)=>{"use strict";var QAe=Ty(),FAe=Ob(),RAe=Uy(),lA=ve("fs"),DAe=ve("path"),aA=Oy(),elt=_y(),TAe=(t,e)=>e?(t=aA(t).replace(/^\.(\/|$)/,""),elt(e)+"/"+t):aA(t),tlt=16*1024*1024,SAe=Symbol("process"),PAe=Symbol("file"),xAe=Symbol("directory"),H3=Symbol("symlink"),bAe=Symbol("hardlink"),u2=Symbol("header"),_b=Symbol("read"),q3=Symbol("lstat"),Hb=Symbol("onlstat"),j3=Symbol("onread"),G3=Symbol("onreadlink"),W3=Symbol("openfile"),Y3=Symbol("onopenfile"),Ih=Symbol("close"),qb=Symbol("mode"),V3=Symbol("awaitDrain"),_3=Symbol("ondrain"),cA=Symbol("prefix"),kAe=Symbol("hadError"),LAe=Mb(),rlt=M3(),NAe=U3(),OAe=vAe(),jb=LAe(class extends QAe{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=aA(e),this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid()||0,this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||tlt,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=aA(r.cwd||process.cwd()),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,this.prefix=r.prefix?aA(r.prefix):null,this.fd=null,this.blockLen=null,this.blockRemain=null,this.buf=null,this.offset=null,this.length=null,this.pos=null,this.remain=null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=NAe(this.path);a&&(this.path=n,o=a)}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=rlt.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=aA(r.absolute||DAe.resolve(this.cwd,e)),this.path===""&&(this.path="./"),o&&this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.statCache.has(this.absolute)?this[Hb](this.statCache.get(this.absolute)):this[q3]()}emit(e,...r){return e==="error"&&(this[kAe]=!0),super.emit(e,...r)}[q3](){lA.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[Hb](r)})}[Hb](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=ilt(e),this.emit("stat",e),this[SAe]()}[SAe](){switch(this.type){case"File":return this[PAe]();case"Directory":return this[xAe]();case"SymbolicLink":return this[H3]();default:return this.end()}}[qb](e){return OAe(e,this.type==="Directory",this.portable)}[cA](e){return TAe(e,this.prefix)}[u2](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new RAe({path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,mode:this[qb](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new FAe({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),super.write(this.header.block)}[xAe](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[u2](),this.end()}[H3](){lA.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[G3](r)})}[G3](e){this.linkpath=aA(e),this[u2](),this.end()}[bAe](e){this.type="Link",this.linkpath=aA(DAe.relative(this.cwd,e)),this.stat.size=0,this[u2](),this.end()}[PAe](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[bAe](r)}this.linkCache.set(e,this.absolute)}if(this[u2](),this.stat.size===0)return this.end();this[W3]()}[W3](){lA.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[Y3](r)})}[Y3](e){if(this.fd=e,this[kAe])return this[Ih]();this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let r=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(r),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[_b]()}[_b](){let{fd:e,buf:r,offset:o,length:a,pos:n}=this;lA.read(e,r,o,a,n,(u,A)=>{if(u)return this[Ih](()=>this.emit("error",u));this[j3](A)})}[Ih](e){lA.close(this.fd,e)}[j3](e){if(e<=0&&this.remain>0){let a=new Error("encountered unexpected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[Ih](()=>this.emit("error",a))}if(e>this.remain){let a=new Error("did not encounter expected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[Ih](()=>this.emit("error",a))}if(e===this.remain)for(let a=e;athis[_3]())}[V3](e){this.once("drain",e)}write(e){if(this.blockRemaine?this.emit("error",e):this.end());this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[_b]()}}),K3=class extends jb{[q3](){this[Hb](lA.lstatSync(this.absolute))}[H3](){this[G3](lA.readlinkSync(this.absolute))}[W3](){this[Y3](lA.openSync(this.absolute,"r"))}[_b](){let e=!0;try{let{fd:r,buf:o,offset:a,length:n,pos:u}=this,A=lA.readSync(r,o,a,n,u);this[j3](A),e=!1}finally{if(e)try{this[Ih](()=>{})}catch{}}}[V3](e){e()}[Ih](e){lA.closeSync(this.fd),e()}},nlt=LAe(class extends QAe{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=r.prefix||null,this.path=aA(e.path),this.mode=this[qb](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=aA(e.linkpath),typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=NAe(this.path);a&&(this.path=n,o=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new RAe({path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),o&&this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.header.encode()&&!this.noPax&&super.write(new FAe({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[cA](e){return TAe(e,this.prefix)}[qb](e){return OAe(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),super.end()}});jb.Sync=K3;jb.Tar=nlt;var ilt=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";MAe.exports=jb});var Zb=_((H4t,WAe)=>{"use strict";var zb=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},slt=Ty(),olt=x3(),alt=Lb(),i_=J3(),llt=i_.Sync,clt=i_.Tar,ult=eP(),UAe=Buffer.alloc(1024),Yb=Symbol("onStat"),Gb=Symbol("ended"),uA=Symbol("queue"),Hy=Symbol("current"),Mg=Symbol("process"),Wb=Symbol("processing"),_Ae=Symbol("processJob"),AA=Symbol("jobs"),z3=Symbol("jobDone"),Vb=Symbol("addFSEntry"),HAe=Symbol("addTarEntry"),e_=Symbol("stat"),t_=Symbol("readdir"),Kb=Symbol("onreaddir"),Jb=Symbol("pipe"),qAe=Symbol("entry"),X3=Symbol("entryOpt"),r_=Symbol("writeEntryClass"),GAe=Symbol("write"),Z3=Symbol("ondrain"),Xb=ve("fs"),jAe=ve("path"),Alt=Mb(),$3=Oy(),s_=Alt(class extends slt{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=$3(e.prefix||""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[r_]=i_,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new olt.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[Z3]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[Z3]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[uA]=new ult,this[AA]=0,this.jobs=+e.jobs||4,this[Wb]=!1,this[Gb]=!1}[GAe](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[Gb]=!0,this[Mg](),this}write(e){if(this[Gb])throw new Error("write after end");return e instanceof alt?this[HAe](e):this[Vb](e),this.flowing}[HAe](e){let r=$3(jAe.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let o=new zb(e.path,r,!1);o.entry=new clt(e,this[X3](o)),o.entry.on("end",a=>this[z3](o)),this[AA]+=1,this[uA].push(o)}this[Mg]()}[Vb](e){let r=$3(jAe.resolve(this.cwd,e));this[uA].push(new zb(e,r)),this[Mg]()}[e_](e){e.pending=!0,this[AA]+=1;let r=this.follow?"stat":"lstat";Xb[r](e.absolute,(o,a)=>{e.pending=!1,this[AA]-=1,o?this.emit("error",o):this[Yb](e,a)})}[Yb](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[Mg]()}[t_](e){e.pending=!0,this[AA]+=1,Xb.readdir(e.absolute,(r,o)=>{if(e.pending=!1,this[AA]-=1,r)return this.emit("error",r);this[Kb](e,o)})}[Kb](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[Mg]()}[Mg](){if(!this[Wb]){this[Wb]=!0;for(let e=this[uA].head;e!==null&&this[AA]this.warn(r,o,a),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix}}[qAe](e){this[AA]+=1;try{return new this[r_](e.path,this[X3](e)).on("end",()=>this[z3](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[Z3](){this[Hy]&&this[Hy].entry&&this[Hy].entry.resume()}[Jb](e){e.piped=!0,e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n==="./"?"":n.replace(/\/*$/,"/");this[Vb](u+a)});let r=e.entry,o=this.zip;o?r.on("data",a=>{o.write(a)||r.pause()}):r.on("data",a=>{super.write(a)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),n_=class extends s_{constructor(e){super(e),this[r_]=llt}pause(){}resume(){}[e_](e){let r=this.follow?"statSync":"lstatSync";this[Yb](e,Xb[r](e.absolute))}[t_](e,r){this[Kb](e,Xb.readdirSync(e.absolute))}[Jb](e){let r=e.entry,o=this.zip;e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n==="./"?"":n.replace(/\/*$/,"/");this[Vb](u+a)}),o?r.on("data",a=>{o.write(a)}):r.on("data",a=>{super[GAe](a)})}};s_.Sync=n_;WAe.exports=s_});var Jy=_(f2=>{"use strict";var flt=Ty(),plt=ve("events").EventEmitter,Ta=ve("fs"),l_=Ta.writev;if(!l_){let t=process.binding("fs"),e=t.FSReqWrap||t.FSReqCallback;l_=(r,o,a,n)=>{let u=(p,h)=>n(p,h,o),A=new e;A.oncomplete=u,t.writeBuffers(r,o,a,A)}}var Vy=Symbol("_autoClose"),Zc=Symbol("_close"),A2=Symbol("_ended"),zn=Symbol("_fd"),YAe=Symbol("_finished"),Bh=Symbol("_flags"),o_=Symbol("_flush"),c_=Symbol("_handleChunk"),u_=Symbol("_makeBuf"),nk=Symbol("_mode"),$b=Symbol("_needDrain"),Wy=Symbol("_onerror"),Ky=Symbol("_onopen"),a_=Symbol("_onread"),jy=Symbol("_onwrite"),vh=Symbol("_open"),Hf=Symbol("_path"),Ug=Symbol("_pos"),fA=Symbol("_queue"),Gy=Symbol("_read"),VAe=Symbol("_readSize"),wh=Symbol("_reading"),ek=Symbol("_remain"),KAe=Symbol("_size"),tk=Symbol("_write"),qy=Symbol("_writing"),rk=Symbol("_defaultFlag"),Yy=Symbol("_errored"),ik=class extends flt{constructor(e,r){if(r=r||{},super(r),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Yy]=!1,this[zn]=typeof r.fd=="number"?r.fd:null,this[Hf]=e,this[VAe]=r.readSize||16*1024*1024,this[wh]=!1,this[KAe]=typeof r.size=="number"?r.size:1/0,this[ek]=this[KAe],this[Vy]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[zn]=="number"?this[Gy]():this[vh]()}get fd(){return this[zn]}get path(){return this[Hf]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[vh](){Ta.open(this[Hf],"r",(e,r)=>this[Ky](e,r))}[Ky](e,r){e?this[Wy](e):(this[zn]=r,this.emit("open",r),this[Gy]())}[u_](){return Buffer.allocUnsafe(Math.min(this[VAe],this[ek]))}[Gy](){if(!this[wh]){this[wh]=!0;let e=this[u_]();if(e.length===0)return process.nextTick(()=>this[a_](null,0,e));Ta.read(this[zn],e,0,e.length,null,(r,o,a)=>this[a_](r,o,a))}}[a_](e,r,o){this[wh]=!1,e?this[Wy](e):this[c_](r,o)&&this[Gy]()}[Zc](){if(this[Vy]&&typeof this[zn]=="number"){let e=this[zn];this[zn]=null,Ta.close(e,r=>r?this.emit("error",r):this.emit("close"))}}[Wy](e){this[wh]=!0,this[Zc](),this.emit("error",e)}[c_](e,r){let o=!1;return this[ek]-=e,e>0&&(o=super.write(ethis[Ky](e,r))}[Ky](e,r){this[rk]&&this[Bh]==="r+"&&e&&e.code==="ENOENT"?(this[Bh]="w",this[vh]()):e?this[Wy](e):(this[zn]=r,this.emit("open",r),this[o_]())}end(e,r){return e&&this.write(e,r),this[A2]=!0,!this[qy]&&!this[fA].length&&typeof this[zn]=="number"&&this[jy](null,0),this}write(e,r){return typeof e=="string"&&(e=Buffer.from(e,r)),this[A2]?(this.emit("error",new Error("write() after end()")),!1):this[zn]===null||this[qy]||this[fA].length?(this[fA].push(e),this[$b]=!0,!1):(this[qy]=!0,this[tk](e),!0)}[tk](e){Ta.write(this[zn],e,0,e.length,this[Ug],(r,o)=>this[jy](r,o))}[jy](e,r){e?this[Wy](e):(this[Ug]!==null&&(this[Ug]+=r),this[fA].length?this[o_]():(this[qy]=!1,this[A2]&&!this[YAe]?(this[YAe]=!0,this[Zc](),this.emit("finish")):this[$b]&&(this[$b]=!1,this.emit("drain"))))}[o_](){if(this[fA].length===0)this[A2]&&this[jy](null,0);else if(this[fA].length===1)this[tk](this[fA].pop());else{let e=this[fA];this[fA]=[],l_(this[zn],e,this[Ug],(r,o)=>this[jy](r,o))}}[Zc](){if(this[Vy]&&typeof this[zn]=="number"){let e=this[zn];this[zn]=null,Ta.close(e,r=>r?this.emit("error",r):this.emit("close"))}}},f_=class extends sk{[vh](){let e;if(this[rk]&&this[Bh]==="r+")try{e=Ta.openSync(this[Hf],this[Bh],this[nk])}catch(r){if(r.code==="ENOENT")return this[Bh]="w",this[vh]();throw r}else e=Ta.openSync(this[Hf],this[Bh],this[nk]);this[Ky](null,e)}[Zc](){if(this[Vy]&&typeof this[zn]=="number"){let e=this[zn];this[zn]=null,Ta.closeSync(e),this.emit("close")}}[tk](e){let r=!0;try{this[jy](null,Ta.writeSync(this[zn],e,0,e.length,this[Ug])),r=!1}finally{if(r)try{this[Zc]()}catch{}}}};f2.ReadStream=ik;f2.ReadStreamSync=A_;f2.WriteStream=sk;f2.WriteStreamSync=f_});var fk=_((G4t,tfe)=>{"use strict";var hlt=Mb(),glt=Uy(),dlt=ve("events"),mlt=eP(),ylt=1024*1024,Elt=Lb(),JAe=Ob(),Clt=x3(),p_=Buffer.from([31,139]),$l=Symbol("state"),_g=Symbol("writeEntry"),qf=Symbol("readEntry"),h_=Symbol("nextEntry"),zAe=Symbol("processEntry"),ec=Symbol("extendedHeader"),p2=Symbol("globalExtendedHeader"),Dh=Symbol("meta"),XAe=Symbol("emitMeta"),yi=Symbol("buffer"),jf=Symbol("queue"),Hg=Symbol("ended"),ZAe=Symbol("emittedEnd"),qg=Symbol("emit"),La=Symbol("unzip"),ok=Symbol("consumeChunk"),ak=Symbol("consumeChunkSub"),g_=Symbol("consumeBody"),$Ae=Symbol("consumeMeta"),efe=Symbol("consumeHeader"),lk=Symbol("consuming"),d_=Symbol("bufferConcat"),m_=Symbol("maybeEnd"),h2=Symbol("writing"),Sh=Symbol("aborted"),ck=Symbol("onDone"),jg=Symbol("sawValidEntry"),uk=Symbol("sawNullBlock"),Ak=Symbol("sawEOF"),Ilt=t=>!0;tfe.exports=hlt(class extends dlt{constructor(e){e=e||{},super(e),this.file=e.file||"",this[jg]=null,this.on(ck,r=>{(this[$l]==="begin"||this[jg]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(ck,e.ondone):this.on(ck,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||ylt,this.filter=typeof e.filter=="function"?e.filter:Ilt,this.writable=!0,this.readable=!1,this[jf]=new mlt,this[yi]=null,this[qf]=null,this[_g]=null,this[$l]="begin",this[Dh]="",this[ec]=null,this[p2]=null,this[Hg]=!1,this[La]=null,this[Sh]=!1,this[uk]=!1,this[Ak]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[efe](e,r){this[jg]===null&&(this[jg]=!1);let o;try{o=new glt(e,r,this[ec],this[p2])}catch(a){return this.warn("TAR_ENTRY_INVALID",a)}if(o.nullBlock)this[uk]?(this[Ak]=!0,this[$l]==="begin"&&(this[$l]="header"),this[qg]("eof")):(this[uk]=!0,this[qg]("nullBlock"));else if(this[uk]=!1,!o.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:o});else if(!o.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:o});else{let a=o.type;if(/^(Symbolic)?Link$/.test(a)&&!o.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:o});else if(!/^(Symbolic)?Link$/.test(a)&&o.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:o});else{let n=this[_g]=new Elt(o,this[ec],this[p2]);if(!this[jg])if(n.remain){let u=()=>{n.invalid||(this[jg]=!0)};n.on("end",u)}else this[jg]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[qg]("ignoredEntry",n),this[$l]="ignore",n.resume()):n.size>0&&(this[Dh]="",n.on("data",u=>this[Dh]+=u),this[$l]="meta"):(this[ec]=null,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[qg]("ignoredEntry",n),this[$l]=n.remain?"ignore":"header",n.resume()):(n.remain?this[$l]="body":(this[$l]="header",n.end()),this[qf]?this[jf].push(n):(this[jf].push(n),this[h_]())))}}}[zAe](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[qf]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",o=>this[h_]()),r=!1)):(this[qf]=null,r=!1),r}[h_](){do;while(this[zAe](this[jf].shift()));if(!this[jf].length){let e=this[qf];!e||e.flowing||e.size===e.remain?this[h2]||this.emit("drain"):e.once("drain",o=>this.emit("drain"))}}[g_](e,r){let o=this[_g],a=o.blockRemain,n=a>=e.length&&r===0?e:e.slice(r,r+a);return o.write(n),o.blockRemain||(this[$l]="header",this[_g]=null,o.end()),n.length}[$Ae](e,r){let o=this[_g],a=this[g_](e,r);return this[_g]||this[XAe](o),a}[qg](e,r,o){!this[jf].length&&!this[qf]?this.emit(e,r,o):this[jf].push([e,r,o])}[XAe](e){switch(this[qg]("meta",this[Dh]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[ec]=JAe.parse(this[Dh],this[ec],!1);break;case"GlobalExtendedHeader":this[p2]=JAe.parse(this[Dh],this[p2],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[ec]=this[ec]||Object.create(null),this[ec].path=this[Dh].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[ec]=this[ec]||Object.create(null),this[ec].linkpath=this[Dh].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[Sh]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[Sh])return;if(this[La]===null&&e){if(this[yi]&&(e=Buffer.concat([this[yi],e]),this[yi]=null),e.lengththis[ok](n)),this[La].on("error",n=>this.abort(n)),this[La].on("end",n=>{this[Hg]=!0,this[ok]()}),this[h2]=!0;let a=this[La][o?"end":"write"](e);return this[h2]=!1,a}}this[h2]=!0,this[La]?this[La].write(e):this[ok](e),this[h2]=!1;let r=this[jf].length?!1:this[qf]?this[qf].flowing:!0;return!r&&!this[jf].length&&this[qf].once("drain",o=>this.emit("drain")),r}[d_](e){e&&!this[Sh]&&(this[yi]=this[yi]?Buffer.concat([this[yi],e]):e)}[m_](){if(this[Hg]&&!this[ZAe]&&!this[Sh]&&!this[lk]){this[ZAe]=!0;let e=this[_g];if(e&&e.blockRemain){let r=this[yi]?this[yi].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[yi]&&e.write(this[yi]),e.end()}this[qg](ck)}}[ok](e){if(this[lk])this[d_](e);else if(!e&&!this[yi])this[m_]();else{if(this[lk]=!0,this[yi]){this[d_](e);let r=this[yi];this[yi]=null,this[ak](r)}else this[ak](e);for(;this[yi]&&this[yi].length>=512&&!this[Sh]&&!this[Ak];){let r=this[yi];this[yi]=null,this[ak](r)}this[lk]=!1}(!this[yi]||this[Hg])&&this[m_]()}[ak](e){let r=0,o=e.length;for(;r+512<=o&&!this[Sh]&&!this[Ak];)switch(this[$l]){case"begin":case"header":this[efe](e,r),r+=512;break;case"ignore":case"body":r+=this[g_](e,r);break;case"meta":r+=this[$Ae](e,r);break;default:throw new Error("invalid state: "+this[$l])}r{"use strict";var wlt=Fy(),nfe=fk(),zy=ve("fs"),Blt=Jy(),rfe=ve("path"),y_=_y();sfe.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=wlt(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&Dlt(o,e),o.noResume||vlt(o),o.file&&o.sync?Slt(o):o.file?Plt(o,r):ife(o)};var vlt=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},Dlt=(t,e)=>{let r=new Map(e.map(n=>[y_(n),!0])),o=t.filter,a=(n,u)=>{let A=u||rfe.parse(n).root||".",p=n===A?!1:r.has(n)?r.get(n):a(rfe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(y_(n)):n=>a(y_(n))},Slt=t=>{let e=ife(t),r=t.file,o=!0,a;try{let n=zy.statSync(r),u=t.maxReadSize||16*1024*1024;if(n.size{let r=new nfe(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on("error",A),r.on("end",u),zy.stat(a,(p,h)=>{if(p)A(p);else{let E=new Blt.ReadStream(a,{readSize:o,size:h.size});E.on("error",A),E.pipe(r)}})});return e?n.then(e,e):n},ife=t=>new nfe(t)});var Afe=_((Y4t,ufe)=>{"use strict";var xlt=Fy(),hk=Zb(),ofe=Jy(),afe=pk(),lfe=ve("path");ufe.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let o=xlt(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return o.file&&o.sync?blt(o,e):o.file?klt(o,e,r):o.sync?Qlt(o,e):Flt(o,e)};var blt=(t,e)=>{let r=new hk.Sync(t),o=new ofe.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(o),cfe(r,e)},klt=(t,e,r)=>{let o=new hk(t),a=new ofe.WriteStream(t.file,{mode:t.mode||438});o.pipe(a);let n=new Promise((u,A)=>{a.on("error",A),a.on("close",u),o.on("error",A)});return E_(o,e),r?n.then(r,r):n},cfe=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?afe({file:lfe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},E_=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return afe({file:lfe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>E_(t,e));t.add(r)}t.end()},Qlt=(t,e)=>{let r=new hk.Sync(t);return cfe(r,e),r},Flt=(t,e)=>{let r=new hk(t);return E_(r,e),r}});var C_=_((V4t,yfe)=>{"use strict";var Rlt=Fy(),ffe=Zb(),dl=ve("fs"),pfe=Jy(),hfe=pk(),gfe=ve("path"),dfe=Uy();yfe.exports=(t,e,r)=>{let o=Rlt(t);if(!o.file)throw new TypeError("file is required");if(o.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),o.sync?Tlt(o,e):Nlt(o,e,r)};var Tlt=(t,e)=>{let r=new ffe.Sync(t),o=!0,a,n;try{try{a=dl.openSync(t.file,"r+")}catch(p){if(p.code==="ENOENT")a=dl.openSync(t.file,"w+");else throw p}let u=dl.fstatSync(a),A=Buffer.alloc(512);e:for(n=0;nu.size)break;n+=h,t.mtimeCache&&t.mtimeCache.set(p.path,p.mtime)}o=!1,Llt(t,r,n,a,e)}finally{if(o)try{dl.closeSync(a)}catch{}}},Llt=(t,e,r,o,a)=>{let n=new pfe.WriteStreamSync(t.file,{fd:o,start:r});e.pipe(n),Olt(e,a)},Nlt=(t,e,r)=>{e=Array.from(e);let o=new ffe(t),a=(u,A,p)=>{let h=(C,T)=>{C?dl.close(u,N=>p(C)):p(null,T)},E=0;if(A===0)return h(null,0);let w=0,D=Buffer.alloc(512),b=(C,T)=>{if(C)return h(C);if(w+=T,w<512&&T)return dl.read(u,D,w,D.length-w,E+w,b);if(E===0&&D[0]===31&&D[1]===139)return h(new Error("cannot append to compressed archives"));if(w<512)return h(null,E);let N=new dfe(D);if(!N.cksumValid)return h(null,E);let U=512*Math.ceil(N.size/512);if(E+U+512>A||(E+=U+512,E>=A))return h(null,E);t.mtimeCache&&t.mtimeCache.set(N.path,N.mtime),w=0,dl.read(u,D,0,512,E,b)};dl.read(u,D,0,512,E,b)},n=new Promise((u,A)=>{o.on("error",A);let p="r+",h=(E,w)=>{if(E&&E.code==="ENOENT"&&p==="r+")return p="w+",dl.open(t.file,p,h);if(E)return A(E);dl.fstat(w,(D,b)=>{if(D)return dl.close(w,()=>A(D));a(w,b.size,(C,T)=>{if(C)return A(C);let N=new pfe.WriteStream(t.file,{fd:w,start:T});o.pipe(N),N.on("error",A),N.on("close",u),mfe(o,e)})})};dl.open(t.file,p,h)});return r?n.then(r,r):n},Olt=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?hfe({file:gfe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},mfe=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return hfe({file:gfe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>mfe(t,e));t.add(r)}t.end()}});var Cfe=_((K4t,Efe)=>{"use strict";var Mlt=Fy(),Ult=C_();Efe.exports=(t,e,r)=>{let o=Mlt(t);if(!o.file)throw new TypeError("file is required");if(o.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),_lt(o),Ult(o,e,r)};var _lt=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,o)=>e(r,o)&&!(t.mtimeCache.get(r)>o.mtime):(r,o)=>!(t.mtimeCache.get(r)>o.mtime)}});var Bfe=_((J4t,wfe)=>{var{promisify:Ife}=ve("util"),Ph=ve("fs"),Hlt=t=>{if(!t)t={mode:511,fs:Ph};else if(typeof t=="object")t={mode:511,fs:Ph,...t};else if(typeof t=="number")t={mode:t,fs:Ph};else if(typeof t=="string")t={mode:parseInt(t,8),fs:Ph};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||Ph.mkdir,t.mkdirAsync=Ife(t.mkdir),t.stat=t.stat||t.fs.stat||Ph.stat,t.statAsync=Ife(t.stat),t.statSync=t.statSync||t.fs.statSync||Ph.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||Ph.mkdirSync,t};wfe.exports=Hlt});var Dfe=_((z4t,vfe)=>{var qlt=process.platform,{resolve:jlt,parse:Glt}=ve("path"),Wlt=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=jlt(t),qlt==="win32"){let e=/[*|"<>?:]/,{root:r}=Glt(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};vfe.exports=Wlt});var kfe=_((X4t,bfe)=>{var{dirname:Sfe}=ve("path"),Pfe=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(o=>o.isDirectory()?r:void 0,o=>o.code==="ENOENT"?Pfe(t,Sfe(e),e):void 0),xfe=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(o){return o.code==="ENOENT"?xfe(t,Sfe(e),e):void 0}};bfe.exports={findMade:Pfe,findMadeSync:xfe}});var B_=_((Z4t,Ffe)=>{var{dirname:Qfe}=ve("path"),I_=(t,e,r)=>{e.recursive=!1;let o=Qfe(t);return o===t?e.mkdirAsync(t,e).catch(a=>{if(a.code!=="EISDIR")throw a}):e.mkdirAsync(t,e).then(()=>r||t,a=>{if(a.code==="ENOENT")return I_(o,e).then(n=>I_(t,e,n));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;return e.statAsync(t).then(n=>{if(n.isDirectory())return r;throw a},()=>{throw a})})},w_=(t,e,r)=>{let o=Qfe(t);if(e.recursive=!1,o===t)try{return e.mkdirSync(t,e)}catch(a){if(a.code!=="EISDIR")throw a;return}try{return e.mkdirSync(t,e),r||t}catch(a){if(a.code==="ENOENT")return w_(t,e,w_(o,e,r));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;try{if(!e.statSync(t).isDirectory())throw a}catch{throw a}}};Ffe.exports={mkdirpManual:I_,mkdirpManualSync:w_}});var Lfe=_(($4t,Tfe)=>{var{dirname:Rfe}=ve("path"),{findMade:Ylt,findMadeSync:Vlt}=kfe(),{mkdirpManual:Klt,mkdirpManualSync:Jlt}=B_(),zlt=(t,e)=>(e.recursive=!0,Rfe(t)===t?e.mkdirAsync(t,e):Ylt(e,t).then(o=>e.mkdirAsync(t,e).then(()=>o).catch(a=>{if(a.code==="ENOENT")return Klt(t,e);throw a}))),Xlt=(t,e)=>{if(e.recursive=!0,Rfe(t)===t)return e.mkdirSync(t,e);let o=Vlt(e,t);try{return e.mkdirSync(t,e),o}catch(a){if(a.code==="ENOENT")return Jlt(t,e);throw a}};Tfe.exports={mkdirpNative:zlt,mkdirpNativeSync:Xlt}});var Ufe=_((eUt,Mfe)=>{var Nfe=ve("fs"),Zlt=process.version,v_=Zlt.replace(/^v/,"").split("."),Ofe=+v_[0]>10||+v_[0]==10&&+v_[1]>=12,$lt=Ofe?t=>t.mkdir===Nfe.mkdir:()=>!1,ect=Ofe?t=>t.mkdirSync===Nfe.mkdirSync:()=>!1;Mfe.exports={useNative:$lt,useNativeSync:ect}});var Wfe=_((tUt,Gfe)=>{var Xy=Bfe(),Zy=Dfe(),{mkdirpNative:_fe,mkdirpNativeSync:Hfe}=Lfe(),{mkdirpManual:qfe,mkdirpManualSync:jfe}=B_(),{useNative:tct,useNativeSync:rct}=Ufe(),$y=(t,e)=>(t=Zy(t),e=Xy(e),tct(e)?_fe(t,e):qfe(t,e)),nct=(t,e)=>(t=Zy(t),e=Xy(e),rct(e)?Hfe(t,e):jfe(t,e));$y.sync=nct;$y.native=(t,e)=>_fe(Zy(t),Xy(e));$y.manual=(t,e)=>qfe(Zy(t),Xy(e));$y.nativeSync=(t,e)=>Hfe(Zy(t),Xy(e));$y.manualSync=(t,e)=>jfe(Zy(t),Xy(e));Gfe.exports=$y});var Zfe=_((rUt,Xfe)=>{"use strict";var tc=ve("fs"),Gg=ve("path"),ict=tc.lchown?"lchown":"chown",sct=tc.lchownSync?"lchownSync":"chownSync",Vfe=tc.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),Yfe=(t,e,r)=>{try{return tc[sct](t,e,r)}catch(o){if(o.code!=="ENOENT")throw o}},oct=(t,e,r)=>{try{return tc.chownSync(t,e,r)}catch(o){if(o.code!=="ENOENT")throw o}},act=Vfe?(t,e,r,o)=>a=>{!a||a.code!=="EISDIR"?o(a):tc.chown(t,e,r,o)}:(t,e,r,o)=>o,D_=Vfe?(t,e,r)=>{try{return Yfe(t,e,r)}catch(o){if(o.code!=="EISDIR")throw o;oct(t,e,r)}}:(t,e,r)=>Yfe(t,e,r),lct=process.version,Kfe=(t,e,r)=>tc.readdir(t,e,r),cct=(t,e)=>tc.readdirSync(t,e);/^v4\./.test(lct)&&(Kfe=(t,e,r)=>tc.readdir(t,r));var gk=(t,e,r,o)=>{tc[ict](t,e,r,act(t,e,r,a=>{o(a&&a.code!=="ENOENT"?a:null)}))},Jfe=(t,e,r,o,a)=>{if(typeof e=="string")return tc.lstat(Gg.resolve(t,e),(n,u)=>{if(n)return a(n.code!=="ENOENT"?n:null);u.name=e,Jfe(t,u,r,o,a)});if(e.isDirectory())S_(Gg.resolve(t,e.name),r,o,n=>{if(n)return a(n);let u=Gg.resolve(t,e.name);gk(u,r,o,a)});else{let n=Gg.resolve(t,e.name);gk(n,r,o,a)}},S_=(t,e,r,o)=>{Kfe(t,{withFileTypes:!0},(a,n)=>{if(a){if(a.code==="ENOENT")return o();if(a.code!=="ENOTDIR"&&a.code!=="ENOTSUP")return o(a)}if(a||!n.length)return gk(t,e,r,o);let u=n.length,A=null,p=h=>{if(!A){if(h)return o(A=h);if(--u===0)return gk(t,e,r,o)}};n.forEach(h=>Jfe(t,h,e,r,p))})},uct=(t,e,r,o)=>{if(typeof e=="string")try{let a=tc.lstatSync(Gg.resolve(t,e));a.name=e,e=a}catch(a){if(a.code==="ENOENT")return;throw a}e.isDirectory()&&zfe(Gg.resolve(t,e.name),r,o),D_(Gg.resolve(t,e.name),r,o)},zfe=(t,e,r)=>{let o;try{o=cct(t,{withFileTypes:!0})}catch(a){if(a.code==="ENOENT")return;if(a.code==="ENOTDIR"||a.code==="ENOTSUP")return D_(t,e,r);throw a}return o&&o.length&&o.forEach(a=>uct(t,a,e,r)),D_(t,e,r)};Xfe.exports=S_;S_.sync=zfe});var rpe=_((nUt,P_)=>{"use strict";var $fe=Wfe(),rc=ve("fs"),dk=ve("path"),epe=Zfe(),$c=Oy(),mk=class extends Error{constructor(e,r){super("Cannot extract through symbolic link"),this.path=r,this.symlink=e}get name(){return"SylinkError"}},yk=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'"),this.path=e,this.code=r}get name(){return"CwdError"}},Ek=(t,e)=>t.get($c(e)),g2=(t,e,r)=>t.set($c(e),r),Act=(t,e)=>{rc.stat(t,(r,o)=>{(r||!o.isDirectory())&&(r=new yk(t,r&&r.code||"ENOTDIR")),e(r)})};P_.exports=(t,e,r)=>{t=$c(t);let o=e.umask,a=e.mode|448,n=(a&o)!==0,u=e.uid,A=e.gid,p=typeof u=="number"&&typeof A=="number"&&(u!==e.processUid||A!==e.processGid),h=e.preserve,E=e.unlink,w=e.cache,D=$c(e.cwd),b=(N,U)=>{N?r(N):(g2(w,t,!0),U&&p?epe(U,u,A,J=>b(J)):n?rc.chmod(t,a,r):r())};if(w&&Ek(w,t)===!0)return b();if(t===D)return Act(t,b);if(h)return $fe(t,{mode:a}).then(N=>b(null,N),b);let T=$c(dk.relative(D,t)).split("/");Ck(D,T,a,w,E,D,null,b)};var Ck=(t,e,r,o,a,n,u,A)=>{if(!e.length)return A(null,u);let p=e.shift(),h=$c(dk.resolve(t+"/"+p));if(Ek(o,h))return Ck(h,e,r,o,a,n,u,A);rc.mkdir(h,r,tpe(h,e,r,o,a,n,u,A))},tpe=(t,e,r,o,a,n,u,A)=>p=>{p?rc.lstat(t,(h,E)=>{if(h)h.path=h.path&&$c(h.path),A(h);else if(E.isDirectory())Ck(t,e,r,o,a,n,u,A);else if(a)rc.unlink(t,w=>{if(w)return A(w);rc.mkdir(t,r,tpe(t,e,r,o,a,n,u,A))});else{if(E.isSymbolicLink())return A(new mk(t,t+"/"+e.join("/")));A(p)}}):(u=u||t,Ck(t,e,r,o,a,n,u,A))},fct=t=>{let e=!1,r="ENOTDIR";try{e=rc.statSync(t).isDirectory()}catch(o){r=o.code}finally{if(!e)throw new yk(t,r)}};P_.exports.sync=(t,e)=>{t=$c(t);let r=e.umask,o=e.mode|448,a=(o&r)!==0,n=e.uid,u=e.gid,A=typeof n=="number"&&typeof u=="number"&&(n!==e.processUid||u!==e.processGid),p=e.preserve,h=e.unlink,E=e.cache,w=$c(e.cwd),D=N=>{g2(E,t,!0),N&&A&&epe.sync(N,n,u),a&&rc.chmodSync(t,o)};if(E&&Ek(E,t)===!0)return D();if(t===w)return fct(w),D();if(p)return D($fe.sync(t,o));let C=$c(dk.relative(w,t)).split("/"),T=null;for(let N=C.shift(),U=w;N&&(U+="/"+N);N=C.shift())if(U=$c(dk.resolve(U)),!Ek(E,U))try{rc.mkdirSync(U,o),T=T||U,g2(E,U,!0)}catch{let te=rc.lstatSync(U);if(te.isDirectory()){g2(E,U,!0);continue}else if(h){rc.unlinkSync(U),rc.mkdirSync(U,o),T=T||U,g2(E,U,!0);continue}else if(te.isSymbolicLink())return new mk(U,U+"/"+C.join("/"))}return D(T)}});var b_=_((iUt,npe)=>{var x_=Object.create(null),{hasOwnProperty:pct}=Object.prototype;npe.exports=t=>(pct.call(x_,t)||(x_[t]=t.normalize("NFKD")),x_[t])});var ape=_((sUt,ope)=>{var ipe=ve("assert"),hct=b_(),gct=_y(),{join:spe}=ve("path"),dct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,mct=dct==="win32";ope.exports=()=>{let t=new Map,e=new Map,r=h=>h.split("/").slice(0,-1).reduce((w,D)=>(w.length&&(D=spe(w[w.length-1],D)),w.push(D||"/"),w),[]),o=new Set,a=h=>{let E=e.get(h);if(!E)throw new Error("function does not have any path reservations");return{paths:E.paths.map(w=>t.get(w)),dirs:[...E.dirs].map(w=>t.get(w))}},n=h=>{let{paths:E,dirs:w}=a(h);return E.every(D=>D[0]===h)&&w.every(D=>D[0]instanceof Set&&D[0].has(h))},u=h=>o.has(h)||!n(h)?!1:(o.add(h),h(()=>A(h)),!0),A=h=>{if(!o.has(h))return!1;let{paths:E,dirs:w}=e.get(h),D=new Set;return E.forEach(b=>{let C=t.get(b);ipe.equal(C[0],h),C.length===1?t.delete(b):(C.shift(),typeof C[0]=="function"?D.add(C[0]):C[0].forEach(T=>D.add(T)))}),w.forEach(b=>{let C=t.get(b);ipe(C[0]instanceof Set),C[0].size===1&&C.length===1?t.delete(b):C[0].size===1?(C.shift(),D.add(C[0])):C[0].delete(h)}),o.delete(h),D.forEach(b=>u(b)),!0};return{check:n,reserve:(h,E)=>{h=mct?["win32 parallelization disabled"]:h.map(D=>hct(gct(spe(D))).toLowerCase());let w=new Set(h.map(D=>r(D)).reduce((D,b)=>D.concat(b)));return e.set(E,{dirs:w,paths:h}),h.forEach(D=>{let b=t.get(D);b?b.push(E):t.set(D,[E])}),w.forEach(D=>{let b=t.get(D);b?b[b.length-1]instanceof Set?b[b.length-1].add(E):b.push(new Set([E])):t.set(D,[new Set([E])])}),u(E)}}}});var upe=_((oUt,cpe)=>{var yct=process.platform,Ect=yct==="win32",Cct=global.__FAKE_TESTING_FS__||ve("fs"),{O_CREAT:Ict,O_TRUNC:wct,O_WRONLY:Bct,UV_FS_O_FILEMAP:lpe=0}=Cct.constants,vct=Ect&&!!lpe,Dct=512*1024,Sct=lpe|wct|Ict|Bct;cpe.exports=vct?t=>t"w"});var M_=_((aUt,vpe)=>{"use strict";var Pct=ve("assert"),xct=fk(),Fn=ve("fs"),bct=Jy(),Gf=ve("path"),Ipe=rpe(),Ape=M3(),kct=ape(),Qct=U3(),ml=Oy(),Fct=_y(),Rct=b_(),fpe=Symbol("onEntry"),F_=Symbol("checkFs"),ppe=Symbol("checkFs2"),Bk=Symbol("pruneCache"),R_=Symbol("isReusable"),nc=Symbol("makeFs"),T_=Symbol("file"),L_=Symbol("directory"),vk=Symbol("link"),hpe=Symbol("symlink"),gpe=Symbol("hardlink"),dpe=Symbol("unsupported"),mpe=Symbol("checkPath"),xh=Symbol("mkdir"),Po=Symbol("onError"),Ik=Symbol("pending"),ype=Symbol("pend"),eE=Symbol("unpend"),k_=Symbol("ended"),Q_=Symbol("maybeClose"),N_=Symbol("skip"),d2=Symbol("doChown"),m2=Symbol("uid"),y2=Symbol("gid"),E2=Symbol("checkedCwd"),wpe=ve("crypto"),Bpe=upe(),Tct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,C2=Tct==="win32",Lct=(t,e)=>{if(!C2)return Fn.unlink(t,e);let r=t+".DELETE."+wpe.randomBytes(16).toString("hex");Fn.rename(t,r,o=>{if(o)return e(o);Fn.unlink(r,e)})},Nct=t=>{if(!C2)return Fn.unlinkSync(t);let e=t+".DELETE."+wpe.randomBytes(16).toString("hex");Fn.renameSync(t,e),Fn.unlinkSync(e)},Epe=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,Cpe=t=>Rct(Fct(ml(t))).toLowerCase(),Oct=(t,e)=>{e=Cpe(e);for(let r of t.keys()){let o=Cpe(r);(o===e||o.indexOf(e+"/")===0)&&t.delete(r)}},Mct=t=>{for(let e of t.keys())t.delete(e)},I2=class extends xct{constructor(e){if(e||(e={}),e.ondone=r=>{this[k_]=!0,this[Q_]()},super(e),this[E2]=!1,this.reservations=kct(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[Ik]=0,this[k_]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||C2,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=ml(Gf.resolve(e.cwd||process.cwd())),this.strip=+e.strip||0,this.processUmask=e.noChmod?0:process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[fpe](r))}warn(e,r,o={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(o.recoverable=!1),super.warn(e,r,o)}[Q_](){this[k_]&&this[Ik]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[mpe](e){if(this.strip){let r=ml(e.path).split("/");if(r.length=this.strip)e.linkpath=o.slice(this.strip).join("/");else return!1}}if(!this.preservePaths){let r=ml(e.path),o=r.split("/");if(o.includes("..")||C2&&/^[a-z]:\.\.$/i.test(o[0]))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;let[a,n]=Qct(r);a&&(e.path=n,this.warn("TAR_ENTRY_INFO",`stripping ${a} from absolute path`,{entry:e,path:r}))}if(Gf.isAbsolute(e.path)?e.absolute=ml(Gf.resolve(e.path)):e.absolute=ml(Gf.resolve(this.cwd,e.path)),!this.preservePaths&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:ml(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=Gf.win32.parse(e.absolute);e.absolute=r+Ape.encode(e.absolute.substr(r.length));let{root:o}=Gf.win32.parse(e.path);e.path=o+Ape.encode(e.path.substr(o.length))}return!0}[fpe](e){if(!this[mpe](e))return e.resume();switch(Pct.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[F_](e);case"CharacterDevice":case"BlockDevice":case"FIFO":default:return this[dpe](e)}}[Po](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[eE](),r.resume())}[xh](e,r,o){Ipe(ml(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r,noChmod:this.noChmod},o)}[d2](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[m2](e){return Epe(this.uid,e.uid,this.processUid)}[y2](e){return Epe(this.gid,e.gid,this.processGid)}[T_](e,r){let o=e.mode&4095||this.fmode,a=new bct.WriteStream(e.absolute,{flags:Bpe(e.size),mode:o,autoClose:!1});a.on("error",p=>{a.fd&&Fn.close(a.fd,()=>{}),a.write=()=>!0,this[Po](p,e),r()});let n=1,u=p=>{if(p){a.fd&&Fn.close(a.fd,()=>{}),this[Po](p,e),r();return}--n===0&&Fn.close(a.fd,h=>{h?this[Po](h,e):this[eE](),r()})};a.on("finish",p=>{let h=e.absolute,E=a.fd;if(e.mtime&&!this.noMtime){n++;let w=e.atime||new Date,D=e.mtime;Fn.futimes(E,w,D,b=>b?Fn.utimes(h,w,D,C=>u(C&&b)):u())}if(this[d2](e)){n++;let w=this[m2](e),D=this[y2](e);Fn.fchown(E,w,D,b=>b?Fn.chown(h,w,D,C=>u(C&&b)):u())}u()});let A=this.transform&&this.transform(e)||e;A!==e&&(A.on("error",p=>{this[Po](p,e),r()}),e.pipe(A)),A.pipe(a)}[L_](e,r){let o=e.mode&4095||this.dmode;this[xh](e.absolute,o,a=>{if(a){this[Po](a,e),r();return}let n=1,u=A=>{--n===0&&(r(),this[eE](),e.resume())};e.mtime&&!this.noMtime&&(n++,Fn.utimes(e.absolute,e.atime||new Date,e.mtime,u)),this[d2](e)&&(n++,Fn.chown(e.absolute,this[m2](e),this[y2](e),u)),u()})}[dpe](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[hpe](e,r){this[vk](e,e.linkpath,"symlink",r)}[gpe](e,r){let o=ml(Gf.resolve(this.cwd,e.linkpath));this[vk](e,o,"link",r)}[ype](){this[Ik]++}[eE](){this[Ik]--,this[Q_]()}[N_](e){this[eE](),e.resume()}[R_](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&!C2}[F_](e){this[ype]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,o=>this[ppe](e,o))}[Bk](e){e.type==="SymbolicLink"?Mct(this.dirCache):e.type!=="Directory"&&Oct(this.dirCache,e.absolute)}[ppe](e,r){this[Bk](e);let o=A=>{this[Bk](e),r(A)},a=()=>{this[xh](this.cwd,this.dmode,A=>{if(A){this[Po](A,e),o();return}this[E2]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let A=ml(Gf.dirname(e.absolute));if(A!==this.cwd)return this[xh](A,this.dmode,p=>{if(p){this[Po](p,e),o();return}u()})}u()},u=()=>{Fn.lstat(e.absolute,(A,p)=>{if(p&&(this.keep||this.newer&&p.mtime>e.mtime)){this[N_](e),o();return}if(A||this[R_](e,p))return this[nc](null,e,o);if(p.isDirectory()){if(e.type==="Directory"){let h=!this.noChmod&&e.mode&&(p.mode&4095)!==e.mode,E=w=>this[nc](w,e,o);return h?Fn.chmod(e.absolute,e.mode,E):E()}if(e.absolute!==this.cwd)return Fn.rmdir(e.absolute,h=>this[nc](h,e,o))}if(e.absolute===this.cwd)return this[nc](null,e,o);Lct(e.absolute,h=>this[nc](h,e,o))})};this[E2]?n():a()}[nc](e,r,o){if(e){this[Po](e,r),o();return}switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[T_](r,o);case"Link":return this[gpe](r,o);case"SymbolicLink":return this[hpe](r,o);case"Directory":case"GNUDumpDir":return this[L_](r,o)}}[vk](e,r,o,a){Fn[o](r,e.absolute,n=>{n?this[Po](n,e):(this[eE](),e.resume()),a()})}},wk=t=>{try{return[null,t()]}catch(e){return[e,null]}},O_=class extends I2{[nc](e,r){return super[nc](e,r,()=>{})}[F_](e){if(this[Bk](e),!this[E2]){let n=this[xh](this.cwd,this.dmode);if(n)return this[Po](n,e);this[E2]=!0}if(e.absolute!==this.cwd){let n=ml(Gf.dirname(e.absolute));if(n!==this.cwd){let u=this[xh](n,this.dmode);if(u)return this[Po](u,e)}}let[r,o]=wk(()=>Fn.lstatSync(e.absolute));if(o&&(this.keep||this.newer&&o.mtime>e.mtime))return this[N_](e);if(r||this[R_](e,o))return this[nc](null,e);if(o.isDirectory()){if(e.type==="Directory"){let u=!this.noChmod&&e.mode&&(o.mode&4095)!==e.mode,[A]=u?wk(()=>{Fn.chmodSync(e.absolute,e.mode)}):[];return this[nc](A,e)}let[n]=wk(()=>Fn.rmdirSync(e.absolute));this[nc](n,e)}let[a]=e.absolute===this.cwd?[]:wk(()=>Nct(e.absolute));this[nc](a,e)}[T_](e,r){let o=e.mode&4095||this.fmode,a=A=>{let p;try{Fn.closeSync(n)}catch(h){p=h}(A||p)&&this[Po](A||p,e),r()},n;try{n=Fn.openSync(e.absolute,Bpe(e.size),o)}catch(A){return a(A)}let u=this.transform&&this.transform(e)||e;u!==e&&(u.on("error",A=>this[Po](A,e)),e.pipe(u)),u.on("data",A=>{try{Fn.writeSync(n,A,0,A.length)}catch(p){a(p)}}),u.on("end",A=>{let p=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,E=e.mtime;try{Fn.futimesSync(n,h,E)}catch(w){try{Fn.utimesSync(e.absolute,h,E)}catch{p=w}}}if(this[d2](e)){let h=this[m2](e),E=this[y2](e);try{Fn.fchownSync(n,h,E)}catch(w){try{Fn.chownSync(e.absolute,h,E)}catch{p=p||w}}}a(p)})}[L_](e,r){let o=e.mode&4095||this.dmode,a=this[xh](e.absolute,o);if(a){this[Po](a,e),r();return}if(e.mtime&&!this.noMtime)try{Fn.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch{}if(this[d2](e))try{Fn.chownSync(e.absolute,this[m2](e),this[y2](e))}catch{}r(),e.resume()}[xh](e,r){try{return Ipe.sync(ml(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(o){return o}}[vk](e,r,o,a){try{Fn[o+"Sync"](r,e.absolute),a(),e.resume()}catch(n){return this[Po](n,e)}}};I2.Sync=O_;vpe.exports=I2});var bpe=_((lUt,xpe)=>{"use strict";var Uct=Fy(),Dk=M_(),Spe=ve("fs"),Ppe=Jy(),Dpe=ve("path"),U_=_y();xpe.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=Uct(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&_ct(o,e),o.file&&o.sync?Hct(o):o.file?qct(o,r):o.sync?jct(o):Gct(o)};var _ct=(t,e)=>{let r=new Map(e.map(n=>[U_(n),!0])),o=t.filter,a=(n,u)=>{let A=u||Dpe.parse(n).root||".",p=n===A?!1:r.has(n)?r.get(n):a(Dpe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(U_(n)):n=>a(U_(n))},Hct=t=>{let e=new Dk.Sync(t),r=t.file,o=Spe.statSync(r),a=t.maxReadSize||16*1024*1024;new Ppe.ReadStreamSync(r,{readSize:a,size:o.size}).pipe(e)},qct=(t,e)=>{let r=new Dk(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on("error",A),r.on("close",u),Spe.stat(a,(p,h)=>{if(p)A(p);else{let E=new Ppe.ReadStream(a,{readSize:o,size:h.size});E.on("error",A),E.pipe(r)}})});return e?n.then(e,e):n},jct=t=>new Dk.Sync(t),Gct=t=>new Dk(t)});var kpe=_(us=>{"use strict";us.c=us.create=Afe();us.r=us.replace=C_();us.t=us.list=pk();us.u=us.update=Cfe();us.x=us.extract=bpe();us.Pack=Zb();us.Unpack=M_();us.Parse=fk();us.ReadEntry=Lb();us.WriteEntry=J3();us.Header=Uy();us.Pax=Ob();us.types=Q3()});var __,Qpe,bh,w2,B2,Fpe=It(()=>{__=et(lg()),Qpe=ve("worker_threads"),bh=Symbol("kTaskInfo"),w2=class{constructor(e,r){this.fn=e;this.limit=(0,__.default)(r.poolSize)}run(e){return this.limit(()=>this.fn(e))}},B2=class{constructor(e,r){this.source=e;this.workers=[];this.limit=(0,__.default)(r.poolSize),this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let o=this.workers.pop();o?o.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new Qpe.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",r=>{if(!e[bh])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[bh].resolve(r),e[bh]=null,e.unref(),this.workers.push(e)}),e.on("error",r=>{e[bh]?.reject(r),e[bh]=null}),e.on("exit",r=>{r!==0&&e[bh]?.reject(new Error(`Worker exited with code ${r}`)),e[bh]=null}),e}run(e){return this.limit(()=>{let r=this.workers.pop()??this.createWorker();return r.ref(),new Promise((o,a)=>{r[bh]={resolve:o,reject:a},r.postMessage(e)})})}}});var Tpe=_((fUt,Rpe)=>{var H_;Rpe.exports.getContent=()=>(typeof H_>"u"&&(H_=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),H_)});var $i={};Vt($i,{convertToZip:()=>Kct,convertToZipWorker:()=>G_,extractArchiveTo:()=>Upe,getDefaultTaskPool:()=>Ope,getTaskPoolForConfiguration:()=>Mpe,makeArchiveFromDirectory:()=>Vct});function Wct(t,e){switch(t){case"async":return new w2(G_,{poolSize:e});case"workers":return new B2((0,j_.getContent)(),{poolSize:e});default:throw new Error(`Assertion failed: Unknown value ${t} for taskPoolMode`)}}function Ope(){return typeof q_>"u"&&(q_=Wct("workers",Xi.availableParallelism())),q_}function Mpe(t){return typeof t>"u"?Ope():Al(Yct,t,()=>{let e=t.get("taskPoolMode"),r=t.get("taskPoolConcurrency");switch(e){case"async":return new w2(G_,{poolSize:r});case"workers":return new B2((0,j_.getContent)(),{poolSize:r});default:throw new Error(`Assertion failed: Unknown value ${e} for taskPoolMode`)}})}async function G_(t){let{tmpFile:e,tgz:r,compressionLevel:o,extractBufferOpts:a}=t,n=new Zi(e,{create:!0,level:o,stats:wa.makeDefaultStats()}),u=Buffer.from(r.buffer,r.byteOffset,r.byteLength);return await Upe(u,n,a),n.saveAndClose(),e}async function Vct(t,{baseFs:e=new _n,prefixPath:r=Bt.root,compressionLevel:o,inMemory:a=!1}={}){let n;if(a)n=new Zi(null,{level:o});else{let A=await ae.mktempPromise(),p=V.join(A,"archive.zip");n=new Zi(p,{create:!0,level:o})}let u=V.resolve(Bt.root,r);return await n.copyPromise(u,t,{baseFs:e,stableTime:!0,stableSort:!0}),n}async function Kct(t,e={}){let r=await ae.mktempPromise(),o=V.join(r,"archive.zip"),a=e.compressionLevel??e.configuration?.get("compressionLevel")??"mixed",n={prefixPath:e.prefixPath,stripComponents:e.stripComponents};return await(e.taskPool??Mpe(e.configuration)).run({tmpFile:o,tgz:t,compressionLevel:a,extractBufferOpts:n}),new Zi(o,{level:e.compressionLevel})}async function*Jct(t){let e=new Npe.default.Parse,r=new Lpe.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",o=>{r.write(o)}),e.on("error",o=>{r.destroy(o)}),e.on("close",()=>{r.destroyed||r.end()}),e.end(t);for await(let o of r){let a=o;yield a,a.resume()}}async function Upe(t,e,{stripComponents:r=0,prefixPath:o=Bt.dot}={}){function a(n){if(n.path[0]==="/")return!0;let u=n.path.split(/\//g);return!!(u.some(A=>A==="..")||u.length<=r)}for await(let n of Jct(t)){if(a(n))continue;let u=V.normalize(Ae.toPortablePath(n.path)).replace(/\/$/,"").split(/\//g);if(u.length<=r)continue;let A=u.slice(r).join("/"),p=V.join(o,A),h=420;switch((n.type==="Directory"||(n.mode??0)&73)&&(h|=73),n.type){case"Directory":e.mkdirpSync(V.dirname(p),{chmod:493,utimes:[Si.SAFE_TIME,Si.SAFE_TIME]}),e.mkdirSync(p,{mode:h}),e.utimesSync(p,Si.SAFE_TIME,Si.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(V.dirname(p),{chmod:493,utimes:[Si.SAFE_TIME,Si.SAFE_TIME]}),e.writeFileSync(p,await Xm(n),{mode:h}),e.utimesSync(p,Si.SAFE_TIME,Si.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(V.dirname(p),{chmod:493,utimes:[Si.SAFE_TIME,Si.SAFE_TIME]}),e.symlinkSync(n.linkpath,p),e.lutimesSync(p,Si.SAFE_TIME,Si.SAFE_TIME);break}}return e}var Lpe,Npe,j_,q_,Yct,_pe=It(()=>{Ve();St();sA();Lpe=ve("stream"),Npe=et(kpe());Fpe();Gl();j_=et(Tpe());Yct=new WeakMap});var qpe=_((W_,Hpe)=>{(function(t,e){typeof W_=="object"?Hpe.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(W_,function(){function t(a,n){var u=n?"\u2514":"\u251C";return a?u+="\u2500 ":u+="\u2500\u2500\u2510",u}function e(a,n){var u=[];for(var A in a)a.hasOwnProperty(A)&&(n&&typeof a[A]=="function"||u.push(A));return u}function r(a,n,u,A,p,h,E){var w="",D=0,b,C,T=A.slice(0);if(T.push([n,u])&&A.length>0&&(A.forEach(function(U,J){J>0&&(w+=(U[1]?" ":"\u2502")+" "),!C&&U[0]===n&&(C=!0)}),w+=t(a,u)+a,p&&(typeof n!="object"||n instanceof Date)&&(w+=": "+n),C&&(w+=" (circular ref.)"),E(w)),!C&&typeof n=="object"){var N=e(n,h);N.forEach(function(U){b=++D===N.length,r(U,n[U],b,T,p,h,E)})}}var o={};return o.asLines=function(a,n,u,A){var p=typeof u!="function"?u:!1;r(".",a,!1,[],n,p,A||u)},o.asTree=function(a,n,u){var A="";return r(".",a,!1,[],n,u,function(p){A+=p+` -`}),A},o})});var As={};Vt(As,{emitList:()=>zct,emitTree:()=>Ype,treeNodeToJson:()=>Wpe,treeNodeToTreeify:()=>Gpe});function Gpe(t,{configuration:e}){let r={},o=0,a=(n,u)=>{let A=Array.isArray(n)?n.entries():Object.entries(n);for(let[p,h]of A){if(!h)continue;let{label:E,value:w,children:D}=h,b=[];typeof E<"u"&&b.push(Cg(e,E,2)),typeof w<"u"&&b.push(Ut(e,w[0],w[1])),b.length===0&&b.push(Cg(e,`${p}`,2));let C=b.join(": ").trim(),T=`\0${o++}\0`,N=u[`${T}${C}`]={};typeof D<"u"&&a(D,N)}};if(typeof t.children>"u")throw new Error("The root node must only contain children");return a(t.children,r),r}function Wpe(t){let e=r=>{if(typeof r.children>"u"){if(typeof r.value>"u")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Ig(r.value[0],r.value[1])}let o=Array.isArray(r.children)?r.children.entries():Object.entries(r.children??{}),a=Array.isArray(r.children)?[]:{};for(let[n,u]of o)u&&(a[Xct(n)]=e(u));return typeof r.value>"u"?a:{value:Ig(r.value[0],r.value[1]),children:a}};return e(t)}function zct(t,{configuration:e,stdout:r,json:o}){let a=t.map(n=>({value:n}));Ype({children:a},{configuration:e,stdout:r,json:o})}function Ype(t,{configuration:e,stdout:r,json:o,separators:a=0}){if(o){let u=Array.isArray(t.children)?t.children.values():Object.values(t.children??{});for(let A of u)A&&r.write(`${JSON.stringify(Wpe(A))} -`);return}let n=(0,jpe.asTree)(Gpe(t,{configuration:e}),!1,!1);if(n=n.replace(/\0[0-9]+\0/g,""),a>=1&&(n=n.replace(/^([├└]─)/gm,`\u2502 -$1`).replace(/^│\n/,"")),a>=2)for(let u=0;u<2;++u)n=n.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 -$2`).replace(/^│\n/,"");if(a>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(n)}function Xct(t){return typeof t=="string"?t.replace(/^\0[0-9]+\0/,""):t}var jpe,Vpe=It(()=>{jpe=et(qpe());Wl()});function v2(t){let e=t.match(Zct);if(!e?.groups)throw new Error("Assertion failed: Expected the checksum to match the requested pattern");let r=e.groups.cacheVersion?parseInt(e.groups.cacheVersion):null;return{cacheKey:e.groups.cacheKey??null,cacheVersion:r,cacheSpec:e.groups.cacheSpec??null,hash:e.groups.hash}}var Kpe,Y_,V_,Sk,Wr,Zct,K_=It(()=>{Ve();St();St();sA();Kpe=ve("crypto"),Y_=et(ve("fs"));Kl();ah();Gl();Io();V_=Zm(process.env.YARN_CACHE_CHECKPOINT_OVERRIDE??process.env.YARN_CACHE_VERSION_OVERRIDE??9),Sk=Zm(process.env.YARN_CACHE_VERSION_OVERRIDE??10),Wr=class t{constructor(e,{configuration:r,immutable:o=r.get("enableImmutableCache"),check:a=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,Kpe.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=o,this.check=a;let{cacheSpec:n,cacheKey:u}=t.getCacheKey(r);this.cacheSpec=n,this.cacheKey=u}static async find(e,{immutable:r,check:o}={}){let a=new t(e.get("cacheFolder"),{configuration:e,immutable:r,check:o});return await a.setup(),a}static getCacheKey(e){let r=e.get("compressionLevel"),o=r!=="mixed"?`c${r}`:"";return{cacheKey:[Sk,o].join(""),cacheSpec:o}}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${ly(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let a=v2(r).hash.slice(0,10);return`${ly(e)}-${a}.zip`}isChecksumCompatible(e){if(e===null)return!1;let{cacheVersion:r,cacheSpec:o}=v2(e);if(r===null||r{let he=new Zi,De=V.join(Bt.root,_M(e));return he.mkdirSync(De,{recursive:!0}),he.writeJsonSync(V.join(De,mr.manifest),{name:rn(e),mocked:!0}),he},E=async(he,{isColdHit:De,controlPath:Ee=null})=>{if(Ee===null&&u.unstablePackages?.has(e.locatorHash))return{isValid:!0,hash:null};let g=r&&!De?v2(r).cacheKey:this.cacheKey,me=!u.skipIntegrityCheck||!r?`${g}/${await fx(he)}`:r;if(Ee!==null){let fe=!u.skipIntegrityCheck||!r?`${this.cacheKey}/${await fx(Ee)}`:r;if(me!==fe)throw new Jt(18,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}let Ce=null;switch(r!==null&&me!==r&&(this.check?Ce="throw":v2(r).cacheKey!==v2(me).cacheKey?Ce="update":Ce=this.configuration.get("checksumBehavior")),Ce){case null:case"update":return{isValid:!0,hash:me};case"ignore":return{isValid:!0,hash:r};case"reset":return{isValid:!1,hash:r};default:case"throw":throw new Jt(18,"The remote archive doesn't match the expected checksum")}},w=async he=>{if(!n)throw new Error(`Cache check required but no loader configured for ${jr(this.configuration,e)}`);let De=await n(),Ee=De.getRealPath();De.saveAndClose(),await ae.chmodPromise(Ee,420);let g=await E(he,{controlPath:Ee,isColdHit:!1});if(!g.isValid)throw new Error("Assertion failed: Expected a valid checksum");return g.hash},D=async()=>{if(A===null||!await ae.existsPromise(A)){let he=await n(),De=he.getRealPath();return he.saveAndClose(),{source:"loader",path:De}}return{source:"mirror",path:A}},b=async()=>{if(!n)throw new Error(`Cache entry required but missing for ${jr(this.configuration,e)}`);if(this.immutable)throw new Jt(56,`Cache entry required but missing for ${jr(this.configuration,e)}`);let{path:he,source:De}=await D(),{hash:Ee}=await E(he,{isColdHit:!0}),g=this.getLocatorPath(e,Ee),me=[];De!=="mirror"&&A!==null&&me.push(async()=>{let fe=`${A}${this.cacheId}`;await ae.copyFilePromise(he,fe,Y_.default.constants.COPYFILE_FICLONE),await ae.chmodPromise(fe,420),await ae.renamePromise(fe,A)}),(!u.mirrorWriteOnly||A===null)&&me.push(async()=>{let fe=`${g}${this.cacheId}`;await ae.copyFilePromise(he,fe,Y_.default.constants.COPYFILE_FICLONE),await ae.chmodPromise(fe,420),await ae.renamePromise(fe,g)});let Ce=u.mirrorWriteOnly?A??g:g;return await Promise.all(me.map(fe=>fe())),[!1,Ce,Ee]},C=async()=>{let De=(async()=>{let Ee=u.unstablePackages?.has(e.locatorHash),g=Ee||!r||this.isChecksumCompatible(r)?this.getLocatorPath(e,r):null,me=g!==null?this.markedFiles.has(g)||await p.existsPromise(g):!1,Ce=!!u.mockedPackages?.has(e.locatorHash)&&(!this.check||!me),fe=Ce||me,ie=fe?o:a;if(ie&&ie(),fe){let Z=null,Se=g;if(!Ce)if(this.check)Z=await w(Se);else{let Re=await E(Se,{isColdHit:!1});if(Re.isValid)Z=Re.hash;else return b()}return[Ce,Se,Z]}else{if(this.immutable&&Ee)throw new Jt(56,`Cache entry required but missing for ${jr(this.configuration,e)}; consider defining ${pe.pretty(this.configuration,"supportedArchitectures",pe.Type.CODE)} to cache packages for multiple systems`);return b()}})();this.mutexes.set(e.locatorHash,De);try{return await De}finally{this.mutexes.delete(e.locatorHash)}};for(let he;he=this.mutexes.get(e.locatorHash);)await he;let[T,N,U]=await C();T||this.markedFiles.add(N);let J,te=T?()=>h():()=>new Zi(N,{baseFs:p,readOnly:!0}),le=new Am(()=>rO(()=>J=te(),he=>`Failed to open the cache entry for ${jr(this.configuration,e)}: ${he}`),V),ce=new ju(N,{baseFs:le,pathUtils:V}),ue=()=>{J?.discardAndClose()},Ie=u.unstablePackages?.has(e.locatorHash)?null:U;return[ce,ue,Ie]}},Zct=/^(?:(?(?[0-9]+)(?.*))\/)?(?.*)$/});var Pk,Jpe=It(()=>{Pk=(r=>(r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE",r))(Pk||{})});var $ct,tE,J_=It(()=>{St();Ol();bf();Io();$ct=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,o)=>`${r}#commit=${o}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/[^/]+\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>mx({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],tE=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:r}){let o=V.join(e.cwd,mr.lockfile);if(!ae.existsSync(o))return;let a=await ae.readFilePromise(o,"utf8"),n=Vi(a);if(Object.hasOwn(n,"__metadata"))return;let u=this.resolutions=new Map;for(let A of Object.keys(n)){let p=v1(A);if(!p){r.reportWarning(14,`Failed to parse the string "${A}" into a proper descriptor`);continue}let h=Fa(p.range)?kn(p,`npm:${p.range}`):p,{version:E,resolved:w}=n[A];if(!w)continue;let D;for(let[C,T]of $ct){let N=w.match(C);if(N){D=T(E,...N);break}}if(!D){r.reportWarning(14,`${Jn(e.configuration,h)}: Only some patterns can be imported from legacy lockfiles (not "${w}")`);continue}let b=h;try{let C=vg(h.range),T=v1(C.selector,!0);T&&(b=T)}catch{}u.set(h.descriptorHash,Ps(b,D))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let a=this.resolutions.get(e.descriptorHash);if(!a)throw new Error("Assertion failed: The resolution should have been registered");let n=NM(a),u=o.project.configuration.normalizeDependency(n);return await this.resolver.getCandidates(u,r,o)}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}}});var pA,zpe=It(()=>{Kl();n2();Wl();pA=class extends Ws{constructor({configuration:r,stdout:o,suggestInstall:a=!0}){super();this.errorCount=0;g1(this,{configuration:r}),this.configuration=r,this.stdout=o,this.suggestInstall=a}static async start(r,o){let a=new this(r);try{await o(a)}catch(n){a.reportExceptionOnce(n)}finally{await a.finalize()}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(r){}reportCacheMiss(r){}startSectionSync(r,o){return o()}async startSectionPromise(r,o){return await o()}startTimerSync(r,o,a){return(typeof o=="function"?o:a)()}async startTimerPromise(r,o,a){return await(typeof o=="function"?o:a)()}reportSeparator(){}reportInfo(r,o){}reportWarning(r,o){}reportError(r,o){this.errorCount+=1,this.stdout.write(`${Ut(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(r)}: ${o} -`)}reportProgress(r){return{...Promise.resolve().then(async()=>{for await(let{}of r);}),stop:()=>{}}}reportJson(r){}reportFold(r,o){}async finalize(){this.errorCount>0&&(this.stdout.write(` -`),this.stdout.write(`${Ut(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. -`),this.suggestInstall&&this.stdout.write(`${Ut(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. -`))}formatNameWithHyperlink(r){return r3(r,{configuration:this.configuration,json:!1})}}});var rE,z_=It(()=>{Io();rE=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(hx(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){let a=o.project.storedResolutions.get(e.descriptorHash);if(a){let u=o.project.originalPackages.get(a);if(u)return[u]}let n=o.project.originalPackages.get(hx(e).locatorHash);if(n)return[n];throw new Error("Resolution expected from the lockfile data")}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.originalPackages.get(e.locatorHash);if(!o)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return o}}});function Wf(){}function eut(t,e,r,o,a){for(var n=0,u=e.length,A=0,p=0;nb.length?T:b}),h.value=t.join(E)}else h.value=t.join(r.slice(A,A+h.count));A+=h.count,h.added||(p+=h.count)}}var D=e[u-1];return u>1&&typeof D.value=="string"&&(D.added||D.removed)&&t.equals("",D.value)&&(e[u-2].value+=D.value,e.pop()),e}function tut(t){return{newPos:t.newPos,components:t.components.slice(0)}}function rut(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}function $pe(t,e,r){return r=rut(r,{ignoreWhitespace:!0}),t8.diff(t,e,r)}function nut(t,e,r){return r8.diff(t,e,r)}function xk(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?xk=function(e){return typeof e}:xk=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},xk(t)}function X_(t){return out(t)||aut(t)||lut(t)||cut()}function out(t){if(Array.isArray(t))return Z_(t)}function aut(t){if(typeof Symbol<"u"&&Symbol.iterator in Object(t))return Array.from(t)}function lut(t,e){if(t){if(typeof t=="string")return Z_(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);if(r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set")return Array.from(t);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Z_(t,e)}}function Z_(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,o=new Array(e);r"u"&&(u.context=4);var A=nut(r,o,u);if(!A)return;A.push({value:"",lines:[]});function p(U){return U.map(function(J){return" "+J})}for(var h=[],E=0,w=0,D=[],b=1,C=1,T=function(J){var te=A[J],le=te.lines||te.value.replace(/\n$/,"").split(` -`);if(te.lines=le,te.added||te.removed){var ce;if(!E){var ue=A[J-1];E=b,w=C,ue&&(D=u.context>0?p(ue.lines.slice(-u.context)):[],E-=D.length,w-=D.length)}(ce=D).push.apply(ce,X_(le.map(function(fe){return(te.added?"+":"-")+fe}))),te.added?C+=le.length:b+=le.length}else{if(E)if(le.length<=u.context*2&&J=A.length-2&&le.length<=u.context){var g=/\n$/.test(r),me=/\n$/.test(o),Ce=le.length==0&&D.length>Ee.oldLines;!g&&Ce&&r.length>0&&D.splice(Ee.oldLines,0,"\\ No newline at end of file"),(!g&&!Ce||!me)&&D.push("\\ No newline at end of file")}h.push(Ee),E=0,w=0,D=[]}b+=le.length,C+=le.length}},N=0;N{Wf.prototype={diff:function(e,r){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=o.callback;typeof o=="function"&&(a=o,o={}),this.options=o;var n=this;function u(T){return a?(setTimeout(function(){a(void 0,T)},0),!0):T}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var A=r.length,p=e.length,h=1,E=A+p;o.maxEditLength&&(E=Math.min(E,o.maxEditLength));var w=[{newPos:-1,components:[]}],D=this.extractCommon(w[0],r,e,0);if(w[0].newPos+1>=A&&D+1>=p)return u([{value:this.join(r),count:r.length}]);function b(){for(var T=-1*h;T<=h;T+=2){var N=void 0,U=w[T-1],J=w[T+1],te=(J?J.newPos:0)-T;U&&(w[T-1]=void 0);var le=U&&U.newPos+1=A&&te+1>=p)return u(eut(n,N.components,r,e,n.useLongestToken));w[T]=N}h++}if(a)(function T(){setTimeout(function(){if(h>E)return a();b()||T()},0)})();else for(;h<=E;){var C=b();if(C)return C}},pushComponent:function(e,r,o){var a=e[e.length-1];a&&a.added===r&&a.removed===o?e[e.length-1]={count:a.count+1,added:r,removed:o}:e.push({count:1,added:r,removed:o})},extractCommon:function(e,r,o,a){for(var n=r.length,u=o.length,A=e.newPos,p=A-a,h=0;A+1"u"?r:u}:o;return typeof t=="string"?t:JSON.stringify($_(t,null,null,a),a," ")};D2.equals=function(t,e){return Wf.prototype.equals.call(D2,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};e8=new Wf;e8.tokenize=function(t){return t.slice()};e8.join=e8.removeEmpty=function(t){return t}});var rhe=_((HUt,the)=>{var Aut=jl(),fut=fy(),put=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,hut=/^\w*$/;function gut(t,e){if(Aut(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||fut(t)?!0:hut.test(t)||!put.test(t)||e!=null&&t in Object(e)}the.exports=gut});var she=_((qUt,ihe)=>{var nhe=mP(),dut="Expected a function";function i8(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(dut);var r=function(){var o=arguments,a=e?e.apply(this,o):o[0],n=r.cache;if(n.has(a))return n.get(a);var u=t.apply(this,o);return r.cache=n.set(a,u)||n,u};return r.cache=new(i8.Cache||nhe),r}i8.Cache=nhe;ihe.exports=i8});var ahe=_((jUt,ohe)=>{var mut=she(),yut=500;function Eut(t){var e=mut(t,function(o){return r.size===yut&&r.clear(),o}),r=e.cache;return e}ohe.exports=Eut});var s8=_((GUt,lhe)=>{var Cut=ahe(),Iut=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,wut=/\\(\\)?/g,But=Cut(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(Iut,function(r,o,a,n){e.push(a?n.replace(wut,"$1"):o||r)}),e});lhe.exports=But});var Wg=_((WUt,che)=>{var vut=jl(),Dut=rhe(),Sut=s8(),Put=t2();function xut(t,e){return vut(t)?t:Dut(t,e)?[t]:Sut(Put(t))}che.exports=xut});var nE=_((YUt,uhe)=>{var but=fy(),kut=1/0;function Qut(t){if(typeof t=="string"||but(t))return t;var e=t+"";return e=="0"&&1/t==-kut?"-0":e}uhe.exports=Qut});var bk=_((VUt,Ahe)=>{var Fut=Wg(),Rut=nE();function Tut(t,e){e=Fut(e,t);for(var r=0,o=e.length;t!=null&&r{var Lut=RP(),Nut=Wg(),Out=n1(),fhe=cl(),Mut=nE();function Uut(t,e,r,o){if(!fhe(t))return t;e=Nut(e,t);for(var a=-1,n=e.length,u=n-1,A=t;A!=null&&++a{var _ut=bk(),Hut=o8(),qut=Wg();function jut(t,e,r){for(var o=-1,a=e.length,n={};++o{function Gut(t,e){return t!=null&&e in Object(t)}dhe.exports=Gut});var a8=_((XUt,yhe)=>{var Wut=Wg(),Yut=e1(),Vut=jl(),Kut=n1(),Jut=wP(),zut=nE();function Xut(t,e,r){e=Wut(e,t);for(var o=-1,a=e.length,n=!1;++o{var Zut=mhe(),$ut=a8();function eAt(t,e){return t!=null&&$ut(t,e,Zut)}Ehe.exports=eAt});var whe=_(($Ut,Ihe)=>{var tAt=ghe(),rAt=Che();function nAt(t,e){return tAt(t,e,function(r,o){return rAt(t,o)})}Ihe.exports=nAt});var She=_((e3t,Dhe)=>{var Bhe=dg(),iAt=e1(),sAt=jl(),vhe=Bhe?Bhe.isConcatSpreadable:void 0;function oAt(t){return sAt(t)||iAt(t)||!!(vhe&&t&&t[vhe])}Dhe.exports=oAt});var bhe=_((t3t,xhe)=>{var aAt=CP(),lAt=She();function Phe(t,e,r,o,a){var n=-1,u=t.length;for(r||(r=lAt),a||(a=[]);++n0&&r(A)?e>1?Phe(A,e-1,r,o,a):aAt(a,A):o||(a[a.length]=A)}return a}xhe.exports=Phe});var Qhe=_((r3t,khe)=>{var cAt=bhe();function uAt(t){var e=t==null?0:t.length;return e?cAt(t,1):[]}khe.exports=uAt});var l8=_((n3t,Fhe)=>{var AAt=Qhe(),fAt=KN(),pAt=JN();function hAt(t){return pAt(fAt(t,void 0,AAt),t+"")}Fhe.exports=hAt});var c8=_((i3t,Rhe)=>{var gAt=whe(),dAt=l8(),mAt=dAt(function(t,e){return t==null?{}:gAt(t,e)});Rhe.exports=mAt});var kk,The=It(()=>{Kl();kk=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.resolver.bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,o,a){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}}});var Ri,u8=It(()=>{Kl();Ri=class extends Ws{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,r){return r()}async startSectionPromise(e,r){return await r()}startTimerSync(e,r,o){return(typeof r=="function"?r:o)()}async startTimerPromise(e,r,o){return await(typeof r=="function"?r:o)()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(let{}of e);}),stop:()=>{}}}reportJson(e){}reportFold(e,r){}async finalize(){}}});var Lhe,iE,A8=It(()=>{St();Lhe=et(ux());Ay();Dg();Wl();ah();bf();Io();iE=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.project=r,this.cwd=e}async setup(){this.manifest=await _t.tryFind(this.cwd)??new _t,this.relativeCwd=V.relative(this.project.cwd,this.cwd)||Bt.dot;let e=this.manifest.name?this.manifest.name:rA(null,`${this.computeCandidateName()}-${Ji(this.relativeCwd).substring(0,6)}`);this.anchoredDescriptor=kn(e,`${ci.protocol}${this.relativeCwd}`),this.anchoredLocator=Ps(e,`${ci.protocol}${this.relativeCwd}`);let r=this.manifest.workspaceDefinitions.map(({pattern:a})=>a);if(r.length===0)return;let o=await(0,Lhe.default)(r,{cwd:Ae.fromPortablePath(this.cwd),onlyDirectories:!0,ignore:["**/node_modules","**/.git","**/.yarn"]});o.sort(),await o.reduce(async(a,n)=>{let u=V.resolve(this.cwd,Ae.toPortablePath(n)),A=await ae.existsPromise(V.join(u,"package.json"));await a,A&&this.workspacesCwds.add(u)},Promise.resolve())}get anchoredPackage(){let e=this.project.storedPackages.get(this.anchoredLocator.locatorHash);if(!e)throw new Error(`Assertion failed: Expected workspace ${S1(this.project.configuration,this)} (${Ut(this.project.configuration,V.join(this.cwd,mr.manifest),Ct.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);return e}accepts(e){let r=e.indexOf(":"),o=r!==-1?e.slice(0,r+1):null,a=r!==-1?e.slice(r+1):e;if(o===ci.protocol&&V.normalize(a)===this.relativeCwd||o===ci.protocol&&(a==="*"||a==="^"||a==="~"))return!0;let n=Fa(a);return n?o===ci.protocol?n.test(this.manifest.version??"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?n.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${V.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=_t.hardDependencies}={}){let r=new Set,o=a=>{for(let n of e)for(let u of a.manifest[n].values()){let A=this.project.tryWorkspaceByDescriptor(u);A===null||r.has(A)||(r.add(A),o(A))}};return o(this),r}getRecursiveWorkspaceDependents({dependencies:e=_t.hardDependencies}={}){let r=new Set,o=a=>{for(let n of this.project.workspaces)e.some(A=>[...n.manifest[A].values()].some(p=>{let h=this.project.tryWorkspaceByDescriptor(p);return h!==null&&B1(h.anchoredLocator,a.anchoredLocator)}))&&!r.has(n)&&(r.add(n),o(n))};return o(this),r}getRecursiveWorkspaceChildren(){let e=new Set([this]);for(let r of e)for(let o of r.workspacesCwds){let a=this.project.workspacesByCwd.get(o);a&&e.add(a)}return e.delete(this),Array.from(e)}async persistManifest(){let e={};this.manifest.exportTo(e);let r=V.join(this.cwd,_t.fileName),o=`${JSON.stringify(e,null,this.manifest.indent)} -`;await ae.changeFilePromise(r,o,{automaticNewlines:!0}),this.manifest.raw=e}}});function BAt({project:t,allDescriptors:e,allResolutions:r,allPackages:o,accessibleLocators:a=new Set,optionalBuilds:n=new Set,peerRequirements:u=new Map,peerWarnings:A=[],peerRequirementNodes:p=new Map,volatileDescriptors:h=new Set}){let E=new Map,w=[],D=new Map,b=new Map,C=new Map,T=new Map,N=new Map(t.workspaces.map(ce=>{let ue=ce.anchoredLocator.locatorHash,Ie=o.get(ue);if(typeof Ie>"u")throw new Error("Assertion failed: The workspace should have an associated package");return[ue,E1(Ie)]})),U=()=>{let ce=ae.mktempSync(),ue=V.join(ce,"stacktrace.log"),Ie=String(w.length+1).length,he=w.map((De,Ee)=>`${`${Ee+1}.`.padStart(Ie," ")} ${Qa(De)} -`).join("");throw ae.writeFileSync(ue,he),ae.detachTemp(ce),new Jt(45,`Encountered a stack overflow when resolving peer dependencies; cf ${Ae.fromPortablePath(ue)}`)},J=ce=>{let ue=r.get(ce.descriptorHash);if(typeof ue>"u")throw new Error("Assertion failed: The resolution should have been registered");let Ie=o.get(ue);if(!Ie)throw new Error("Assertion failed: The package could not be found");return Ie},te=(ce,ue,Ie,{top:he,optional:De})=>{w.length>1e3&&U(),w.push(ue);let Ee=le(ce,ue,Ie,{top:he,optional:De});return w.pop(),Ee},le=(ce,ue,Ie,{top:he,optional:De})=>{if(De||n.delete(ue.locatorHash),a.has(ue.locatorHash))return;a.add(ue.locatorHash);let Ee=o.get(ue.locatorHash);if(!Ee)throw new Error(`Assertion failed: The package (${jr(t.configuration,ue)}) should have been registered`);let g=[],me=new Map,Ce=[],fe=[],ie=[],Z=[];for(let Re of Array.from(Ee.dependencies.values())){if(Ee.peerDependencies.has(Re.identHash)&&Ee.locatorHash!==he)continue;if(Sf(Re))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");h.delete(Re.descriptorHash);let ht=De;if(!ht){let xe=Ee.dependenciesMeta.get(rn(Re));if(typeof xe<"u"){let tt=xe.get(null);typeof tt<"u"&&tt.optional&&(ht=!0)}}let q=r.get(Re.descriptorHash);if(!q)throw new Error(`Assertion failed: The resolution (${Jn(t.configuration,Re)}) should have been registered`);let nt=N.get(q)||o.get(q);if(!nt)throw new Error(`Assertion failed: The package (${q}, resolved from ${Jn(t.configuration,Re)}) should have been registered`);if(nt.peerDependencies.size===0){te(Re,nt,new Map,{top:he,optional:ht});continue}let Le,Te,ke=new Set,Ke=new Map;Ce.push(()=>{Le=MM(Re,ue.locatorHash),Te=UM(nt,ue.locatorHash),Ee.dependencies.delete(Re.identHash),Ee.dependencies.set(Le.identHash,Le),r.set(Le.descriptorHash,Te.locatorHash),e.set(Le.descriptorHash,Le),o.set(Te.locatorHash,Te),g.push([nt,Le,Te])}),fe.push(()=>{T.set(Te.locatorHash,Ke);for(let xe of Te.peerDependencies.values()){let He=Al(me,xe.identHash,()=>{let x=Ie.get(xe.identHash)??null,I=Ee.dependencies.get(xe.identHash);return!I&&w1(ue,xe)&&(ce.identHash===ue.identHash?I=ce:(I=kn(ue,ce.range),e.set(I.descriptorHash,I),r.set(I.descriptorHash,ue.locatorHash),h.delete(I.descriptorHash),x=null)),I||(I=kn(xe,"missing:")),{subject:ue,ident:xe,provided:I,root:!x,requests:new Map,hash:`p${Ji(ue.locatorHash,xe.identHash).slice(0,5)}`}}).provided;if(He.range==="missing:"&&Te.dependencies.has(xe.identHash)){Te.peerDependencies.delete(xe.identHash);continue}Ke.set(xe.identHash,{requester:Te,descriptor:xe,meta:Te.peerDependenciesMeta.get(rn(xe)),children:new Map}),Te.dependencies.set(xe.identHash,He),Sf(He)&&Jm(C,He.descriptorHash).add(Te.locatorHash),D.set(He.identHash,He),He.range==="missing:"&&ke.add(He.identHash)}Te.dependencies=new Map(Ss(Te.dependencies,([xe,tt])=>rn(tt)))}),ie.push(()=>{if(!o.has(Te.locatorHash))return;let xe=E.get(nt.locatorHash);typeof xe=="number"&&xe>=2&&U();let tt=E.get(nt.locatorHash),He=typeof tt<"u"?tt+1:1;E.set(nt.locatorHash,He),te(Le,Te,Ke,{top:he,optional:ht}),E.set(nt.locatorHash,He-1)}),Z.push(()=>{let xe=Ee.dependencies.get(Re.identHash);if(typeof xe>"u")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let tt=r.get(xe.descriptorHash);if(typeof tt>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let He=T.get(tt);if(typeof He>"u")throw new Error("Assertion failed: Expected the peer requests to be registered");for(let x of me.values()){let I=He.get(x.ident.identHash);I&&(x.requests.set(xe.descriptorHash,I),p.set(x.hash,x),x.root||Ie.get(x.ident.identHash)?.children.set(xe.descriptorHash,I))}if(o.has(Te.locatorHash))for(let x of ke)Te.dependencies.delete(x)})}for(let Re of[...Ce,...fe])Re();let Se;do{Se=!0;for(let[Re,ht,q]of g){let nt=A1(b,Re.locatorHash),Le=Ji(...[...q.dependencies.values()].map(xe=>{let tt=xe.range!=="missing:"?r.get(xe.descriptorHash):"missing:";if(typeof tt>"u")throw new Error(`Assertion failed: Expected the resolution for ${Jn(t.configuration,xe)} to have been registered`);return tt===he?`${tt} (top)`:tt}),ht.identHash),Te=nt.get(Le);if(typeof Te>"u"){nt.set(Le,ht);continue}if(Te===ht)continue;o.delete(q.locatorHash),e.delete(ht.descriptorHash),r.delete(ht.descriptorHash),a.delete(q.locatorHash);let ke=C.get(ht.descriptorHash)||[],Ke=[Ee.locatorHash,...ke];C.delete(ht.descriptorHash);for(let xe of Ke){let tt=o.get(xe);typeof tt>"u"||(tt.dependencies.get(ht.identHash).descriptorHash!==Te.descriptorHash&&(Se=!1),tt.dependencies.set(ht.identHash,Te))}for(let xe of me.values())xe.provided.descriptorHash===ht.descriptorHash&&(xe.provided=Te)}}while(!Se);for(let Re of[...ie,...Z])Re()};for(let ce of t.workspaces){let ue=ce.anchoredLocator;h.delete(ce.anchoredDescriptor.descriptorHash),te(ce.anchoredDescriptor,ue,new Map,{top:ue.locatorHash,optional:!1})}for(let ce of p.values()){if(!ce.root)continue;let ue=o.get(ce.subject.locatorHash);if(typeof ue>"u")continue;for(let he of ce.requests.values()){let De=`p${Ji(ce.subject.locatorHash,rn(ce.ident),he.requester.locatorHash).slice(0,5)}`;u.set(De,{subject:ce.subject.locatorHash,requested:ce.ident,rootRequester:he.requester.locatorHash,allRequesters:Array.from(P1(he),Ee=>Ee.requester.locatorHash)})}let Ie=[...P1(ce)];if(ce.provided.range!=="missing:"){let he=J(ce.provided),De=he.version??"0.0.0",Ee=me=>{if(me.startsWith(ci.protocol)){if(!t.tryWorkspaceByLocator(he))return null;me=me.slice(ci.protocol.length),(me==="^"||me==="~")&&(me="*")}return me},g=!0;for(let me of Ie){let Ce=Ee(me.descriptor.range);if(Ce===null){g=!1;continue}if(!nA(De,Ce)){g=!1;let fe=`p${Ji(ce.subject.locatorHash,rn(ce.ident),me.requester.locatorHash).slice(0,5)}`;A.push({type:1,subject:ue,requested:ce.ident,requester:me.requester,version:De,hash:fe,requirementCount:Ie.length})}}if(!g){let me=Ie.map(Ce=>Ee(Ce.descriptor.range));A.push({type:3,node:ce,range:me.includes(null)?null:qM(me),hash:ce.hash})}}else{let he=!0;for(let De of Ie)if(!De.meta?.optional){he=!1;let Ee=`p${Ji(ce.subject.locatorHash,rn(ce.ident),De.requester.locatorHash).slice(0,5)}`;A.push({type:0,subject:ue,requested:ce.ident,requester:De.requester,hash:Ee})}he||A.push({type:2,node:ce,hash:ce.hash})}}}function*vAt(t){let e=new Map;if("children"in t)e.set(t,t);else for(let r of t.requests.values())e.set(r,r);for(let[r,o]of e){yield{request:r,root:o};for(let a of r.children.values())e.has(a)||e.set(a,o)}}function DAt(t,e){let r=[],o=[],a=!1;for(let n of t.peerWarnings)if(!(n.type===1||n.type===0)){if(!t.tryWorkspaceByLocator(n.node.subject)){a=!0;continue}if(n.type===3){let u=t.storedResolutions.get(n.node.provided.descriptorHash);if(typeof u>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let A=t.storedPackages.get(u);if(typeof A>"u")throw new Error("Assertion failed: Expected the package to be registered");let p=eh(vAt(n.node),({request:w,root:D})=>nA(A.version??"0.0.0",w.descriptor.range)?eh.skip:w===D?Ui(t.configuration,w.requester):`${Ui(t.configuration,w.requester)} (via ${Ui(t.configuration,D.requester)})`),h=[...P1(n.node)].length>1?"and other dependencies request":"requests",E=n.range?cy(t.configuration,n.range):Ut(t.configuration,"but they have non-overlapping ranges!","redBright");r.push(`${Ui(t.configuration,n.node.ident)} is listed by your project with version ${D1(t.configuration,A.version??"0.0.0")} (${Ut(t.configuration,n.hash,Ct.CODE)}), which doesn't satisfy what ${p} ${h} (${E}).`)}if(n.type===2){let u=n.node.requests.size>1?" and other dependencies":"";o.push(`${jr(t.configuration,n.node.subject)} doesn't provide ${Ui(t.configuration,n.node.ident)} (${Ut(t.configuration,n.hash,Ct.CODE)}), requested by ${Ui(t.configuration,n.node.requests.values().next().value.requester)}${u}.`)}}e.startSectionSync({reportFooter:()=>{e.reportWarning(86,`Some peer dependencies are incorrectly met by your project; run ${Ut(t.configuration,"yarn explain peer-requirements ",Ct.CODE)} for details, where ${Ut(t.configuration,"",Ct.CODE)} is the six-letter p-prefixed code.`)},skipIfEmpty:!0},()=>{for(let n of Ss(r,u=>ey.default(u)))e.reportWarning(60,n);for(let n of Ss(o,u=>ey.default(u)))e.reportWarning(2,n)}),a&&e.reportWarning(86,`Some peer dependencies are incorrectly met by dependencies; run ${Ut(t.configuration,"yarn explain peer-requirements",Ct.CODE)} for details.`)}var Qk,Fk,Rk,Mhe,h8,p8,g8,Tk,yAt,EAt,Nhe,CAt,IAt,wAt,yl,f8,Lk,Ohe,Qt,Uhe=It(()=>{St();St();Ol();Gt();Qk=ve("crypto");n8();Fk=et(c8()),Rk=et(lg()),Mhe=et(ni()),h8=ve("util"),p8=et(ve("v8")),g8=et(ve("zlib"));K_();W1();J_();z_();Ay();VM();Kl();The();n2();u8();Dg();A8();vx();Wl();ah();Gl();rb();a3();bf();Io();Tk=Zm(process.env.YARN_LOCKFILE_VERSION_OVERRIDE??8),yAt=3,EAt=/ *, */g,Nhe=/\/$/,CAt=32,IAt=(0,h8.promisify)(g8.default.gzip),wAt=(0,h8.promisify)(g8.default.gunzip),yl=(r=>(r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build",r))(yl||{}),f8={restoreLinkersCustomData:["linkersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["skippedBuilds","storedBuildState"]},Lk=(a=>(a[a.NotProvided=0]="NotProvided",a[a.NotCompatible=1]="NotCompatible",a[a.NodeNotProvided=2]="NodeNotProvided",a[a.NodeNotCompatible=3]="NodeNotCompatible",a))(Lk||{}),Ohe=t=>Ji(`${yAt}`,t),Qt=class t{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.skippedBuilds=new Set;this.lockfileLastVersion=null;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.peerWarnings=[];this.peerRequirementNodes=new Map;this.linkersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){if(!e.projectCwd)throw new it(`No project found in ${r}`);let o=e.projectCwd,a=r,n=null;for(;n!==e.projectCwd;){if(n=a,ae.existsSync(V.join(n,mr.manifest))){o=n;break}a=V.dirname(n)}let u=new t(e.projectCwd,{configuration:e});ze.telemetry?.reportProject(u.cwd),await u.setupResolutions(),await u.setupWorkspaces(),ze.telemetry?.reportWorkspaceCount(u.workspaces.length),ze.telemetry?.reportDependencyCount(u.workspaces.reduce((C,T)=>C+T.manifest.dependencies.size+T.manifest.devDependencies.size,0));let A=u.tryWorkspaceByCwd(o);if(A)return{project:u,workspace:A,locator:A.anchoredLocator};let p=await u.findLocatorForLocation(`${o}/`,{strict:!0});if(p)return{project:u,locator:p,workspace:null};let h=Ut(e,u.cwd,Ct.PATH),E=Ut(e,V.relative(u.cwd,o),Ct.PATH),w=`- If ${h} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,D=`- If ${h} is intended to be a project, it might be that you forgot to list ${E} in its workspace configuration.`,b=`- Finally, if ${h} is fine and you intend ${E} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new it(`The nearest package directory (${Ut(e,o,Ct.PATH)}) doesn't seem to be part of the project declared in ${Ut(e,u.cwd,Ct.PATH)}. - -${[w,D,b].join(` -`)}`)}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=V.join(this.cwd,mr.lockfile),r=this.configuration.get("defaultLanguageName");if(ae.existsSync(e)){let o=await ae.readFilePromise(e,"utf8");this.lockFileChecksum=Ohe(o);let a=Vi(o);if(a.__metadata){let n=a.__metadata.version,u=a.__metadata.cacheKey;this.lockfileLastVersion=n,this.lockfileNeedsRefresh=n"u")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${A})`);let h=Pf(p.resolution,!0),E=new _t;E.load(p,{yamlCompatibilityMode:!0});let w=E.version,D=E.languageName||r,b=p.linkType.toUpperCase(),C=p.conditions??null,T=E.dependencies,N=E.peerDependencies,U=E.dependenciesMeta,J=E.peerDependenciesMeta,te=E.bin;if(p.checksum!=null){let ce=typeof u<"u"&&!p.checksum.includes("/")?`${u}/${p.checksum}`:p.checksum;this.storedChecksums.set(h.locatorHash,ce)}let le={...h,version:w,languageName:D,linkType:b,conditions:C,dependencies:T,peerDependencies:N,dependenciesMeta:U,peerDependenciesMeta:J,bin:te};this.originalPackages.set(le.locatorHash,le);for(let ce of A.split(EAt)){let ue=lh(ce);n<=6&&(ue=this.configuration.normalizeDependency(ue),ue=kn(ue,ue.range.replace(/^patch:[^@]+@(?!npm(:|%3A))/,"$1npm%3A"))),this.storedDescriptors.set(ue.descriptorHash,ue),this.storedResolutions.set(ue.descriptorHash,h.locatorHash)}}}else o.includes("yarn lockfile v1")&&(this.lockfileLastVersion=-1)}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=new Set,r=(0,Rk.default)(4),o=async(a,n)=>{if(e.has(n))return a;e.add(n);let u=new iE(n,{project:this});await r(()=>u.setup());let A=a.then(()=>{this.addWorkspace(u)});return Array.from(u.workspacesCwds).reduce(o,A)};await o(Promise.resolve(),this.cwd)}addWorkspace(e){let r=this.workspacesByIdent.get(e.anchoredLocator.identHash);if(typeof r<"u")throw new Error(`Duplicate workspace name ${Ui(this.configuration,e.anchoredLocator)}: ${Ae.fromPortablePath(e.cwd)} conflicts with ${Ae.fromPortablePath(r.cwd)}`);this.workspaces.push(e),this.workspacesByCwd.set(e.cwd,e),this.workspacesByIdent.set(e.anchoredLocator.identHash,e)}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){V.isAbsolute(e)||(e=V.resolve(this.cwd,e)),e=V.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let o of this.workspaces)V.relative(o.cwd,e).startsWith("../")||r&&r.cwd.length>=o.cwd.length||(r=o);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r>"u"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${Ui(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){if(e.range.startsWith(ci.protocol)){let o=e.range.slice(ci.protocol.length);if(o!=="^"&&o!=="~"&&o!=="*"&&!Fa(o))return this.tryWorkspaceByCwd(o)}let r=this.tryWorkspaceByIdent(e);return r===null||(Sf(e)&&(e=C1(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${Jn(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Jc(e)&&(e=I1(e)),r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${jr(this.configuration,e)})`);return r}deleteDescriptor(e){this.storedResolutions.delete(e),this.storedDescriptors.delete(e)}deleteLocator(e){this.originalPackages.delete(e),this.storedPackages.delete(e),this.accessibleLocators.delete(e)}forgetResolution(e){if("descriptorHash"in e){let r=this.storedResolutions.get(e.descriptorHash);this.deleteDescriptor(e.descriptorHash);let o=new Set(this.storedResolutions.values());typeof r<"u"&&!o.has(r)&&this.deleteLocator(r)}if("locatorHash"in e){this.deleteLocator(e.locatorHash);for(let[r,o]of this.storedResolutions)o===e.locatorHash&&this.deleteDescriptor(r)}}forgetTransientResolutions(){let e=this.configuration.makeResolver(),r=new Map;for(let[o,a]of this.storedResolutions.entries()){let n=r.get(a);n||r.set(a,n=new Set),n.add(o)}for(let o of this.originalPackages.values()){let a;try{a=e.shouldPersistResolution(o,{project:this,resolver:e})}catch{a=!1}if(!a){this.deleteLocator(o.locatorHash);let n=r.get(o.locatorHash);if(n){r.delete(o.locatorHash);for(let u of n)this.deleteDescriptor(u)}}}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,o]of e.dependencies)Sf(o)&&e.dependencies.set(r,C1(o))}getDependencyMeta(e,r){let o={},n=this.topLevelWorkspace.manifest.dependenciesMeta.get(rn(e));if(!n)return o;let u=n.get(null);if(u&&Object.assign(o,u),r===null||!Mhe.default.valid(r))return o;for(let[A,p]of n)A!==null&&A===r&&Object.assign(o,p);return o}async findLocatorForLocation(e,{strict:r=!1}={}){let o=new Ri,a=this.configuration.getLinkers(),n={project:this,report:o};for(let u of a){let A=await u.findPackageLocator(e,n);if(A){if(r&&(await u.findPackageLocation(A,n)).replace(Nhe,"")!==e.replace(Nhe,""))continue;return A}}return null}async loadUserConfig(){let e=V.join(this.cwd,".pnp.cjs");await ae.existsPromise(e)&&vf(e).setup();let r=V.join(this.cwd,"yarn.config.cjs");return await ae.existsPromise(r)?vf(r):null}async preparePackage(e,{resolver:r,resolveOptions:o}){let a=await this.configuration.getPackageExtensions(),n=this.configuration.normalizePackage(e,{packageExtensions:a});for(let[u,A]of n.dependencies){let p=await this.configuration.reduceHook(E=>E.reduceDependency,A,this,n,A,{resolver:r,resolveOptions:o});if(!w1(A,p))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let h=r.bindDescriptor(p,n,o);n.dependencies.set(u,h)}return n}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions();let r=new Map(this.originalPackages),o=[];e.lockfileOnly||this.forgetTransientResolutions();let a=e.resolver||this.configuration.makeResolver(),n=new tE(a);await n.setup(this,{report:e.report});let u=e.lockfileOnly?[new kk(a)]:[n,a],A=new Sg([new rE(a),...u]),p=new Sg([...u]),h=this.configuration.makeFetcher(),E=e.lockfileOnly?{project:this,report:e.report,resolver:A}:{project:this,report:e.report,resolver:A,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:h,cacheOptions:{mirrorWriteOnly:!0}}},w=new Map,D=new Map,b=new Map,C=new Map,T=new Map,N=new Map,U=this.topLevelWorkspace.anchoredLocator,J=new Set,te=[],le=IU(),ce=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Ws.progressViaTitle(),async ie=>{let Z=async nt=>{let Le=await zm(async()=>await A.resolve(nt,E),xe=>`${jr(this.configuration,nt)}: ${xe}`);if(!B1(nt,Le))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${jr(this.configuration,nt)} to ${jr(this.configuration,Le)})`);C.set(Le.locatorHash,Le),!r.delete(Le.locatorHash)&&!this.tryWorkspaceByLocator(Le)&&o.push(Le);let ke=await this.preparePackage(Le,{resolver:A,resolveOptions:E}),Ke=Wc([...ke.dependencies.values()].map(xe=>q(xe)));return te.push(Ke),Ke.catch(()=>{}),D.set(ke.locatorHash,ke),ke},Se=async nt=>{let Le=T.get(nt.locatorHash);if(typeof Le<"u")return Le;let Te=Promise.resolve().then(()=>Z(nt));return T.set(nt.locatorHash,Te),Te},Re=async(nt,Le)=>{let Te=await q(Le);return w.set(nt.descriptorHash,nt),b.set(nt.descriptorHash,Te.locatorHash),Te},ht=async nt=>{ie.setTitle(Jn(this.configuration,nt));let Le=this.resolutionAliases.get(nt.descriptorHash);if(typeof Le<"u")return Re(nt,this.storedDescriptors.get(Le));let Te=A.getResolutionDependencies(nt,E),ke=Object.fromEntries(await Wc(Object.entries(Te).map(async([tt,He])=>{let x=A.bindDescriptor(He,U,E),I=await q(x);return J.add(I.locatorHash),[tt,I]}))),xe=(await zm(async()=>await A.getCandidates(nt,ke,E),tt=>`${Jn(this.configuration,nt)}: ${tt}`))[0];if(typeof xe>"u")throw new Jt(82,`${Jn(this.configuration,nt)}: No candidates found`);if(e.checkResolutions){let{locators:tt}=await p.getSatisfying(nt,ke,[xe],{...E,resolver:p});if(!tt.find(He=>He.locatorHash===xe.locatorHash))throw new Jt(78,`Invalid resolution ${d1(this.configuration,nt,xe)}`)}return w.set(nt.descriptorHash,nt),b.set(nt.descriptorHash,xe.locatorHash),Se(xe)},q=nt=>{let Le=N.get(nt.descriptorHash);if(typeof Le<"u")return Le;w.set(nt.descriptorHash,nt);let Te=Promise.resolve().then(()=>ht(nt));return N.set(nt.descriptorHash,Te),Te};for(let nt of this.workspaces){let Le=nt.anchoredDescriptor;te.push(q(Le))}for(;te.length>0;){let nt=[...te];te.length=0,await Wc(nt)}});let ue=ul(r.values(),ie=>this.tryWorkspaceByLocator(ie)?ul.skip:ie);if(o.length>0||ue.length>0){let ie=new Set(this.workspaces.flatMap(nt=>{let Le=D.get(nt.anchoredLocator.locatorHash);if(!Le)throw new Error("Assertion failed: The workspace should have been resolved");return Array.from(Le.dependencies.values(),Te=>{let ke=b.get(Te.descriptorHash);if(!ke)throw new Error("Assertion failed: The resolution should have been registered");return ke})})),Z=nt=>ie.has(nt.locatorHash)?"0":"1",Se=nt=>Qa(nt),Re=Ss(o,[Z,Se]),ht=Ss(ue,[Z,Se]),q=e.report.getRecommendedLength();Re.length>0&&e.report.reportInfo(85,`${Ut(this.configuration,"+",Ct.ADDED)} ${_P(this.configuration,Re,q)}`),ht.length>0&&e.report.reportInfo(85,`${Ut(this.configuration,"-",Ct.REMOVED)} ${_P(this.configuration,ht,q)}`)}let Ie=new Set(this.resolutionAliases.values()),he=new Set(D.keys()),De=new Set,Ee=new Map,g=[],me=new Map;BAt({project:this,accessibleLocators:De,volatileDescriptors:Ie,optionalBuilds:he,peerRequirements:Ee,peerWarnings:g,peerRequirementNodes:me,allDescriptors:w,allResolutions:b,allPackages:D});for(let ie of J)he.delete(ie);for(let ie of Ie)w.delete(ie),b.delete(ie);let Ce=new Set,fe=new Set;for(let ie of D.values())ie.conditions!=null&&he.has(ie.locatorHash)&&(Ex(ie,ce)||(Ex(ie,le)&&e.report.reportWarningOnce(77,`${jr(this.configuration,ie)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Ut(this.configuration,"supportedArchitectures",Ct.SETTING)} setting`),fe.add(ie.locatorHash)),Ce.add(ie.locatorHash));this.storedResolutions=b,this.storedDescriptors=w,this.storedPackages=D,this.accessibleLocators=De,this.conditionalLocators=Ce,this.disabledLocators=fe,this.originalPackages=C,this.optionalBuilds=he,this.peerRequirements=Ee,this.peerWarnings=g,this.peerRequirementNodes=me}async fetchEverything({cache:e,report:r,fetcher:o,mode:a,persistProject:n=!0}){let u={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},A=o||this.configuration.makeFetcher(),p={checksums:this.storedChecksums,project:this,cache:e,fetcher:A,report:r,cacheOptions:u},h=Array.from(new Set(Ss(this.storedResolutions.values(),[C=>{let T=this.storedPackages.get(C);if(!T)throw new Error("Assertion failed: The locator should have been registered");return Qa(T)}])));a==="update-lockfile"&&(h=h.filter(C=>!this.storedChecksums.has(C)));let E=!1,w=Ws.progressViaCounter(h.length);await r.reportProgress(w);let D=(0,Rk.default)(CAt);if(await Wc(h.map(C=>D(async()=>{let T=this.storedPackages.get(C);if(!T)throw new Error("Assertion failed: The locator should have been registered");if(Jc(T))return;let N;try{N=await A.fetch(T,p)}catch(U){U.message=`${jr(this.configuration,T)}: ${U.message}`,r.reportExceptionOnce(U),E=U;return}N.checksum!=null?this.storedChecksums.set(T.locatorHash,N.checksum):this.storedChecksums.delete(T.locatorHash),N.releaseFs&&N.releaseFs()}).finally(()=>{w.tick()}))),E)throw E;let b=n&&a!=="update-lockfile"?await this.cacheCleanup({cache:e,report:r}):null;if(r.cacheMisses.size>0||b){let T=(await Promise.all([...r.cacheMisses].map(async ue=>{let Ie=this.storedPackages.get(ue),he=this.storedChecksums.get(ue)??null,De=e.getLocatorPath(Ie,he);return(await ae.statPromise(De)).size}))).reduce((ue,Ie)=>ue+Ie,0)-(b?.size??0),N=r.cacheMisses.size,U=b?.count??0,J=`${TP(N,{zero:"No new packages",one:"A package was",more:`${Ut(this.configuration,N,Ct.NUMBER)} packages were`})} added to the project`,te=`${TP(U,{zero:"none were",one:"one was",more:`${Ut(this.configuration,U,Ct.NUMBER)} were`})} removed`,le=T!==0?` (${Ut(this.configuration,T,Ct.SIZE_DIFF)})`:"",ce=U>0?N>0?`${J}, and ${te}${le}.`:`${J}, but ${te}${le}.`:`${J}${le}.`;r.reportInfo(13,ce)}}async linkEverything({cache:e,report:r,fetcher:o,mode:a}){let n={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},u=o||this.configuration.makeFetcher(),A={checksums:this.storedChecksums,project:this,cache:e,fetcher:u,report:r,cacheOptions:n},p=this.configuration.getLinkers(),h={project:this,report:r},E=new Map(p.map(Ce=>{let fe=Ce.makeInstaller(h),ie=Ce.getCustomDataKey(),Z=this.linkersCustomData.get(ie);return typeof Z<"u"&&fe.attachCustomData(Z),[Ce,fe]})),w=new Map,D=new Map,b=new Map,C=new Map(await Wc([...this.accessibleLocators].map(async Ce=>{let fe=this.storedPackages.get(Ce);if(!fe)throw new Error("Assertion failed: The locator should have been registered");return[Ce,await u.fetch(fe,A)]}))),T=[],N=new Set,U=[];for(let Ce of this.accessibleLocators){let fe=this.storedPackages.get(Ce);if(typeof fe>"u")throw new Error("Assertion failed: The locator should have been registered");let ie=C.get(fe.locatorHash);if(typeof ie>"u")throw new Error("Assertion failed: The fetch result should have been registered");let Z=[],Se=ht=>{Z.push(ht)},Re=this.tryWorkspaceByLocator(fe);if(Re!==null){let ht=[],{scripts:q}=Re.manifest;for(let Le of["preinstall","install","postinstall"])q.has(Le)&&ht.push({type:0,script:Le});try{for(let[Le,Te]of E)if(Le.supportsPackage(fe,h)&&(await Te.installPackage(fe,ie,{holdFetchResult:Se})).buildRequest!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{Z.length===0?ie.releaseFs?.():T.push(Wc(Z).catch(()=>{}).then(()=>{ie.releaseFs?.()}))}let nt=V.join(ie.packageFs.getRealPath(),ie.prefixPath);D.set(fe.locatorHash,nt),!Jc(fe)&&ht.length>0&&b.set(fe.locatorHash,{buildDirectives:ht,buildLocations:[nt]})}else{let ht=p.find(Le=>Le.supportsPackage(fe,h));if(!ht)throw new Jt(12,`${jr(this.configuration,fe)} isn't supported by any available linker`);let q=E.get(ht);if(!q)throw new Error("Assertion failed: The installer should have been registered");let nt;try{nt=await q.installPackage(fe,ie,{holdFetchResult:Se})}finally{Z.length===0?ie.releaseFs?.():T.push(Wc(Z).then(()=>{}).then(()=>{ie.releaseFs?.()}))}w.set(fe.locatorHash,ht),D.set(fe.locatorHash,nt.packageLocation),nt.buildRequest&&nt.packageLocation&&(nt.buildRequest.skipped?(N.add(fe.locatorHash),this.skippedBuilds.has(fe.locatorHash)||U.push([fe,nt.buildRequest.explain])):b.set(fe.locatorHash,{buildDirectives:nt.buildRequest.directives,buildLocations:[nt.packageLocation]}))}}let J=new Map;for(let Ce of this.accessibleLocators){let fe=this.storedPackages.get(Ce);if(!fe)throw new Error("Assertion failed: The locator should have been registered");let ie=this.tryWorkspaceByLocator(fe)!==null,Z=async(Se,Re)=>{let ht=D.get(fe.locatorHash);if(typeof ht>"u")throw new Error(`Assertion failed: The package (${jr(this.configuration,fe)}) should have been registered`);let q=[];for(let nt of fe.dependencies.values()){let Le=this.storedResolutions.get(nt.descriptorHash);if(typeof Le>"u")throw new Error(`Assertion failed: The resolution (${Jn(this.configuration,nt)}, from ${jr(this.configuration,fe)})should have been registered`);let Te=this.storedPackages.get(Le);if(typeof Te>"u")throw new Error(`Assertion failed: The package (${Le}, resolved from ${Jn(this.configuration,nt)}) should have been registered`);let ke=this.tryWorkspaceByLocator(Te)===null?w.get(Le):null;if(typeof ke>"u")throw new Error(`Assertion failed: The package (${Le}, resolved from ${Jn(this.configuration,nt)}) should have been registered`);ke===Se||ke===null?D.get(Te.locatorHash)!==null&&q.push([nt,Te]):!ie&&ht!==null&&u1(J,Le).push(ht)}ht!==null&&await Re.attachInternalDependencies(fe,q)};if(ie)for(let[Se,Re]of E)Se.supportsPackage(fe,h)&&await Z(Se,Re);else{let Se=w.get(fe.locatorHash);if(!Se)throw new Error("Assertion failed: The linker should have been found");let Re=E.get(Se);if(!Re)throw new Error("Assertion failed: The installer should have been registered");await Z(Se,Re)}}for(let[Ce,fe]of J){let ie=this.storedPackages.get(Ce);if(!ie)throw new Error("Assertion failed: The package should have been registered");let Z=w.get(ie.locatorHash);if(!Z)throw new Error("Assertion failed: The linker should have been found");let Se=E.get(Z);if(!Se)throw new Error("Assertion failed: The installer should have been registered");await Se.attachExternalDependents(ie,fe)}let te=new Map;for(let[Ce,fe]of E){let ie=await fe.finalizeInstall();for(let Z of ie?.records??[])Z.buildRequest.skipped?(N.add(Z.locator.locatorHash),this.skippedBuilds.has(Z.locator.locatorHash)||U.push([Z.locator,Z.buildRequest.explain])):b.set(Z.locator.locatorHash,{buildDirectives:Z.buildRequest.directives,buildLocations:Z.buildLocations});typeof ie?.customData<"u"&&te.set(Ce.getCustomDataKey(),ie.customData)}if(this.linkersCustomData=te,await Wc(T),a==="skip-build")return;for(let[,Ce]of Ss(U,([fe])=>Qa(fe)))Ce(r);let le=new Set(b.keys()),ce=(0,Qk.createHash)("sha512");ce.update(process.versions.node),await this.configuration.triggerHook(Ce=>Ce.globalHashGeneration,this,Ce=>{ce.update("\0"),ce.update(Ce)});let ue=ce.digest("hex"),Ie=new Map,he=Ce=>{let fe=Ie.get(Ce.locatorHash);if(typeof fe<"u")return fe;let ie=this.storedPackages.get(Ce.locatorHash);if(typeof ie>"u")throw new Error("Assertion failed: The package should have been registered");let Z=(0,Qk.createHash)("sha512");Z.update(Ce.locatorHash),Ie.set(Ce.locatorHash,"");for(let Se of ie.dependencies.values()){let Re=this.storedResolutions.get(Se.descriptorHash);if(typeof Re>"u")throw new Error(`Assertion failed: The resolution (${Jn(this.configuration,Se)}) should have been registered`);let ht=this.storedPackages.get(Re);if(typeof ht>"u")throw new Error("Assertion failed: The package should have been registered");Z.update(he(ht))}return fe=Z.digest("hex"),Ie.set(Ce.locatorHash,fe),fe},De=(Ce,fe)=>{let ie=(0,Qk.createHash)("sha512");ie.update(ue),ie.update(he(Ce));for(let Z of fe)ie.update(Z);return ie.digest("hex")},Ee=new Map,g=!1,me=Ce=>{let fe=new Set([Ce.locatorHash]);for(let ie of fe){let Z=this.storedPackages.get(ie);if(!Z)throw new Error("Assertion failed: The package should have been registered");for(let Se of Z.dependencies.values()){let Re=this.storedResolutions.get(Se.descriptorHash);if(!Re)throw new Error(`Assertion failed: The resolution (${Jn(this.configuration,Se)}) should have been registered`);if(Re!==Ce.locatorHash&&le.has(Re))return!1;let ht=this.storedPackages.get(Re);if(!ht)throw new Error("Assertion failed: The package should have been registered");let q=this.tryWorkspaceByLocator(ht);if(q){if(q.anchoredLocator.locatorHash!==Ce.locatorHash&&le.has(q.anchoredLocator.locatorHash))return!1;fe.add(q.anchoredLocator.locatorHash)}fe.add(Re)}}return!0};for(;le.size>0;){let Ce=le.size,fe=[];for(let ie of le){let Z=this.storedPackages.get(ie);if(!Z)throw new Error("Assertion failed: The package should have been registered");if(!me(Z))continue;let Se=b.get(Z.locatorHash);if(!Se)throw new Error("Assertion failed: The build directive should have been registered");let Re=De(Z,Se.buildLocations);if(this.storedBuildState.get(Z.locatorHash)===Re){Ee.set(Z.locatorHash,Re),le.delete(ie);continue}g||(await this.persistInstallStateFile(),g=!0),this.storedBuildState.has(Z.locatorHash)?r.reportInfo(8,`${jr(this.configuration,Z)} must be rebuilt because its dependency tree changed`):r.reportInfo(7,`${jr(this.configuration,Z)} must be built because it never has been before or the last one failed`);let ht=Se.buildLocations.map(async q=>{if(!V.isAbsolute(q))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${q})`);for(let nt of Se.buildDirectives){let Le=`# This file contains the result of Yarn building a package (${Qa(Z)}) -`;switch(nt.type){case 0:Le+=`# Script name: ${nt.script} -`;break;case 1:Le+=`# Script code: ${nt.script} -`;break}let Te=null;if(!await ae.mktempPromise(async Ke=>{let xe=V.join(Ke,"build.log"),{stdout:tt,stderr:He}=this.configuration.getSubprocessStreams(xe,{header:Le,prefix:jr(this.configuration,Z),report:r}),x;try{switch(nt.type){case 0:x=await Db(Z,nt.script,[],{cwd:q,project:this,stdin:Te,stdout:tt,stderr:He});break;case 1:x=await n3(Z,nt.script,[],{cwd:q,project:this,stdin:Te,stdout:tt,stderr:He});break}}catch(y){He.write(y.stack),x=1}if(tt.end(),He.end(),x===0)return!0;ae.detachTemp(Ke);let I=`${jr(this.configuration,Z)} couldn't be built successfully (exit code ${Ut(this.configuration,x,Ct.NUMBER)}, logs can be found here: ${Ut(this.configuration,xe,Ct.PATH)})`,P=this.optionalBuilds.has(Z.locatorHash);return P?r.reportInfo(9,I):r.reportError(9,I),Nue&&r.reportFold(Ae.fromPortablePath(xe),ae.readFileSync(xe,"utf8")),P}))return!1}return!0});fe.push(...ht,Promise.allSettled(ht).then(q=>{le.delete(ie),q.every(nt=>nt.status==="fulfilled"&&nt.value===!0)&&Ee.set(Z.locatorHash,Re)}))}if(await Wc(fe),Ce===le.size){let ie=Array.from(le).map(Z=>{let Se=this.storedPackages.get(Z);if(!Se)throw new Error("Assertion failed: The package should have been registered");return jr(this.configuration,Se)}).join(", ");r.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${ie})`);break}}this.storedBuildState=Ee,this.skippedBuilds=N}async installWithNewReport(e,r){return(await Lt.start({configuration:this.configuration,json:e.json,stdout:e.stdout,forceSectionAlignment:!0,includeLogs:!e.json&&!e.quiet,includeVersion:!0},async a=>{await this.install({...r,report:a})})).exitCode()}async install(e){let r=this.configuration.get("nodeLinker");ze.telemetry?.reportInstall(r);let o=!1;if(await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{this.configuration.get("enableOfflineMode")&&e.report.reportWarning(90,"Offline work is enabled; Yarn won't fetch packages from the remote registry if it can avoid it"),await this.configuration.triggerHook(E=>E.validateProject,this,{reportWarning:(E,w)=>{e.report.reportWarning(E,w)},reportError:(E,w)=>{e.report.reportError(E,w),o=!0}})}),o)return;let a=await this.configuration.getPackageExtensions();for(let E of a.values())for(let[,w]of E)for(let D of w)D.status="inactive";let n=V.join(this.cwd,mr.lockfile),u=null;if(e.immutable)try{u=await ae.readFilePromise(n,"utf8")}catch(E){throw E.code==="ENOENT"?new Jt(28,"The lockfile would have been created by this install, which is explicitly forbidden."):E}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{DAt(this,e.report);for(let[,E]of a)for(let[,w]of E)for(let D of w)if(D.userProvided){let b=Ut(this.configuration,D,Ct.PACKAGE_EXTENSION);switch(D.status){case"inactive":e.report.reportWarning(68,`${b}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case"redundant":e.report.reportWarning(69,`${b}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(u!==null){let E=G0(u,this.generateLockfile());if(E!==u){let w=ehe(n,n,u,E,void 0,void 0,{maxEditLength:100});if(w){e.report.reportSeparator();for(let D of w.hunks){e.report.reportInfo(null,`@@ -${D.oldStart},${D.oldLines} +${D.newStart},${D.newLines} @@`);for(let b of D.lines)b.startsWith("+")?e.report.reportError(28,Ut(this.configuration,b,Ct.ADDED)):b.startsWith("-")?e.report.reportError(28,Ut(this.configuration,b,Ct.REMOVED)):e.report.reportInfo(null,Ut(this.configuration,b,"grey"))}e.report.reportSeparator()}throw new Jt(28,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let E of a.values())for(let[,w]of E)for(let D of w)D.userProvided&&D.status==="active"&&ze.telemetry?.reportPackageExtension(Ig(D,Ct.PACKAGE_EXTENSION));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e)});let A=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],p=await Promise.all(A.map(async E=>px(E,{cwd:this.cwd})));(typeof e.persistProject>"u"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode==="update-lockfile"){e.report.reportWarning(73,`Skipped due to ${Ut(this.configuration,"mode=update-lockfile",Ct.CODE)}`);return}await this.linkEverything(e);let E=await Promise.all(A.map(async w=>px(w,{cwd:this.cwd})));for(let w=0;w{await this.configuration.triggerHook(E=>E.validateProjectAfterInstall,this,{reportWarning:(E,w)=>{e.report.reportWarning(E,w)},reportError:(E,w)=>{e.report.reportError(E,w),h=!0}})}),!h&&await this.configuration.triggerHook(E=>E.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,u]of this.storedResolutions.entries()){let A=e.get(u);A||e.set(u,A=new Set),A.add(n)}let r={},{cacheKey:o}=Wr.getCacheKey(this.configuration);r.__metadata={version:Tk,cacheKey:o};for(let[n,u]of e.entries()){let A=this.originalPackages.get(n);if(!A)continue;let p=[];for(let w of u){let D=this.storedDescriptors.get(w);if(!D)throw new Error("Assertion failed: The descriptor should have been registered");p.push(D)}let h=p.map(w=>ka(w)).sort().join(", "),E=new _t;E.version=A.linkType==="HARD"?A.version:"0.0.0-use.local",E.languageName=A.languageName,E.dependencies=new Map(A.dependencies),E.peerDependencies=new Map(A.peerDependencies),E.dependenciesMeta=new Map(A.dependenciesMeta),E.peerDependenciesMeta=new Map(A.peerDependenciesMeta),E.bin=new Map(A.bin),r[h]={...E.exportTo({},{compatibilityMode:!1}),linkType:A.linkType.toLowerCase(),resolution:Qa(A),checksum:this.storedChecksums.get(A.locatorHash),conditions:A.conditions||void 0}}return`${[`# This file is generated by running "yarn install" inside your project. -`,`# Manual changes might be lost - proceed with caution! -`].join("")} -`+Sa(r)}async persistLockfile(){let e=V.join(this.cwd,mr.lockfile),r="";try{r=await ae.readFilePromise(e,"utf8")}catch{}let o=this.generateLockfile(),a=G0(r,o);a!==r&&(await ae.writeFilePromise(e,a),this.lockFileChecksum=Ohe(a),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let u of Object.values(f8))e.push(...u);let r=(0,Fk.default)(this,e),o=p8.default.serialize(r),a=Ji(o);if(this.installStateChecksum===a)return;let n=this.configuration.get("installStatePath");await ae.mkdirPromise(V.dirname(n),{recursive:!0}),await ae.writeFilePromise(n,await IAt(o)),this.installStateChecksum=a}async restoreInstallState({restoreLinkersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:o=!0}={}){let a=this.configuration.get("installStatePath"),n;try{let u=await wAt(await ae.readFilePromise(a));n=p8.default.deserialize(u),this.installStateChecksum=Ji(u)}catch{r&&await this.applyLightResolution();return}e&&typeof n.linkersCustomData<"u"&&(this.linkersCustomData=n.linkersCustomData),o&&Object.assign(this,(0,Fk.default)(n,f8.restoreBuildState)),r&&(n.lockFileChecksum===this.lockFileChecksum?Object.assign(this,(0,Fk.default)(n,f8.restoreResolutions)):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new Ri}),await this.persistInstallStateFile()}async persist(){let e=(0,Rk.default)(4);await Promise.all([this.persistLockfile(),...this.workspaces.map(r=>e(()=>r.persistManifest()))])}async cacheCleanup({cache:e,report:r}){if(this.configuration.get("enableGlobalCache"))return null;let o=new Set([".gitignore"]);if(!n4(e.cwd,this.cwd)||!await ae.existsPromise(e.cwd))return null;let a=[];for(let u of await ae.readdirPromise(e.cwd)){if(o.has(u))continue;let A=V.resolve(e.cwd,u);e.markedFiles.has(A)||(e.immutable?r.reportError(56,`${Ut(this.configuration,V.basename(A),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):a.push(ae.lstatPromise(A).then(async p=>(await ae.removePromise(A),p.size))))}if(a.length===0)return null;let n=await Promise.all(a);return{count:a.length,size:n.reduce((u,A)=>u+A,0)}}}});function SAt(t){let o=Math.floor(t.timeNow/864e5),a=t.updateInterval*864e5,n=t.state.lastUpdate??t.timeNow+a+Math.floor(a*t.randomInitialInterval),u=n+a,A=t.state.lastTips??o*864e5,p=A+864e5+8*36e5-t.timeZone,h=u<=t.timeNow,E=p<=t.timeNow,w=null;return(h||E||!t.state.lastUpdate||!t.state.lastTips)&&(w={},w.lastUpdate=h?t.timeNow:n,w.lastTips=A,w.blocks=h?{}:t.state.blocks,w.displayedTips=t.state.displayedTips),{nextState:w,triggerUpdate:h,triggerTips:E,nextTips:E?o*864e5:A}}var sE,_he=It(()=>{St();r2();ah();eb();Gl();bf();sE=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.nextTips=0;this.displayedTips=[];this.shouldCommitTips=!1;this.configuration=e;let o=this.getRegistryPath();this.isNew=!ae.existsSync(o),this.shouldShowTips=!1,this.sendReport(r),this.startBuffer()}commitTips(){this.shouldShowTips&&(this.shouldCommitTips=!0)}selectTip(e){let r=new Set(this.displayedTips),o=A=>A&&nn?nA(nn,A):!1,a=e.map((A,p)=>p).filter(A=>e[A]&&o(e[A]?.selector));if(a.length===0)return null;let n=a.filter(A=>!r.has(A));if(n.length===0){let A=Math.floor(a.length*.2);this.displayedTips=A>0?this.displayedTips.slice(-A):[],n=a.filter(p=>!r.has(p))}let u=n[Math.floor(Math.random()*n.length)];return this.displayedTips.push(u),this.commitTips(),e[u]}reportVersion(e){this.reportValue("version",e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue("commandName",e||"")}reportPluginName(e){this.reportValue("pluginName",e)}reportProject(e){this.reportEnumerator("projectCount",e)}reportInstall(e){this.reportHit("installCount",e)}reportPackageExtension(e){this.reportValue("packageExtension",e)}reportWorkspaceCount(e){this.reportValue("workspaceCount",String(e))}reportDependencyCount(e){this.reportValue("dependencyCount",String(e))}reportValue(e,r){Jm(this.values,e).add(r)}reportEnumerator(e,r){Jm(this.enumerators,e).add(Ji(r))}reportHit(e,r="*"){let o=A1(this.hits,e),a=Al(o,r,()=>0);o.set(r,a+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return V.join(e,"telemetry.json")}sendReport(e){let r=this.getRegistryPath(),o;try{o=ae.readJsonSync(r)}catch{o={}}let{nextState:a,triggerUpdate:n,triggerTips:u,nextTips:A}=SAt({state:o,timeNow:Date.now(),timeZone:new Date().getTimezoneOffset()*60*1e3,randomInitialInterval:Math.random(),updateInterval:this.configuration.get("telemetryInterval")});if(this.nextTips=A,this.displayedTips=o.displayedTips??[],a!==null)try{ae.mkdirSync(V.dirname(r),{recursive:!0}),ae.writeJsonSync(r,a)}catch{return!1}if(u&&this.configuration.get("enableTips")&&(this.shouldShowTips=!0),n){let p=o.blocks??{};if(Object.keys(p).length===0){let h=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,E=w=>CU(h,w,{configuration:this.configuration}).catch(()=>{});for(let[w,D]of Object.entries(o.blocks??{})){if(Object.keys(D).length===0)continue;let b=D;b.userId=w,b.reportType="primary";for(let N of Object.keys(b.enumerators??{}))b.enumerators[N]=b.enumerators[N].length;E(b);let C=new Map,T=20;for(let[N,U]of Object.entries(b.values))U.length>0&&C.set(N,U.slice(0,T));for(;C.size>0;){let N={};N.userId=w,N.reportType="secondary",N.metrics={};for(let[U,J]of C)N.metrics[U]=J.shift(),J.length===0&&C.delete(U);E(N)}}}}return!0}applyChanges(){let e=this.getRegistryPath(),r;try{r=ae.readJsonSync(e)}catch{r={}}let o=this.configuration.get("telemetryUserId")??"*",a=r.blocks=r.blocks??{},n=a[o]=a[o]??{};for(let u of this.hits.keys()){let A=n.hits=n.hits??{},p=A[u]=A[u]??{};for(let[h,E]of this.hits.get(u))p[h]=(p[h]??0)+E}for(let u of["values","enumerators"])for(let A of this[u].keys()){let p=n[u]=n[u]??{};p[A]=[...new Set([...p[A]??[],...this[u].get(A)??[]])]}this.shouldCommitTips&&(r.lastTips=this.nextTips,r.displayedTips=this.displayedTips),ae.mkdirSync(V.dirname(e),{recursive:!0}),ae.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}}});var S2={};Vt(S2,{BuildDirectiveType:()=>Pk,CACHE_CHECKPOINT:()=>V_,CACHE_VERSION:()=>Sk,Cache:()=>Wr,Configuration:()=>ze,DEFAULT_RC_FILENAME:()=>PU,FormatType:()=>yce,InstallMode:()=>yl,LEGACY_PLUGINS:()=>j1,LOCKFILE_VERSION:()=>Tk,LegacyMigrationResolver:()=>tE,LightReport:()=>pA,LinkType:()=>$m,LockfileResolver:()=>rE,Manifest:()=>_t,MessageName:()=>vr,MultiFetcher:()=>py,PackageExtensionStatus:()=>sO,PackageExtensionType:()=>iO,PeerWarningType:()=>Lk,Project:()=>Qt,Report:()=>Ws,ReportError:()=>Jt,SettingsType:()=>G1,StreamReport:()=>Lt,TAG_REGEXP:()=>by,TelemetryManager:()=>sE,ThrowReport:()=>Ri,VirtualFetcher:()=>hy,WindowsLinkType:()=>ab,Workspace:()=>iE,WorkspaceFetcher:()=>gy,WorkspaceResolver:()=>ci,YarnVersion:()=>nn,execUtils:()=>Hr,folderUtils:()=>Bx,formatUtils:()=>pe,hashUtils:()=>bn,httpUtils:()=>on,miscUtils:()=>qe,nodeUtils:()=>Xi,parseMessageName:()=>jS,reportOptionDeprecations:()=>Qy,scriptUtils:()=>hn,semverUtils:()=>Ur,stringifyMessageName:()=>Ju,structUtils:()=>G,tgzUtils:()=>$i,treeUtils:()=>As});var Ve=It(()=>{nb();vx();Wl();ah();eb();Gl();rb();a3();bf();Io();_pe();Vpe();K_();W1();W1();Jpe();J_();zpe();z_();Ay();GS();YM();Uhe();Kl();n2();_he();u8();KM();JM();Dg();A8();r2();iie()});var Yhe=_((b_t,x2)=>{"use strict";var xAt=process.env.TERM_PROGRAM==="Hyper",bAt=process.platform==="win32",jhe=process.platform==="linux",d8={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Ghe=Object.assign({},d8,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),Whe=Object.assign({},d8,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:jhe?"\u25B8":"\u276F",pointerSmall:jhe?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});x2.exports=bAt&&!xAt?Ghe:Whe;Reflect.defineProperty(x2.exports,"common",{enumerable:!1,value:d8});Reflect.defineProperty(x2.exports,"windows",{enumerable:!1,value:Ghe});Reflect.defineProperty(x2.exports,"other",{enumerable:!1,value:Whe})});var eu=_((k_t,m8)=>{"use strict";var kAt=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),QAt=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Vhe=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=n=>{let u=n.open=`\x1B[${n.codes[0]}m`,A=n.close=`\x1B[${n.codes[1]}m`,p=n.regex=new RegExp(`\\u001b\\[${n.codes[1]}m`,"g");return n.wrap=(h,E)=>{h.includes(A)&&(h=h.replace(p,A+u));let w=u+h+A;return E?w.replace(/\r*\n/g,`${A}$&${u}`):w},n},r=(n,u,A)=>typeof n=="function"?n(u):n.wrap(u,A),o=(n,u)=>{if(n===""||n==null)return"";if(t.enabled===!1)return n;if(t.visible===!1)return"";let A=""+n,p=A.includes(` -`),h=u.length;for(h>0&&u.includes("unstyle")&&(u=[...new Set(["unstyle",...u])].reverse());h-- >0;)A=r(t.styles[u[h]],A,p);return A},a=(n,u,A)=>{t.styles[n]=e({name:n,codes:u}),(t.keys[A]||(t.keys[A]=[])).push(n),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(h){t.alias(n,h)},get(){let h=E=>o(E,h.stack);return Reflect.setPrototypeOf(h,t),h.stack=this.stack?this.stack.concat(n):[n],h}})};return a("reset",[0,0],"modifier"),a("bold",[1,22],"modifier"),a("dim",[2,22],"modifier"),a("italic",[3,23],"modifier"),a("underline",[4,24],"modifier"),a("inverse",[7,27],"modifier"),a("hidden",[8,28],"modifier"),a("strikethrough",[9,29],"modifier"),a("black",[30,39],"color"),a("red",[31,39],"color"),a("green",[32,39],"color"),a("yellow",[33,39],"color"),a("blue",[34,39],"color"),a("magenta",[35,39],"color"),a("cyan",[36,39],"color"),a("white",[37,39],"color"),a("gray",[90,39],"color"),a("grey",[90,39],"color"),a("bgBlack",[40,49],"bg"),a("bgRed",[41,49],"bg"),a("bgGreen",[42,49],"bg"),a("bgYellow",[43,49],"bg"),a("bgBlue",[44,49],"bg"),a("bgMagenta",[45,49],"bg"),a("bgCyan",[46,49],"bg"),a("bgWhite",[47,49],"bg"),a("blackBright",[90,39],"bright"),a("redBright",[91,39],"bright"),a("greenBright",[92,39],"bright"),a("yellowBright",[93,39],"bright"),a("blueBright",[94,39],"bright"),a("magentaBright",[95,39],"bright"),a("cyanBright",[96,39],"bright"),a("whiteBright",[97,39],"bright"),a("bgBlackBright",[100,49],"bgBright"),a("bgRedBright",[101,49],"bgBright"),a("bgGreenBright",[102,49],"bgBright"),a("bgYellowBright",[103,49],"bgBright"),a("bgBlueBright",[104,49],"bgBright"),a("bgMagentaBright",[105,49],"bgBright"),a("bgCyanBright",[106,49],"bgBright"),a("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=QAt,t.hasColor=t.hasAnsi=n=>(t.ansiRegex.lastIndex=0,typeof n=="string"&&n!==""&&t.ansiRegex.test(n)),t.alias=(n,u)=>{let A=typeof u=="string"?t[u]:u;if(typeof A!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");A.stack||(Reflect.defineProperty(A,"name",{value:n}),t.styles[n]=A,A.stack=[n]),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(p){t.alias(n,p)},get(){let p=h=>o(h,p.stack);return Reflect.setPrototypeOf(p,t),p.stack=this.stack?this.stack.concat(A.stack):A.stack,p}})},t.theme=n=>{if(!kAt(n))throw new TypeError("Expected theme to be an object");for(let u of Object.keys(n))t.alias(u,n[u]);return t},t.alias("unstyle",n=>typeof n=="string"&&n!==""?(t.ansiRegex.lastIndex=0,n.replace(t.ansiRegex,"")):""),t.alias("noop",n=>n),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=Yhe(),t.define=a,t};m8.exports=Vhe();m8.exports.create=Vhe});var xo=_(an=>{"use strict";var FAt=Object.prototype.toString,ic=eu(),Khe=!1,y8=[],Jhe={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};an.longest=(t,e)=>t.reduce((r,o)=>Math.max(r,e?o[e].length:o.length),0);an.hasColor=t=>!!t&&ic.hasColor(t);var Ok=an.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);an.nativeType=t=>FAt.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");an.isAsyncFn=t=>an.nativeType(t)==="asyncfunction";an.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";an.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;an.scrollDown=(t=[])=>[...t.slice(1),t[0]];an.scrollUp=(t=[])=>[t.pop(),...t];an.reorder=(t=[])=>{let e=t.slice();return e.sort((r,o)=>r.index>o.index?1:r.index{let o=t.length,a=r===o?0:r<0?o-1:r,n=t[e];t[e]=t[a],t[a]=n};an.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};an.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};an.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:o=` -`+r,width:a=80}=e,n=(o+r).match(/[^\S\n]/g)||[];a-=n.length;let u=`.{1,${a}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,A=t.trim(),p=new RegExp(u,"g"),h=A.match(p)||[];return h=h.map(E=>E.replace(/\n$/,"")),e.padEnd&&(h=h.map(E=>E.padEnd(a," "))),e.padStart&&(h=h.map(E=>E.padStart(a," "))),r+h.join(o)};an.unmute=t=>{let e=t.stack.find(o=>ic.keys.color.includes(o));return e?ic[e]:t.stack.find(o=>o.slice(2)==="bg")?ic[e.slice(2)]:o=>o};an.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";an.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>ic.keys.color.includes(o));if(e){let o=ic["bg"+an.pascal(e)];return o?o.black:t}let r=t.stack.find(o=>o.slice(0,2)==="bg");return r?ic[r.slice(2).toLowerCase()]||t:ic.none};an.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>ic.keys.color.includes(o)),r=t.stack.find(o=>o.slice(0,2)==="bg");if(e&&!r)return ic[Jhe[e]||e];if(r){let o=r.slice(2).toLowerCase(),a=Jhe[o];return a&&ic["bg"+an.pascal(a)]||t}return ic.none};an.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),o=e>=12?"pm":"am";e=e%12;let a=e===0?12:e,n=r<10?"0"+r:r;return a+":"+n+" "+o};an.set=(t={},e="",r)=>e.split(".").reduce((o,a,n,u)=>{let A=u.length-1>n?o[a]||{}:r;return!an.isObject(A)&&n{let o=t[e]==null?e.split(".").reduce((a,n)=>a&&a[n],t):t[e];return o??r};an.mixin=(t,e)=>{if(!Ok(t))return e;if(!Ok(e))return t;for(let r of Object.keys(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(o.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&Ok(o.value)){let a=Object.getOwnPropertyDescriptor(t,r);Ok(a.value)?t[r]=an.merge({},t[r],e[r]):Reflect.defineProperty(t,r,o)}else Reflect.defineProperty(t,r,o);else Reflect.defineProperty(t,r,o)}return t};an.merge=(...t)=>{let e={};for(let r of t)an.mixin(e,r);return e};an.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let o of Object.keys(r)){let a=r[o];typeof a=="function"?an.define(t,o,a.bind(e)):an.define(t,o,a)}};an.onExit=t=>{let e=(r,o)=>{Khe||(Khe=!0,y8.forEach(a=>a()),r===!0&&process.exit(128+o))};y8.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),y8.push(t)};an.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};an.defineExport=(t,e,r)=>{let o;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(a){o=a},get(){return o?o():r()}})}});var zhe=_(cE=>{"use strict";cE.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};cE.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};cE.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};cE.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};cE.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var $he=_((R_t,Zhe)=>{"use strict";var Xhe=ve("readline"),RAt=zhe(),TAt=/^(?:\x1b)([a-zA-Z0-9])$/,LAt=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,NAt={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function OAt(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function MAt(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var Mk=(t="",e={})=>{let r,o={name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t,...e};if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t="\x1B"+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=o.sequence||""),o.sequence=o.sequence||t||o.name,t==="\r")o.raw=void 0,o.name="return";else if(t===` -`)o.name="enter";else if(t===" ")o.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x1B\x7F"||t==="\x1B\b")o.name="backspace",o.meta=t.charAt(0)==="\x1B";else if(t==="\x1B"||t==="\x1B\x1B")o.name="escape",o.meta=t.length===2;else if(t===" "||t==="\x1B ")o.name="space",o.meta=t.length===2;else if(t<="")o.name=String.fromCharCode(t.charCodeAt(0)+97-1),o.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")o.name="number";else if(t.length===1&&t>="a"&&t<="z")o.name=t;else if(t.length===1&&t>="A"&&t<="Z")o.name=t.toLowerCase(),o.shift=!0;else if(r=TAt.exec(t))o.meta=!0,o.shift=/^[A-Z]$/.test(r[1]);else if(r=LAt.exec(t)){let a=[...t];a[0]==="\x1B"&&a[1]==="\x1B"&&(o.option=!0);let n=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),u=(r[3]||r[5]||1)-1;o.ctrl=!!(u&4),o.meta=!!(u&10),o.shift=!!(u&1),o.code=n,o.name=NAt[n],o.shift=OAt(n)||o.shift,o.ctrl=MAt(n)||o.ctrl}return o};Mk.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let o=Xhe.createInterface({terminal:!0,input:r});Xhe.emitKeypressEvents(r,o);let a=(A,p)=>e(A,Mk(A,p),o),n=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",a),o.resume(),()=>{r.isTTY&&r.setRawMode(n),r.removeListener("keypress",a),o.pause(),o.close()}};Mk.action=(t,e,r)=>{let o={...RAt,...r};return e.ctrl?(e.action=o.ctrl[e.name],e):e.option&&o.option?(e.action=o.option[e.name],e):e.shift?(e.action=o.shift[e.name],e):(e.action=o.keys[e.name],e)};Zhe.exports=Mk});var t0e=_((T_t,e0e)=>{"use strict";e0e.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(e)for(let r of Object.keys(e)){let o=e[r];typeof o=="number"&&(o={interval:o}),UAt(t,r,o)}};function UAt(t,e,r={}){let o=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},a=r.interval||120;o.frames=r.frames||[],o.loading=!0;let n=setInterval(()=>{o.ms=Date.now()-o.start,o.tick++,t.render()},a);return o.stop=()=>{o.loading=!1,clearInterval(n)},Reflect.defineProperty(o,"interval",{value:n}),t.once("close",()=>o.stop()),o.stop}});var n0e=_((L_t,r0e)=>{"use strict";var{define:_At,width:HAt}=xo(),E8=class{constructor(e){let r=e.options;_At(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=HAt(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};r0e.exports=E8});var s0e=_((N_t,i0e)=>{"use strict";var C8=xo(),Vs=eu(),I8={default:Vs.noop,noop:Vs.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||C8.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||C8.complement(this.primary)},primary:Vs.cyan,success:Vs.green,danger:Vs.magenta,strong:Vs.bold,warning:Vs.yellow,muted:Vs.dim,disabled:Vs.gray,dark:Vs.dim.gray,underline:Vs.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};I8.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(Vs.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(Vs.visible=t.styles.visible);let e=C8.merge({},I8,t.styles);delete e.merge;for(let r of Object.keys(Vs))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>Vs[r]});for(let r of Object.keys(Vs.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>Vs[r]});return e};i0e.exports=I8});var a0e=_((O_t,o0e)=>{"use strict";var w8=process.platform==="win32",Yf=eu(),qAt=xo(),B8={...Yf.symbols,upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:Yf.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:Yf.symbols.question,submitted:Yf.symbols.check,cancelled:Yf.symbols.cross},separator:{pending:Yf.symbols.pointerSmall,submitted:Yf.symbols.middot,cancelled:Yf.symbols.middot},radio:{off:w8?"( )":"\u25EF",on:w8?"(*)":"\u25C9",disabled:w8?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]};B8.merge=t=>{let e=qAt.merge({},Yf.symbols,B8,t.symbols);return delete e.merge,e};o0e.exports=B8});var c0e=_((M_t,l0e)=>{"use strict";var jAt=s0e(),GAt=a0e(),WAt=xo();l0e.exports=t=>{t.options=WAt.merge({},t.options.theme,t.options),t.symbols=GAt.merge(t.options),t.styles=jAt.merge(t.options)}});var h0e=_((f0e,p0e)=>{"use strict";var u0e=process.env.TERM_PROGRAM==="Apple_Terminal",YAt=eu(),v8=xo(),tu=p0e.exports=f0e,Pi="\x1B[",A0e="\x07",D8=!1,kh=tu.code={bell:A0e,beep:A0e,beginning:`${Pi}G`,down:`${Pi}J`,esc:Pi,getPosition:`${Pi}6n`,hide:`${Pi}?25l`,line:`${Pi}2K`,lineEnd:`${Pi}K`,lineStart:`${Pi}1K`,restorePosition:Pi+(u0e?"8":"u"),savePosition:Pi+(u0e?"7":"s"),screen:`${Pi}2J`,show:`${Pi}?25h`,up:`${Pi}1J`},Yg=tu.cursor={get hidden(){return D8},hide(){return D8=!0,kh.hide},show(){return D8=!1,kh.show},forward:(t=1)=>`${Pi}${t}C`,backward:(t=1)=>`${Pi}${t}D`,nextLine:(t=1)=>`${Pi}E`.repeat(t),prevLine:(t=1)=>`${Pi}F`.repeat(t),up:(t=1)=>t?`${Pi}${t}A`:"",down:(t=1)=>t?`${Pi}${t}B`:"",right:(t=1)=>t?`${Pi}${t}C`:"",left:(t=1)=>t?`${Pi}${t}D`:"",to(t,e){return e?`${Pi}${e+1};${t+1}H`:`${Pi}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?Yg.left(-t):t>0?Yg.right(t):"",r+=e<0?Yg.up(-e):e>0?Yg.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:o,input:a,prompt:n,size:u,value:A}=t;if(o=v8.isPrimitive(o)?String(o):"",a=v8.isPrimitive(a)?String(a):"",A=v8.isPrimitive(A)?String(A):"",u){let p=tu.cursor.up(u)+tu.cursor.to(n.length),h=a.length-r;return h>0&&(p+=tu.cursor.left(h)),p}if(A||e){let p=!a&&o?-o.length:-a.length+r;return e&&(p-=e.length),a===""&&o&&!n.includes(o)&&(p+=o.length),tu.cursor.move(p)}}},S8=tu.erase={screen:kh.screen,up:kh.up,down:kh.down,line:kh.line,lineEnd:kh.lineEnd,lineStart:kh.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return S8.line+Yg.to(0);let r=n=>[...YAt.unstyle(n)].length,o=t.split(/\r?\n/),a=0;for(let n of o)a+=1+Math.floor(Math.max(r(n)-1,0)/e);return(S8.line+Yg.prevLine()).repeat(a-1)+S8.line+Yg.to(0)}});var uE=_((U_t,d0e)=>{"use strict";var VAt=ve("events"),g0e=eu(),P8=$he(),KAt=t0e(),JAt=n0e(),zAt=c0e(),Na=xo(),Vg=h0e(),x8=class t extends VAt{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,zAt(this),KAt(this),this.state=new JAt(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=ZAt(this.options.margin),this.setMaxListeners(0),XAt(this)}async keypress(e,r={}){this.keypressed=!0;let o=P8.action(e,P8(e,r),this.options.actions);this.state.keypress=o,this.emit("keypress",e,o),this.emit("state",this.state.clone());let a=this.options[o.action]||this[o.action]||this.dispatch;if(typeof a=="function")return await a.call(this,e,o);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(Vg.code.beep)}cursorHide(){this.stdout.write(Vg.cursor.hide()),Na.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Vg.cursor.show())}write(e){e&&(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Vg.cursor.down(e)+Vg.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:o}=this.sections(),{cursor:a,initial:n="",input:u="",value:A=""}=this,p=this.state.size=o.length,h={after:r,cursor:a,initial:n,input:u,prompt:e,size:p,value:A},E=Vg.cursor.restore(h);E&&this.stdout.write(E)}sections(){let{buffer:e,input:r,prompt:o}=this.state;o=g0e.unstyle(o);let a=g0e.unstyle(e),n=a.indexOf(o),u=a.slice(0,n),p=a.slice(n).split(` -`),h=p[0],E=p[p.length-1],D=(o+(r?" "+r:"")).length,b=De.call(this,this.value),this.result=()=>o.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let a=r.onSubmit.bind(this),n=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await a(this.name,this.value,this),n())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,o){let{options:a,state:n,symbols:u,timers:A}=this,p=A&&A[e];n.timer=p;let h=a[e]||n[e]||u[e],E=r&&r[e]!=null?r[e]:await h;if(E==="")return E;let w=await this.resolve(E,n,r,o);return!w&&r&&r[e]?this.resolve(h,n,r,o):w}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,o=this.state;return o.timer=r,Na.isObject(e)&&(e=e[o.status]||e.pending),Na.hasColor(e)?e:(this.styles[o.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Na.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,o=this.state;o.timer=r;let a=e[o.status]||e.pending||o.separator,n=await this.resolve(a,o);return Na.isObject(n)&&(n=n[o.status]||n.pending),Na.hasColor(n)?n:this.styles.muted(n)}async pointer(e,r){let o=await this.element("pointer",e,r);if(typeof o=="string"&&Na.hasColor(o))return o;if(o){let a=this.styles,n=this.index===r,u=n?a.primary:h=>h,A=await this.resolve(o[n?"on":"off"]||o,this.state),p=Na.hasColor(A)?A:u(A);return n?p:" ".repeat(A.length)}}async indicator(e,r){let o=await this.element("indicator",e,r);if(typeof o=="string"&&Na.hasColor(o))return o;if(o){let a=this.styles,n=e.enabled===!0,u=n?a.success:a.dark,A=o[n?"on":"off"]||o;return Na.hasColor(A)?A:u(A)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Na.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return Na.resolve(this,e,...r)}get base(){return t.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Na.height(this.stdout,25)}get width(){return this.options.columns||Na.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,o=[r,e].find(this.isValue.bind(this));return this.isValue(o)?o:this.initial}static get prompt(){return e=>new this(e).run()}};function XAt(t){let e=a=>t[a]===void 0||typeof t[a]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],o=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let a of Object.keys(t.options)){if(r.includes(a)||/^on[A-Z]/.test(a))continue;let n=t.options[a];typeof n=="function"&&e(a)?o.includes(a)||(t[a]=n.bind(t)):typeof t[a]!="function"&&(t[a]=n)}}function ZAt(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=a=>a%2===0?` -`:" ",o=[];for(let a=0;a<4;a++){let n=r(a);e[a]?o.push(n.repeat(e[a])):o.push("")}return o}d0e.exports=x8});var E0e=_((__t,y0e)=>{"use strict";var $At=xo(),m0e={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return m0e.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};y0e.exports=(t,e={})=>{let r=$At.merge({},m0e,e.roles);return r[t]||r.default}});var b2=_((H_t,w0e)=>{"use strict";var eft=eu(),tft=uE(),rft=E0e(),Uk=xo(),{reorder:b8,scrollUp:nft,scrollDown:ift,isObject:C0e,swap:sft}=Uk,k8=class extends tft{constructor(e){super(e),this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:o,suggest:a}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(n=>n.enabled=!1),typeof a!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");C0e(r)&&(r=Object.keys(r)),Array.isArray(r)?(o!=null&&(this.index=this.findIndex(o)),r.forEach(n=>this.enable(this.find(n))),await this.render()):(o!=null&&(r=o),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let o=[],a=0,n=async(u,A)=>{typeof u=="function"&&(u=await u.call(this)),u instanceof Promise&&(u=await u);for(let p=0;p(this.state.loadingChoices=!1,u))}async toChoice(e,r,o){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let a=e.value;if(e=rft(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=r,e.cursor=0,Uk.define(e,"parent",o),e.level=o?o.level+1:1,e.indent==null&&(e.indent=o?o.indent+" ":e.indent||""),e.path=o?o.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,eft.unstyle(e.message).length));let u={...e};return e.reset=(A=u.input,p=u.value)=>{for(let h of Object.keys(u))e[h]=u[h];e.input=A,e.value=p},a==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,o){let a=await this.toChoice(e,r,o);return this.choices.push(a),this.index=this.choices.length-1,this.limit=this.choices.length,a}async newItem(e,r,o){let a={name:"New choice name?",editable:!0,newChoice:!0,...e},n=await this.addChoice(a,r,o);return n.updateChoice=()=>{delete n.newChoice,n.name=n.message=n.input,n.input="",n.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(a=>this.toggle(a,r));let o=e.parent;for(;o;){let a=o.choices.filter(n=>this.isDisabled(n));o.enabled=a.every(n=>n.enabled===!0),o=o.parent}return I0e(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=o=>{let a=Number(o);if(a>this.choices.length-1)return this.alert();let n=this.focused,u=this.choices.find(A=>a===A.index);if(!u.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(u)===-1){let A=b8(this.choices),p=A.indexOf(u);if(n.index>p){let h=A.slice(p,p+this.limit),E=A.filter(w=>!h.includes(w));this.choices=h.concat(E)}else{let h=p-this.limit+1;this.choices=A.slice(h).concat(A.slice(0,h))}}return this.index=this.choices.indexOf(u),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(o=>{let a=this.choices.length,n=this.num,u=(A=!1,p)=>{clearTimeout(this.numberTimeout),A&&(p=r(n)),this.num="",o(p)};if(n==="0"||n.length===1&&+(n+"0")>a)return u(!0);if(Number(n)>a)return u(!1,this.alert());this.numberTimeout=setTimeout(()=>u(!0),this.delay)})}home(){return this.choices=b8(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=b8(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===0?this.alert():e>r&&o===0?this.scrollUp():(this.index=(o-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===r-1?this.alert():e>r&&o===r-1?this.scrollDown():(this.index=(o+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=nft(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=ift(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){sft(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(o=>e[o]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(o=>!this.isDisabled(o));return e.enabled&&r.every(o=>this.isEnabled(o))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((o,a)=>(o[a]=this.find(a,r),o),{})}filter(e,r){let a=typeof e=="function"?e:(A,p)=>[A.name,p].includes(e),u=(this.options.multiple?this.state._choices:this.choices).filter(a);return r?u.map(A=>A[r]):u}find(e,r){if(C0e(e))return r?e[r]:e;let a=typeof e=="function"?e:(u,A)=>[u.name,A].includes(e),n=this.choices.find(a);if(n)return r?n[r]:n}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(u=>u.newChoice))return this.alert();let{reorder:r,sort:o}=this.options,a=this.multiple===!0,n=this.selected;return n===void 0?this.alert():(Array.isArray(n)&&r!==!1&&o!==!0&&(n=Uk.reorder(n)),this.value=a?n.map(u=>u.name):n.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(o=>o.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let o=this.find(r);o&&(this.initial=o.index,this.focus(o,!0))}}}get choices(){return I0e(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:o}=this,a=e.limit||this._limit||r.limit||o.length;return Math.min(a,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function I0e(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(Uk.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let o=r.choices.filter(a=>!t.isDisabled(a));r.enabled=o.every(a=>a.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}w0e.exports=k8});var Qh=_((q_t,B0e)=>{"use strict";var oft=b2(),Q8=xo(),F8=class extends oft{constructor(e){super(e),this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let o=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!Q8.hasColor(o)&&(o=this.styles.strong(o)),this.resolve(o,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await this.indicator(e,r)+(e.pad||""),u=await this.resolve(e.hint,this.state,e,r);u&&!Q8.hasColor(u)&&(u=this.styles.muted(u));let A=this.indent(e),p=await this.choiceMessage(e,r),h=()=>[this.margin[3],A+a+n,p,this.margin[1],u].filter(Boolean).join(" ");return e.role==="heading"?h():e.disabled?(Q8.hasColor(p)||(p=this.styles.disabled(p)),h()):(o&&(p=this.styles.em(p)),h())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(n,u)=>await this.renderChoice(n,u)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let o=this.margin[0]+r.join(` -`),a;return this.options.choicesHeader&&(a=await this.resolve(this.options.choicesHeader,this.state)),[a,o].filter(Boolean).join(` -`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,o="",a=await this.header(),n=await this.prefix(),u=await this.separator(),A=await this.message();this.options.promptLine!==!1&&(o=[n,A,u,""].join(" "),this.state.prompt=o);let p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),w=await this.footer();p&&(o+=p),h&&!o.includes(h)&&(o+=" "+h),e&&!p&&!E.trim()&&this.multiple&&this.emptyError!=null&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([a,o,E,w].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};B0e.exports=F8});var D0e=_((j_t,v0e)=>{"use strict";var aft=Qh(),lft=(t,e)=>{let r=t.toLowerCase();return o=>{let n=o.toLowerCase().indexOf(r),u=e(o.slice(n,n+r.length));return n>=0?o.slice(0,n)+u+o.slice(n+r.length):o}},R8=class extends aft{constructor(e){super(e),this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:o}=this.state;return this.input=o.slice(0,r)+e+o.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let o=e.toLowerCase();return r.filter(a=>a.message.toLowerCase().includes(o))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=lft(this.input,e),o=this.choices;this.choices=o.map(a=>({...a,message:r(a.message)})),await super.render(),this.choices=o}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};v0e.exports=R8});var L8=_((G_t,S0e)=>{"use strict";var T8=xo();S0e.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:o="",pos:a,showCursor:n=!0,color:u}=e,A=u||t.styles.placeholder,p=T8.inverse(t.styles.primary),h=T=>p(t.styles.black(T)),E=r,w=" ",D=h(w);if(t.blink&&t.blink.off===!0&&(h=T=>T,D=""),n&&a===0&&o===""&&r==="")return h(w);if(n&&a===0&&(r===o||r===""))return h(o[0])+A(o.slice(1));o=T8.isPrimitive(o)?`${o}`:"",r=T8.isPrimitive(r)?`${r}`:"";let b=o&&o.startsWith(r)&&o!==r,C=b?h(o[r.length]):D;if(a!==r.length&&n===!0&&(E=r.slice(0,a)+h(r[a])+r.slice(a+1),C=""),n===!1&&(C=""),b){let T=t.styles.unstyle(E+C);return E+C+A(o.slice(T.length))}return E+C}});var _k=_((W_t,P0e)=>{"use strict";var cft=eu(),uft=Qh(),Aft=L8(),N8=class extends uft{constructor(e){super({...e,multiple:!0}),this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:o,input:a}=r;return r.value=r.input=a.slice(0,o)+e+a.slice(o),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:o}=e;return e.value=e.input=o.slice(0,r-1)+o.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:o}=e;if(o[r]===void 0)return this.alert();let a=`${o}`.slice(0,r)+`${o}`.slice(r+1);return e.value=e.input=a,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:o}=e;return r&&r.startsWith(o)&&o!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,r){let o=await this.resolve(e.separator,this.state,e,r)||":";return o?" "+this.styles.disabled(o):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:o,styles:a}=this,{cursor:n,initial:u="",name:A,hint:p,input:h=""}=e,{muted:E,submitted:w,primary:D,danger:b}=a,C=p,T=this.index===r,N=e.validate||(()=>!0),U=await this.choiceSeparator(e,r),J=e.message;this.align==="right"&&(J=J.padStart(this.longest+1," ")),this.align==="left"&&(J=J.padEnd(this.longest+1," "));let te=this.values[A]=h||u,le=h?"success":"dark";await N.call(e,te,this.state)!==!0&&(le="danger");let ce=a[le],ue=ce(await this.indicator(e,r))+(e.pad||""),Ie=this.indent(e),he=()=>[Ie,ue,J+U,h,C].filter(Boolean).join(" ");if(o.submitted)return J=cft.unstyle(J),h=w(h),C="",he();if(e.format)h=await e.format.call(this,h,e,r);else{let De=this.styles.muted;h=Aft(this,{input:h,initial:u,pos:n,showCursor:T,color:De})}return this.isValue(h)||(h=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[A]=await e.result.call(this,te,e,r)),T&&(J=D(J)),e.error?h+=(h?" ":"")+b(e.error.trim()):e.hint&&(h+=(h?" ":"")+E(e.hint.trim())),he()}async submit(){return this.value=this.values,super.base.submit.call(this)}};P0e.exports=N8});var O8=_((Y_t,b0e)=>{"use strict";var fft=_k(),pft=()=>{throw new Error("expected prompt to have a custom authenticate method")},x0e=(t=pft)=>{class e extends fft{constructor(o){super(o)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(o){return x0e(o)}}return e};b0e.exports=x0e()});var F0e=_((V_t,Q0e)=>{"use strict";var hft=O8();function gft(t,e){return t.username===this.options.username&&t.password===this.options.password}var k0e=(t=gft)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(o){return this.options.showPassword?o:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(o.length))}}];class r extends hft.create(t){constructor(a){super({...a,choices:e})}static create(a){return k0e(a)}}return r};Q0e.exports=k0e()});var Hk=_((K_t,R0e)=>{"use strict";var dft=uE(),{isPrimitive:mft,hasColor:yft}=xo(),M8=class extends dft{constructor(e){super(e),this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:o}=this;return o.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return mft(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return yft(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=this.styles.muted(this.default),A=[o,n,u,a].filter(Boolean).join(" ");this.state.prompt=A;let p=await this.header(),h=this.value=this.cast(e),E=await this.format(h),w=await this.error()||await this.hint(),D=await this.footer();w&&!A.includes(w)&&(E+=" "+w),A+=" "+E,this.clear(r),this.write([p,A,D].filter(Boolean).join(` -`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};R0e.exports=M8});var L0e=_((J_t,T0e)=>{"use strict";var Eft=Hk(),U8=class extends Eft{constructor(e){super(e),this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};T0e.exports=U8});var O0e=_((z_t,N0e)=>{"use strict";var Cft=Qh(),Ift=_k(),AE=Ift.prototype,_8=class extends Cft{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let o=this.focused,a=o.parent||{};return!o.editable&&!a.editable&&(e==="a"||e==="i")?super[e]():AE.dispatch.call(this,e,r)}append(e,r){return AE.append.call(this,e,r)}delete(e,r){return AE.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?AE.next.call(this):super.next()}prev(){return this.focused.editable?AE.prev.call(this):super.prev()}async indicator(e,r){let o=e.indicator||"",a=e.editable?o:super.indicator(e,r);return await this.resolve(a,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?AE.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let o=r.parent?this.value[r.parent.name]:this.value;if(r.editable?o=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(o=r.enabled===!0),e=await r.validate(o,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};N0e.exports=_8});var Kg=_((X_t,M0e)=>{"use strict";var wft=uE(),Bft=L8(),{isPrimitive:vft}=xo(),H8=class extends wft{constructor(e){super(e),this.initial=vft(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let o=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!o||o.name!=="return")?this.append(` -`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:o}=this.state;this.input=`${o}`.slice(0,r)+e+`${o}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),o=this.input.slice(e),a=r.split(" ");this.state.clipboard.push(a.pop()),this.input=a.join(" "),this.cursor=this.input.length,this.input+=o,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):Bft(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),o=await this.separator(),a=await this.message(),n=[r,a,o].filter(Boolean).join(" ");this.state.prompt=n;let u=await this.header(),A=await this.format(),p=await this.error()||await this.hint(),h=await this.footer();p&&!A.includes(p)&&(A+=" "+p),n+=" "+A,this.clear(e),this.write([u,n,h].filter(Boolean).join(` -`)),this.restore()}};M0e.exports=H8});var _0e=_((Z_t,U0e)=>{"use strict";var Dft=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),qk=t=>Dft(t).filter(Boolean);U0e.exports=(t,e={},r="")=>{let{past:o=[],present:a=""}=e,n,u;switch(t){case"prev":case"undo":return n=o.slice(0,o.length-1),u=o[o.length-1]||"",{past:qk([r,...n]),present:u};case"next":case"redo":return n=o.slice(1),u=o[0]||"",{past:qk([...n,r]),present:u};case"save":return{past:qk([...o,r]),present:""};case"remove":return u=qk(o.filter(A=>A!==r)),a="",u.length&&(a=u.pop()),{past:u,present:a};default:throw new Error(`Invalid action: "${t}"`)}}});var j8=_(($_t,q0e)=>{"use strict";var Sft=Kg(),H0e=_0e(),q8=class extends Sft{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let o=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:o},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=H0e(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){this.store&&(this.data=H0e("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};q0e.exports=q8});var G0e=_((e8t,j0e)=>{"use strict";var Pft=Kg(),G8=class extends Pft{format(){return""}};j0e.exports=G8});var Y0e=_((t8t,W0e)=>{"use strict";var xft=Kg(),W8=class extends xft{constructor(e={}){super(e),this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};W0e.exports=W8});var K0e=_((r8t,V0e)=>{"use strict";var bft=Qh(),Y8=class extends bft{constructor(e){super({...e,multiple:!0})}};V0e.exports=Y8});var K8=_((n8t,J0e)=>{"use strict";var kft=Kg(),V8=class extends kft{constructor(e={}){super({style:"number",...e}),this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,o=this.toNumber(this.input);return o>this.max+r?this.alert():(this.input=`${o+r}`,this.render())}down(e){let r=e||this.minor,o=this.toNumber(this.input);return othis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};J0e.exports=V8});var X0e=_((i8t,z0e)=>{z0e.exports=K8()});var $0e=_((s8t,Z0e)=>{"use strict";var Qft=Kg(),J8=class extends Qft{constructor(e){super(e),this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};Z0e.exports=J8});var rge=_((o8t,tge)=>{"use strict";var Fft=eu(),Rft=b2(),ege=xo(),z8=class extends Rft{constructor(e={}){super(e),this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` - `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((o,a)=>({name:a+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let o=0;o=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?"":["",...this.scale.map(o=>` ${o.name} - ${o.message}`)].map(o=>this.styles.muted(o)).join(` -`)}renderScaleHeading(e){let r=this.scale.map(p=>p.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let o=this.scaleLength-r.join("").length,a=Math.round(o/(r.length-1)),u=r.map(p=>this.styles.strong(p)).join(" ".repeat(a)),A=" ".repeat(this.widths[0]);return this.margin[3]+A+this.margin[1]+u}scaleIndicator(e,r,o){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,o);let a=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):a?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let o=e.scale.map(n=>this.scaleIndicator(e,n,r)),a=this.term==="Hyper"?"":" ";return o.join(a+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await e.hint;n&&!ege.hasColor(n)&&(n=this.styles.muted(n));let u=C=>this.margin[3]+C.replace(/\s+$/,"").padEnd(this.widths[0]," "),A=this.newline,p=this.indent(e),h=await this.resolve(e.message,this.state,e,r),E=await this.renderScale(e,r),w=this.margin[1]+this.margin[3];this.scaleLength=Fft.unstyle(E).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-w.length);let b=ege.wordWrap(h,{width:this.widths[0],newline:A}).split(` -`).map(C=>u(C)+this.margin[1]);return o&&(E=this.styles.info(E),b=b.map(C=>this.styles.info(C))),b[0]+=E,this.linebreak&&b.push(""),[p+a,b.join(` -`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(a,n)=>await this.renderChoice(a,n)),r=await Promise.all(e),o=await this.renderScaleHeading();return this.margin[0]+[o,...r.map(a=>a.join(" "))].join(` -`)}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u="";this.options.promptLine!==!1&&(u=[o,n,a,""].join(" "),this.state.prompt=u);let A=await this.header(),p=await this.format(),h=await this.renderScaleKey(),E=await this.error()||await this.hint(),w=await this.renderChoices(),D=await this.footer(),b=this.emptyError;p&&(u+=p),E&&!u.includes(E)&&(u+=" "+E),e&&!p&&!w.trim()&&this.multiple&&b!=null&&(u+=this.styles.danger(b)),this.clear(r),this.write([A,u,h,w,D].filter(Boolean).join(` -`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};tge.exports=z8});var sge=_((a8t,ige)=>{"use strict";var nge=eu(),Tft=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",Z8=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=Tft(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},Lft=async(t={},e={},r=o=>o)=>{let o=new Set,a=t.fields||[],n=t.template,u=[],A=[],p=[],h=1;typeof n=="function"&&(n=await n());let E=-1,w=()=>n[++E],D=()=>n[E+1],b=C=>{C.line=h,u.push(C)};for(b({type:"bos",value:""});Ele.name===U.key);U.field=a.find(le=>le.name===U.key),te||(te=new Z8(U),A.push(te)),te.lines.push(U.line-1);continue}let T=u[u.length-1];T.type==="text"&&T.line===h?T.value+=C:b({type:"text",value:C})}return b({type:"eos",value:""}),{input:n,tabstops:u,unique:o,keys:p,items:A}};ige.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),o={...e.values,...e.initial},{tabstops:a,items:n,keys:u}=await Lft(e,o),A=X8("result",t,e),p=X8("format",t,e),h=X8("validate",t,e,!0),E=t.isValue.bind(t);return async(w={},D=!1)=>{let b=0;w.required=r,w.items=n,w.keys=u,w.output="";let C=async(J,te,le,ce)=>{let ue=await h(J,te,le,ce);return ue===!1?"Invalid field "+le.name:ue};for(let J of a){let te=J.value,le=J.key;if(J.type!=="template"){te&&(w.output+=te);continue}if(J.type==="template"){let ce=n.find(Ee=>Ee.name===le);e.required===!0&&w.required.add(ce.name);let ue=[ce.input,w.values[ce.value],ce.value,te].find(E),he=(ce.field||{}).message||J.inner;if(D){let Ee=await C(w.values[le],w,ce,b);if(Ee&&typeof Ee=="string"||Ee===!1){w.invalid.set(le,Ee);continue}w.invalid.delete(le);let g=await A(w.values[le],w,ce,b);w.output+=nge.unstyle(g);continue}ce.placeholder=!1;let De=te;te=await p(te,w,ce,b),ue!==te?(w.values[le]=ue,te=t.styles.typing(ue),w.missing.delete(he)):(w.values[le]=void 0,ue=`<${he}>`,te=t.styles.primary(ue),ce.placeholder=!0,w.required.has(le)&&w.missing.add(he)),w.missing.has(he)&&w.validating&&(te=t.styles.warning(ue)),w.invalid.has(le)&&w.validating&&(te=t.styles.danger(ue)),b===w.index&&(De!==te?te=t.styles.underline(te):te=t.styles.heading(nge.unstyle(te))),b++}te&&(w.output+=te)}let T=w.output.split(` -`).map(J=>" "+J),N=n.length,U=0;for(let J of n)w.invalid.has(J.name)&&J.lines.forEach(te=>{T[te][0]===" "&&(T[te]=w.styles.danger(w.symbols.bullet)+T[te].slice(1))}),t.isValue(w.values[J.name])&&U++;return w.completed=(U/N*100).toFixed(0),w.output=T.join(` -`),w.output}};function X8(t,e,r,o){return(a,n,u,A)=>typeof u.field[t]=="function"?u.field[t].call(e,a,n,u,A):[o,a].find(p=>e.isValue(p))}});var age=_((l8t,oge)=>{"use strict";var Nft=eu(),Oft=sge(),Mft=uE(),$8=class extends Mft{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await Oft(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let o=this.getItem(),a=o.input.slice(0,this.cursor),n=o.input.slice(this.cursor);this.input=o.input=`${a}${e}${n}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),o=e.input.slice(0,this.cursor-1);this.input=e.input=`${o}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:o,size:a}=this.state,n=[this.options.newline,` -`].find(J=>J!=null),u=await this.prefix(),A=await this.separator(),p=await this.message(),h=[u,p,A].filter(Boolean).join(" ");this.state.prompt=h;let E=await this.header(),w=await this.error()||"",D=await this.hint()||"",b=o?"":await this.interpolate(this.state),C=this.state.key=r[e]||"",T=await this.format(C),N=await this.footer();T&&(h+=" "+T),D&&!T&&this.state.completed===0&&(h+=" "+D),this.clear(a);let U=[E,h,b,N,w.trim()];this.write(U.filter(Boolean).join(n)),this.restore()}getItem(e){let{items:r,keys:o,index:a}=this.state,n=r.find(u=>u.name===o[a]);return n&&n.input!=null&&(this.input=n.input,this.cursor=n.cursor),n}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:o,values:a}=this.state;if(e.size){let A="";for(let[p,h]of e)A+=`Invalid ${p}: ${h} -`;return this.state.error=A,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let u=Nft.unstyle(o).split(` -`).map(A=>A.slice(1)).join(` -`);return this.value={values:a,result:u},super.submit()}};oge.exports=$8});var cge=_((c8t,lge)=>{"use strict";var Uft="(Use + to sort)",_ft=Qh(),eH=class extends _ft{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,Uft].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let o=await super.renderChoice(e,r),a=this.symbols.identicalTo+" ",n=this.index===r&&this.sorting?this.styles.muted(a):" ";return this.options.drag===!1&&(n=""),this.options.numbered===!0?n+`${r+1} - `+o:n+o}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};lge.exports=eH});var Age=_((u8t,uge)=>{"use strict";var Hft=b2(),tH=class extends Hft{constructor(e={}){if(super(e),this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(o=>this.styles.muted(o)),this.state.header=r.join(` - `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let o of r)o.scale=qft(5,this.options),o.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],o=r.selected;return e.scale.forEach(a=>a.selected=!1),r.selected=!o,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=this.term==="Hyper",n=a?9:8,u=a?"":" ",A=this.symbols.line.repeat(n),p=" ".repeat(n+(a?0:1)),h=te=>(te?this.styles.success("\u25C9"):"\u25EF")+u,E=r+1+".",w=o?this.styles.heading:this.styles.noop,D=await this.resolve(e.message,this.state,e,r),b=this.indent(e),C=b+e.scale.map((te,le)=>h(le===e.scaleIdx)).join(A),T=te=>te===e.scaleIdx?w(te):te,N=b+e.scale.map((te,le)=>T(le)).join(p),U=()=>[E,D].filter(Boolean).join(" "),J=()=>[U(),C,N," "].filter(Boolean).join(` -`);return o&&(C=this.styles.cyan(C),N=this.styles.cyan(N)),J()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(o,a)=>await this.renderChoice(o,a)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` -`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=[o,n,a].filter(Boolean).join(" ");this.state.prompt=u;let A=await this.header(),p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),w=await this.footer();(p||!h)&&(u+=" "+p),h&&!u.includes(h)&&(u+=" "+h),e&&!p&&!E&&this.multiple&&this.type!=="form"&&(u+=this.styles.danger(this.emptyError)),this.clear(r),this.write([u,A,E,w].filter(Boolean).join(` -`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function qft(t,e={}){if(Array.isArray(e.scale))return e.scale.map(o=>({...o}));let r=[];for(let o=1;o{fge.exports=j8()});var gge=_((f8t,hge)=>{"use strict";var jft=Hk(),rH=class extends jft{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",r){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=o=>this.styles.primary.underline(o);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,r=await this.header(),o=await this.prefix(),a=await this.separator(),n=await this.message(),u=await this.format(),A=await this.error()||await this.hint(),p=await this.footer(),h=[o,n,a,u].join(" ");this.state.prompt=h,A&&!h.includes(A)&&(h+=" "+A),this.clear(e),this.write([r,h,p].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};hge.exports=rH});var mge=_((p8t,dge)=>{"use strict";var Gft=Qh(),nH=class extends Gft{constructor(e){if(super(e),typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let o=await super.toChoices(e,r);if(o.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>o.length)throw new Error("Please specify the index of the correct answer from the list of choices");return o}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};dge.exports=nH});var Ege=_(iH=>{"use strict";var yge=xo(),fs=(t,e)=>{yge.defineExport(iH,t,e),yge.defineExport(iH,t.toLowerCase(),e)};fs("AutoComplete",()=>D0e());fs("BasicAuth",()=>F0e());fs("Confirm",()=>L0e());fs("Editable",()=>O0e());fs("Form",()=>_k());fs("Input",()=>j8());fs("Invisible",()=>G0e());fs("List",()=>Y0e());fs("MultiSelect",()=>K0e());fs("Numeral",()=>X0e());fs("Password",()=>$0e());fs("Scale",()=>rge());fs("Select",()=>Qh());fs("Snippet",()=>age());fs("Sort",()=>cge());fs("Survey",()=>Age());fs("Text",()=>pge());fs("Toggle",()=>gge());fs("Quiz",()=>mge())});var Ige=_((g8t,Cge)=>{Cge.exports={ArrayPrompt:b2(),AuthPrompt:O8(),BooleanPrompt:Hk(),NumberPrompt:K8(),StringPrompt:Kg()}});var Q2=_((d8t,Bge)=>{"use strict";var wge=ve("assert"),oH=ve("events"),Fh=xo(),ru=class extends oH{constructor(e,r){super(),this.options=Fh.merge({},e),this.answers={...r}}register(e,r){if(Fh.isObject(e)){for(let a of Object.keys(e))this.register(a,e[a]);return this}wge.equal(typeof r,"function","expected a function");let o=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[o]=r:this.prompts[o]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(Fh.merge({},this.options,r))}catch(o){return Promise.reject(o)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=Fh.merge({},this.options,e),{type:o,name:a}=e,{set:n,get:u}=Fh;if(typeof o=="function"&&(o=await o.call(this,e,this.answers)),!o)return this.answers[a];wge(this.prompts[o],`Prompt "${o}" is not registered`);let A=new this.prompts[o](r),p=u(this.answers,a);A.state.answers=this.answers,A.enquirer=this,a&&A.on("submit",E=>{this.emit("answer",a,E,A),n(this.answers,a,E)});let h=A.emit.bind(A);return A.emit=(...E)=>(this.emit.call(this,...E),h(...E)),this.emit("prompt",A,this),r.autofill&&p!=null?(A.value=A.input=p,r.autofill==="show"&&await A.submit()):p=A.value=await A.run(),p}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||uE()}static get prompts(){return Ege()}static get types(){return Ige()}static get prompt(){let e=(r,...o)=>{let a=new this(...o),n=a.emit.bind(a);return a.emit=(...u)=>(e.emit(...u),n(...u)),a.prompt(r)};return Fh.mixinEmitter(e,new oH),e}};Fh.mixinEmitter(ru,new oH);var sH=ru.prompts;for(let t of Object.keys(sH)){let e=t.toLowerCase(),r=o=>new sH[t](o).run();ru.prompt[e]=r,ru[e]=r,ru[t]||Reflect.defineProperty(ru,t,{get:()=>sH[t]})}var k2=t=>{Fh.defineExport(ru,t,()=>ru.types[t])};k2("ArrayPrompt");k2("AuthPrompt");k2("BooleanPrompt");k2("NumberPrompt");k2("StringPrompt");Bge.exports=ru});var L2=_((Z8t,kge)=>{var zft=bk();function Xft(t,e,r){var o=t==null?void 0:zft(t,e);return o===void 0?r:o}kge.exports=Xft});var Rge=_((iHt,Fge)=>{function Zft(t,e){for(var r=-1,o=t==null?0:t.length;++r{var $ft=Eg(),ept=PP();function tpt(t,e){return t&&$ft(e,ept(e),t)}Tge.exports=tpt});var Oge=_((oHt,Nge)=>{var rpt=Eg(),npt=Km();function ipt(t,e){return t&&rpt(e,npt(e),t)}Nge.exports=ipt});var Uge=_((aHt,Mge)=>{var spt=Eg(),opt=IP();function apt(t,e){return spt(t,opt(t),e)}Mge.exports=apt});var fH=_((lHt,_ge)=>{var lpt=CP(),cpt=FP(),upt=IP(),Apt=bN(),fpt=Object.getOwnPropertySymbols,ppt=fpt?function(t){for(var e=[];t;)lpt(e,upt(t)),t=cpt(t);return e}:Apt;_ge.exports=ppt});var qge=_((cHt,Hge)=>{var hpt=Eg(),gpt=fH();function dpt(t,e){return hpt(t,gpt(t),e)}Hge.exports=dpt});var pH=_((uHt,jge)=>{var mpt=xN(),ypt=fH(),Ept=Km();function Cpt(t){return mpt(t,Ept,ypt)}jge.exports=Cpt});var Wge=_((AHt,Gge)=>{var Ipt=Object.prototype,wpt=Ipt.hasOwnProperty;function Bpt(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&wpt.call(t,"index")&&(r.index=t.index,r.input=t.input),r}Gge.exports=Bpt});var Vge=_((fHt,Yge)=>{var vpt=kP();function Dpt(t,e){var r=e?vpt(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}Yge.exports=Dpt});var Jge=_((pHt,Kge)=>{var Spt=/\w*$/;function Ppt(t){var e=new t.constructor(t.source,Spt.exec(t));return e.lastIndex=t.lastIndex,e}Kge.exports=Ppt});var ede=_((hHt,$ge)=>{var zge=dg(),Xge=zge?zge.prototype:void 0,Zge=Xge?Xge.valueOf:void 0;function xpt(t){return Zge?Object(Zge.call(t)):{}}$ge.exports=xpt});var rde=_((gHt,tde)=>{var bpt=kP(),kpt=Vge(),Qpt=Jge(),Fpt=ede(),Rpt=jN(),Tpt="[object Boolean]",Lpt="[object Date]",Npt="[object Map]",Opt="[object Number]",Mpt="[object RegExp]",Upt="[object Set]",_pt="[object String]",Hpt="[object Symbol]",qpt="[object ArrayBuffer]",jpt="[object DataView]",Gpt="[object Float32Array]",Wpt="[object Float64Array]",Ypt="[object Int8Array]",Vpt="[object Int16Array]",Kpt="[object Int32Array]",Jpt="[object Uint8Array]",zpt="[object Uint8ClampedArray]",Xpt="[object Uint16Array]",Zpt="[object Uint32Array]";function $pt(t,e,r){var o=t.constructor;switch(e){case qpt:return bpt(t);case Tpt:case Lpt:return new o(+t);case jpt:return kpt(t,r);case Gpt:case Wpt:case Ypt:case Vpt:case Kpt:case Jpt:case zpt:case Xpt:case Zpt:return Rpt(t,r);case Npt:return new o;case Opt:case _pt:return new o(t);case Mpt:return Qpt(t);case Upt:return new o;case Hpt:return Fpt(t)}}tde.exports=$pt});var ide=_((dHt,nde)=>{var eht=a1(),tht=Zu(),rht="[object Map]";function nht(t){return tht(t)&&eht(t)==rht}nde.exports=nht});var lde=_((mHt,ade)=>{var iht=ide(),sht=BP(),sde=vP(),ode=sde&&sde.isMap,oht=ode?sht(ode):iht;ade.exports=oht});var ude=_((yHt,cde)=>{var aht=a1(),lht=Zu(),cht="[object Set]";function uht(t){return lht(t)&&aht(t)==cht}cde.exports=uht});var hde=_((EHt,pde)=>{var Aht=ude(),fht=BP(),Ade=vP(),fde=Ade&&Ade.isSet,pht=fde?fht(fde):Aht;pde.exports=pht});var hH=_((CHt,yde)=>{var hht=yP(),ght=Rge(),dht=RP(),mht=Lge(),yht=Oge(),Eht=qN(),Cht=QP(),Iht=Uge(),wht=qge(),Bht=RN(),vht=pH(),Dht=a1(),Sht=Wge(),Pht=rde(),xht=GN(),bht=jl(),kht=r1(),Qht=lde(),Fht=cl(),Rht=hde(),Tht=PP(),Lht=Km(),Nht=1,Oht=2,Mht=4,gde="[object Arguments]",Uht="[object Array]",_ht="[object Boolean]",Hht="[object Date]",qht="[object Error]",dde="[object Function]",jht="[object GeneratorFunction]",Ght="[object Map]",Wht="[object Number]",mde="[object Object]",Yht="[object RegExp]",Vht="[object Set]",Kht="[object String]",Jht="[object Symbol]",zht="[object WeakMap]",Xht="[object ArrayBuffer]",Zht="[object DataView]",$ht="[object Float32Array]",e0t="[object Float64Array]",t0t="[object Int8Array]",r0t="[object Int16Array]",n0t="[object Int32Array]",i0t="[object Uint8Array]",s0t="[object Uint8ClampedArray]",o0t="[object Uint16Array]",a0t="[object Uint32Array]",Ai={};Ai[gde]=Ai[Uht]=Ai[Xht]=Ai[Zht]=Ai[_ht]=Ai[Hht]=Ai[$ht]=Ai[e0t]=Ai[t0t]=Ai[r0t]=Ai[n0t]=Ai[Ght]=Ai[Wht]=Ai[mde]=Ai[Yht]=Ai[Vht]=Ai[Kht]=Ai[Jht]=Ai[i0t]=Ai[s0t]=Ai[o0t]=Ai[a0t]=!0;Ai[qht]=Ai[dde]=Ai[zht]=!1;function Gk(t,e,r,o,a,n){var u,A=e&Nht,p=e&Oht,h=e&Mht;if(r&&(u=a?r(t,o,a,n):r(t)),u!==void 0)return u;if(!Fht(t))return t;var E=bht(t);if(E){if(u=Sht(t),!A)return Cht(t,u)}else{var w=Dht(t),D=w==dde||w==jht;if(kht(t))return Eht(t,A);if(w==mde||w==gde||D&&!a){if(u=p||D?{}:xht(t),!A)return p?wht(t,yht(u,t)):Iht(t,mht(u,t))}else{if(!Ai[w])return a?t:{};u=Pht(t,w,A)}}n||(n=new hht);var b=n.get(t);if(b)return b;n.set(t,u),Rht(t)?t.forEach(function(N){u.add(Gk(N,e,r,N,t,n))}):Qht(t)&&t.forEach(function(N,U){u.set(U,Gk(N,e,r,U,t,n))});var C=h?p?vht:Bht:p?Lht:Tht,T=E?void 0:C(t);return ght(T||t,function(N,U){T&&(U=N,N=t[U]),dht(u,U,Gk(N,e,r,U,t,n))}),u}yde.exports=Gk});var gH=_((IHt,Ede)=>{var l0t=hH(),c0t=1,u0t=4;function A0t(t){return l0t(t,c0t|u0t)}Ede.exports=A0t});var dH=_((wHt,Cde)=>{var f0t=o8();function p0t(t,e,r){return t==null?t:f0t(t,e,r)}Cde.exports=p0t});var Dde=_((xHt,vde)=>{var h0t=Object.prototype,g0t=h0t.hasOwnProperty;function d0t(t,e){return t!=null&&g0t.call(t,e)}vde.exports=d0t});var Pde=_((bHt,Sde)=>{var m0t=Dde(),y0t=a8();function E0t(t,e){return t!=null&&y0t(t,e,m0t)}Sde.exports=E0t});var bde=_((kHt,xde)=>{function C0t(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}xde.exports=C0t});var Qde=_((QHt,kde)=>{var I0t=bk(),w0t=XU();function B0t(t,e){return e.length<2?t:I0t(t,w0t(e,0,-1))}kde.exports=B0t});var yH=_((FHt,Fde)=>{var v0t=Wg(),D0t=bde(),S0t=Qde(),P0t=nE();function x0t(t,e){return e=v0t(e,t),t=S0t(t,e),t==null||delete t[P0t(D0t(e))]}Fde.exports=x0t});var EH=_((RHt,Rde)=>{var b0t=yH();function k0t(t,e){return t==null?!0:b0t(t,e)}Rde.exports=k0t});var Mde=_((l6t,R0t)=>{R0t.exports={name:"@yarnpkg/cli",version:"4.7.0",license:"BSD-2-Clause",main:"./sources/index.ts",exports:{".":"./sources/index.ts","./polyfills":"./sources/polyfills.ts","./package.json":"./package.json"},dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-constraints":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-exec":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-interactive-tools":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/plugin-stage":"workspace:^","@yarnpkg/plugin-typescript":"workspace:^","@yarnpkg/plugin-version":"workspace:^","@yarnpkg/plugin-workspace-tools":"workspace:^","@yarnpkg/shell":"workspace:^","ci-info":"^4.0.0",clipanion:"^4.0.0-rc.2",semver:"^7.1.2",tslib:"^2.4.0",typanion:"^3.14.0"},devDependencies:{"@types/semver":"^7.1.0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",bin:null,exports:{".":"./lib/index.js","./package.json":"./package.json"}},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]}},repository:{type:"git",url:"git+https://github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=18.12.0"}}});var xH=_((UGt,zde)=>{"use strict";zde.exports=function(e,r){r===!0&&(r=0);var o="";if(typeof e=="string")try{o=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(o=e.protocol);var a=o.split(/\:|\+/).filter(Boolean);return typeof r=="number"?a[r]:a}});var Zde=_((_Gt,Xde)=>{"use strict";var $0t=xH();function egt(t){var e={protocols:[],protocol:null,port:null,resource:"",host:"",user:"",password:"",pathname:"",hash:"",search:"",href:t,query:{},parse_failed:!1};try{var r=new URL(t);e.protocols=$0t(r),e.protocol=e.protocols[0],e.port=r.port,e.resource=r.hostname,e.host=r.host,e.user=r.username||"",e.password=r.password||"",e.pathname=r.pathname,e.hash=r.hash.slice(1),e.search=r.search.slice(1),e.href=r.href,e.query=Object.fromEntries(r.searchParams)}catch{e.protocols=["file"],e.protocol=e.protocols[0],e.port="",e.resource="",e.user="",e.pathname="",e.hash="",e.search="",e.href=t,e.query={},e.parse_failed=!0}return e}Xde.exports=egt});var tme=_((HGt,eme)=>{"use strict";var tgt=Zde();function rgt(t){return t&&typeof t=="object"&&"default"in t?t:{default:t}}var ngt=rgt(tgt),igt="text/plain",sgt="us-ascii",$de=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),ogt=(t,{stripHash:e})=>{let r=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(t);if(!r)throw new Error(`Invalid URL: ${t}`);let{type:o,data:a,hash:n}=r.groups,u=o.split(";");n=e?"":n;let A=!1;u[u.length-1]==="base64"&&(u.pop(),A=!0);let p=(u.shift()||"").toLowerCase(),E=[...u.map(w=>{let[D,b=""]=w.split("=").map(C=>C.trim());return D==="charset"&&(b=b.toLowerCase(),b===sgt)?"":`${D}${b?`=${b}`:""}`}).filter(Boolean)];return A&&E.push("base64"),(E.length>0||p&&p!==igt)&&E.unshift(p),`data:${E.join(";")},${A?a.trim():a}${n?`#${n}`:""}`};function agt(t,e){if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},t=t.trim(),/^data:/i.test(t))return ogt(t,e);if(/^view-source:/i.test(t))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new URL(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash?a.hash="":e.stripTextFragment&&(a.hash=a.hash.replace(/#?:~:text.*?$/i,"")),a.pathname){let u=/\b[a-z][a-z\d+\-.]{1,50}:\/\//g,A=0,p="";for(;;){let E=u.exec(a.pathname);if(!E)break;let w=E[0],D=E.index,b=a.pathname.slice(A,D);p+=b.replace(/\/{2,}/g,"/"),p+=w,A=D+w.length}let h=a.pathname.slice(A,a.pathname.length);p+=h.replace(/\/{2,}/g,"/"),a.pathname=p}if(a.pathname)try{a.pathname=decodeURI(a.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let u=a.pathname.split("/"),A=u[u.length-1];$de(A,e.removeDirectoryIndex)&&(u=u.slice(0,-1),a.pathname=u.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let u of[...a.searchParams.keys()])$de(u,e.removeQueryParameters)&&a.searchParams.delete(u);if(e.removeQueryParameters===!0&&(a.search=""),e.sortQueryParameters){a.searchParams.sort();try{a.search=decodeURIComponent(a.search)}catch{}}e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,""));let n=t;return t=a.toString(),!e.removeSingleSlash&&a.pathname==="/"&&!n.endsWith("/")&&a.hash===""&&(t=t.replace(/\/$/,"")),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&e.removeSingleSlash&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t}var bH=(t,e=!1)=>{let r=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:]([\~,\.\w,\-,\_,\/]+?(?:\.git|\/)?)$/,o=n=>{let u=new Error(n);throw u.subject_url=t,u};(typeof t!="string"||!t.trim())&&o("Invalid url."),t.length>bH.MAX_INPUT_LENGTH&&o("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH."),e&&(typeof e!="object"&&(e={stripHash:!1}),t=agt(t,e));let a=ngt.default(t);if(a.parse_failed){let n=a.href.match(r);n?(a.protocols=["ssh"],a.protocol="ssh",a.resource=n[2],a.host=n[2],a.user=n[1],a.pathname=`/${n[3]}`,a.parse_failed=!1):o("URL parsing failed.")}return a};bH.MAX_INPUT_LENGTH=2048;eme.exports=bH});var ime=_((qGt,nme)=>{"use strict";var lgt=xH();function rme(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=lgt(t);if(t=t.substring(t.indexOf("://")+3),rme(e))return!0;var r=new RegExp(".([a-zA-Z\\d]+):(\\d+)/");return!t.match(r)&&t.indexOf("@"){"use strict";var cgt=tme(),sme=ime();function ugt(t){var e=cgt(t);return e.token="",e.password==="x-oauth-basic"?e.token=e.user:e.user==="x-token-auth"&&(e.token=e.password),sme(e.protocols)||e.protocols.length===0&&sme(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol="file",e.protocols=["file"]),e.href=e.href.replace(/\/$/,""),e}ome.exports=ugt});var cme=_((GGt,lme)=>{"use strict";var Agt=ame();function kH(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=/^([a-z\d-]{1,39})\/([-\.\w]{1,100})$/i;e.test(t)&&(t="https://github.com/"+t);var r=Agt(t),o=r.resource.split("."),a=null;switch(r.toString=function(N){return kH.stringify(this,N)},r.source=o.length>2?o.slice(1-o.length).join("."):r.source=r.resource,r.git_suffix=/\.git$/.test(r.pathname),r.name=decodeURIComponent((r.pathname||r.href).replace(/(^\/)|(\/$)/g,"").replace(/\.git$/,"")),r.owner=decodeURIComponent(r.user),r.source){case"git.cloudforge.com":r.owner=r.user,r.organization=o[0],r.source="cloudforge.com";break;case"visualstudio.com":if(r.resource==="vs-ssh.visualstudio.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3],r.full_name=a[2]+"/"+a[3]);break}else{a=r.name.split("/"),a.length===2?(r.owner=a[1],r.name=a[1],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name);break}case"dev.azure.com":case"azure.com":if(r.resource==="ssh.dev.azure.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3]);break}else{a=r.name.split("/"),a.length===5?(r.organization=a[0],r.owner=a[1],r.name=a[4],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name),r.query&&r.query.path&&(r.filepath=r.query.path.replace(/^\/+/g,"")),r.query&&r.query.version&&(r.ref=r.query.version.replace(/^GB/,""));break}default:a=r.name.split("/");var n=a.length-1;if(a.length>=2){var u=a.indexOf("-",2),A=a.indexOf("blob",2),p=a.indexOf("tree",2),h=a.indexOf("commit",2),E=a.indexOf("src",2),w=a.indexOf("raw",2),D=a.indexOf("edit",2);n=u>0?u-1:A>0?A-1:p>0?p-1:h>0?h-1:E>0?E-1:w>0?w-1:D>0?D-1:n,r.owner=a.slice(0,n).join("/"),r.name=a[n],h&&(r.commit=a[n+2])}r.ref="",r.filepathtype="",r.filepath="";var b=a.length>n&&a[n+1]==="-"?n+1:n;a.length>b+2&&["raw","src","blob","tree","edit"].indexOf(a[b+1])>=0&&(r.filepathtype=a[b+1],r.ref=a[b+2],a.length>b+3&&(r.filepath=a.slice(b+3).join("/"))),r.organization=r.owner;break}r.full_name||(r.full_name=r.owner,r.name&&(r.full_name&&(r.full_name+="/"),r.full_name+=r.name)),r.owner.startsWith("scm/")&&(r.source="bitbucket-server",r.owner=r.owner.replace("scm/",""),r.organization=r.owner,r.full_name=r.owner+"/"+r.name);var C=/(projects|users)\/(.*?)\/repos\/(.*?)((\/.*$)|$)/,T=C.exec(r.pathname);return T!=null&&(r.source="bitbucket-server",T[1]==="users"?r.owner="~"+T[2]:r.owner=T[2],r.organization=r.owner,r.name=T[3],a=T[4].split("/"),a.length>1&&(["raw","browse"].indexOf(a[1])>=0?(r.filepathtype=a[1],a.length>2&&(r.filepath=a.slice(2).join("/"))):a[1]==="commits"&&a.length>2&&(r.commit=a[2])),r.full_name=r.owner+"/"+r.name,r.query.at?r.ref=r.query.at:r.ref=""),r}kH.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",o=t.user||"git",a=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+o+"@"+t.resource+r+"/"+t.full_name+a:o+"@"+t.resource+":"+t.full_name+a;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+o+"@"+t.resource+r+"/"+t.full_name+a;case"http":case"https":var n=t.token?fgt(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+n+t.resource+r+"/"+pgt(t)+a;default:return t.href}};function fgt(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}function pgt(t){switch(t.source){case"bitbucket-server":return"scm/"+t.full_name;default:return""+t.full_name}}lme.exports=kH});var Dme=_((B9t,vme)=>{var vgt=Cb(),Dgt=QP(),Sgt=jl(),Pgt=fy(),xgt=s8(),bgt=nE(),kgt=t2();function Qgt(t){return Sgt(t)?vgt(t,bgt):Pgt(t)?[t]:Dgt(xgt(kgt(t)))}vme.exports=Qgt});function Lgt(t,e){return e===1&&Tgt.has(t[0])}function q2(t){let e=Array.isArray(t)?t:(0,xme.default)(t);return e.map((o,a)=>Fgt.test(o)?`[${o}]`:Rgt.test(o)&&!Lgt(e,a)?`.${o}`:`[${JSON.stringify(o)}]`).join("").replace(/^\./,"")}function Ngt(t,e){let r=[];if(e.methodName!==null&&r.push(pe.pretty(t,e.methodName,pe.Type.CODE)),e.file!==null){let o=[];o.push(pe.pretty(t,e.file,pe.Type.PATH)),e.line!==null&&(o.push(pe.pretty(t,e.line,pe.Type.NUMBER)),e.column!==null&&o.push(pe.pretty(t,e.column,pe.Type.NUMBER))),r.push(`(${o.join(pe.pretty(t,":","grey"))})`)}return r.join(" ")}function Kk(t,{manifestUpdates:e,reportedErrors:r},{fix:o}={}){let a=new Map,n=new Map,u=[...r.keys()].map(A=>[A,new Map]);for(let[A,p]of[...u,...e]){let h=r.get(A)?.map(b=>({text:b,fixable:!1}))??[],E=!1,w=t.getWorkspaceByCwd(A),D=w.manifest.exportTo({});for(let[b,C]of p){if(C.size>1){let T=[...C].map(([N,U])=>{let J=pe.pretty(t.configuration,N,pe.Type.INSPECT),te=U.size>0?Ngt(t.configuration,U.values().next().value):null;return te!==null?` -${J} at ${te}`:` -${J}`}).join("");h.push({text:`Conflict detected in constraint targeting ${pe.pretty(t.configuration,b,pe.Type.CODE)}; conflicting values are:${T}`,fixable:!1})}else{let[[T]]=C,N=(0,Sme.default)(D,b);if(JSON.stringify(N)===JSON.stringify(T))continue;if(!o){let U=typeof N>"u"?`Missing field ${pe.pretty(t.configuration,b,pe.Type.CODE)}; expected ${pe.pretty(t.configuration,T,pe.Type.INSPECT)}`:typeof T>"u"?`Extraneous field ${pe.pretty(t.configuration,b,pe.Type.CODE)} currently set to ${pe.pretty(t.configuration,N,pe.Type.INSPECT)}`:`Invalid field ${pe.pretty(t.configuration,b,pe.Type.CODE)}; expected ${pe.pretty(t.configuration,T,pe.Type.INSPECT)}, found ${pe.pretty(t.configuration,N,pe.Type.INSPECT)}`;h.push({text:U,fixable:!0});continue}typeof T>"u"?(0,bme.default)(D,b):(0,Pme.default)(D,b,T),E=!0}E&&a.set(w,D)}h.length>0&&n.set(w,h)}return{changedWorkspaces:a,remainingErrors:n}}function kme(t,{configuration:e}){let r={children:[]};for(let[o,a]of t){let n=[];for(let A of a){let p=A.text.split(/\n/);A.fixable&&(p[0]=`${pe.pretty(e,"\u2699","gray")} ${p[0]}`),n.push({value:pe.tuple(pe.Type.NO_HINT,p[0]),children:p.slice(1).map(h=>({value:pe.tuple(pe.Type.NO_HINT,h)}))})}let u={value:pe.tuple(pe.Type.LOCATOR,o.anchoredLocator),children:qe.sortMap(n,A=>A.value[1])};r.children.push(u)}return r.children=qe.sortMap(r.children,o=>o.value[1]),r}var Sme,Pme,xme,bme,ZE,Fgt,Rgt,Tgt,j2=It(()=>{Ve();Sme=et(L2()),Pme=et(dH()),xme=et(Dme()),bme=et(EH()),ZE=class{constructor(e){this.indexedFields=e;this.items=[];this.indexes={};this.clear()}clear(){this.items=[];for(let e of this.indexedFields)this.indexes[e]=new Map}insert(e){this.items.push(e);for(let r of this.indexedFields){let o=Object.hasOwn(e,r)?e[r]:void 0;if(typeof o>"u")continue;qe.getArrayWithDefault(this.indexes[r],o).push(e)}return e}find(e){if(typeof e>"u")return this.items;let r=Object.entries(e);if(r.length===0)return this.items;let o=[],a;for(let[u,A]of r){let p=u,h=Object.hasOwn(this.indexes,p)?this.indexes[p]:void 0;if(typeof h>"u"){o.push([p,A]);continue}let E=new Set(h.get(A)??[]);if(E.size===0)return[];if(typeof a>"u")a=E;else for(let w of a)E.has(w)||a.delete(w);if(a.size===0)break}let n=[...a??[]];return o.length>0&&(n=n.filter(u=>{for(let[A,p]of o)if(!(typeof p<"u"?Object.hasOwn(u,A)&&u[A]===p:Object.hasOwn(u,A)===!1))return!1;return!0})),n}},Fgt=/^[0-9]+$/,Rgt=/^[a-zA-Z0-9_]+$/,Tgt=new Set(["scripts",..._t.allDependencies])});var Qme=_((L9t,GH)=>{var Ogt;(function(t){var e=function(){return{"append/2":[new t.type.Rule(new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("L")]),new t.type.Term("foldl",[new t.type.Term("append",[]),new t.type.Var("X"),new t.type.Term("[]",[]),new t.type.Var("L")]))],"append/3":[new t.type.Rule(new t.type.Term("append",[new t.type.Term("[]",[]),new t.type.Var("X"),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("append",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("append",[new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("S")]))],"member/2":[new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("_")])]),null),new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")])]),new t.type.Term("member",[new t.type.Var("X"),new t.type.Var("Xs")]))],"permutation/2":[new t.type.Rule(new t.type.Term("permutation",[new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("permutation",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("permutation",[new t.type.Var("T"),new t.type.Var("P")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("P")]),new t.type.Term("append",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("Y")]),new t.type.Var("S")])])]))],"maplist/2":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("X")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("Xs")])]))],"maplist/3":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs")])]))],"maplist/4":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs")])]))],"maplist/5":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds")])]))],"maplist/6":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es")])]))],"maplist/7":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs")])]))],"maplist/8":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")]),new t.type.Term(".",[new t.type.Var("G"),new t.type.Var("Gs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F"),new t.type.Var("G")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs"),new t.type.Var("Gs")])]))],"include/3":[new t.type.Rule(new t.type.Term("include",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("include",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("A")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("A"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("F"),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("F")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("L"),new t.type.Var("S")])]),new t.type.Term("include",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("S")])])])])]))],"exclude/3":[new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("E")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("Q")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("R"),new t.type.Var("Q")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("!",[]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("E")])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("E")])])])])])])]))],"foldl/4":[new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Var("I"),new t.type.Var("I")]),null),new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("I"),new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("I"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])])])]),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P2"),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P2")]),new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("R")])])])])]))],"select/3":[new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Xs")]),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term("select",[new t.type.Var("E"),new t.type.Var("Xs"),new t.type.Var("Ys")]))],"sum_list/2":[new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term("[]",[]),new t.type.Num(0,!1)]),null),new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("sum_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("+",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"max_list/2":[new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("max_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"min_list/2":[new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("min_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("=<",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"prod_list/2":[new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term("[]",[]),new t.type.Num(1,!1)]),null),new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("prod_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("*",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"last/2":[new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")]),new t.type.Var("X")]),new t.type.Term("last",[new t.type.Var("Xs"),new t.type.Var("X")]))],"prefix/2":[new t.type.Rule(new t.type.Term("prefix",[new t.type.Var("Part"),new t.type.Var("Whole")]),new t.type.Term("append",[new t.type.Var("Part"),new t.type.Var("_"),new t.type.Var("Whole")]))],"nth0/3":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth1/3":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth0/4":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth1/4":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth/5":[new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("N"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("X"),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("O"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("Y"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term(",",[new t.type.Term("is",[new t.type.Var("M"),new t.type.Term("+",[new t.type.Var("N"),new t.type.Num(1,!1)])]),new t.type.Term("nth",[new t.type.Var("M"),new t.type.Var("O"),new t.type.Var("Xs"),new t.type.Var("Y"),new t.type.Var("Ys")])]))],"length/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(!t.type.is_variable(A)&&!t.type.is_integer(A))o.throw_error(t.error.type("integer",A,n.indicator));else if(t.type.is_integer(A)&&A.value<0)o.throw_error(t.error.domain("not_less_than_zero",A,n.indicator));else{var p=new t.type.Term("length",[u,new t.type.Num(0,!1),A]);t.type.is_integer(A)&&(p=new t.type.Term(",",[p,new t.type.Term("!",[])])),o.prepend([new t.type.State(a.goal.replace(p),a.substitution,a)])}},"length/3":[new t.type.Rule(new t.type.Term("length",[new t.type.Term("[]",[]),new t.type.Var("N"),new t.type.Var("N")]),null),new t.type.Rule(new t.type.Term("length",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("X")]),new t.type.Var("A"),new t.type.Var("N")]),new t.type.Term(",",[new t.type.Term("succ",[new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("length",[new t.type.Var("X"),new t.type.Var("B"),new t.type.Var("N")])]))],"replicate/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_integer(A))o.throw_error(t.error.type("integer",A,n.indicator));else if(A.value<0)o.throw_error(t.error.domain("not_less_than_zero",A,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=new t.type.Term("[]"),E=0;E0;w--)E[w].equals(E[w-1])&&E.splice(w,1);for(var D=new t.type.Term("[]"),w=E.length-1;w>=0;w--)D=new t.type.Term(".",[E[w],D]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[D,A])),a.substitution,a)])}}},"msort/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else{for(var p=[],h=u;h.indicator==="./2";)p.push(h.args[0]),h=h.args[1];if(t.type.is_variable(h))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(h))o.throw_error(t.error.type("list",u,n.indicator));else{for(var E=p.sort(t.compare),w=new t.type.Term("[]"),D=E.length-1;D>=0;D--)w=new t.type.Term(".",[E[D],w]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[w,A])),a.substitution,a)])}}},"keysort/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else{for(var p=[],h,E=u;E.indicator==="./2";){if(h=E.args[0],t.type.is_variable(h)){o.throw_error(t.error.instantiation(n.indicator));return}else if(!t.type.is_term(h)||h.indicator!=="-/2"){o.throw_error(t.error.type("pair",h,n.indicator));return}h.args[0].pair=h.args[1],p.push(h.args[0]),E=E.args[1]}if(t.type.is_variable(E))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(E))o.throw_error(t.error.type("list",u,n.indicator));else{for(var w=p.sort(t.compare),D=new t.type.Term("[]"),b=w.length-1;b>=0;b--)D=new t.type.Term(".",[new t.type.Term("-",[w[b],w[b].pair]),D]),delete w[b].pair;o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[D,A])),a.substitution,a)])}}},"take/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type("integer",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=u.value,E=[],w=A;h>0&&w.indicator==="./2";)E.push(w.args[0]),w=w.args[1],h--;if(h===0){for(var D=new t.type.Term("[]"),h=E.length-1;h>=0;h--)D=new t.type.Term(".",[E[h],D]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[D,p])),a.substitution,a)])}}},"drop/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type("integer",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=u.value,E=[],w=A;h>0&&w.indicator==="./2";)E.push(w.args[0]),w=w.args[1],h--;h===0&&o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[w,p])),a.substitution,a)])}},"reverse/2":function(o,a,n){var u=n.args[0],A=n.args[1],p=t.type.is_instantiated_list(u),h=t.type.is_instantiated_list(A);if(t.type.is_variable(u)&&t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(u)&&!t.type.is_fully_list(u))o.throw_error(t.error.type("list",u,n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!p&&!h)o.throw_error(t.error.instantiation(n.indicator));else{for(var E=p?u:A,w=new t.type.Term("[]",[]);E.indicator==="./2";)w=new t.type.Term(".",[E.args[0],w]),E=E.args[1];o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[w,p?A:u])),a.substitution,a)])}},"list_to_set/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else{for(var p=u,h=[];p.indicator==="./2";)h.push(p.args[0]),p=p.args[1];if(t.type.is_variable(p))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_term(p)||p.indicator!=="[]/0")o.throw_error(t.error.type("list",u,n.indicator));else{for(var E=[],w=new t.type.Term("[]",[]),D,b=0;b=0;b--)w=new t.type.Term(".",[E[b],w]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[A,w])),a.substitution,a)])}}}}},r=["append/2","append/3","member/2","permutation/2","maplist/2","maplist/3","maplist/4","maplist/5","maplist/6","maplist/7","maplist/8","include/3","exclude/3","foldl/4","sum_list/2","max_list/2","min_list/2","prod_list/2","last/2","prefix/2","nth0/3","nth1/3","nth0/4","nth1/4","length/2","replicate/3","select/3","sort/2","msort/2","keysort/2","take/3","drop/3","reverse/2","list_to_set/2"];typeof GH<"u"?GH.exports=function(o){t=o,new t.type.Module("lists",e(),r)}:new t.type.Module("lists",e(),r)})(Ogt)});var Yme=_(Kr=>{"use strict";var Xg=process.platform==="win32",WH="aes-256-cbc",Mgt="sha256",Tme="The current environment doesn't support interactive reading from TTY.",Xn=ve("fs"),Fme=process.binding("tty_wrap").TTY,VH=ve("child_process"),Lh=ve("path"),KH={prompt:"> ",hideEchoBack:!1,mask:"*",limit:[],limitMessage:"Input another, please.$<( [)limit(])>",defaultInput:"",trueValue:[],falseValue:[],caseSensitive:!1,keepWhitespace:!1,encoding:"utf8",bufferSize:1024,print:void 0,history:!0,cd:!1,phContent:void 0,preCheck:void 0},Vf="none",iu,eC,Rme=!1,Th,zk,YH,Ugt=0,$H="",zg=[],Xk,Lme=!1,JH=!1,G2=!1;function Nme(t){function e(r){return r.replace(/[^\w\u0080-\uFFFF]/g,function(o){return"#"+o.charCodeAt(0)+";"})}return zk.concat(function(r){var o=[];return Object.keys(r).forEach(function(a){r[a]==="boolean"?t[a]&&o.push("--"+a):r[a]==="string"&&t[a]&&o.push("--"+a,e(t[a]))}),o}({display:"string",displayOnly:"boolean",keyIn:"boolean",hideEchoBack:"boolean",mask:"string",limit:"string",caseSensitive:"boolean"}))}function _gt(t,e){function r(U){var J,te="",le;for(YH=YH||ve("os").tmpdir();;){J=Lh.join(YH,U+te);try{le=Xn.openSync(J,"wx")}catch(ce){if(ce.code==="EEXIST"){te++;continue}else throw ce}Xn.closeSync(le);break}return J}var o,a,n,u={},A,p,h=r("readline-sync.stdout"),E=r("readline-sync.stderr"),w=r("readline-sync.exit"),D=r("readline-sync.done"),b=ve("crypto"),C,T,N;C=b.createHash(Mgt),C.update(""+process.pid+Ugt+++Math.random()),N=C.digest("hex"),T=b.createDecipher(WH,N),o=Nme(t),Xg?(a=process.env.ComSpec||"cmd.exe",process.env.Q='"',n=["/V:ON","/S","/C","(%Q%"+a+"%Q% /V:ON /S /C %Q%%Q%"+Th+"%Q%"+o.map(function(U){return" %Q%"+U+"%Q%"}).join("")+" & (echo !ERRORLEVEL!)>%Q%"+w+"%Q%%Q%) 2>%Q%"+E+"%Q% |%Q%"+process.execPath+"%Q% %Q%"+__dirname+"\\encrypt.js%Q% %Q%"+WH+"%Q% %Q%"+N+"%Q% >%Q%"+h+"%Q% & (echo 1)>%Q%"+D+"%Q%"]):(a="/bin/sh",n=["-c",'("'+Th+'"'+o.map(function(U){return" '"+U.replace(/'/g,"'\\''")+"'"}).join("")+'; echo $?>"'+w+'") 2>"'+E+'" |"'+process.execPath+'" "'+__dirname+'/encrypt.js" "'+WH+'" "'+N+'" >"'+h+'"; echo 1 >"'+D+'"']),G2&&G2("_execFileSync",o);try{VH.spawn(a,n,e)}catch(U){u.error=new Error(U.message),u.error.method="_execFileSync - spawn",u.error.program=a,u.error.args=n}for(;Xn.readFileSync(D,{encoding:t.encoding}).trim()!=="1";);return(A=Xn.readFileSync(w,{encoding:t.encoding}).trim())==="0"?u.input=T.update(Xn.readFileSync(h,{encoding:"binary"}),"hex",t.encoding)+T.final(t.encoding):(p=Xn.readFileSync(E,{encoding:t.encoding}).trim(),u.error=new Error(Tme+(p?` -`+p:"")),u.error.method="_execFileSync",u.error.program=a,u.error.args=n,u.error.extMessage=p,u.error.exitCode=+A),Xn.unlinkSync(h),Xn.unlinkSync(E),Xn.unlinkSync(w),Xn.unlinkSync(D),u}function Hgt(t){var e,r={},o,a={env:process.env,encoding:t.encoding};if(Th||(Xg?process.env.PSModulePath?(Th="powershell.exe",zk=["-ExecutionPolicy","Bypass","-File",__dirname+"\\read.ps1"]):(Th="cscript.exe",zk=["//nologo",__dirname+"\\read.cs.js"]):(Th="/bin/sh",zk=[__dirname+"/read.sh"])),Xg&&!process.env.PSModulePath&&(a.stdio=[process.stdin]),VH.execFileSync){e=Nme(t),G2&&G2("execFileSync",e);try{r.input=VH.execFileSync(Th,e,a)}catch(n){o=n.stderr?(n.stderr+"").trim():"",r.error=new Error(Tme+(o?` -`+o:"")),r.error.method="execFileSync",r.error.program=Th,r.error.args=e,r.error.extMessage=o,r.error.exitCode=n.status,r.error.code=n.code,r.error.signal=n.signal}}else r=_gt(t,a);return r.error||(r.input=r.input.replace(/^\s*'|'\s*$/g,""),t.display=""),r}function zH(t){var e="",r=t.display,o=!t.display&&t.keyIn&&t.hideEchoBack&&!t.mask;function a(){var n=Hgt(t);if(n.error)throw n.error;return n.input}return JH&&JH(t),function(){var n,u,A;function p(){return n||(n=process.binding("fs"),u=process.binding("constants")),n}if(typeof Vf=="string")if(Vf=null,Xg){if(A=function(h){var E=h.replace(/^\D+/,"").split("."),w=0;return(E[0]=+E[0])&&(w+=E[0]*1e4),(E[1]=+E[1])&&(w+=E[1]*100),(E[2]=+E[2])&&(w+=E[2]),w}(process.version),!(A>=20302&&A<40204||A>=5e4&&A<50100||A>=50600&&A<60200)&&process.stdin.isTTY)process.stdin.pause(),Vf=process.stdin.fd,eC=process.stdin._handle;else try{Vf=p().open("CONIN$",u.O_RDWR,parseInt("0666",8)),eC=new Fme(Vf,!0)}catch{}if(process.stdout.isTTY)iu=process.stdout.fd;else{try{iu=Xn.openSync("\\\\.\\CON","w")}catch{}if(typeof iu!="number")try{iu=p().open("CONOUT$",u.O_RDWR,parseInt("0666",8))}catch{}}}else{if(process.stdin.isTTY){process.stdin.pause();try{Vf=Xn.openSync("/dev/tty","r"),eC=process.stdin._handle}catch{}}else try{Vf=Xn.openSync("/dev/tty","r"),eC=new Fme(Vf,!1)}catch{}if(process.stdout.isTTY)iu=process.stdout.fd;else try{iu=Xn.openSync("/dev/tty","w")}catch{}}}(),function(){var n,u,A=!t.hideEchoBack&&!t.keyIn,p,h,E,w,D;Xk="";function b(C){return C===Rme?!0:eC.setRawMode(C)!==0?!1:(Rme=C,!0)}if(Lme||!eC||typeof iu!="number"&&(t.display||!A)){e=a();return}if(t.display&&(Xn.writeSync(iu,t.display),t.display=""),!t.displayOnly){if(!b(!A)){e=a();return}for(h=t.keyIn?1:t.bufferSize,p=Buffer.allocUnsafe&&Buffer.alloc?Buffer.alloc(h):new Buffer(h),t.keyIn&&t.limit&&(u=new RegExp("[^"+t.limit+"]","g"+(t.caseSensitive?"":"i")));;){E=0;try{E=Xn.readSync(Vf,p,0,h)}catch(C){if(C.code!=="EOF"){b(!1),e+=a();return}}if(E>0?(w=p.toString(t.encoding,0,E),Xk+=w):(w=` -`,Xk+="\0"),w&&typeof(D=(w.match(/^(.*?)[\r\n]/)||[])[1])=="string"&&(w=D,n=!0),w&&(w=w.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"")),w&&u&&(w=w.replace(u,"")),w&&(A||(t.hideEchoBack?t.mask&&Xn.writeSync(iu,new Array(w.length+1).join(t.mask)):Xn.writeSync(iu,w)),e+=w),!t.keyIn&&n||t.keyIn&&e.length>=h)break}!A&&!o&&Xn.writeSync(iu,` -`),b(!1)}}(),t.print&&!o&&t.print(r+(t.displayOnly?"":(t.hideEchoBack?new Array(e.length+1).join(t.mask):e)+` -`),t.encoding),t.displayOnly?"":$H=t.keepWhitespace||t.keyIn?e:e.trim()}function qgt(t,e){var r=[];function o(a){a!=null&&(Array.isArray(a)?a.forEach(o):(!e||e(a))&&r.push(a))}return o(t),r}function e6(t){return t.replace(/[\x00-\x7f]/g,function(e){return"\\x"+("00"+e.charCodeAt().toString(16)).substr(-2)})}function bs(){var t=Array.prototype.slice.call(arguments),e,r;return t.length&&typeof t[0]=="boolean"&&(r=t.shift(),r&&(e=Object.keys(KH),t.unshift(KH))),t.reduce(function(o,a){return a==null||(a.hasOwnProperty("noEchoBack")&&!a.hasOwnProperty("hideEchoBack")&&(a.hideEchoBack=a.noEchoBack,delete a.noEchoBack),a.hasOwnProperty("noTrim")&&!a.hasOwnProperty("keepWhitespace")&&(a.keepWhitespace=a.noTrim,delete a.noTrim),r||(e=Object.keys(a)),e.forEach(function(n){var u;if(a.hasOwnProperty(n))switch(u=a[n],n){case"mask":case"limitMessage":case"defaultInput":case"encoding":u=u!=null?u+"":"",u&&n!=="limitMessage"&&(u=u.replace(/[\r\n]/g,"")),o[n]=u;break;case"bufferSize":!isNaN(u=parseInt(u,10))&&typeof u=="number"&&(o[n]=u);break;case"displayOnly":case"keyIn":case"hideEchoBack":case"caseSensitive":case"keepWhitespace":case"history":case"cd":o[n]=!!u;break;case"limit":case"trueValue":case"falseValue":o[n]=qgt(u,function(A){var p=typeof A;return p==="string"||p==="number"||p==="function"||A instanceof RegExp}).map(function(A){return typeof A=="string"?A.replace(/[\r\n]/g,""):A});break;case"print":case"phContent":case"preCheck":o[n]=typeof u=="function"?u:void 0;break;case"prompt":case"display":o[n]=u??"";break}})),o},{})}function XH(t,e,r){return e.some(function(o){var a=typeof o;return a==="string"?r?t===o:t.toLowerCase()===o.toLowerCase():a==="number"?parseFloat(t)===o:a==="function"?o(t):o instanceof RegExp?o.test(t):!1})}function t6(t,e){var r=Lh.normalize(Xg?(process.env.HOMEDRIVE||"")+(process.env.HOMEPATH||""):process.env.HOME||"").replace(/[\/\\]+$/,"");return t=Lh.normalize(t),e?t.replace(/^~(?=\/|\\|$)/,r):t.replace(new RegExp("^"+e6(r)+"(?=\\/|\\\\|$)",Xg?"i":""),"~")}function tC(t,e){var r="(?:\\(([\\s\\S]*?)\\))?(\\w+|.-.)(?:\\(([\\s\\S]*?)\\))?",o=new RegExp("(\\$)?(\\$<"+r+">)","g"),a=new RegExp("(\\$)?(\\$\\{"+r+"\\})","g");function n(u,A,p,h,E,w){var D;return A||typeof(D=e(E))!="string"?p:D?(h||"")+D+(w||""):""}return t.replace(o,n).replace(a,n)}function Ome(t,e,r){var o,a=[],n=-1,u=0,A="",p;function h(E,w){return w.length>3?(E.push(w[0]+"..."+w[w.length-1]),p=!0):w.length&&(E=E.concat(w)),E}return o=t.reduce(function(E,w){return E.concat((w+"").split(""))},[]).reduce(function(E,w){var D,b;return e||(w=w.toLowerCase()),D=/^\d$/.test(w)?1:/^[A-Z]$/.test(w)?2:/^[a-z]$/.test(w)?3:0,r&&D===0?A+=w:(b=w.charCodeAt(0),D&&D===n&&b===u+1?a.push(w):(E=h(E,a),a=[w],n=D),u=b),E},[]),o=h(o,a),A&&(o.push(A),p=!0),{values:o,suppressed:p}}function Mme(t,e){return t.join(t.length>2?", ":e?" / ":"/")}function Ume(t,e){var r,o,a={},n;if(e.phContent&&(r=e.phContent(t,e)),typeof r!="string")switch(t){case"hideEchoBack":case"mask":case"defaultInput":case"caseSensitive":case"keepWhitespace":case"encoding":case"bufferSize":case"history":case"cd":r=e.hasOwnProperty(t)?typeof e[t]=="boolean"?e[t]?"on":"off":e[t]+"":"";break;case"limit":case"trueValue":case"falseValue":o=e[e.hasOwnProperty(t+"Src")?t+"Src":t],e.keyIn?(a=Ome(o,e.caseSensitive),o=a.values):o=o.filter(function(u){var A=typeof u;return A==="string"||A==="number"}),r=Mme(o,a.suppressed);break;case"limitCount":case"limitCountNotZero":r=e[e.hasOwnProperty("limitSrc")?"limitSrc":"limit"].length,r=r||t!=="limitCountNotZero"?r+"":"";break;case"lastInput":r=$H;break;case"cwd":case"CWD":case"cwdHome":r=process.cwd(),t==="CWD"?r=Lh.basename(r):t==="cwdHome"&&(r=t6(r));break;case"date":case"time":case"localeDate":case"localeTime":r=new Date()["to"+t.replace(/^./,function(u){return u.toUpperCase()})+"String"]();break;default:typeof(n=(t.match(/^history_m(\d+)$/)||[])[1])=="string"&&(r=zg[zg.length-n]||"")}return r}function _me(t){var e=/^(.)-(.)$/.exec(t),r="",o,a,n,u;if(!e)return null;for(o=e[1].charCodeAt(0),a=e[2].charCodeAt(0),u=o -And the length must be: $`,trueValue:null,falseValue:null,caseSensitive:!0},e,{history:!1,cd:!1,phContent:function(b){return b==="charlist"?r.text:b==="length"?o+"..."+a:null}}),u,A,p,h,E,w,D;for(e=e||{},u=tC(e.charlist?e.charlist+"":"$",_me),(isNaN(o=parseInt(e.min,10))||typeof o!="number")&&(o=12),(isNaN(a=parseInt(e.max,10))||typeof a!="number")&&(a=24),h=new RegExp("^["+e6(u)+"]{"+o+","+a+"}$"),r=Ome([u],n.caseSensitive,!0),r.text=Mme(r.values,r.suppressed),A=e.confirmMessage!=null?e.confirmMessage:"Reinput a same one to confirm it: ",p=e.unmatchMessage!=null?e.unmatchMessage:"It differs from first one. Hit only the Enter key if you want to retry from first one.",t==null&&(t="Input new password: "),E=n.limitMessage;!D;)n.limit=h,n.limitMessage=E,w=Kr.question(t,n),n.limit=[w,""],n.limitMessage=p,D=Kr.question(A,n);return w};function jme(t,e,r){var o;function a(n){return o=r(n),!isNaN(o)&&typeof o=="number"}return Kr.question(t,bs({limitMessage:"Input valid number, please."},e,{limit:a,cd:!1})),o}Kr.questionInt=function(t,e){return jme(t,e,function(r){return parseInt(r,10)})};Kr.questionFloat=function(t,e){return jme(t,e,parseFloat)};Kr.questionPath=function(t,e){var r,o="",a=bs({hideEchoBack:!1,limitMessage:`$Input valid path, please.$<( Min:)min>$<( Max:)max>`,history:!0,cd:!0},e,{keepWhitespace:!1,limit:function(n){var u,A,p;n=t6(n,!0),o="";function h(E){E.split(/\/|\\/).reduce(function(w,D){var b=Lh.resolve(w+=D+Lh.sep);if(!Xn.existsSync(b))Xn.mkdirSync(b);else if(!Xn.statSync(b).isDirectory())throw new Error("Non directory already exists: "+b);return w},"")}try{if(u=Xn.existsSync(n),r=u?Xn.realpathSync(n):Lh.resolve(n),!e.hasOwnProperty("exists")&&!u||typeof e.exists=="boolean"&&e.exists!==u)return o=(u?"Already exists":"No such file or directory")+": "+r,!1;if(!u&&e.create&&(e.isDirectory?h(r):(h(Lh.dirname(r)),Xn.closeSync(Xn.openSync(r,"w"))),r=Xn.realpathSync(r)),u&&(e.min||e.max||e.isFile||e.isDirectory)){if(A=Xn.statSync(r),e.isFile&&!A.isFile())return o="Not file: "+r,!1;if(e.isDirectory&&!A.isDirectory())return o="Not directory: "+r,!1;if(e.min&&A.size<+e.min||e.max&&A.size>+e.max)return o="Size "+A.size+" is out of range: "+r,!1}if(typeof e.validate=="function"&&(p=e.validate(r))!==!0)return typeof p=="string"&&(o=p),!1}catch(E){return o=E+"",!1}return!0},phContent:function(n){return n==="error"?o:n!=="min"&&n!=="max"?null:e.hasOwnProperty(n)?e[n]+"":""}});return e=e||{},t==null&&(t='Input path (you can "cd" and "pwd"): '),Kr.question(t,a),r};function Gme(t,e){var r={},o={};return typeof t=="object"?(Object.keys(t).forEach(function(a){typeof t[a]=="function"&&(o[e.caseSensitive?a:a.toLowerCase()]=t[a])}),r.preCheck=function(a){var n;return r.args=ZH(a),n=r.args[0]||"",e.caseSensitive||(n=n.toLowerCase()),r.hRes=n!=="_"&&o.hasOwnProperty(n)?o[n].apply(a,r.args.slice(1)):o.hasOwnProperty("_")?o._.apply(a,r.args):null,{res:a,forceNext:!1}},o.hasOwnProperty("_")||(r.limit=function(){var a=r.args[0]||"";return e.caseSensitive||(a=a.toLowerCase()),o.hasOwnProperty(a)})):r.preCheck=function(a){return r.args=ZH(a),r.hRes=typeof t=="function"?t.apply(a,r.args):!0,{res:a,forceNext:!1}},r}Kr.promptCL=function(t,e){var r=bs({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),o=Gme(t,r);return r.limit=o.limit,r.preCheck=o.preCheck,Kr.prompt(r),o.args};Kr.promptLoop=function(t,e){for(var r=bs({hideEchoBack:!1,trueValue:null,falseValue:null,caseSensitive:!1,history:!0},e);!t(Kr.prompt(r)););};Kr.promptCLLoop=function(t,e){var r=bs({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),o=Gme(t,r);for(r.limit=o.limit,r.preCheck=o.preCheck;Kr.prompt(r),!o.hRes;);};Kr.promptSimShell=function(t){return Kr.prompt(bs({hideEchoBack:!1,history:!0},t,{prompt:function(){return Xg?"$>":(process.env.USER||"")+(process.env.HOSTNAME?"@"+process.env.HOSTNAME.replace(/\..*$/,""):"")+":$$ "}()}))};function Wme(t,e,r){var o;return t==null&&(t="Are you sure? "),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s*:?\s*$/,"")+" [y/n]: "),o=Kr.keyIn(t,bs(e,{hideEchoBack:!1,limit:r,trueValue:"y",falseValue:"n",caseSensitive:!1})),typeof o=="boolean"?o:""}Kr.keyInYN=function(t,e){return Wme(t,e)};Kr.keyInYNStrict=function(t,e){return Wme(t,e,"yn")};Kr.keyInPause=function(t,e){t==null&&(t="Continue..."),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s+$/,"")+" (Hit any key)"),Kr.keyIn(t,bs({limit:null},e,{hideEchoBack:!0,mask:""}))};Kr.keyInSelect=function(t,e,r){var o=bs({hideEchoBack:!1},r,{trueValue:null,falseValue:null,caseSensitive:!1,phContent:function(p){return p==="itemsCount"?t.length+"":p==="firstItem"?(t[0]+"").trim():p==="lastItem"?(t[t.length-1]+"").trim():null}}),a="",n={},u=49,A=` -`;if(!Array.isArray(t)||!t.length||t.length>35)throw"`items` must be Array (max length: 35).";return t.forEach(function(p,h){var E=String.fromCharCode(u);a+=E,n[E]=h,A+="["+E+"] "+(p+"").trim()+` -`,u=u===57?97:u+1}),(!r||r.cancel!==!1)&&(a+="0",n[0]=-1,A+="[0] "+(r&&r.cancel!=null&&typeof r.cancel!="boolean"?(r.cancel+"").trim():"CANCEL")+` -`),o.limit=a,A+=` -`,e==null&&(e="Choose one from list: "),(e+="")&&((!r||r.guide!==!1)&&(e=e.replace(/\s*:?\s*$/,"")+" [$]: "),A+=e),n[Kr.keyIn(A,o).toLowerCase()]};Kr.getRawInput=function(){return Xk};function W2(t,e){var r;return e.length&&(r={},r[t]=e[0]),Kr.setDefaultOptions(r)[t]}Kr.setPrint=function(){return W2("print",arguments)};Kr.setPrompt=function(){return W2("prompt",arguments)};Kr.setEncoding=function(){return W2("encoding",arguments)};Kr.setMask=function(){return W2("mask",arguments)};Kr.setBufferSize=function(){return W2("bufferSize",arguments)}});var r6=_((O9t,El)=>{(function(){var t={major:0,minor:2,patch:66,status:"beta"};tau_file_system={files:{},open:function(I,P,y){var R=tau_file_system.files[I];if(!R){if(y==="read")return null;R={path:I,text:"",type:P,get:function(z,X){return X===this.text.length||X>this.text.length?"end_of_file":this.text.substring(X,X+z)},put:function(z,X){return X==="end_of_file"?(this.text+=z,!0):X==="past_end_of_file"?null:(this.text=this.text.substring(0,X)+z+this.text.substring(X+z.length),!0)},get_byte:function(z){if(z==="end_of_stream")return-1;var X=Math.floor(z/2);if(this.text.length<=X)return-1;var $=n(this.text[Math.floor(z/2)],0);return z%2===0?$&255:$/256>>>0},put_byte:function(z,X){var $=X==="end_of_stream"?this.text.length:Math.floor(X/2);if(this.text.length<$)return null;var se=this.text.length===$?-1:n(this.text[Math.floor(X/2)],0);return X%2===0?(se=se/256>>>0,se=(se&255)<<8|z&255):(se=se&255,se=(z&255)<<8|se&255),this.text.length===$?this.text+=u(se):this.text=this.text.substring(0,$)+u(se)+this.text.substring($+1),!0},flush:function(){return!0},close:function(){var z=tau_file_system.files[this.path];return z?!0:null}},tau_file_system.files[I]=R}return y==="write"&&(R.text=""),R}},tau_user_input={buffer:"",get:function(I,P){for(var y;tau_user_input.buffer.length\?\@\^\~\\]+|'(?:[^']*?(?:\\(?:x?\d+)?\\)*(?:'')*(?:\\')*)*')/,number:/^(?:0o[0-7]+|0x[0-9a-fA-F]+|0b[01]+|0'(?:''|\\[abfnrtv\\'"`]|\\x?\d+\\|[^\\])|\d+(?:\.\d+(?:[eE][+-]?\d+)?)?)/,string:/^(?:"([^"]|""|\\")*"|`([^`]|``|\\`)*`)/,l_brace:/^(?:\[)/,r_brace:/^(?:\])/,l_bracket:/^(?:\{)/,r_bracket:/^(?:\})/,bar:/^(?:\|)/,l_paren:/^(?:\()/,r_paren:/^(?:\))/};function N(I,P){return I.get_flag("char_conversion").id==="on"?P.replace(/./g,function(y){return I.get_char_conversion(y)}):P}function U(I){this.thread=I,this.text="",this.tokens=[]}U.prototype.set_last_tokens=function(I){return this.tokens=I},U.prototype.new_text=function(I){this.text=I,this.tokens=[]},U.prototype.get_tokens=function(I){var P,y=0,R=0,z=0,X=[],$=!1;if(I){var se=this.tokens[I-1];y=se.len,P=N(this.thread,this.text.substr(se.len)),R=se.line,z=se.start}else P=this.text;if(/^\s*$/.test(P))return null;for(;P!=="";){var be=[],Fe=!1;if(/^\n/.exec(P)!==null){R++,z=0,y++,P=P.replace(/\n/,""),$=!0;continue}for(var lt in T)if(T.hasOwnProperty(lt)){var Et=T[lt].exec(P);Et&&be.push({value:Et[0],name:lt,matches:Et})}if(!be.length)return this.set_last_tokens([{value:P,matches:[],name:"lexical",line:R,start:z}]);var se=r(be,function(Sr,yr){return Sr.value.length>=yr.value.length?Sr:yr});switch(se.start=z,se.line=R,P=P.replace(se.value,""),z+=se.value.length,y+=se.value.length,se.name){case"atom":se.raw=se.value,se.value.charAt(0)==="'"&&(se.value=D(se.value.substr(1,se.value.length-2),"'"),se.value===null&&(se.name="lexical",se.value="unknown escape sequence"));break;case"number":se.float=se.value.substring(0,2)!=="0x"&&se.value.match(/[.eE]/)!==null&&se.value!=="0'.",se.value=C(se.value),se.blank=Fe;break;case"string":var qt=se.value.charAt(0);se.value=D(se.value.substr(1,se.value.length-2),qt),se.value===null&&(se.name="lexical",se.value="unknown escape sequence");break;case"whitespace":var nr=X[X.length-1];nr&&(nr.space=!0),Fe=!0;continue;case"r_bracket":X.length>0&&X[X.length-1].name==="l_bracket"&&(se=X.pop(),se.name="atom",se.value="{}",se.raw="{}",se.space=!1);break;case"r_brace":X.length>0&&X[X.length-1].name==="l_brace"&&(se=X.pop(),se.name="atom",se.value="[]",se.raw="[]",se.space=!1);break}se.len=y,X.push(se),Fe=!1}var Pt=this.set_last_tokens(X);return Pt.length===0?null:Pt};function J(I,P,y,R,z){if(!P[y])return{type:A,value:x.error.syntax(P[y-1],"expression expected",!0)};var X;if(R==="0"){var $=P[y];switch($.name){case"number":return{type:p,len:y+1,value:new x.type.Num($.value,$.float)};case"variable":return{type:p,len:y+1,value:new x.type.Var($.value)};case"string":var se;switch(I.get_flag("double_quotes").id){case"atom":se=new q($.value,[]);break;case"codes":se=new q("[]",[]);for(var be=$.value.length-1;be>=0;be--)se=new q(".",[new x.type.Num(n($.value,be),!1),se]);break;case"chars":se=new q("[]",[]);for(var be=$.value.length-1;be>=0;be--)se=new q(".",[new x.type.Term($.value.charAt(be),[]),se]);break}return{type:p,len:y+1,value:se};case"l_paren":var Pt=J(I,P,y+1,I.__get_max_priority(),!0);return Pt.type!==p?Pt:P[Pt.len]&&P[Pt.len].name==="r_paren"?(Pt.len++,Pt):{type:A,derived:!0,value:x.error.syntax(P[Pt.len]?P[Pt.len]:P[Pt.len-1],") or operator expected",!P[Pt.len])};case"l_bracket":var Pt=J(I,P,y+1,I.__get_max_priority(),!0);return Pt.type!==p?Pt:P[Pt.len]&&P[Pt.len].name==="r_bracket"?(Pt.len++,Pt.value=new q("{}",[Pt.value]),Pt):{type:A,derived:!0,value:x.error.syntax(P[Pt.len]?P[Pt.len]:P[Pt.len-1],"} or operator expected",!P[Pt.len])}}var Fe=te(I,P,y,z);return Fe.type===p||Fe.derived||(Fe=le(I,P,y),Fe.type===p||Fe.derived)?Fe:{type:A,derived:!1,value:x.error.syntax(P[y],"unexpected token")}}var lt=I.__get_max_priority(),Et=I.__get_next_priority(R),qt=y;if(P[y].name==="atom"&&P[y+1]&&(P[y].space||P[y+1].name!=="l_paren")){var $=P[y++],nr=I.__lookup_operator_classes(R,$.value);if(nr&&nr.indexOf("fy")>-1){var Pt=J(I,P,y,R,z);if(Pt.type!==A)return $.value==="-"&&!$.space&&x.type.is_number(Pt.value)?{value:new x.type.Num(-Pt.value.value,Pt.value.is_float),len:Pt.len,type:p}:{value:new x.type.Term($.value,[Pt.value]),len:Pt.len,type:p};X=Pt}else if(nr&&nr.indexOf("fx")>-1){var Pt=J(I,P,y,Et,z);if(Pt.type!==A)return{value:new x.type.Term($.value,[Pt.value]),len:Pt.len,type:p};X=Pt}}y=qt;var Pt=J(I,P,y,Et,z);if(Pt.type===p){y=Pt.len;var $=P[y];if(P[y]&&(P[y].name==="atom"&&I.__lookup_operator_classes(R,$.value)||P[y].name==="bar"&&I.__lookup_operator_classes(R,"|"))){var cn=Et,Sr=R,nr=I.__lookup_operator_classes(R,$.value);if(nr.indexOf("xf")>-1)return{value:new x.type.Term($.value,[Pt.value]),len:++Pt.len,type:p};if(nr.indexOf("xfx")>-1){var yr=J(I,P,y+1,cn,z);return yr.type===p?{value:new x.type.Term($.value,[Pt.value,yr.value]),len:yr.len,type:p}:(yr.derived=!0,yr)}else if(nr.indexOf("xfy")>-1){var yr=J(I,P,y+1,Sr,z);return yr.type===p?{value:new x.type.Term($.value,[Pt.value,yr.value]),len:yr.len,type:p}:(yr.derived=!0,yr)}else if(Pt.type!==A)for(;;){y=Pt.len;var $=P[y];if($&&$.name==="atom"&&I.__lookup_operator_classes(R,$.value)){var nr=I.__lookup_operator_classes(R,$.value);if(nr.indexOf("yf")>-1)Pt={value:new x.type.Term($.value,[Pt.value]),len:++y,type:p};else if(nr.indexOf("yfx")>-1){var yr=J(I,P,++y,cn,z);if(yr.type===A)return yr.derived=!0,yr;y=yr.len,Pt={value:new x.type.Term($.value,[Pt.value,yr.value]),len:y,type:p}}else break}else break}}else X={type:A,value:x.error.syntax(P[Pt.len-1],"operator expected")};return Pt}return Pt}function te(I,P,y,R){if(!P[y]||P[y].name==="atom"&&P[y].raw==="."&&!R&&(P[y].space||!P[y+1]||P[y+1].name!=="l_paren"))return{type:A,derived:!1,value:x.error.syntax(P[y-1],"unfounded token")};var z=P[y],X=[];if(P[y].name==="atom"&&P[y].raw!==","){if(y++,P[y-1].space)return{type:p,len:y,value:new x.type.Term(z.value,X)};if(P[y]&&P[y].name==="l_paren"){if(P[y+1]&&P[y+1].name==="r_paren")return{type:A,derived:!0,value:x.error.syntax(P[y+1],"argument expected")};var $=J(I,P,++y,"999",!0);if($.type===A)return $.derived?$:{type:A,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],"argument expected",!P[y])};for(X.push($.value),y=$.len;P[y]&&P[y].name==="atom"&&P[y].value===",";){if($=J(I,P,y+1,"999",!0),$.type===A)return $.derived?$:{type:A,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};X.push($.value),y=$.len}if(P[y]&&P[y].name==="r_paren")y++;else return{type:A,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],", or ) expected",!P[y])}}return{type:p,len:y,value:new x.type.Term(z.value,X)}}return{type:A,derived:!1,value:x.error.syntax(P[y],"term expected")}}function le(I,P,y){if(!P[y])return{type:A,derived:!1,value:x.error.syntax(P[y-1],"[ expected")};if(P[y]&&P[y].name==="l_brace"){var R=J(I,P,++y,"999",!0),z=[R.value],X=void 0;if(R.type===A)return P[y]&&P[y].name==="r_brace"?{type:p,len:y+1,value:new x.type.Term("[]",[])}:{type:A,derived:!0,value:x.error.syntax(P[y],"] expected")};for(y=R.len;P[y]&&P[y].name==="atom"&&P[y].value===",";){if(R=J(I,P,y+1,"999",!0),R.type===A)return R.derived?R:{type:A,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};z.push(R.value),y=R.len}var $=!1;if(P[y]&&P[y].name==="bar"){if($=!0,R=J(I,P,y+1,"999",!0),R.type===A)return R.derived?R:{type:A,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};X=R.value,y=R.len}return P[y]&&P[y].name==="r_brace"?{type:p,len:y+1,value:g(z,X)}:{type:A,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],$?"] expected":", or | or ] expected",!P[y])}}return{type:A,derived:!1,value:x.error.syntax(P[y],"list expected")}}function ce(I,P,y){var R=P[y].line,z=J(I,P,y,I.__get_max_priority(),!1),X=null,$;if(z.type!==A)if(y=z.len,P[y]&&P[y].name==="atom"&&P[y].raw===".")if(y++,x.type.is_term(z.value)){if(z.value.indicator===":-/2"?(X=new x.type.Rule(z.value.args[0],Ee(z.value.args[1])),$={value:X,len:y,type:p}):z.value.indicator==="-->/2"?(X=he(new x.type.Rule(z.value.args[0],z.value.args[1]),I),X.body=Ee(X.body),$={value:X,len:y,type:x.type.is_rule(X)?p:A}):(X=new x.type.Rule(z.value,null),$={value:X,len:y,type:p}),X){var se=X.singleton_variables();se.length>0&&I.throw_warning(x.warning.singleton(se,X.head.indicator,R))}return $}else return{type:A,value:x.error.syntax(P[y],"callable expected")};else return{type:A,value:x.error.syntax(P[y]?P[y]:P[y-1],". or operator expected")};return z}function ue(I,P,y){y=y||{},y.from=y.from?y.from:"$tau-js",y.reconsult=y.reconsult!==void 0?y.reconsult:!0;var R=new U(I),z={},X;R.new_text(P);var $=0,se=R.get_tokens($);do{if(se===null||!se[$])break;var be=ce(I,se,$);if(be.type===A)return new q("throw",[be.value]);if(be.value.body===null&&be.value.head.indicator==="?-/1"){var Fe=new tt(I.session);Fe.add_goal(be.value.head.args[0]),Fe.answer(function(Et){x.type.is_error(Et)?I.throw_warning(Et.args[0]):(Et===!1||Et===null)&&I.throw_warning(x.warning.failed_goal(be.value.head.args[0],be.len))}),$=be.len;var lt=!0}else if(be.value.body===null&&be.value.head.indicator===":-/1"){var lt=I.run_directive(be.value.head.args[0]);$=be.len,be.value.head.args[0].indicator==="char_conversion/2"&&(se=R.get_tokens($),$=0)}else{X=be.value.head.indicator,y.reconsult!==!1&&z[X]!==!0&&!I.is_multifile_predicate(X)&&(I.session.rules[X]=a(I.session.rules[X]||[],function(qt){return qt.dynamic}),z[X]=!0);var lt=I.add_rule(be.value,y);$=be.len}if(!lt)return lt}while(!0);return!0}function Ie(I,P){var y=new U(I);y.new_text(P);var R=0;do{var z=y.get_tokens(R);if(z===null)break;var X=J(I,z,0,I.__get_max_priority(),!1);if(X.type!==A){var $=X.len,se=$;if(z[$]&&z[$].name==="atom"&&z[$].raw===".")I.add_goal(Ee(X.value));else{var be=z[$];return new q("throw",[x.error.syntax(be||z[$-1],". or operator expected",!be)])}R=X.len+1}else return new q("throw",[X.value])}while(!0);return!0}function he(I,P){I=I.rename(P);var y=P.next_free_variable(),R=De(I.body,y,P);return R.error?R.value:(I.body=R.value,I.head.args=I.head.args.concat([y,R.variable]),I.head=new q(I.head.id,I.head.args),I)}function De(I,P,y){var R;if(x.type.is_term(I)&&I.indicator==="!/0")return{value:I,variable:P,error:!1};if(x.type.is_term(I)&&I.indicator===",/2"){var z=De(I.args[0],P,y);if(z.error)return z;var X=De(I.args[1],z.variable,y);return X.error?X:{value:new q(",",[z.value,X.value]),variable:X.variable,error:!1}}else{if(x.type.is_term(I)&&I.indicator==="{}/1")return{value:I.args[0],variable:P,error:!1};if(x.type.is_empty_list(I))return{value:new q("true",[]),variable:P,error:!1};if(x.type.is_list(I)){R=y.next_free_variable();for(var $=I,se;$.indicator==="./2";)se=$,$=$.args[1];return x.type.is_variable($)?{value:x.error.instantiation("DCG"),variable:P,error:!0}:x.type.is_empty_list($)?(se.args[1]=R,{value:new q("=",[P,I]),variable:R,error:!1}):{value:x.error.type("list",I,"DCG"),variable:P,error:!0}}else return x.type.is_callable(I)?(R=y.next_free_variable(),I.args=I.args.concat([P,R]),I=new q(I.id,I.args),{value:I,variable:R,error:!1}):{value:x.error.type("callable",I,"DCG"),variable:P,error:!0}}}function Ee(I){return x.type.is_variable(I)?new q("call",[I]):x.type.is_term(I)&&[",/2",";/2","->/2"].indexOf(I.indicator)!==-1?new q(I.id,[Ee(I.args[0]),Ee(I.args[1])]):I}function g(I,P){for(var y=P||new x.type.Term("[]",[]),R=I.length-1;R>=0;R--)y=new x.type.Term(".",[I[R],y]);return y}function me(I,P){for(var y=I.length-1;y>=0;y--)I[y]===P&&I.splice(y,1)}function Ce(I){for(var P={},y=[],R=0;R=0;P--)if(I.charAt(P)==="/")return new q("/",[new q(I.substring(0,P)),new Re(parseInt(I.substring(P+1)),!1)])}function Se(I){this.id=I}function Re(I,P){this.is_float=P!==void 0?P:parseInt(I)!==I,this.value=this.is_float?I:parseInt(I)}var ht=0;function q(I,P,y){this.ref=y||++ht,this.id=I,this.args=P||[],this.indicator=I+"/"+this.args.length}var nt=0;function Le(I,P,y,R,z,X){this.id=nt++,this.stream=I,this.mode=P,this.alias=y,this.type=R!==void 0?R:"text",this.reposition=z!==void 0?z:!0,this.eof_action=X!==void 0?X:"eof_code",this.position=this.mode==="append"?"end_of_stream":0,this.output=this.mode==="write"||this.mode==="append",this.input=this.mode==="read"}function Te(I){I=I||{},this.links=I}function ke(I,P,y){P=P||new Te,y=y||null,this.goal=I,this.substitution=P,this.parent=y}function Ke(I,P,y){this.head=I,this.body=P,this.dynamic=y||!1}function xe(I){I=I===void 0||I<=0?1e3:I,this.rules={},this.src_predicates={},this.rename=0,this.modules=[],this.thread=new tt(this),this.total_threads=1,this.renamed_variables={},this.public_predicates={},this.multifile_predicates={},this.limit=I,this.streams={user_input:new Le(typeof El<"u"&&El.exports?nodejs_user_input:tau_user_input,"read","user_input","text",!1,"reset"),user_output:new Le(typeof El<"u"&&El.exports?nodejs_user_output:tau_user_output,"write","user_output","text",!1,"eof_code")},this.file_system=typeof El<"u"&&El.exports?nodejs_file_system:tau_file_system,this.standard_input=this.streams.user_input,this.standard_output=this.streams.user_output,this.current_input=this.streams.user_input,this.current_output=this.streams.user_output,this.format_success=function(P){return P.substitution},this.format_error=function(P){return P.goal},this.flag={bounded:x.flag.bounded.value,max_integer:x.flag.max_integer.value,min_integer:x.flag.min_integer.value,integer_rounding_function:x.flag.integer_rounding_function.value,char_conversion:x.flag.char_conversion.value,debug:x.flag.debug.value,max_arity:x.flag.max_arity.value,unknown:x.flag.unknown.value,double_quotes:x.flag.double_quotes.value,occurs_check:x.flag.occurs_check.value,dialect:x.flag.dialect.value,version_data:x.flag.version_data.value,nodejs:x.flag.nodejs.value},this.__loaded_modules=[],this.__char_conversion={},this.__operators={1200:{":-":["fx","xfx"],"-->":["xfx"],"?-":["fx"]},1100:{";":["xfy"]},1050:{"->":["xfy"]},1e3:{",":["xfy"]},900:{"\\+":["fy"]},700:{"=":["xfx"],"\\=":["xfx"],"==":["xfx"],"\\==":["xfx"],"@<":["xfx"],"@=<":["xfx"],"@>":["xfx"],"@>=":["xfx"],"=..":["xfx"],is:["xfx"],"=:=":["xfx"],"=\\=":["xfx"],"<":["xfx"],"=<":["xfx"],">":["xfx"],">=":["xfx"]},600:{":":["xfy"]},500:{"+":["yfx"],"-":["yfx"],"/\\":["yfx"],"\\/":["yfx"]},400:{"*":["yfx"],"/":["yfx"],"//":["yfx"],rem:["yfx"],mod:["yfx"],"<<":["yfx"],">>":["yfx"]},200:{"**":["xfx"],"^":["xfy"],"-":["fy"],"+":["fy"],"\\":["fy"]}}}function tt(I){this.epoch=Date.now(),this.session=I,this.session.total_threads++,this.total_steps=0,this.cpu_time=0,this.cpu_time_last=0,this.points=[],this.debugger=!1,this.debugger_states=[],this.level="top_level/0",this.__calls=[],this.current_limit=this.session.limit,this.warnings=[]}function He(I,P,y){this.id=I,this.rules=P,this.exports=y,x.module[I]=this}He.prototype.exports_predicate=function(I){return this.exports.indexOf(I)!==-1},Se.prototype.unify=function(I,P){if(P&&e(I.variables(),this.id)!==-1&&!x.type.is_variable(I))return null;var y={};return y[this.id]=I,new Te(y)},Re.prototype.unify=function(I,P){return x.type.is_number(I)&&this.value===I.value&&this.is_float===I.is_float?new Te:null},q.prototype.unify=function(I,P){if(x.type.is_term(I)&&this.indicator===I.indicator){for(var y=new Te,R=0;R=0){var R=this.args[0].value,z=Math.floor(R/26),X=R%26;return"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[X]+(z!==0?z:"")}switch(this.indicator){case"[]/0":case"{}/0":case"!/0":return this.id;case"{}/1":return"{"+this.args[0].toString(I)+"}";case"./2":for(var $="["+this.args[0].toString(I),se=this.args[1];se.indicator==="./2";)$+=", "+se.args[0].toString(I),se=se.args[1];return se.indicator!=="[]/0"&&($+="|"+se.toString(I)),$+="]",$;case",/2":return"("+this.args[0].toString(I)+", "+this.args[1].toString(I)+")";default:var be=this.id,Fe=I.session?I.session.lookup_operator(this.id,this.args.length):null;if(I.session===void 0||I.ignore_ops||Fe===null)return I.quoted&&!/^(!|,|;|[a-z][0-9a-zA-Z_]*)$/.test(be)&&be!=="{}"&&be!=="[]"&&(be="'"+b(be)+"'"),be+(this.args.length?"("+o(this.args,function(nr){return nr.toString(I)}).join(", ")+")":"");var lt=Fe.priority>P.priority||Fe.priority===P.priority&&(Fe.class==="xfy"&&this.indicator!==P.indicator||Fe.class==="yfx"&&this.indicator!==P.indicator||this.indicator===P.indicator&&Fe.class==="yfx"&&y==="right"||this.indicator===P.indicator&&Fe.class==="xfy"&&y==="left");Fe.indicator=this.indicator;var Et=lt?"(":"",qt=lt?")":"";return this.args.length===0?"("+this.id+")":["fy","fx"].indexOf(Fe.class)!==-1?Et+be+" "+this.args[0].toString(I,Fe)+qt:["yf","xf"].indexOf(Fe.class)!==-1?Et+this.args[0].toString(I,Fe)+" "+be+qt:Et+this.args[0].toString(I,Fe,"left")+" "+this.id+" "+this.args[1].toString(I,Fe,"right")+qt}},Le.prototype.toString=function(I){return"("+this.id+")"},Te.prototype.toString=function(I){var P="{";for(var y in this.links)this.links.hasOwnProperty(y)&&(P!=="{"&&(P+=", "),P+=y+"/"+this.links[y].toString(I));return P+="}",P},ke.prototype.toString=function(I){return this.goal===null?"<"+this.substitution.toString(I)+">":"<"+this.goal.toString(I)+", "+this.substitution.toString(I)+">"},Ke.prototype.toString=function(I){return this.body?this.head.toString(I)+" :- "+this.body.toString(I)+".":this.head.toString(I)+"."},xe.prototype.toString=function(I){for(var P="",y=0;y=0;z--)R=new q(".",[P[z],R]);return R}return new q(this.id,o(this.args,function(X){return X.apply(I)}),this.ref)},Le.prototype.apply=function(I){return this},Ke.prototype.apply=function(I){return new Ke(this.head.apply(I),this.body!==null?this.body.apply(I):null)},Te.prototype.apply=function(I){var P,y={};for(P in this.links)this.links.hasOwnProperty(P)&&(y[P]=this.links[P].apply(I));return new Te(y)},q.prototype.select=function(){for(var I=this;I.indicator===",/2";)I=I.args[0];return I},q.prototype.replace=function(I){return this.indicator===",/2"?this.args[0].indicator===",/2"?new q(",",[this.args[0].replace(I),this.args[1]]):I===null?this.args[1]:new q(",",[I,this.args[1]]):I},q.prototype.search=function(I){if(x.type.is_term(I)&&I.ref!==void 0&&this.ref===I.ref)return!0;for(var P=0;PP&&R0&&(P=this.head_point().substitution.domain());e(P,x.format_variable(this.session.rename))!==-1;)this.session.rename++;if(I.id==="_")return new Se(x.format_variable(this.session.rename));this.session.renamed_variables[I.id]=x.format_variable(this.session.rename)}return new Se(this.session.renamed_variables[I.id])},xe.prototype.next_free_variable=function(){return this.thread.next_free_variable()},tt.prototype.next_free_variable=function(){this.session.rename++;var I=[];for(this.points.length>0&&(I=this.head_point().substitution.domain());e(I,x.format_variable(this.session.rename))!==-1;)this.session.rename++;return new Se(x.format_variable(this.session.rename))},xe.prototype.is_public_predicate=function(I){return!this.public_predicates.hasOwnProperty(I)||this.public_predicates[I]===!0},tt.prototype.is_public_predicate=function(I){return this.session.is_public_predicate(I)},xe.prototype.is_multifile_predicate=function(I){return this.multifile_predicates.hasOwnProperty(I)&&this.multifile_predicates[I]===!0},tt.prototype.is_multifile_predicate=function(I){return this.session.is_multifile_predicate(I)},xe.prototype.prepend=function(I){return this.thread.prepend(I)},tt.prototype.prepend=function(I){for(var P=I.length-1;P>=0;P--)this.points.push(I[P])},xe.prototype.success=function(I,P){return this.thread.success(I,P)},tt.prototype.success=function(I,y){var y=typeof y>"u"?I:y;this.prepend([new ke(I.goal.replace(null),I.substitution,y)])},xe.prototype.throw_error=function(I){return this.thread.throw_error(I)},tt.prototype.throw_error=function(I){this.prepend([new ke(new q("throw",[I]),new Te,null,null)])},xe.prototype.step_rule=function(I,P){return this.thread.step_rule(I,P)},tt.prototype.step_rule=function(I,P){var y=P.indicator;if(I==="user"&&(I=null),I===null&&this.session.rules.hasOwnProperty(y))return this.session.rules[y];for(var R=I===null?this.session.modules:e(this.session.modules,I)===-1?[]:[I],z=0;z1)&&this.again()},xe.prototype.answers=function(I,P,y){return this.thread.answers(I,P,y)},tt.prototype.answers=function(I,P,y){var R=P||1e3,z=this;if(P<=0){y&&y();return}this.answer(function(X){I(X),X!==!1?setTimeout(function(){z.answers(I,P-1,y)},1):y&&y()})},xe.prototype.again=function(I){return this.thread.again(I)},tt.prototype.again=function(I){for(var P,y=Date.now();this.__calls.length>0;){for(this.warnings=[],I!==!1&&(this.current_limit=this.session.limit);this.current_limit>0&&this.points.length>0&&this.head_point().goal!==null&&!x.type.is_error(this.head_point().goal);)if(this.current_limit--,this.step()===!0)return;var R=Date.now();this.cpu_time_last=R-y,this.cpu_time+=this.cpu_time_last;var z=this.__calls.shift();this.current_limit<=0?z(null):this.points.length===0?z(!1):x.type.is_error(this.head_point().goal)?(P=this.session.format_error(this.points.pop()),this.points=[],z(P)):(this.debugger&&this.debugger_states.push(this.head_point()),P=this.session.format_success(this.points.pop()),z(P))}},xe.prototype.unfold=function(I){if(I.body===null)return!1;var P=I.head,y=I.body,R=y.select(),z=new tt(this),X=[];z.add_goal(R),z.step();for(var $=z.points.length-1;$>=0;$--){var se=z.points[$],be=P.apply(se.substitution),Fe=y.replace(se.goal);Fe!==null&&(Fe=Fe.apply(se.substitution)),X.push(new Ke(be,Fe))}var lt=this.rules[P.indicator],Et=e(lt,I);return X.length>0&&Et!==-1?(lt.splice.apply(lt,[Et,1].concat(X)),!0):!1},tt.prototype.unfold=function(I){return this.session.unfold(I)},Se.prototype.interpret=function(I){return x.error.instantiation(I.level)},Re.prototype.interpret=function(I){return this},q.prototype.interpret=function(I){return x.type.is_unitary_list(this)?this.args[0].interpret(I):x.operate(I,this)},Se.prototype.compare=function(I){return this.idI.id?1:0},Re.prototype.compare=function(I){if(this.value===I.value&&this.is_float===I.is_float)return 0;if(this.valueI.value)return 1},q.prototype.compare=function(I){if(this.args.lengthI.args.length||this.args.length===I.args.length&&this.id>I.id)return 1;for(var P=0;PR)return 1;if(I.constructor===Re){if(I.is_float&&P.is_float)return 0;if(I.is_float)return-1;if(P.is_float)return 1}return 0},is_substitution:function(I){return I instanceof Te},is_state:function(I){return I instanceof ke},is_rule:function(I){return I instanceof Ke},is_variable:function(I){return I instanceof Se},is_stream:function(I){return I instanceof Le},is_anonymous_var:function(I){return I instanceof Se&&I.id==="_"},is_callable:function(I){return I instanceof q},is_number:function(I){return I instanceof Re},is_integer:function(I){return I instanceof Re&&!I.is_float},is_float:function(I){return I instanceof Re&&I.is_float},is_term:function(I){return I instanceof q},is_atom:function(I){return I instanceof q&&I.args.length===0},is_ground:function(I){if(I instanceof Se)return!1;if(I instanceof q){for(var P=0;P0},is_list:function(I){return I instanceof q&&(I.indicator==="[]/0"||I.indicator==="./2")},is_empty_list:function(I){return I instanceof q&&I.indicator==="[]/0"},is_non_empty_list:function(I){return I instanceof q&&I.indicator==="./2"},is_fully_list:function(I){for(;I instanceof q&&I.indicator==="./2";)I=I.args[1];return I instanceof Se||I instanceof q&&I.indicator==="[]/0"},is_instantiated_list:function(I){for(;I instanceof q&&I.indicator==="./2";)I=I.args[1];return I instanceof q&&I.indicator==="[]/0"},is_unitary_list:function(I){return I instanceof q&&I.indicator==="./2"&&I.args[1]instanceof q&&I.args[1].indicator==="[]/0"},is_character:function(I){return I instanceof q&&(I.id.length===1||I.id.length>0&&I.id.length<=2&&n(I.id,0)>=65536)},is_character_code:function(I){return I instanceof Re&&!I.is_float&&I.value>=0&&I.value<=1114111},is_byte:function(I){return I instanceof Re&&!I.is_float&&I.value>=0&&I.value<=255},is_operator:function(I){return I instanceof q&&x.arithmetic.evaluation[I.indicator]},is_directive:function(I){return I instanceof q&&x.directive[I.indicator]!==void 0},is_builtin:function(I){return I instanceof q&&x.predicate[I.indicator]!==void 0},is_error:function(I){return I instanceof q&&I.indicator==="throw/1"},is_predicate_indicator:function(I){return I instanceof q&&I.indicator==="//2"&&I.args[0]instanceof q&&I.args[0].args.length===0&&I.args[1]instanceof Re&&I.args[1].is_float===!1},is_flag:function(I){return I instanceof q&&I.args.length===0&&x.flag[I.id]!==void 0},is_value_flag:function(I,P){if(!x.type.is_flag(I))return!1;for(var y in x.flag[I.id].allowed)if(x.flag[I.id].allowed.hasOwnProperty(y)&&x.flag[I.id].allowed[y].equals(P))return!0;return!1},is_io_mode:function(I){return x.type.is_atom(I)&&["read","write","append"].indexOf(I.id)!==-1},is_stream_option:function(I){return x.type.is_term(I)&&(I.indicator==="alias/1"&&x.type.is_atom(I.args[0])||I.indicator==="reposition/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")||I.indicator==="type/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="text"||I.args[0].id==="binary")||I.indicator==="eof_action/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="error"||I.args[0].id==="eof_code"||I.args[0].id==="reset"))},is_stream_position:function(I){return x.type.is_integer(I)&&I.value>=0||x.type.is_atom(I)&&(I.id==="end_of_stream"||I.id==="past_end_of_stream")},is_stream_property:function(I){return x.type.is_term(I)&&(I.indicator==="input/0"||I.indicator==="output/0"||I.indicator==="alias/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0]))||I.indicator==="file_name/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0]))||I.indicator==="position/1"&&(x.type.is_variable(I.args[0])||x.type.is_stream_position(I.args[0]))||I.indicator==="reposition/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false"))||I.indicator==="type/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="text"||I.args[0].id==="binary"))||I.indicator==="mode/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="read"||I.args[0].id==="write"||I.args[0].id==="append"))||I.indicator==="eof_action/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="error"||I.args[0].id==="eof_code"||I.args[0].id==="reset"))||I.indicator==="end_of_stream/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="at"||I.args[0].id==="past"||I.args[0].id==="not")))},is_streamable:function(I){return I.__proto__.stream!==void 0},is_read_option:function(I){return x.type.is_term(I)&&["variables/1","variable_names/1","singletons/1"].indexOf(I.indicator)!==-1},is_write_option:function(I){return x.type.is_term(I)&&(I.indicator==="quoted/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")||I.indicator==="ignore_ops/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")||I.indicator==="numbervars/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false"))},is_close_option:function(I){return x.type.is_term(I)&&I.indicator==="force/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")},is_modifiable_flag:function(I){return x.type.is_flag(I)&&x.flag[I.id].changeable},is_module:function(I){return I instanceof q&&I.indicator==="library/1"&&I.args[0]instanceof q&&I.args[0].args.length===0&&x.module[I.args[0].id]!==void 0}},arithmetic:{evaluation:{"e/0":{type_args:null,type_result:!0,fn:function(I){return Math.E}},"pi/0":{type_args:null,type_result:!0,fn:function(I){return Math.PI}},"tau/0":{type_args:null,type_result:!0,fn:function(I){return 2*Math.PI}},"epsilon/0":{type_args:null,type_result:!0,fn:function(I){return Number.EPSILON}},"+/1":{type_args:null,type_result:null,fn:function(I,P){return I}},"-/1":{type_args:null,type_result:null,fn:function(I,P){return-I}},"\\/1":{type_args:!1,type_result:!1,fn:function(I,P){return~I}},"abs/1":{type_args:null,type_result:null,fn:function(I,P){return Math.abs(I)}},"sign/1":{type_args:null,type_result:null,fn:function(I,P){return Math.sign(I)}},"float_integer_part/1":{type_args:!0,type_result:!1,fn:function(I,P){return parseInt(I)}},"float_fractional_part/1":{type_args:!0,type_result:!0,fn:function(I,P){return I-parseInt(I)}},"float/1":{type_args:null,type_result:!0,fn:function(I,P){return parseFloat(I)}},"floor/1":{type_args:!0,type_result:!1,fn:function(I,P){return Math.floor(I)}},"truncate/1":{type_args:!0,type_result:!1,fn:function(I,P){return parseInt(I)}},"round/1":{type_args:!0,type_result:!1,fn:function(I,P){return Math.round(I)}},"ceiling/1":{type_args:!0,type_result:!1,fn:function(I,P){return Math.ceil(I)}},"sin/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.sin(I)}},"cos/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.cos(I)}},"tan/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.tan(I)}},"asin/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.asin(I)}},"acos/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.acos(I)}},"atan/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.atan(I)}},"atan2/2":{type_args:null,type_result:!0,fn:function(I,P,y){return Math.atan2(I,P)}},"exp/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.exp(I)}},"sqrt/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.sqrt(I)}},"log/1":{type_args:null,type_result:!0,fn:function(I,P){return I>0?Math.log(I):x.error.evaluation("undefined",P.__call_indicator)}},"+/2":{type_args:null,type_result:null,fn:function(I,P,y){return I+P}},"-/2":{type_args:null,type_result:null,fn:function(I,P,y){return I-P}},"*/2":{type_args:null,type_result:null,fn:function(I,P,y){return I*P}},"//2":{type_args:null,type_result:!0,fn:function(I,P,y){return P?I/P:x.error.evaluation("zero_division",y.__call_indicator)}},"///2":{type_args:!1,type_result:!1,fn:function(I,P,y){return P?parseInt(I/P):x.error.evaluation("zero_division",y.__call_indicator)}},"**/2":{type_args:null,type_result:!0,fn:function(I,P,y){return Math.pow(I,P)}},"^/2":{type_args:null,type_result:null,fn:function(I,P,y){return Math.pow(I,P)}},"<>/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I>>P}},"/\\/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I&P}},"\\//2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I|P}},"xor/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I^P}},"rem/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return P?I%P:x.error.evaluation("zero_division",y.__call_indicator)}},"mod/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return P?I-parseInt(I/P)*P:x.error.evaluation("zero_division",y.__call_indicator)}},"max/2":{type_args:null,type_result:null,fn:function(I,P,y){return Math.max(I,P)}},"min/2":{type_args:null,type_result:null,fn:function(I,P,y){return Math.min(I,P)}}}},directive:{"dynamic/1":function(I,P){var y=P.args[0];if(x.type.is_variable(y))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_compound(y)||y.indicator!=="//2")I.throw_error(x.error.type("predicate_indicator",y,P.indicator));else if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_atom(y.args[0]))I.throw_error(x.error.type("atom",y.args[0],P.indicator));else if(!x.type.is_integer(y.args[1]))I.throw_error(x.error.type("integer",y.args[1],P.indicator));else{var R=P.args[0].args[0].id+"/"+P.args[0].args[1].value;I.session.public_predicates[R]=!0,I.session.rules[R]||(I.session.rules[R]=[])}},"multifile/1":function(I,P){var y=P.args[0];x.type.is_variable(y)?I.throw_error(x.error.instantiation(P.indicator)):!x.type.is_compound(y)||y.indicator!=="//2"?I.throw_error(x.error.type("predicate_indicator",y,P.indicator)):x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1])?I.throw_error(x.error.instantiation(P.indicator)):x.type.is_atom(y.args[0])?x.type.is_integer(y.args[1])?I.session.multifile_predicates[P.args[0].args[0].id+"/"+P.args[0].args[1].value]=!0:I.throw_error(x.error.type("integer",y.args[1],P.indicator)):I.throw_error(x.error.type("atom",y.args[0],P.indicator))},"set_prolog_flag/2":function(I,P){var y=P.args[0],R=P.args[1];x.type.is_variable(y)||x.type.is_variable(R)?I.throw_error(x.error.instantiation(P.indicator)):x.type.is_atom(y)?x.type.is_flag(y)?x.type.is_value_flag(y,R)?x.type.is_modifiable_flag(y)?I.session.flag[y.id]=R:I.throw_error(x.error.permission("modify","flag",y)):I.throw_error(x.error.domain("flag_value",new q("+",[y,R]),P.indicator)):I.throw_error(x.error.domain("prolog_flag",y,P.indicator)):I.throw_error(x.error.type("atom",y,P.indicator))},"use_module/1":function(I,P){var y=P.args[0];if(x.type.is_variable(y))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_term(y))I.throw_error(x.error.type("term",y,P.indicator));else if(x.type.is_module(y)){var R=y.args[0].id;e(I.session.modules,R)===-1&&I.session.modules.push(R)}},"char_conversion/2":function(I,P){var y=P.args[0],R=P.args[1];x.type.is_variable(y)||x.type.is_variable(R)?I.throw_error(x.error.instantiation(P.indicator)):x.type.is_character(y)?x.type.is_character(R)?y.id===R.id?delete I.session.__char_conversion[y.id]:I.session.__char_conversion[y.id]=R.id:I.throw_error(x.error.type("character",R,P.indicator)):I.throw_error(x.error.type("character",y,P.indicator))},"op/3":function(I,P){var y=P.args[0],R=P.args[1],z=P.args[2];if(x.type.is_variable(y)||x.type.is_variable(R)||x.type.is_variable(z))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_integer(y))I.throw_error(x.error.type("integer",y,P.indicator));else if(!x.type.is_atom(R))I.throw_error(x.error.type("atom",R,P.indicator));else if(!x.type.is_atom(z))I.throw_error(x.error.type("atom",z,P.indicator));else if(y.value<0||y.value>1200)I.throw_error(x.error.domain("operator_priority",y,P.indicator));else if(z.id===",")I.throw_error(x.error.permission("modify","operator",z,P.indicator));else if(z.id==="|"&&(y.value<1001||R.id.length!==3))I.throw_error(x.error.permission("modify","operator",z,P.indicator));else if(["fy","fx","yf","xf","xfx","yfx","xfy"].indexOf(R.id)===-1)I.throw_error(x.error.domain("operator_specifier",R,P.indicator));else{var X={prefix:null,infix:null,postfix:null};for(var $ in I.session.__operators)if(I.session.__operators.hasOwnProperty($)){var se=I.session.__operators[$][z.id];se&&(e(se,"fx")!==-1&&(X.prefix={priority:$,type:"fx"}),e(se,"fy")!==-1&&(X.prefix={priority:$,type:"fy"}),e(se,"xf")!==-1&&(X.postfix={priority:$,type:"xf"}),e(se,"yf")!==-1&&(X.postfix={priority:$,type:"yf"}),e(se,"xfx")!==-1&&(X.infix={priority:$,type:"xfx"}),e(se,"xfy")!==-1&&(X.infix={priority:$,type:"xfy"}),e(se,"yfx")!==-1&&(X.infix={priority:$,type:"yfx"}))}var be;switch(R.id){case"fy":case"fx":be="prefix";break;case"yf":case"xf":be="postfix";break;default:be="infix";break}if(((X.prefix&&be==="prefix"||X.postfix&&be==="postfix"||X.infix&&be==="infix")&&X[be].type!==R.id||X.infix&&be==="postfix"||X.postfix&&be==="infix")&&y.value!==0)I.throw_error(x.error.permission("create","operator",z,P.indicator));else return X[be]&&(me(I.session.__operators[X[be].priority][z.id],R.id),I.session.__operators[X[be].priority][z.id].length===0&&delete I.session.__operators[X[be].priority][z.id]),y.value>0&&(I.session.__operators[y.value]||(I.session.__operators[y.value.toString()]={}),I.session.__operators[y.value][z.id]||(I.session.__operators[y.value][z.id]=[]),I.session.__operators[y.value][z.id].push(R.id)),!0}}},predicate:{"op/3":function(I,P,y){x.directive["op/3"](I,y)&&I.success(P)},"current_op/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2],$=[];for(var se in I.session.__operators)for(var be in I.session.__operators[se])for(var Fe=0;Fe/2"){var R=I.points,z=I.session.format_success,X=I.session.format_error;I.session.format_success=function(Fe){return Fe.substitution},I.session.format_error=function(Fe){return Fe.goal},I.points=[new ke(y.args[0].args[0],P.substitution,P)];var $=function(Fe){I.points=R,I.session.format_success=z,I.session.format_error=X,Fe===!1?I.prepend([new ke(P.goal.replace(y.args[1]),P.substitution,P)]):x.type.is_error(Fe)?I.throw_error(Fe.args[0]):Fe===null?(I.prepend([P]),I.__calls.shift()(null)):I.prepend([new ke(P.goal.replace(y.args[0].args[1]).apply(Fe),P.substitution.apply(Fe),P)])};I.__calls.unshift($)}else{var se=new ke(P.goal.replace(y.args[0]),P.substitution,P),be=new ke(P.goal.replace(y.args[1]),P.substitution,P);I.prepend([se,be])}},"!/0":function(I,P,y){var R,z,X=[];for(R=P,z=null;R.parent!==null&&R.parent.goal.search(y);)if(z=R,R=R.parent,R.goal!==null){var $=R.goal.select();if($&&$.id==="call"&&$.search(y)){R=z;break}}for(var se=I.points.length-1;se>=0;se--){for(var be=I.points[se],Fe=be.parent;Fe!==null&&Fe!==R.parent;)Fe=Fe.parent;Fe===null&&Fe!==R.parent&&X.push(be)}I.points=X.reverse(),I.success(P)},"\\+/1":function(I,P,y){var R=y.args[0];x.type.is_variable(R)?I.throw_error(x.error.instantiation(I.level)):x.type.is_callable(R)?I.prepend([new ke(P.goal.replace(new q(",",[new q(",",[new q("call",[R]),new q("!",[])]),new q("fail",[])])),P.substitution,P),new ke(P.goal.replace(null),P.substitution,P)]):I.throw_error(x.error.type("callable",R,I.level))},"->/2":function(I,P,y){var R=P.goal.replace(new q(",",[y.args[0],new q(",",[new q("!"),y.args[1]])]));I.prepend([new ke(R,P.substitution,P)])},"fail/0":function(I,P,y){},"false/0":function(I,P,y){},"true/0":function(I,P,y){I.success(P)},"call/1":ie(1),"call/2":ie(2),"call/3":ie(3),"call/4":ie(4),"call/5":ie(5),"call/6":ie(6),"call/7":ie(7),"call/8":ie(8),"once/1":function(I,P,y){var R=y.args[0];I.prepend([new ke(P.goal.replace(new q(",",[new q("call",[R]),new q("!",[])])),P.substitution,P)])},"forall/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q("\\+",[new q(",",[new q("call",[R]),new q("\\+",[new q("call",[z])])])])),P.substitution,P)])},"repeat/0":function(I,P,y){I.prepend([new ke(P.goal.replace(null),P.substitution,P),P])},"throw/1":function(I,P,y){x.type.is_variable(y.args[0])?I.throw_error(x.error.instantiation(I.level)):I.throw_error(y.args[0])},"catch/3":function(I,P,y){var R=I.points;I.points=[],I.prepend([new ke(y.args[0],P.substitution,P)]);var z=I.session.format_success,X=I.session.format_error;I.session.format_success=function(se){return se.substitution},I.session.format_error=function(se){return se.goal};var $=function(se){var be=I.points;if(I.points=R,I.session.format_success=z,I.session.format_error=X,x.type.is_error(se)){for(var Fe=[],lt=I.points.length-1;lt>=0;lt--){for(var nr=I.points[lt],Et=nr.parent;Et!==null&&Et!==P.parent;)Et=Et.parent;Et===null&&Et!==P.parent&&Fe.push(nr)}I.points=Fe;var qt=I.get_flag("occurs_check").indicator==="true/0",nr=new ke,Pt=x.unify(se.args[0],y.args[1],qt);Pt!==null?(nr.substitution=P.substitution.apply(Pt),nr.goal=P.goal.replace(y.args[2]).apply(Pt),nr.parent=P,I.prepend([nr])):I.throw_error(se.args[0])}else if(se!==!1){for(var cn=se===null?[]:[new ke(P.goal.apply(se).replace(null),P.substitution.apply(se),P)],Sr=[],lt=be.length-1;lt>=0;lt--){Sr.push(be[lt]);var yr=be[lt].goal!==null?be[lt].goal.select():null;if(x.type.is_term(yr)&&yr.indicator==="!/0")break}var Rr=o(Sr,function(Xr){return Xr.goal===null&&(Xr.goal=new q("true",[])),Xr=new ke(P.goal.replace(new q("catch",[Xr.goal,y.args[1],y.args[2]])),P.substitution.apply(Xr.substitution),Xr.parent),Xr.exclude=y.args[0].variables(),Xr}).reverse();I.prepend(Rr),I.prepend(cn),se===null&&(this.current_limit=0,I.__calls.shift()(null))}};I.__calls.unshift($)},"=/2":function(I,P,y){var R=I.get_flag("occurs_check").indicator==="true/0",z=new ke,X=x.unify(y.args[0],y.args[1],R);X!==null&&(z.goal=P.goal.apply(X).replace(null),z.substitution=P.substitution.apply(X),z.parent=P,I.prepend([z]))},"unify_with_occurs_check/2":function(I,P,y){var R=new ke,z=x.unify(y.args[0],y.args[1],!0);z!==null&&(R.goal=P.goal.apply(z).replace(null),R.substitution=P.substitution.apply(z),R.parent=P,I.prepend([R]))},"\\=/2":function(I,P,y){var R=I.get_flag("occurs_check").indicator==="true/0",z=x.unify(y.args[0],y.args[1],R);z===null&&I.success(P)},"subsumes_term/2":function(I,P,y){var R=I.get_flag("occurs_check").indicator==="true/0",z=x.unify(y.args[1],y.args[0],R);z!==null&&y.args[1].apply(z).equals(y.args[1])&&I.success(P)},"findall/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(z))I.throw_error(x.error.type("callable",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else{var $=I.next_free_variable(),se=new q(",",[z,new q("=",[$,R])]),be=I.points,Fe=I.session.limit,lt=I.session.format_success;I.session.format_success=function(nr){return nr.substitution},I.add_goal(se,!0,P);var Et=[],qt=function(nr){if(nr!==!1&&nr!==null&&!x.type.is_error(nr))I.__calls.unshift(qt),Et.push(nr.links[$.id]),I.session.limit=I.current_limit;else if(I.points=be,I.session.limit=Fe,I.session.format_success=lt,x.type.is_error(nr))I.throw_error(nr.args[0]);else if(I.current_limit>0){for(var Pt=new q("[]"),cn=Et.length-1;cn>=0;cn--)Pt=new q(".",[Et[cn],Pt]);I.prepend([new ke(P.goal.replace(new q("=",[X,Pt])),P.substitution,P)])}};I.__calls.unshift(qt)}},"bagof/3":function(I,P,y){var R,z=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(X))I.throw_error(x.error.type("callable",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_list($))I.throw_error(x.error.type("list",$,y.indicator));else{var se=I.next_free_variable(),be;X.indicator==="^/2"?(be=X.args[0].variables(),X=X.args[1]):be=[],be=be.concat(z.variables());for(var Fe=X.variables().filter(function(Rr){return e(be,Rr)===-1}),lt=new q("[]"),Et=Fe.length-1;Et>=0;Et--)lt=new q(".",[new Se(Fe[Et]),lt]);var qt=new q(",",[X,new q("=",[se,new q(",",[lt,z])])]),nr=I.points,Pt=I.session.limit,cn=I.session.format_success;I.session.format_success=function(Rr){return Rr.substitution},I.add_goal(qt,!0,P);var Sr=[],yr=function(Rr){if(Rr!==!1&&Rr!==null&&!x.type.is_error(Rr)){I.__calls.unshift(yr);var Xr=!1,$n=Rr.links[se.id].args[0],Xs=Rr.links[se.id].args[1];for(var Hi in Sr)if(Sr.hasOwnProperty(Hi)){var Qs=Sr[Hi];if(Qs.variables.equals($n)){Qs.answers.push(Xs),Xr=!0;break}}Xr||Sr.push({variables:$n,answers:[Xs]}),I.session.limit=I.current_limit}else if(I.points=nr,I.session.limit=Pt,I.session.format_success=cn,x.type.is_error(Rr))I.throw_error(Rr.args[0]);else if(I.current_limit>0){for(var Zs=[],bi=0;bi=0;$s--)Fs=new q(".",[Rr[$s],Fs]);Zs.push(new ke(P.goal.replace(new q(",",[new q("=",[lt,Sr[bi].variables]),new q("=",[$,Fs])])),P.substitution,P))}I.prepend(Zs)}};I.__calls.unshift(yr)}},"setof/3":function(I,P,y){var R,z=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(X))I.throw_error(x.error.type("callable",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_list($))I.throw_error(x.error.type("list",$,y.indicator));else{var se=I.next_free_variable(),be;X.indicator==="^/2"?(be=X.args[0].variables(),X=X.args[1]):be=[],be=be.concat(z.variables());for(var Fe=X.variables().filter(function(Rr){return e(be,Rr)===-1}),lt=new q("[]"),Et=Fe.length-1;Et>=0;Et--)lt=new q(".",[new Se(Fe[Et]),lt]);var qt=new q(",",[X,new q("=",[se,new q(",",[lt,z])])]),nr=I.points,Pt=I.session.limit,cn=I.session.format_success;I.session.format_success=function(Rr){return Rr.substitution},I.add_goal(qt,!0,P);var Sr=[],yr=function(Rr){if(Rr!==!1&&Rr!==null&&!x.type.is_error(Rr)){I.__calls.unshift(yr);var Xr=!1,$n=Rr.links[se.id].args[0],Xs=Rr.links[se.id].args[1];for(var Hi in Sr)if(Sr.hasOwnProperty(Hi)){var Qs=Sr[Hi];if(Qs.variables.equals($n)){Qs.answers.push(Xs),Xr=!0;break}}Xr||Sr.push({variables:$n,answers:[Xs]}),I.session.limit=I.current_limit}else if(I.points=nr,I.session.limit=Pt,I.session.format_success=cn,x.type.is_error(Rr))I.throw_error(Rr.args[0]);else if(I.current_limit>0){for(var Zs=[],bi=0;bi=0;$s--)Fs=new q(".",[Rr[$s],Fs]);Zs.push(new ke(P.goal.replace(new q(",",[new q("=",[lt,Sr[bi].variables]),new q("=",[$,Fs])])),P.substitution,P))}I.prepend(Zs)}};I.__calls.unshift(yr)}},"functor/3":function(I,P,y){var R,z=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(z)&&(x.type.is_variable(X)||x.type.is_variable($)))I.throw_error(x.error.instantiation("functor/3"));else if(!x.type.is_variable($)&&!x.type.is_integer($))I.throw_error(x.error.type("integer",y.args[2],"functor/3"));else if(!x.type.is_variable(X)&&!x.type.is_atomic(X))I.throw_error(x.error.type("atomic",y.args[1],"functor/3"));else if(x.type.is_integer(X)&&x.type.is_integer($)&&$.value!==0)I.throw_error(x.error.type("atom",y.args[1],"functor/3"));else if(x.type.is_variable(z)){if(y.args[2].value>=0){for(var se=[],be=0;be<$.value;be++)se.push(I.next_free_variable());var Fe=x.type.is_integer(X)?X:new q(X.id,se);I.prepend([new ke(P.goal.replace(new q("=",[z,Fe])),P.substitution,P)])}}else{var lt=x.type.is_integer(z)?z:new q(z.id,[]),Et=x.type.is_integer(z)?new Re(0,!1):new Re(z.args.length,!1),qt=new q(",",[new q("=",[lt,X]),new q("=",[Et,$])]);I.prepend([new ke(P.goal.replace(qt),P.substitution,P)])}},"arg/3":function(I,P,y){if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))I.throw_error(x.error.instantiation(y.indicator));else if(y.args[0].value<0)I.throw_error(x.error.domain("not_less_than_zero",y.args[0],y.indicator));else if(!x.type.is_compound(y.args[1]))I.throw_error(x.error.type("compound",y.args[1],y.indicator));else{var R=y.args[0].value;if(R>0&&R<=y.args[1].args.length){var z=new q("=",[y.args[1].args[R-1],y.args[2]]);I.prepend([new ke(P.goal.replace(z),P.substitution,P)])}}},"=../2":function(I,P,y){var R;if(x.type.is_variable(y.args[0])&&(x.type.is_variable(y.args[1])||x.type.is_non_empty_list(y.args[1])&&x.type.is_variable(y.args[1].args[0])))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_fully_list(y.args[1]))I.throw_error(x.error.type("list",y.args[1],y.indicator));else if(x.type.is_variable(y.args[0])){if(!x.type.is_variable(y.args[1])){var X=[];for(R=y.args[1].args[1];R.indicator==="./2";)X.push(R.args[0]),R=R.args[1];x.type.is_variable(y.args[0])&&x.type.is_variable(R)?I.throw_error(x.error.instantiation(y.indicator)):X.length===0&&x.type.is_compound(y.args[1].args[0])?I.throw_error(x.error.type("atomic",y.args[1].args[0],y.indicator)):X.length>0&&(x.type.is_compound(y.args[1].args[0])||x.type.is_number(y.args[1].args[0]))?I.throw_error(x.error.type("atom",y.args[1].args[0],y.indicator)):X.length===0?I.prepend([new ke(P.goal.replace(new q("=",[y.args[1].args[0],y.args[0]],P)),P.substitution,P)]):I.prepend([new ke(P.goal.replace(new q("=",[new q(y.args[1].args[0].id,X),y.args[0]])),P.substitution,P)])}}else{if(x.type.is_atomic(y.args[0]))R=new q(".",[y.args[0],new q("[]")]);else{R=new q("[]");for(var z=y.args[0].args.length-1;z>=0;z--)R=new q(".",[y.args[0].args[z],R]);R=new q(".",[new q(y.args[0].id),R])}I.prepend([new ke(P.goal.replace(new q("=",[R,y.args[1]])),P.substitution,P)])}},"copy_term/2":function(I,P,y){var R=y.args[0].rename(I);I.prepend([new ke(P.goal.replace(new q("=",[R,y.args[1]])),P.substitution,P.parent)])},"term_variables/2":function(I,P,y){var R=y.args[0],z=y.args[1];if(!x.type.is_fully_list(z))I.throw_error(x.error.type("list",z,y.indicator));else{var X=g(o(Ce(R.variables()),function($){return new Se($)}));I.prepend([new ke(P.goal.replace(new q("=",[z,X])),P.substitution,P)])}},"clause/2":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_callable(y.args[1]))I.throw_error(x.error.type("callable",y.args[1],y.indicator));else if(I.session.rules[y.args[0].indicator]!==void 0)if(I.is_public_predicate(y.args[0].indicator)){var R=[];for(var z in I.session.rules[y.args[0].indicator])if(I.session.rules[y.args[0].indicator].hasOwnProperty(z)){var X=I.session.rules[y.args[0].indicator][z];I.session.renamed_variables={},X=X.rename(I),X.body===null&&(X.body=new q("true"));var $=new q(",",[new q("=",[X.head,y.args[0]]),new q("=",[X.body,y.args[1]])]);R.push(new ke(P.goal.replace($),P.substitution,P))}I.prepend(R)}else I.throw_error(x.error.permission("access","private_procedure",y.args[0].indicator,y.indicator))},"current_predicate/1":function(I,P,y){var R=y.args[0];if(!x.type.is_variable(R)&&(!x.type.is_compound(R)||R.indicator!=="//2"))I.throw_error(x.error.type("predicate_indicator",R,y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_variable(R.args[0])&&!x.type.is_atom(R.args[0]))I.throw_error(x.error.type("atom",R.args[0],y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_variable(R.args[1])&&!x.type.is_integer(R.args[1]))I.throw_error(x.error.type("integer",R.args[1],y.indicator));else{var z=[];for(var X in I.session.rules)if(I.session.rules.hasOwnProperty(X)){var $=X.lastIndexOf("/"),se=X.substr(0,$),be=parseInt(X.substr($+1,X.length-($+1))),Fe=new q("/",[new q(se),new Re(be,!1)]),lt=new q("=",[Fe,R]);z.push(new ke(P.goal.replace(lt),P.substitution,P))}I.prepend(z)}},"asserta/1":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var R,z;y.args[0].indicator===":-/2"?(R=y.args[0].args[0],z=Ee(y.args[0].args[1])):(R=y.args[0],z=null),x.type.is_callable(R)?z!==null&&!x.type.is_callable(z)?I.throw_error(x.error.type("callable",z,y.indicator)):I.is_public_predicate(R.indicator)?(I.session.rules[R.indicator]===void 0&&(I.session.rules[R.indicator]=[]),I.session.public_predicates[R.indicator]=!0,I.session.rules[R.indicator]=[new Ke(R,z,!0)].concat(I.session.rules[R.indicator]),I.success(P)):I.throw_error(x.error.permission("modify","static_procedure",R.indicator,y.indicator)):I.throw_error(x.error.type("callable",R,y.indicator))}},"assertz/1":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var R,z;y.args[0].indicator===":-/2"?(R=y.args[0].args[0],z=Ee(y.args[0].args[1])):(R=y.args[0],z=null),x.type.is_callable(R)?z!==null&&!x.type.is_callable(z)?I.throw_error(x.error.type("callable",z,y.indicator)):I.is_public_predicate(R.indicator)?(I.session.rules[R.indicator]===void 0&&(I.session.rules[R.indicator]=[]),I.session.public_predicates[R.indicator]=!0,I.session.rules[R.indicator].push(new Ke(R,z,!0)),I.success(P)):I.throw_error(x.error.permission("modify","static_procedure",R.indicator,y.indicator)):I.throw_error(x.error.type("callable",R,y.indicator))}},"retract/1":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var R,z;if(y.args[0].indicator===":-/2"?(R=y.args[0].args[0],z=y.args[0].args[1]):(R=y.args[0],z=new q("true")),typeof P.retract>"u")if(I.is_public_predicate(R.indicator)){if(I.session.rules[R.indicator]!==void 0){for(var X=[],$=0;$I.get_flag("max_arity").value)I.throw_error(x.error.representation("max_arity",y.indicator));else{var R=y.args[0].args[0].id+"/"+y.args[0].args[1].value;I.is_public_predicate(R)?(delete I.session.rules[R],I.success(P)):I.throw_error(x.error.permission("modify","static_procedure",R,y.indicator))}},"atom_length/2":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_atom(y.args[0]))I.throw_error(x.error.type("atom",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_integer(y.args[1]))I.throw_error(x.error.type("integer",y.args[1],y.indicator));else if(x.type.is_integer(y.args[1])&&y.args[1].value<0)I.throw_error(x.error.domain("not_less_than_zero",y.args[1],y.indicator));else{var R=new Re(y.args[0].id.length,!1);I.prepend([new ke(P.goal.replace(new q("=",[R,y.args[1]])),P.substitution,P)])}},"atom_concat/3":function(I,P,y){var R,z,X=y.args[0],$=y.args[1],se=y.args[2];if(x.type.is_variable(se)&&(x.type.is_variable(X)||x.type.is_variable($)))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_atom(X))I.throw_error(x.error.type("atom",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_atom($))I.throw_error(x.error.type("atom",$,y.indicator));else if(!x.type.is_variable(se)&&!x.type.is_atom(se))I.throw_error(x.error.type("atom",se,y.indicator));else{var be=x.type.is_variable(X),Fe=x.type.is_variable($);if(!be&&!Fe)z=new q("=",[se,new q(X.id+$.id)]),I.prepend([new ke(P.goal.replace(z),P.substitution,P)]);else if(be&&!Fe)R=se.id.substr(0,se.id.length-$.id.length),R+$.id===se.id&&(z=new q("=",[X,new q(R)]),I.prepend([new ke(P.goal.replace(z),P.substitution,P)]));else if(Fe&&!be)R=se.id.substr(X.id.length),X.id+R===se.id&&(z=new q("=",[$,new q(R)]),I.prepend([new ke(P.goal.replace(z),P.substitution,P)]));else{for(var lt=[],Et=0;Et<=se.id.length;Et++){var qt=new q(se.id.substr(0,Et)),nr=new q(se.id.substr(Et));z=new q(",",[new q("=",[qt,X]),new q("=",[nr,$])]),lt.push(new ke(P.goal.replace(z),P.substitution,P))}I.prepend(lt)}}},"sub_atom/5":function(I,P,y){var R,z=y.args[0],X=y.args[1],$=y.args[2],se=y.args[3],be=y.args[4];if(x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_integer(X))I.throw_error(x.error.type("integer",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_integer($))I.throw_error(x.error.type("integer",$,y.indicator));else if(!x.type.is_variable(se)&&!x.type.is_integer(se))I.throw_error(x.error.type("integer",se,y.indicator));else if(x.type.is_integer(X)&&X.value<0)I.throw_error(x.error.domain("not_less_than_zero",X,y.indicator));else if(x.type.is_integer($)&&$.value<0)I.throw_error(x.error.domain("not_less_than_zero",$,y.indicator));else if(x.type.is_integer(se)&&se.value<0)I.throw_error(x.error.domain("not_less_than_zero",se,y.indicator));else{var Fe=[],lt=[],Et=[];if(x.type.is_variable(X))for(R=0;R<=z.id.length;R++)Fe.push(R);else Fe.push(X.value);if(x.type.is_variable($))for(R=0;R<=z.id.length;R++)lt.push(R);else lt.push($.value);if(x.type.is_variable(se))for(R=0;R<=z.id.length;R++)Et.push(R);else Et.push(se.value);var qt=[];for(var nr in Fe)if(Fe.hasOwnProperty(nr)){R=Fe[nr];for(var Pt in lt)if(lt.hasOwnProperty(Pt)){var cn=lt[Pt],Sr=z.id.length-R-cn;if(e(Et,Sr)!==-1&&R+cn+Sr===z.id.length){var yr=z.id.substr(R,cn);if(z.id===z.id.substr(0,R)+yr+z.id.substr(R+cn,Sr)){var Rr=new q("=",[new q(yr),be]),Xr=new q("=",[X,new Re(R)]),$n=new q("=",[$,new Re(cn)]),Xs=new q("=",[se,new Re(Sr)]),Hi=new q(",",[new q(",",[new q(",",[Xr,$n]),Xs]),Rr]);qt.push(new ke(P.goal.replace(Hi),P.substitution,P))}}}}I.prepend(qt)}},"atom_chars/2":function(I,P,y){var R=y.args[0],z=y.args[1];if(x.type.is_variable(R)&&x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_atom(R))I.throw_error(x.error.type("atom",R,y.indicator));else if(x.type.is_variable(R)){for(var se=z,be=x.type.is_variable(R),Fe="";se.indicator==="./2";){if(x.type.is_character(se.args[0]))Fe+=se.args[0].id;else if(x.type.is_variable(se.args[0])&&be){I.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(se.args[0])){I.throw_error(x.error.type("character",se.args[0],y.indicator));return}se=se.args[1]}x.type.is_variable(se)&&be?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(se)&&!x.type.is_variable(se)?I.throw_error(x.error.type("list",z,y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[new q(Fe),R])),P.substitution,P)])}else{for(var X=new q("[]"),$=R.id.length-1;$>=0;$--)X=new q(".",[new q(R.id.charAt($)),X]);I.prepend([new ke(P.goal.replace(new q("=",[z,X])),P.substitution,P)])}},"atom_codes/2":function(I,P,y){var R=y.args[0],z=y.args[1];if(x.type.is_variable(R)&&x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_atom(R))I.throw_error(x.error.type("atom",R,y.indicator));else if(x.type.is_variable(R)){for(var se=z,be=x.type.is_variable(R),Fe="";se.indicator==="./2";){if(x.type.is_character_code(se.args[0]))Fe+=u(se.args[0].value);else if(x.type.is_variable(se.args[0])&&be){I.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(se.args[0])){I.throw_error(x.error.representation("character_code",y.indicator));return}se=se.args[1]}x.type.is_variable(se)&&be?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(se)&&!x.type.is_variable(se)?I.throw_error(x.error.type("list",z,y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[new q(Fe),R])),P.substitution,P)])}else{for(var X=new q("[]"),$=R.id.length-1;$>=0;$--)X=new q(".",[new Re(n(R.id,$),!1),X]);I.prepend([new ke(P.goal.replace(new q("=",[z,X])),P.substitution,P)])}},"char_code/2":function(I,P,y){var R=y.args[0],z=y.args[1];if(x.type.is_variable(R)&&x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_character(R))I.throw_error(x.error.type("character",R,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_integer(z))I.throw_error(x.error.type("integer",z,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_character_code(z))I.throw_error(x.error.representation("character_code",y.indicator));else if(x.type.is_variable(z)){var X=new Re(n(R.id,0),!1);I.prepend([new ke(P.goal.replace(new q("=",[X,z])),P.substitution,P)])}else{var $=new q(u(z.value));I.prepend([new ke(P.goal.replace(new q("=",[$,R])),P.substitution,P)])}},"number_chars/2":function(I,P,y){var R,z=y.args[0],X=y.args[1];if(x.type.is_variable(z)&&x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_number(z))I.throw_error(x.error.type("number",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else{var $=x.type.is_variable(z);if(!x.type.is_variable(X)){var se=X,be=!0;for(R="";se.indicator==="./2";){if(x.type.is_character(se.args[0]))R+=se.args[0].id;else if(x.type.is_variable(se.args[0]))be=!1;else if(!x.type.is_variable(se.args[0])){I.throw_error(x.error.type("character",se.args[0],y.indicator));return}se=se.args[1]}if(be=be&&x.type.is_empty_list(se),!x.type.is_empty_list(se)&&!x.type.is_variable(se)){I.throw_error(x.error.type("list",X,y.indicator));return}if(!be&&$){I.throw_error(x.error.instantiation(y.indicator));return}else if(be)if(x.type.is_variable(se)&&$){I.throw_error(x.error.instantiation(y.indicator));return}else{var Fe=I.parse(R),lt=Fe.value;!x.type.is_number(lt)||Fe.tokens[Fe.tokens.length-1].space?I.throw_error(x.error.syntax_by_predicate("parseable_number",y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[z,lt])),P.substitution,P)]);return}}if(!$){R=z.toString();for(var Et=new q("[]"),qt=R.length-1;qt>=0;qt--)Et=new q(".",[new q(R.charAt(qt)),Et]);I.prepend([new ke(P.goal.replace(new q("=",[X,Et])),P.substitution,P)])}}},"number_codes/2":function(I,P,y){var R,z=y.args[0],X=y.args[1];if(x.type.is_variable(z)&&x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_number(z))I.throw_error(x.error.type("number",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else{var $=x.type.is_variable(z);if(!x.type.is_variable(X)){var se=X,be=!0;for(R="";se.indicator==="./2";){if(x.type.is_character_code(se.args[0]))R+=u(se.args[0].value);else if(x.type.is_variable(se.args[0]))be=!1;else if(!x.type.is_variable(se.args[0])){I.throw_error(x.error.type("character_code",se.args[0],y.indicator));return}se=se.args[1]}if(be=be&&x.type.is_empty_list(se),!x.type.is_empty_list(se)&&!x.type.is_variable(se)){I.throw_error(x.error.type("list",X,y.indicator));return}if(!be&&$){I.throw_error(x.error.instantiation(y.indicator));return}else if(be)if(x.type.is_variable(se)&&$){I.throw_error(x.error.instantiation(y.indicator));return}else{var Fe=I.parse(R),lt=Fe.value;!x.type.is_number(lt)||Fe.tokens[Fe.tokens.length-1].space?I.throw_error(x.error.syntax_by_predicate("parseable_number",y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[z,lt])),P.substitution,P)]);return}}if(!$){R=z.toString();for(var Et=new q("[]"),qt=R.length-1;qt>=0;qt--)Et=new q(".",[new Re(n(R,qt),!1),Et]);I.prepend([new ke(P.goal.replace(new q("=",[X,Et])),P.substitution,P)])}}},"upcase_atom/2":function(I,P,y){var R=y.args[0],z=y.args[1];x.type.is_variable(R)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(R)?!x.type.is_variable(z)&&!x.type.is_atom(z)?I.throw_error(x.error.type("atom",z,y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[z,new q(R.id.toUpperCase(),[])])),P.substitution,P)]):I.throw_error(x.error.type("atom",R,y.indicator))},"downcase_atom/2":function(I,P,y){var R=y.args[0],z=y.args[1];x.type.is_variable(R)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(R)?!x.type.is_variable(z)&&!x.type.is_atom(z)?I.throw_error(x.error.type("atom",z,y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[z,new q(R.id.toLowerCase(),[])])),P.substitution,P)]):I.throw_error(x.error.type("atom",R,y.indicator))},"atomic_list_concat/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q("atomic_list_concat",[R,new q("",[]),z])),P.substitution,P)])},"atomic_list_concat/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(z)||x.type.is_variable(R)&&x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_list(R))I.throw_error(x.error.type("list",R,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_atom(X))I.throw_error(x.error.type("atom",X,y.indicator));else if(x.type.is_variable(X)){for(var se="",be=R;x.type.is_term(be)&&be.indicator==="./2";){if(!x.type.is_atom(be.args[0])&&!x.type.is_number(be.args[0])){I.throw_error(x.error.type("atomic",be.args[0],y.indicator));return}se!==""&&(se+=z.id),x.type.is_atom(be.args[0])?se+=be.args[0].id:se+=""+be.args[0].value,be=be.args[1]}se=new q(se,[]),x.type.is_variable(be)?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_term(be)||be.indicator!=="[]/0"?I.throw_error(x.error.type("list",R,y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[se,X])),P.substitution,P)])}else{var $=g(o(X.id.split(z.id),function(Fe){return new q(Fe,[])}));I.prepend([new ke(P.goal.replace(new q("=",[$,R])),P.substitution,P)])}},"@=/2":function(I,P,y){x.compare(y.args[0],y.args[1])>0&&I.success(P)},"@>=/2":function(I,P,y){x.compare(y.args[0],y.args[1])>=0&&I.success(P)},"compare/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2];if(!x.type.is_variable(R)&&!x.type.is_atom(R))I.throw_error(x.error.type("atom",R,y.indicator));else if(x.type.is_atom(R)&&["<",">","="].indexOf(R.id)===-1)I.throw_error(x.type.domain("order",R,y.indicator));else{var $=x.compare(z,X);$=$===0?"=":$===-1?"<":">",I.prepend([new ke(P.goal.replace(new q("=",[R,new q($,[])])),P.substitution,P)])}},"is/2":function(I,P,y){var R=y.args[1].interpret(I);x.type.is_number(R)?I.prepend([new ke(P.goal.replace(new q("=",[y.args[0],R],I.level)),P.substitution,P)]):I.throw_error(R)},"between/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(R)||x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_integer(R))I.throw_error(x.error.type("integer",R,y.indicator));else if(!x.type.is_integer(z))I.throw_error(x.error.type("integer",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_integer(X))I.throw_error(x.error.type("integer",X,y.indicator));else if(x.type.is_variable(X)){var $=[new ke(P.goal.replace(new q("=",[X,R])),P.substitution,P)];R.value=X.value&&I.success(P)},"succ/2":function(I,P,y){var R=y.args[0],z=y.args[1];x.type.is_variable(R)&&x.type.is_variable(z)?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_variable(R)&&!x.type.is_integer(R)?I.throw_error(x.error.type("integer",R,y.indicator)):!x.type.is_variable(z)&&!x.type.is_integer(z)?I.throw_error(x.error.type("integer",z,y.indicator)):!x.type.is_variable(R)&&R.value<0?I.throw_error(x.error.domain("not_less_than_zero",R,y.indicator)):!x.type.is_variable(z)&&z.value<0?I.throw_error(x.error.domain("not_less_than_zero",z,y.indicator)):(x.type.is_variable(z)||z.value>0)&&(x.type.is_variable(R)?I.prepend([new ke(P.goal.replace(new q("=",[R,new Re(z.value-1,!1)])),P.substitution,P)]):I.prepend([new ke(P.goal.replace(new q("=",[z,new Re(R.value+1,!1)])),P.substitution,P)]))},"=:=/2":function(I,P,y){var R=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(R)?I.throw_error(R):R===0&&I.success(P)},"=\\=/2":function(I,P,y){var R=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(R)?I.throw_error(R):R!==0&&I.success(P)},"/2":function(I,P,y){var R=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(R)?I.throw_error(R):R>0&&I.success(P)},">=/2":function(I,P,y){var R=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(R)?I.throw_error(R):R>=0&&I.success(P)},"var/1":function(I,P,y){x.type.is_variable(y.args[0])&&I.success(P)},"atom/1":function(I,P,y){x.type.is_atom(y.args[0])&&I.success(P)},"atomic/1":function(I,P,y){x.type.is_atomic(y.args[0])&&I.success(P)},"compound/1":function(I,P,y){x.type.is_compound(y.args[0])&&I.success(P)},"integer/1":function(I,P,y){x.type.is_integer(y.args[0])&&I.success(P)},"float/1":function(I,P,y){x.type.is_float(y.args[0])&&I.success(P)},"number/1":function(I,P,y){x.type.is_number(y.args[0])&&I.success(P)},"nonvar/1":function(I,P,y){x.type.is_variable(y.args[0])||I.success(P)},"ground/1":function(I,P,y){y.variables().length===0&&I.success(P)},"acyclic_term/1":function(I,P,y){for(var R=P.substitution.apply(P.substitution),z=y.args[0].variables(),X=0;X0?Pt[Pt.length-1]:null,Pt!==null&&(qt=J(I,Pt,0,I.__get_max_priority(),!1))}if(qt.type===p&&qt.len===Pt.length-1&&cn.value==="."){qt=qt.value.rename(I);var Sr=new q("=",[z,qt]);if(se.variables){var yr=g(o(Ce(qt.variables()),function(Rr){return new Se(Rr)}));Sr=new q(",",[Sr,new q("=",[se.variables,yr])])}if(se.variable_names){var yr=g(o(Ce(qt.variables()),function(Xr){var $n;for($n in I.session.renamed_variables)if(I.session.renamed_variables.hasOwnProperty($n)&&I.session.renamed_variables[$n]===Xr)break;return new q("=",[new q($n,[]),new Se(Xr)])}));Sr=new q(",",[Sr,new q("=",[se.variable_names,yr])])}if(se.singletons){var yr=g(o(new Ke(qt,null).singleton_variables(),function(Xr){var $n;for($n in I.session.renamed_variables)if(I.session.renamed_variables.hasOwnProperty($n)&&I.session.renamed_variables[$n]===Xr)break;return new q("=",[new q($n,[]),new Se(Xr)])}));Sr=new q(",",[Sr,new q("=",[se.singletons,yr])])}I.prepend([new ke(P.goal.replace(Sr),P.substitution,P)])}else qt.type===p?I.throw_error(x.error.syntax(Pt[qt.len],"unexpected token",!1)):I.throw_error(qt.value)}}},"write/1":function(I,P,y){var R=y.args[0];I.prepend([new ke(P.goal.replace(new q(",",[new q("current_output",[new Se("S")]),new q("write",[new Se("S"),R])])),P.substitution,P)])},"write/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q("write_term",[R,z,new q(".",[new q("quoted",[new q("false",[])]),new q(".",[new q("ignore_ops",[new q("false")]),new q(".",[new q("numbervars",[new q("true")]),new q("[]",[])])])])])),P.substitution,P)])},"writeq/1":function(I,P,y){var R=y.args[0];I.prepend([new ke(P.goal.replace(new q(",",[new q("current_output",[new Se("S")]),new q("writeq",[new Se("S"),R])])),P.substitution,P)])},"writeq/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q("write_term",[R,z,new q(".",[new q("quoted",[new q("true",[])]),new q(".",[new q("ignore_ops",[new q("false")]),new q(".",[new q("numbervars",[new q("true")]),new q("[]",[])])])])])),P.substitution,P)])},"write_canonical/1":function(I,P,y){var R=y.args[0];I.prepend([new ke(P.goal.replace(new q(",",[new q("current_output",[new Se("S")]),new q("write_canonical",[new Se("S"),R])])),P.substitution,P)])},"write_canonical/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q("write_term",[R,z,new q(".",[new q("quoted",[new q("true",[])]),new q(".",[new q("ignore_ops",[new q("true")]),new q(".",[new q("numbervars",[new q("false")]),new q("[]",[])])])])])),P.substitution,P)])},"write_term/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q(",",[new q("current_output",[new Se("S")]),new q("write_term",[new Se("S"),R,z])])),P.substitution,P)])},"write_term/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2],$=x.type.is_stream(R)?R:I.get_stream_by_alias(R.id);if(x.type.is_variable(R)||x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else if(!x.type.is_stream(R)&&!x.type.is_atom(R))I.throw_error(x.error.domain("stream_or_alias",R,y.indicator));else if(!x.type.is_stream($)||$.stream===null)I.throw_error(x.error.existence("stream",R,y.indicator));else if($.input)I.throw_error(x.error.permission("output","stream",R,y.indicator));else if($.type==="binary")I.throw_error(x.error.permission("output","binary_stream",R,y.indicator));else if($.position==="past_end_of_stream"&&$.eof_action==="error")I.throw_error(x.error.permission("output","past_end_of_stream",R,y.indicator));else{for(var se={},be=X,Fe;x.type.is_term(be)&&be.indicator==="./2";){if(Fe=be.args[0],x.type.is_variable(Fe)){I.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_write_option(Fe)){I.throw_error(x.error.domain("write_option",Fe,y.indicator));return}se[Fe.id]=Fe.args[0].id==="true",be=be.args[1]}if(be.indicator!=="[]/0"){x.type.is_variable(be)?I.throw_error(x.error.instantiation(y.indicator)):I.throw_error(x.error.type("list",X,y.indicator));return}else{se.session=I.session;var lt=z.toString(se);$.stream.put(lt,$.position),typeof $.position=="number"&&($.position+=lt.length),I.success(P)}}},"halt/0":function(I,P,y){I.points=[]},"halt/1":function(I,P,y){var R=y.args[0];x.type.is_variable(R)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_integer(R)?I.points=[]:I.throw_error(x.error.type("integer",R,y.indicator))},"current_prolog_flag/2":function(I,P,y){var R=y.args[0],z=y.args[1];if(!x.type.is_variable(R)&&!x.type.is_atom(R))I.throw_error(x.error.type("atom",R,y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_flag(R))I.throw_error(x.error.domain("prolog_flag",R,y.indicator));else{var X=[];for(var $ in x.flag)if(x.flag.hasOwnProperty($)){var se=new q(",",[new q("=",[new q($),R]),new q("=",[I.get_flag($),z])]);X.push(new ke(P.goal.replace(se),P.substitution,P))}I.prepend(X)}},"set_prolog_flag/2":function(I,P,y){var R=y.args[0],z=y.args[1];x.type.is_variable(R)||x.type.is_variable(z)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(R)?x.type.is_flag(R)?x.type.is_value_flag(R,z)?x.type.is_modifiable_flag(R)?(I.session.flag[R.id]=z,I.success(P)):I.throw_error(x.error.permission("modify","flag",R)):I.throw_error(x.error.domain("flag_value",new q("+",[R,z]),y.indicator)):I.throw_error(x.error.domain("prolog_flag",R,y.indicator)):I.throw_error(x.error.type("atom",R,y.indicator))}},flag:{bounded:{allowed:[new q("true"),new q("false")],value:new q("true"),changeable:!1},max_integer:{allowed:[new Re(Number.MAX_SAFE_INTEGER)],value:new Re(Number.MAX_SAFE_INTEGER),changeable:!1},min_integer:{allowed:[new Re(Number.MIN_SAFE_INTEGER)],value:new Re(Number.MIN_SAFE_INTEGER),changeable:!1},integer_rounding_function:{allowed:[new q("down"),new q("toward_zero")],value:new q("toward_zero"),changeable:!1},char_conversion:{allowed:[new q("on"),new q("off")],value:new q("on"),changeable:!0},debug:{allowed:[new q("on"),new q("off")],value:new q("off"),changeable:!0},max_arity:{allowed:[new q("unbounded")],value:new q("unbounded"),changeable:!1},unknown:{allowed:[new q("error"),new q("fail"),new q("warning")],value:new q("error"),changeable:!0},double_quotes:{allowed:[new q("chars"),new q("codes"),new q("atom")],value:new q("codes"),changeable:!0},occurs_check:{allowed:[new q("false"),new q("true")],value:new q("false"),changeable:!0},dialect:{allowed:[new q("tau")],value:new q("tau"),changeable:!1},version_data:{allowed:[new q("tau",[new Re(t.major,!1),new Re(t.minor,!1),new Re(t.patch,!1),new q(t.status)])],value:new q("tau",[new Re(t.major,!1),new Re(t.minor,!1),new Re(t.patch,!1),new q(t.status)]),changeable:!1},nodejs:{allowed:[new q("yes"),new q("no")],value:new q(typeof El<"u"&&El.exports?"yes":"no"),changeable:!1}},unify:function(I,P,y){y=y===void 0?!1:y;for(var R=[{left:I,right:P}],z={};R.length!==0;){var X=R.pop();if(I=X.left,P=X.right,x.type.is_term(I)&&x.type.is_term(P)){if(I.indicator!==P.indicator)return null;for(var $=0;$z.value?1:0:z}else return R},operate:function(I,P){if(x.type.is_operator(P)){for(var y=x.type.is_operator(P),R=[],z,X=!1,$=0;$I.get_flag("max_integer").value||z0?I.start+I.matches[0].length:I.start,z=y?new q("token_not_found"):new q("found",[new q(I.value.toString())]),X=new q(".",[new q("line",[new Re(I.line+1)]),new q(".",[new q("column",[new Re(R+1)]),new q(".",[z,new q("[]",[])])])]);return new q("error",[new q("syntax_error",[new q(P)]),X])},syntax_by_predicate:function(I,P){return new q("error",[new q("syntax_error",[new q(I)]),Z(P)])}},warning:{singleton:function(I,P,y){for(var R=new q("[]"),z=I.length-1;z>=0;z--)R=new q(".",[new Se(I[z]),R]);return new q("warning",[new q("singleton_variables",[R,Z(P)]),new q(".",[new q("line",[new Re(y,!1)]),new q("[]")])])},failed_goal:function(I,P){return new q("warning",[new q("failed_goal",[I]),new q(".",[new q("line",[new Re(P,!1)]),new q("[]")])])}},format_variable:function(I){return"_"+I},format_answer:function(I,P,R){P instanceof xe&&(P=P.thread);var R=R||{};if(R.session=P?P.session:void 0,x.type.is_error(I))return"uncaught exception: "+I.args[0].toString();if(I===!1)return"false.";if(I===null)return"limit exceeded ;";var z=0,X="";if(x.type.is_substitution(I)){var $=I.domain(!0);I=I.filter(function(Fe,lt){return!x.type.is_variable(lt)||$.indexOf(lt.id)!==-1&&Fe!==lt.id})}for(var se in I.links)I.links.hasOwnProperty(se)&&(z++,X!==""&&(X+=", "),X+=se.toString(R)+" = "+I.links[se].toString(R));var be=typeof P>"u"||P.points.length>0?" ;":".";return z===0?"true"+be:X+be},flatten_error:function(I){if(!x.type.is_error(I))return null;I=I.args[0];var P={};return P.type=I.args[0].id,P.thrown=P.type==="syntax_error"?null:I.args[1].id,P.expected=null,P.found=null,P.representation=null,P.existence=null,P.existence_type=null,P.line=null,P.column=null,P.permission_operation=null,P.permission_type=null,P.evaluation_type=null,P.type==="type_error"||P.type==="domain_error"?(P.expected=I.args[0].args[0].id,P.found=I.args[0].args[1].toString()):P.type==="syntax_error"?I.args[1].indicator==="./2"?(P.expected=I.args[0].args[0].id,P.found=I.args[1].args[1].args[1].args[0],P.found=P.found.id==="token_not_found"?P.found.id:P.found.args[0].id,P.line=I.args[1].args[0].args[0].value,P.column=I.args[1].args[1].args[0].args[0].value):P.thrown=I.args[1].id:P.type==="permission_error"?(P.found=I.args[0].args[2].toString(),P.permission_operation=I.args[0].args[0].id,P.permission_type=I.args[0].args[1].id):P.type==="evaluation_error"?P.evaluation_type=I.args[0].args[0].id:P.type==="representation_error"?P.representation=I.args[0].args[0].id:P.type==="existence_error"&&(P.existence=I.args[0].args[1].toString(),P.existence_type=I.args[0].args[0].id),P},create:function(I){return new x.type.Session(I)}};typeof El<"u"?El.exports=x:window.pl=x})()});function Vme(t,e,r){t.prepend(r.map(o=>new Oa.default.type.State(e.goal.replace(o),e.substitution,e)))}function n6(t){let e=Jme.get(t.session);if(e==null)throw new Error("Assertion failed: A project should have been registered for the active session");return e}function zme(t,e){Jme.set(t,e),t.consult(`:- use_module(library(${Wgt.id})).`)}var i6,Oa,Kme,Nh,jgt,Ggt,Jme,Wgt,Xme=It(()=>{Ve();i6=et(L2()),Oa=et(r6()),Kme=et(ve("vm")),{is_atom:Nh,is_variable:jgt,is_instantiated_list:Ggt}=Oa.default.type;Jme=new WeakMap;Wgt=new Oa.default.type.Module("constraints",{"project_workspaces_by_descriptor/3":(t,e,r)=>{let[o,a,n]=r.args;if(!Nh(o)||!Nh(a)){t.throw_error(Oa.default.error.instantiation(r.indicator));return}let u=G.parseIdent(o.id),A=G.makeDescriptor(u,a.id),h=n6(t).tryWorkspaceByDescriptor(A);jgt(n)&&h!==null&&Vme(t,e,[new Oa.default.type.Term("=",[n,new Oa.default.type.Term(String(h.relativeCwd))])]),Nh(n)&&h!==null&&h.relativeCwd===n.id&&t.success(e)},"workspace_field/3":(t,e,r)=>{let[o,a,n]=r.args;if(!Nh(o)||!Nh(a)){t.throw_error(Oa.default.error.instantiation(r.indicator));return}let A=n6(t).tryWorkspaceByCwd(o.id);if(A==null)return;let p=(0,i6.default)(A.manifest.raw,a.id);typeof p>"u"||Vme(t,e,[new Oa.default.type.Term("=",[n,new Oa.default.type.Term(typeof p=="object"?JSON.stringify(p):p)])])},"workspace_field_test/3":(t,e,r)=>{let[o,a,n]=r.args;t.prepend([new Oa.default.type.State(e.goal.replace(new Oa.default.type.Term("workspace_field_test",[o,a,n,new Oa.default.type.Term("[]",[])])),e.substitution,e)])},"workspace_field_test/4":(t,e,r)=>{let[o,a,n,u]=r.args;if(!Nh(o)||!Nh(a)||!Nh(n)||!Ggt(u)){t.throw_error(Oa.default.error.instantiation(r.indicator));return}let p=n6(t).tryWorkspaceByCwd(o.id);if(p==null)return;let h=(0,i6.default)(p.manifest.raw,a.id);if(typeof h>"u")return;let E={$$:h};for(let[D,b]of u.toJavaScript().entries())E[`$${D}`]=b;Kme.default.runInNewContext(n.id,E)&&t.success(e)}},["project_workspaces_by_descriptor/3","workspace_field/3","workspace_field_test/3","workspace_field_test/4"])});var Y2={};Vt(Y2,{Constraints:()=>o6,DependencyType:()=>tye});function Ks(t){if(t instanceof rC.default.type.Num)return t.value;if(t instanceof rC.default.type.Term)switch(t.indicator){case"throw/1":return Ks(t.args[0]);case"error/1":return Ks(t.args[0]);case"error/2":if(t.args[0]instanceof rC.default.type.Term&&t.args[0].indicator==="syntax_error/1")return Object.assign(Ks(t.args[0]),...Ks(t.args[1]));{let e=Ks(t.args[0]);return e.message+=` (in ${Ks(t.args[1])})`,e}case"syntax_error/1":return new Jt(43,`Syntax error: ${Ks(t.args[0])}`);case"existence_error/2":return new Jt(44,`Existence error: ${Ks(t.args[0])} ${Ks(t.args[1])} not found`);case"instantiation_error/0":return new Jt(75,"Instantiation error: an argument is variable when an instantiated argument was expected");case"line/1":return{line:Ks(t.args[0])};case"column/1":return{column:Ks(t.args[0])};case"found/1":return{found:Ks(t.args[0])};case"./2":return[Ks(t.args[0])].concat(Ks(t.args[1]));case"//2":return`${Ks(t.args[0])}/${Ks(t.args[1])}`;default:return t.id}throw`couldn't pretty print because of unsupported node ${t}`}function $me(t){let e;try{e=Ks(t)}catch(r){throw typeof r=="string"?new Jt(42,`Unknown error: ${t} (note: ${r})`):r}return typeof e.line<"u"&&typeof e.column<"u"&&(e.message+=` at line ${e.line}, column ${e.column}`),e}function Zg(t){return t.id==="null"?null:`${t.toJavaScript()}`}function Ygt(t){if(t.id==="null")return null;{let e=t.toJavaScript();if(typeof e!="string")return JSON.stringify(e);try{return JSON.stringify(JSON.parse(e))}catch{return JSON.stringify(e)}}}function Oh(t){return typeof t=="string"?`'${t}'`:"[]"}var eye,rC,tye,Zme,s6,o6,V2=It(()=>{Ve();Ve();St();eye=et(Qme()),rC=et(r6());j2();Xme();(0,eye.default)(rC.default);tye=(o=>(o.Dependencies="dependencies",o.DevDependencies="devDependencies",o.PeerDependencies="peerDependencies",o))(tye||{}),Zme=["dependencies","devDependencies","peerDependencies"];s6=class{constructor(e,r){let o=1e3*e.workspaces.length;this.session=rC.default.create(o),zme(this.session,e),this.session.consult(":- use_module(library(lists))."),this.session.consult(r)}fetchNextAnswer(){return new Promise(e=>{this.session.answer(r=>{e(r)})})}async*makeQuery(e){let r=this.session.query(e);if(r!==!0)throw $me(r);for(;;){let o=await this.fetchNextAnswer();if(o===null)throw new Jt(79,"Resolution limit exceeded");if(!o)break;if(o.id==="throw")throw $me(o);yield o}}};o6=class t{constructor(e){this.source="";this.project=e;let r=e.configuration.get("constraintsPath");ae.existsSync(r)&&(this.source=ae.readFileSync(r,"utf8"))}static async find(e){return new t(e)}getProjectDatabase(){let e="";for(let r of Zme)e+=`dependency_type(${r}). -`;for(let r of this.project.workspacesByCwd.values()){let o=r.relativeCwd;e+=`workspace(${Oh(o)}). -`,e+=`workspace_ident(${Oh(o)}, ${Oh(G.stringifyIdent(r.anchoredLocator))}). -`,e+=`workspace_version(${Oh(o)}, ${Oh(r.manifest.version)}). -`;for(let a of Zme)for(let n of r.manifest[a].values())e+=`workspace_has_dependency(${Oh(o)}, ${Oh(G.stringifyIdent(n))}, ${Oh(n.range)}, ${a}). -`}return e+=`workspace(_) :- false. -`,e+=`workspace_ident(_, _) :- false. -`,e+=`workspace_version(_, _) :- false. -`,e+=`workspace_has_dependency(_, _, _, _) :- false. -`,e}getDeclarations(){let e="";return e+=`gen_enforced_dependency(_, _, _, _) :- false. -`,e+=`gen_enforced_field(_, _, _) :- false. -`,e}get fullSource(){return`${this.getProjectDatabase()} -${this.source} -${this.getDeclarations()}`}createSession(){return new s6(this.project,this.fullSource)}async processClassic(){let e=this.createSession();return{enforcedDependencies:await this.genEnforcedDependencies(e),enforcedFields:await this.genEnforcedFields(e)}}async process(){let{enforcedDependencies:e,enforcedFields:r}=await this.processClassic(),o=new Map;for(let{workspace:a,dependencyIdent:n,dependencyRange:u,dependencyType:A}of e){let p=q2([A,G.stringifyIdent(n)]),h=qe.getMapWithDefault(o,a.cwd);qe.getMapWithDefault(h,p).set(u??void 0,new Set)}for(let{workspace:a,fieldPath:n,fieldValue:u}of r){let A=q2(n),p=qe.getMapWithDefault(o,a.cwd);qe.getMapWithDefault(p,A).set(JSON.parse(u)??void 0,new Set)}return{manifestUpdates:o,reportedErrors:new Map}}async genEnforcedDependencies(e){let r=[];for await(let o of e.makeQuery("workspace(WorkspaceCwd), dependency_type(DependencyType), gen_enforced_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType).")){let a=V.resolve(this.project.cwd,Zg(o.links.WorkspaceCwd)),n=Zg(o.links.DependencyIdent),u=Zg(o.links.DependencyRange),A=Zg(o.links.DependencyType);if(a===null||n===null)throw new Error("Invalid rule");let p=this.project.getWorkspaceByCwd(a),h=G.parseIdent(n);r.push({workspace:p,dependencyIdent:h,dependencyRange:u,dependencyType:A})}return qe.sortMap(r,[({dependencyRange:o})=>o!==null?"0":"1",({workspace:o})=>G.stringifyIdent(o.anchoredLocator),({dependencyIdent:o})=>G.stringifyIdent(o)])}async genEnforcedFields(e){let r=[];for await(let o of e.makeQuery("workspace(WorkspaceCwd), gen_enforced_field(WorkspaceCwd, FieldPath, FieldValue).")){let a=V.resolve(this.project.cwd,Zg(o.links.WorkspaceCwd)),n=Zg(o.links.FieldPath),u=Ygt(o.links.FieldValue);if(a===null||n===null)throw new Error("Invalid rule");let A=this.project.getWorkspaceByCwd(a);r.push({workspace:A,fieldPath:n,fieldValue:u})}return qe.sortMap(r,[({workspace:o})=>G.stringifyIdent(o.anchoredLocator),({fieldPath:o})=>o])}async*query(e){let r=this.createSession();for await(let o of r.makeQuery(e)){let a={};for(let[n,u]of Object.entries(o.links))n!=="_"&&(a[n]=Zg(u));yield a}}}});var uye=_(tQ=>{"use strict";Object.defineProperty(tQ,"__esModule",{value:!0});function lB(t){let e=[...t.caches],r=e.shift();return r===void 0?cye():{get(o,a,n={miss:()=>Promise.resolve()}){return r.get(o,a,n).catch(()=>lB({caches:e}).get(o,a,n))},set(o,a){return r.set(o,a).catch(()=>lB({caches:e}).set(o,a))},delete(o){return r.delete(o).catch(()=>lB({caches:e}).delete(o))},clear(){return r.clear().catch(()=>lB({caches:e}).clear())}}}function cye(){return{get(t,e,r={miss:()=>Promise.resolve()}){return e().then(a=>Promise.all([a,r.miss(a)])).then(([a])=>a)},set(t,e){return Promise.resolve(e)},delete(t){return Promise.resolve()},clear(){return Promise.resolve()}}}tQ.createFallbackableCache=lB;tQ.createNullCache=cye});var fye=_((pYt,Aye)=>{Aye.exports=uye()});var pye=_(C6=>{"use strict";Object.defineProperty(C6,"__esModule",{value:!0});function Adt(t={serializable:!0}){let e={};return{get(r,o,a={miss:()=>Promise.resolve()}){let n=JSON.stringify(r);if(n in e)return Promise.resolve(t.serializable?JSON.parse(e[n]):e[n]);let u=o(),A=a&&a.miss||(()=>Promise.resolve());return u.then(p=>A(p)).then(()=>u)},set(r,o){return e[JSON.stringify(r)]=t.serializable?JSON.stringify(o):o,Promise.resolve(o)},delete(r){return delete e[JSON.stringify(r)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}C6.createInMemoryCache=Adt});var gye=_((gYt,hye)=>{hye.exports=pye()});var mye=_(su=>{"use strict";Object.defineProperty(su,"__esModule",{value:!0});function fdt(t,e,r){let o={"x-algolia-api-key":r,"x-algolia-application-id":e};return{headers(){return t===I6.WithinHeaders?o:{}},queryParameters(){return t===I6.WithinQueryParameters?o:{}}}}function pdt(t){let e=0,r=()=>(e++,new Promise(o=>{setTimeout(()=>{o(t(r))},Math.min(100*e,1e3))}));return t(r)}function dye(t,e=(r,o)=>Promise.resolve()){return Object.assign(t,{wait(r){return dye(t.then(o=>Promise.all([e(o,r),o])).then(o=>o[1]))}})}function hdt(t){let e=t.length-1;for(e;e>0;e--){let r=Math.floor(Math.random()*(e+1)),o=t[e];t[e]=t[r],t[r]=o}return t}function gdt(t,e){return e&&Object.keys(e).forEach(r=>{t[r]=e[r](t)}),t}function ddt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}var mdt="4.22.1",ydt=t=>()=>t.transporter.requester.destroy(),I6={WithinQueryParameters:0,WithinHeaders:1};su.AuthMode=I6;su.addMethods=gdt;su.createAuth=fdt;su.createRetryablePromise=pdt;su.createWaitablePromise=dye;su.destroy=ydt;su.encode=ddt;su.shuffle=hdt;su.version=mdt});var cB=_((mYt,yye)=>{yye.exports=mye()});var Eye=_(w6=>{"use strict";Object.defineProperty(w6,"__esModule",{value:!0});var Edt={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};w6.MethodEnum=Edt});var uB=_((EYt,Cye)=>{Cye.exports=Eye()});var Lye=_(Ti=>{"use strict";Object.defineProperty(Ti,"__esModule",{value:!0});var wye=uB();function B6(t,e){let r=t||{},o=r.data||{};return Object.keys(r).forEach(a=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(a)===-1&&(o[a]=r[a])}),{data:Object.entries(o).length>0?o:void 0,timeout:r.timeout||e,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var AB={Read:1,Write:2,Any:3},fC={Up:1,Down:2,Timeouted:3},Bye=2*60*1e3;function D6(t,e=fC.Up){return{...t,status:e,lastUpdate:Date.now()}}function vye(t){return t.status===fC.Up||Date.now()-t.lastUpdate>Bye}function Dye(t){return t.status===fC.Timeouted&&Date.now()-t.lastUpdate<=Bye}function S6(t){return typeof t=="string"?{protocol:"https",url:t,accept:AB.Any}:{protocol:t.protocol||"https",url:t.url,accept:t.accept||AB.Any}}function Cdt(t,e){return Promise.all(e.map(r=>t.get(r,()=>Promise.resolve(D6(r))))).then(r=>{let o=r.filter(A=>vye(A)),a=r.filter(A=>Dye(A)),n=[...o,...a],u=n.length>0?n.map(A=>S6(A)):e;return{getTimeout(A,p){return(a.length===0&&A===0?1:a.length+3+A)*p},statelessHosts:u}})}var Idt=({isTimedOut:t,status:e})=>!t&&~~e===0,wdt=t=>{let e=t.status;return t.isTimedOut||Idt(t)||~~(e/100)!==2&&~~(e/100)!==4},Bdt=({status:t})=>~~(t/100)===2,vdt=(t,e)=>wdt(t)?e.onRetry(t):Bdt(t)?e.onSuccess(t):e.onFail(t);function Iye(t,e,r,o){let a=[],n=kye(r,o),u=Qye(t,o),A=r.method,p=r.method!==wye.MethodEnum.Get?{}:{...r.data,...o.data},h={"x-algolia-agent":t.userAgent.value,...t.queryParameters,...p,...o.queryParameters},E=0,w=(D,b)=>{let C=D.pop();if(C===void 0)throw Tye(v6(a));let T={data:n,headers:u,method:A,url:xye(C,r.path,h),connectTimeout:b(E,t.timeouts.connect),responseTimeout:b(E,o.timeout)},N=J=>{let te={request:T,response:J,host:C,triesLeft:D.length};return a.push(te),te},U={onSuccess:J=>Sye(J),onRetry(J){let te=N(J);return J.isTimedOut&&E++,Promise.all([t.logger.info("Retryable failure",P6(te)),t.hostsCache.set(C,D6(C,J.isTimedOut?fC.Timeouted:fC.Down))]).then(()=>w(D,b))},onFail(J){throw N(J),Pye(J,v6(a))}};return t.requester.send(T).then(J=>vdt(J,U))};return Cdt(t.hostsCache,e).then(D=>w([...D.statelessHosts].reverse(),D.getTimeout))}function Ddt(t){let{hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,hosts:p,queryParameters:h,headers:E}=t,w={hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,headers:E,queryParameters:h,hosts:p.map(D=>S6(D)),read(D,b){let C=B6(b,w.timeouts.read),T=()=>Iye(w,w.hosts.filter(J=>(J.accept&AB.Read)!==0),D,C);if((C.cacheable!==void 0?C.cacheable:D.cacheable)!==!0)return T();let U={request:D,mappedRequestOptions:C,transporter:{queryParameters:w.queryParameters,headers:w.headers}};return w.responsesCache.get(U,()=>w.requestsCache.get(U,()=>w.requestsCache.set(U,T()).then(J=>Promise.all([w.requestsCache.delete(U),J]),J=>Promise.all([w.requestsCache.delete(U),Promise.reject(J)])).then(([J,te])=>te)),{miss:J=>w.responsesCache.set(U,J)})},write(D,b){return Iye(w,w.hosts.filter(C=>(C.accept&AB.Write)!==0),D,B6(b,w.timeouts.write))}};return w}function Sdt(t){let e={value:`Algolia for JavaScript (${t})`,add(r){let o=`; ${r.segment}${r.version!==void 0?` (${r.version})`:""}`;return e.value.indexOf(o)===-1&&(e.value=`${e.value}${o}`),e}};return e}function Sye(t){try{return JSON.parse(t.content)}catch(e){throw Rye(e.message,t)}}function Pye({content:t,status:e},r){let o=t;try{o=JSON.parse(t).message}catch{}return Fye(o,e,r)}function Pdt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}function xye(t,e,r){let o=bye(r),a=`${t.protocol}://${t.url}/${e.charAt(0)==="/"?e.substr(1):e}`;return o.length&&(a+=`?${o}`),a}function bye(t){let e=r=>Object.prototype.toString.call(r)==="[object Object]"||Object.prototype.toString.call(r)==="[object Array]";return Object.keys(t).map(r=>Pdt("%s=%s",r,e(t[r])?JSON.stringify(t[r]):t[r])).join("&")}function kye(t,e){if(t.method===wye.MethodEnum.Get||t.data===void 0&&e.data===void 0)return;let r=Array.isArray(t.data)?t.data:{...t.data,...e.data};return JSON.stringify(r)}function Qye(t,e){let r={...t.headers,...e.headers},o={};return Object.keys(r).forEach(a=>{let n=r[a];o[a.toLowerCase()]=n}),o}function v6(t){return t.map(e=>P6(e))}function P6(t){let e=t.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...t,request:{...t.request,headers:{...t.request.headers,...e}}}}function Fye(t,e,r){return{name:"ApiError",message:t,status:e,transporterStackTrace:r}}function Rye(t,e){return{name:"DeserializationError",message:t,response:e}}function Tye(t){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:t}}Ti.CallEnum=AB;Ti.HostStatusEnum=fC;Ti.createApiError=Fye;Ti.createDeserializationError=Rye;Ti.createMappedRequestOptions=B6;Ti.createRetryError=Tye;Ti.createStatefulHost=D6;Ti.createStatelessHost=S6;Ti.createTransporter=Ddt;Ti.createUserAgent=Sdt;Ti.deserializeFailure=Pye;Ti.deserializeSuccess=Sye;Ti.isStatefulHostTimeouted=Dye;Ti.isStatefulHostUp=vye;Ti.serializeData=kye;Ti.serializeHeaders=Qye;Ti.serializeQueryParameters=bye;Ti.serializeUrl=xye;Ti.stackFrameWithoutCredentials=P6;Ti.stackTraceWithoutCredentials=v6});var fB=_((IYt,Nye)=>{Nye.exports=Lye()});var Oye=_(Mh=>{"use strict";Object.defineProperty(Mh,"__esModule",{value:!0});var pC=cB(),xdt=fB(),pB=uB(),bdt=t=>{let e=t.region||"us",r=pC.createAuth(pC.AuthMode.WithinHeaders,t.appId,t.apiKey),o=xdt.createTransporter({hosts:[{url:`analytics.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a=t.appId;return pC.addMethods({appId:a,transporter:o},t.methods)},kdt=t=>(e,r)=>t.transporter.write({method:pB.MethodEnum.Post,path:"2/abtests",data:e},r),Qdt=t=>(e,r)=>t.transporter.write({method:pB.MethodEnum.Delete,path:pC.encode("2/abtests/%s",e)},r),Fdt=t=>(e,r)=>t.transporter.read({method:pB.MethodEnum.Get,path:pC.encode("2/abtests/%s",e)},r),Rdt=t=>e=>t.transporter.read({method:pB.MethodEnum.Get,path:"2/abtests"},e),Tdt=t=>(e,r)=>t.transporter.write({method:pB.MethodEnum.Post,path:pC.encode("2/abtests/%s/stop",e)},r);Mh.addABTest=kdt;Mh.createAnalyticsClient=bdt;Mh.deleteABTest=Qdt;Mh.getABTest=Fdt;Mh.getABTests=Rdt;Mh.stopABTest=Tdt});var Uye=_((BYt,Mye)=>{Mye.exports=Oye()});var Hye=_(hB=>{"use strict";Object.defineProperty(hB,"__esModule",{value:!0});var x6=cB(),Ldt=fB(),_ye=uB(),Ndt=t=>{let e=t.region||"us",r=x6.createAuth(x6.AuthMode.WithinHeaders,t.appId,t.apiKey),o=Ldt.createTransporter({hosts:[{url:`personalization.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}});return x6.addMethods({appId:t.appId,transporter:o},t.methods)},Odt=t=>e=>t.transporter.read({method:_ye.MethodEnum.Get,path:"1/strategies/personalization"},e),Mdt=t=>(e,r)=>t.transporter.write({method:_ye.MethodEnum.Post,path:"1/strategies/personalization",data:e},r);hB.createPersonalizationClient=Ndt;hB.getPersonalizationStrategy=Odt;hB.setPersonalizationStrategy=Mdt});var jye=_((DYt,qye)=>{qye.exports=Hye()});var nEe=_(Rt=>{"use strict";Object.defineProperty(Rt,"__esModule",{value:!0});var Wt=cB(),Ma=fB(),Dr=uB(),Udt=ve("crypto");function rQ(t){let e=r=>t.request(r).then(o=>{if(t.batch!==void 0&&t.batch(o.hits),!t.shouldStop(o))return o.cursor?e({cursor:o.cursor}):e({page:(r.page||0)+1})});return e({})}var _dt=t=>{let e=t.appId,r=Wt.createAuth(t.authMode!==void 0?t.authMode:Wt.AuthMode.WithinHeaders,e,t.apiKey),o=Ma.createTransporter({hosts:[{url:`${e}-dsn.algolia.net`,accept:Ma.CallEnum.Read},{url:`${e}.algolia.net`,accept:Ma.CallEnum.Write}].concat(Wt.shuffle([{url:`${e}-1.algolianet.com`},{url:`${e}-2.algolianet.com`},{url:`${e}-3.algolianet.com`}])),...t,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a={transporter:o,appId:e,addAlgoliaAgent(n,u){o.userAgent.add({segment:n,version:u})},clearCache(){return Promise.all([o.requestsCache.clear(),o.responsesCache.clear()]).then(()=>{})}};return Wt.addMethods(a,t.methods)};function Gye(){return{name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}}function Wye(){return{name:"ObjectNotFoundError",message:"Object not found."}}function Yye(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var Hdt=t=>(e,r)=>{let{queryParameters:o,...a}=r||{},n={acl:e,...o!==void 0?{queryParameters:o}:{}},u=(A,p)=>Wt.createRetryablePromise(h=>gB(t)(A.key,p).catch(E=>{if(E.status!==404)throw E;return h()}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:"1/keys",data:n},a),u)},qdt=t=>(e,r,o)=>{let a=Ma.createMappedRequestOptions(o);return a.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:Dr.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:r}},a)},jdt=t=>(e,r,o)=>t.transporter.write({method:Dr.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:e,cluster:r}},o),Gdt=t=>(e,r)=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:{action:"addEntry",body:[]}}},r),(o,a)=>hC(t)(o.taskID,a)),nQ=t=>(e,r,o)=>{let a=(n,u)=>dB(t)(e,{methods:{waitTask:es}}).waitTask(n.taskID,u);return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",e),data:{operation:"copy",destination:r}},o),a)},Wdt=t=>(e,r,o)=>nQ(t)(e,r,{...o,scope:[sQ.Rules]}),Ydt=t=>(e,r,o)=>nQ(t)(e,r,{...o,scope:[sQ.Settings]}),Vdt=t=>(e,r,o)=>nQ(t)(e,r,{...o,scope:[sQ.Synonyms]}),Kdt=t=>(e,r)=>e.method===Dr.MethodEnum.Get?t.transporter.read(e,r):t.transporter.write(e,r),Jdt=t=>(e,r)=>{let o=(a,n)=>Wt.createRetryablePromise(u=>gB(t)(e,n).then(u).catch(A=>{if(A.status!==404)throw A}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Delete,path:Wt.encode("1/keys/%s",e)},r),o)},zdt=t=>(e,r,o)=>{let a=r.map(n=>({action:"deleteEntry",body:{objectID:n}}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>hC(t)(n.taskID,u))},Xdt=()=>(t,e)=>{let r=Ma.serializeQueryParameters(e),o=Udt.createHmac("sha256",t).update(r).digest("hex");return Buffer.from(o+r).toString("base64")},gB=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/keys/%s",e)},r),Vye=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/task/%s",e.toString())},r),Zdt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"/1/dictionaries/*/settings"},e),$dt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/logs"},e),emt=()=>t=>{let e=Buffer.from(t,"base64").toString("ascii"),r=/validUntil=(\d+)/,o=e.match(r);if(o===null)throw Yye();return parseInt(o[1],10)-Math.round(new Date().getTime()/1e3)},tmt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters/mapping/top"},e),rmt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/clusters/mapping/%s",e)},r),nmt=t=>e=>{let{retrieveMappings:r,...o}=e||{};return r===!0&&(o.getClusters=!0),t.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters/mapping/pending"},o)},dB=t=>(e,r={})=>{let o={transporter:t.transporter,appId:t.appId,indexName:e};return Wt.addMethods(o,r.methods)},imt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/keys"},e),smt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters"},e),omt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/indexes"},e),amt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters/mapping"},e),lmt=t=>(e,r,o)=>{let a=(n,u)=>dB(t)(e,{methods:{waitTask:es}}).waitTask(n.taskID,u);return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",e),data:{operation:"move",destination:r}},o),a)},cmt=t=>(e,r)=>{let o=(a,n)=>Promise.all(Object.keys(a.taskID).map(u=>dB(t)(u,{methods:{waitTask:es}}).waitTask(a.taskID[u],n)));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:e}},r),o)},umt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:e}},r),Amt=t=>(e,r)=>{let o=e.map(a=>({...a,params:Ma.serializeQueryParameters(a.params||{})}));return t.transporter.read({method:Dr.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:o},cacheable:!0},r)},fmt=t=>(e,r)=>Promise.all(e.map(o=>{let{facetName:a,facetQuery:n,...u}=o.params;return dB(t)(o.indexName,{methods:{searchForFacetValues:eEe}}).searchForFacetValues(a,n,{...r,...u})})),pmt=t=>(e,r)=>{let o=Ma.createMappedRequestOptions(r);return o.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:Dr.MethodEnum.Delete,path:"1/clusters/mapping"},o)},hmt=t=>(e,r,o)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:a}},o),(n,u)=>hC(t)(n.taskID,u))},gmt=t=>(e,r)=>{let o=(a,n)=>Wt.createRetryablePromise(u=>gB(t)(e,n).catch(A=>{if(A.status!==404)throw A;return u()}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/keys/%s/restore",e)},r),o)},dmt=t=>(e,r,o)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>hC(t)(n.taskID,u))},mmt=t=>(e,r,o)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("/1/dictionaries/%s/search",e),data:{query:r},cacheable:!0},o),ymt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:e}},r),Emt=t=>(e,r)=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Put,path:"/1/dictionaries/*/settings",data:e},r),(o,a)=>hC(t)(o.taskID,a)),Cmt=t=>(e,r)=>{let o=Object.assign({},r),{queryParameters:a,...n}=r||{},u=a?{queryParameters:a}:{},A=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],p=E=>Object.keys(o).filter(w=>A.indexOf(w)!==-1).every(w=>{if(Array.isArray(E[w])&&Array.isArray(o[w])){let D=E[w];return D.length===o[w].length&&D.every((b,C)=>b===o[w][C])}else return E[w]===o[w]}),h=(E,w)=>Wt.createRetryablePromise(D=>gB(t)(e,w).then(b=>p(b)?Promise.resolve():D()));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Put,path:Wt.encode("1/keys/%s",e),data:u},n),h)},hC=t=>(e,r)=>Wt.createRetryablePromise(o=>Vye(t)(e,r).then(a=>a.status!=="published"?o():void 0)),Kye=t=>(e,r)=>{let o=(a,n)=>es(t)(a.taskID,n);return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/batch",t.indexName),data:{requests:e}},r),o)},Imt=t=>e=>rQ({shouldStop:r=>r.cursor===void 0,...e,request:r=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/browse",t.indexName),data:r},e)}),wmt=t=>e=>{let r={hitsPerPage:1e3,...e};return rQ({shouldStop:o=>o.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},Bmt=t=>e=>{let r={hitsPerPage:1e3,...e};return rQ({shouldStop:o=>o.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},iQ=t=>(e,r,o)=>{let{batchSize:a,...n}=o||{},u={taskIDs:[],objectIDs:[]},A=(p=0)=>{let h=[],E;for(E=p;E({action:r,body:w})),n).then(w=>(u.objectIDs=u.objectIDs.concat(w.objectIDs),u.taskIDs.push(w.taskID),E++,A(E)))};return Wt.createWaitablePromise(A(),(p,h)=>Promise.all(p.taskIDs.map(E=>es(t)(E,h))))},vmt=t=>e=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/clear",t.indexName)},e),(r,o)=>es(t)(r.taskID,o)),Dmt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=Ma.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/clear",t.indexName)},a),(n,u)=>es(t)(n.taskID,u))},Smt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=Ma.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/clear",t.indexName)},a),(n,u)=>es(t)(n.taskID,u))},Pmt=t=>(e,r)=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/deleteByQuery",t.indexName),data:e},r),(o,a)=>es(t)(o.taskID,a)),xmt=t=>e=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Delete,path:Wt.encode("1/indexes/%s",t.indexName)},e),(r,o)=>es(t)(r.taskID,o)),bmt=t=>(e,r)=>Wt.createWaitablePromise(Jye(t)([e],r).then(o=>({taskID:o.taskIDs[0]})),(o,a)=>es(t)(o.taskID,a)),Jye=t=>(e,r)=>{let o=e.map(a=>({objectID:a}));return iQ(t)(o,ed.DeleteObject,r)},kmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Ma.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Delete,path:Wt.encode("1/indexes/%s/rules/%s",t.indexName,e)},n),(u,A)=>es(t)(u.taskID,A))},Qmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Ma.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Delete,path:Wt.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},n),(u,A)=>es(t)(u.taskID,A))},Fmt=t=>e=>zye(t)(e).then(()=>!0).catch(r=>{if(r.status!==404)throw r;return!1}),Rmt=t=>(e,r,o)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/answers/%s/prediction",t.indexName),data:{query:e,queryLanguages:r},cacheable:!0},o),Tmt=t=>(e,r)=>{let{query:o,paginate:a,...n}=r||{},u=0,A=()=>$ye(t)(o||"",{...n,page:u}).then(p=>{for(let[h,E]of Object.entries(p.hits))if(e(E))return{object:E,position:parseInt(h,10),page:u};if(u++,a===!1||u>=p.nbPages)throw Wye();return A()});return A()},Lmt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/indexes/%s/%s",t.indexName,e)},r),Nmt=()=>(t,e)=>{for(let[r,o]of Object.entries(t.hits))if(o.objectID===e)return parseInt(r,10);return-1},Omt=t=>(e,r)=>{let{attributesToRetrieve:o,...a}=r||{},n=e.map(u=>({indexName:t.indexName,objectID:u,...o?{attributesToRetrieve:o}:{}}));return t.transporter.read({method:Dr.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:n}},a)},Mmt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/indexes/%s/rules/%s",t.indexName,e)},r),zye=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/indexes/%s/settings",t.indexName),data:{getVersion:2}},e),Umt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},r),Xye=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/indexes/%s/task/%s",t.indexName,e.toString())},r),_mt=t=>(e,r)=>Wt.createWaitablePromise(Zye(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>es(t)(o.taskID,a)),Zye=t=>(e,r)=>{let{createIfNotExists:o,...a}=r||{},n=o?ed.PartialUpdateObject:ed.PartialUpdateObjectNoCreate;return iQ(t)(e,n,a)},Hmt=t=>(e,r)=>{let{safe:o,autoGenerateObjectIDIfNotExist:a,batchSize:n,...u}=r||{},A=(C,T,N,U)=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",C),data:{operation:N,destination:T}},U),(J,te)=>es(t)(J.taskID,te)),p=Math.random().toString(36).substring(7),h=`${t.indexName}_tmp_${p}`,E=b6({appId:t.appId,transporter:t.transporter,indexName:h}),w=[],D=A(t.indexName,h,"copy",{...u,scope:["settings","synonyms","rules"]});w.push(D);let b=(o?D.wait(u):D).then(()=>{let C=E(e,{...u,autoGenerateObjectIDIfNotExist:a,batchSize:n});return w.push(C),o?C.wait(u):C}).then(()=>{let C=A(h,t.indexName,"move",u);return w.push(C),o?C.wait(u):C}).then(()=>Promise.all(w)).then(([C,T,N])=>({objectIDs:T.objectIDs,taskIDs:[C.taskID,...T.taskIDs,N.taskID]}));return Wt.createWaitablePromise(b,(C,T)=>Promise.all(w.map(N=>N.wait(T))))},qmt=t=>(e,r)=>k6(t)(e,{...r,clearExistingRules:!0}),jmt=t=>(e,r)=>Q6(t)(e,{...r,clearExistingSynonyms:!0}),Gmt=t=>(e,r)=>Wt.createWaitablePromise(b6(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>es(t)(o.taskID,a)),b6=t=>(e,r)=>{let{autoGenerateObjectIDIfNotExist:o,...a}=r||{},n=o?ed.AddObject:ed.UpdateObject;if(n===ed.UpdateObject){for(let u of e)if(u.objectID===void 0)return Wt.createWaitablePromise(Promise.reject(Gye()))}return iQ(t)(e,n,a)},Wmt=t=>(e,r)=>k6(t)([e],r),k6=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingRules:a,...n}=r||{},u=Ma.createMappedRequestOptions(n);return o&&(u.queryParameters.forwardToReplicas=1),a&&(u.queryParameters.clearExistingRules=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/batch",t.indexName),data:e},u),(A,p)=>es(t)(A.taskID,p))},Ymt=t=>(e,r)=>Q6(t)([e],r),Q6=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingSynonyms:a,replaceExistingSynonyms:n,...u}=r||{},A=Ma.createMappedRequestOptions(u);return o&&(A.queryParameters.forwardToReplicas=1),(n||a)&&(A.queryParameters.replaceExistingSynonyms=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/batch",t.indexName),data:e},A),(p,h)=>es(t)(p.taskID,h))},$ye=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/query",t.indexName),data:{query:e},cacheable:!0},r),eEe=t=>(e,r,o)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/facets/%s/query",t.indexName,e),data:{facetQuery:r},cacheable:!0},o),tEe=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/search",t.indexName),data:{query:e}},r),rEe=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/search",t.indexName),data:{query:e}},r),Vmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Ma.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Put,path:Wt.encode("1/indexes/%s/settings",t.indexName),data:e},n),(u,A)=>es(t)(u.taskID,A))},es=t=>(e,r)=>Wt.createRetryablePromise(o=>Xye(t)(e,r).then(a=>a.status!=="published"?o():void 0)),Kmt={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",Inference:"inference",ListIndexes:"listIndexes",Logs:"logs",Personalization:"personalization",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},ed={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject",DeleteIndex:"delete",ClearIndex:"clear"},sQ={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},Jmt={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},zmt={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};Rt.ApiKeyACLEnum=Kmt;Rt.BatchActionEnum=ed;Rt.ScopeEnum=sQ;Rt.StrategyEnum=Jmt;Rt.SynonymEnum=zmt;Rt.addApiKey=Hdt;Rt.assignUserID=qdt;Rt.assignUserIDs=jdt;Rt.batch=Kye;Rt.browseObjects=Imt;Rt.browseRules=wmt;Rt.browseSynonyms=Bmt;Rt.chunkedBatch=iQ;Rt.clearDictionaryEntries=Gdt;Rt.clearObjects=vmt;Rt.clearRules=Dmt;Rt.clearSynonyms=Smt;Rt.copyIndex=nQ;Rt.copyRules=Wdt;Rt.copySettings=Ydt;Rt.copySynonyms=Vdt;Rt.createBrowsablePromise=rQ;Rt.createMissingObjectIDError=Gye;Rt.createObjectNotFoundError=Wye;Rt.createSearchClient=_dt;Rt.createValidUntilNotFoundError=Yye;Rt.customRequest=Kdt;Rt.deleteApiKey=Jdt;Rt.deleteBy=Pmt;Rt.deleteDictionaryEntries=zdt;Rt.deleteIndex=xmt;Rt.deleteObject=bmt;Rt.deleteObjects=Jye;Rt.deleteRule=kmt;Rt.deleteSynonym=Qmt;Rt.exists=Fmt;Rt.findAnswers=Rmt;Rt.findObject=Tmt;Rt.generateSecuredApiKey=Xdt;Rt.getApiKey=gB;Rt.getAppTask=Vye;Rt.getDictionarySettings=Zdt;Rt.getLogs=$dt;Rt.getObject=Lmt;Rt.getObjectPosition=Nmt;Rt.getObjects=Omt;Rt.getRule=Mmt;Rt.getSecuredApiKeyRemainingValidity=emt;Rt.getSettings=zye;Rt.getSynonym=Umt;Rt.getTask=Xye;Rt.getTopUserIDs=tmt;Rt.getUserID=rmt;Rt.hasPendingMappings=nmt;Rt.initIndex=dB;Rt.listApiKeys=imt;Rt.listClusters=smt;Rt.listIndices=omt;Rt.listUserIDs=amt;Rt.moveIndex=lmt;Rt.multipleBatch=cmt;Rt.multipleGetObjects=umt;Rt.multipleQueries=Amt;Rt.multipleSearchForFacetValues=fmt;Rt.partialUpdateObject=_mt;Rt.partialUpdateObjects=Zye;Rt.removeUserID=pmt;Rt.replaceAllObjects=Hmt;Rt.replaceAllRules=qmt;Rt.replaceAllSynonyms=jmt;Rt.replaceDictionaryEntries=hmt;Rt.restoreApiKey=gmt;Rt.saveDictionaryEntries=dmt;Rt.saveObject=Gmt;Rt.saveObjects=b6;Rt.saveRule=Wmt;Rt.saveRules=k6;Rt.saveSynonym=Ymt;Rt.saveSynonyms=Q6;Rt.search=$ye;Rt.searchDictionaryEntries=mmt;Rt.searchForFacetValues=eEe;Rt.searchRules=tEe;Rt.searchSynonyms=rEe;Rt.searchUserIDs=ymt;Rt.setDictionarySettings=Emt;Rt.setSettings=Vmt;Rt.updateApiKey=Cmt;Rt.waitAppTask=hC;Rt.waitTask=es});var sEe=_((PYt,iEe)=>{iEe.exports=nEe()});var oEe=_(oQ=>{"use strict";Object.defineProperty(oQ,"__esModule",{value:!0});function Xmt(){return{debug(t,e){return Promise.resolve()},info(t,e){return Promise.resolve()},error(t,e){return Promise.resolve()}}}var Zmt={Debug:1,Info:2,Error:3};oQ.LogLevelEnum=Zmt;oQ.createNullLogger=Xmt});var lEe=_((bYt,aEe)=>{aEe.exports=oEe()});var fEe=_(F6=>{"use strict";Object.defineProperty(F6,"__esModule",{value:!0});var cEe=ve("http"),uEe=ve("https"),$mt=ve("url"),AEe={keepAlive:!0},eyt=new cEe.Agent(AEe),tyt=new uEe.Agent(AEe);function ryt({agent:t,httpAgent:e,httpsAgent:r,requesterOptions:o={}}={}){let a=e||t||eyt,n=r||t||tyt;return{send(u){return new Promise(A=>{let p=$mt.parse(u.url),h=p.query===null?p.pathname:`${p.pathname}?${p.query}`,E={...o,agent:p.protocol==="https:"?n:a,hostname:p.hostname,path:h,method:u.method,headers:{...o&&o.headers?o.headers:{},...u.headers},...p.port!==void 0?{port:p.port||""}:{}},w=(p.protocol==="https:"?uEe:cEe).request(E,T=>{let N=[];T.on("data",U=>{N=N.concat(U)}),T.on("end",()=>{clearTimeout(b),clearTimeout(C),A({status:T.statusCode||0,content:Buffer.concat(N).toString(),isTimedOut:!1})})}),D=(T,N)=>setTimeout(()=>{w.abort(),A({status:0,content:N,isTimedOut:!0})},T*1e3),b=D(u.connectTimeout,"Connection timeout"),C;w.on("error",T=>{clearTimeout(b),clearTimeout(C),A({status:0,content:T.message,isTimedOut:!1})}),w.once("response",()=>{clearTimeout(b),C=D(u.responseTimeout,"Socket timeout")}),u.data!==void 0&&w.write(u.data),w.end()})},destroy(){return a.destroy(),n.destroy(),Promise.resolve()}}}F6.createNodeHttpRequester=ryt});var hEe=_((QYt,pEe)=>{pEe.exports=fEe()});var yEe=_((FYt,mEe)=>{"use strict";var gEe=fye(),nyt=gye(),gC=Uye(),T6=cB(),R6=jye(),Ht=sEe(),iyt=lEe(),syt=hEe(),oyt=fB();function dEe(t,e,r){let o={appId:t,apiKey:e,timeouts:{connect:2,read:5,write:30},requester:syt.createNodeHttpRequester(),logger:iyt.createNullLogger(),responsesCache:gEe.createNullCache(),requestsCache:gEe.createNullCache(),hostsCache:nyt.createInMemoryCache(),userAgent:oyt.createUserAgent(T6.version).add({segment:"Node.js",version:process.versions.node})},a={...o,...r},n=()=>u=>R6.createPersonalizationClient({...o,...u,methods:{getPersonalizationStrategy:R6.getPersonalizationStrategy,setPersonalizationStrategy:R6.setPersonalizationStrategy}});return Ht.createSearchClient({...a,methods:{search:Ht.multipleQueries,searchForFacetValues:Ht.multipleSearchForFacetValues,multipleBatch:Ht.multipleBatch,multipleGetObjects:Ht.multipleGetObjects,multipleQueries:Ht.multipleQueries,copyIndex:Ht.copyIndex,copySettings:Ht.copySettings,copyRules:Ht.copyRules,copySynonyms:Ht.copySynonyms,moveIndex:Ht.moveIndex,listIndices:Ht.listIndices,getLogs:Ht.getLogs,listClusters:Ht.listClusters,multipleSearchForFacetValues:Ht.multipleSearchForFacetValues,getApiKey:Ht.getApiKey,addApiKey:Ht.addApiKey,listApiKeys:Ht.listApiKeys,updateApiKey:Ht.updateApiKey,deleteApiKey:Ht.deleteApiKey,restoreApiKey:Ht.restoreApiKey,assignUserID:Ht.assignUserID,assignUserIDs:Ht.assignUserIDs,getUserID:Ht.getUserID,searchUserIDs:Ht.searchUserIDs,listUserIDs:Ht.listUserIDs,getTopUserIDs:Ht.getTopUserIDs,removeUserID:Ht.removeUserID,hasPendingMappings:Ht.hasPendingMappings,generateSecuredApiKey:Ht.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:Ht.getSecuredApiKeyRemainingValidity,destroy:T6.destroy,clearDictionaryEntries:Ht.clearDictionaryEntries,deleteDictionaryEntries:Ht.deleteDictionaryEntries,getDictionarySettings:Ht.getDictionarySettings,getAppTask:Ht.getAppTask,replaceDictionaryEntries:Ht.replaceDictionaryEntries,saveDictionaryEntries:Ht.saveDictionaryEntries,searchDictionaryEntries:Ht.searchDictionaryEntries,setDictionarySettings:Ht.setDictionarySettings,waitAppTask:Ht.waitAppTask,customRequest:Ht.customRequest,initIndex:u=>A=>Ht.initIndex(u)(A,{methods:{batch:Ht.batch,delete:Ht.deleteIndex,findAnswers:Ht.findAnswers,getObject:Ht.getObject,getObjects:Ht.getObjects,saveObject:Ht.saveObject,saveObjects:Ht.saveObjects,search:Ht.search,searchForFacetValues:Ht.searchForFacetValues,waitTask:Ht.waitTask,setSettings:Ht.setSettings,getSettings:Ht.getSettings,partialUpdateObject:Ht.partialUpdateObject,partialUpdateObjects:Ht.partialUpdateObjects,deleteObject:Ht.deleteObject,deleteObjects:Ht.deleteObjects,deleteBy:Ht.deleteBy,clearObjects:Ht.clearObjects,browseObjects:Ht.browseObjects,getObjectPosition:Ht.getObjectPosition,findObject:Ht.findObject,exists:Ht.exists,saveSynonym:Ht.saveSynonym,saveSynonyms:Ht.saveSynonyms,getSynonym:Ht.getSynonym,searchSynonyms:Ht.searchSynonyms,browseSynonyms:Ht.browseSynonyms,deleteSynonym:Ht.deleteSynonym,clearSynonyms:Ht.clearSynonyms,replaceAllObjects:Ht.replaceAllObjects,replaceAllSynonyms:Ht.replaceAllSynonyms,searchRules:Ht.searchRules,getRule:Ht.getRule,deleteRule:Ht.deleteRule,saveRule:Ht.saveRule,saveRules:Ht.saveRules,replaceAllRules:Ht.replaceAllRules,browseRules:Ht.browseRules,clearRules:Ht.clearRules}}),initAnalytics:()=>u=>gC.createAnalyticsClient({...o,...u,methods:{addABTest:gC.addABTest,getABTest:gC.getABTest,getABTests:gC.getABTests,stopABTest:gC.stopABTest,deleteABTest:gC.deleteABTest}}),initPersonalization:n,initRecommendation:()=>u=>(a.logger.info("The `initRecommendation` method is deprecated. Use `initPersonalization` instead."),n()(u))}})}dEe.version=T6.version;mEe.exports=dEe});var N6=_((RYt,L6)=>{var EEe=yEe();L6.exports=EEe;L6.exports.default=EEe});var U6=_((LYt,wEe)=>{"use strict";var IEe=Object.getOwnPropertySymbols,lyt=Object.prototype.hasOwnProperty,cyt=Object.prototype.propertyIsEnumerable;function uyt(t){if(t==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}function Ayt(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de",Object.getOwnPropertyNames(t)[0]==="5")return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;var o=Object.getOwnPropertyNames(e).map(function(n){return e[n]});if(o.join("")!=="0123456789")return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(n){a[n]=n}),Object.keys(Object.assign({},a)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}wEe.exports=Ayt()?Object.assign:function(t,e){for(var r,o=uyt(t),a,n=1;n{"use strict";var H6=U6(),dC=60103,DEe=60106;Cn.Fragment=60107;Cn.StrictMode=60108;Cn.Profiler=60114;var SEe=60109,PEe=60110,xEe=60112;Cn.Suspense=60113;var bEe=60115,kEe=60116;typeof Symbol=="function"&&Symbol.for&&(sc=Symbol.for,dC=sc("react.element"),DEe=sc("react.portal"),Cn.Fragment=sc("react.fragment"),Cn.StrictMode=sc("react.strict_mode"),Cn.Profiler=sc("react.profiler"),SEe=sc("react.provider"),PEe=sc("react.context"),xEe=sc("react.forward_ref"),Cn.Suspense=sc("react.suspense"),bEe=sc("react.memo"),kEe=sc("react.lazy"));var sc,BEe=typeof Symbol=="function"&&Symbol.iterator;function fyt(t){return t===null||typeof t!="object"?null:(t=BEe&&t[BEe]||t["@@iterator"],typeof t=="function"?t:null)}function mB(t){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+t,r=1;r{"use strict";UEe.exports=MEe()});var V6=_((MYt,Y6)=>{"use strict";var gn=Y6.exports;Y6.exports.default=gn;var Gn="\x1B[",yB="\x1B]",yC="\x07",cQ=";",_Ee=process.env.TERM_PROGRAM==="Apple_Terminal";gn.cursorTo=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");return typeof e!="number"?Gn+(t+1)+"G":Gn+(e+1)+";"+(t+1)+"H"};gn.cursorMove=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");let r="";return t<0?r+=Gn+-t+"D":t>0&&(r+=Gn+t+"C"),e<0?r+=Gn+-e+"A":e>0&&(r+=Gn+e+"B"),r};gn.cursorUp=(t=1)=>Gn+t+"A";gn.cursorDown=(t=1)=>Gn+t+"B";gn.cursorForward=(t=1)=>Gn+t+"C";gn.cursorBackward=(t=1)=>Gn+t+"D";gn.cursorLeft=Gn+"G";gn.cursorSavePosition=_Ee?"\x1B7":Gn+"s";gn.cursorRestorePosition=_Ee?"\x1B8":Gn+"u";gn.cursorGetPosition=Gn+"6n";gn.cursorNextLine=Gn+"E";gn.cursorPrevLine=Gn+"F";gn.cursorHide=Gn+"?25l";gn.cursorShow=Gn+"?25h";gn.eraseLines=t=>{let e="";for(let r=0;r[yB,"8",cQ,cQ,e,yC,t,yB,"8",cQ,cQ,yC].join("");gn.image=(t,e={})=>{let r=`${yB}1337;File=inline=1`;return e.width&&(r+=`;width=${e.width}`),e.height&&(r+=`;height=${e.height}`),e.preserveAspectRatio===!1&&(r+=";preserveAspectRatio=0"),r+":"+t.toString("base64")+yC};gn.iTerm={setCwd:(t=process.cwd())=>`${yB}50;CurrentDir=${t}${yC}`,annotation:(t,e={})=>{let r=`${yB}1337;`,o=typeof e.x<"u",a=typeof e.y<"u";if((o||a)&&!(o&&a&&typeof e.length<"u"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return t=t.replace(/\|/g,""),r+=e.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",e.length>0?r+=(o?[t,e.length,e.x,e.y]:[e.length,t]).join("|"):r+=t,r+yC}}});var qEe=_((UYt,K6)=>{"use strict";var HEe=(t,e)=>{for(let r of Reflect.ownKeys(e))Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(e,r));return t};K6.exports=HEe;K6.exports.default=HEe});var GEe=_((_Yt,AQ)=>{"use strict";var myt=qEe(),uQ=new WeakMap,jEe=(t,e={})=>{if(typeof t!="function")throw new TypeError("Expected a function");let r,o=0,a=t.displayName||t.name||"",n=function(...u){if(uQ.set(n,++o),o===1)r=t.apply(this,u),t=null;else if(e.throw===!0)throw new Error(`Function \`${a}\` can only be called once`);return r};return myt(n,t),uQ.set(n,o),n};AQ.exports=jEe;AQ.exports.default=jEe;AQ.exports.callCount=t=>{if(!uQ.has(t))throw new Error(`The given function \`${t.name}\` is not wrapped by the \`onetime\` package`);return uQ.get(t)}});var WEe=_((HYt,fQ)=>{fQ.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&fQ.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&fQ.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var X6=_((qYt,IC)=>{var wi=global.process,td=function(t){return t&&typeof t=="object"&&typeof t.removeListener=="function"&&typeof t.emit=="function"&&typeof t.reallyExit=="function"&&typeof t.listeners=="function"&&typeof t.kill=="function"&&typeof t.pid=="number"&&typeof t.on=="function"};td(wi)?(YEe=ve("assert"),EC=WEe(),VEe=/^win/i.test(wi.platform),EB=ve("events"),typeof EB!="function"&&(EB=EB.EventEmitter),wi.__signal_exit_emitter__?ks=wi.__signal_exit_emitter__:(ks=wi.__signal_exit_emitter__=new EB,ks.count=0,ks.emitted={}),ks.infinite||(ks.setMaxListeners(1/0),ks.infinite=!0),IC.exports=function(t,e){if(!td(global.process))return function(){};YEe.equal(typeof t,"function","a callback must be provided for exit handler"),CC===!1&&J6();var r="exit";e&&e.alwaysLast&&(r="afterexit");var o=function(){ks.removeListener(r,t),ks.listeners("exit").length===0&&ks.listeners("afterexit").length===0&&pQ()};return ks.on(r,t),o},pQ=function(){!CC||!td(global.process)||(CC=!1,EC.forEach(function(e){try{wi.removeListener(e,hQ[e])}catch{}}),wi.emit=gQ,wi.reallyExit=z6,ks.count-=1)},IC.exports.unload=pQ,rd=function(e,r,o){ks.emitted[e]||(ks.emitted[e]=!0,ks.emit(e,r,o))},hQ={},EC.forEach(function(t){hQ[t]=function(){if(td(global.process)){var r=wi.listeners(t);r.length===ks.count&&(pQ(),rd("exit",null,t),rd("afterexit",null,t),VEe&&t==="SIGHUP"&&(t="SIGINT"),wi.kill(wi.pid,t))}}}),IC.exports.signals=function(){return EC},CC=!1,J6=function(){CC||!td(global.process)||(CC=!0,ks.count+=1,EC=EC.filter(function(e){try{return wi.on(e,hQ[e]),!0}catch{return!1}}),wi.emit=JEe,wi.reallyExit=KEe)},IC.exports.load=J6,z6=wi.reallyExit,KEe=function(e){td(global.process)&&(wi.exitCode=e||0,rd("exit",wi.exitCode,null),rd("afterexit",wi.exitCode,null),z6.call(wi,wi.exitCode))},gQ=wi.emit,JEe=function(e,r){if(e==="exit"&&td(global.process)){r!==void 0&&(wi.exitCode=r);var o=gQ.apply(this,arguments);return rd("exit",wi.exitCode,null),rd("afterexit",wi.exitCode,null),o}else return gQ.apply(this,arguments)}):IC.exports=function(){return function(){}};var YEe,EC,VEe,EB,ks,pQ,rd,hQ,CC,J6,z6,KEe,gQ,JEe});var XEe=_((jYt,zEe)=>{"use strict";var yyt=GEe(),Eyt=X6();zEe.exports=yyt(()=>{Eyt(()=>{process.stderr.write("\x1B[?25h")},{alwaysLast:!0})})});var Z6=_(wC=>{"use strict";var Cyt=XEe(),dQ=!1;wC.show=(t=process.stderr)=>{t.isTTY&&(dQ=!1,t.write("\x1B[?25h"))};wC.hide=(t=process.stderr)=>{t.isTTY&&(Cyt(),dQ=!0,t.write("\x1B[?25l"))};wC.toggle=(t,e)=>{t!==void 0&&(dQ=t),dQ?wC.show(e):wC.hide(e)}});var tCe=_(CB=>{"use strict";var eCe=CB&&CB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(CB,"__esModule",{value:!0});var ZEe=eCe(V6()),$Ee=eCe(Z6()),Iyt=(t,{showCursor:e=!1}={})=>{let r=0,o="",a=!1,n=u=>{!e&&!a&&($Ee.default.hide(),a=!0);let A=u+` -`;A!==o&&(o=A,t.write(ZEe.default.eraseLines(r)+A),r=A.split(` -`).length)};return n.clear=()=>{t.write(ZEe.default.eraseLines(r)),o="",r=0},n.done=()=>{o="",r=0,e||($Ee.default.show(),a=!1)},n};CB.default={create:Iyt}});var rCe=_((YYt,wyt)=>{wyt.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}}]});var sCe=_(Cl=>{"use strict";var iCe=rCe(),gA=process.env;Object.defineProperty(Cl,"_vendors",{value:iCe.map(function(t){return t.constant})});Cl.name=null;Cl.isPR=null;iCe.forEach(function(t){var e=Array.isArray(t.env)?t.env:[t.env],r=e.every(function(o){return nCe(o)});if(Cl[t.constant]=r,r)switch(Cl.name=t.name,typeof t.pr){case"string":Cl.isPR=!!gA[t.pr];break;case"object":"env"in t.pr?Cl.isPR=t.pr.env in gA&&gA[t.pr.env]!==t.pr.ne:"any"in t.pr?Cl.isPR=t.pr.any.some(function(o){return!!gA[o]}):Cl.isPR=nCe(t.pr);break;default:Cl.isPR=null}});Cl.isCI=!!(gA.CI||gA.CONTINUOUS_INTEGRATION||gA.BUILD_NUMBER||gA.RUN_ID||Cl.name);function nCe(t){return typeof t=="string"?!!gA[t]:Object.keys(t).every(function(e){return gA[e]===t[e]})}});var aCe=_((KYt,oCe)=>{"use strict";oCe.exports=sCe().isCI});var cCe=_((JYt,lCe)=>{"use strict";var Byt=t=>{let e=new Set;do for(let r of Reflect.ownKeys(t))e.add([t,r]);while((t=Reflect.getPrototypeOf(t))&&t!==Object.prototype);return e};lCe.exports=(t,{include:e,exclude:r}={})=>{let o=a=>{let n=u=>typeof u=="string"?a===u:u.test(a);return e?e.some(n):r?!r.some(n):!0};for(let[a,n]of Byt(t.constructor.prototype)){if(n==="constructor"||!o(n))continue;let u=Reflect.getOwnPropertyDescriptor(a,n);u&&typeof u.value=="function"&&(t[n]=t[n].bind(t))}return t}});var gCe=_(Hn=>{"use strict";var vC,BB,CQ,sq;typeof performance=="object"&&typeof performance.now=="function"?(uCe=performance,Hn.unstable_now=function(){return uCe.now()}):($6=Date,ACe=$6.now(),Hn.unstable_now=function(){return $6.now()-ACe});var uCe,$6,ACe;typeof window>"u"||typeof MessageChannel!="function"?(BC=null,eq=null,tq=function(){if(BC!==null)try{var t=Hn.unstable_now();BC(!0,t),BC=null}catch(e){throw setTimeout(tq,0),e}},vC=function(t){BC!==null?setTimeout(vC,0,t):(BC=t,setTimeout(tq,0))},BB=function(t,e){eq=setTimeout(t,e)},CQ=function(){clearTimeout(eq)},Hn.unstable_shouldYield=function(){return!1},sq=Hn.unstable_forceFrameRate=function(){}):(fCe=window.setTimeout,pCe=window.clearTimeout,typeof console<"u"&&(hCe=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),typeof hCe!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")),IB=!1,wB=null,mQ=-1,rq=5,nq=0,Hn.unstable_shouldYield=function(){return Hn.unstable_now()>=nq},sq=function(){},Hn.unstable_forceFrameRate=function(t){0>t||125>>1,a=t[o];if(a!==void 0&&0EQ(u,r))p!==void 0&&0>EQ(p,u)?(t[o]=p,t[A]=r,o=A):(t[o]=u,t[n]=r,o=n);else if(p!==void 0&&0>EQ(p,r))t[o]=p,t[A]=r,o=A;else break e}}return e}return null}function EQ(t,e){var r=t.sortIndex-e.sortIndex;return r!==0?r:t.id-e.id}var dA=[],Uh=[],vyt=1,oc=null,bo=3,wQ=!1,nd=!1,vB=!1;function aq(t){for(var e=ou(Uh);e!==null;){if(e.callback===null)IQ(Uh);else if(e.startTime<=t)IQ(Uh),e.sortIndex=e.expirationTime,oq(dA,e);else break;e=ou(Uh)}}function lq(t){if(vB=!1,aq(t),!nd)if(ou(dA)!==null)nd=!0,vC(cq);else{var e=ou(Uh);e!==null&&BB(lq,e.startTime-t)}}function cq(t,e){nd=!1,vB&&(vB=!1,CQ()),wQ=!0;var r=bo;try{for(aq(e),oc=ou(dA);oc!==null&&(!(oc.expirationTime>e)||t&&!Hn.unstable_shouldYield());){var o=oc.callback;if(typeof o=="function"){oc.callback=null,bo=oc.priorityLevel;var a=o(oc.expirationTime<=e);e=Hn.unstable_now(),typeof a=="function"?oc.callback=a:oc===ou(dA)&&IQ(dA),aq(e)}else IQ(dA);oc=ou(dA)}if(oc!==null)var n=!0;else{var u=ou(Uh);u!==null&&BB(lq,u.startTime-e),n=!1}return n}finally{oc=null,bo=r,wQ=!1}}var Dyt=sq;Hn.unstable_IdlePriority=5;Hn.unstable_ImmediatePriority=1;Hn.unstable_LowPriority=4;Hn.unstable_NormalPriority=3;Hn.unstable_Profiling=null;Hn.unstable_UserBlockingPriority=2;Hn.unstable_cancelCallback=function(t){t.callback=null};Hn.unstable_continueExecution=function(){nd||wQ||(nd=!0,vC(cq))};Hn.unstable_getCurrentPriorityLevel=function(){return bo};Hn.unstable_getFirstCallbackNode=function(){return ou(dA)};Hn.unstable_next=function(t){switch(bo){case 1:case 2:case 3:var e=3;break;default:e=bo}var r=bo;bo=e;try{return t()}finally{bo=r}};Hn.unstable_pauseExecution=function(){};Hn.unstable_requestPaint=Dyt;Hn.unstable_runWithPriority=function(t,e){switch(t){case 1:case 2:case 3:case 4:case 5:break;default:t=3}var r=bo;bo=t;try{return e()}finally{bo=r}};Hn.unstable_scheduleCallback=function(t,e,r){var o=Hn.unstable_now();switch(typeof r=="object"&&r!==null?(r=r.delay,r=typeof r=="number"&&0o?(t.sortIndex=r,oq(Uh,t),ou(dA)===null&&t===ou(Uh)&&(vB?CQ():vB=!0,BB(lq,r-o))):(t.sortIndex=a,oq(dA,t),nd||wQ||(nd=!0,vC(cq))),t};Hn.unstable_wrapCallback=function(t){var e=bo;return function(){var r=bo;bo=e;try{return t.apply(this,arguments)}finally{bo=r}}}});var uq=_((XYt,dCe)=>{"use strict";dCe.exports=gCe()});var mCe=_((ZYt,DB)=>{DB.exports=function(e){var r={},o=U6(),a=ln(),n=uq();function u(v){for(var S="https://reactjs.org/docs/error-decoder.html?invariant="+v,Q=1;QUe||Y[Be]!==ne[Ue])return` -`+Y[Be].replace(" at new "," at ");while(1<=Be&&0<=Ue);break}}}finally{we=!1,Error.prepareStackTrace=Q}return(v=v?v.displayName||v.name:"")?Il(v):""}var wl=[],Bi=-1;function Ls(v){return{current:v}}function Ft(v){0>Bi||(v.current=wl[Bi],wl[Bi]=null,Bi--)}function Bn(v,S){Bi++,wl[Bi]=v.current,v.current=S}var Lo={},ki=Ls(Lo),vi=Ls(!1),sa=Lo;function un(v,S){var Q=v.type.contextTypes;if(!Q)return Lo;var H=v.stateNode;if(H&&H.__reactInternalMemoizedUnmaskedChildContext===S)return H.__reactInternalMemoizedMaskedChildContext;var Y={},ne;for(ne in Q)Y[ne]=S[ne];return H&&(v=v.stateNode,v.__reactInternalMemoizedUnmaskedChildContext=S,v.__reactInternalMemoizedMaskedChildContext=Y),Y}function qn(v){return v=v.childContextTypes,v!=null}function Ec(){Ft(vi),Ft(ki)}function lp(v,S,Q){if(ki.current!==Lo)throw Error(u(168));Bn(ki,S),Bn(vi,Q)}function oa(v,S,Q){var H=v.stateNode;if(v=S.childContextTypes,typeof H.getChildContext!="function")return Q;H=H.getChildContext();for(var Y in H)if(!(Y in v))throw Error(u(108,g(S)||"Unknown",Y));return o({},Q,H)}function aa(v){return v=(v=v.stateNode)&&v.__reactInternalMemoizedMergedChildContext||Lo,sa=ki.current,Bn(ki,v),Bn(vi,vi.current),!0}function la(v,S,Q){var H=v.stateNode;if(!H)throw Error(u(169));Q?(v=oa(v,S,sa),H.__reactInternalMemoizedMergedChildContext=v,Ft(vi),Ft(ki),Bn(ki,v)):Ft(vi),Bn(vi,Q)}var Ze=null,ca=null,mu=n.unstable_now;mu();var Bl=0,dn=8;function No(v){if(1&v)return dn=15,1;if(2&v)return dn=14,2;if(4&v)return dn=13,4;var S=24&v;return S!==0?(dn=12,S):v&32?(dn=11,32):(S=192&v,S!==0?(dn=10,S):v&256?(dn=9,256):(S=3584&v,S!==0?(dn=8,S):v&4096?(dn=7,4096):(S=4186112&v,S!==0?(dn=6,S):(S=62914560&v,S!==0?(dn=5,S):v&67108864?(dn=4,67108864):v&134217728?(dn=3,134217728):(S=805306368&v,S!==0?(dn=2,S):1073741824&v?(dn=1,1073741824):(dn=8,v))))))}function RA(v){switch(v){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}function TA(v){switch(v){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(u(358,v))}}function Oo(v,S){var Q=v.pendingLanes;if(Q===0)return dn=0;var H=0,Y=0,ne=v.expiredLanes,Be=v.suspendedLanes,Ue=v.pingedLanes;if(ne!==0)H=ne,Y=dn=15;else if(ne=Q&134217727,ne!==0){var ft=ne&~Be;ft!==0?(H=No(ft),Y=dn):(Ue&=ne,Ue!==0&&(H=No(Ue),Y=dn))}else ne=Q&~Be,ne!==0?(H=No(ne),Y=dn):Ue!==0&&(H=No(Ue),Y=dn);if(H===0)return 0;if(H=31-qi(H),H=Q&((0>H?0:1<Q;Q++)S.push(v);return S}function ua(v,S,Q){v.pendingLanes|=S;var H=S-1;v.suspendedLanes&=H,v.pingedLanes&=H,v=v.eventTimes,S=31-qi(S),v[S]=Q}var qi=Math.clz32?Math.clz32:Dl,vl=Math.log,Cc=Math.LN2;function Dl(v){return v===0?32:31-(vl(v)/Cc|0)|0}var Aa=n.unstable_runWithPriority,Di=n.unstable_scheduleCallback,rs=n.unstable_cancelCallback,ja=n.unstable_shouldYield,yu=n.unstable_requestPaint,Sl=n.unstable_now,pi=n.unstable_getCurrentPriorityLevel,Dn=n.unstable_ImmediatePriority,Pl=n.unstable_UserBlockingPriority,Je=n.unstable_NormalPriority,st=n.unstable_LowPriority,vt=n.unstable_IdlePriority,ar={},ee=yu!==void 0?yu:function(){},ye=null,Ne=null,gt=!1,mt=Sl(),Dt=1e4>mt?Sl:function(){return Sl()-mt};function er(){switch(pi()){case Dn:return 99;case Pl:return 98;case Je:return 97;case st:return 96;case vt:return 95;default:throw Error(u(332))}}function sn(v){switch(v){case 99:return Dn;case 98:return Pl;case 97:return Je;case 96:return st;case 95:return vt;default:throw Error(u(332))}}function ei(v,S){return v=sn(v),Aa(v,S)}function Qi(v,S,Q){return v=sn(v),Di(v,S,Q)}function Sn(){if(Ne!==null){var v=Ne;Ne=null,rs(v)}fa()}function fa(){if(!gt&&ye!==null){gt=!0;var v=0;try{var S=ye;ei(99,function(){for(;vPn?(Tn=xr,xr=null):Tn=xr.sibling;var Yr=Xt($e,xr,pt[Pn],zt);if(Yr===null){xr===null&&(xr=Tn);break}v&&xr&&Yr.alternate===null&&S($e,xr),je=ne(Yr,je,Pn),Wn===null?Br=Yr:Wn.sibling=Yr,Wn=Yr,xr=Tn}if(Pn===pt.length)return Q($e,xr),Br;if(xr===null){for(;PnPn?(Tn=xr,xr=null):Tn=xr.sibling;var ti=Xt($e,xr,Yr.value,zt);if(ti===null){xr===null&&(xr=Tn);break}v&&xr&&ti.alternate===null&&S($e,xr),je=ne(ti,je,Pn),Wn===null?Br=ti:Wn.sibling=ti,Wn=ti,xr=Tn}if(Yr.done)return Q($e,xr),Br;if(xr===null){for(;!Yr.done;Pn++,Yr=pt.next())Yr=Tr($e,Yr.value,zt),Yr!==null&&(je=ne(Yr,je,Pn),Wn===null?Br=Yr:Wn.sibling=Yr,Wn=Yr);return Br}for(xr=H($e,xr);!Yr.done;Pn++,Yr=pt.next())Yr=jn(xr,$e,Pn,Yr.value,zt),Yr!==null&&(v&&Yr.alternate!==null&&xr.delete(Yr.key===null?Pn:Yr.key),je=ne(Yr,je,Pn),Wn===null?Br=Yr:Wn.sibling=Yr,Wn=Yr);return v&&xr.forEach(function(Rc){return S($e,Rc)}),Br}return function($e,je,pt,zt){var Br=typeof pt=="object"&&pt!==null&&pt.type===E&&pt.key===null;Br&&(pt=pt.props.children);var Wn=typeof pt=="object"&&pt!==null;if(Wn)switch(pt.$$typeof){case p:e:{for(Wn=pt.key,Br=je;Br!==null;){if(Br.key===Wn){switch(Br.tag){case 7:if(pt.type===E){Q($e,Br.sibling),je=Y(Br,pt.props.children),je.return=$e,$e=je;break e}break;default:if(Br.elementType===pt.type){Q($e,Br.sibling),je=Y(Br,pt.props),je.ref=dt($e,Br,pt),je.return=$e,$e=je;break e}}Q($e,Br);break}else S($e,Br);Br=Br.sibling}pt.type===E?(je=Ru(pt.props.children,$e.mode,zt,pt.key),je.return=$e,$e=je):(zt=k0(pt.type,pt.key,pt.props,null,$e.mode,zt),zt.ref=dt($e,je,pt),zt.return=$e,$e=zt)}return Be($e);case h:e:{for(Br=pt.key;je!==null;){if(je.key===Br)if(je.tag===4&&je.stateNode.containerInfo===pt.containerInfo&&je.stateNode.implementation===pt.implementation){Q($e,je.sibling),je=Y(je,pt.children||[]),je.return=$e,$e=je;break e}else{Q($e,je);break}else S($e,je);je=je.sibling}je=ao(pt,$e.mode,zt),je.return=$e,$e=je}return Be($e)}if(typeof pt=="string"||typeof pt=="number")return pt=""+pt,je!==null&&je.tag===6?(Q($e,je.sibling),je=Y(je,pt),je.return=$e,$e=je):(Q($e,je),je=ZI(pt,$e.mode,zt),je.return=$e,$e=je),Be($e);if(Cu(pt))return li($e,je,pt,zt);if(Ee(pt))return Ea($e,je,pt,zt);if(Wn&&wc($e,pt),typeof pt>"u"&&!Br)switch($e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(u(152,g($e.type)||"Component"))}return Q($e,je)}}var c0=xd(!0),DI=xd(!1),hp={},cr=Ls(hp),Ni=Ls(hp),Iu=Ls(hp);function pa(v){if(v===hp)throw Error(u(174));return v}function u0(v,S){Bn(Iu,S),Bn(Ni,v),Bn(cr,hp),v=ht(S),Ft(cr),Bn(cr,v)}function Bc(){Ft(cr),Ft(Ni),Ft(Iu)}function wu(v){var S=pa(Iu.current),Q=pa(cr.current);S=q(Q,v.type,S),Q!==S&&(Bn(Ni,v),Bn(cr,S))}function wt(v){Ni.current===v&&(Ft(cr),Ft(Ni))}var oi=Ls(0);function UA(v){for(var S=v;S!==null;){if(S.tag===13){var Q=S.memoizedState;if(Q!==null&&(Q=Q.dehydrated,Q===null||pr(Q)||Me(Q)))return S}else if(S.tag===19&&S.memoizedProps.revealOrder!==void 0){if(S.flags&64)return S}else if(S.child!==null){S.child.return=S,S=S.child;continue}if(S===v)break;for(;S.sibling===null;){if(S.return===null||S.return===v)return null;S=S.return}S.sibling.return=S.return,S=S.sibling}return null}var ha=null,Uo=null,ga=!1;function A0(v,S){var Q=ya(5,null,null,0);Q.elementType="DELETED",Q.type="DELETED",Q.stateNode=S,Q.return=v,Q.flags=8,v.lastEffect!==null?(v.lastEffect.nextEffect=Q,v.lastEffect=Q):v.firstEffect=v.lastEffect=Q}function gp(v,S){switch(v.tag){case 5:return S=To(S,v.type,v.pendingProps),S!==null?(v.stateNode=S,!0):!1;case 6:return S=kA(S,v.pendingProps),S!==null?(v.stateNode=S,!0):!1;case 13:return!1;default:return!1}}function f0(v){if(ga){var S=Uo;if(S){var Q=S;if(!gp(v,S)){if(S=ia(Q),!S||!gp(v,S)){v.flags=v.flags&-1025|2,ga=!1,ha=v;return}A0(ha,Q)}ha=v,Uo=dc(S)}else v.flags=v.flags&-1025|2,ga=!1,ha=v}}function bd(v){for(v=v.return;v!==null&&v.tag!==5&&v.tag!==3&&v.tag!==13;)v=v.return;ha=v}function _A(v){if(!X||v!==ha)return!1;if(!ga)return bd(v),ga=!0,!1;var S=v.type;if(v.tag!==5||S!=="head"&&S!=="body"&&!tt(S,v.memoizedProps))for(S=Uo;S;)A0(v,S),S=ia(S);if(bd(v),v.tag===13){if(!X)throw Error(u(316));if(v=v.memoizedState,v=v!==null?v.dehydrated:null,!v)throw Error(u(317));Uo=QA(v)}else Uo=ha?ia(v.stateNode):null;return!0}function p0(){X&&(Uo=ha=null,ga=!1)}var vc=[];function Dc(){for(var v=0;vne))throw Error(u(301));ne+=1,Ci=ji=null,S.updateQueue=null,Bu.current=re,v=Q(H,Y)}while(vu)}if(Bu.current=bt,S=ji!==null&&ji.next!==null,Sc=0,Ci=ji=On=null,HA=!1,S)throw Error(u(300));return v}function Gi(){var v={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Ci===null?On.memoizedState=Ci=v:Ci=Ci.next=v,Ci}function Va(){if(ji===null){var v=On.alternate;v=v!==null?v.memoizedState:null}else v=ji.next;var S=Ci===null?On.memoizedState:Ci.next;if(S!==null)Ci=S,ji=v;else{if(v===null)throw Error(u(310));ji=v,v={memoizedState:ji.memoizedState,baseState:ji.baseState,baseQueue:ji.baseQueue,queue:ji.queue,next:null},Ci===null?On.memoizedState=Ci=v:Ci=Ci.next=v}return Ci}function io(v,S){return typeof S=="function"?S(v):S}function Du(v){var S=Va(),Q=S.queue;if(Q===null)throw Error(u(311));Q.lastRenderedReducer=v;var H=ji,Y=H.baseQueue,ne=Q.pending;if(ne!==null){if(Y!==null){var Be=Y.next;Y.next=ne.next,ne.next=Be}H.baseQueue=Y=ne,Q.pending=null}if(Y!==null){Y=Y.next,H=H.baseState;var Ue=Be=ne=null,ft=Y;do{var jt=ft.lane;if((Sc&jt)===jt)Ue!==null&&(Ue=Ue.next={lane:0,action:ft.action,eagerReducer:ft.eagerReducer,eagerState:ft.eagerState,next:null}),H=ft.eagerReducer===v?ft.eagerState:v(H,ft.action);else{var wr={lane:jt,action:ft.action,eagerReducer:ft.eagerReducer,eagerState:ft.eagerState,next:null};Ue===null?(Be=Ue=wr,ne=H):Ue=Ue.next=wr,On.lanes|=jt,B0|=jt}ft=ft.next}while(ft!==null&&ft!==Y);Ue===null?ne=H:Ue.next=Be,eo(H,S.memoizedState)||(Ye=!0),S.memoizedState=H,S.baseState=ne,S.baseQueue=Ue,Q.lastRenderedState=H}return[S.memoizedState,Q.dispatch]}function Su(v){var S=Va(),Q=S.queue;if(Q===null)throw Error(u(311));Q.lastRenderedReducer=v;var H=Q.dispatch,Y=Q.pending,ne=S.memoizedState;if(Y!==null){Q.pending=null;var Be=Y=Y.next;do ne=v(ne,Be.action),Be=Be.next;while(Be!==Y);eo(ne,S.memoizedState)||(Ye=!0),S.memoizedState=ne,S.baseQueue===null&&(S.baseState=ne),Q.lastRenderedState=ne}return[ne,H]}function Ka(v,S,Q){var H=S._getVersion;H=H(S._source);var Y=y?S._workInProgressVersionPrimary:S._workInProgressVersionSecondary;if(Y!==null?v=Y===H:(v=v.mutableReadLanes,(v=(Sc&v)===v)&&(y?S._workInProgressVersionPrimary=H:S._workInProgressVersionSecondary=H,vc.push(S))),v)return Q(S._source);throw vc.push(S),Error(u(350))}function fn(v,S,Q,H){var Y=Os;if(Y===null)throw Error(u(349));var ne=S._getVersion,Be=ne(S._source),Ue=Bu.current,ft=Ue.useState(function(){return Ka(Y,S,Q)}),jt=ft[1],wr=ft[0];ft=Ci;var Tr=v.memoizedState,Xt=Tr.refs,jn=Xt.getSnapshot,li=Tr.source;Tr=Tr.subscribe;var Ea=On;return v.memoizedState={refs:Xt,source:S,subscribe:H},Ue.useEffect(function(){Xt.getSnapshot=Q,Xt.setSnapshot=jt;var $e=ne(S._source);if(!eo(Be,$e)){$e=Q(S._source),eo(wr,$e)||(jt($e),$e=ss(Ea),Y.mutableReadLanes|=$e&Y.pendingLanes),$e=Y.mutableReadLanes,Y.entangledLanes|=$e;for(var je=Y.entanglements,pt=$e;0Q?98:Q,function(){v(!0)}),ei(97qI&&(S.flags|=64,Y=!0,VA(H,!1),S.lanes=33554432)}else{if(!Y)if(v=UA(ne),v!==null){if(S.flags|=64,Y=!0,v=v.updateQueue,v!==null&&(S.updateQueue=v,S.flags|=4),VA(H,!0),H.tail===null&&H.tailMode==="hidden"&&!ne.alternate&&!ga)return S=S.lastEffect=H.lastEffect,S!==null&&(S.nextEffect=null),null}else 2*Dt()-H.renderingStartTime>qI&&Q!==1073741824&&(S.flags|=64,Y=!0,VA(H,!1),S.lanes=33554432);H.isBackwards?(ne.sibling=S.child,S.child=ne):(v=H.last,v!==null?v.sibling=ne:S.child=ne,H.last=ne)}return H.tail!==null?(v=H.tail,H.rendering=v,H.tail=v.sibling,H.lastEffect=S.lastEffect,H.renderingStartTime=Dt(),v.sibling=null,S=oi.current,Bn(oi,Y?S&1|2:S&1),v):null;case 23:case 24:return KI(),v!==null&&v.memoizedState!==null!=(S.memoizedState!==null)&&H.mode!=="unstable-defer-without-hiding"&&(S.flags|=4),null}throw Error(u(156,S.tag))}function qF(v){switch(v.tag){case 1:qn(v.type)&&Ec();var S=v.flags;return S&4096?(v.flags=S&-4097|64,v):null;case 3:if(Bc(),Ft(vi),Ft(ki),Dc(),S=v.flags,S&64)throw Error(u(285));return v.flags=S&-4097|64,v;case 5:return wt(v),null;case 13:return Ft(oi),S=v.flags,S&4096?(v.flags=S&-4097|64,v):null;case 19:return Ft(oi),null;case 4:return Bc(),null;case 10:return a0(v),null;case 23:case 24:return KI(),null;default:return null}}function m0(v,S){try{var Q="",H=S;do Q+=vI(H),H=H.return;while(H);var Y=Q}catch(ne){Y=` -Error generating stack: `+ne.message+` -`+ne.stack}return{value:v,source:S,stack:Y}}function y0(v,S){try{console.error(S.value)}catch(Q){setTimeout(function(){throw Q})}}var jF=typeof WeakMap=="function"?WeakMap:Map;function bI(v,S,Q){Q=Wa(-1,Q),Q.tag=3,Q.payload={element:null};var H=S.value;return Q.callback=function(){Wd||(Wd=!0,jI=H),y0(v,S)},Q}function E0(v,S,Q){Q=Wa(-1,Q),Q.tag=3;var H=v.type.getDerivedStateFromError;if(typeof H=="function"){var Y=S.value;Q.payload=function(){return y0(v,S),H(Y)}}var ne=v.stateNode;return ne!==null&&typeof ne.componentDidCatch=="function"&&(Q.callback=function(){typeof H!="function"&&(bl===null?bl=new Set([this]):bl.add(this),y0(v,S));var Be=S.stack;this.componentDidCatch(S.value,{componentStack:Be!==null?Be:""})}),Q}var GF=typeof WeakSet=="function"?WeakSet:Set;function kI(v){var S=v.ref;if(S!==null)if(typeof S=="function")try{S(null)}catch(Q){Fu(v,Q)}else S.current=null}function Td(v,S){switch(S.tag){case 0:case 11:case 15:case 22:return;case 1:if(S.flags&256&&v!==null){var Q=v.memoizedProps,H=v.memoizedState;v=S.stateNode,S=v.getSnapshotBeforeUpdate(S.elementType===S.type?Q:to(S.type,Q),H),v.__reactInternalSnapshotBeforeUpdate=S}return;case 3:R&&S.flags&256&&hs(S.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(u(163))}function wp(v,S){if(S=S.updateQueue,S=S!==null?S.lastEffect:null,S!==null){var Q=S=S.next;do{if((Q.tag&v)===v){var H=Q.destroy;Q.destroy=void 0,H!==void 0&&H()}Q=Q.next}while(Q!==S)}}function uD(v,S,Q){switch(Q.tag){case 0:case 11:case 15:case 22:if(S=Q.updateQueue,S=S!==null?S.lastEffect:null,S!==null){v=S=S.next;do{if((v.tag&3)===3){var H=v.create;v.destroy=H()}v=v.next}while(v!==S)}if(S=Q.updateQueue,S=S!==null?S.lastEffect:null,S!==null){v=S=S.next;do{var Y=v;H=Y.next,Y=Y.tag,Y&4&&Y&1&&(vD(Q,v),$F(Q,v)),v=H}while(v!==S)}return;case 1:v=Q.stateNode,Q.flags&4&&(S===null?v.componentDidMount():(H=Q.elementType===Q.type?S.memoizedProps:to(Q.type,S.memoizedProps),v.componentDidUpdate(H,S.memoizedState,v.__reactInternalSnapshotBeforeUpdate))),S=Q.updateQueue,S!==null&&Sd(Q,S,v);return;case 3:if(S=Q.updateQueue,S!==null){if(v=null,Q.child!==null)switch(Q.child.tag){case 5:v=Re(Q.child.stateNode);break;case 1:v=Q.child.stateNode}Sd(Q,S,v)}return;case 5:v=Q.stateNode,S===null&&Q.flags&4&&Qs(v,Q.type,Q.memoizedProps,Q);return;case 6:return;case 4:return;case 12:return;case 13:X&&Q.memoizedState===null&&(Q=Q.alternate,Q!==null&&(Q=Q.memoizedState,Q!==null&&(Q=Q.dehydrated,Q!==null&&mc(Q))));return;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(u(163))}function AD(v,S){if(R)for(var Q=v;;){if(Q.tag===5){var H=Q.stateNode;S?op(H):Rs(Q.stateNode,Q.memoizedProps)}else if(Q.tag===6)H=Q.stateNode,S?ap(H):Nn(H,Q.memoizedProps);else if((Q.tag!==23&&Q.tag!==24||Q.memoizedState===null||Q===v)&&Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===v)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===v)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}}function Ld(v,S){if(ca&&typeof ca.onCommitFiberUnmount=="function")try{ca.onCommitFiberUnmount(Ze,S)}catch{}switch(S.tag){case 0:case 11:case 14:case 15:case 22:if(v=S.updateQueue,v!==null&&(v=v.lastEffect,v!==null)){var Q=v=v.next;do{var H=Q,Y=H.destroy;if(H=H.tag,Y!==void 0)if(H&4)vD(S,Q);else{H=S;try{Y()}catch(ne){Fu(H,ne)}}Q=Q.next}while(Q!==v)}break;case 1:if(kI(S),v=S.stateNode,typeof v.componentWillUnmount=="function")try{v.props=S.memoizedProps,v.state=S.memoizedState,v.componentWillUnmount()}catch(ne){Fu(S,ne)}break;case 5:kI(S);break;case 4:R?gD(v,S):z&&z&&(S=S.stateNode.containerInfo,v=pc(S),xA(S,v))}}function fD(v,S){for(var Q=S;;)if(Ld(v,Q),Q.child===null||R&&Q.tag===4){if(Q===S)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===S)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}else Q.child.return=Q,Q=Q.child}function Nd(v){v.alternate=null,v.child=null,v.dependencies=null,v.firstEffect=null,v.lastEffect=null,v.memoizedProps=null,v.memoizedState=null,v.pendingProps=null,v.return=null,v.updateQueue=null}function pD(v){return v.tag===5||v.tag===3||v.tag===4}function hD(v){if(R){e:{for(var S=v.return;S!==null;){if(pD(S))break e;S=S.return}throw Error(u(160))}var Q=S;switch(S=Q.stateNode,Q.tag){case 5:var H=!1;break;case 3:S=S.containerInfo,H=!0;break;case 4:S=S.containerInfo,H=!0;break;default:throw Error(u(161))}Q.flags&16&&(gu(S),Q.flags&=-17);e:t:for(Q=v;;){for(;Q.sibling===null;){if(Q.return===null||pD(Q.return)){Q=null;break e}Q=Q.return}for(Q.sibling.return=Q.return,Q=Q.sibling;Q.tag!==5&&Q.tag!==6&&Q.tag!==18;){if(Q.flags&2||Q.child===null||Q.tag===4)continue t;Q.child.return=Q,Q=Q.child}if(!(Q.flags&2)){Q=Q.stateNode;break e}}H?QI(v,Q,S):FI(v,Q,S)}}function QI(v,S,Q){var H=v.tag,Y=H===5||H===6;if(Y)v=Y?v.stateNode:v.stateNode.instance,S?Fs(Q,v,S):Xs(Q,v);else if(H!==4&&(v=v.child,v!==null))for(QI(v,S,Q),v=v.sibling;v!==null;)QI(v,S,Q),v=v.sibling}function FI(v,S,Q){var H=v.tag,Y=H===5||H===6;if(Y)v=Y?v.stateNode:v.stateNode.instance,S?bi(Q,v,S):$n(Q,v);else if(H!==4&&(v=v.child,v!==null))for(FI(v,S,Q),v=v.sibling;v!==null;)FI(v,S,Q),v=v.sibling}function gD(v,S){for(var Q=S,H=!1,Y,ne;;){if(!H){H=Q.return;e:for(;;){if(H===null)throw Error(u(160));switch(Y=H.stateNode,H.tag){case 5:ne=!1;break e;case 3:Y=Y.containerInfo,ne=!0;break e;case 4:Y=Y.containerInfo,ne=!0;break e}H=H.return}H=!0}if(Q.tag===5||Q.tag===6)fD(v,Q),ne?PA(Y,Q.stateNode):$s(Y,Q.stateNode);else if(Q.tag===4){if(Q.child!==null){Y=Q.stateNode.containerInfo,ne=!0,Q.child.return=Q,Q=Q.child;continue}}else if(Ld(v,Q),Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===S)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===S)return;Q=Q.return,Q.tag===4&&(H=!1)}Q.sibling.return=Q.return,Q=Q.sibling}}function RI(v,S){if(R){switch(S.tag){case 0:case 11:case 14:case 15:case 22:wp(3,S);return;case 1:return;case 5:var Q=S.stateNode;if(Q!=null){var H=S.memoizedProps;v=v!==null?v.memoizedProps:H;var Y=S.type,ne=S.updateQueue;S.updateQueue=null,ne!==null&&Zs(Q,ne,Y,v,H,S)}return;case 6:if(S.stateNode===null)throw Error(u(162));Q=S.memoizedProps,Hi(S.stateNode,v!==null?v.memoizedProps:Q,Q);return;case 3:X&&(S=S.stateNode,S.hydrate&&(S.hydrate=!1,FA(S.containerInfo)));return;case 12:return;case 13:dD(S),C0(S);return;case 19:C0(S);return;case 17:return;case 23:case 24:AD(S,S.memoizedState!==null);return}throw Error(u(163))}switch(S.tag){case 0:case 11:case 14:case 15:case 22:wp(3,S);return;case 12:return;case 13:dD(S),C0(S);return;case 19:C0(S);return;case 3:X&&(Q=S.stateNode,Q.hydrate&&(Q.hydrate=!1,FA(Q.containerInfo)));break;case 23:case 24:return}e:if(z){switch(S.tag){case 1:case 5:case 6:case 20:break e;case 3:case 4:S=S.stateNode,xA(S.containerInfo,S.pendingChildren);break e}throw Error(u(163))}}function dD(v){v.memoizedState!==null&&(HI=Dt(),R&&AD(v.child,!0))}function C0(v){var S=v.updateQueue;if(S!==null){v.updateQueue=null;var Q=v.stateNode;Q===null&&(Q=v.stateNode=new GF),S.forEach(function(H){var Y=tR.bind(null,v,H);Q.has(H)||(Q.add(H),H.then(Y,Y))})}}function WF(v,S){return v!==null&&(v=v.memoizedState,v===null||v.dehydrated!==null)?(S=S.memoizedState,S!==null&&S.dehydrated===null):!1}var Od=0,Md=1,Ud=2,I0=3,_d=4;if(typeof Symbol=="function"&&Symbol.for){var w0=Symbol.for;Od=w0("selector.component"),Md=w0("selector.has_pseudo_class"),Ud=w0("selector.role"),I0=w0("selector.test_id"),_d=w0("selector.text")}function Hd(v){var S=$(v);if(S!=null){if(typeof S.memoizedProps["data-testname"]!="string")throw Error(u(364));return S}if(v=nr(v),v===null)throw Error(u(362));return v.stateNode.current}function xu(v,S){switch(S.$$typeof){case Od:if(v.type===S.value)return!0;break;case Md:e:{S=S.value,v=[v,0];for(var Q=0;Q";case Md:return":has("+(bu(v)||"")+")";case Ud:return'[role="'+v.value+'"]';case _d:return'"'+v.value+'"';case I0:return'[data-testname="'+v.value+'"]';default:throw Error(u(365,v))}}function TI(v,S){var Q=[];v=[v,0];for(var H=0;HY&&(Y=Be),Q&=~ne}if(Q=Y,Q=Dt()-Q,Q=(120>Q?120:480>Q?480:1080>Q?1080:1920>Q?1920:3e3>Q?3e3:4320>Q?4320:1960*VF(Q/1960))-Q,10 component higher in the tree to provide a loading indicator or placeholder to display.`)}is!==5&&(is=2),ft=m0(ft,Ue),Xt=Be;do{switch(Xt.tag){case 3:ne=ft,Xt.flags|=4096,S&=-S,Xt.lanes|=S;var Wn=bI(Xt,ne,S);Dd(Xt,Wn);break e;case 1:ne=ft;var xr=Xt.type,Pn=Xt.stateNode;if(!(Xt.flags&64)&&(typeof xr.getDerivedStateFromError=="function"||Pn!==null&&typeof Pn.componentDidCatch=="function"&&(bl===null||!bl.has(Pn)))){Xt.flags|=4096,S&=-S,Xt.lanes|=S;var Tn=E0(Xt,ne,S);Dd(Xt,Tn);break e}}Xt=Xt.return}while(Xt!==null)}BD(Q)}catch(Yr){S=Yr,Oi===Q&&Q!==null&&(Oi=Q=Q.return);continue}break}while(!0)}function ID(){var v=jd.current;return jd.current=bt,v===null?bt:v}function b0(v,S){var Q=Pr;Pr|=16;var H=ID();Os===v&&ms===S||Sp(v,S);do try{JF();break}catch(Y){CD(v,Y)}while(!0);if(s0(),Pr=Q,jd.current=H,Oi!==null)throw Error(u(261));return Os=null,ms=0,is}function JF(){for(;Oi!==null;)wD(Oi)}function zF(){for(;Oi!==null&&!ja();)wD(Oi)}function wD(v){var S=PD(v.alternate,v,KA);v.memoizedProps=v.pendingProps,S===null?BD(v):Oi=S,NI.current=null}function BD(v){var S=v;do{var Q=S.alternate;if(v=S.return,S.flags&2048){if(Q=qF(S),Q!==null){Q.flags&=2047,Oi=Q;return}v!==null&&(v.firstEffect=v.lastEffect=null,v.flags|=2048)}else{if(Q=HF(Q,S,KA),Q!==null){Oi=Q;return}if(Q=S,Q.tag!==24&&Q.tag!==23||Q.memoizedState===null||KA&1073741824||!(Q.mode&4)){for(var H=0,Y=Q.child;Y!==null;)H|=Y.lanes|Y.childLanes,Y=Y.sibling;Q.childLanes=H}v!==null&&!(v.flags&2048)&&(v.firstEffect===null&&(v.firstEffect=S.firstEffect),S.lastEffect!==null&&(v.lastEffect!==null&&(v.lastEffect.nextEffect=S.firstEffect),v.lastEffect=S.lastEffect),1Dt()-HI?Sp(v,0):UI|=Q),qo(v,S)}function tR(v,S){var Q=v.stateNode;Q!==null&&Q.delete(S),S=0,S===0&&(S=v.mode,S&2?S&4?(kc===0&&(kc=Bp),S=vn(62914560&~kc),S===0&&(S=4194304)):S=er()===99?1:2:S=1),Q=oo(),v=Kd(v,S),v!==null&&(ua(v,S,Q),qo(v,Q))}var PD;PD=function(v,S,Q){var H=S.lanes;if(v!==null)if(v.memoizedProps!==S.pendingProps||vi.current)Ye=!0;else if(Q&H)Ye=!!(v.flags&16384);else{switch(Ye=!1,S.tag){case 3:Fd(S),p0();break;case 5:wu(S);break;case 1:qn(S.type)&&aa(S);break;case 4:u0(S,S.stateNode.containerInfo);break;case 10:o0(S,S.memoizedProps.value);break;case 13:if(S.memoizedState!==null)return Q&S.child.childLanes?PI(v,S,Q):(Bn(oi,oi.current&1),S=Mn(v,S,Q),S!==null?S.sibling:null);Bn(oi,oi.current&1);break;case 19:if(H=(Q&S.childLanes)!==0,v.flags&64){if(H)return cD(v,S,Q);S.flags|=64}var Y=S.memoizedState;if(Y!==null&&(Y.rendering=null,Y.tail=null,Y.lastEffect=null),Bn(oi,oi.current),H)break;return null;case 23:case 24:return S.lanes=0,ai(v,S,Q)}return Mn(v,S,Q)}else Ye=!1;switch(S.lanes=0,S.tag){case 2:if(H=S.type,v!==null&&(v.alternate=null,S.alternate=null,S.flags|=2),v=S.pendingProps,Y=un(S,ki.current),Eu(S,Q),Y=g0(null,S,H,v,Y,Q),S.flags|=1,typeof Y=="object"&&Y!==null&&typeof Y.render=="function"&&Y.$$typeof===void 0){if(S.tag=1,S.memoizedState=null,S.updateQueue=null,qn(H)){var ne=!0;aa(S)}else ne=!1;S.memoizedState=Y.state!==null&&Y.state!==void 0?Y.state:null,pp(S);var Be=H.getDerivedStateFromProps;typeof Be=="function"&&NA(S,H,Be,v),Y.updater=OA,S.stateNode=Y,Y._reactInternals=S,no(S,H,v,Q),S=SI(null,S,H,!0,ne,Q)}else S.tag=0,At(null,S,Y,Q),S=S.child;return S;case 16:Y=S.elementType;e:{switch(v!==null&&(v.alternate=null,S.alternate=null,S.flags|=2),v=S.pendingProps,ne=Y._init,Y=ne(Y._payload),S.type=Y,ne=S.tag=nR(Y),v=to(Y,v),ne){case 0:S=GA(null,S,Y,v,Q);break e;case 1:S=lD(null,S,Y,v,Q);break e;case 11:S=hr(null,S,Y,v,Q);break e;case 14:S=Ir(null,S,Y,to(Y.type,v),H,Q);break e}throw Error(u(306,Y,""))}return S;case 0:return H=S.type,Y=S.pendingProps,Y=S.elementType===H?Y:to(H,Y),GA(v,S,H,Y,Q);case 1:return H=S.type,Y=S.pendingProps,Y=S.elementType===H?Y:to(H,Y),lD(v,S,H,Y,Q);case 3:if(Fd(S),H=S.updateQueue,v===null||H===null)throw Error(u(282));if(H=S.pendingProps,Y=S.memoizedState,Y=Y!==null?Y.element:null,l0(v,S),LA(S,H,null,Q),H=S.memoizedState.element,H===Y)p0(),S=Mn(v,S,Q);else{if(Y=S.stateNode,(ne=Y.hydrate)&&(X?(Uo=dc(S.stateNode.containerInfo),ha=S,ne=ga=!0):ne=!1),ne){if(X&&(v=Y.mutableSourceEagerHydrationData,v!=null))for(Y=0;Y=jt&&ne>=Tr&&Y<=wr&&Be<=Xt){v.splice(S,1);break}else if(H!==jt||Q.width!==ft.width||XtBe){if(!(ne!==Tr||Q.height!==ft.height||wrY)){jt>H&&(ft.width+=jt-H,ft.x=H),wrne&&(ft.height+=Tr-ne,ft.y=ne),XtQ&&(Q=Be)),Be ")+` - -No matching component was found for: - `)+v.join(" > ")}return null},r.getPublicRootInstance=function(v){if(v=v.current,!v.child)return null;switch(v.child.tag){case 5:return Re(v.child.stateNode);default:return v.child.stateNode}},r.injectIntoDevTools=function(v){if(v={bundleType:v.bundleType,version:v.version,rendererPackageName:v.rendererPackageName,rendererConfig:v.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:A.ReactCurrentDispatcher,findHostInstanceByFiber:sR,findFiberByHostInstance:v.findFiberByHostInstance||oR,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")v=!1;else{var S=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!S.isDisabled&&S.supportsFiber)try{Ze=S.inject(v),ca=S}catch{}v=!0}return v},r.observeVisibleRects=function(v,S,Q,H){if(!qt)throw Error(u(363));v=LI(v,S);var Y=Xr(v,Q,H).disconnect;return{disconnect:function(){Y()}}},r.registerMutableSourceForHydration=function(v,S){var Q=S._getVersion;Q=Q(S._source),v.mutableSourceEagerHydrationData==null?v.mutableSourceEagerHydrationData=[S,Q]:v.mutableSourceEagerHydrationData.push(S,Q)},r.runWithPriority=function(v,S){var Q=Bl;try{return Bl=v,S()}finally{Bl=Q}},r.shouldSuspend=function(){return!1},r.unbatchedUpdates=function(v,S){var Q=Pr;Pr&=-2,Pr|=8;try{return v(S)}finally{Pr=Q,Pr===0&&(ku(),Sn())}},r.updateContainer=function(v,S,Q,H){var Y=S.current,ne=oo(),Be=ss(Y);e:if(Q){Q=Q._reactInternals;t:{if(me(Q)!==Q||Q.tag!==1)throw Error(u(170));var Ue=Q;do{switch(Ue.tag){case 3:Ue=Ue.stateNode.context;break t;case 1:if(qn(Ue.type)){Ue=Ue.stateNode.__reactInternalMemoizedMergedChildContext;break t}}Ue=Ue.return}while(Ue!==null);throw Error(u(171))}if(Q.tag===1){var ft=Q.type;if(qn(ft)){Q=oa(Q,ft,Ue);break e}}Q=Ue}else Q=Lo;return S.context===null?S.context=Q:S.pendingContext=Q,S=Wa(ne,Be),S.payload={element:v},H=H===void 0?null:H,H!==null&&(S.callback=H),Ya(Y,S),Xa(Y,Be,ne),Be},r}});var ECe=_(($Yt,yCe)=>{"use strict";yCe.exports=mCe()});var ICe=_((eVt,CCe)=>{"use strict";var Syt={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};CCe.exports=Syt});var DCe=_((tVt,vCe)=>{"use strict";var Pyt=Object.assign||function(t){for(var e=1;e"}}]),t}(),wCe=function(){BQ(t,null,[{key:"fromJS",value:function(r){var o=r.width,a=r.height;return new t(o,a)}}]);function t(e,r){fq(this,t),this.width=e,this.height=r}return BQ(t,[{key:"fromJS",value:function(r){r(this.width,this.height)}},{key:"toString",value:function(){return""}}]),t}(),BCe=function(){function t(e,r){fq(this,t),this.unit=e,this.value=r}return BQ(t,[{key:"fromJS",value:function(r){r(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case au.UNIT_POINT:return String(this.value);case au.UNIT_PERCENT:return this.value+"%";case au.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),t}();vCe.exports=function(t,e){function r(u,A,p){var h=u[A];u[A]=function(){for(var E=arguments.length,w=Array(E),D=0;D1?w-1:0),b=1;b1&&arguments[1]!==void 0?arguments[1]:NaN,p=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:au.DIRECTION_LTR;return u.call(this,A,p,h)}),Pyt({Config:e.Config,Node:e.Node,Layout:t("Layout",xyt),Size:t("Size",wCe),Value:t("Value",BCe),getInstanceCount:function(){return e.getInstanceCount.apply(e,arguments)}},au)}});var SCe=_((exports,module)=>{(function(t,e){typeof define=="function"&&define.amd?define([],function(){return e}):typeof module=="object"&&module.exports?module.exports=e:(t.nbind=t.nbind||{}).init=e})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(t,e){return function(){t&&t.apply(this,arguments);try{Module.ccall("nbind_init")}catch(r){e(r);return}e(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module<"u"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof ve=="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(e,r){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),e=nodePath.normalize(e);var o=nodeFS.readFileSync(e);return r?o:o.toString()},Module.readBinary=function(e){var r=Module.read(e,!0);return r.buffer||(r=new Uint8Array(r)),assert(r.buffer),r},Module.load=function(e){globalEval(read(e))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module<"u"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr<"u"&&(Module.printErr=printErr),typeof read<"u"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(e){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(e));var r=read(e,"binary");return assert(typeof r=="object"),r},typeof scriptArgs<"u"?Module.arguments=scriptArgs:typeof arguments<"u"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(t,e){quit(t)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.send(null),r.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),Module.readAsync=function(e,r,o){var a=new XMLHttpRequest;a.open("GET",e,!0),a.responseType="arraybuffer",a.onload=function(){a.status==200||a.status==0&&a.response?r(a.response):o()},a.onerror=o,a.send(null)},typeof arguments<"u"&&(Module.arguments=arguments),typeof console<"u")Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.warn(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump<"u"?function(t){dump(t)}:function(t){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle>"u"&&(Module.setWindowTitle=function(t){document.title=t})}else throw"Unknown runtime environment. Where are we?";function globalEval(t){eval.call(null,t)}!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(t,e){throw e}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(t){return tempRet0=t,t},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(t){STACKTOP=t},getNativeTypeSize:function(t){switch(t){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(t[t.length-1]==="*")return Runtime.QUANTUM_SIZE;if(t[0]==="i"){var e=parseInt(t.substr(1));return assert(e%8===0),e/8}else return 0}}},getNativeFieldSize:function(t){return Math.max(Runtime.getNativeTypeSize(t),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(t,e){return e==="double"||e==="i64"?t&7&&(assert((t&7)===4),t+=4):assert((t&3)===0),t},getAlignSize:function(t,e,r){return!r&&(t=="i64"||t=="double")?8:t?Math.min(e||(t?Runtime.getNativeFieldSize(t):0),Runtime.QUANTUM_SIZE):Math.min(e,8)},dynCall:function(t,e,r){return r&&r.length?Module["dynCall_"+t].apply(null,[e].concat(r)):Module["dynCall_"+t].call(null,e)},functionPointers:[],addFunction:function(t){for(var e=0;e>2],r=(e+t+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=r,r>=TOTAL_MEMORY){var o=enlargeMemory();if(!o)return HEAP32[DYNAMICTOP_PTR>>2]=e,0}return e},alignMemory:function(t,e){var r=t=Math.ceil(t/(e||16))*(e||16);return r},makeBigInt:function(t,e,r){var o=r?+(t>>>0)+ +(e>>>0)*4294967296:+(t>>>0)+ +(e|0)*4294967296;return o},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(t,e){t||abort("Assertion failed: "+e)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(t){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(t){var e=Runtime.stackAlloc(t.length);return writeArrayToMemory(t,e),e},stringToC:function(t){var e=0;if(t!=null&&t!==0){var r=(t.length<<2)+1;e=Runtime.stackAlloc(r),stringToUTF8(t,e,r)}return e}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,r,o,a,n){var u=getCFunc(e),A=[],p=0;if(a)for(var h=0;h>0]=e;break;case"i8":HEAP8[t>>0]=e;break;case"i16":HEAP16[t>>1]=e;break;case"i32":HEAP32[t>>2]=e;break;case"i64":tempI64=[e>>>0,(tempDouble=e,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[t>>2]=tempI64[0],HEAP32[t+4>>2]=tempI64[1];break;case"float":HEAPF32[t>>2]=e;break;case"double":HEAPF64[t>>3]=e;break;default:abort("invalid type for setValue: "+r)}}Module.setValue=setValue;function getValue(t,e,r){switch(e=e||"i8",e.charAt(e.length-1)==="*"&&(e="i32"),e){case"i1":return HEAP8[t>>0];case"i8":return HEAP8[t>>0];case"i16":return HEAP16[t>>1];case"i32":return HEAP32[t>>2];case"i64":return HEAP32[t>>2];case"float":return HEAPF32[t>>2];case"double":return HEAPF64[t>>3];default:abort("invalid type for setValue: "+e)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(t,e,r,o){var a,n;typeof t=="number"?(a=!0,n=t):(a=!1,n=t.length);var u=typeof e=="string"?e:null,A;if(r==ALLOC_NONE?A=o:A=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][r===void 0?ALLOC_STATIC:r](Math.max(n,u?1:e.length)),a){var o=A,p;for(assert((A&3)==0),p=A+(n&-4);o>2]=0;for(p=A+n;o>0]=0;return A}if(u==="i8")return t.subarray||t.slice?HEAPU8.set(t,A):HEAPU8.set(new Uint8Array(t),A),A;for(var h=0,E,w,D;h>0],r|=o,!(o==0&&!e||(a++,e&&a==e)););e||(e=a);var n="";if(r<128){for(var u=1024,A;e>0;)A=String.fromCharCode.apply(String,HEAPU8.subarray(t,t+Math.min(e,u))),n=n?n+A:A,t+=u,e-=u;return n}return Module.UTF8ToString(t)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(t){for(var e="";;){var r=HEAP8[t++>>0];if(!r)return e;e+=String.fromCharCode(r)}}Module.AsciiToString=AsciiToString;function stringToAscii(t,e){return writeAsciiToMemory(t,e,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(t,e){for(var r=e;t[r];)++r;if(r-e>16&&t.subarray&&UTF8Decoder)return UTF8Decoder.decode(t.subarray(e,r));for(var o,a,n,u,A,p,h="";;){if(o=t[e++],!o)return h;if(!(o&128)){h+=String.fromCharCode(o);continue}if(a=t[e++]&63,(o&224)==192){h+=String.fromCharCode((o&31)<<6|a);continue}if(n=t[e++]&63,(o&240)==224?o=(o&15)<<12|a<<6|n:(u=t[e++]&63,(o&248)==240?o=(o&7)<<18|a<<12|n<<6|u:(A=t[e++]&63,(o&252)==248?o=(o&3)<<24|a<<18|n<<12|u<<6|A:(p=t[e++]&63,o=(o&1)<<30|a<<24|n<<18|u<<12|A<<6|p))),o<65536)h+=String.fromCharCode(o);else{var E=o-65536;h+=String.fromCharCode(55296|E>>10,56320|E&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(t){return UTF8ArrayToString(HEAPU8,t)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(t,e,r,o){if(!(o>0))return 0;for(var a=r,n=r+o-1,u=0;u=55296&&A<=57343&&(A=65536+((A&1023)<<10)|t.charCodeAt(++u)&1023),A<=127){if(r>=n)break;e[r++]=A}else if(A<=2047){if(r+1>=n)break;e[r++]=192|A>>6,e[r++]=128|A&63}else if(A<=65535){if(r+2>=n)break;e[r++]=224|A>>12,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=2097151){if(r+3>=n)break;e[r++]=240|A>>18,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=67108863){if(r+4>=n)break;e[r++]=248|A>>24,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else{if(r+5>=n)break;e[r++]=252|A>>30,e[r++]=128|A>>24&63,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}}return e[r]=0,r-a}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(t,e,r){return stringToUTF8Array(t,HEAPU8,e,r)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(t){for(var e=0,r=0;r=55296&&o<=57343&&(o=65536+((o&1023)<<10)|t.charCodeAt(++r)&1023),o<=127?++e:o<=2047?e+=2:o<=65535?e+=3:o<=2097151?e+=4:o<=67108863?e+=5:e+=6}return e}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0;function demangle(t){var e=Module.___cxa_demangle||Module.__cxa_demangle;if(e){try{var r=t.substr(1),o=lengthBytesUTF8(r)+1,a=_malloc(o);stringToUTF8(r,a,o);var n=_malloc(4),u=e(a,0,0,n);if(getValue(n,"i32")===0&&u)return Pointer_stringify(u)}catch{}finally{a&&_free(a),n&&_free(n),u&&_free(u)}return t}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),t}function demangleAll(t){var e=/__Z[\w\d_]+/g;return t.replace(e,function(r){var o=demangle(r);return r===o?r:r+" ["+o+"]"})}function jsStackTrace(){var t=new Error;if(!t.stack){try{throw new Error(0)}catch(e){t=e}if(!t.stack)return"(no stack trace available)"}return t.stack.toString()}function stackTrace(){var t=jsStackTrace();return Module.extraStackTrace&&(t+=` -`+Module.extraStackTrace()),demangleAll(t)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var e=t.shift();if(typeof e=="function"){e();continue}var r=e.func;typeof r=="number"?e.arg===void 0?Module.dynCall_v(r):Module.dynCall_vi(r,e.arg):r(e.arg===void 0?null:e.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(t){__ATPRERUN__.unshift(t)}Module.addOnPreRun=addOnPreRun;function addOnInit(t){__ATINIT__.unshift(t)}Module.addOnInit=addOnInit;function addOnPreMain(t){__ATMAIN__.unshift(t)}Module.addOnPreMain=addOnPreMain;function addOnExit(t){__ATEXIT__.unshift(t)}Module.addOnExit=addOnExit;function addOnPostRun(t){__ATPOSTRUN__.unshift(t)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(t,e,r){var o=r>0?r:lengthBytesUTF8(t)+1,a=new Array(o),n=stringToUTF8Array(t,a,0,a.length);return e&&(a.length=n),a}Module.intArrayFromString=intArrayFromString;function intArrayToString(t){for(var e=[],r=0;r255&&(o&=255),e.push(String.fromCharCode(o))}return e.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(t,e,r){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var o,a;r&&(a=e+lengthBytesUTF8(t),o=HEAP8[a]),stringToUTF8(t,e,1/0),r&&(HEAP8[a]=o)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(t,e){HEAP8.set(t,e)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(t,e,r){for(var o=0;o>0]=t.charCodeAt(o);r||(HEAP8[e>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function t(e,r){var o=e>>>16,a=e&65535,n=r>>>16,u=r&65535;return a*u+(o*u+a*n<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(t){return froundBuffer[0]=t,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(t){t=t>>>0;for(var e=0;e<32;e++)if(t&1<<31-e)return e;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(t){return t<0?Math.ceil(t):Math.floor(t)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(t){return t}function addRunDependency(t){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(t){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var e=dependenciesFulfilled;dependenciesFulfilled=null,e()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(t,e,r,o,a,n,u,A){return _nbind.callbackSignatureList[t].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(t,e,r,o,a,n,u,A){return ASM_CONSTS[t](e,r,o,a,n,u,A)}function _emscripten_asm_const_iiiii(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiidddddd(t,e,r,o,a,n,u,A,p){return ASM_CONSTS[t](e,r,o,a,n,u,A,p)}function _emscripten_asm_const_iiididi(t,e,r,o,a,n,u){return ASM_CONSTS[t](e,r,o,a,n,u)}function _emscripten_asm_const_iiii(t,e,r,o){return ASM_CONSTS[t](e,r,o)}function _emscripten_asm_const_iiiid(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiiiii(t,e,r,o,a,n){return ASM_CONSTS[t](e,r,o,a,n)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(t,e){__ATEXIT__.unshift({func:t,arg:e})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(t,e,r,o){var a=arguments.length,n=a<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,r):o,u;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(t,e,r,o);else for(var A=t.length-1;A>=0;A--)(u=t[A])&&(n=(a<3?u(n):a>3?u(e,r,n):u(e,r))||n);return a>3&&n&&Object.defineProperty(e,r,n),n}function _defineHidden(t){return function(e,r){Object.defineProperty(e,r,{configurable:!1,enumerable:!1,value:t,writable:!0})}}var _nbind={};function __nbind_free_external(t){_nbind.externalList[t].dereference(t)}function __nbind_reference_external(t){_nbind.externalList[t].reference()}function _llvm_stackrestore(t){var e=_llvm_stacksave,r=e.LLVM_SAVEDSTACKS[t];e.LLVM_SAVEDSTACKS.splice(t,1),Runtime.stackRestore(r)}function __nbind_register_pool(t,e,r,o){_nbind.Pool.pageSize=t,_nbind.Pool.usedPtr=e/4,_nbind.Pool.rootPtr=r,_nbind.Pool.pagePtr=o/4,HEAP32[e/4]=16909060,HEAP8[e]==1&&(_nbind.bigEndian=!0),HEAP32[e/4]=0,_nbind.makeTypeKindTbl=(n={},n[1024]=_nbind.PrimitiveType,n[64]=_nbind.Int64Type,n[2048]=_nbind.BindClass,n[3072]=_nbind.BindClassPtr,n[4096]=_nbind.SharedClassPtr,n[5120]=_nbind.ArrayType,n[6144]=_nbind.ArrayType,n[7168]=_nbind.CStringType,n[9216]=_nbind.CallbackType,n[10240]=_nbind.BindType,n),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var a=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});a.proto=Module,_nbind.BindClass.list.push(a);var n}function _emscripten_set_main_loop_timing(t,e){if(Browser.mainLoop.timingMode=t,Browser.mainLoop.timingValue=e,!Browser.mainLoop.func)return 1;if(t==0)Browser.mainLoop.scheduler=function(){var u=Math.max(0,Browser.mainLoop.tickStartTime+e-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,u)},Browser.mainLoop.method="timeout";else if(t==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(t==2){if(!window.setImmediate){let n=function(u){u.source===window&&u.data===o&&(u.stopPropagation(),r.shift()())};var a=n,r=[],o="setimmediate";window.addEventListener("message",n,!0),window.setImmediate=function(A){r.push(A),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(A),window.postMessage({target:o})):window.postMessage(o,"*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(t,e,r,o,a){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=t,Browser.mainLoop.arg=o;var n;typeof o<"u"?n=function(){Module.dynCall_vi(t,o)}:n=function(){Module.dynCall_v(t)};var u=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var p=Date.now(),h=Browser.mainLoop.queue.shift();if(h.func(h.arg),Browser.mainLoop.remainingBlockers){var E=Browser.mainLoop.remainingBlockers,w=E%1==0?E-1:Math.floor(E);h.counted?Browser.mainLoop.remainingBlockers=w:(w=w+.5,Browser.mainLoop.remainingBlockers=(8*E+w)/9)}if(console.log('main loop blocker "'+h.name+'" took '+(Date.now()-p)+" ms"),Browser.mainLoop.updateStatus(),u1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(n),!(u0?_emscripten_set_main_loop_timing(0,1e3/e):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),r)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var t=Browser.mainLoop.timingMode,e=Browser.mainLoop.timingValue,r=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(r,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(t,e),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var t=Module.statusMessage||"Please wait...",e=Browser.mainLoop.remainingBlockers,r=Browser.mainLoop.expectedBlockers;e?e"u"&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),Module.noImageDecoding=!0);var t={};t.canHandle=function(n){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(n)},t.handle=function(n,u,A,p){var h=null;if(Browser.hasBlobConstructor)try{h=new Blob([n],{type:Browser.getMimetype(u)}),h.size!==n.length&&(h=new Blob([new Uint8Array(n).buffer],{type:Browser.getMimetype(u)}))}catch(b){Runtime.warnOnce("Blob constructor present but fails: "+b+"; falling back to blob builder")}if(!h){var E=new Browser.BlobBuilder;E.append(new Uint8Array(n).buffer),h=E.getBlob()}var w=Browser.URLObject.createObjectURL(h),D=new Image;D.onload=function(){assert(D.complete,"Image "+u+" could not be decoded");var C=document.createElement("canvas");C.width=D.width,C.height=D.height;var T=C.getContext("2d");T.drawImage(D,0,0),Module.preloadedImages[u]=C,Browser.URLObject.revokeObjectURL(w),A&&A(n)},D.onerror=function(C){console.log("Image "+w+" could not be decoded"),p&&p()},D.src=w},Module.preloadPlugins.push(t);var e={};e.canHandle=function(n){return!Module.noAudioDecoding&&n.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},e.handle=function(n,u,A,p){var h=!1;function E(T){h||(h=!0,Module.preloadedAudios[u]=T,A&&A(n))}function w(){h||(h=!0,Module.preloadedAudios[u]=new Audio,p&&p())}if(Browser.hasBlobConstructor){try{var D=new Blob([n],{type:Browser.getMimetype(u)})}catch{return w()}var b=Browser.URLObject.createObjectURL(D),C=new Audio;C.addEventListener("canplaythrough",function(){E(C)},!1),C.onerror=function(N){if(h)return;console.log("warning: browser could not fully decode audio "+u+", trying slower base64 approach");function U(J){for(var te="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",le="=",ce="",ue=0,Ie=0,he=0;he=6;){var De=ue>>Ie-6&63;Ie-=6,ce+=te[De]}return Ie==2?(ce+=te[(ue&3)<<4],ce+=le+le):Ie==4&&(ce+=te[(ue&15)<<2],ce+=le),ce}C.src="data:audio/x-"+u.substr(-3)+";base64,"+U(n),E(C)},C.src=b,Browser.safeSetTimeout(function(){E(C)},1e4)}else return w()},Module.preloadPlugins.push(e);function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var o=Module.canvas;o&&(o.requestPointerLock=o.requestPointerLock||o.mozRequestPointerLock||o.webkitRequestPointerLock||o.msRequestPointerLock||function(){},o.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},o.exitPointerLock=o.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),document.addEventListener("webkitpointerlockchange",r,!1),document.addEventListener("mspointerlockchange",r,!1),Module.elementPointerLock&&o.addEventListener("click",function(a){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),a.preventDefault())},!1))},createContext:function(t,e,r,o){if(e&&Module.ctx&&t==Module.canvas)return Module.ctx;var a,n;if(e){var u={antialias:!1,alpha:!1};if(o)for(var A in o)u[A]=o[A];n=GL.createContext(t,u),n&&(a=GL.getContext(n).GLctx)}else a=t.getContext("2d");return a?(r&&(e||assert(typeof GLctx>"u","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=a,e&&GL.makeContextCurrent(n),Module.useWebGL=e,Browser.moduleContextCreatedCallbacks.forEach(function(p){p()}),Browser.init()),a):null},destroyContext:function(t,e,r){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(t,e,r){Browser.lockPointer=t,Browser.resizeCanvas=e,Browser.vrDevice=r,typeof Browser.lockPointer>"u"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas>"u"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice>"u"&&(Browser.vrDevice=null);var o=Module.canvas;function a(){Browser.isFullscreen=!1;var u=o.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===u?(o.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},o.exitFullscreen=o.exitFullscreen.bind(document),Browser.lockPointer&&o.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(u.parentNode.insertBefore(o,u),u.parentNode.removeChild(u),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(o)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("MSFullscreenChange",a,!1));var n=document.createElement("div");o.parentNode.insertBefore(n,o),n.appendChild(o),n.requestFullscreen=n.requestFullscreen||n.mozRequestFullScreen||n.msRequestFullscreen||(n.webkitRequestFullscreen?function(){n.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(n.webkitRequestFullScreen?function(){n.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),r?n.requestFullscreen({vrDisplay:r}):n.requestFullscreen()},requestFullScreen:function(t,e,r){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(o,a,n){return Browser.requestFullscreen(o,a,n)},Browser.requestFullscreen(t,e,r)},nextRAF:0,fakeRequestAnimationFrame:function(t){var e=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=e+1e3/60;else for(;e+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var r=Math.max(Browser.nextRAF-e,0);setTimeout(t,r)},requestAnimationFrame:function t(e){typeof window>"u"?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(t){return function(){if(!ABORT)return t.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var t=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],t.forEach(function(e){e()})}},safeRequestAnimationFrame:function(t){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))})},safeSetTimeout:function(t,e){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))},e)},safeSetInterval:function(t,e){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&t()},e)},getMimetype:function(t){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[t.substr(t.lastIndexOf(".")+1)]},getUserMedia:function(t){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(t)},getMovementX:function(t){return t.movementX||t.mozMovementX||t.webkitMovementX||0},getMovementY:function(t){return t.movementY||t.mozMovementY||t.webkitMovementY||0},getMouseWheelDelta:function(t){var e=0;switch(t.type){case"DOMMouseScroll":e=t.detail;break;case"mousewheel":e=t.wheelDelta;break;case"wheel":e=t.deltaY;break;default:throw"unrecognized mouse wheel event: "+t.type}return e},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(t){if(Browser.pointerLock)t.type!="mousemove"&&"mozMovementX"in t?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(t),Browser.mouseMovementY=Browser.getMovementY(t)),typeof SDL<"u"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var e=Module.canvas.getBoundingClientRect(),r=Module.canvas.width,o=Module.canvas.height,a=typeof window.scrollX<"u"?window.scrollX:window.pageXOffset,n=typeof window.scrollY<"u"?window.scrollY:window.pageYOffset;if(t.type==="touchstart"||t.type==="touchend"||t.type==="touchmove"){var u=t.touch;if(u===void 0)return;var A=u.pageX-(a+e.left),p=u.pageY-(n+e.top);A=A*(r/e.width),p=p*(o/e.height);var h={x:A,y:p};if(t.type==="touchstart")Browser.lastTouches[u.identifier]=h,Browser.touches[u.identifier]=h;else if(t.type==="touchend"||t.type==="touchmove"){var E=Browser.touches[u.identifier];E||(E=h),Browser.lastTouches[u.identifier]=E,Browser.touches[u.identifier]=h}return}var w=t.pageX-(a+e.left),D=t.pageY-(n+e.top);w=w*(r/e.width),D=D*(o/e.height),Browser.mouseMovementX=w-Browser.mouseX,Browser.mouseMovementY=D-Browser.mouseY,Browser.mouseX=w,Browser.mouseY=D}},asyncLoad:function(t,e,r,o){var a=o?"":"al "+t;Module.readAsync(t,function(n){assert(n,'Loading data file "'+t+'" failed (no arrayBuffer).'),e(new Uint8Array(n)),a&&removeRunDependency(a)},function(n){if(r)r();else throw'Loading data file "'+t+'" failed.'}),a&&addRunDependency(a)},resizeListeners:[],updateResizeListeners:function(){var t=Module.canvas;Browser.resizeListeners.forEach(function(e){e(t.width,t.height)})},setCanvasSize:function(t,e,r){var o=Module.canvas;Browser.updateCanvasDimensions(o,t,e),r||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t&-8388609,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},updateCanvasDimensions:function(t,e,r){e&&r?(t.widthNative=e,t.heightNative=r):(e=t.widthNative,r=t.heightNative);var o=e,a=r;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(o/a>2];return e},getStr:function(){var t=Pointer_stringify(SYSCALLS.get());return t},get64:function(){var t=SYSCALLS.get(),e=SYSCALLS.get();return t>=0?assert(e===0):assert(e===-1),t},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD();return FS.close(r),0}catch(o){return(typeof FS>"u"||!(o instanceof FS.ErrnoError))&&abort(o),-o.errno}}function ___syscall54(t,e){SYSCALLS.varargs=e;try{return 0}catch(r){return(typeof FS>"u"||!(r instanceof FS.ErrnoError))&&abort(r),-r.errno}}function _typeModule(t){var e=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function r(p,h,E,w,D,b){if(h==1){var C=w&896;(C==128||C==256||C==384)&&(p="X const")}var T;return b?T=E.replace("X",p).replace("Y",D):T=p.replace("X",E).replace("Y",D),T.replace(/([*&]) (?=[*&])/g,"$1")}function o(p,h,E,w,D){throw new Error(p+" type "+E.replace("X",h+"?")+(w?" with flag "+w:"")+" in "+D)}function a(p,h,E,w,D,b,C,T){b===void 0&&(b="X"),T===void 0&&(T=1);var N=E(p);if(N)return N;var U=w(p),J=U.placeholderFlag,te=e[J];C&&te&&(b=r(C[2],C[0],b,te[0],"?",!0));var le;J==0&&(le="Unbound"),J>=10&&(le="Corrupt"),T>20&&(le="Deeply nested"),le&&o(le,p,b,J,D||"?");var ce=U.paramList[0],ue=a(ce,h,E,w,D,b,te,T+1),Ie,he={flags:te[0],id:p,name:"",paramList:[ue]},De=[],Ee="?";switch(U.placeholderFlag){case 1:Ie=ue.spec;break;case 2:if((ue.flags&15360)==1024&&ue.spec.ptrSize==1){he.flags=7168;break}case 3:case 6:case 5:Ie=ue.spec,ue.flags&15360;break;case 8:Ee=""+U.paramList[1],he.paramList.push(U.paramList[1]);break;case 9:for(var g=0,me=U.paramList[1];g>2]=t),t}function _llvm_stacksave(){var t=_llvm_stacksave;return t.LLVM_SAVEDSTACKS||(t.LLVM_SAVEDSTACKS=[]),t.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),t.LLVM_SAVEDSTACKS.length-1}function ___syscall140(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=SYSCALLS.get(),u=SYSCALLS.get(),A=a;return FS.llseek(r,A,u),HEAP32[n>>2]=r.position,r.getdents&&A===0&&u===0&&(r.getdents=null),0}catch(p){return(typeof FS>"u"||!(p instanceof FS.ErrnoError))&&abort(p),-p.errno}}function ___syscall146(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.get(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(E,w){var D=___syscall146.buffers[E];assert(D),w===0||w===10?((E===1?Module.print:Module.printErr)(UTF8ArrayToString(D,0)),D.length=0):D.push(w)});for(var u=0;u>2],p=HEAP32[o+(u*8+4)>>2],h=0;h"u"||!(E instanceof FS.ErrnoError))&&abort(E),-E.errno}}function __nbind_finish(){for(var t=0,e=_nbind.BindClass.list;tt.pageSize/2||e>t.pageSize-r){var o=_nbind.typeNameTbl.NBind.proto;return o.lalloc(e)}else return HEAPU32[t.usedPtr]=r+e,t.rootPtr+r},t.lreset=function(e,r){var o=HEAPU32[t.pagePtr];if(o){var a=_nbind.typeNameTbl.NBind.proto;a.lreset(e,r)}else HEAPU32[t.usedPtr]=e},t}();_nbind.Pool=Pool;function constructType(t,e){var r=t==10240?_nbind.makeTypeNameTbl[e.name]||_nbind.BindType:_nbind.makeTypeKindTbl[t],o=new r(e);return typeIdTbl[e.id]=o,_nbind.typeNameTbl[e.name]=o,o}_nbind.constructType=constructType;function getType(t){return typeIdTbl[t]}_nbind.getType=getType;function queryType(t){var e=HEAPU8[t],r=_nbind.structureList[e][1];t/=4,r<0&&(++t,r=HEAPU32[t]+1);var o=Array.prototype.slice.call(HEAPU32.subarray(t+1,t+1+r));return e==9&&(o=[o[0],o.slice(1)]),{paramList:o,placeholderFlag:e}}_nbind.queryType=queryType;function getTypes(t,e){return t.map(function(r){return typeof r=="number"?_nbind.getComplexType(r,constructType,getType,queryType,e):_nbind.typeNameTbl[r]})}_nbind.getTypes=getTypes;function readTypeIdList(t,e){return Array.prototype.slice.call(HEAPU32,t/4,t/4+e)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(t){for(var e=t;HEAPU8[e++];);return String.fromCharCode.apply("",HEAPU8.subarray(t,e-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(t){var e={};if(t)for(;;){var r=HEAPU32[t/4];if(!r)break;e[readAsciiString(r)]=!0,t+=4}return e}_nbind.readPolicyList=readPolicyList;function getDynCall(t,e){var r={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},o=t.map(function(n){return r[n.name]||"i"}).join(""),a=Module["dynCall_"+o];if(!a)throw new Error("dynCall_"+o+" not found for "+e+"("+t.map(function(n){return n.name}).join(", ")+")");return a}_nbind.getDynCall=getDynCall;function addMethod(t,e,r,o){var a=t[e];t.hasOwnProperty(e)&&a?((a.arity||a.arity===0)&&(a=_nbind.makeOverloader(a,a.arity),t[e]=a),a.addMethod(r,o)):(r.arity=o,t[e]=r)}_nbind.addMethod=addMethod;function throwError(t){throw new Error(t)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.heap=HEAPU32,r.ptrSize=4,r}return e.prototype.needsWireRead=function(r){return!!this.wireRead||!!this.makeWireRead},e.prototype.needsWireWrite=function(r){return!!this.wireWrite||!!this.makeWireWrite},e}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this,a=r.flags&32?{32:HEAPF32,64:HEAPF64}:r.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return o.heap=a[r.ptrSize*8],o.ptrSize=r.ptrSize,o}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a=="number")return a;throw new Error("Type mismatch")}},e}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(t,e){if(t==null){if(e&&e.Nullable)return 0;throw new Error("Type mismatch")}if(e&&e.Strict){if(typeof t!="string")throw new Error("Type mismatch")}else t=t.toString();var r=Module.lengthBytesUTF8(t)+1,o=_nbind.Pool.lalloc(r);return Module.stringToUTF8Array(t,HEAPU8,o,r),o}_nbind.pushCString=pushCString;function popCString(t){return t===0?null:Module.Pointer_stringify(t)}_nbind.popCString=popCString;var CStringType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popCString,r.wireWrite=pushCString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,o){return function(a){return pushCString(a,o)}},e}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=function(o){return!!o},r}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireRead=function(r){return"!!("+r+")"},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a=="boolean")return a;throw new Error("Type mismatch")}||r},e}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function t(){}return t.prototype.persist=function(){this.__nbindState|=1},t}();_nbind.Wrapper=Wrapper;function makeBound(t,e){var r=function(o){__extends(a,o);function a(n,u,A,p){var h=o.call(this)||this;if(!(h instanceof a))return new(Function.prototype.bind.apply(a,Array.prototype.concat.apply([null],arguments)));var E=u,w=A,D=p;if(n!==_nbind.ptrMarker){var b=h.__nbindConstructor.apply(h,arguments);E=4608,D=HEAPU32[b/4],w=HEAPU32[b/4+1]}var C={configurable:!0,enumerable:!1,value:null,writable:!1},T={__nbindFlags:E,__nbindPtr:w};D&&(T.__nbindShared=D,_nbind.mark(h));for(var N=0,U=Object.keys(T);N>=1;var r=_nbind.valueList[t];return _nbind.valueList[t]=firstFreeValue,firstFreeValue=t,r}else{if(e)return _nbind.popShared(t,e);throw new Error("Invalid value slot "+t)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(t){return typeof t=="number"?t:pushValue(t)*4096+valueBase}function pop64(t){return t=3?u=Buffer.from(n):u=new Buffer(n),u.copy(o)}else getBuffer(o).set(n)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var t=0,e=dirtyList;t>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(t,e,r,o,a,n){try{Module.dynCall_viiiii(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_vif(t,e,r){try{Module.dynCall_vif(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_vid(t,e,r){try{Module.dynCall_vid(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_fiff(t,e,r,o){try{return Module.dynCall_fiff(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_vi(t,e){try{Module.dynCall_vi(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_vii(t,e,r){try{Module.dynCall_vii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_ii(t,e){try{return Module.dynCall_ii(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_viddi(t,e,r,o,a){try{Module.dynCall_viddi(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_vidd(t,e,r,o){try{Module.dynCall_vidd(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_iiii(t,e,r,o){try{return Module.dynCall_iiii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_diii(t,e,r,o){try{return Module.dynCall_diii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_di(t,e){try{return Module.dynCall_di(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_iid(t,e,r){try{return Module.dynCall_iid(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_iii(t,e,r){try{return Module.dynCall_iii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viiddi(t,e,r,o,a,n){try{Module.dynCall_viiddi(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viiiiii(t,e,r,o,a,n,u){try{Module.dynCall_viiiiii(t,e,r,o,a,n,u)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_dii(t,e,r){try{return Module.dynCall_dii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_i(t){try{return Module.dynCall_i(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_iiiiii(t,e,r,o,a,n){try{return Module.dynCall_iiiiii(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viiid(t,e,r,o,a){try{Module.dynCall_viiid(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_viififi(t,e,r,o,a,n,u){try{Module.dynCall_viififi(t,e,r,o,a,n,u)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_viii(t,e,r,o){try{Module.dynCall_viii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_v(t){try{Module.dynCall_v(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_viid(t,e,r,o){try{Module.dynCall_viid(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_idd(t,e,r){try{return Module.dynCall_idd(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viiii(t,e,r,o,a){try{Module.dynCall_viiii(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:1/0},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(t,e,r){var o=new t.Int8Array(r),a=new t.Int16Array(r),n=new t.Int32Array(r),u=new t.Uint8Array(r),A=new t.Uint16Array(r),p=new t.Uint32Array(r),h=new t.Float32Array(r),E=new t.Float64Array(r),w=e.DYNAMICTOP_PTR|0,D=e.tempDoublePtr|0,b=e.ABORT|0,C=e.STACKTOP|0,T=e.STACK_MAX|0,N=e.cttz_i8|0,U=e.___dso_handle|0,J=0,te=0,le=0,ce=0,ue=t.NaN,Ie=t.Infinity,he=0,De=0,Ee=0,g=0,me=0,Ce=0,fe=t.Math.floor,ie=t.Math.abs,Z=t.Math.sqrt,Se=t.Math.pow,Re=t.Math.cos,ht=t.Math.sin,q=t.Math.tan,nt=t.Math.acos,Le=t.Math.asin,Te=t.Math.atan,ke=t.Math.atan2,Ke=t.Math.exp,xe=t.Math.log,tt=t.Math.ceil,He=t.Math.imul,x=t.Math.min,I=t.Math.max,P=t.Math.clz32,y=t.Math.fround,R=e.abort,z=e.assert,X=e.enlargeMemory,$=e.getTotalMemory,se=e.abortOnCannotGrowMemory,be=e.invoke_viiiii,Fe=e.invoke_vif,lt=e.invoke_vid,Et=e.invoke_fiff,qt=e.invoke_vi,nr=e.invoke_vii,Pt=e.invoke_ii,cn=e.invoke_viddi,Sr=e.invoke_vidd,yr=e.invoke_iiii,Rr=e.invoke_diii,Xr=e.invoke_di,$n=e.invoke_iid,Xs=e.invoke_iii,Hi=e.invoke_viiddi,Qs=e.invoke_viiiiii,Zs=e.invoke_dii,bi=e.invoke_i,Fs=e.invoke_iiiiii,$s=e.invoke_viiid,PA=e.invoke_viififi,gu=e.invoke_viii,op=e.invoke_v,ap=e.invoke_viid,Rs=e.invoke_idd,Nn=e.invoke_viiii,hs=e._emscripten_asm_const_iiiii,Ts=e._emscripten_asm_const_iiidddddd,pc=e._emscripten_asm_const_iiiid,hc=e.__nbind_reference_external,gc=e._emscripten_asm_const_iiiiiiii,xA=e._removeAccessorPrefix,bA=e._typeModule,Ro=e.__nbind_register_pool,To=e.__decorate,kA=e._llvm_stackrestore,pr=e.___cxa_atexit,Me=e.__extends,ia=e.__nbind_get_value_object,dc=e.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,Er=e._emscripten_set_main_loop_timing,du=e.__nbind_register_primitive,QA=e.__nbind_register_type,FA=e._emscripten_memcpy_big,mc=e.__nbind_register_function,yc=e.___setErrNo,Il=e.__nbind_register_class,we=e.__nbind_finish,Tt=e._abort,wl=e._nbind_value,Bi=e._llvm_stacksave,Ls=e.___syscall54,Ft=e._defineHidden,Bn=e._emscripten_set_main_loop,Lo=e._emscripten_get_now,ki=e.__nbind_register_callback_signature,vi=e._emscripten_asm_const_iiiiii,sa=e.__nbind_free_external,un=e._emscripten_asm_const_iiii,qn=e._emscripten_asm_const_iiididi,Ec=e.___syscall6,lp=e._atexit,oa=e.___syscall140,aa=e.___syscall146,la=y(0);let Ze=y(0);function ca(s){s=s|0;var l=0;return l=C,C=C+s|0,C=C+15&-16,l|0}function mu(){return C|0}function Bl(s){s=s|0,C=s}function dn(s,l){s=s|0,l=l|0,C=s,T=l}function No(s,l){s=s|0,l=l|0,J||(J=s,te=l)}function RA(s){s=s|0,Ce=s}function TA(){return Ce|0}function Oo(){var s=0,l=0;br(8104,8,400)|0,br(8504,408,540)|0,s=9044,l=s+44|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));o[9088]=0,o[9089]=1,n[2273]=0,n[2274]=948,n[2275]=948,pr(17,8104,U|0)|0}function qa(s){s=s|0,gt(s+948|0)}function Ot(s){return s=y(s),((AD(s)|0)&2147483647)>>>0>2139095040|0}function vn(s,l,c){s=s|0,l=l|0,c=c|0;e:do if(n[s+(l<<3)+4>>2]|0)s=s+(l<<3)|0;else{if((l|2|0)==3&&n[s+60>>2]|0){s=s+56|0;break}switch(l|0){case 0:case 2:case 4:case 5:{if(n[s+52>>2]|0){s=s+48|0;break e}break}default:}if(n[s+68>>2]|0){s=s+64|0;break}else{s=(l|1|0)==5?948:c;break}}while(!1);return s|0}function Mo(s){s=s|0;var l=0;return l=_D(1e3)|0,ua(s,(l|0)!=0,2456),n[2276]=(n[2276]|0)+1,br(l|0,8104,1e3)|0,o[s+2>>0]|0&&(n[l+4>>2]=2,n[l+12>>2]=4),n[l+976>>2]=s,l|0}function ua(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,d0(s,5,3197,f)),C=d}function qi(){return Mo(956)|0}function vl(s){s=s|0;var l=0;return l=Yt(1e3)|0,Cc(l,s),ua(n[s+976>>2]|0,1,2456),n[2276]=(n[2276]|0)+1,n[l+944>>2]=0,l|0}function Cc(s,l){s=s|0,l=l|0;var c=0;br(s|0,l|0,948)|0,Qd(s+948|0,l+948|0),c=s+960|0,s=l+960|0,l=c+40|0;do n[c>>2]=n[s>>2],c=c+4|0,s=s+4|0;while((c|0)<(l|0))}function Dl(s){s=s|0;var l=0,c=0,f=0,d=0;if(l=s+944|0,c=n[l>>2]|0,c|0&&(Aa(c+948|0,s)|0,n[l>>2]=0),c=Di(s)|0,c|0){l=0;do n[(rs(s,l)|0)+944>>2]=0,l=l+1|0;while((l|0)!=(c|0))}c=s+948|0,f=n[c>>2]|0,d=s+952|0,l=n[d>>2]|0,(l|0)!=(f|0)&&(n[d>>2]=l+(~((l+-4-f|0)>>>2)<<2)),ja(c),HD(s),n[2276]=(n[2276]|0)+-1}function Aa(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0;f=n[s>>2]|0,k=s+4|0,c=n[k>>2]|0,m=c;e:do if((f|0)==(c|0))d=f,B=4;else for(s=f;;){if((n[s>>2]|0)==(l|0)){d=s,B=4;break e}if(s=s+4|0,(s|0)==(c|0)){s=0;break}}while(!1);return(B|0)==4&&((d|0)!=(c|0)?(f=d+4|0,s=m-f|0,l=s>>2,l&&(rw(d|0,f|0,s|0)|0,c=n[k>>2]|0),s=d+(l<<2)|0,(c|0)==(s|0)||(n[k>>2]=c+(~((c+-4-s|0)>>>2)<<2)),s=1):s=0),s|0}function Di(s){return s=s|0,(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2|0}function rs(s,l){s=s|0,l=l|0;var c=0;return c=n[s+948>>2]|0,(n[s+952>>2]|0)-c>>2>>>0>l>>>0?s=n[c+(l<<2)>>2]|0:s=0,s|0}function ja(s){s=s|0;var l=0,c=0,f=0,d=0;f=C,C=C+32|0,l=f,d=n[s>>2]|0,c=(n[s+4>>2]|0)-d|0,((n[s+8>>2]|0)-d|0)>>>0>c>>>0&&(d=c>>2,Ld(l,d,d,s+8|0),fD(s,l),Nd(l)),C=f}function yu(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0;M=Di(s)|0;do if(M|0){if((n[(rs(s,0)|0)+944>>2]|0)==(s|0)){if(!(Aa(s+948|0,l)|0))break;br(l+400|0,8504,540)|0,n[l+944>>2]=0,Ne(s);break}B=n[(n[s+976>>2]|0)+12>>2]|0,k=s+948|0,F=(B|0)==0,c=0,m=0;do f=n[(n[k>>2]|0)+(m<<2)>>2]|0,(f|0)==(l|0)?Ne(s):(d=vl(f)|0,n[(n[k>>2]|0)+(c<<2)>>2]=d,n[d+944>>2]=s,F||hT[B&15](f,d,s,c),c=c+1|0),m=m+1|0;while((m|0)!=(M|0));if(c>>>0>>0){F=s+948|0,k=s+952|0,B=c,c=n[k>>2]|0;do m=(n[F>>2]|0)+(B<<2)|0,f=m+4|0,d=c-f|0,l=d>>2,l&&(rw(m|0,f|0,d|0)|0,c=n[k>>2]|0),d=c,f=m+(l<<2)|0,(d|0)!=(f|0)&&(c=d+(~((d+-4-f|0)>>>2)<<2)|0,n[k>>2]=c),B=B+1|0;while((B|0)!=(M|0))}}while(!1)}function Sl(s){s=s|0;var l=0,c=0,f=0,d=0;pi(s,(Di(s)|0)==0,2491),pi(s,(n[s+944>>2]|0)==0,2545),l=s+948|0,c=n[l>>2]|0,f=s+952|0,d=n[f>>2]|0,(d|0)!=(c|0)&&(n[f>>2]=d+(~((d+-4-c|0)>>>2)<<2)),ja(l),l=s+976|0,c=n[l>>2]|0,br(s|0,8104,1e3)|0,o[c+2>>0]|0&&(n[s+4>>2]=2,n[s+12>>2]=4),n[l>>2]=c}function pi(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,so(s,5,3197,f)),C=d}function Dn(){return n[2276]|0}function Pl(){var s=0;return s=_D(20)|0,Je((s|0)!=0,2592),n[2277]=(n[2277]|0)+1,n[s>>2]=n[239],n[s+4>>2]=n[240],n[s+8>>2]=n[241],n[s+12>>2]=n[242],n[s+16>>2]=n[243],s|0}function Je(s,l){s=s|0,l=l|0;var c=0,f=0;f=C,C=C+16|0,c=f,s||(n[c>>2]=l,so(0,5,3197,c)),C=f}function st(s){s=s|0,HD(s),n[2277]=(n[2277]|0)+-1}function vt(s,l){s=s|0,l=l|0;var c=0;l?(pi(s,(Di(s)|0)==0,2629),c=1):(c=0,l=0),n[s+964>>2]=l,n[s+988>>2]=c}function ar(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+8|0,d=f+4|0,B=f,n[d>>2]=l,pi(s,(n[l+944>>2]|0)==0,2709),pi(s,(n[s+964>>2]|0)==0,2763),ee(s),l=s+948|0,n[B>>2]=(n[l>>2]|0)+(c<<2),n[m>>2]=n[B>>2],ye(l,m,d)|0,n[(n[d>>2]|0)+944>>2]=s,Ne(s),C=f}function ee(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;if(c=Di(s)|0,c|0&&(n[(rs(s,0)|0)+944>>2]|0)!=(s|0)){f=n[(n[s+976>>2]|0)+12>>2]|0,d=s+948|0,m=(f|0)==0,l=0;do B=n[(n[d>>2]|0)+(l<<2)>>2]|0,k=vl(B)|0,n[(n[d>>2]|0)+(l<<2)>>2]=k,n[k+944>>2]=s,m||hT[f&15](B,k,s,l),l=l+1|0;while((l|0)!=(c|0))}}function ye(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0;rt=C,C=C+64|0,j=rt+52|0,k=rt+48|0,oe=rt+28|0,We=rt+24|0,Oe=rt+20|0,Qe=rt,f=n[s>>2]|0,m=f,l=f+((n[l>>2]|0)-m>>2<<2)|0,f=s+4|0,d=n[f>>2]|0,B=s+8|0;do if(d>>>0<(n[B>>2]|0)>>>0){if((l|0)==(d|0)){n[l>>2]=n[c>>2],n[f>>2]=(n[f>>2]|0)+4;break}pD(s,l,d,l+4|0),l>>>0<=c>>>0&&(c=(n[f>>2]|0)>>>0>c>>>0?c+4|0:c),n[l>>2]=n[c>>2]}else{f=(d-m>>2)+1|0,d=L(s)|0,d>>>0>>0&&Zr(s),O=n[s>>2]|0,M=(n[B>>2]|0)-O|0,m=M>>1,Ld(Qe,M>>2>>>0>>1>>>0?m>>>0>>0?f:m:d,l-O>>2,s+8|0),O=Qe+8|0,f=n[O>>2]|0,m=Qe+12|0,M=n[m>>2]|0,B=M,F=f;do if((f|0)==(M|0)){if(M=Qe+4|0,f=n[M>>2]|0,Xe=n[Qe>>2]|0,d=Xe,f>>>0<=Xe>>>0){f=B-d>>1,f=f|0?f:1,Ld(oe,f,f>>>2,n[Qe+16>>2]|0),n[We>>2]=n[M>>2],n[Oe>>2]=n[O>>2],n[k>>2]=n[We>>2],n[j>>2]=n[Oe>>2],QI(oe,k,j),f=n[Qe>>2]|0,n[Qe>>2]=n[oe>>2],n[oe>>2]=f,f=oe+4|0,Xe=n[M>>2]|0,n[M>>2]=n[f>>2],n[f>>2]=Xe,f=oe+8|0,Xe=n[O>>2]|0,n[O>>2]=n[f>>2],n[f>>2]=Xe,f=oe+12|0,Xe=n[m>>2]|0,n[m>>2]=n[f>>2],n[f>>2]=Xe,Nd(oe),f=n[O>>2]|0;break}m=f,B=((m-d>>2)+1|0)/-2|0,k=f+(B<<2)|0,d=F-m|0,m=d>>2,m&&(rw(k|0,f|0,d|0)|0,f=n[M>>2]|0),Xe=k+(m<<2)|0,n[O>>2]=Xe,n[M>>2]=f+(B<<2),f=Xe}while(!1);n[f>>2]=n[c>>2],n[O>>2]=(n[O>>2]|0)+4,l=hD(s,Qe,l)|0,Nd(Qe)}while(!1);return C=rt,l|0}function Ne(s){s=s|0;var l=0;do{if(l=s+984|0,o[l>>0]|0)break;o[l>>0]=1,h[s+504>>2]=y(ue),s=n[s+944>>2]|0}while(s|0)}function gt(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),yt(c))}function mt(s){return s=s|0,n[s+944>>2]|0}function Dt(s){s=s|0,pi(s,(n[s+964>>2]|0)!=0,2832),Ne(s)}function er(s){return s=s|0,(o[s+984>>0]|0)!=0|0}function sn(s,l){s=s|0,l=l|0,wUe(s,l,400)|0&&(br(s|0,l|0,400)|0,Ne(s))}function ei(s){s=s|0;var l=Ze;return l=y(h[s+44>>2]),s=Ot(l)|0,y(s?y(0):l)}function Qi(s){s=s|0;var l=Ze;return l=y(h[s+48>>2]),Ot(l)|0&&(l=o[(n[s+976>>2]|0)+2>>0]|0?y(1):y(0)),y(l)}function Sn(s,l){s=s|0,l=l|0,n[s+980>>2]=l}function fa(s){return s=s|0,n[s+980>>2]|0}function wd(s,l){s=s|0,l=l|0;var c=0;c=s+4|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function BI(s){return s=s|0,n[s+4>>2]|0}function eo(s,l){s=s|0,l=l|0;var c=0;c=s+8|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function Bd(s){return s=s|0,n[s+8>>2]|0}function cp(s,l){s=s|0,l=l|0;var c=0;c=s+12|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function vI(s){return s=s|0,n[s+12>>2]|0}function to(s,l){s=s|0,l=l|0;var c=0;c=s+16|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function up(s){return s=s|0,n[s+16>>2]|0}function Ap(s,l){s=s|0,l=l|0;var c=0;c=s+20|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function Ic(s){return s=s|0,n[s+20>>2]|0}function fp(s,l){s=s|0,l=l|0;var c=0;c=s+24|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function s0(s){return s=s|0,n[s+24>>2]|0}function o0(s,l){s=s|0,l=l|0;var c=0;c=s+28|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function a0(s){return s=s|0,n[s+28>>2]|0}function vd(s,l){s=s|0,l=l|0;var c=0;c=s+32|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function Eu(s){return s=s|0,n[s+32>>2]|0}function ro(s,l){s=s|0,l=l|0;var c=0;c=s+36|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function Ga(s){return s=s|0,n[s+36>>2]|0}function pp(s,l){s=s|0,l=y(l);var c=0;c=s+40|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function l0(s,l){s=s|0,l=y(l);var c=0;c=s+44|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function Wa(s,l){s=s|0,l=y(l);var c=0;c=s+48|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function Ya(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+52|0,d=s+56|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function Dd(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+52|0,c=s+56|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ot(l)|0,n[c>>2]=f?3:2,Ne(s))}function LA(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+52|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Sd(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function Pd(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=m?0:2,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function NA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+132+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function OA(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function W(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=m?0:2,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function xt(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+60+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function MA(s,l){s=s|0,l=l|0;var c=0;c=s+60+(l<<3)+4|0,(n[c>>2]|0)!=3&&(h[s+60+(l<<3)>>2]=y(ue),n[c>>2]=3,Ne(s))}function no(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function Cu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=m?0:2,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function dt(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+204+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function wc(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+276+(l<<3)|0,l=s+276+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function xd(s,l){return s=s|0,l=l|0,y(h[s+276+(l<<3)>>2])}function c0(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+348|0,d=s+352|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function DI(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+348|0,c=s+352|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ot(l)|0,n[c>>2]=f?3:2,Ne(s))}function hp(s){s=s|0;var l=0;l=s+352|0,(n[l>>2]|0)!=3&&(h[s+348>>2]=y(ue),n[l>>2]=3,Ne(s))}function cr(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+348|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Ni(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+356|0,d=s+360|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function Iu(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+356|0,c=s+360|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ot(l)|0,n[c>>2]=f?3:2,Ne(s))}function pa(s){s=s|0;var l=0;l=s+360|0,(n[l>>2]|0)!=3&&(h[s+356>>2]=y(ue),n[l>>2]=3,Ne(s))}function u0(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+356|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Bc(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function wu(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function wt(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+364|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function oi(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function UA(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function ha(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+372|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Uo(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function ga(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function A0(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+380|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function gp(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function f0(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function bd(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+388|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function _A(s,l){s=s|0,l=y(l);var c=0;c=s+396|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function p0(s){return s=s|0,y(h[s+396>>2])}function vc(s){return s=s|0,y(h[s+400>>2])}function Dc(s){return s=s|0,y(h[s+404>>2])}function Bu(s){return s=s|0,y(h[s+408>>2])}function gs(s){return s=s|0,y(h[s+412>>2])}function Sc(s){return s=s|0,y(h[s+416>>2])}function On(s){return s=s|0,y(h[s+420>>2])}function ji(s,l){switch(s=s|0,l=l|0,pi(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+424+(l<<2)>>2])}function Ci(s,l){switch(s=s|0,l=l|0,pi(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+448+(l<<2)>>2])}function HA(s,l){switch(s=s|0,l=l|0,pi(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+472+(l<<2)>>2])}function vu(s,l){s=s|0,l=l|0;var c=0,f=Ze;return c=n[s+4>>2]|0,(c|0)==(n[l+4>>2]|0)?c?(f=y(h[s>>2]),s=y(ie(y(f-y(h[l>>2]))))>2]=0,n[f+4>>2]=0,n[f+8>>2]=0,dc(f|0,s|0,l|0,0),so(s,3,(o[f+11>>0]|0)<0?n[f>>2]|0:f,c),WUe(f),C=c}function Gi(s,l,c,f){s=y(s),l=y(l),c=c|0,f=f|0;var d=Ze;s=y(s*l),d=y(lT(s,y(1)));do if(An(d,y(0))|0)s=y(s-d);else{if(s=y(s-d),An(d,y(1))|0){s=y(s+y(1));break}if(c){s=y(s+y(1));break}f||(d>y(.5)?d=y(1):(f=An(d,y(.5))|0,d=y(f?1:0)),s=y(s+d))}while(!1);return y(s/l)}function Va(s,l,c,f,d,m,B,k,F,M,O,j,oe){s=s|0,l=y(l),c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,k=y(k),F=y(F),M=y(M),O=y(O),j=y(j),oe=oe|0;var We=0,Oe=Ze,Qe=Ze,rt=Ze,Xe=Ze,ct=Ze,_e=Ze;return F>2]),Oe!=y(0))?(rt=y(Gi(l,Oe,0,0)),Xe=y(Gi(f,Oe,0,0)),Qe=y(Gi(m,Oe,0,0)),Oe=y(Gi(k,Oe,0,0))):(Qe=m,rt=l,Oe=k,Xe=f),(d|0)==(s|0)?We=An(Qe,rt)|0:We=0,(B|0)==(c|0)?oe=An(Oe,Xe)|0:oe=0,!We&&(ct=y(l-O),!(io(s,ct,F)|0))&&!(Du(s,ct,d,F)|0)?We=Su(s,ct,d,m,F)|0:We=1,!oe&&(_e=y(f-j),!(io(c,_e,M)|0))&&!(Du(c,_e,B,M)|0)?oe=Su(c,_e,B,k,M)|0:oe=1,oe=We&oe),oe|0}function io(s,l,c){return s=s|0,l=y(l),c=y(c),(s|0)==1?s=An(l,c)|0:s=0,s|0}function Du(s,l,c,f){return s=s|0,l=y(l),c=c|0,f=y(f),(s|0)==2&(c|0)==0?l>=f?s=1:s=An(l,f)|0:s=0,s|0}function Su(s,l,c,f,d){return s=s|0,l=y(l),c=c|0,f=y(f),d=y(d),(s|0)==2&(c|0)==2&f>l?d<=l?s=1:s=An(l,d)|0:s=0,s|0}function Ka(s,l,c,f,d,m,B,k,F,M,O){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),k=y(k),F=F|0,M=M|0,O=O|0;var j=0,oe=0,We=0,Oe=0,Qe=Ze,rt=Ze,Xe=0,ct=0,_e=0,Ge=0,Nt=0,_r=0,ur=0,Zt=0,kr=0,Or=0,lr=0,Ln=Ze,lo=Ze,co=Ze,uo=0,Ia=0;lr=C,C=C+160|0,Zt=lr+152|0,ur=lr+120|0,_r=lr+104|0,_e=lr+72|0,Oe=lr+56|0,Nt=lr+8|0,ct=lr,Ge=(n[2279]|0)+1|0,n[2279]=Ge,kr=s+984|0,o[kr>>0]|0&&(n[s+512>>2]|0)!=(n[2278]|0)?Xe=4:(n[s+516>>2]|0)==(f|0)?Or=0:Xe=4,(Xe|0)==4&&(n[s+520>>2]=0,n[s+924>>2]=-1,n[s+928>>2]=-1,h[s+932>>2]=y(-1),h[s+936>>2]=y(-1),Or=1);e:do if(n[s+964>>2]|0)if(Qe=y(fn(s,2,B)),rt=y(fn(s,0,B)),j=s+916|0,co=y(h[j>>2]),lo=y(h[s+920>>2]),Ln=y(h[s+932>>2]),Va(d,l,m,c,n[s+924>>2]|0,co,n[s+928>>2]|0,lo,Ln,y(h[s+936>>2]),Qe,rt,O)|0)Xe=22;else if(We=n[s+520>>2]|0,!We)Xe=21;else for(oe=0;;){if(j=s+524+(oe*24|0)|0,Ln=y(h[j>>2]),lo=y(h[s+524+(oe*24|0)+4>>2]),co=y(h[s+524+(oe*24|0)+16>>2]),Va(d,l,m,c,n[s+524+(oe*24|0)+8>>2]|0,Ln,n[s+524+(oe*24|0)+12>>2]|0,lo,co,y(h[s+524+(oe*24|0)+20>>2]),Qe,rt,O)|0){Xe=22;break e}if(oe=oe+1|0,oe>>>0>=We>>>0){Xe=21;break}}else{if(F){if(j=s+916|0,!(An(y(h[j>>2]),l)|0)){Xe=21;break}if(!(An(y(h[s+920>>2]),c)|0)){Xe=21;break}if((n[s+924>>2]|0)!=(d|0)){Xe=21;break}j=(n[s+928>>2]|0)==(m|0)?j:0,Xe=22;break}if(We=n[s+520>>2]|0,!We)Xe=21;else for(oe=0;;){if(j=s+524+(oe*24|0)|0,An(y(h[j>>2]),l)|0&&An(y(h[s+524+(oe*24|0)+4>>2]),c)|0&&(n[s+524+(oe*24|0)+8>>2]|0)==(d|0)&&(n[s+524+(oe*24|0)+12>>2]|0)==(m|0)){Xe=22;break e}if(oe=oe+1|0,oe>>>0>=We>>>0){Xe=21;break}}}while(!1);do if((Xe|0)==21)o[11697]|0?(j=0,Xe=28):(j=0,Xe=31);else if((Xe|0)==22){if(oe=(o[11697]|0)!=0,!((j|0)!=0&(Or^1)))if(oe){Xe=28;break}else{Xe=31;break}Oe=j+16|0,n[s+908>>2]=n[Oe>>2],We=j+20|0,n[s+912>>2]=n[We>>2],(o[11698]|0)==0|oe^1||(n[ct>>2]=Pc(Ge)|0,n[ct+4>>2]=Ge,so(s,4,2972,ct),oe=n[s+972>>2]|0,oe|0&&ef[oe&127](s),d=_o(d,F)|0,m=_o(m,F)|0,Ia=+y(h[Oe>>2]),uo=+y(h[We>>2]),n[Nt>>2]=d,n[Nt+4>>2]=m,E[Nt+8>>3]=+l,E[Nt+16>>3]=+c,E[Nt+24>>3]=Ia,E[Nt+32>>3]=uo,n[Nt+40>>2]=M,so(s,4,2989,Nt))}while(!1);return(Xe|0)==28&&(oe=Pc(Ge)|0,n[Oe>>2]=oe,n[Oe+4>>2]=Ge,n[Oe+8>>2]=Or?3047:11699,so(s,4,3038,Oe),oe=n[s+972>>2]|0,oe|0&&ef[oe&127](s),Nt=_o(d,F)|0,Xe=_o(m,F)|0,n[_e>>2]=Nt,n[_e+4>>2]=Xe,E[_e+8>>3]=+l,E[_e+16>>3]=+c,n[_e+24>>2]=M,so(s,4,3049,_e),Xe=31),(Xe|0)==31&&(ds(s,l,c,f,d,m,B,k,F,O),o[11697]|0&&(oe=n[2279]|0,Nt=Pc(oe)|0,n[_r>>2]=Nt,n[_r+4>>2]=oe,n[_r+8>>2]=Or?3047:11699,so(s,4,3083,_r),oe=n[s+972>>2]|0,oe|0&&ef[oe&127](s),Nt=_o(d,F)|0,_r=_o(m,F)|0,uo=+y(h[s+908>>2]),Ia=+y(h[s+912>>2]),n[ur>>2]=Nt,n[ur+4>>2]=_r,E[ur+8>>3]=uo,E[ur+16>>3]=Ia,n[ur+24>>2]=M,so(s,4,3092,ur)),n[s+516>>2]=f,j||(oe=s+520|0,j=n[oe>>2]|0,(j|0)==16&&(o[11697]|0&&so(s,4,3124,Zt),n[oe>>2]=0,j=0),F?j=s+916|0:(n[oe>>2]=j+1,j=s+524+(j*24|0)|0),h[j>>2]=l,h[j+4>>2]=c,n[j+8>>2]=d,n[j+12>>2]=m,n[j+16>>2]=n[s+908>>2],n[j+20>>2]=n[s+912>>2],j=0)),F&&(n[s+416>>2]=n[s+908>>2],n[s+420>>2]=n[s+912>>2],o[s+985>>0]=1,o[kr>>0]=0),n[2279]=(n[2279]|0)+-1,n[s+512>>2]=n[2278],C=lr,Or|(j|0)==0|0}function fn(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(K(s,l,c)),y(f+y(re(s,l,c)))}function so(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=C,C=C+16|0,d=m,n[d>>2]=f,s?f=n[s+976>>2]|0:f=0,yp(f,s,l,c,d),C=m}function Pc(s){return s=s|0,(s>>>0>60?3201:3201+(60-s)|0)|0}function _o(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+32|0,c=d+12|0,f=d,n[c>>2]=n[254],n[c+4>>2]=n[255],n[c+8>>2]=n[256],n[f>>2]=n[257],n[f+4>>2]=n[258],n[f+8>>2]=n[259],(s|0)>2?s=11699:s=n[(l?f:c)+(s<<2)>>2]|0,C=d,s|0}function ds(s,l,c,f,d,m,B,k,F,M){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),k=y(k),F=F|0,M=M|0;var O=0,j=0,oe=0,We=0,Oe=Ze,Qe=Ze,rt=Ze,Xe=Ze,ct=Ze,_e=Ze,Ge=Ze,Nt=0,_r=0,ur=0,Zt=Ze,kr=Ze,Or=0,lr=Ze,Ln=0,lo=0,co=0,uo=0,Ia=0,Lp=0,Np=0,kl=0,Op=0,Nu=0,Ou=0,Mp=0,Up=0,_p=0,$r=0,Ql=0,Hp=0,Lc=0,qp=Ze,jp=Ze,Mu=Ze,Uu=Ze,Nc=Ze,Ms=0,rl=0,Go=0,Fl=0,rf=0,nf=Ze,_u=Ze,sf=Ze,of=Ze,Us=Ze,Cs=Ze,Rl=0,Un=Ze,af=Ze,Ao=Ze,Oc=Ze,fo=Ze,Mc=Ze,lf=0,cf=0,Uc=Ze,_s=Ze,Tl=0,uf=0,Af=0,ff=0,Fr=Ze,ri=0,Is=0,po=0,Hs=0,Lr=0,Ar=0,Ll=0,Kt=Ze,pf=0,hi=0;Ll=C,C=C+16|0,Ms=Ll+12|0,rl=Ll+8|0,Go=Ll+4|0,Fl=Ll,pi(s,(d|0)==0|(Ot(l)|0)^1,3326),pi(s,(m|0)==0|(Ot(c)|0)^1,3406),Is=At(s,f)|0,n[s+496>>2]=Is,Lr=hr(2,Is)|0,Ar=hr(0,Is)|0,h[s+440>>2]=y(K(s,Lr,B)),h[s+444>>2]=y(re(s,Lr,B)),h[s+428>>2]=y(K(s,Ar,B)),h[s+436>>2]=y(re(s,Ar,B)),h[s+464>>2]=y(Ir(s,Lr)),h[s+468>>2]=y(Rn(s,Lr)),h[s+452>>2]=y(Ir(s,Ar)),h[s+460>>2]=y(Rn(s,Ar)),h[s+488>>2]=y(ai(s,Lr,B)),h[s+492>>2]=y(ns(s,Lr,B)),h[s+476>>2]=y(ai(s,Ar,B)),h[s+484>>2]=y(ns(s,Ar,B));do if(n[s+964>>2]|0)GA(s,l,c,d,m,B,k);else{if(po=s+948|0,Hs=(n[s+952>>2]|0)-(n[po>>2]|0)>>2,!Hs){lD(s,l,c,d,m,B,k);break}if(!F&&SI(s,l,c,d,m,B,k)|0)break;ee(s),Ql=s+508|0,o[Ql>>0]=0,Lr=hr(n[s+4>>2]|0,Is)|0,Ar=Fd(Lr,Is)|0,ri=ge(Lr)|0,Hp=n[s+8>>2]|0,uf=s+28|0,Lc=(n[uf>>2]|0)!=0,fo=ri?B:k,Uc=ri?k:B,qp=y(Cp(s,Lr,B)),jp=y(PI(s,Lr,B)),Oe=y(Cp(s,Ar,B)),Mc=y(da(s,Lr,B)),_s=y(da(s,Ar,B)),ur=ri?d:m,Tl=ri?m:d,Fr=ri?Mc:_s,ct=ri?_s:Mc,Oc=y(fn(s,2,B)),Xe=y(fn(s,0,B)),Qe=y(y(Vr(s+364|0,B))-Fr),rt=y(y(Vr(s+380|0,B))-Fr),_e=y(y(Vr(s+372|0,k))-ct),Ge=y(y(Vr(s+388|0,k))-ct),Mu=ri?Qe:_e,Uu=ri?rt:Ge,Oc=y(l-Oc),l=y(Oc-Fr),Ot(l)|0?Fr=l:Fr=y(Yn(y(M0(l,rt)),Qe)),af=y(c-Xe),l=y(af-ct),Ot(l)|0?Ao=l:Ao=y(Yn(y(M0(l,Ge)),_e)),Qe=ri?Fr:Ao,Un=ri?Ao:Fr;e:do if((ur|0)==1)for(f=0,j=0;;){if(O=rs(s,j)|0,!f)y(WA(O))>y(0)&&y(Ip(O))>y(0)?f=O:f=0;else if(xI(O)|0){We=0;break e}if(j=j+1|0,j>>>0>=Hs>>>0){We=f;break}}else We=0;while(!1);Nt=We+500|0,_r=We+504|0,f=0,O=0,l=y(0),oe=0;do{if(j=n[(n[po>>2]|0)+(oe<<2)>>2]|0,(n[j+36>>2]|0)==1)Rd(j),o[j+985>>0]=1,o[j+984>>0]=0;else{Pu(j),F&&mp(j,At(j,Is)|0,Qe,Un,Fr);do if((n[j+24>>2]|0)!=1)if((j|0)==(We|0)){n[Nt>>2]=n[2278],h[_r>>2]=y(0);break}else{cD(s,j,Fr,d,Ao,Fr,Ao,m,Is,M);break}else O|0&&(n[O+960>>2]=j),n[j+960>>2]=0,O=j,f=f|0?f:j;while(!1);Cs=y(h[j+504>>2]),l=y(l+y(Cs+y(fn(j,Lr,Fr))))}oe=oe+1|0}while((oe|0)!=(Hs|0));for(co=l>Qe,Rl=Lc&((ur|0)==2&co)?1:ur,Ln=(Tl|0)==1,Ia=Ln&(F^1),Lp=(Rl|0)==1,Np=(Rl|0)==2,kl=976+(Lr<<2)|0,Op=(Tl|2|0)==2,_p=Ln&(Lc^1),Nu=1040+(Ar<<2)|0,Ou=1040+(Lr<<2)|0,Mp=976+(Ar<<2)|0,Up=(Tl|0)!=1,co=Lc&((ur|0)!=0&co),lo=s+976|0,Ln=Ln^1,l=Qe,Or=0,uo=0,Cs=y(0),Nc=y(0);;){e:do if(Or>>>0>>0)for(_r=n[po>>2]|0,oe=0,Ge=y(0),_e=y(0),rt=y(0),Qe=y(0),j=0,O=0,We=Or;;){if(Nt=n[_r+(We<<2)>>2]|0,(n[Nt+36>>2]|0)!=1&&(n[Nt+940>>2]=uo,(n[Nt+24>>2]|0)!=1)){if(Xe=y(fn(Nt,Lr,Fr)),$r=n[kl>>2]|0,c=y(Vr(Nt+380+($r<<3)|0,fo)),ct=y(h[Nt+504>>2]),c=y(M0(c,ct)),c=y(Yn(y(Vr(Nt+364+($r<<3)|0,fo)),c)),Lc&(oe|0)!=0&y(Xe+y(_e+c))>l){m=oe,Xe=Ge,ur=We;break e}Xe=y(Xe+c),c=y(_e+Xe),Xe=y(Ge+Xe),xI(Nt)|0&&(rt=y(rt+y(WA(Nt))),Qe=y(Qe-y(ct*y(Ip(Nt))))),O|0&&(n[O+960>>2]=Nt),n[Nt+960>>2]=0,oe=oe+1|0,O=Nt,j=j|0?j:Nt}else Xe=Ge,c=_e;if(We=We+1|0,We>>>0>>0)Ge=Xe,_e=c;else{m=oe,ur=We;break}}else m=0,Xe=y(0),rt=y(0),Qe=y(0),j=0,ur=Or;while(!1);$r=rt>y(0)&rty(0)&QeUu&((Ot(Uu)|0)^1))l=Uu,$r=51;else if(o[(n[lo>>2]|0)+3>>0]|0)$r=51;else{if(Zt!=y(0)&&y(WA(s))!=y(0)){$r=53;break}l=Xe,$r=53}while(!1);if(($r|0)==51&&($r=0,Ot(l)|0?$r=53:(kr=y(l-Xe),lr=l)),($r|0)==53&&($r=0,Xe>2]|0,We=kry(0),_e=y(kr/Zt),rt=y(0),Xe=y(0),l=y(0),O=j;do c=y(Vr(O+380+(oe<<3)|0,fo)),Qe=y(Vr(O+364+(oe<<3)|0,fo)),Qe=y(M0(c,y(Yn(Qe,y(h[O+504>>2]))))),We?(c=y(Qe*y(Ip(O))),c!=y(-0)&&(Kt=y(Qe-y(ct*c)),nf=y(Mn(O,Lr,Kt,lr,Fr)),Kt!=nf)&&(rt=y(rt-y(nf-Qe)),l=y(l+c))):Nt&&(_u=y(WA(O)),_u!=y(0))&&(Kt=y(Qe+y(_e*_u)),sf=y(Mn(O,Lr,Kt,lr,Fr)),Kt!=sf)&&(rt=y(rt-y(sf-Qe)),Xe=y(Xe-_u)),O=n[O+960>>2]|0;while(O|0);if(l=y(Ge+l),Qe=y(kr+rt),rf)l=y(0);else{ct=y(Zt+Xe),We=n[kl>>2]|0,Nt=Qey(0),ct=y(Qe/ct),l=y(0);do{Kt=y(Vr(j+380+(We<<3)|0,fo)),rt=y(Vr(j+364+(We<<3)|0,fo)),rt=y(M0(Kt,y(Yn(rt,y(h[j+504>>2]))))),Nt?(Kt=y(rt*y(Ip(j))),Qe=y(-Kt),Kt!=y(-0)?(Kt=y(_e*Qe),Qe=y(Mn(j,Lr,y(rt+(_r?Qe:Kt)),lr,Fr))):Qe=rt):oe&&(of=y(WA(j)),of!=y(0))?Qe=y(Mn(j,Lr,y(rt+y(ct*of)),lr,Fr)):Qe=rt,l=y(l-y(Qe-rt)),Xe=y(fn(j,Lr,Fr)),c=y(fn(j,Ar,Fr)),Qe=y(Qe+Xe),h[rl>>2]=Qe,n[Fl>>2]=1,rt=y(h[j+396>>2]);e:do if(Ot(rt)|0){O=Ot(Un)|0;do if(!O){if(co|(Ns(j,Ar,Un)|0|Ln)||(Wi(s,j)|0)!=4||(n[(Ja(j,Ar)|0)+4>>2]|0)==3||(n[(za(j,Ar)|0)+4>>2]|0)==3)break;h[Ms>>2]=Un,n[Go>>2]=1;break e}while(!1);if(Ns(j,Ar,Un)|0){O=n[j+992+(n[Mp>>2]<<2)>>2]|0,Kt=y(c+y(Vr(O,Un))),h[Ms>>2]=Kt,O=Up&(n[O+4>>2]|0)==2,n[Go>>2]=((Ot(Kt)|0|O)^1)&1;break}else{h[Ms>>2]=Un,n[Go>>2]=O?0:2;break}}else Kt=y(Qe-Xe),Zt=y(Kt/rt),Kt=y(rt*Kt),n[Go>>2]=1,h[Ms>>2]=y(c+(ri?Zt:Kt));while(!1);xc(j,Lr,lr,Fr,Fl,rl),xc(j,Ar,Un,Fr,Go,Ms);do if(!(Ns(j,Ar,Un)|0)&&(Wi(s,j)|0)==4){if((n[(Ja(j,Ar)|0)+4>>2]|0)==3){O=0;break}O=(n[(za(j,Ar)|0)+4>>2]|0)!=3}else O=0;while(!1);Kt=y(h[rl>>2]),Zt=y(h[Ms>>2]),pf=n[Fl>>2]|0,hi=n[Go>>2]|0,Ka(j,ri?Kt:Zt,ri?Zt:Kt,Is,ri?pf:hi,ri?hi:pf,Fr,Ao,F&(O^1),3488,M)|0,o[Ql>>0]=o[Ql>>0]|o[j+508>>0],j=n[j+960>>2]|0}while(j|0)}}else l=y(0);if(l=y(kr+l),hi=l>0]=hi|u[Ql>>0],Np&l>y(0)?(O=n[kl>>2]|0,n[s+364+(O<<3)+4>>2]|0&&(Us=y(Vr(s+364+(O<<3)|0,fo)),Us>=y(0))?Qe=y(Yn(y(0),y(Us-y(lr-l)))):Qe=y(0)):Qe=l,Nt=Or>>>0>>0,Nt){We=n[po>>2]|0,oe=Or,O=0;do j=n[We+(oe<<2)>>2]|0,n[j+24>>2]|0||(O=((n[(Ja(j,Lr)|0)+4>>2]|0)==3&1)+O|0,O=O+((n[(za(j,Lr)|0)+4>>2]|0)==3&1)|0),oe=oe+1|0;while((oe|0)!=(ur|0));O?(Xe=y(0),c=y(0)):$r=101}else $r=101;e:do if(($r|0)==101)switch($r=0,Hp|0){case 1:{O=0,Xe=y(Qe*y(.5)),c=y(0);break e}case 2:{O=0,Xe=Qe,c=y(0);break e}case 3:{if(m>>>0<=1){O=0,Xe=y(0),c=y(0);break e}c=y((m+-1|0)>>>0),O=0,Xe=y(0),c=y(y(Yn(Qe,y(0)))/c);break e}case 5:{c=y(Qe/y((m+1|0)>>>0)),O=0,Xe=c;break e}case 4:{c=y(Qe/y(m>>>0)),O=0,Xe=y(c*y(.5));break e}default:{O=0,Xe=y(0),c=y(0);break e}}while(!1);if(l=y(qp+Xe),Nt){rt=y(Qe/y(O|0)),oe=n[po>>2]|0,j=Or,Qe=y(0);do{O=n[oe+(j<<2)>>2]|0;e:do if((n[O+36>>2]|0)!=1){switch(n[O+24>>2]|0){case 1:{if(Ho(O,Lr)|0){if(!F)break e;Kt=y(YA(O,Lr,lr)),Kt=y(Kt+y(Ir(s,Lr))),Kt=y(Kt+y(K(O,Lr,Fr))),h[O+400+(n[Ou>>2]<<2)>>2]=Kt;break e}break}case 0:if(hi=(n[(Ja(O,Lr)|0)+4>>2]|0)==3,Kt=y(rt+l),l=hi?Kt:l,F&&(hi=O+400+(n[Ou>>2]<<2)|0,h[hi>>2]=y(l+y(h[hi>>2]))),hi=(n[(za(O,Lr)|0)+4>>2]|0)==3,Kt=y(rt+l),l=hi?Kt:l,Ia){Kt=y(c+y(fn(O,Lr,Fr))),Qe=Un,l=y(l+y(Kt+y(h[O+504>>2])));break e}else{l=y(l+y(c+y(VA(O,Lr,Fr)))),Qe=y(Yn(Qe,y(VA(O,Ar,Fr))));break e}default:}F&&(Kt=y(Xe+y(Ir(s,Lr))),hi=O+400+(n[Ou>>2]<<2)|0,h[hi>>2]=y(Kt+y(h[hi>>2])))}while(!1);j=j+1|0}while((j|0)!=(ur|0))}else Qe=y(0);if(c=y(jp+l),Op?Xe=y(y(Mn(s,Ar,y(_s+Qe),Uc,B))-_s):Xe=Un,rt=y(y(Mn(s,Ar,y(_s+(_p?Un:Qe)),Uc,B))-_s),Nt&F){j=Or;do{oe=n[(n[po>>2]|0)+(j<<2)>>2]|0;do if((n[oe+36>>2]|0)!=1){if((n[oe+24>>2]|0)==1){if(Ho(oe,Ar)|0){if(Kt=y(YA(oe,Ar,Un)),Kt=y(Kt+y(Ir(s,Ar))),Kt=y(Kt+y(K(oe,Ar,Fr))),O=n[Nu>>2]|0,h[oe+400+(O<<2)>>2]=Kt,!(Ot(Kt)|0))break}else O=n[Nu>>2]|0;Kt=y(Ir(s,Ar)),h[oe+400+(O<<2)>>2]=y(Kt+y(K(oe,Ar,Fr)));break}O=Wi(s,oe)|0;do if((O|0)==4){if((n[(Ja(oe,Ar)|0)+4>>2]|0)==3){$r=139;break}if((n[(za(oe,Ar)|0)+4>>2]|0)==3){$r=139;break}if(Ns(oe,Ar,Un)|0){l=Oe;break}pf=n[oe+908+(n[kl>>2]<<2)>>2]|0,n[Ms>>2]=pf,l=y(h[oe+396>>2]),hi=Ot(l)|0,Qe=(n[D>>2]=pf,y(h[D>>2])),hi?l=rt:(kr=y(fn(oe,Ar,Fr)),Kt=y(Qe/l),l=y(l*Qe),l=y(kr+(ri?Kt:l))),h[rl>>2]=l,h[Ms>>2]=y(y(fn(oe,Lr,Fr))+Qe),n[Go>>2]=1,n[Fl>>2]=1,xc(oe,Lr,lr,Fr,Go,Ms),xc(oe,Ar,Un,Fr,Fl,rl),l=y(h[Ms>>2]),kr=y(h[rl>>2]),Kt=ri?l:kr,l=ri?kr:l,hi=((Ot(Kt)|0)^1)&1,Ka(oe,Kt,l,Is,hi,((Ot(l)|0)^1)&1,Fr,Ao,1,3493,M)|0,l=Oe}else $r=139;while(!1);e:do if(($r|0)==139){$r=0,l=y(Xe-y(VA(oe,Ar,Fr)));do if((n[(Ja(oe,Ar)|0)+4>>2]|0)==3){if((n[(za(oe,Ar)|0)+4>>2]|0)!=3)break;l=y(Oe+y(Yn(y(0),y(l*y(.5)))));break e}while(!1);if((n[(za(oe,Ar)|0)+4>>2]|0)==3){l=Oe;break}if((n[(Ja(oe,Ar)|0)+4>>2]|0)==3){l=y(Oe+y(Yn(y(0),l)));break}switch(O|0){case 1:{l=Oe;break e}case 2:{l=y(Oe+y(l*y(.5)));break e}default:{l=y(Oe+l);break e}}}while(!1);Kt=y(Cs+l),hi=oe+400+(n[Nu>>2]<<2)|0,h[hi>>2]=y(Kt+y(h[hi>>2]))}while(!1);j=j+1|0}while((j|0)!=(ur|0))}if(Cs=y(Cs+rt),Nc=y(Yn(Nc,c)),m=uo+1|0,ur>>>0>=Hs>>>0)break;l=lr,Or=ur,uo=m}do if(F){if(O=m>>>0>1,!O&&!(HF(s)|0))break;if(!(Ot(Un)|0)){l=y(Un-Cs);e:do switch(n[s+12>>2]|0){case 3:{Oe=y(Oe+l),_e=y(0);break}case 2:{Oe=y(Oe+y(l*y(.5))),_e=y(0);break}case 4:{Un>Cs?_e=y(l/y(m>>>0)):_e=y(0);break}case 7:if(Un>Cs){Oe=y(Oe+y(l/y(m<<1>>>0))),_e=y(l/y(m>>>0)),_e=O?_e:y(0);break e}else{Oe=y(Oe+y(l*y(.5))),_e=y(0);break e}case 6:{_e=y(l/y(uo>>>0)),_e=Un>Cs&O?_e:y(0);break}default:_e=y(0)}while(!1);if(m|0)for(Nt=1040+(Ar<<2)|0,_r=976+(Ar<<2)|0,We=0,j=0;;){e:do if(j>>>0>>0)for(Qe=y(0),rt=y(0),l=y(0),oe=j;;){O=n[(n[po>>2]|0)+(oe<<2)>>2]|0;do if((n[O+36>>2]|0)!=1&&!(n[O+24>>2]|0)){if((n[O+940>>2]|0)!=(We|0))break e;if(qF(O,Ar)|0&&(Kt=y(h[O+908+(n[_r>>2]<<2)>>2]),l=y(Yn(l,y(Kt+y(fn(O,Ar,Fr)))))),(Wi(s,O)|0)!=5)break;Us=y(m0(O)),Us=y(Us+y(K(O,0,Fr))),Kt=y(h[O+912>>2]),Kt=y(y(Kt+y(fn(O,0,Fr)))-Us),Us=y(Yn(rt,Us)),Kt=y(Yn(Qe,Kt)),Qe=Kt,rt=Us,l=y(Yn(l,y(Us+Kt)))}while(!1);if(O=oe+1|0,O>>>0>>0)oe=O;else{oe=O;break}}else rt=y(0),l=y(0),oe=j;while(!1);if(ct=y(_e+l),c=Oe,Oe=y(Oe+ct),j>>>0>>0){Xe=y(c+rt),O=j;do{j=n[(n[po>>2]|0)+(O<<2)>>2]|0;e:do if((n[j+36>>2]|0)!=1&&!(n[j+24>>2]|0))switch(Wi(s,j)|0){case 1:{Kt=y(c+y(K(j,Ar,Fr))),h[j+400+(n[Nt>>2]<<2)>>2]=Kt;break e}case 3:{Kt=y(y(Oe-y(re(j,Ar,Fr)))-y(h[j+908+(n[_r>>2]<<2)>>2])),h[j+400+(n[Nt>>2]<<2)>>2]=Kt;break e}case 2:{Kt=y(c+y(y(ct-y(h[j+908+(n[_r>>2]<<2)>>2]))*y(.5))),h[j+400+(n[Nt>>2]<<2)>>2]=Kt;break e}case 4:{if(Kt=y(c+y(K(j,Ar,Fr))),h[j+400+(n[Nt>>2]<<2)>>2]=Kt,Ns(j,Ar,Un)|0||(ri?(Qe=y(h[j+908>>2]),l=y(Qe+y(fn(j,Lr,Fr))),rt=ct):(rt=y(h[j+912>>2]),rt=y(rt+y(fn(j,Ar,Fr))),l=ct,Qe=y(h[j+908>>2])),An(l,Qe)|0&&An(rt,y(h[j+912>>2]))|0))break e;Ka(j,l,rt,Is,1,1,Fr,Ao,1,3501,M)|0;break e}case 5:{h[j+404>>2]=y(y(Xe-y(m0(j)))+y(YA(j,0,Un)));break e}default:break e}while(!1);O=O+1|0}while((O|0)!=(oe|0))}if(We=We+1|0,(We|0)==(m|0))break;j=oe}}}while(!1);if(h[s+908>>2]=y(Mn(s,2,Oc,B,B)),h[s+912>>2]=y(Mn(s,0,af,k,B)),Rl|0&&(lf=n[s+32>>2]|0,cf=(Rl|0)==2,!(cf&(lf|0)!=2))?cf&(lf|0)==2&&(l=y(Mc+lr),l=y(Yn(y(M0(l,y(y0(s,Lr,Nc,fo)))),Mc)),$r=198):(l=y(Mn(s,Lr,Nc,fo,B)),$r=198),($r|0)==198&&(h[s+908+(n[976+(Lr<<2)>>2]<<2)>>2]=l),Tl|0&&(Af=n[s+32>>2]|0,ff=(Tl|0)==2,!(ff&(Af|0)!=2))?ff&(Af|0)==2&&(l=y(_s+Un),l=y(Yn(y(M0(l,y(y0(s,Ar,y(_s+Cs),Uc)))),_s)),$r=204):(l=y(Mn(s,Ar,y(_s+Cs),Uc,B)),$r=204),($r|0)==204&&(h[s+908+(n[976+(Ar<<2)>>2]<<2)>>2]=l),F){if((n[uf>>2]|0)==2){j=976+(Ar<<2)|0,oe=1040+(Ar<<2)|0,O=0;do We=rs(s,O)|0,n[We+24>>2]|0||(pf=n[j>>2]|0,Kt=y(h[s+908+(pf<<2)>>2]),hi=We+400+(n[oe>>2]<<2)|0,Kt=y(Kt-y(h[hi>>2])),h[hi>>2]=y(Kt-y(h[We+908+(pf<<2)>>2]))),O=O+1|0;while((O|0)!=(Hs|0))}if(f|0){O=ri?Rl:d;do jF(s,f,Fr,O,Ao,Is,M),f=n[f+960>>2]|0;while(f|0)}if(O=(Lr|2|0)==3,j=(Ar|2|0)==3,O|j){f=0;do oe=n[(n[po>>2]|0)+(f<<2)>>2]|0,(n[oe+36>>2]|0)!=1&&(O&&bI(s,oe,Lr),j&&bI(s,oe,Ar)),f=f+1|0;while((f|0)!=(Hs|0))}}}while(!1);C=Ll}function dp(s,l){s=s|0,l=y(l);var c=0;ua(s,l>=y(0),3147),c=l==y(0),h[s+4>>2]=c?y(0):l}function qA(s,l,c,f){s=s|0,l=y(l),c=y(c),f=f|0;var d=Ze,m=Ze,B=0,k=0,F=0;n[2278]=(n[2278]|0)+1,Pu(s),Ns(s,2,l)|0?(d=y(Vr(n[s+992>>2]|0,l)),F=1,d=y(d+y(fn(s,2,l)))):(d=y(Vr(s+380|0,l)),d>=y(0)?F=2:(F=((Ot(l)|0)^1)&1,d=l)),Ns(s,0,c)|0?(m=y(Vr(n[s+996>>2]|0,c)),k=1,m=y(m+y(fn(s,0,l)))):(m=y(Vr(s+388|0,c)),m>=y(0)?k=2:(k=((Ot(c)|0)^1)&1,m=c)),B=s+976|0,Ka(s,d,m,f,F,k,l,c,1,3189,n[B>>2]|0)|0&&(mp(s,n[s+496>>2]|0,l,c,l),jA(s,y(h[(n[B>>2]|0)+4>>2]),y(0),y(0)),o[11696]|0)&&h0(s,7)}function Pu(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;k=C,C=C+32|0,B=k+24|0,m=k+16|0,f=k+8|0,d=k,c=0;do l=s+380+(c<<3)|0,n[s+380+(c<<3)+4>>2]|0&&(F=l,M=n[F+4>>2]|0,O=f,n[O>>2]=n[F>>2],n[O+4>>2]=M,O=s+364+(c<<3)|0,M=n[O+4>>2]|0,F=d,n[F>>2]=n[O>>2],n[F+4>>2]=M,n[m>>2]=n[f>>2],n[m+4>>2]=n[f+4>>2],n[B>>2]=n[d>>2],n[B+4>>2]=n[d+4>>2],vu(m,B)|0)||(l=s+348+(c<<3)|0),n[s+992+(c<<2)>>2]=l,c=c+1|0;while((c|0)!=2);C=k}function Ns(s,l,c){s=s|0,l=l|0,c=y(c);var f=0;switch(s=n[s+992+(n[976+(l<<2)>>2]<<2)>>2]|0,n[s+4>>2]|0){case 0:case 3:{s=0;break}case 1:{y(h[s>>2])>2])>2]|0){case 2:{l=y(y(y(h[s>>2])*l)/y(100));break}case 1:{l=y(h[s>>2]);break}default:l=y(ue)}return y(l)}function mp(s,l,c,f,d){s=s|0,l=l|0,c=y(c),f=y(f),d=y(d);var m=0,B=Ze;l=n[s+944>>2]|0?l:1,m=hr(n[s+4>>2]|0,l)|0,l=Fd(m,l)|0,c=y(uD(s,m,c)),f=y(uD(s,l,f)),B=y(c+y(K(s,m,d))),h[s+400+(n[1040+(m<<2)>>2]<<2)>>2]=B,c=y(c+y(re(s,m,d))),h[s+400+(n[1e3+(m<<2)>>2]<<2)>>2]=c,c=y(f+y(K(s,l,d))),h[s+400+(n[1040+(l<<2)>>2]<<2)>>2]=c,d=y(f+y(re(s,l,d))),h[s+400+(n[1e3+(l<<2)>>2]<<2)>>2]=d}function jA(s,l,c,f){s=s|0,l=y(l),c=y(c),f=y(f);var d=0,m=0,B=Ze,k=Ze,F=0,M=0,O=Ze,j=0,oe=Ze,We=Ze,Oe=Ze,Qe=Ze;if(l!=y(0)&&(d=s+400|0,Qe=y(h[d>>2]),m=s+404|0,Oe=y(h[m>>2]),j=s+416|0,We=y(h[j>>2]),M=s+420|0,B=y(h[M>>2]),oe=y(Qe+c),O=y(Oe+f),f=y(oe+We),k=y(O+B),F=(n[s+988>>2]|0)==1,h[d>>2]=y(Gi(Qe,l,0,F)),h[m>>2]=y(Gi(Oe,l,0,F)),c=y(lT(y(We*l),y(1))),An(c,y(0))|0?m=0:m=(An(c,y(1))|0)^1,c=y(lT(y(B*l),y(1))),An(c,y(0))|0?d=0:d=(An(c,y(1))|0)^1,Qe=y(Gi(f,l,F&m,F&(m^1))),h[j>>2]=y(Qe-y(Gi(oe,l,0,F))),Qe=y(Gi(k,l,F&d,F&(d^1))),h[M>>2]=y(Qe-y(Gi(O,l,0,F))),m=(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2,m|0)){d=0;do jA(rs(s,d)|0,l,oe,O),d=d+1|0;while((d|0)!=(m|0))}}function kd(s,l,c,f,d){switch(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,c|0){case 5:case 0:{s=M7(n[489]|0,f,d)|0;break}default:s=HUe(f,d)|0}return s|0}function d0(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;d=C,C=C+16|0,m=d,n[m>>2]=f,yp(s,0,l,c,m),C=d}function yp(s,l,c,f,d){if(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,s=s|0?s:956,sW[n[s+8>>2]&1](s,l,c,f,d)|0,(c|0)==5)Tt();else return}function xl(s,l,c){s=s|0,l=l|0,c=c|0,o[s+l>>0]=c&1}function Qd(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(Ep(s,f),bt(s,n[l>>2]|0,n[c>>2]|0,f))}function Ep(s,l){s=s|0,l=l|0;var c=0;if((L(s)|0)>>>0>>0&&Zr(s),l>>>0>1073741823)Tt();else{c=Yt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function bt(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(br(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function L(s){return s=s|0,1073741823}function K(s,l,c){return s=s|0,l=l|0,c=y(c),ge(l)|0&&n[s+96>>2]|0?s=s+92|0:s=vn(s+60|0,n[1040+(l<<2)>>2]|0,992)|0,y(Ye(s,c))}function re(s,l,c){return s=s|0,l=l|0,c=y(c),ge(l)|0&&n[s+104>>2]|0?s=s+100|0:s=vn(s+60|0,n[1e3+(l<<2)>>2]|0,992)|0,y(Ye(s,c))}function ge(s){return s=s|0,(s|1|0)==3|0}function Ye(s,l){return s=s|0,l=y(l),(n[s+4>>2]|0)==3?l=y(0):l=y(Vr(s,l)),y(l)}function At(s,l){return s=s|0,l=l|0,s=n[s>>2]|0,(s|0?s:(l|0)>1?l:1)|0}function hr(s,l){s=s|0,l=l|0;var c=0;e:do if((l|0)==2){switch(s|0){case 2:{s=3;break e}case 3:break;default:{c=4;break e}}s=2}else c=4;while(!1);return s|0}function Ir(s,l){s=s|0,l=l|0;var c=Ze;return ge(l)|0&&n[s+312>>2]|0&&(c=y(h[s+308>>2]),c>=y(0))||(c=y(Yn(y(h[(vn(s+276|0,n[1040+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function Rn(s,l){s=s|0,l=l|0;var c=Ze;return ge(l)|0&&n[s+320>>2]|0&&(c=y(h[s+316>>2]),c>=y(0))||(c=y(Yn(y(h[(vn(s+276|0,n[1e3+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function ai(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return ge(l)|0&&n[s+240>>2]|0&&(f=y(Vr(s+236|0,c)),f>=y(0))||(f=y(Yn(y(Vr(vn(s+204|0,n[1040+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function ns(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return ge(l)|0&&n[s+248>>2]|0&&(f=y(Vr(s+244|0,c)),f>=y(0))||(f=y(Yn(y(Vr(vn(s+204|0,n[1e3+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function GA(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=Ze,F=Ze,M=Ze,O=Ze,j=Ze,oe=Ze,We=0,Oe=0,Qe=0;Qe=C,C=C+16|0,We=Qe,Oe=s+964|0,pi(s,(n[Oe>>2]|0)!=0,3519),k=y(da(s,2,l)),F=y(da(s,0,l)),M=y(fn(s,2,l)),O=y(fn(s,0,l)),Ot(l)|0?j=l:j=y(Yn(y(0),y(y(l-M)-k))),Ot(c)|0?oe=c:oe=y(Yn(y(0),y(y(c-O)-F))),(f|0)==1&(d|0)==1?(h[s+908>>2]=y(Mn(s,2,y(l-M),m,m)),l=y(Mn(s,0,y(c-O),B,m))):(oW[n[Oe>>2]&1](We,s,j,f,oe,d),j=y(k+y(h[We>>2])),oe=y(l-M),h[s+908>>2]=y(Mn(s,2,(f|2|0)==2?j:oe,m,m)),oe=y(F+y(h[We+4>>2])),l=y(c-O),l=y(Mn(s,0,(d|2|0)==2?oe:l,B,m))),h[s+912>>2]=l,C=Qe}function lD(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=Ze,F=Ze,M=Ze,O=Ze;M=y(da(s,2,m)),k=y(da(s,0,m)),O=y(fn(s,2,m)),F=y(fn(s,0,m)),l=y(l-O),h[s+908>>2]=y(Mn(s,2,(f|2|0)==2?M:l,m,m)),c=y(c-F),h[s+912>>2]=y(Mn(s,0,(d|2|0)==2?k:c,B,m))}function SI(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=0,F=Ze,M=Ze;return k=(f|0)==2,!(l<=y(0)&k)&&!(c<=y(0)&(d|0)==2)&&!((f|0)==1&(d|0)==1)?s=0:(F=y(fn(s,0,m)),M=y(fn(s,2,m)),k=l>2]=y(Mn(s,2,k?y(0):l,m,m)),l=y(c-F),k=c>2]=y(Mn(s,0,k?y(0):l,B,m)),s=1),s|0}function Fd(s,l){return s=s|0,l=l|0,E0(s)|0?s=hr(2,l)|0:s=0,s|0}function Cp(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(ai(s,l,c)),y(c+y(Ir(s,l)))}function PI(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(ns(s,l,c)),y(c+y(Rn(s,l)))}function da(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(Cp(s,l,c)),y(f+y(PI(s,l,c)))}function xI(s){return s=s|0,n[s+24>>2]|0?s=0:y(WA(s))!=y(0)?s=1:s=y(Ip(s))!=y(0),s|0}function WA(s){s=s|0;var l=Ze;if(n[s+944>>2]|0){if(l=y(h[s+44>>2]),Ot(l)|0)return l=y(h[s+40>>2]),s=l>y(0)&((Ot(l)|0)^1),y(s?l:y(0))}else l=y(0);return y(l)}function Ip(s){s=s|0;var l=Ze,c=0,f=Ze;do if(n[s+944>>2]|0){if(l=y(h[s+48>>2]),Ot(l)|0){if(c=o[(n[s+976>>2]|0)+2>>0]|0,!(c<<24>>24)&&(f=y(h[s+40>>2]),f>24?y(1):y(0)}}else l=y(0);while(!1);return y(l)}function Rd(s){s=s|0;var l=0,c=0;if(sm(s+400|0,0,540)|0,o[s+985>>0]=1,ee(s),c=Di(s)|0,c|0){l=s+948|0,s=0;do Rd(n[(n[l>>2]|0)+(s<<2)>>2]|0),s=s+1|0;while((s|0)!=(c|0))}}function cD(s,l,c,f,d,m,B,k,F,M){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=y(m),B=y(B),k=k|0,F=F|0,M=M|0;var O=0,j=Ze,oe=0,We=0,Oe=Ze,Qe=Ze,rt=0,Xe=Ze,ct=0,_e=Ze,Ge=0,Nt=0,_r=0,ur=0,Zt=0,kr=0,Or=0,lr=0,Ln=0,lo=0;Ln=C,C=C+16|0,_r=Ln+12|0,ur=Ln+8|0,Zt=Ln+4|0,kr=Ln,lr=hr(n[s+4>>2]|0,F)|0,Ge=ge(lr)|0,j=y(Vr(GF(l)|0,Ge?m:B)),Nt=Ns(l,2,m)|0,Or=Ns(l,0,B)|0;do if(!(Ot(j)|0)&&!(Ot(Ge?c:d)|0)){if(O=l+504|0,!(Ot(y(h[O>>2]))|0)&&(!(kI(n[l+976>>2]|0,0)|0)||(n[l+500>>2]|0)==(n[2278]|0)))break;h[O>>2]=y(Yn(j,y(da(l,lr,m))))}else oe=7;while(!1);do if((oe|0)==7){if(ct=Ge^1,!(ct|Nt^1)){B=y(Vr(n[l+992>>2]|0,m)),h[l+504>>2]=y(Yn(B,y(da(l,2,m))));break}if(!(Ge|Or^1)){B=y(Vr(n[l+996>>2]|0,B)),h[l+504>>2]=y(Yn(B,y(da(l,0,m))));break}h[_r>>2]=y(ue),h[ur>>2]=y(ue),n[Zt>>2]=0,n[kr>>2]=0,Xe=y(fn(l,2,m)),_e=y(fn(l,0,m)),Nt?(Oe=y(Xe+y(Vr(n[l+992>>2]|0,m))),h[_r>>2]=Oe,n[Zt>>2]=1,We=1):(We=0,Oe=y(ue)),Or?(j=y(_e+y(Vr(n[l+996>>2]|0,B))),h[ur>>2]=j,n[kr>>2]=1,O=1):(O=0,j=y(ue)),oe=n[s+32>>2]|0,Ge&(oe|0)==2?oe=2:Ot(Oe)|0&&!(Ot(c)|0)&&(h[_r>>2]=c,n[Zt>>2]=2,We=2,Oe=c),!((oe|0)==2&ct)&&Ot(j)|0&&!(Ot(d)|0)&&(h[ur>>2]=d,n[kr>>2]=2,O=2,j=d),Qe=y(h[l+396>>2]),rt=Ot(Qe)|0;do if(rt)oe=We;else{if((We|0)==1&ct){h[ur>>2]=y(y(Oe-Xe)/Qe),n[kr>>2]=1,O=1,oe=1;break}Ge&(O|0)==1?(h[_r>>2]=y(Qe*y(j-_e)),n[Zt>>2]=1,O=1,oe=1):oe=We}while(!1);lo=Ot(c)|0,We=(Wi(s,l)|0)!=4,!(Ge|Nt|((f|0)!=1|lo)|(We|(oe|0)==1))&&(h[_r>>2]=c,n[Zt>>2]=1,!rt)&&(h[ur>>2]=y(y(c-Xe)/Qe),n[kr>>2]=1,O=1),!(Or|ct|((k|0)!=1|(Ot(d)|0))|(We|(O|0)==1))&&(h[ur>>2]=d,n[kr>>2]=1,!rt)&&(h[_r>>2]=y(Qe*y(d-_e)),n[Zt>>2]=1),xc(l,2,m,m,Zt,_r),xc(l,0,B,m,kr,ur),c=y(h[_r>>2]),d=y(h[ur>>2]),Ka(l,c,d,F,n[Zt>>2]|0,n[kr>>2]|0,m,B,0,3565,M)|0,B=y(h[l+908+(n[976+(lr<<2)>>2]<<2)>>2]),h[l+504>>2]=y(Yn(B,y(da(l,lr,m))))}while(!1);n[l+500>>2]=n[2278],C=Ln}function Mn(s,l,c,f,d){return s=s|0,l=l|0,c=y(c),f=y(f),d=y(d),f=y(y0(s,l,c,f)),y(Yn(f,y(da(s,l,d))))}function Wi(s,l){return s=s|0,l=l|0,l=l+20|0,l=n[(n[l>>2]|0?l:s+16|0)>>2]|0,(l|0)==5&&E0(n[s+4>>2]|0)|0&&(l=1),l|0}function Ja(s,l){return s=s|0,l=l|0,ge(l)|0&&n[s+96>>2]|0?l=4:l=n[1040+(l<<2)>>2]|0,s+60+(l<<3)|0}function za(s,l){return s=s|0,l=l|0,ge(l)|0&&n[s+104>>2]|0?l=5:l=n[1e3+(l<<2)>>2]|0,s+60+(l<<3)|0}function xc(s,l,c,f,d,m){switch(s=s|0,l=l|0,c=y(c),f=y(f),d=d|0,m=m|0,c=y(Vr(s+380+(n[976+(l<<2)>>2]<<3)|0,c)),c=y(c+y(fn(s,l,f))),n[d>>2]|0){case 2:case 1:{d=Ot(c)|0,f=y(h[m>>2]),h[m>>2]=d|f>2]=2,h[m>>2]=c);break}default:}}function Ho(s,l){return s=s|0,l=l|0,s=s+132|0,ge(l)|0&&n[(vn(s,4,948)|0)+4>>2]|0?s=1:s=(n[(vn(s,n[1040+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function YA(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,ge(l)|0&&(f=vn(s,4,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=vn(s,n[1040+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(Vr(f,c))),y(c)}function VA(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),f=y(f+y(K(s,l,c))),y(f+y(re(s,l,c)))}function HF(s){s=s|0;var l=0,c=0,f=0;e:do if(E0(n[s+4>>2]|0)|0)l=0;else if((n[s+16>>2]|0)!=5)if(c=Di(s)|0,!c)l=0;else for(l=0;;){if(f=rs(s,l)|0,!(n[f+24>>2]|0)&&(n[f+20>>2]|0)==5){l=1;break e}if(l=l+1|0,l>>>0>=c>>>0){l=0;break}}else l=1;while(!1);return l|0}function qF(s,l){s=s|0,l=l|0;var c=Ze;return c=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),c>=y(0)&((Ot(c)|0)^1)|0}function m0(s){s=s|0;var l=Ze,c=0,f=0,d=0,m=0,B=0,k=0,F=Ze;if(c=n[s+968>>2]|0,c)F=y(h[s+908>>2]),l=y(h[s+912>>2]),l=y(tW[c&0](s,F,l)),pi(s,(Ot(l)|0)^1,3573);else{m=Di(s)|0;do if(m|0){for(c=0,d=0;;){if(f=rs(s,d)|0,n[f+940>>2]|0){B=8;break}if((n[f+24>>2]|0)!=1)if(k=(Wi(s,f)|0)==5,k){c=f;break}else c=c|0?c:f;if(d=d+1|0,d>>>0>=m>>>0){B=8;break}}if((B|0)==8&&!c)break;return l=y(m0(c)),y(l+y(h[c+404>>2]))}while(!1);l=y(h[s+912>>2])}return y(l)}function y0(s,l,c,f){s=s|0,l=l|0,c=y(c),f=y(f);var d=Ze,m=0;return E0(l)|0?(l=1,m=3):ge(l)|0?(l=0,m=3):(f=y(ue),d=y(ue)),(m|0)==3&&(d=y(Vr(s+364+(l<<3)|0,f)),f=y(Vr(s+380+(l<<3)|0,f))),m=f=y(0)&((Ot(f)|0)^1)),c=m?f:c,m=d>=y(0)&((Ot(d)|0)^1)&c>2]|0,m)|0,Oe=Fd(rt,m)|0,Qe=ge(rt)|0,j=y(fn(l,2,c)),oe=y(fn(l,0,c)),Ns(l,2,c)|0?k=y(j+y(Vr(n[l+992>>2]|0,c))):Ho(l,2)|0&&Td(l,2)|0?(k=y(h[s+908>>2]),F=y(Ir(s,2)),F=y(k-y(F+y(Rn(s,2)))),k=y(YA(l,2,c)),k=y(Mn(l,2,y(F-y(k+y(wp(l,2,c)))),c,c))):k=y(ue),Ns(l,0,d)|0?F=y(oe+y(Vr(n[l+996>>2]|0,d))):Ho(l,0)|0&&Td(l,0)|0?(F=y(h[s+912>>2]),ct=y(Ir(s,0)),ct=y(F-y(ct+y(Rn(s,0)))),F=y(YA(l,0,d)),F=y(Mn(l,0,y(ct-y(F+y(wp(l,0,d)))),d,c))):F=y(ue),M=Ot(k)|0,O=Ot(F)|0;do if(M^O&&(We=y(h[l+396>>2]),!(Ot(We)|0)))if(M){k=y(j+y(y(F-oe)*We));break}else{ct=y(oe+y(y(k-j)/We)),F=O?ct:F;break}while(!1);O=Ot(k)|0,M=Ot(F)|0,O|M&&(_e=(O^1)&1,f=c>y(0)&((f|0)!=0&O),k=Qe?k:f?c:k,Ka(l,k,F,m,Qe?_e:f?2:_e,O&(M^1)&1,k,F,0,3623,B)|0,k=y(h[l+908>>2]),k=y(k+y(fn(l,2,c))),F=y(h[l+912>>2]),F=y(F+y(fn(l,0,c)))),Ka(l,k,F,m,1,1,k,F,1,3635,B)|0,Td(l,rt)|0&&!(Ho(l,rt)|0)?(_e=n[976+(rt<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(ct-y(h[l+908+(_e<<2)>>2])),ct=y(ct-y(Rn(s,rt))),ct=y(ct-y(re(l,rt,c))),ct=y(ct-y(wp(l,rt,Qe?c:d))),h[l+400+(n[1040+(rt<<2)>>2]<<2)>>2]=ct):Xe=21;do if((Xe|0)==21){if(!(Ho(l,rt)|0)&&(n[s+8>>2]|0)==1){_e=n[976+(rt<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(y(ct-y(h[l+908+(_e<<2)>>2]))*y(.5)),h[l+400+(n[1040+(rt<<2)>>2]<<2)>>2]=ct;break}!(Ho(l,rt)|0)&&(n[s+8>>2]|0)==2&&(_e=n[976+(rt<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(ct-y(h[l+908+(_e<<2)>>2])),h[l+400+(n[1040+(rt<<2)>>2]<<2)>>2]=ct)}while(!1);Td(l,Oe)|0&&!(Ho(l,Oe)|0)?(_e=n[976+(Oe<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(ct-y(h[l+908+(_e<<2)>>2])),ct=y(ct-y(Rn(s,Oe))),ct=y(ct-y(re(l,Oe,c))),ct=y(ct-y(wp(l,Oe,Qe?d:c))),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=ct):Xe=30;do if((Xe|0)==30&&!(Ho(l,Oe)|0)){if((Wi(s,l)|0)==2){_e=n[976+(Oe<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(y(ct-y(h[l+908+(_e<<2)>>2]))*y(.5)),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=ct;break}_e=(Wi(s,l)|0)==3,_e^(n[s+28>>2]|0)==2&&(_e=n[976+(Oe<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(ct-y(h[l+908+(_e<<2)>>2])),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=ct)}while(!1)}function bI(s,l,c){s=s|0,l=l|0,c=c|0;var f=Ze,d=0;d=n[976+(c<<2)>>2]|0,f=y(h[l+908+(d<<2)>>2]),f=y(y(h[s+908+(d<<2)>>2])-f),f=y(f-y(h[l+400+(n[1040+(c<<2)>>2]<<2)>>2])),h[l+400+(n[1e3+(c<<2)>>2]<<2)>>2]=f}function E0(s){return s=s|0,(s|1|0)==1|0}function GF(s){s=s|0;var l=Ze;switch(n[s+56>>2]|0){case 0:case 3:{l=y(h[s+40>>2]),l>y(0)&((Ot(l)|0)^1)?s=o[(n[s+976>>2]|0)+2>>0]|0?1056:992:s=1056;break}default:s=s+52|0}return s|0}function kI(s,l){return s=s|0,l=l|0,(o[s+l>>0]|0)!=0|0}function Td(s,l){return s=s|0,l=l|0,s=s+132|0,ge(l)|0&&n[(vn(s,5,948)|0)+4>>2]|0?s=1:s=(n[(vn(s,n[1e3+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function wp(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,ge(l)|0&&(f=vn(s,5,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=vn(s,n[1e3+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(Vr(f,c))),y(c)}function uD(s,l,c){return s=s|0,l=l|0,c=y(c),Ho(s,l)|0?c=y(YA(s,l,c)):c=y(-y(wp(s,l,c))),y(c)}function AD(s){return s=y(s),h[D>>2]=s,n[D>>2]|0|0}function Ld(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Yt(l<<2)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function fD(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Nd(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&yt(s)}function pD(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;if(B=s+4|0,k=n[B>>2]|0,d=k-f|0,m=d>>2,s=l+(m<<2)|0,s>>>0>>0){f=k;do n[f>>2]=n[s>>2],s=s+4|0,f=(n[B>>2]|0)+4|0,n[B>>2]=f;while(s>>>0>>0)}m|0&&rw(k+(0-m<<2)|0,l|0,d|0)|0}function hD(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0;return k=l+4|0,F=n[k>>2]|0,d=n[s>>2]|0,B=c,m=B-d|0,f=F+(0-(m>>2)<<2)|0,n[k>>2]=f,(m|0)>0&&br(f|0,d|0,m|0)|0,d=s+4|0,m=l+8|0,f=(n[d>>2]|0)-B|0,(f|0)>0&&(br(n[m>>2]|0,c|0,f|0)|0,n[m>>2]=(n[m>>2]|0)+(f>>>2<<2)),B=n[s>>2]|0,n[s>>2]=n[k>>2],n[k>>2]=B,B=n[d>>2]|0,n[d>>2]=n[m>>2],n[m>>2]=B,B=s+8|0,c=l+12|0,s=n[B>>2]|0,n[B>>2]=n[c>>2],n[c>>2]=s,n[l>>2]=n[k>>2],F|0}function QI(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(B=n[l>>2]|0,m=n[c>>2]|0,(B|0)!=(m|0)){d=s+8|0,c=((m+-4-B|0)>>>2)+1|0,s=B,f=n[d>>2]|0;do n[f>>2]=n[s>>2],f=(n[d>>2]|0)+4|0,n[d>>2]=f,s=s+4|0;while((s|0)!=(m|0));n[l>>2]=B+(c<<2)}}function FI(){Oo()}function gD(){var s=0;return s=Yt(4)|0,RI(s),s|0}function RI(s){s=s|0,n[s>>2]=Pl()|0}function dD(s){s=s|0,s|0&&(C0(s),yt(s))}function C0(s){s=s|0,st(n[s>>2]|0)}function WF(s,l,c){s=s|0,l=l|0,c=c|0,xl(n[s>>2]|0,l,c)}function Od(s,l){s=s|0,l=y(l),dp(n[s>>2]|0,l)}function Md(s,l){return s=s|0,l=l|0,kI(n[s>>2]|0,l)|0}function Ud(){var s=0;return s=Yt(8)|0,I0(s,0),s|0}function I0(s,l){s=s|0,l=l|0,l?l=Mo(n[l>>2]|0)|0:l=qi()|0,n[s>>2]=l,n[s+4>>2]=0,Sn(l,s)}function _d(s){s=s|0;var l=0;return l=Yt(8)|0,I0(l,s),l|0}function w0(s){s=s|0,s|0&&(Hd(s),yt(s))}function Hd(s){s=s|0;var l=0;Dl(n[s>>2]|0),l=s+4|0,s=n[l>>2]|0,n[l>>2]=0,s|0&&(xu(s),yt(s))}function xu(s){s=s|0,bu(s)}function bu(s){s=s|0,s=n[s>>2]|0,s|0&&sa(s|0)}function TI(s){return s=s|0,fa(s)|0}function LI(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(xu(l),yt(l)),Sl(n[s>>2]|0)}function qd(s,l){s=s|0,l=l|0,sn(n[s>>2]|0,n[l>>2]|0)}function YF(s,l){s=s|0,l=l|0,fp(n[s>>2]|0,l)}function VF(s,l,c){s=s|0,l=l|0,c=+c,Sd(n[s>>2]|0,l,y(c))}function jd(s,l,c){s=s|0,l=l|0,c=+c,Pd(n[s>>2]|0,l,y(c))}function NI(s,l){s=s|0,l=l|0,cp(n[s>>2]|0,l)}function OI(s,l){s=s|0,l=l|0,to(n[s>>2]|0,l)}function Pr(s,l){s=s|0,l=l|0,Ap(n[s>>2]|0,l)}function Os(s,l){s=s|0,l=l|0,wd(n[s>>2]|0,l)}function Oi(s,l){s=s|0,l=l|0,o0(n[s>>2]|0,l)}function ms(s,l){s=s|0,l=l|0,eo(n[s>>2]|0,l)}function KA(s,l,c){s=s|0,l=l|0,c=+c,OA(n[s>>2]|0,l,y(c))}function MI(s,l,c){s=s|0,l=l|0,c=+c,W(n[s>>2]|0,l,y(c))}function is(s,l){s=s|0,l=l|0,MA(n[s>>2]|0,l)}function Gd(s,l){s=s|0,l=l|0,vd(n[s>>2]|0,l)}function Bp(s,l){s=s|0,l=l|0,ro(n[s>>2]|0,l)}function B0(s,l){s=s|0,l=+l,pp(n[s>>2]|0,y(l))}function vp(s,l){s=s|0,l=+l,Ya(n[s>>2]|0,y(l))}function UI(s,l){s=s|0,l=+l,Dd(n[s>>2]|0,y(l))}function _I(s,l){s=s|0,l=+l,l0(n[s>>2]|0,y(l))}function HI(s,l){s=s|0,l=+l,Wa(n[s>>2]|0,y(l))}function qI(s,l){s=s|0,l=+l,c0(n[s>>2]|0,y(l))}function ku(s,l){s=s|0,l=+l,DI(n[s>>2]|0,y(l))}function ir(s){s=s|0,hp(n[s>>2]|0)}function Wd(s,l){s=s|0,l=+l,Ni(n[s>>2]|0,y(l))}function jI(s,l){s=s|0,l=+l,Iu(n[s>>2]|0,y(l))}function bl(s){s=s|0,pa(n[s>>2]|0)}function Qu(s,l){s=s|0,l=+l,Bc(n[s>>2]|0,y(l))}function v0(s,l){s=s|0,l=+l,wu(n[s>>2]|0,y(l))}function D0(s,l){s=s|0,l=+l,oi(n[s>>2]|0,y(l))}function GI(s,l){s=s|0,l=+l,UA(n[s>>2]|0,y(l))}function WI(s,l){s=s|0,l=+l,Uo(n[s>>2]|0,y(l))}function bc(s,l){s=s|0,l=+l,ga(n[s>>2]|0,y(l))}function S0(s,l){s=s|0,l=+l,gp(n[s>>2]|0,y(l))}function YI(s,l){s=s|0,l=+l,f0(n[s>>2]|0,y(l))}function Yd(s,l){s=s|0,l=+l,_A(n[s>>2]|0,y(l))}function kc(s,l,c){s=s|0,l=l|0,c=+c,wc(n[s>>2]|0,l,y(c))}function Vd(s,l,c){s=s|0,l=l|0,c=+c,no(n[s>>2]|0,l,y(c))}function P0(s,l,c){s=s|0,l=l|0,c=+c,Cu(n[s>>2]|0,l,y(c))}function x0(s){return s=s|0,s0(n[s>>2]|0)|0}function oo(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,NA(d,n[l>>2]|0,c),ss(s,d),C=f}function ss(s,l){s=s|0,l=l|0,Xa(s,n[l+4>>2]|0,+y(h[l>>2]))}function Xa(s,l,c){s=s|0,l=l|0,c=+c,n[s>>2]=l,E[s+8>>3]=c}function Kd(s){return s=s|0,vI(n[s>>2]|0)|0}function qo(s){return s=s|0,up(n[s>>2]|0)|0}function mD(s){return s=s|0,Ic(n[s>>2]|0)|0}function Dp(s){return s=s|0,BI(n[s>>2]|0)|0}function VI(s){return s=s|0,a0(n[s>>2]|0)|0}function KF(s){return s=s|0,Bd(n[s>>2]|0)|0}function yD(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,xt(d,n[l>>2]|0,c),ss(s,d),C=f}function ED(s){return s=s|0,Eu(n[s>>2]|0)|0}function Jd(s){return s=s|0,Ga(n[s>>2]|0)|0}function KI(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,LA(f,n[l>>2]|0),ss(s,f),C=c}function Sp(s){return s=s|0,+ +y(ei(n[s>>2]|0))}function CD(s){return s=s|0,+ +y(Qi(n[s>>2]|0))}function ID(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,cr(f,n[l>>2]|0),ss(s,f),C=c}function b0(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,u0(f,n[l>>2]|0),ss(s,f),C=c}function JF(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,wt(f,n[l>>2]|0),ss(s,f),C=c}function zF(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,ha(f,n[l>>2]|0),ss(s,f),C=c}function wD(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,A0(f,n[l>>2]|0),ss(s,f),C=c}function BD(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,bd(f,n[l>>2]|0),ss(s,f),C=c}function JA(s){return s=s|0,+ +y(p0(n[s>>2]|0))}function XF(s,l){return s=s|0,l=l|0,+ +y(xd(n[s>>2]|0,l))}function ZF(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,dt(d,n[l>>2]|0,c),ss(s,d),C=f}function Qc(s,l,c){s=s|0,l=l|0,c=c|0,ar(n[s>>2]|0,n[l>>2]|0,c)}function $F(s,l){s=s|0,l=l|0,yu(n[s>>2]|0,n[l>>2]|0)}function vD(s){return s=s|0,Di(n[s>>2]|0)|0}function eR(s){return s=s|0,s=mt(n[s>>2]|0)|0,s?s=TI(s)|0:s=0,s|0}function DD(s,l){return s=s|0,l=l|0,s=rs(n[s>>2]|0,l)|0,s?s=TI(s)|0:s=0,s|0}function Fu(s,l){s=s|0,l=l|0;var c=0,f=0;f=Yt(4)|0,SD(f,l),c=s+4|0,l=n[c>>2]|0,n[c>>2]=f,l|0&&(xu(l),yt(l)),vt(n[s>>2]|0,1)}function SD(s,l){s=s|0,l=l|0,iR(s,l)}function tR(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0;var B=0,k=0;B=C,C=C+16|0,k=B,PD(k,fa(l)|0,+c,f,+d,m),h[s>>2]=y(+E[k>>3]),h[s+4>>2]=y(+E[k+8>>3]),C=B}function PD(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0,k=0,F=0,M=0,O=0;B=C,C=C+32|0,O=B+8|0,M=B+20|0,F=B,k=B+16|0,E[O>>3]=c,n[M>>2]=f,E[F>>3]=d,n[k>>2]=m,zd(s,n[l+4>>2]|0,O,M,F,k),C=B}function zd(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0;B=C,C=C+16|0,k=B,$a(k),l=ys(l)|0,xD(s,l,+E[c>>3],n[f>>2]|0,+E[d>>3],n[m>>2]|0),el(k),C=B}function ys(s){return s=s|0,n[s>>2]|0}function xD(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0;B=jo(JI()|0)|0,c=+ma(c),f=Xd(f)|0,d=+ma(d),rR(s,qn(0,B|0,l|0,+c,f|0,+d,Xd(m)|0)|0)}function JI(){var s=0;return o[7608]|0||(XI(9120),s=7608,n[s>>2]=1,n[s+4>>2]=0),9120}function jo(s){return s=s|0,n[s+8>>2]|0}function ma(s){return s=+s,+ +Ru(s)}function Xd(s){return s=s|0,k0(s)|0}function rR(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=l,f&1?(ya(c,0),ia(f|0,c|0)|0,zI(s,c),nR(c)):(n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]),C=d}function ya(s,l){s=s|0,l=l|0,Fc(s,l),n[s+8>>2]=0,o[s+24>>0]=0}function zI(s,l){s=s|0,l=l|0,l=l+8|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]}function nR(s){s=s|0,o[s+24>>0]=0}function Fc(s,l){s=s|0,l=l|0,n[s>>2]=l}function k0(s){return s=s|0,s|0}function Ru(s){return s=+s,+s}function XI(s){s=s|0,ao(s,ZI()|0,4)}function ZI(){return 1064}function ao(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=ki(l|0,c+1|0)|0}function iR(s,l){s=s|0,l=l|0,l=n[l>>2]|0,n[s>>2]=l,hc(l|0)}function bD(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(xu(l),yt(l)),vt(n[s>>2]|0,0)}function kD(s){s=s|0,Dt(n[s>>2]|0)}function Zd(s){return s=s|0,er(n[s>>2]|0)|0}function sR(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,qA(n[s>>2]|0,y(l),y(c),f)}function oR(s){return s=s|0,+ +y(vc(n[s>>2]|0))}function v(s){return s=s|0,+ +y(Bu(n[s>>2]|0))}function S(s){return s=s|0,+ +y(Dc(n[s>>2]|0))}function Q(s){return s=s|0,+ +y(gs(n[s>>2]|0))}function H(s){return s=s|0,+ +y(Sc(n[s>>2]|0))}function Y(s){return s=s|0,+ +y(On(n[s>>2]|0))}function ne(s,l){s=s|0,l=l|0,E[s>>3]=+y(vc(n[l>>2]|0)),E[s+8>>3]=+y(Bu(n[l>>2]|0)),E[s+16>>3]=+y(Dc(n[l>>2]|0)),E[s+24>>3]=+y(gs(n[l>>2]|0)),E[s+32>>3]=+y(Sc(n[l>>2]|0)),E[s+40>>3]=+y(On(n[l>>2]|0))}function Be(s,l){return s=s|0,l=l|0,+ +y(ji(n[s>>2]|0,l))}function Ue(s,l){return s=s|0,l=l|0,+ +y(Ci(n[s>>2]|0,l))}function ft(s,l){return s=s|0,l=l|0,+ +y(HA(n[s>>2]|0,l))}function jt(){return Dn()|0}function wr(){Tr(),Xt(),jn(),li(),Ea(),$e()}function Tr(){PLe(11713,4938,1)}function Xt(){YTe(10448)}function jn(){PTe(10408)}function li(){zRe(10324)}function Ea(){iFe(10096)}function $e(){je(9132)}function je(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0,ct=0,_e=0,Ge=0,Nt=0,_r=0,ur=0,Zt=0,kr=0,Or=0,lr=0,Ln=0,lo=0,co=0,uo=0,Ia=0,Lp=0,Np=0,kl=0,Op=0,Nu=0,Ou=0,Mp=0,Up=0,_p=0,$r=0,Ql=0,Hp=0,Lc=0,qp=0,jp=0,Mu=0,Uu=0,Nc=0,Ms=0,rl=0,Go=0,Fl=0,rf=0,nf=0,_u=0,sf=0,of=0,Us=0,Cs=0,Rl=0,Un=0,af=0,Ao=0,Oc=0,fo=0,Mc=0,lf=0,cf=0,Uc=0,_s=0,Tl=0,uf=0,Af=0,ff=0,Fr=0,ri=0,Is=0,po=0,Hs=0,Lr=0,Ar=0,Ll=0;l=C,C=C+672|0,c=l+656|0,Ll=l+648|0,Ar=l+640|0,Lr=l+632|0,Hs=l+624|0,po=l+616|0,Is=l+608|0,ri=l+600|0,Fr=l+592|0,ff=l+584|0,Af=l+576|0,uf=l+568|0,Tl=l+560|0,_s=l+552|0,Uc=l+544|0,cf=l+536|0,lf=l+528|0,Mc=l+520|0,fo=l+512|0,Oc=l+504|0,Ao=l+496|0,af=l+488|0,Un=l+480|0,Rl=l+472|0,Cs=l+464|0,Us=l+456|0,of=l+448|0,sf=l+440|0,_u=l+432|0,nf=l+424|0,rf=l+416|0,Fl=l+408|0,Go=l+400|0,rl=l+392|0,Ms=l+384|0,Nc=l+376|0,Uu=l+368|0,Mu=l+360|0,jp=l+352|0,qp=l+344|0,Lc=l+336|0,Hp=l+328|0,Ql=l+320|0,$r=l+312|0,_p=l+304|0,Up=l+296|0,Mp=l+288|0,Ou=l+280|0,Nu=l+272|0,Op=l+264|0,kl=l+256|0,Np=l+248|0,Lp=l+240|0,Ia=l+232|0,uo=l+224|0,co=l+216|0,lo=l+208|0,Ln=l+200|0,lr=l+192|0,Or=l+184|0,kr=l+176|0,Zt=l+168|0,ur=l+160|0,_r=l+152|0,Nt=l+144|0,Ge=l+136|0,_e=l+128|0,ct=l+120|0,Xe=l+112|0,rt=l+104|0,Qe=l+96|0,Oe=l+88|0,We=l+80|0,oe=l+72|0,j=l+64|0,O=l+56|0,M=l+48|0,F=l+40|0,k=l+32|0,B=l+24|0,m=l+16|0,d=l+8|0,f=l,pt(s,3646),zt(s,3651,2)|0,Br(s,3665,2)|0,Wn(s,3682,18)|0,n[Ll>>2]=19,n[Ll+4>>2]=0,n[c>>2]=n[Ll>>2],n[c+4>>2]=n[Ll+4>>2],xr(s,3690,c)|0,n[Ar>>2]=1,n[Ar+4>>2]=0,n[c>>2]=n[Ar>>2],n[c+4>>2]=n[Ar+4>>2],Pn(s,3696,c)|0,n[Lr>>2]=2,n[Lr+4>>2]=0,n[c>>2]=n[Lr>>2],n[c+4>>2]=n[Lr+4>>2],Tn(s,3706,c)|0,n[Hs>>2]=1,n[Hs+4>>2]=0,n[c>>2]=n[Hs>>2],n[c+4>>2]=n[Hs+4>>2],Yr(s,3722,c)|0,n[po>>2]=2,n[po+4>>2]=0,n[c>>2]=n[po>>2],n[c+4>>2]=n[po+4>>2],Yr(s,3734,c)|0,n[Is>>2]=3,n[Is+4>>2]=0,n[c>>2]=n[Is>>2],n[c+4>>2]=n[Is+4>>2],Tn(s,3753,c)|0,n[ri>>2]=4,n[ri+4>>2]=0,n[c>>2]=n[ri>>2],n[c+4>>2]=n[ri+4>>2],Tn(s,3769,c)|0,n[Fr>>2]=5,n[Fr+4>>2]=0,n[c>>2]=n[Fr>>2],n[c+4>>2]=n[Fr+4>>2],Tn(s,3783,c)|0,n[ff>>2]=6,n[ff+4>>2]=0,n[c>>2]=n[ff>>2],n[c+4>>2]=n[ff+4>>2],Tn(s,3796,c)|0,n[Af>>2]=7,n[Af+4>>2]=0,n[c>>2]=n[Af>>2],n[c+4>>2]=n[Af+4>>2],Tn(s,3813,c)|0,n[uf>>2]=8,n[uf+4>>2]=0,n[c>>2]=n[uf>>2],n[c+4>>2]=n[uf+4>>2],Tn(s,3825,c)|0,n[Tl>>2]=3,n[Tl+4>>2]=0,n[c>>2]=n[Tl>>2],n[c+4>>2]=n[Tl+4>>2],Yr(s,3843,c)|0,n[_s>>2]=4,n[_s+4>>2]=0,n[c>>2]=n[_s>>2],n[c+4>>2]=n[_s+4>>2],Yr(s,3853,c)|0,n[Uc>>2]=9,n[Uc+4>>2]=0,n[c>>2]=n[Uc>>2],n[c+4>>2]=n[Uc+4>>2],Tn(s,3870,c)|0,n[cf>>2]=10,n[cf+4>>2]=0,n[c>>2]=n[cf>>2],n[c+4>>2]=n[cf+4>>2],Tn(s,3884,c)|0,n[lf>>2]=11,n[lf+4>>2]=0,n[c>>2]=n[lf>>2],n[c+4>>2]=n[lf+4>>2],Tn(s,3896,c)|0,n[Mc>>2]=1,n[Mc+4>>2]=0,n[c>>2]=n[Mc>>2],n[c+4>>2]=n[Mc+4>>2],ti(s,3907,c)|0,n[fo>>2]=2,n[fo+4>>2]=0,n[c>>2]=n[fo>>2],n[c+4>>2]=n[fo+4>>2],ti(s,3915,c)|0,n[Oc>>2]=3,n[Oc+4>>2]=0,n[c>>2]=n[Oc>>2],n[c+4>>2]=n[Oc+4>>2],ti(s,3928,c)|0,n[Ao>>2]=4,n[Ao+4>>2]=0,n[c>>2]=n[Ao>>2],n[c+4>>2]=n[Ao+4>>2],ti(s,3948,c)|0,n[af>>2]=5,n[af+4>>2]=0,n[c>>2]=n[af>>2],n[c+4>>2]=n[af+4>>2],ti(s,3960,c)|0,n[Un>>2]=6,n[Un+4>>2]=0,n[c>>2]=n[Un>>2],n[c+4>>2]=n[Un+4>>2],ti(s,3974,c)|0,n[Rl>>2]=7,n[Rl+4>>2]=0,n[c>>2]=n[Rl>>2],n[c+4>>2]=n[Rl+4>>2],ti(s,3983,c)|0,n[Cs>>2]=20,n[Cs+4>>2]=0,n[c>>2]=n[Cs>>2],n[c+4>>2]=n[Cs+4>>2],xr(s,3999,c)|0,n[Us>>2]=8,n[Us+4>>2]=0,n[c>>2]=n[Us>>2],n[c+4>>2]=n[Us+4>>2],ti(s,4012,c)|0,n[of>>2]=9,n[of+4>>2]=0,n[c>>2]=n[of>>2],n[c+4>>2]=n[of+4>>2],ti(s,4022,c)|0,n[sf>>2]=21,n[sf+4>>2]=0,n[c>>2]=n[sf>>2],n[c+4>>2]=n[sf+4>>2],xr(s,4039,c)|0,n[_u>>2]=10,n[_u+4>>2]=0,n[c>>2]=n[_u>>2],n[c+4>>2]=n[_u+4>>2],ti(s,4053,c)|0,n[nf>>2]=11,n[nf+4>>2]=0,n[c>>2]=n[nf>>2],n[c+4>>2]=n[nf+4>>2],ti(s,4065,c)|0,n[rf>>2]=12,n[rf+4>>2]=0,n[c>>2]=n[rf>>2],n[c+4>>2]=n[rf+4>>2],ti(s,4084,c)|0,n[Fl>>2]=13,n[Fl+4>>2]=0,n[c>>2]=n[Fl>>2],n[c+4>>2]=n[Fl+4>>2],ti(s,4097,c)|0,n[Go>>2]=14,n[Go+4>>2]=0,n[c>>2]=n[Go>>2],n[c+4>>2]=n[Go+4>>2],ti(s,4117,c)|0,n[rl>>2]=15,n[rl+4>>2]=0,n[c>>2]=n[rl>>2],n[c+4>>2]=n[rl+4>>2],ti(s,4129,c)|0,n[Ms>>2]=16,n[Ms+4>>2]=0,n[c>>2]=n[Ms>>2],n[c+4>>2]=n[Ms+4>>2],ti(s,4148,c)|0,n[Nc>>2]=17,n[Nc+4>>2]=0,n[c>>2]=n[Nc>>2],n[c+4>>2]=n[Nc+4>>2],ti(s,4161,c)|0,n[Uu>>2]=18,n[Uu+4>>2]=0,n[c>>2]=n[Uu>>2],n[c+4>>2]=n[Uu+4>>2],ti(s,4181,c)|0,n[Mu>>2]=5,n[Mu+4>>2]=0,n[c>>2]=n[Mu>>2],n[c+4>>2]=n[Mu+4>>2],Yr(s,4196,c)|0,n[jp>>2]=6,n[jp+4>>2]=0,n[c>>2]=n[jp>>2],n[c+4>>2]=n[jp+4>>2],Yr(s,4206,c)|0,n[qp>>2]=7,n[qp+4>>2]=0,n[c>>2]=n[qp>>2],n[c+4>>2]=n[qp+4>>2],Yr(s,4217,c)|0,n[Lc>>2]=3,n[Lc+4>>2]=0,n[c>>2]=n[Lc>>2],n[c+4>>2]=n[Lc+4>>2],Rc(s,4235,c)|0,n[Hp>>2]=1,n[Hp+4>>2]=0,n[c>>2]=n[Hp>>2],n[c+4>>2]=n[Hp+4>>2],aR(s,4251,c)|0,n[Ql>>2]=4,n[Ql+4>>2]=0,n[c>>2]=n[Ql>>2],n[c+4>>2]=n[Ql+4>>2],Rc(s,4263,c)|0,n[$r>>2]=5,n[$r+4>>2]=0,n[c>>2]=n[$r>>2],n[c+4>>2]=n[$r+4>>2],Rc(s,4279,c)|0,n[_p>>2]=6,n[_p+4>>2]=0,n[c>>2]=n[_p>>2],n[c+4>>2]=n[_p+4>>2],Rc(s,4293,c)|0,n[Up>>2]=7,n[Up+4>>2]=0,n[c>>2]=n[Up>>2],n[c+4>>2]=n[Up+4>>2],Rc(s,4306,c)|0,n[Mp>>2]=8,n[Mp+4>>2]=0,n[c>>2]=n[Mp>>2],n[c+4>>2]=n[Mp+4>>2],Rc(s,4323,c)|0,n[Ou>>2]=9,n[Ou+4>>2]=0,n[c>>2]=n[Ou>>2],n[c+4>>2]=n[Ou+4>>2],Rc(s,4335,c)|0,n[Nu>>2]=2,n[Nu+4>>2]=0,n[c>>2]=n[Nu>>2],n[c+4>>2]=n[Nu+4>>2],aR(s,4353,c)|0,n[Op>>2]=12,n[Op+4>>2]=0,n[c>>2]=n[Op>>2],n[c+4>>2]=n[Op+4>>2],Q0(s,4363,c)|0,n[kl>>2]=1,n[kl+4>>2]=0,n[c>>2]=n[kl>>2],n[c+4>>2]=n[kl+4>>2],zA(s,4376,c)|0,n[Np>>2]=2,n[Np+4>>2]=0,n[c>>2]=n[Np>>2],n[c+4>>2]=n[Np+4>>2],zA(s,4388,c)|0,n[Lp>>2]=13,n[Lp+4>>2]=0,n[c>>2]=n[Lp>>2],n[c+4>>2]=n[Lp+4>>2],Q0(s,4402,c)|0,n[Ia>>2]=14,n[Ia+4>>2]=0,n[c>>2]=n[Ia>>2],n[c+4>>2]=n[Ia+4>>2],Q0(s,4411,c)|0,n[uo>>2]=15,n[uo+4>>2]=0,n[c>>2]=n[uo>>2],n[c+4>>2]=n[uo+4>>2],Q0(s,4421,c)|0,n[co>>2]=16,n[co+4>>2]=0,n[c>>2]=n[co>>2],n[c+4>>2]=n[co+4>>2],Q0(s,4433,c)|0,n[lo>>2]=17,n[lo+4>>2]=0,n[c>>2]=n[lo>>2],n[c+4>>2]=n[lo+4>>2],Q0(s,4446,c)|0,n[Ln>>2]=18,n[Ln+4>>2]=0,n[c>>2]=n[Ln>>2],n[c+4>>2]=n[Ln+4>>2],Q0(s,4458,c)|0,n[lr>>2]=3,n[lr+4>>2]=0,n[c>>2]=n[lr>>2],n[c+4>>2]=n[lr+4>>2],zA(s,4471,c)|0,n[Or>>2]=1,n[Or+4>>2]=0,n[c>>2]=n[Or>>2],n[c+4>>2]=n[Or+4>>2],QD(s,4486,c)|0,n[kr>>2]=10,n[kr+4>>2]=0,n[c>>2]=n[kr>>2],n[c+4>>2]=n[kr+4>>2],Rc(s,4496,c)|0,n[Zt>>2]=11,n[Zt+4>>2]=0,n[c>>2]=n[Zt>>2],n[c+4>>2]=n[Zt+4>>2],Rc(s,4508,c)|0,n[ur>>2]=3,n[ur+4>>2]=0,n[c>>2]=n[ur>>2],n[c+4>>2]=n[ur+4>>2],aR(s,4519,c)|0,n[_r>>2]=4,n[_r+4>>2]=0,n[c>>2]=n[_r>>2],n[c+4>>2]=n[_r+4>>2],Lve(s,4530,c)|0,n[Nt>>2]=19,n[Nt+4>>2]=0,n[c>>2]=n[Nt>>2],n[c+4>>2]=n[Nt+4>>2],Nve(s,4542,c)|0,n[Ge>>2]=12,n[Ge+4>>2]=0,n[c>>2]=n[Ge>>2],n[c+4>>2]=n[Ge+4>>2],Ove(s,4554,c)|0,n[_e>>2]=13,n[_e+4>>2]=0,n[c>>2]=n[_e>>2],n[c+4>>2]=n[_e+4>>2],Mve(s,4568,c)|0,n[ct>>2]=2,n[ct+4>>2]=0,n[c>>2]=n[ct>>2],n[c+4>>2]=n[ct+4>>2],Uve(s,4578,c)|0,n[Xe>>2]=20,n[Xe+4>>2]=0,n[c>>2]=n[Xe>>2],n[c+4>>2]=n[Xe+4>>2],_ve(s,4587,c)|0,n[rt>>2]=22,n[rt+4>>2]=0,n[c>>2]=n[rt>>2],n[c+4>>2]=n[rt+4>>2],xr(s,4602,c)|0,n[Qe>>2]=23,n[Qe+4>>2]=0,n[c>>2]=n[Qe>>2],n[c+4>>2]=n[Qe+4>>2],xr(s,4619,c)|0,n[Oe>>2]=14,n[Oe+4>>2]=0,n[c>>2]=n[Oe>>2],n[c+4>>2]=n[Oe+4>>2],Hve(s,4629,c)|0,n[We>>2]=1,n[We+4>>2]=0,n[c>>2]=n[We>>2],n[c+4>>2]=n[We+4>>2],qve(s,4637,c)|0,n[oe>>2]=4,n[oe+4>>2]=0,n[c>>2]=n[oe>>2],n[c+4>>2]=n[oe+4>>2],zA(s,4653,c)|0,n[j>>2]=5,n[j+4>>2]=0,n[c>>2]=n[j>>2],n[c+4>>2]=n[j+4>>2],zA(s,4669,c)|0,n[O>>2]=6,n[O+4>>2]=0,n[c>>2]=n[O>>2],n[c+4>>2]=n[O+4>>2],zA(s,4686,c)|0,n[M>>2]=7,n[M+4>>2]=0,n[c>>2]=n[M>>2],n[c+4>>2]=n[M+4>>2],zA(s,4701,c)|0,n[F>>2]=8,n[F+4>>2]=0,n[c>>2]=n[F>>2],n[c+4>>2]=n[F+4>>2],zA(s,4719,c)|0,n[k>>2]=9,n[k+4>>2]=0,n[c>>2]=n[k>>2],n[c+4>>2]=n[k+4>>2],zA(s,4736,c)|0,n[B>>2]=21,n[B+4>>2]=0,n[c>>2]=n[B>>2],n[c+4>>2]=n[B+4>>2],jve(s,4754,c)|0,n[m>>2]=2,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],QD(s,4772,c)|0,n[d>>2]=3,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],QD(s,4790,c)|0,n[f>>2]=4,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],QD(s,4808,c)|0,C=l}function pt(s,l){s=s|0,l=l|0;var c=0;c=JQe()|0,n[s>>2]=c,zQe(c,l),Fp(n[s>>2]|0)}function zt(s,l,c){return s=s|0,l=l|0,c=c|0,LQe(s,mn(l)|0,c,0),s|0}function Br(s,l,c){return s=s|0,l=l|0,c=c|0,EQe(s,mn(l)|0,c,0),s|0}function Wn(s,l,c){return s=s|0,l=l|0,c=c|0,sQe(s,mn(l)|0,c,0),s|0}function xr(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],jke(s,l,d),C=f,s|0}function Pn(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],vke(s,l,d),C=f,s|0}function Tn(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],lke(s,l,d),C=f,s|0}function Yr(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Ybe(s,l,d),C=f,s|0}function ti(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],kbe(s,l,d),C=f,s|0}function Rc(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hbe(s,l,d),C=f,s|0}function aR(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Zxe(s,l,d),C=f,s|0}function Q0(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],vxe(s,l,d),C=f,s|0}function zA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],lxe(s,l,d),C=f,s|0}function QD(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],YPe(s,l,d),C=f,s|0}function Lve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],kPe(s,l,d),C=f,s|0}function Nve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hPe(s,l,d),C=f,s|0}function Ove(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],$Se(s,l,d),C=f,s|0}function Mve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],MSe(s,l,d),C=f,s|0}function Uve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ISe(s,l,d),C=f,s|0}function _ve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],iSe(s,l,d),C=f,s|0}function Hve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],qDe(s,l,d),C=f,s|0}function qve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],vDe(s,l,d),C=f,s|0}function jve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Gve(s,l,d),C=f,s|0}function Gve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Wve(s,c,d,1),C=f}function mn(s){return s=s|0,s|0}function Wve(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=lR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Yve(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Vve(m,f)|0,f),C=d}function lR(){var s=0,l=0;if(o[7616]|0||(L5(9136),pr(24,9136,U|0)|0,l=7616,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9136)|0)){s=9136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));L5(9136)}return 9136}function Yve(s){return s=s|0,0}function Vve(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=lR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],T5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(zve(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function yn(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0;B=C,C=C+32|0,oe=B+24|0,j=B+20|0,F=B+16|0,O=B+12|0,M=B+8|0,k=B+4|0,We=B,n[j>>2]=l,n[F>>2]=c,n[O>>2]=f,n[M>>2]=d,n[k>>2]=m,m=s+28|0,n[We>>2]=n[m>>2],n[oe>>2]=n[We>>2],Kve(s+24|0,oe,j,O,M,F,k)|0,n[m>>2]=n[n[m>>2]>>2],C=B}function Kve(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,s=Jve(l)|0,l=Yt(24)|0,R5(l+4|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0,n[B>>2]|0),n[l>>2]=n[s>>2],n[s>>2]=l,l|0}function Jve(s){return s=s|0,n[s>>2]|0}function R5(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function dr(s,l){return s=s|0,l=l|0,l|s|0}function T5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function zve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Xve(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,Zve(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],T5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,$ve(s,k),eDe(k),C=M;return}}function Xve(s){return s=s|0,357913941}function Zve(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function $ve(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function eDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function L5(s){s=s|0,nDe(s)}function tDe(s){s=s|0,rDe(s+24|0)}function Nr(s){return s=s|0,n[s>>2]|0}function rDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function nDe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,3,l,iDe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Jr(){return 9228}function iDe(){return 1140}function sDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=oDe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=aDe(l,f)|0,C=c,l|0}function zr(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function oDe(s){return s=s|0,(n[(lR()|0)+24>>2]|0)+(s*12|0)|0}function aDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+48|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),tf[c&31](f,s),f=lDe(f)|0,C=d,f|0}function lDe(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=cR(N5()|0)|0,f?(uR(l,f),AR(c,l),cDe(s,c),s=fR(l)|0):s=uDe(s)|0,C=d,s|0}function N5(){var s=0;return o[7632]|0||(CDe(9184),pr(25,9184,U|0)|0,s=7632,n[s>>2]=1,n[s+4>>2]=0),9184}function cR(s){return s=s|0,n[s+36>>2]|0}function uR(s,l){s=s|0,l=l|0,n[s>>2]=l,n[s+4>>2]=s,n[s+8>>2]=0}function AR(s,l){s=s|0,l=l|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=0}function cDe(s,l){s=s|0,l=l|0,hDe(l,s,s+8|0,s+16|0,s+24|0,s+32|0,s+40|0)|0}function fR(s){return s=s|0,n[(n[s+4>>2]|0)+8>>2]|0}function uDe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0;F=C,C=C+16|0,c=F+4|0,f=F,d=Za(8)|0,m=d,B=Yt(48)|0,k=B,l=k+48|0;do n[k>>2]=n[s>>2],k=k+4|0,s=s+4|0;while((k|0)<(l|0));return l=m+4|0,n[l>>2]=B,k=Yt(8)|0,B=n[l>>2]|0,n[f>>2]=0,n[c>>2]=n[f>>2],O5(k,B,c),n[d>>2]=k,C=F,m|0}function O5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Yt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1092,n[c+12>>2]=l,n[s+4>>2]=c}function ADe(s){s=s|0,im(s),yt(s)}function fDe(s){s=s|0,s=n[s+12>>2]|0,s|0&&yt(s)}function pDe(s){s=s|0,yt(s)}function hDe(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,m=gDe(n[s>>2]|0,l,c,f,d,m,B)|0,B=s+4|0,n[(n[B>>2]|0)+8>>2]=m,n[(n[B>>2]|0)+8>>2]|0}function gDe(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0;var k=0,F=0;return k=C,C=C+16|0,F=k,$a(F),s=ys(s)|0,B=dDe(s,+E[l>>3],+E[c>>3],+E[f>>3],+E[d>>3],+E[m>>3],+E[B>>3])|0,el(F),C=k,B|0}function dDe(s,l,c,f,d,m,B){s=s|0,l=+l,c=+c,f=+f,d=+d,m=+m,B=+B;var k=0;return k=jo(mDe()|0)|0,l=+ma(l),c=+ma(c),f=+ma(f),d=+ma(d),m=+ma(m),Ts(0,k|0,s|0,+l,+c,+f,+d,+m,+ +ma(B))|0}function mDe(){var s=0;return o[7624]|0||(yDe(9172),s=7624,n[s>>2]=1,n[s+4>>2]=0),9172}function yDe(s){s=s|0,ao(s,EDe()|0,6)}function EDe(){return 1112}function CDe(s){s=s|0,Pp(s)}function IDe(s){s=s|0,M5(s+24|0),U5(s+16|0)}function M5(s){s=s|0,BDe(s)}function U5(s){s=s|0,wDe(s)}function wDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,yt(c);while(l|0);n[s>>2]=0}function BDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,yt(c);while(l|0);n[s>>2]=0}function Pp(s){s=s|0;var l=0;n[s+16>>2]=0,n[s+20>>2]=0,l=s+24|0,n[l>>2]=0,n[s+28>>2]=l,n[s+36>>2]=0,o[s+40>>0]=0,o[s+41>>0]=0}function vDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],DDe(s,c,d,0),C=f}function DDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=pR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=SDe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,PDe(m,f)|0,f),C=d}function pR(){var s=0,l=0;if(o[7640]|0||(H5(9232),pr(26,9232,U|0)|0,l=7640,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9232)|0)){s=9232,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));H5(9232)}return 9232}function SDe(s){return s=s|0,0}function PDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=pR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],_5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(xDe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function _5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function xDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=bDe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,kDe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],_5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,QDe(s,k),FDe(k),C=M;return}}function bDe(s){return s=s|0,357913941}function kDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function QDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function FDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function H5(s){s=s|0,LDe(s)}function RDe(s){s=s|0,TDe(s+24|0)}function TDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function LDe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,1,l,NDe()|0,3),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function NDe(){return 1144}function ODe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,k=0,F=0;m=C,C=C+16|0,B=m+8|0,k=m,F=MDe(s)|0,s=n[F+4>>2]|0,n[k>>2]=n[F>>2],n[k+4>>2]=s,n[B>>2]=n[k>>2],n[B+4>>2]=n[k+4>>2],UDe(l,B,c,f,d),C=m}function MDe(s){return s=s|0,(n[(pR()|0)+24>>2]|0)+(s*12|0)|0}function UDe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,k=0,F=0,M=0;M=C,C=C+16|0,B=M+2|0,k=M+1|0,F=M,m=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(m=n[(n[s>>2]|0)+m>>2]|0),Tu(B,c),c=+Lu(B,c),Tu(k,f),f=+Lu(k,f),XA(F,d),F=ZA(F,d)|0,rW[m&1](s,c,f,F),C=M}function Tu(s,l){s=s|0,l=+l}function Lu(s,l){return s=s|0,l=+l,+ +HDe(l)}function XA(s,l){s=s|0,l=l|0}function ZA(s,l){return s=s|0,l=l|0,_De(l)|0}function _De(s){return s=s|0,s|0}function HDe(s){return s=+s,+s}function qDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],jDe(s,c,d,1),C=f}function jDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=hR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=GDe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,WDe(m,f)|0,f),C=d}function hR(){var s=0,l=0;if(o[7648]|0||(j5(9268),pr(27,9268,U|0)|0,l=7648,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9268)|0)){s=9268,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));j5(9268)}return 9268}function GDe(s){return s=s|0,0}function WDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=hR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],q5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(YDe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function q5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function YDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=VDe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,KDe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],q5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,JDe(s,k),zDe(k),C=M;return}}function VDe(s){return s=s|0,357913941}function KDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function JDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function zDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function j5(s){s=s|0,$De(s)}function XDe(s){s=s|0,ZDe(s+24|0)}function ZDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function $De(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,4,l,eSe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function eSe(){return 1160}function tSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=rSe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=nSe(l,f)|0,C=c,l|0}function rSe(s){return s=s|0,(n[(hR()|0)+24>>2]|0)+(s*12|0)|0}function nSe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),G5(_0[c&31](s)|0)|0}function G5(s){return s=s|0,s&1|0}function iSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],sSe(s,c,d,0),C=f}function sSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=gR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=oSe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,aSe(m,f)|0,f),C=d}function gR(){var s=0,l=0;if(o[7656]|0||(Y5(9304),pr(28,9304,U|0)|0,l=7656,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9304)|0)){s=9304,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));Y5(9304)}return 9304}function oSe(s){return s=s|0,0}function aSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=gR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],W5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(lSe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function W5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function lSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=cSe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,uSe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],W5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,ASe(s,k),fSe(k),C=M;return}}function cSe(s){return s=s|0,357913941}function uSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function ASe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function fSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function Y5(s){s=s|0,gSe(s)}function pSe(s){s=s|0,hSe(s+24|0)}function hSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function gSe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,5,l,dSe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function dSe(){return 1164}function mSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=ySe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ESe(l,d,c),C=f}function ySe(s){return s=s|0,(n[(gR()|0)+24>>2]|0)+(s*12|0)|0}function ESe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),xp(d,c),c=bp(d,c)|0,tf[f&31](s,c),kp(d),C=m}function xp(s,l){s=s|0,l=l|0,CSe(s,l)}function bp(s,l){return s=s|0,l=l|0,s|0}function kp(s){s=s|0,xu(s)}function CSe(s,l){s=s|0,l=l|0,dR(s,l)}function dR(s,l){s=s|0,l=l|0,n[s>>2]=l}function ISe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],wSe(s,c,d,0),C=f}function wSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=mR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=BSe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,vSe(m,f)|0,f),C=d}function mR(){var s=0,l=0;if(o[7664]|0||(K5(9340),pr(29,9340,U|0)|0,l=7664,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9340)|0)){s=9340,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));K5(9340)}return 9340}function BSe(s){return s=s|0,0}function vSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=mR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],V5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(DSe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function V5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function DSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=SSe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,PSe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],V5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,xSe(s,k),bSe(k),C=M;return}}function SSe(s){return s=s|0,357913941}function PSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function xSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function bSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function K5(s){s=s|0,FSe(s)}function kSe(s){s=s|0,QSe(s+24|0)}function QSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function FSe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,4,l,RSe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function RSe(){return 1180}function TSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=LSe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=NSe(l,d,c)|0,C=f,c|0}function LSe(s){return s=s|0,(n[(mR()|0)+24>>2]|0)+(s*12|0)|0}function NSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),F0(d,c),d=R0(d,c)|0,d=FD(pT[f&15](s,d)|0)|0,C=m,d|0}function F0(s,l){s=s|0,l=l|0}function R0(s,l){return s=s|0,l=l|0,OSe(l)|0}function FD(s){return s=s|0,s|0}function OSe(s){return s=s|0,s|0}function MSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],USe(s,c,d,0),C=f}function USe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=yR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=_Se(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,HSe(m,f)|0,f),C=d}function yR(){var s=0,l=0;if(o[7672]|0||(z5(9376),pr(30,9376,U|0)|0,l=7672,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9376)|0)){s=9376,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));z5(9376)}return 9376}function _Se(s){return s=s|0,0}function HSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=yR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],J5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(qSe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function J5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function qSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=jSe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,GSe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],J5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,WSe(s,k),YSe(k),C=M;return}}function jSe(s){return s=s|0,357913941}function GSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function WSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function YSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function z5(s){s=s|0,JSe(s)}function VSe(s){s=s|0,KSe(s+24|0)}function KSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function JSe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,5,l,X5()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function X5(){return 1196}function zSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=XSe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=ZSe(l,f)|0,C=c,l|0}function XSe(s){return s=s|0,(n[(yR()|0)+24>>2]|0)+(s*12|0)|0}function ZSe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),FD(_0[c&31](s)|0)|0}function $Se(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ePe(s,c,d,1),C=f}function ePe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=ER()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=tPe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,rPe(m,f)|0,f),C=d}function ER(){var s=0,l=0;if(o[7680]|0||($5(9412),pr(31,9412,U|0)|0,l=7680,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9412)|0)){s=9412,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));$5(9412)}return 9412}function tPe(s){return s=s|0,0}function rPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=ER()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Z5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(nPe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function Z5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function nPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=iPe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,sPe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],Z5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,oPe(s,k),aPe(k),C=M;return}}function iPe(s){return s=s|0,357913941}function sPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function oPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function aPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function $5(s){s=s|0,uPe(s)}function lPe(s){s=s|0,cPe(s+24|0)}function cPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function uPe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,6,l,e9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function e9(){return 1200}function APe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=fPe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=pPe(l,f)|0,C=c,l|0}function fPe(s){return s=s|0,(n[(ER()|0)+24>>2]|0)+(s*12|0)|0}function pPe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),RD(_0[c&31](s)|0)|0}function RD(s){return s=s|0,s|0}function hPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],gPe(s,c,d,0),C=f}function gPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=CR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=dPe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,mPe(m,f)|0,f),C=d}function CR(){var s=0,l=0;if(o[7688]|0||(r9(9448),pr(32,9448,U|0)|0,l=7688,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9448)|0)){s=9448,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));r9(9448)}return 9448}function dPe(s){return s=s|0,0}function mPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=CR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],t9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(yPe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function t9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function yPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=EPe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,CPe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],t9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,IPe(s,k),wPe(k),C=M;return}}function EPe(s){return s=s|0,357913941}function CPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function IPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function wPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function r9(s){s=s|0,DPe(s)}function BPe(s){s=s|0,vPe(s+24|0)}function vPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function DPe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,6,l,n9()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function n9(){return 1204}function SPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=PPe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xPe(l,d,c),C=f}function PPe(s){return s=s|0,(n[(CR()|0)+24>>2]|0)+(s*12|0)|0}function xPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),IR(d,c),d=wR(d,c)|0,tf[f&31](s,d),C=m}function IR(s,l){s=s|0,l=l|0}function wR(s,l){return s=s|0,l=l|0,bPe(l)|0}function bPe(s){return s=s|0,s|0}function kPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],QPe(s,c,d,0),C=f}function QPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=BR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=FPe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,RPe(m,f)|0,f),C=d}function BR(){var s=0,l=0;if(o[7696]|0||(s9(9484),pr(33,9484,U|0)|0,l=7696,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9484)|0)){s=9484,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));s9(9484)}return 9484}function FPe(s){return s=s|0,0}function RPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=BR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],i9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(TPe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function i9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function TPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=LPe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,NPe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],i9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,OPe(s,k),MPe(k),C=M;return}}function LPe(s){return s=s|0,357913941}function NPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function OPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function MPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function s9(s){s=s|0,HPe(s)}function UPe(s){s=s|0,_Pe(s+24|0)}function _Pe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function HPe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,1,l,qPe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function qPe(){return 1212}function jPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=GPe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],WPe(l,m,c,f),C=d}function GPe(s){return s=s|0,(n[(BR()|0)+24>>2]|0)+(s*12|0)|0}function WPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),IR(m,c),m=wR(m,c)|0,F0(B,f),B=R0(B,f)|0,sw[d&15](s,m,B),C=k}function YPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],VPe(s,c,d,1),C=f}function VPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=vR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=KPe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,JPe(m,f)|0,f),C=d}function vR(){var s=0,l=0;if(o[7704]|0||(a9(9520),pr(34,9520,U|0)|0,l=7704,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9520)|0)){s=9520,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));a9(9520)}return 9520}function KPe(s){return s=s|0,0}function JPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=vR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],o9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(zPe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function o9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function zPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=XPe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,ZPe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],o9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,$Pe(s,k),exe(k),C=M;return}}function XPe(s){return s=s|0,357913941}function ZPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function $Pe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function exe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function a9(s){s=s|0,nxe(s)}function txe(s){s=s|0,rxe(s+24|0)}function rxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function nxe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,1,l,ixe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function ixe(){return 1224}function sxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;return d=C,C=C+16|0,m=d+8|0,B=d,k=oxe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],f=+axe(l,m,c),C=d,+f}function oxe(s){return s=s|0,(n[(vR()|0)+24>>2]|0)+(s*12|0)|0}function axe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,B=+Ru(+iW[f&7](s,d)),C=m,+B}function lxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],cxe(s,c,d,1),C=f}function cxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=DR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=uxe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Axe(m,f)|0,f),C=d}function DR(){var s=0,l=0;if(o[7712]|0||(c9(9556),pr(35,9556,U|0)|0,l=7712,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9556)|0)){s=9556,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));c9(9556)}return 9556}function uxe(s){return s=s|0,0}function Axe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=DR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],l9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(fxe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function l9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function fxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=pxe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,hxe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],l9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,gxe(s,k),dxe(k),C=M;return}}function pxe(s){return s=s|0,357913941}function hxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function gxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function dxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function c9(s){s=s|0,Exe(s)}function mxe(s){s=s|0,yxe(s+24|0)}function yxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Exe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,5,l,Cxe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Cxe(){return 1232}function Ixe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=wxe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=+Bxe(l,d),C=f,+c}function wxe(s){return s=s|0,(n[(DR()|0)+24>>2]|0)+(s*12|0)|0}function Bxe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),+ +Ru(+nW[c&15](s))}function vxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Dxe(s,c,d,1),C=f}function Dxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=SR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Sxe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Pxe(m,f)|0,f),C=d}function SR(){var s=0,l=0;if(o[7720]|0||(A9(9592),pr(36,9592,U|0)|0,l=7720,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9592)|0)){s=9592,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));A9(9592)}return 9592}function Sxe(s){return s=s|0,0}function Pxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=SR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],u9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(xxe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function u9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function xxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=bxe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,kxe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],u9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,Qxe(s,k),Fxe(k),C=M;return}}function bxe(s){return s=s|0,357913941}function kxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Qxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Fxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function A9(s){s=s|0,Lxe(s)}function Rxe(s){s=s|0,Txe(s+24|0)}function Txe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Lxe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,7,l,Nxe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Nxe(){return 1276}function Oxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=Mxe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=Uxe(l,f)|0,C=c,l|0}function Mxe(s){return s=s|0,(n[(SR()|0)+24>>2]|0)+(s*12|0)|0}function Uxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+16|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),tf[c&31](f,s),f=f9(f)|0,C=d,f|0}function f9(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=cR(p9()|0)|0,f?(uR(l,f),AR(c,l),_xe(s,c),s=fR(l)|0):s=Hxe(s)|0,C=d,s|0}function p9(){var s=0;return o[7736]|0||(Xxe(9640),pr(25,9640,U|0)|0,s=7736,n[s>>2]=1,n[s+4>>2]=0),9640}function _xe(s,l){s=s|0,l=l|0,Wxe(l,s,s+8|0)|0}function Hxe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Za(8)|0,l=f,k=Yt(16)|0,n[k>>2]=n[s>>2],n[k+4>>2]=n[s+4>>2],n[k+8>>2]=n[s+8>>2],n[k+12>>2]=n[s+12>>2],m=l+4|0,n[m>>2]=k,s=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],PR(s,m,d),n[f>>2]=s,C=c,l|0}function PR(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Yt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1244,n[c+12>>2]=l,n[s+4>>2]=c}function qxe(s){s=s|0,im(s),yt(s)}function jxe(s){s=s|0,s=n[s+12>>2]|0,s|0&&yt(s)}function Gxe(s){s=s|0,yt(s)}function Wxe(s,l,c){return s=s|0,l=l|0,c=c|0,l=Yxe(n[s>>2]|0,l,c)|0,c=s+4|0,n[(n[c>>2]|0)+8>>2]=l,n[(n[c>>2]|0)+8>>2]|0}function Yxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return f=C,C=C+16|0,d=f,$a(d),s=ys(s)|0,c=Vxe(s,n[l>>2]|0,+E[c>>3])|0,el(d),C=f,c|0}function Vxe(s,l,c){s=s|0,l=l|0,c=+c;var f=0;return f=jo(Kxe()|0)|0,l=Xd(l)|0,pc(0,f|0,s|0,l|0,+ +ma(c))|0}function Kxe(){var s=0;return o[7728]|0||(Jxe(9628),s=7728,n[s>>2]=1,n[s+4>>2]=0),9628}function Jxe(s){s=s|0,ao(s,zxe()|0,2)}function zxe(){return 1264}function Xxe(s){s=s|0,Pp(s)}function Zxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],$xe(s,c,d,1),C=f}function $xe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=xR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=ebe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,tbe(m,f)|0,f),C=d}function xR(){var s=0,l=0;if(o[7744]|0||(g9(9684),pr(37,9684,U|0)|0,l=7744,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9684)|0)){s=9684,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));g9(9684)}return 9684}function ebe(s){return s=s|0,0}function tbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=xR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],h9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(rbe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function h9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function rbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=nbe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,ibe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],h9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,sbe(s,k),obe(k),C=M;return}}function nbe(s){return s=s|0,357913941}function ibe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function sbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function obe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function g9(s){s=s|0,cbe(s)}function abe(s){s=s|0,lbe(s+24|0)}function lbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function cbe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,5,l,ube()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function ube(){return 1280}function Abe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=fbe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=pbe(l,d,c)|0,C=f,c|0}function fbe(s){return s=s|0,(n[(xR()|0)+24>>2]|0)+(s*12|0)|0}function pbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return B=C,C=C+32|0,d=B,m=B+16|0,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(m,c),m=ZA(m,c)|0,sw[f&15](d,s,m),m=f9(d)|0,C=B,m|0}function hbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],gbe(s,c,d,1),C=f}function gbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=bR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=dbe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,mbe(m,f)|0,f),C=d}function bR(){var s=0,l=0;if(o[7752]|0||(m9(9720),pr(38,9720,U|0)|0,l=7752,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9720)|0)){s=9720,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));m9(9720)}return 9720}function dbe(s){return s=s|0,0}function mbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=bR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],d9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(ybe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function d9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function ybe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Ebe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,Cbe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],d9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,Ibe(s,k),wbe(k),C=M;return}}function Ebe(s){return s=s|0,357913941}function Cbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Ibe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function wbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function m9(s){s=s|0,Dbe(s)}function Bbe(s){s=s|0,vbe(s+24|0)}function vbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Dbe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,8,l,Sbe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Sbe(){return 1288}function Pbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=xbe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=bbe(l,f)|0,C=c,l|0}function xbe(s){return s=s|0,(n[(bR()|0)+24>>2]|0)+(s*12|0)|0}function bbe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),k0(_0[c&31](s)|0)|0}function kbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Qbe(s,c,d,0),C=f}function Qbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=kR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Fbe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Rbe(m,f)|0,f),C=d}function kR(){var s=0,l=0;if(o[7760]|0||(E9(9756),pr(39,9756,U|0)|0,l=7760,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9756)|0)){s=9756,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));E9(9756)}return 9756}function Fbe(s){return s=s|0,0}function Rbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=kR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],y9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Tbe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function y9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Tbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Lbe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,Nbe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],y9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,Obe(s,k),Mbe(k),C=M;return}}function Lbe(s){return s=s|0,357913941}function Nbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Obe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Mbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function E9(s){s=s|0,Hbe(s)}function Ube(s){s=s|0,_be(s+24|0)}function _be(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Hbe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,8,l,qbe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function qbe(){return 1292}function jbe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=Gbe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Wbe(l,d,c),C=f}function Gbe(s){return s=s|0,(n[(kR()|0)+24>>2]|0)+(s*12|0)|0}function Wbe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Tu(d,c),c=+Lu(d,c),eW[f&31](s,c),C=m}function Ybe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Vbe(s,c,d,0),C=f}function Vbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=QR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Kbe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Jbe(m,f)|0,f),C=d}function QR(){var s=0,l=0;if(o[7768]|0||(I9(9792),pr(40,9792,U|0)|0,l=7768,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9792)|0)){s=9792,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));I9(9792)}return 9792}function Kbe(s){return s=s|0,0}function Jbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=QR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],C9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(zbe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function C9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function zbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Xbe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,Zbe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],C9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,$be(s,k),eke(k),C=M;return}}function Xbe(s){return s=s|0,357913941}function Zbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function $be(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function eke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function I9(s){s=s|0,nke(s)}function tke(s){s=s|0,rke(s+24|0)}function rke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function nke(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,1,l,ike()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function ike(){return 1300}function ske(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=oke(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],ake(l,m,c,f),C=d}function oke(s){return s=s|0,(n[(QR()|0)+24>>2]|0)+(s*12|0)|0}function ake(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),XA(m,c),m=ZA(m,c)|0,Tu(B,f),f=+Lu(B,f),lW[d&15](s,m,f),C=k}function lke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],cke(s,c,d,0),C=f}function cke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=FR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=uke(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Ake(m,f)|0,f),C=d}function FR(){var s=0,l=0;if(o[7776]|0||(B9(9828),pr(41,9828,U|0)|0,l=7776,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9828)|0)){s=9828,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));B9(9828)}return 9828}function uke(s){return s=s|0,0}function Ake(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=FR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],w9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(fke(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function w9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function fke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=pke(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,hke(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],w9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,gke(s,k),dke(k),C=M;return}}function pke(s){return s=s|0,357913941}function hke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function gke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function dke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function B9(s){s=s|0,Eke(s)}function mke(s){s=s|0,yke(s+24|0)}function yke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Eke(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,7,l,Cke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Cke(){return 1312}function Ike(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=wke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Bke(l,d,c),C=f}function wke(s){return s=s|0,(n[(FR()|0)+24>>2]|0)+(s*12|0)|0}function Bke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,tf[f&31](s,d),C=m}function vke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Dke(s,c,d,0),C=f}function Dke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=RR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Ske(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Pke(m,f)|0,f),C=d}function RR(){var s=0,l=0;if(o[7784]|0||(D9(9864),pr(42,9864,U|0)|0,l=7784,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9864)|0)){s=9864,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));D9(9864)}return 9864}function Ske(s){return s=s|0,0}function Pke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=RR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],v9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(xke(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function v9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function xke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=bke(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,kke(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],v9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,Qke(s,k),Fke(k),C=M;return}}function bke(s){return s=s|0,357913941}function kke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Qke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Fke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function D9(s){s=s|0,Lke(s)}function Rke(s){s=s|0,Tke(s+24|0)}function Tke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Lke(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,8,l,Nke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Nke(){return 1320}function Oke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=Mke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Uke(l,d,c),C=f}function Mke(s){return s=s|0,(n[(RR()|0)+24>>2]|0)+(s*12|0)|0}function Uke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),_ke(d,c),d=Hke(d,c)|0,tf[f&31](s,d),C=m}function _ke(s,l){s=s|0,l=l|0}function Hke(s,l){return s=s|0,l=l|0,qke(l)|0}function qke(s){return s=s|0,s|0}function jke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Gke(s,c,d,0),C=f}function Gke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=TR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Wke(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Yke(m,f)|0,f),C=d}function TR(){var s=0,l=0;if(o[7792]|0||(P9(9900),pr(43,9900,U|0)|0,l=7792,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9900)|0)){s=9900,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));P9(9900)}return 9900}function Wke(s){return s=s|0,0}function Yke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=TR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],S9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Vke(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function S9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Vke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Kke(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,Jke(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],S9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,zke(s,k),Xke(k),C=M;return}}function Kke(s){return s=s|0,357913941}function Jke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function zke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Xke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function P9(s){s=s|0,eQe(s)}function Zke(s){s=s|0,$ke(s+24|0)}function $ke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function eQe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,22,l,tQe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function tQe(){return 1344}function rQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;c=C,C=C+16|0,f=c+8|0,d=c,m=nQe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],iQe(l,f),C=c}function nQe(s){return s=s|0,(n[(TR()|0)+24>>2]|0)+(s*12|0)|0}function iQe(s,l){s=s|0,l=l|0;var c=0;c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),ef[c&127](s)}function sQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=LR()|0,s=oQe(c)|0,yn(m,l,d,s,aQe(c,f)|0,f)}function LR(){var s=0,l=0;if(o[7800]|0||(b9(9936),pr(44,9936,U|0)|0,l=7800,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9936)|0)){s=9936,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));b9(9936)}return 9936}function oQe(s){return s=s|0,s|0}function aQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=LR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(x9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(lQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function x9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function lQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=cQe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,uQe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,x9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,AQe(s,d),fQe(d),C=k;return}}function cQe(s){return s=s|0,536870911}function uQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function AQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function fQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function b9(s){s=s|0,gQe(s)}function pQe(s){s=s|0,hQe(s+24|0)}function hQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function gQe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,23,l,n9()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function dQe(s,l){s=s|0,l=l|0,yQe(n[(mQe(s)|0)>>2]|0,l)}function mQe(s){return s=s|0,(n[(LR()|0)+24>>2]|0)+(s<<3)|0}function yQe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,IR(f,l),l=wR(f,l)|0,ef[s&127](l),C=c}function EQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=NR()|0,s=CQe(c)|0,yn(m,l,d,s,IQe(c,f)|0,f)}function NR(){var s=0,l=0;if(o[7808]|0||(Q9(9972),pr(45,9972,U|0)|0,l=7808,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9972)|0)){s=9972,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));Q9(9972)}return 9972}function CQe(s){return s=s|0,s|0}function IQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=NR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(k9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(wQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function k9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function wQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=BQe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,vQe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,k9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,DQe(s,d),SQe(d),C=k;return}}function BQe(s){return s=s|0,536870911}function vQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function DQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function SQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function Q9(s){s=s|0,bQe(s)}function PQe(s){s=s|0,xQe(s+24|0)}function xQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function bQe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,9,l,kQe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function kQe(){return 1348}function QQe(s,l){return s=s|0,l=l|0,RQe(n[(FQe(s)|0)>>2]|0,l)|0}function FQe(s){return s=s|0,(n[(NR()|0)+24>>2]|0)+(s<<3)|0}function RQe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,F9(f,l),l=R9(f,l)|0,l=FD(_0[s&31](l)|0)|0,C=c,l|0}function F9(s,l){s=s|0,l=l|0}function R9(s,l){return s=s|0,l=l|0,TQe(l)|0}function TQe(s){return s=s|0,s|0}function LQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=OR()|0,s=NQe(c)|0,yn(m,l,d,s,OQe(c,f)|0,f)}function OR(){var s=0,l=0;if(o[7816]|0||(L9(10008),pr(46,10008,U|0)|0,l=7816,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10008)|0)){s=10008,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));L9(10008)}return 10008}function NQe(s){return s=s|0,s|0}function OQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=OR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(T9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(MQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function T9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function MQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=UQe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,_Qe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,T9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,HQe(s,d),qQe(d),C=k;return}}function UQe(s){return s=s|0,536870911}function _Qe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function HQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function qQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function L9(s){s=s|0,WQe(s)}function jQe(s){s=s|0,GQe(s+24|0)}function GQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function WQe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,15,l,X5()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function YQe(s){return s=s|0,KQe(n[(VQe(s)|0)>>2]|0)|0}function VQe(s){return s=s|0,(n[(OR()|0)+24>>2]|0)+(s<<3)|0}function KQe(s){return s=s|0,FD(VD[s&7]()|0)|0}function JQe(){var s=0;return o[7832]|0||(nFe(10052),pr(25,10052,U|0)|0,s=7832,n[s>>2]=1,n[s+4>>2]=0),10052}function zQe(s,l){s=s|0,l=l|0,n[s>>2]=XQe()|0,n[s+4>>2]=ZQe()|0,n[s+12>>2]=l,n[s+8>>2]=$Qe()|0,n[s+32>>2]=2}function XQe(){return 11709}function ZQe(){return 1188}function $Qe(){return TD()|0}function eFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(tFe(c),yt(c)):l|0&&(Hd(l),yt(l))}function Qp(s,l){return s=s|0,l=l|0,l&s|0}function tFe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function TD(){var s=0;return o[7824]|0||(n[2511]=rFe()|0,n[2512]=0,s=7824,n[s>>2]=1,n[s+4>>2]=0),10044}function rFe(){return 0}function nFe(s){s=s|0,Pp(s)}function iFe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0;l=C,C=C+32|0,c=l+24|0,m=l+16|0,d=l+8|0,f=l,sFe(s,4827),oFe(s,4834,3)|0,aFe(s,3682,47)|0,n[m>>2]=9,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],lFe(s,4841,c)|0,n[d>>2]=1,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],cFe(s,4871,c)|0,n[f>>2]=10,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],uFe(s,4891,c)|0,C=l}function sFe(s,l){s=s|0,l=l|0;var c=0;c=qRe()|0,n[s>>2]=c,jRe(c,l),Fp(n[s>>2]|0)}function oFe(s,l,c){return s=s|0,l=l|0,c=c|0,SRe(s,mn(l)|0,c,0),s|0}function aFe(s,l,c){return s=s|0,l=l|0,c=c|0,ARe(s,mn(l)|0,c,0),s|0}function lFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],YFe(s,l,d),C=f,s|0}function cFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],PFe(s,l,d),C=f,s|0}function uFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],AFe(s,l,d),C=f,s|0}function AFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],fFe(s,c,d,1),C=f}function fFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=MR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=pFe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,hFe(m,f)|0,f),C=d}function MR(){var s=0,l=0;if(o[7840]|0||(O9(10100),pr(48,10100,U|0)|0,l=7840,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10100)|0)){s=10100,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));O9(10100)}return 10100}function pFe(s){return s=s|0,0}function hFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=MR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],N9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(gFe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function N9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function gFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=dFe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,mFe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],N9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,yFe(s,k),EFe(k),C=M;return}}function dFe(s){return s=s|0,357913941}function mFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function yFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function EFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function O9(s){s=s|0,wFe(s)}function CFe(s){s=s|0,IFe(s+24|0)}function IFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function wFe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,6,l,BFe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function BFe(){return 1364}function vFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=DFe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=SFe(l,d,c)|0,C=f,c|0}function DFe(s){return s=s|0,(n[(MR()|0)+24>>2]|0)+(s*12|0)|0}function SFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,d=G5(pT[f&15](s,d)|0)|0,C=m,d|0}function PFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xFe(s,c,d,0),C=f}function xFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=UR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=bFe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,kFe(m,f)|0,f),C=d}function UR(){var s=0,l=0;if(o[7848]|0||(U9(10136),pr(49,10136,U|0)|0,l=7848,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10136)|0)){s=10136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));U9(10136)}return 10136}function bFe(s){return s=s|0,0}function kFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=UR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],M9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(QFe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function M9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function QFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=FFe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,RFe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],M9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,TFe(s,k),LFe(k),C=M;return}}function FFe(s){return s=s|0,357913941}function RFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function TFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function LFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function U9(s){s=s|0,MFe(s)}function NFe(s){s=s|0,OFe(s+24|0)}function OFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function MFe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,9,l,UFe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function UFe(){return 1372}function _Fe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=HFe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],qFe(l,d,c),C=f}function HFe(s){return s=s|0,(n[(UR()|0)+24>>2]|0)+(s*12|0)|0}function qFe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=Ze;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),jFe(d,c),B=y(GFe(d,c)),$7[f&1](s,B),C=m}function jFe(s,l){s=s|0,l=+l}function GFe(s,l){return s=s|0,l=+l,y(WFe(l))}function WFe(s){return s=+s,y(s)}function YFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],VFe(s,c,d,0),C=f}function VFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=_R()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=KFe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,JFe(m,f)|0,f),C=d}function _R(){var s=0,l=0;if(o[7856]|0||(H9(10172),pr(50,10172,U|0)|0,l=7856,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10172)|0)){s=10172,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));H9(10172)}return 10172}function KFe(s){return s=s|0,0}function JFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=_R()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],_9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(zFe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function _9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function zFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=XFe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,ZFe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],_9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,$Fe(s,k),eRe(k),C=M;return}}function XFe(s){return s=s|0,357913941}function ZFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function $Fe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function eRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function H9(s){s=s|0,nRe(s)}function tRe(s){s=s|0,rRe(s+24|0)}function rRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function nRe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,3,l,iRe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function iRe(){return 1380}function sRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=oRe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],aRe(l,m,c,f),C=d}function oRe(s){return s=s|0,(n[(_R()|0)+24>>2]|0)+(s*12|0)|0}function aRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),XA(m,c),m=ZA(m,c)|0,lRe(B,f),B=cRe(B,f)|0,sw[d&15](s,m,B),C=k}function lRe(s,l){s=s|0,l=l|0}function cRe(s,l){return s=s|0,l=l|0,uRe(l)|0}function uRe(s){return s=s|0,(s|0)!=0|0}function ARe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=HR()|0,s=fRe(c)|0,yn(m,l,d,s,pRe(c,f)|0,f)}function HR(){var s=0,l=0;if(o[7864]|0||(j9(10208),pr(51,10208,U|0)|0,l=7864,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10208)|0)){s=10208,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));j9(10208)}return 10208}function fRe(s){return s=s|0,s|0}function pRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=HR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(q9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(hRe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function q9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function hRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=gRe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,dRe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,q9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,mRe(s,d),yRe(d),C=k;return}}function gRe(s){return s=s|0,536870911}function dRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function mRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function yRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function j9(s){s=s|0,IRe(s)}function ERe(s){s=s|0,CRe(s+24|0)}function CRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function IRe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,24,l,wRe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function wRe(){return 1392}function BRe(s,l){s=s|0,l=l|0,DRe(n[(vRe(s)|0)>>2]|0,l)}function vRe(s){return s=s|0,(n[(HR()|0)+24>>2]|0)+(s<<3)|0}function DRe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,F9(f,l),l=R9(f,l)|0,ef[s&127](l),C=c}function SRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=qR()|0,s=PRe(c)|0,yn(m,l,d,s,xRe(c,f)|0,f)}function qR(){var s=0,l=0;if(o[7872]|0||(W9(10244),pr(52,10244,U|0)|0,l=7872,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10244)|0)){s=10244,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));W9(10244)}return 10244}function PRe(s){return s=s|0,s|0}function xRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=qR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(G9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(bRe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function G9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function bRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=kRe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,QRe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,G9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,FRe(s,d),RRe(d),C=k;return}}function kRe(s){return s=s|0,536870911}function QRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function FRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function RRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function W9(s){s=s|0,NRe(s)}function TRe(s){s=s|0,LRe(s+24|0)}function LRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function NRe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,16,l,ORe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function ORe(){return 1400}function MRe(s){return s=s|0,_Re(n[(URe(s)|0)>>2]|0)|0}function URe(s){return s=s|0,(n[(qR()|0)+24>>2]|0)+(s<<3)|0}function _Re(s){return s=s|0,HRe(VD[s&7]()|0)|0}function HRe(s){return s=s|0,s|0}function qRe(){var s=0;return o[7880]|0||(JRe(10280),pr(25,10280,U|0)|0,s=7880,n[s>>2]=1,n[s+4>>2]=0),10280}function jRe(s,l){s=s|0,l=l|0,n[s>>2]=GRe()|0,n[s+4>>2]=WRe()|0,n[s+12>>2]=l,n[s+8>>2]=YRe()|0,n[s+32>>2]=4}function GRe(){return 11711}function WRe(){return 1356}function YRe(){return TD()|0}function VRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(KRe(c),yt(c)):l|0&&(C0(l),yt(l))}function KRe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function JRe(s){s=s|0,Pp(s)}function zRe(s){s=s|0,XRe(s,4920),ZRe(s)|0,$Re(s)|0}function XRe(s,l){s=s|0,l=l|0;var c=0;c=p9()|0,n[s>>2]=c,CTe(c,l),Fp(n[s>>2]|0)}function ZRe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,uTe()|0),s|0}function $Re(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,eTe()|0),s|0}function eTe(){var s=0;return o[7888]|0||(Y9(10328),pr(53,10328,U|0)|0,s=7888,n[s>>2]=1,n[s+4>>2]=0),Nr(10328)|0||Y9(10328),10328}function T0(s,l){s=s|0,l=l|0,yn(s,0,l,0,0,0)}function Y9(s){s=s|0,nTe(s),L0(s,10)}function tTe(s){s=s|0,rTe(s+24|0)}function rTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function nTe(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,1,l,aTe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function iTe(s,l,c){s=s|0,l=l|0,c=+c,sTe(s,l,c)}function L0(s,l){s=s|0,l=l|0,n[s+20>>2]=l}function sTe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,m=f+8|0,k=f+13|0,d=f,B=f+12|0,XA(k,l),n[m>>2]=ZA(k,l)|0,Tu(B,c),E[d>>3]=+Lu(B,c),oTe(s,m,d),C=f}function oTe(s,l,c){s=s|0,l=l|0,c=c|0,Xa(s+8|0,n[l>>2]|0,+E[c>>3]),o[s+24>>0]=1}function aTe(){return 1404}function lTe(s,l){return s=s|0,l=+l,cTe(s,l)|0}function cTe(s,l){s=s|0,l=+l;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return f=C,C=C+16|0,m=f+4|0,B=f+8|0,k=f,d=Za(8)|0,c=d,F=Yt(16)|0,XA(m,s),s=ZA(m,s)|0,Tu(B,l),Xa(F,s,+Lu(B,l)),B=c+4|0,n[B>>2]=F,s=Yt(8)|0,B=n[B>>2]|0,n[k>>2]=0,n[m>>2]=n[k>>2],PR(s,B,m),n[d>>2]=s,C=f,c|0}function uTe(){var s=0;return o[7896]|0||(V9(10364),pr(54,10364,U|0)|0,s=7896,n[s>>2]=1,n[s+4>>2]=0),Nr(10364)|0||V9(10364),10364}function V9(s){s=s|0,pTe(s),L0(s,55)}function ATe(s){s=s|0,fTe(s+24|0)}function fTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function pTe(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,4,l,mTe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function hTe(s){s=s|0,gTe(s)}function gTe(s){s=s|0,dTe(s)}function dTe(s){s=s|0,K9(s+8|0),o[s+24>>0]=1}function K9(s){s=s|0,n[s>>2]=0,E[s+8>>3]=0}function mTe(){return 1424}function yTe(){return ETe()|0}function ETe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Za(8)|0,s=c,f=Yt(16)|0,K9(f),m=s+4|0,n[m>>2]=f,f=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],PR(f,m,d),n[c>>2]=f,C=l,s|0}function CTe(s,l){s=s|0,l=l|0,n[s>>2]=ITe()|0,n[s+4>>2]=wTe()|0,n[s+12>>2]=l,n[s+8>>2]=BTe()|0,n[s+32>>2]=5}function ITe(){return 11710}function wTe(){return 1416}function BTe(){return LD()|0}function vTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(DTe(c),yt(c)):l|0&&yt(l)}function DTe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function LD(){var s=0;return o[7904]|0||(n[2600]=STe()|0,n[2601]=0,s=7904,n[s>>2]=1,n[s+4>>2]=0),10400}function STe(){return n[357]|0}function PTe(s){s=s|0,xTe(s,4926),bTe(s)|0}function xTe(s,l){s=s|0,l=l|0;var c=0;c=N5()|0,n[s>>2]=c,_Te(c,l),Fp(n[s>>2]|0)}function bTe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,kTe()|0),s|0}function kTe(){var s=0;return o[7912]|0||(J9(10412),pr(56,10412,U|0)|0,s=7912,n[s>>2]=1,n[s+4>>2]=0),Nr(10412)|0||J9(10412),10412}function J9(s){s=s|0,RTe(s),L0(s,57)}function QTe(s){s=s|0,FTe(s+24|0)}function FTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function RTe(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,5,l,OTe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function TTe(s){s=s|0,LTe(s)}function LTe(s){s=s|0,NTe(s)}function NTe(s){s=s|0;var l=0,c=0;l=s+8|0,c=l+48|0;do n[l>>2]=0,l=l+4|0;while((l|0)<(c|0));o[s+56>>0]=1}function OTe(){return 1432}function MTe(){return UTe()|0}function UTe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,k=0;B=C,C=C+16|0,s=B+4|0,l=B,c=Za(8)|0,f=c,d=Yt(48)|0,m=d,k=m+48|0;do n[m>>2]=0,m=m+4|0;while((m|0)<(k|0));return m=f+4|0,n[m>>2]=d,k=Yt(8)|0,m=n[m>>2]|0,n[l>>2]=0,n[s>>2]=n[l>>2],O5(k,m,s),n[c>>2]=k,C=B,f|0}function _Te(s,l){s=s|0,l=l|0,n[s>>2]=HTe()|0,n[s+4>>2]=qTe()|0,n[s+12>>2]=l,n[s+8>>2]=jTe()|0,n[s+32>>2]=6}function HTe(){return 11704}function qTe(){return 1436}function jTe(){return LD()|0}function GTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(WTe(c),yt(c)):l|0&&yt(l)}function WTe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function YTe(s){s=s|0,VTe(s,4933),KTe(s)|0,JTe(s)|0}function VTe(s,l){s=s|0,l=l|0;var c=0;c=ELe()|0,n[s>>2]=c,CLe(c,l),Fp(n[s>>2]|0)}function KTe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,cLe()|0),s|0}function JTe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,zTe()|0),s|0}function zTe(){var s=0;return o[7920]|0||(z9(10452),pr(58,10452,U|0)|0,s=7920,n[s>>2]=1,n[s+4>>2]=0),Nr(10452)|0||z9(10452),10452}function z9(s){s=s|0,$Te(s),L0(s,1)}function XTe(s){s=s|0,ZTe(s+24|0)}function ZTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function $Te(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,1,l,nLe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function eLe(s,l,c){s=s|0,l=+l,c=+c,tLe(s,l,c)}function tLe(s,l,c){s=s|0,l=+l,c=+c;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,m=f+8|0,k=f+17|0,d=f,B=f+16|0,Tu(k,l),E[m>>3]=+Lu(k,l),Tu(B,c),E[d>>3]=+Lu(B,c),rLe(s,m,d),C=f}function rLe(s,l,c){s=s|0,l=l|0,c=c|0,X9(s+8|0,+E[l>>3],+E[c>>3]),o[s+24>>0]=1}function X9(s,l,c){s=s|0,l=+l,c=+c,E[s>>3]=l,E[s+8>>3]=c}function nLe(){return 1472}function iLe(s,l){return s=+s,l=+l,sLe(s,l)|0}function sLe(s,l){s=+s,l=+l;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return f=C,C=C+16|0,B=f+4|0,k=f+8|0,F=f,d=Za(8)|0,c=d,m=Yt(16)|0,Tu(B,s),s=+Lu(B,s),Tu(k,l),X9(m,s,+Lu(k,l)),k=c+4|0,n[k>>2]=m,m=Yt(8)|0,k=n[k>>2]|0,n[F>>2]=0,n[B>>2]=n[F>>2],Z9(m,k,B),n[d>>2]=m,C=f,c|0}function Z9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Yt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1452,n[c+12>>2]=l,n[s+4>>2]=c}function oLe(s){s=s|0,im(s),yt(s)}function aLe(s){s=s|0,s=n[s+12>>2]|0,s|0&&yt(s)}function lLe(s){s=s|0,yt(s)}function cLe(){var s=0;return o[7928]|0||($9(10488),pr(59,10488,U|0)|0,s=7928,n[s>>2]=1,n[s+4>>2]=0),Nr(10488)|0||$9(10488),10488}function $9(s){s=s|0,fLe(s),L0(s,60)}function uLe(s){s=s|0,ALe(s+24|0)}function ALe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function fLe(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,6,l,dLe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function pLe(s){s=s|0,hLe(s)}function hLe(s){s=s|0,gLe(s)}function gLe(s){s=s|0,e7(s+8|0),o[s+24>>0]=1}function e7(s){s=s|0,n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,n[s+12>>2]=0}function dLe(){return 1492}function mLe(){return yLe()|0}function yLe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Za(8)|0,s=c,f=Yt(16)|0,e7(f),m=s+4|0,n[m>>2]=f,f=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],Z9(f,m,d),n[c>>2]=f,C=l,s|0}function ELe(){var s=0;return o[7936]|0||(SLe(10524),pr(25,10524,U|0)|0,s=7936,n[s>>2]=1,n[s+4>>2]=0),10524}function CLe(s,l){s=s|0,l=l|0,n[s>>2]=ILe()|0,n[s+4>>2]=wLe()|0,n[s+12>>2]=l,n[s+8>>2]=BLe()|0,n[s+32>>2]=7}function ILe(){return 11700}function wLe(){return 1484}function BLe(){return LD()|0}function vLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(DLe(c),yt(c)):l|0&&yt(l)}function DLe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function SLe(s){s=s|0,Pp(s)}function PLe(s,l,c){s=s|0,l=l|0,c=c|0,s=mn(l)|0,l=xLe(c)|0,c=bLe(c,0)|0,sNe(s,l,c,jR()|0,0)}function xLe(s){return s=s|0,s|0}function bLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=jR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(r7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(NLe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function jR(){var s=0,l=0;if(o[7944]|0||(t7(10568),pr(61,10568,U|0)|0,l=7944,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10568)|0)){s=10568,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));t7(10568)}return 10568}function t7(s){s=s|0,FLe(s)}function kLe(s){s=s|0,QLe(s+24|0)}function QLe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function FLe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,17,l,e9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function RLe(s){return s=s|0,LLe(n[(TLe(s)|0)>>2]|0)|0}function TLe(s){return s=s|0,(n[(jR()|0)+24>>2]|0)+(s<<3)|0}function LLe(s){return s=s|0,RD(VD[s&7]()|0)|0}function r7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function NLe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=OLe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,MLe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,r7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,ULe(s,d),_Le(d),C=k;return}}function OLe(s){return s=s|0,536870911}function MLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function ULe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function _Le(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function HLe(){qLe()}function qLe(){jLe(10604)}function jLe(s){s=s|0,GLe(s,4955)}function GLe(s,l){s=s|0,l=l|0;var c=0;c=WLe()|0,n[s>>2]=c,YLe(c,l),Fp(n[s>>2]|0)}function WLe(){var s=0;return o[7952]|0||(tNe(10612),pr(25,10612,U|0)|0,s=7952,n[s>>2]=1,n[s+4>>2]=0),10612}function YLe(s,l){s=s|0,l=l|0,n[s>>2]=zLe()|0,n[s+4>>2]=XLe()|0,n[s+12>>2]=l,n[s+8>>2]=ZLe()|0,n[s+32>>2]=8}function Fp(s){s=s|0;var l=0,c=0;l=C,C=C+16|0,c=l,$d()|0,n[c>>2]=s,VLe(10608,c),C=l}function $d(){return o[11714]|0||(n[2652]=0,pr(62,10608,U|0)|0,o[11714]=1),10608}function VLe(s,l){s=s|0,l=l|0;var c=0;c=Yt(8)|0,n[c+4>>2]=n[l>>2],n[c>>2]=n[s>>2],n[s>>2]=c}function KLe(s){s=s|0,JLe(s)}function JLe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,yt(c);while(l|0);n[s>>2]=0}function zLe(){return 11715}function XLe(){return 1496}function ZLe(){return TD()|0}function $Le(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(eNe(c),yt(c)):l|0&&yt(l)}function eNe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function tNe(s){s=s|0,Pp(s)}function rNe(s,l){s=s|0,l=l|0;var c=0,f=0;$d()|0,c=n[2652]|0;e:do if(c|0){for(;f=n[c+4>>2]|0,!(f|0&&!(O7(GR(f)|0,s)|0));)if(c=n[c>>2]|0,!c)break e;nNe(f,l)}while(!1)}function GR(s){return s=s|0,n[s+12>>2]|0}function nNe(s,l){s=s|0,l=l|0;var c=0;s=s+36|0,c=n[s>>2]|0,c|0&&(xu(c),yt(c)),c=Yt(4)|0,SD(c,l),n[s>>2]=c}function WR(){return o[11716]|0||(n[2664]=0,pr(63,10656,U|0)|0,o[11716]=1),10656}function n7(){var s=0;return o[11717]|0?s=n[2665]|0:(iNe(),n[2665]=1504,o[11717]=1,s=1504),s|0}function iNe(){o[11740]|0||(o[11718]=dr(dr(8,0)|0,0)|0,o[11719]=dr(dr(0,0)|0,0)|0,o[11720]=dr(dr(0,16)|0,0)|0,o[11721]=dr(dr(8,0)|0,0)|0,o[11722]=dr(dr(0,0)|0,0)|0,o[11723]=dr(dr(8,0)|0,0)|0,o[11724]=dr(dr(0,0)|0,0)|0,o[11725]=dr(dr(8,0)|0,0)|0,o[11726]=dr(dr(0,0)|0,0)|0,o[11727]=dr(dr(8,0)|0,0)|0,o[11728]=dr(dr(0,0)|0,0)|0,o[11729]=dr(dr(0,0)|0,32)|0,o[11730]=dr(dr(0,0)|0,32)|0,o[11740]=1)}function i7(){return 1572}function sNe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0,O=0;m=C,C=C+32|0,O=m+16|0,M=m+12|0,F=m+8|0,k=m+4|0,B=m,n[O>>2]=s,n[M>>2]=l,n[F>>2]=c,n[k>>2]=f,n[B>>2]=d,WR()|0,oNe(10656,O,M,F,k,B),C=m}function oNe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0;B=Yt(24)|0,R5(B+4|0,n[l>>2]|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0),n[B>>2]=n[s>>2],n[s>>2]=B}function s7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0,ct=0;if(ct=C,C=C+32|0,Oe=ct+20|0,Qe=ct+8|0,rt=ct+4|0,Xe=ct,l=n[l>>2]|0,l|0){We=Oe+4|0,F=Oe+8|0,M=Qe+4|0,O=Qe+8|0,j=Qe+8|0,oe=Oe+8|0;do{if(B=l+4|0,k=YR(B)|0,k|0){if(d=$I(k)|0,n[Oe>>2]=0,n[We>>2]=0,n[F>>2]=0,f=(ew(k)|0)+1|0,aNe(Oe,f),f|0)for(;f=f+-1|0,Tc(Qe,n[d>>2]|0),m=n[We>>2]|0,m>>>0<(n[oe>>2]|0)>>>0?(n[m>>2]=n[Qe>>2],n[We>>2]=(n[We>>2]|0)+4):VR(Oe,Qe),f;)d=d+4|0;f=tw(k)|0,n[Qe>>2]=0,n[M>>2]=0,n[O>>2]=0;e:do if(n[f>>2]|0)for(d=0,m=0;;){if((d|0)==(m|0)?lNe(Qe,f):(n[d>>2]=n[f>>2],n[M>>2]=(n[M>>2]|0)+4),f=f+4|0,!(n[f>>2]|0))break e;d=n[M>>2]|0,m=n[j>>2]|0}while(!1);n[rt>>2]=ND(B)|0,n[Xe>>2]=Nr(k)|0,cNe(c,s,rt,Xe,Oe,Qe),KR(Qe),$A(Oe)}l=n[l>>2]|0}while(l|0)}C=ct}function YR(s){return s=s|0,n[s+12>>2]|0}function $I(s){return s=s|0,n[s+12>>2]|0}function ew(s){return s=s|0,n[s+16>>2]|0}function aNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=n[s>>2]|0,(n[s+8>>2]|0)-f>>2>>>0>>0&&(p7(c,l,(n[s+4>>2]|0)-f>>2,s+8|0),h7(s,c),g7(c)),C=d}function VR(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=f7(s)|0,m>>>0>>0)Zr(s);else{k=n[s>>2]|0,M=(n[s+8>>2]|0)-k|0,F=M>>1,p7(c,M>>2>>>0>>1>>>0?F>>>0>>0?d:F:m,(n[f>>2]|0)-k>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,h7(s,c),g7(c),C=B;return}}function tw(s){return s=s|0,n[s+8>>2]|0}function lNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=A7(s)|0,m>>>0>>0)Zr(s);else{k=n[s>>2]|0,M=(n[s+8>>2]|0)-k|0,F=M>>1,xNe(c,M>>2>>>0>>1>>>0?F>>>0>>0?d:F:m,(n[f>>2]|0)-k>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,bNe(s,c),kNe(c),C=B;return}}function ND(s){return s=s|0,n[s>>2]|0}function cNe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,uNe(s,l,c,f,d,m)}function KR(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),yt(c))}function $A(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),yt(c))}function uNe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,F=0,M=0,O=0,j=0;B=C,C=C+48|0,O=B+40|0,k=B+32|0,j=B+24|0,F=B+12|0,M=B,$a(k),s=ys(s)|0,n[j>>2]=n[l>>2],c=n[c>>2]|0,f=n[f>>2]|0,JR(F,d),ANe(M,m),n[O>>2]=n[j>>2],fNe(s,O,c,f,F,M),KR(M),$A(F),el(k),C=B}function JR(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(SNe(s,f),PNe(s,n[l>>2]|0,n[c>>2]|0,f))}function ANe(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(vNe(s,f),DNe(s,n[l>>2]|0,n[c>>2]|0,f))}function fNe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,F=0,M=0,O=0,j=0;B=C,C=C+32|0,O=B+28|0,j=B+24|0,k=B+12|0,F=B,M=jo(pNe()|0)|0,n[j>>2]=n[l>>2],n[O>>2]=n[j>>2],l=N0(O)|0,c=o7(c)|0,f=zR(f)|0,n[k>>2]=n[d>>2],O=d+4|0,n[k+4>>2]=n[O>>2],j=d+8|0,n[k+8>>2]=n[j>>2],n[j>>2]=0,n[O>>2]=0,n[d>>2]=0,d=XR(k)|0,n[F>>2]=n[m>>2],O=m+4|0,n[F+4>>2]=n[O>>2],j=m+8|0,n[F+8>>2]=n[j>>2],n[j>>2]=0,n[O>>2]=0,n[m>>2]=0,gc(0,M|0,s|0,l|0,c|0,f|0,d|0,hNe(F)|0)|0,KR(F),$A(k),C=B}function pNe(){var s=0;return o[7968]|0||(wNe(10708),s=7968,n[s>>2]=1,n[s+4>>2]=0),10708}function N0(s){return s=s|0,l7(s)|0}function o7(s){return s=s|0,a7(s)|0}function zR(s){return s=s|0,RD(s)|0}function XR(s){return s=s|0,dNe(s)|0}function hNe(s){return s=s|0,gNe(s)|0}function gNe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Za(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=a7(n[(n[s>>2]|0)+(l<<2)>>2]|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function a7(s){return s=s|0,s|0}function dNe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Za(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=l7((n[s>>2]|0)+(l<<2)|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function l7(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=cR(c7()|0)|0,f?(uR(l,f),AR(c,l),Z4e(s,c),s=fR(l)|0):s=mNe(s)|0,C=d,s|0}function c7(){var s=0;return o[7960]|0||(INe(10664),pr(25,10664,U|0)|0,s=7960,n[s>>2]=1,n[s+4>>2]=0),10664}function mNe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Za(8)|0,l=f,k=Yt(4)|0,n[k>>2]=n[s>>2],m=l+4|0,n[m>>2]=k,s=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],u7(s,m,d),n[f>>2]=s,C=c,l|0}function u7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Yt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1656,n[c+12>>2]=l,n[s+4>>2]=c}function yNe(s){s=s|0,im(s),yt(s)}function ENe(s){s=s|0,s=n[s+12>>2]|0,s|0&&yt(s)}function CNe(s){s=s|0,yt(s)}function INe(s){s=s|0,Pp(s)}function wNe(s){s=s|0,ao(s,BNe()|0,5)}function BNe(){return 1676}function vNe(s,l){s=s|0,l=l|0;var c=0;if((A7(s)|0)>>>0>>0&&Zr(s),l>>>0>1073741823)Tt();else{c=Yt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function DNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(br(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function A7(s){return s=s|0,1073741823}function SNe(s,l){s=s|0,l=l|0;var c=0;if((f7(s)|0)>>>0>>0&&Zr(s),l>>>0>1073741823)Tt();else{c=Yt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function PNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(br(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function f7(s){return s=s|0,1073741823}function xNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Yt(l<<2)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function bNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function kNe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&yt(s)}function p7(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Yt(l<<2)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function h7(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function g7(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&yt(s)}function QNe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0;if(Qe=C,C=C+32|0,O=Qe+20|0,j=Qe+12|0,M=Qe+16|0,oe=Qe+4|0,We=Qe,Oe=Qe+8|0,k=n7()|0,m=n[k>>2]|0,B=n[m>>2]|0,B|0)for(F=n[k+8>>2]|0,k=n[k+4>>2]|0;Tc(O,B),FNe(s,O,k,F),m=m+4|0,B=n[m>>2]|0,B;)F=F+1|0,k=k+1|0;if(m=i7()|0,B=n[m>>2]|0,B|0)do Tc(O,B),n[j>>2]=n[m+4>>2],RNe(l,O,j),m=m+8|0,B=n[m>>2]|0;while(B|0);if(m=n[($d()|0)>>2]|0,m|0)do l=n[m+4>>2]|0,Tc(O,n[(em(l)|0)>>2]|0),n[j>>2]=GR(l)|0,TNe(c,O,j),m=n[m>>2]|0;while(m|0);if(Tc(M,0),m=WR()|0,n[O>>2]=n[M>>2],s7(O,m,d),m=n[($d()|0)>>2]|0,m|0){s=O+4|0,l=O+8|0,c=O+8|0;do{if(F=n[m+4>>2]|0,Tc(j,n[(em(F)|0)>>2]|0),LNe(oe,d7(F)|0),B=n[oe>>2]|0,B|0){n[O>>2]=0,n[s>>2]=0,n[l>>2]=0;do Tc(We,n[(em(n[B+4>>2]|0)|0)>>2]|0),k=n[s>>2]|0,k>>>0<(n[c>>2]|0)>>>0?(n[k>>2]=n[We>>2],n[s>>2]=(n[s>>2]|0)+4):VR(O,We),B=n[B>>2]|0;while(B|0);NNe(f,j,O),$A(O)}n[Oe>>2]=n[j>>2],M=m7(F)|0,n[O>>2]=n[Oe>>2],s7(O,M,d),U5(oe),m=n[m>>2]|0}while(m|0)}C=Qe}function FNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,KNe(s,l,c,f)}function RNe(s,l,c){s=s|0,l=l|0,c=c|0,VNe(s,l,c)}function em(s){return s=s|0,s|0}function TNe(s,l,c){s=s|0,l=l|0,c=c|0,jNe(s,l,c)}function d7(s){return s=s|0,s+16|0}function LNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;if(m=C,C=C+16|0,d=m+8|0,c=m,n[s>>2]=0,f=n[l>>2]|0,n[d>>2]=f,n[c>>2]=s,c=qNe(c)|0,f|0){if(f=Yt(12)|0,B=(y7(d)|0)+4|0,s=n[B+4>>2]|0,l=f+4|0,n[l>>2]=n[B>>2],n[l+4>>2]=s,l=n[n[d>>2]>>2]|0,n[d>>2]=l,!l)s=f;else for(l=f;s=Yt(12)|0,F=(y7(d)|0)+4|0,k=n[F+4>>2]|0,B=s+4|0,n[B>>2]=n[F>>2],n[B+4>>2]=k,n[l>>2]=s,B=n[n[d>>2]>>2]|0,n[d>>2]=B,B;)l=s;n[s>>2]=n[c>>2],n[c>>2]=f}C=m}function NNe(s,l,c){s=s|0,l=l|0,c=c|0,ONe(s,l,c)}function m7(s){return s=s|0,s+24|0}function ONe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,B=f+24|0,d=f+16|0,k=f+12|0,m=f,$a(d),s=ys(s)|0,n[k>>2]=n[l>>2],JR(m,c),n[B>>2]=n[k>>2],MNe(s,B,m),$A(m),el(d),C=f}function MNe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,B=f+16|0,k=f+12|0,d=f,m=jo(UNe()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=N0(B)|0,n[d>>2]=n[c>>2],B=c+4|0,n[d+4>>2]=n[B>>2],k=c+8|0,n[d+8>>2]=n[k>>2],n[k>>2]=0,n[B>>2]=0,n[c>>2]=0,hs(0,m|0,s|0,l|0,XR(d)|0)|0,$A(d),C=f}function UNe(){var s=0;return o[7976]|0||(_Ne(10720),s=7976,n[s>>2]=1,n[s+4>>2]=0),10720}function _Ne(s){s=s|0,ao(s,HNe()|0,2)}function HNe(){return 1732}function qNe(s){return s=s|0,n[s>>2]|0}function y7(s){return s=s|0,n[s>>2]|0}function jNe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,$a(d),s=ys(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],E7(s,m,c),el(d),C=f}function E7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+4|0,B=f,d=jo(GNe()|0)|0,n[B>>2]=n[l>>2],n[m>>2]=n[B>>2],l=N0(m)|0,hs(0,d|0,s|0,l|0,o7(c)|0)|0,C=f}function GNe(){var s=0;return o[7984]|0||(WNe(10732),s=7984,n[s>>2]=1,n[s+4>>2]=0),10732}function WNe(s){s=s|0,ao(s,YNe()|0,2)}function YNe(){return 1744}function VNe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,$a(d),s=ys(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],E7(s,m,c),el(d),C=f}function KNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,k=d,$a(m),s=ys(s)|0,n[k>>2]=n[l>>2],c=o[c>>0]|0,f=o[f>>0]|0,n[B>>2]=n[k>>2],JNe(s,B,c,f),el(m),C=d}function JNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,B=d+4|0,k=d,m=jo(zNe()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=N0(B)|0,c=tm(c)|0,vi(0,m|0,s|0,l|0,c|0,tm(f)|0)|0,C=d}function zNe(){var s=0;return o[7992]|0||(ZNe(10744),s=7992,n[s>>2]=1,n[s+4>>2]=0),10744}function tm(s){return s=s|0,XNe(s)|0}function XNe(s){return s=s|0,s&255|0}function ZNe(s){s=s|0,ao(s,$Ne()|0,3)}function $Ne(){return 1756}function eOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;switch(oe=C,C=C+32|0,k=oe+8|0,F=oe+4|0,M=oe+20|0,O=oe,dR(s,0),f=X4e(l)|0,n[k>>2]=0,j=k+4|0,n[j>>2]=0,n[k+8>>2]=0,f<<24>>24){case 0:{o[M>>0]=0,tOe(F,c,M),OD(s,F)|0,bu(F);break}case 8:{j=nT(l)|0,o[M>>0]=8,Tc(O,n[j+4>>2]|0),rOe(F,c,M,O,j+8|0),OD(s,F)|0,bu(F);break}case 9:{if(m=nT(l)|0,l=n[m+4>>2]|0,l|0)for(B=k+8|0,d=m+12|0;l=l+-1|0,Tc(F,n[d>>2]|0),f=n[j>>2]|0,f>>>0<(n[B>>2]|0)>>>0?(n[f>>2]=n[F>>2],n[j>>2]=(n[j>>2]|0)+4):VR(k,F),l;)d=d+4|0;o[M>>0]=9,Tc(O,n[m+8>>2]|0),nOe(F,c,M,O,k),OD(s,F)|0,bu(F);break}default:j=nT(l)|0,o[M>>0]=f,Tc(O,n[j+4>>2]|0),iOe(F,c,M,O),OD(s,F)|0,bu(F)}$A(k),C=oe}function tOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,$a(d),l=ys(l)|0,mOe(s,l,o[c>>0]|0),el(d),C=f}function OD(s,l){s=s|0,l=l|0;var c=0;return c=n[s>>2]|0,c|0&&sa(c|0),n[s>>2]=n[l>>2],n[l>>2]=0,s|0}function rOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0;m=C,C=C+32|0,k=m+16|0,B=m+8|0,F=m,$a(B),l=ys(l)|0,c=o[c>>0]|0,n[F>>2]=n[f>>2],d=n[d>>2]|0,n[k>>2]=n[F>>2],pOe(s,l,c,k,d),el(B),C=m}function nOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0;m=C,C=C+32|0,F=m+24|0,B=m+16|0,M=m+12|0,k=m,$a(B),l=ys(l)|0,c=o[c>>0]|0,n[M>>2]=n[f>>2],JR(k,d),n[F>>2]=n[M>>2],cOe(s,l,c,F,k),$A(k),el(B),C=m}function iOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,k=d,$a(m),l=ys(l)|0,c=o[c>>0]|0,n[k>>2]=n[f>>2],n[B>>2]=n[k>>2],sOe(s,l,c,B),el(m),C=d}function sOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+4|0,k=d,B=jo(oOe()|0)|0,c=tm(c)|0,n[k>>2]=n[f>>2],n[m>>2]=n[k>>2],MD(s,hs(0,B|0,l|0,c|0,N0(m)|0)|0),C=d}function oOe(){var s=0;return o[8e3]|0||(aOe(10756),s=8e3,n[s>>2]=1,n[s+4>>2]=0),10756}function MD(s,l){s=s|0,l=l|0,dR(s,l)}function aOe(s){s=s|0,ao(s,lOe()|0,2)}function lOe(){return 1772}function cOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0;m=C,C=C+32|0,F=m+16|0,M=m+12|0,B=m,k=jo(uOe()|0)|0,c=tm(c)|0,n[M>>2]=n[f>>2],n[F>>2]=n[M>>2],f=N0(F)|0,n[B>>2]=n[d>>2],F=d+4|0,n[B+4>>2]=n[F>>2],M=d+8|0,n[B+8>>2]=n[M>>2],n[M>>2]=0,n[F>>2]=0,n[d>>2]=0,MD(s,vi(0,k|0,l|0,c|0,f|0,XR(B)|0)|0),$A(B),C=m}function uOe(){var s=0;return o[8008]|0||(AOe(10768),s=8008,n[s>>2]=1,n[s+4>>2]=0),10768}function AOe(s){s=s|0,ao(s,fOe()|0,3)}function fOe(){return 1784}function pOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0;m=C,C=C+16|0,k=m+4|0,F=m,B=jo(hOe()|0)|0,c=tm(c)|0,n[F>>2]=n[f>>2],n[k>>2]=n[F>>2],f=N0(k)|0,MD(s,vi(0,B|0,l|0,c|0,f|0,zR(d)|0)|0),C=m}function hOe(){var s=0;return o[8016]|0||(gOe(10780),s=8016,n[s>>2]=1,n[s+4>>2]=0),10780}function gOe(s){s=s|0,ao(s,dOe()|0,3)}function dOe(){return 1800}function mOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=jo(yOe()|0)|0,MD(s,un(0,f|0,l|0,tm(c)|0)|0)}function yOe(){var s=0;return o[8024]|0||(EOe(10792),s=8024,n[s>>2]=1,n[s+4>>2]=0),10792}function EOe(s){s=s|0,ao(s,COe()|0,1)}function COe(){return 1816}function IOe(){wOe(),BOe(),vOe()}function wOe(){n[2702]=V7(65536)|0}function BOe(){GOe(10856)}function vOe(){DOe(10816)}function DOe(s){s=s|0,SOe(s,5044),POe(s)|0}function SOe(s,l){s=s|0,l=l|0;var c=0;c=c7()|0,n[s>>2]=c,MOe(c,l),Fp(n[s>>2]|0)}function POe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,xOe()|0),s|0}function xOe(){var s=0;return o[8032]|0||(C7(10820),pr(64,10820,U|0)|0,s=8032,n[s>>2]=1,n[s+4>>2]=0),Nr(10820)|0||C7(10820),10820}function C7(s){s=s|0,QOe(s),L0(s,25)}function bOe(s){s=s|0,kOe(s+24|0)}function kOe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function QOe(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,18,l,LOe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function FOe(s,l){s=s|0,l=l|0,ROe(s,l)}function ROe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;c=C,C=C+16|0,f=c,d=c+4|0,F0(d,l),n[f>>2]=R0(d,l)|0,TOe(s,f),C=c}function TOe(s,l){s=s|0,l=l|0,I7(s+4|0,n[l>>2]|0),o[s+8>>0]=1}function I7(s,l){s=s|0,l=l|0,n[s>>2]=l}function LOe(){return 1824}function NOe(s){return s=s|0,OOe(s)|0}function OOe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Za(8)|0,l=f,k=Yt(4)|0,F0(d,s),I7(k,R0(d,s)|0),m=l+4|0,n[m>>2]=k,s=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],u7(s,m,d),n[f>>2]=s,C=c,l|0}function Za(s){s=s|0;var l=0,c=0;return s=s+7&-8,s>>>0<=32768&&(l=n[2701]|0,s>>>0<=(65536-l|0)>>>0)?(c=(n[2702]|0)+l|0,n[2701]=l+s,s=c):(s=V7(s+8|0)|0,n[s>>2]=n[2703],n[2703]=s,s=s+8|0),s|0}function MOe(s,l){s=s|0,l=l|0,n[s>>2]=UOe()|0,n[s+4>>2]=_Oe()|0,n[s+12>>2]=l,n[s+8>>2]=HOe()|0,n[s+32>>2]=9}function UOe(){return 11744}function _Oe(){return 1832}function HOe(){return LD()|0}function qOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(jOe(c),yt(c)):l|0&&yt(l)}function jOe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function GOe(s){s=s|0,WOe(s,5052),YOe(s)|0,VOe(s,5058,26)|0,KOe(s,5069,1)|0,JOe(s,5077,10)|0,zOe(s,5087,19)|0,XOe(s,5094,27)|0}function WOe(s,l){s=s|0,l=l|0;var c=0;c=j4e()|0,n[s>>2]=c,G4e(c,l),Fp(n[s>>2]|0)}function YOe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,b4e()|0),s|0}function VOe(s,l,c){return s=s|0,l=l|0,c=c|0,A4e(s,mn(l)|0,c,0),s|0}function KOe(s,l,c){return s=s|0,l=l|0,c=c|0,zMe(s,mn(l)|0,c,0),s|0}function JOe(s,l,c){return s=s|0,l=l|0,c=c|0,xMe(s,mn(l)|0,c,0),s|0}function zOe(s,l,c){return s=s|0,l=l|0,c=c|0,pMe(s,mn(l)|0,c,0),s|0}function w7(s,l){s=s|0,l=l|0;var c=0,f=0;e:for(;;){for(c=n[2703]|0;;){if((c|0)==(l|0))break e;if(f=n[c>>2]|0,n[2703]=f,!c)c=f;else break}yt(c)}n[2701]=s}function XOe(s,l,c){return s=s|0,l=l|0,c=c|0,ZOe(s,mn(l)|0,c,0),s|0}function ZOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=ZR()|0,s=$Oe(c)|0,yn(m,l,d,s,eMe(c,f)|0,f)}function ZR(){var s=0,l=0;if(o[8040]|0||(v7(10860),pr(65,10860,U|0)|0,l=8040,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10860)|0)){s=10860,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));v7(10860)}return 10860}function $Oe(s){return s=s|0,s|0}function eMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=ZR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(B7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(tMe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function B7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function tMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=rMe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,nMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,B7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,iMe(s,d),sMe(d),C=k;return}}function rMe(s){return s=s|0,536870911}function nMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function iMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function sMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function v7(s){s=s|0,lMe(s)}function oMe(s){s=s|0,aMe(s+24|0)}function aMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function lMe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,11,l,cMe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function cMe(){return 1840}function uMe(s,l,c){s=s|0,l=l|0,c=c|0,fMe(n[(AMe(s)|0)>>2]|0,l,c)}function AMe(s){return s=s|0,(n[(ZR()|0)+24>>2]|0)+(s<<3)|0}function fMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+1|0,d=f,F0(m,l),l=R0(m,l)|0,F0(d,c),c=R0(d,c)|0,tf[s&31](l,c),C=f}function pMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=$R()|0,s=hMe(c)|0,yn(m,l,d,s,gMe(c,f)|0,f)}function $R(){var s=0,l=0;if(o[8048]|0||(S7(10896),pr(66,10896,U|0)|0,l=8048,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10896)|0)){s=10896,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));S7(10896)}return 10896}function hMe(s){return s=s|0,s|0}function gMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=$R()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(D7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(dMe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function D7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function dMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=mMe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,yMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,D7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,EMe(s,d),CMe(d),C=k;return}}function mMe(s){return s=s|0,536870911}function yMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function EMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function CMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function S7(s){s=s|0,BMe(s)}function IMe(s){s=s|0,wMe(s+24|0)}function wMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function BMe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,11,l,vMe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function vMe(){return 1852}function DMe(s,l){return s=s|0,l=l|0,PMe(n[(SMe(s)|0)>>2]|0,l)|0}function SMe(s){return s=s|0,(n[($R()|0)+24>>2]|0)+(s<<3)|0}function PMe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,F0(f,l),l=R0(f,l)|0,l=RD(_0[s&31](l)|0)|0,C=c,l|0}function xMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=eT()|0,s=bMe(c)|0,yn(m,l,d,s,kMe(c,f)|0,f)}function eT(){var s=0,l=0;if(o[8056]|0||(x7(10932),pr(67,10932,U|0)|0,l=8056,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10932)|0)){s=10932,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));x7(10932)}return 10932}function bMe(s){return s=s|0,s|0}function kMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=eT()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(P7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(QMe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function P7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function QMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=FMe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,RMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,P7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,TMe(s,d),LMe(d),C=k;return}}function FMe(s){return s=s|0,536870911}function RMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function TMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function LMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function x7(s){s=s|0,MMe(s)}function NMe(s){s=s|0,OMe(s+24|0)}function OMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function MMe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,7,l,UMe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function UMe(){return 1860}function _Me(s,l,c){return s=s|0,l=l|0,c=c|0,qMe(n[(HMe(s)|0)>>2]|0,l,c)|0}function HMe(s){return s=s|0,(n[(eT()|0)+24>>2]|0)+(s<<3)|0}function qMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0;return f=C,C=C+32|0,B=f+12|0,m=f+8|0,k=f,F=f+16|0,d=f+4|0,jMe(F,l),GMe(k,F,l),xp(d,c),c=bp(d,c)|0,n[B>>2]=n[k>>2],sw[s&15](m,B,c),c=WMe(m)|0,bu(m),kp(d),C=f,c|0}function jMe(s,l){s=s|0,l=l|0}function GMe(s,l,c){s=s|0,l=l|0,c=c|0,YMe(s,c)}function WMe(s){return s=s|0,ys(s)|0}function YMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+16|0,c=d,f=l,f&1?(VMe(c,0),ia(f|0,c|0)|0,KMe(s,c),JMe(c)):n[s>>2]=n[l>>2],C=d}function VMe(s,l){s=s|0,l=l|0,Fc(s,l),n[s+4>>2]=0,o[s+8>>0]=0}function KMe(s,l){s=s|0,l=l|0,n[s>>2]=n[l+4>>2]}function JMe(s){s=s|0,o[s+8>>0]=0}function zMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=tT()|0,s=XMe(c)|0,yn(m,l,d,s,ZMe(c,f)|0,f)}function tT(){var s=0,l=0;if(o[8064]|0||(k7(10968),pr(68,10968,U|0)|0,l=8064,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10968)|0)){s=10968,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));k7(10968)}return 10968}function XMe(s){return s=s|0,s|0}function ZMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=tT()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(b7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):($Me(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function b7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function $Me(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=e4e(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,t4e(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,b7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,r4e(s,d),n4e(d),C=k;return}}function e4e(s){return s=s|0,536870911}function t4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function r4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function n4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function k7(s){s=s|0,o4e(s)}function i4e(s){s=s|0,s4e(s+24|0)}function s4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function o4e(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,1,l,a4e()|0,5),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function a4e(){return 1872}function l4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,u4e(n[(c4e(s)|0)>>2]|0,l,c,f,d,m)}function c4e(s){return s=s|0,(n[(tT()|0)+24>>2]|0)+(s<<3)|0}function u4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,F=0,M=0,O=0,j=0;B=C,C=C+32|0,k=B+16|0,F=B+12|0,M=B+8|0,O=B+4|0,j=B,xp(k,l),l=bp(k,l)|0,xp(F,c),c=bp(F,c)|0,xp(M,f),f=bp(M,f)|0,xp(O,d),d=bp(O,d)|0,xp(j,m),m=bp(j,m)|0,Z7[s&1](l,c,f,d,m),kp(j),kp(O),kp(M),kp(F),kp(k),C=B}function A4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=rT()|0,s=f4e(c)|0,yn(m,l,d,s,p4e(c,f)|0,f)}function rT(){var s=0,l=0;if(o[8072]|0||(F7(11004),pr(69,11004,U|0)|0,l=8072,n[l>>2]=1,n[l+4>>2]=0),!(Nr(11004)|0)){s=11004,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));F7(11004)}return 11004}function f4e(s){return s=s|0,s|0}function p4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=rT()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(Q7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(h4e(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function Q7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function h4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=g4e(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,d4e(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,Q7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,m4e(s,d),y4e(d),C=k;return}}function g4e(s){return s=s|0,536870911}function d4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function m4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function y4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function F7(s){s=s|0,I4e(s)}function E4e(s){s=s|0,C4e(s+24|0)}function C4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function I4e(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,12,l,w4e()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function w4e(){return 1896}function B4e(s,l,c){s=s|0,l=l|0,c=c|0,D4e(n[(v4e(s)|0)>>2]|0,l,c)}function v4e(s){return s=s|0,(n[(rT()|0)+24>>2]|0)+(s<<3)|0}function D4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+4|0,d=f,S4e(m,l),l=P4e(m,l)|0,xp(d,c),c=bp(d,c)|0,tf[s&31](l,c),kp(d),C=f}function S4e(s,l){s=s|0,l=l|0}function P4e(s,l){return s=s|0,l=l|0,x4e(l)|0}function x4e(s){return s=s|0,s|0}function b4e(){var s=0;return o[8080]|0||(R7(11040),pr(70,11040,U|0)|0,s=8080,n[s>>2]=1,n[s+4>>2]=0),Nr(11040)|0||R7(11040),11040}function R7(s){s=s|0,F4e(s),L0(s,71)}function k4e(s){s=s|0,Q4e(s+24|0)}function Q4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function F4e(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,7,l,N4e()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function R4e(s){s=s|0,T4e(s)}function T4e(s){s=s|0,L4e(s)}function L4e(s){s=s|0,o[s+8>>0]=1}function N4e(){return 1936}function O4e(){return M4e()|0}function M4e(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Za(8)|0,s=c,m=s+4|0,n[m>>2]=Yt(1)|0,f=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],U4e(f,m,d),n[c>>2]=f,C=l,s|0}function U4e(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Yt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1916,n[c+12>>2]=l,n[s+4>>2]=c}function _4e(s){s=s|0,im(s),yt(s)}function H4e(s){s=s|0,s=n[s+12>>2]|0,s|0&&yt(s)}function q4e(s){s=s|0,yt(s)}function j4e(){var s=0;return o[8088]|0||(z4e(11076),pr(25,11076,U|0)|0,s=8088,n[s>>2]=1,n[s+4>>2]=0),11076}function G4e(s,l){s=s|0,l=l|0,n[s>>2]=W4e()|0,n[s+4>>2]=Y4e()|0,n[s+12>>2]=l,n[s+8>>2]=V4e()|0,n[s+32>>2]=10}function W4e(){return 11745}function Y4e(){return 1940}function V4e(){return TD()|0}function K4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(J4e(c),yt(c)):l|0&&yt(l)}function J4e(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function z4e(s){s=s|0,Pp(s)}function Tc(s,l){s=s|0,l=l|0,n[s>>2]=l}function nT(s){return s=s|0,n[s>>2]|0}function X4e(s){return s=s|0,o[n[s>>2]>>0]|0}function Z4e(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,n[f>>2]=n[s>>2],$4e(l,f)|0,C=c}function $4e(s,l){s=s|0,l=l|0;var c=0;return c=eUe(n[s>>2]|0,l)|0,l=s+4|0,n[(n[l>>2]|0)+8>>2]=c,n[(n[l>>2]|0)+8>>2]|0}function eUe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,$a(f),s=ys(s)|0,l=tUe(s,n[l>>2]|0)|0,el(f),C=c,l|0}function $a(s){s=s|0,n[s>>2]=n[2701],n[s+4>>2]=n[2703]}function tUe(s,l){s=s|0,l=l|0;var c=0;return c=jo(rUe()|0)|0,un(0,c|0,s|0,zR(l)|0)|0}function el(s){s=s|0,w7(n[s>>2]|0,n[s+4>>2]|0)}function rUe(){var s=0;return o[8096]|0||(nUe(11120),s=8096,n[s>>2]=1,n[s+4>>2]=0),11120}function nUe(s){s=s|0,ao(s,iUe()|0,1)}function iUe(){return 1948}function sUe(){oUe()}function oUe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0;if(Oe=C,C=C+16|0,O=Oe+4|0,j=Oe,Ro(65536,10804,n[2702]|0,10812),c=n7()|0,l=n[c>>2]|0,s=n[l>>2]|0,s|0)for(f=n[c+8>>2]|0,c=n[c+4>>2]|0;du(s|0,u[c>>0]|0|0,o[f>>0]|0),l=l+4|0,s=n[l>>2]|0,s;)f=f+1|0,c=c+1|0;if(s=i7()|0,l=n[s>>2]|0,l|0)do QA(l|0,n[s+4>>2]|0),s=s+8|0,l=n[s>>2]|0;while(l|0);QA(aUe()|0,5167),M=$d()|0,s=n[M>>2]|0;e:do if(s|0){do lUe(n[s+4>>2]|0),s=n[s>>2]|0;while(s|0);if(s=n[M>>2]|0,s|0){F=M;do{for(;d=s,s=n[s>>2]|0,d=n[d+4>>2]|0,!!(cUe(d)|0);)if(n[j>>2]=F,n[O>>2]=n[j>>2],uUe(M,O)|0,!s)break e;if(AUe(d),F=n[F>>2]|0,l=T7(d)|0,m=Bi()|0,B=C,C=C+((1*(l<<2)|0)+15&-16)|0,k=C,C=C+((1*(l<<2)|0)+15&-16)|0,l=n[(d7(d)|0)>>2]|0,l|0)for(c=B,f=k;n[c>>2]=n[(em(n[l+4>>2]|0)|0)>>2],n[f>>2]=n[l+8>>2],l=n[l>>2]|0,l;)c=c+4|0,f=f+4|0;Qe=em(d)|0,l=fUe(d)|0,c=T7(d)|0,f=pUe(d)|0,Il(Qe|0,l|0,B|0,k|0,c|0,f|0,GR(d)|0),kA(m|0)}while(s|0)}}while(!1);if(s=n[(WR()|0)>>2]|0,s|0)do Qe=s+4|0,M=YR(Qe)|0,d=tw(M)|0,m=$I(M)|0,B=(ew(M)|0)+1|0,k=UD(M)|0,F=L7(Qe)|0,M=Nr(M)|0,O=ND(Qe)|0,j=iT(Qe)|0,mc(0,d|0,m|0,B|0,k|0,F|0,M|0,O|0,j|0,sT(Qe)|0),s=n[s>>2]|0;while(s|0);s=n[($d()|0)>>2]|0;e:do if(s|0){t:for(;;){if(l=n[s+4>>2]|0,l|0&&(oe=n[(em(l)|0)>>2]|0,We=n[(m7(l)|0)>>2]|0,We|0)){c=We;do{l=c+4|0,f=YR(l)|0;r:do if(f|0)switch(Nr(f)|0){case 0:break t;case 4:case 3:case 2:{k=tw(f)|0,F=$I(f)|0,M=(ew(f)|0)+1|0,O=UD(f)|0,j=Nr(f)|0,Qe=ND(l)|0,mc(oe|0,k|0,F|0,M|0,O|0,0,j|0,Qe|0,iT(l)|0,sT(l)|0);break r}case 1:{B=tw(f)|0,k=$I(f)|0,F=(ew(f)|0)+1|0,M=UD(f)|0,O=L7(l)|0,j=Nr(f)|0,Qe=ND(l)|0,mc(oe|0,B|0,k|0,F|0,M|0,O|0,j|0,Qe|0,iT(l)|0,sT(l)|0);break r}case 5:{M=tw(f)|0,O=$I(f)|0,j=(ew(f)|0)+1|0,Qe=UD(f)|0,mc(oe|0,M|0,O|0,j|0,Qe|0,hUe(f)|0,Nr(f)|0,0,0,0);break r}default:break r}while(!1);c=n[c>>2]|0}while(c|0)}if(s=n[s>>2]|0,!s)break e}Tt()}while(!1);we(),C=Oe}function aUe(){return 11703}function lUe(s){s=s|0,o[s+40>>0]=0}function cUe(s){return s=s|0,(o[s+40>>0]|0)!=0|0}function uUe(s,l){return s=s|0,l=l|0,l=gUe(l)|0,s=n[l>>2]|0,n[l>>2]=n[s>>2],yt(s),n[l>>2]|0}function AUe(s){s=s|0,o[s+40>>0]=1}function T7(s){return s=s|0,n[s+20>>2]|0}function fUe(s){return s=s|0,n[s+8>>2]|0}function pUe(s){return s=s|0,n[s+32>>2]|0}function UD(s){return s=s|0,n[s+4>>2]|0}function L7(s){return s=s|0,n[s+4>>2]|0}function iT(s){return s=s|0,n[s+8>>2]|0}function sT(s){return s=s|0,n[s+16>>2]|0}function hUe(s){return s=s|0,n[s+20>>2]|0}function gUe(s){return s=s|0,n[s>>2]|0}function _D(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0,ct=0,_e=0,Ge=0,Nt=0;Nt=C,C=C+16|0,oe=Nt;do if(s>>>0<245){if(M=s>>>0<11?16:s+11&-8,s=M>>>3,j=n[2783]|0,c=j>>>s,c&3|0)return l=(c&1^1)+s|0,s=11172+(l<<1<<2)|0,c=s+8|0,f=n[c>>2]|0,d=f+8|0,m=n[d>>2]|0,(s|0)==(m|0)?n[2783]=j&~(1<>2]=s,n[c>>2]=m),Ge=l<<3,n[f+4>>2]=Ge|3,Ge=f+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1,Ge=d,C=Nt,Ge|0;if(O=n[2785]|0,M>>>0>O>>>0){if(c|0)return l=2<>>12&16,l=l>>>B,c=l>>>5&8,l=l>>>c,d=l>>>2&4,l=l>>>d,s=l>>>1&2,l=l>>>s,f=l>>>1&1,f=(c|B|d|s|f)+(l>>>f)|0,l=11172+(f<<1<<2)|0,s=l+8|0,d=n[s>>2]|0,B=d+8|0,c=n[B>>2]|0,(l|0)==(c|0)?(s=j&~(1<>2]=l,n[s>>2]=c,s=j),m=(f<<3)-M|0,n[d+4>>2]=M|3,f=d+M|0,n[f+4>>2]=m|1,n[f+m>>2]=m,O|0&&(d=n[2788]|0,l=O>>>3,c=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=d,n[l+12>>2]=d,n[d+8>>2]=l,n[d+12>>2]=c),n[2785]=m,n[2788]=f,Ge=B,C=Nt,Ge|0;if(k=n[2784]|0,k){if(c=(k&0-k)+-1|0,B=c>>>12&16,c=c>>>B,m=c>>>5&8,c=c>>>m,F=c>>>2&4,c=c>>>F,f=c>>>1&2,c=c>>>f,s=c>>>1&1,s=n[11436+((m|B|F|f|s)+(c>>>s)<<2)>>2]|0,c=(n[s+4>>2]&-8)-M|0,f=n[s+16+(((n[s+16>>2]|0)==0&1)<<2)>>2]|0,!f)F=s,m=c;else{do B=(n[f+4>>2]&-8)-M|0,F=B>>>0>>0,c=F?B:c,s=F?f:s,f=n[f+16+(((n[f+16>>2]|0)==0&1)<<2)>>2]|0;while(f|0);F=s,m=c}if(B=F+M|0,F>>>0>>0){d=n[F+24>>2]|0,l=n[F+12>>2]|0;do if((l|0)==(F|0)){if(s=F+20|0,l=n[s>>2]|0,!l&&(s=F+16|0,l=n[s>>2]|0,!l)){c=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0,c=l}else c=n[F+8>>2]|0,n[c+12>>2]=l,n[l+8>>2]=c,c=l;while(!1);do if(d|0){if(l=n[F+28>>2]|0,s=11436+(l<<2)|0,(F|0)==(n[s>>2]|0)){if(n[s>>2]=c,!c){n[2784]=k&~(1<>2]|0)!=(F|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=d,l=n[F+16>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),l=n[F+20>>2]|0,l|0&&(n[c+20>>2]=l,n[l+24>>2]=c)}while(!1);return m>>>0<16?(Ge=m+M|0,n[F+4>>2]=Ge|3,Ge=F+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1):(n[F+4>>2]=M|3,n[B+4>>2]=m|1,n[B+m>>2]=m,O|0&&(f=n[2788]|0,l=O>>>3,c=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=j|l,l=c,s=c+8|0),n[s>>2]=f,n[l+12>>2]=f,n[f+8>>2]=l,n[f+12>>2]=c),n[2785]=m,n[2788]=B),Ge=F+8|0,C=Nt,Ge|0}else j=M}else j=M}else j=M}else if(s>>>0<=4294967231)if(s=s+11|0,M=s&-8,F=n[2784]|0,F){f=0-M|0,s=s>>>8,s?M>>>0>16777215?k=31:(j=(s+1048320|0)>>>16&8,_e=s<>>16&4,_e=_e<>>16&2,k=14-(O|j|k)+(_e<>>15)|0,k=M>>>(k+7|0)&1|k<<1):k=0,c=n[11436+(k<<2)>>2]|0;e:do if(!c)c=0,s=0,_e=57;else for(s=0,B=M<<((k|0)==31?0:25-(k>>>1)|0),m=0;;){if(d=(n[c+4>>2]&-8)-M|0,d>>>0>>0)if(d)s=c,f=d;else{s=c,f=0,d=c,_e=61;break e}if(d=n[c+20>>2]|0,c=n[c+16+(B>>>31<<2)>>2]|0,m=(d|0)==0|(d|0)==(c|0)?m:d,d=(c|0)==0,d){c=m,_e=57;break}else B=B<<((d^1)&1)}while(!1);if((_e|0)==57){if((c|0)==0&(s|0)==0){if(s=2<>>12&16,j=j>>>B,m=j>>>5&8,j=j>>>m,k=j>>>2&4,j=j>>>k,O=j>>>1&2,j=j>>>O,c=j>>>1&1,s=0,c=n[11436+((m|B|k|O|c)+(j>>>c)<<2)>>2]|0}c?(d=c,_e=61):(k=s,B=f)}if((_e|0)==61)for(;;)if(_e=0,c=(n[d+4>>2]&-8)-M|0,j=c>>>0>>0,c=j?c:f,s=j?d:s,d=n[d+16+(((n[d+16>>2]|0)==0&1)<<2)>>2]|0,d)f=c,_e=61;else{k=s,B=c;break}if(k|0&&B>>>0<((n[2785]|0)-M|0)>>>0){if(m=k+M|0,k>>>0>=m>>>0)return Ge=0,C=Nt,Ge|0;d=n[k+24>>2]|0,l=n[k+12>>2]|0;do if((l|0)==(k|0)){if(s=k+20|0,l=n[s>>2]|0,!l&&(s=k+16|0,l=n[s>>2]|0,!l)){l=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0}else Ge=n[k+8>>2]|0,n[Ge+12>>2]=l,n[l+8>>2]=Ge;while(!1);do if(d){if(s=n[k+28>>2]|0,c=11436+(s<<2)|0,(k|0)==(n[c>>2]|0)){if(n[c>>2]=l,!l){f=F&~(1<>2]|0)!=(k|0)&1)<<2)>>2]=l,!l){f=F;break}n[l+24>>2]=d,s=n[k+16>>2]|0,s|0&&(n[l+16>>2]=s,n[s+24>>2]=l),s=n[k+20>>2]|0,s&&(n[l+20>>2]=s,n[s+24>>2]=l),f=F}else f=F;while(!1);do if(B>>>0>=16){if(n[k+4>>2]=M|3,n[m+4>>2]=B|1,n[m+B>>2]=B,l=B>>>3,B>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=m,n[l+12>>2]=m,n[m+8>>2]=l,n[m+12>>2]=c;break}if(l=B>>>8,l?B>>>0>16777215?l=31:(_e=(l+1048320|0)>>>16&8,Ge=l<<_e,ct=(Ge+520192|0)>>>16&4,Ge=Ge<>>16&2,l=14-(ct|_e|l)+(Ge<>>15)|0,l=B>>>(l+7|0)&1|l<<1):l=0,c=11436+(l<<2)|0,n[m+28>>2]=l,s=m+16|0,n[s+4>>2]=0,n[s>>2]=0,s=1<>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}for(s=B<<((l|0)==31?0:25-(l>>>1)|0),c=n[c>>2]|0;;){if((n[c+4>>2]&-8|0)==(B|0)){_e=97;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{_e=96;break}}if((_e|0)==96){n[f>>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}else if((_e|0)==97){_e=c+8|0,Ge=n[_e>>2]|0,n[Ge+12>>2]=m,n[_e>>2]=m,n[m+8>>2]=Ge,n[m+12>>2]=c,n[m+24>>2]=0;break}}else Ge=B+M|0,n[k+4>>2]=Ge|3,Ge=k+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1;while(!1);return Ge=k+8|0,C=Nt,Ge|0}else j=M}else j=M;else j=-1;while(!1);if(c=n[2785]|0,c>>>0>=j>>>0)return l=c-j|0,s=n[2788]|0,l>>>0>15?(Ge=s+j|0,n[2788]=Ge,n[2785]=l,n[Ge+4>>2]=l|1,n[Ge+l>>2]=l,n[s+4>>2]=j|3):(n[2785]=0,n[2788]=0,n[s+4>>2]=c|3,Ge=s+c+4|0,n[Ge>>2]=n[Ge>>2]|1),Ge=s+8|0,C=Nt,Ge|0;if(B=n[2786]|0,B>>>0>j>>>0)return ct=B-j|0,n[2786]=ct,Ge=n[2789]|0,_e=Ge+j|0,n[2789]=_e,n[_e+4>>2]=ct|1,n[Ge+4>>2]=j|3,Ge=Ge+8|0,C=Nt,Ge|0;if(n[2901]|0?s=n[2903]|0:(n[2903]=4096,n[2902]=4096,n[2904]=-1,n[2905]=-1,n[2906]=0,n[2894]=0,s=oe&-16^1431655768,n[oe>>2]=s,n[2901]=s,s=4096),k=j+48|0,F=j+47|0,m=s+F|0,d=0-s|0,M=m&d,M>>>0<=j>>>0||(s=n[2893]|0,s|0&&(O=n[2891]|0,oe=O+M|0,oe>>>0<=O>>>0|oe>>>0>s>>>0)))return Ge=0,C=Nt,Ge|0;e:do if(n[2894]&4)l=0,_e=133;else{c=n[2789]|0;t:do if(c){for(f=11580;s=n[f>>2]|0,!(s>>>0<=c>>>0&&(Qe=f+4|0,(s+(n[Qe>>2]|0)|0)>>>0>c>>>0));)if(s=n[f+8>>2]|0,s)f=s;else{_e=118;break t}if(l=m-B&d,l>>>0<2147483647)if(s=Tp(l|0)|0,(s|0)==((n[f>>2]|0)+(n[Qe>>2]|0)|0)){if((s|0)!=-1){B=l,m=s,_e=135;break e}}else f=s,_e=126;else l=0}else _e=118;while(!1);do if((_e|0)==118)if(c=Tp(0)|0,(c|0)!=-1&&(l=c,We=n[2902]|0,Oe=We+-1|0,l=(Oe&l|0?(Oe+l&0-We)-l|0:0)+M|0,We=n[2891]|0,Oe=l+We|0,l>>>0>j>>>0&l>>>0<2147483647)){if(Qe=n[2893]|0,Qe|0&&Oe>>>0<=We>>>0|Oe>>>0>Qe>>>0){l=0;break}if(s=Tp(l|0)|0,(s|0)==(c|0)){B=l,m=c,_e=135;break e}else f=s,_e=126}else l=0;while(!1);do if((_e|0)==126){if(c=0-l|0,!(k>>>0>l>>>0&(l>>>0<2147483647&(f|0)!=-1)))if((f|0)==-1){l=0;break}else{B=l,m=f,_e=135;break e}if(s=n[2903]|0,s=F-l+s&0-s,s>>>0>=2147483647){B=l,m=f,_e=135;break e}if((Tp(s|0)|0)==-1){Tp(c|0)|0,l=0;break}else{B=s+l|0,m=f,_e=135;break e}}while(!1);n[2894]=n[2894]|4,_e=133}while(!1);if((_e|0)==133&&M>>>0<2147483647&&(ct=Tp(M|0)|0,Qe=Tp(0)|0,rt=Qe-ct|0,Xe=rt>>>0>(j+40|0)>>>0,!((ct|0)==-1|Xe^1|ct>>>0>>0&((ct|0)!=-1&(Qe|0)!=-1)^1))&&(B=Xe?rt:l,m=ct,_e=135),(_e|0)==135){l=(n[2891]|0)+B|0,n[2891]=l,l>>>0>(n[2892]|0)>>>0&&(n[2892]=l),F=n[2789]|0;do if(F){for(l=11580;;){if(s=n[l>>2]|0,c=l+4|0,f=n[c>>2]|0,(m|0)==(s+f|0)){_e=145;break}if(d=n[l+8>>2]|0,d)l=d;else break}if((_e|0)==145&&!(n[l+12>>2]&8|0)&&F>>>0>>0&F>>>0>=s>>>0){n[c>>2]=f+B,Ge=F+8|0,Ge=Ge&7|0?0-Ge&7:0,_e=F+Ge|0,Ge=(n[2786]|0)+(B-Ge)|0,n[2789]=_e,n[2786]=Ge,n[_e+4>>2]=Ge|1,n[_e+Ge+4>>2]=40,n[2790]=n[2905];break}for(m>>>0<(n[2787]|0)>>>0&&(n[2787]=m),c=m+B|0,l=11580;;){if((n[l>>2]|0)==(c|0)){_e=153;break}if(s=n[l+8>>2]|0,s)l=s;else break}if((_e|0)==153&&!(n[l+12>>2]&8|0)){n[l>>2]=m,O=l+4|0,n[O>>2]=(n[O>>2]|0)+B,O=m+8|0,O=m+(O&7|0?0-O&7:0)|0,l=c+8|0,l=c+(l&7|0?0-l&7:0)|0,M=O+j|0,k=l-O-j|0,n[O+4>>2]=j|3;do if((l|0)!=(F|0)){if((l|0)==(n[2788]|0)){Ge=(n[2785]|0)+k|0,n[2785]=Ge,n[2788]=M,n[M+4>>2]=Ge|1,n[M+Ge>>2]=Ge;break}if(s=n[l+4>>2]|0,(s&3|0)==1){B=s&-8,f=s>>>3;e:do if(s>>>0<256)if(s=n[l+8>>2]|0,c=n[l+12>>2]|0,(c|0)==(s|0)){n[2783]=n[2783]&~(1<>2]=c,n[c+8>>2]=s;break}else{m=n[l+24>>2]|0,s=n[l+12>>2]|0;do if((s|0)==(l|0)){if(f=l+16|0,c=f+4|0,s=n[c>>2]|0,!s)if(s=n[f>>2]|0,s)c=f;else{s=0;break}for(;;){if(f=s+20|0,d=n[f>>2]|0,d|0){s=d,c=f;continue}if(f=s+16|0,d=n[f>>2]|0,d)s=d,c=f;else break}n[c>>2]=0}else Ge=n[l+8>>2]|0,n[Ge+12>>2]=s,n[s+8>>2]=Ge;while(!1);if(!m)break;c=n[l+28>>2]|0,f=11436+(c<<2)|0;do if((l|0)!=(n[f>>2]|0)){if(n[m+16+(((n[m+16>>2]|0)!=(l|0)&1)<<2)>>2]=s,!s)break e}else{if(n[f>>2]=s,s|0)break;n[2784]=n[2784]&~(1<>2]=m,c=l+16|0,f=n[c>>2]|0,f|0&&(n[s+16>>2]=f,n[f+24>>2]=s),c=n[c+4>>2]|0,!c)break;n[s+20>>2]=c,n[c+24>>2]=s}while(!1);l=l+B|0,d=B+k|0}else d=k;if(l=l+4|0,n[l>>2]=n[l>>2]&-2,n[M+4>>2]=d|1,n[M+d>>2]=d,l=d>>>3,d>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=M,n[l+12>>2]=M,n[M+8>>2]=l,n[M+12>>2]=c;break}l=d>>>8;do if(!l)l=0;else{if(d>>>0>16777215){l=31;break}_e=(l+1048320|0)>>>16&8,Ge=l<<_e,ct=(Ge+520192|0)>>>16&4,Ge=Ge<>>16&2,l=14-(ct|_e|l)+(Ge<>>15)|0,l=d>>>(l+7|0)&1|l<<1}while(!1);if(f=11436+(l<<2)|0,n[M+28>>2]=l,s=M+16|0,n[s+4>>2]=0,n[s>>2]=0,s=n[2784]|0,c=1<>2]=M,n[M+24>>2]=f,n[M+12>>2]=M,n[M+8>>2]=M;break}for(s=d<<((l|0)==31?0:25-(l>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){_e=194;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{_e=193;break}}if((_e|0)==193){n[f>>2]=M,n[M+24>>2]=c,n[M+12>>2]=M,n[M+8>>2]=M;break}else if((_e|0)==194){_e=c+8|0,Ge=n[_e>>2]|0,n[Ge+12>>2]=M,n[_e>>2]=M,n[M+8>>2]=Ge,n[M+12>>2]=c,n[M+24>>2]=0;break}}else Ge=(n[2786]|0)+k|0,n[2786]=Ge,n[2789]=M,n[M+4>>2]=Ge|1;while(!1);return Ge=O+8|0,C=Nt,Ge|0}for(l=11580;s=n[l>>2]|0,!(s>>>0<=F>>>0&&(Ge=s+(n[l+4>>2]|0)|0,Ge>>>0>F>>>0));)l=n[l+8>>2]|0;d=Ge+-47|0,s=d+8|0,s=d+(s&7|0?0-s&7:0)|0,d=F+16|0,s=s>>>0>>0?F:s,l=s+8|0,c=m+8|0,c=c&7|0?0-c&7:0,_e=m+c|0,c=B+-40-c|0,n[2789]=_e,n[2786]=c,n[_e+4>>2]=c|1,n[_e+c+4>>2]=40,n[2790]=n[2905],c=s+4|0,n[c>>2]=27,n[l>>2]=n[2895],n[l+4>>2]=n[2896],n[l+8>>2]=n[2897],n[l+12>>2]=n[2898],n[2895]=m,n[2896]=B,n[2898]=0,n[2897]=l,l=s+24|0;do _e=l,l=l+4|0,n[l>>2]=7;while((_e+8|0)>>>0>>0);if((s|0)!=(F|0)){if(m=s-F|0,n[c>>2]=n[c>>2]&-2,n[F+4>>2]=m|1,n[s>>2]=m,l=m>>>3,m>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=F,n[l+12>>2]=F,n[F+8>>2]=l,n[F+12>>2]=c;break}if(l=m>>>8,l?m>>>0>16777215?c=31:(_e=(l+1048320|0)>>>16&8,Ge=l<<_e,ct=(Ge+520192|0)>>>16&4,Ge=Ge<>>16&2,c=14-(ct|_e|c)+(Ge<>>15)|0,c=m>>>(c+7|0)&1|c<<1):c=0,f=11436+(c<<2)|0,n[F+28>>2]=c,n[F+20>>2]=0,n[d>>2]=0,l=n[2784]|0,s=1<>2]=F,n[F+24>>2]=f,n[F+12>>2]=F,n[F+8>>2]=F;break}for(s=m<<((c|0)==31?0:25-(c>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(m|0)){_e=216;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{_e=215;break}}if((_e|0)==215){n[f>>2]=F,n[F+24>>2]=c,n[F+12>>2]=F,n[F+8>>2]=F;break}else if((_e|0)==216){_e=c+8|0,Ge=n[_e>>2]|0,n[Ge+12>>2]=F,n[_e>>2]=F,n[F+8>>2]=Ge,n[F+12>>2]=c,n[F+24>>2]=0;break}}}else{Ge=n[2787]|0,(Ge|0)==0|m>>>0>>0&&(n[2787]=m),n[2895]=m,n[2896]=B,n[2898]=0,n[2792]=n[2901],n[2791]=-1,l=0;do Ge=11172+(l<<1<<2)|0,n[Ge+12>>2]=Ge,n[Ge+8>>2]=Ge,l=l+1|0;while((l|0)!=32);Ge=m+8|0,Ge=Ge&7|0?0-Ge&7:0,_e=m+Ge|0,Ge=B+-40-Ge|0,n[2789]=_e,n[2786]=Ge,n[_e+4>>2]=Ge|1,n[_e+Ge+4>>2]=40,n[2790]=n[2905]}while(!1);if(l=n[2786]|0,l>>>0>j>>>0)return ct=l-j|0,n[2786]=ct,Ge=n[2789]|0,_e=Ge+j|0,n[2789]=_e,n[_e+4>>2]=ct|1,n[Ge+4>>2]=j|3,Ge=Ge+8|0,C=Nt,Ge|0}return n[(rm()|0)>>2]=12,Ge=0,C=Nt,Ge|0}function HD(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0;if(s){c=s+-8|0,d=n[2787]|0,s=n[s+-4>>2]|0,l=s&-8,F=c+l|0;do if(s&1)k=c,B=c;else{if(f=n[c>>2]|0,!(s&3)||(B=c+(0-f)|0,m=f+l|0,B>>>0>>0))return;if((B|0)==(n[2788]|0)){if(s=F+4|0,l=n[s>>2]|0,(l&3|0)!=3){k=B,l=m;break}n[2785]=m,n[s>>2]=l&-2,n[B+4>>2]=m|1,n[B+m>>2]=m;return}if(c=f>>>3,f>>>0<256)if(s=n[B+8>>2]|0,l=n[B+12>>2]|0,(l|0)==(s|0)){n[2783]=n[2783]&~(1<>2]=l,n[l+8>>2]=s,k=B,l=m;break}d=n[B+24>>2]|0,s=n[B+12>>2]|0;do if((s|0)==(B|0)){if(c=B+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{s=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0}else k=n[B+8>>2]|0,n[k+12>>2]=s,n[s+8>>2]=k;while(!1);if(d){if(l=n[B+28>>2]|0,c=11436+(l<<2)|0,(B|0)==(n[c>>2]|0)){if(n[c>>2]=s,!s){n[2784]=n[2784]&~(1<>2]|0)!=(B|0)&1)<<2)>>2]=s,!s){k=B,l=m;break}n[s+24>>2]=d,l=B+16|0,c=n[l>>2]|0,c|0&&(n[s+16>>2]=c,n[c+24>>2]=s),l=n[l+4>>2]|0,l?(n[s+20>>2]=l,n[l+24>>2]=s,k=B,l=m):(k=B,l=m)}else k=B,l=m}while(!1);if(!(B>>>0>=F>>>0)&&(s=F+4|0,f=n[s>>2]|0,!!(f&1))){if(f&2)n[s>>2]=f&-2,n[k+4>>2]=l|1,n[B+l>>2]=l,d=l;else{if(s=n[2788]|0,(F|0)==(n[2789]|0)){if(F=(n[2786]|0)+l|0,n[2786]=F,n[2789]=k,n[k+4>>2]=F|1,(k|0)!=(s|0))return;n[2788]=0,n[2785]=0;return}if((F|0)==(s|0)){F=(n[2785]|0)+l|0,n[2785]=F,n[2788]=B,n[k+4>>2]=F|1,n[B+F>>2]=F;return}d=(f&-8)+l|0,c=f>>>3;do if(f>>>0<256)if(l=n[F+8>>2]|0,s=n[F+12>>2]|0,(s|0)==(l|0)){n[2783]=n[2783]&~(1<>2]=s,n[s+8>>2]=l;break}else{m=n[F+24>>2]|0,s=n[F+12>>2]|0;do if((s|0)==(F|0)){if(c=F+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{c=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0,c=s}else c=n[F+8>>2]|0,n[c+12>>2]=s,n[s+8>>2]=c,c=s;while(!1);if(m|0){if(s=n[F+28>>2]|0,l=11436+(s<<2)|0,(F|0)==(n[l>>2]|0)){if(n[l>>2]=c,!c){n[2784]=n[2784]&~(1<>2]|0)!=(F|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=m,s=F+16|0,l=n[s>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),s=n[s+4>>2]|0,s|0&&(n[c+20>>2]=s,n[s+24>>2]=c)}}while(!1);if(n[k+4>>2]=d|1,n[B+d>>2]=d,(k|0)==(n[2788]|0)){n[2785]=d;return}}if(s=d>>>3,d>>>0<256){c=11172+(s<<1<<2)|0,l=n[2783]|0,s=1<>2]|0):(n[2783]=l|s,s=c,l=c+8|0),n[l>>2]=k,n[s+12>>2]=k,n[k+8>>2]=s,n[k+12>>2]=c;return}s=d>>>8,s?d>>>0>16777215?s=31:(B=(s+1048320|0)>>>16&8,F=s<>>16&4,F=F<>>16&2,s=14-(m|B|s)+(F<>>15)|0,s=d>>>(s+7|0)&1|s<<1):s=0,f=11436+(s<<2)|0,n[k+28>>2]=s,n[k+20>>2]=0,n[k+16>>2]=0,l=n[2784]|0,c=1<>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){s=73;break}if(f=c+16+(l>>>31<<2)|0,s=n[f>>2]|0,s)l=l<<1,c=s;else{s=72;break}}if((s|0)==72){n[f>>2]=k,n[k+24>>2]=c,n[k+12>>2]=k,n[k+8>>2]=k;break}else if((s|0)==73){B=c+8|0,F=n[B>>2]|0,n[F+12>>2]=k,n[B>>2]=k,n[k+8>>2]=F,n[k+12>>2]=c,n[k+24>>2]=0;break}}else n[2784]=l|c,n[f>>2]=k,n[k+24>>2]=f,n[k+12>>2]=k,n[k+8>>2]=k;while(!1);if(F=(n[2791]|0)+-1|0,n[2791]=F,!F)s=11588;else return;for(;s=n[s>>2]|0,s;)s=s+8|0;n[2791]=-1}}}function dUe(){return 11628}function mUe(s){s=s|0;var l=0,c=0;return l=C,C=C+16|0,c=l,n[c>>2]=CUe(n[s+60>>2]|0)|0,s=qD(Ec(6,c|0)|0)|0,C=l,s|0}function N7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0;j=C,C=C+48|0,M=j+16|0,m=j,d=j+32|0,k=s+28|0,f=n[k>>2]|0,n[d>>2]=f,F=s+20|0,f=(n[F>>2]|0)-f|0,n[d+4>>2]=f,n[d+8>>2]=l,n[d+12>>2]=c,f=f+c|0,B=s+60|0,n[m>>2]=n[B>>2],n[m+4>>2]=d,n[m+8>>2]=2,m=qD(aa(146,m|0)|0)|0;e:do if((f|0)!=(m|0)){for(l=2;!((m|0)<0);)if(f=f-m|0,We=n[d+4>>2]|0,oe=m>>>0>We>>>0,d=oe?d+8|0:d,l=(oe<<31>>31)+l|0,We=m-(oe?We:0)|0,n[d>>2]=(n[d>>2]|0)+We,oe=d+4|0,n[oe>>2]=(n[oe>>2]|0)-We,n[M>>2]=n[B>>2],n[M+4>>2]=d,n[M+8>>2]=l,m=qD(aa(146,M|0)|0)|0,(f|0)==(m|0)){O=3;break e}n[s+16>>2]=0,n[k>>2]=0,n[F>>2]=0,n[s>>2]=n[s>>2]|32,(l|0)==2?c=0:c=c-(n[d+4>>2]|0)|0}else O=3;while(!1);return(O|0)==3&&(We=n[s+44>>2]|0,n[s+16>>2]=We+(n[s+48>>2]|0),n[k>>2]=We,n[F>>2]=We),C=j,c|0}function yUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return d=C,C=C+32|0,m=d,f=d+20|0,n[m>>2]=n[s+60>>2],n[m+4>>2]=0,n[m+8>>2]=l,n[m+12>>2]=f,n[m+16>>2]=c,(qD(oa(140,m|0)|0)|0)<0?(n[f>>2]=-1,s=-1):s=n[f>>2]|0,C=d,s|0}function qD(s){return s=s|0,s>>>0>4294963200&&(n[(rm()|0)>>2]=0-s,s=-1),s|0}function rm(){return(EUe()|0)+64|0}function EUe(){return oT()|0}function oT(){return 2084}function CUe(s){return s=s|0,s|0}function IUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return d=C,C=C+32|0,f=d,n[s+36>>2]=1,!(n[s>>2]&64|0)&&(n[f>>2]=n[s+60>>2],n[f+4>>2]=21523,n[f+8>>2]=d+16,Ls(54,f|0)|0)&&(o[s+75>>0]=-1),f=N7(s,l,c)|0,C=d,f|0}function O7(s,l){s=s|0,l=l|0;var c=0,f=0;if(c=o[s>>0]|0,f=o[l>>0]|0,!(c<<24>>24)||c<<24>>24!=f<<24>>24)s=f;else{do s=s+1|0,l=l+1|0,c=o[s>>0]|0,f=o[l>>0]|0;while(!(!(c<<24>>24)||c<<24>>24!=f<<24>>24));s=f}return(c&255)-(s&255)|0}function wUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;e:do if(!c)s=0;else{for(;f=o[s>>0]|0,d=o[l>>0]|0,f<<24>>24==d<<24>>24;)if(c=c+-1|0,c)s=s+1|0,l=l+1|0;else{s=0;break e}s=(f&255)-(d&255)|0}while(!1);return s|0}function M7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0;Qe=C,C=C+224|0,O=Qe+120|0,j=Qe+80|0,We=Qe,Oe=Qe+136|0,f=j,d=f+40|0;do n[f>>2]=0,f=f+4|0;while((f|0)<(d|0));return n[O>>2]=n[c>>2],(aT(0,l,O,We,j)|0)<0?c=-1:((n[s+76>>2]|0)>-1?oe=BUe(s)|0:oe=0,c=n[s>>2]|0,M=c&32,(o[s+74>>0]|0)<1&&(n[s>>2]=c&-33),f=s+48|0,n[f>>2]|0?c=aT(s,l,O,We,j)|0:(d=s+44|0,m=n[d>>2]|0,n[d>>2]=Oe,B=s+28|0,n[B>>2]=Oe,k=s+20|0,n[k>>2]=Oe,n[f>>2]=80,F=s+16|0,n[F>>2]=Oe+80,c=aT(s,l,O,We,j)|0,m&&(YD[n[s+36>>2]&7](s,0,0)|0,c=n[k>>2]|0?c:-1,n[d>>2]=m,n[f>>2]=0,n[F>>2]=0,n[B>>2]=0,n[k>>2]=0)),f=n[s>>2]|0,n[s>>2]=f|M,oe|0&&vUe(s),c=f&32|0?-1:c),C=Qe,c|0}function aT(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0,ct=0,_e=0,Ge=0,Nt=0,_r=0,ur=0,Zt=0,kr=0,Or=0,lr=0;lr=C,C=C+64|0,ur=lr+16|0,Zt=lr,Nt=lr+24|0,kr=lr+8|0,Or=lr+20|0,n[ur>>2]=l,ct=(s|0)!=0,_e=Nt+40|0,Ge=_e,Nt=Nt+39|0,_r=kr+4|0,B=0,m=0,O=0;e:for(;;){do if((m|0)>-1)if((B|0)>(2147483647-m|0)){n[(rm()|0)>>2]=75,m=-1;break}else{m=B+m|0;break}while(!1);if(B=o[l>>0]|0,B<<24>>24)k=l;else{Xe=87;break}t:for(;;){switch(B<<24>>24){case 37:{B=k,Xe=9;break t}case 0:{B=k;break t}default:}rt=k+1|0,n[ur>>2]=rt,B=o[rt>>0]|0,k=rt}t:do if((Xe|0)==9)for(;;){if(Xe=0,(o[k+1>>0]|0)!=37)break t;if(B=B+1|0,k=k+2|0,n[ur>>2]=k,(o[k>>0]|0)==37)Xe=9;else break}while(!1);if(B=B-l|0,ct&&os(s,l,B),B|0){l=k;continue}F=k+1|0,B=(o[F>>0]|0)+-48|0,B>>>0<10?(rt=(o[k+2>>0]|0)==36,Qe=rt?B:-1,O=rt?1:O,F=rt?k+3|0:F):Qe=-1,n[ur>>2]=F,B=o[F>>0]|0,k=(B<<24>>24)+-32|0;t:do if(k>>>0<32)for(M=0,j=B;;){if(B=1<>2]=F,B=o[F>>0]|0,k=(B<<24>>24)+-32|0,k>>>0>=32)break;j=B}else M=0;while(!1);if(B<<24>>24==42){if(k=F+1|0,B=(o[k>>0]|0)+-48|0,B>>>0<10&&(o[F+2>>0]|0)==36)n[d+(B<<2)>>2]=10,B=n[f+((o[k>>0]|0)+-48<<3)>>2]|0,O=1,F=F+3|0;else{if(O|0){m=-1;break}ct?(O=(n[c>>2]|0)+3&-4,B=n[O>>2]|0,n[c>>2]=O+4,O=0,F=k):(B=0,O=0,F=k)}n[ur>>2]=F,rt=(B|0)<0,B=rt?0-B|0:B,M=rt?M|8192:M}else{if(B=U7(ur)|0,(B|0)<0){m=-1;break}F=n[ur>>2]|0}do if((o[F>>0]|0)==46){if((o[F+1>>0]|0)!=42){n[ur>>2]=F+1,k=U7(ur)|0,F=n[ur>>2]|0;break}if(j=F+2|0,k=(o[j>>0]|0)+-48|0,k>>>0<10&&(o[F+3>>0]|0)==36){n[d+(k<<2)>>2]=10,k=n[f+((o[j>>0]|0)+-48<<3)>>2]|0,F=F+4|0,n[ur>>2]=F;break}if(O|0){m=-1;break e}ct?(rt=(n[c>>2]|0)+3&-4,k=n[rt>>2]|0,n[c>>2]=rt+4):k=0,n[ur>>2]=j,F=j}else k=-1;while(!1);for(Oe=0;;){if(((o[F>>0]|0)+-65|0)>>>0>57){m=-1;break e}if(rt=F+1|0,n[ur>>2]=rt,j=o[(o[F>>0]|0)+-65+(5178+(Oe*58|0))>>0]|0,oe=j&255,(oe+-1|0)>>>0<8)Oe=oe,F=rt;else break}if(!(j<<24>>24)){m=-1;break}We=(Qe|0)>-1;do if(j<<24>>24==19)if(We){m=-1;break e}else Xe=49;else{if(We){n[d+(Qe<<2)>>2]=oe,We=f+(Qe<<3)|0,Qe=n[We+4>>2]|0,Xe=Zt,n[Xe>>2]=n[We>>2],n[Xe+4>>2]=Qe,Xe=49;break}if(!ct){m=0;break e}_7(Zt,oe,c)}while(!1);if((Xe|0)==49&&(Xe=0,!ct)){B=0,l=rt;continue}F=o[F>>0]|0,F=(Oe|0)!=0&(F&15|0)==3?F&-33:F,We=M&-65537,Qe=M&8192|0?We:M;t:do switch(F|0){case 110:switch((Oe&255)<<24>>24){case 0:{n[n[Zt>>2]>>2]=m,B=0,l=rt;continue e}case 1:{n[n[Zt>>2]>>2]=m,B=0,l=rt;continue e}case 2:{B=n[Zt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=rt;continue e}case 3:{a[n[Zt>>2]>>1]=m,B=0,l=rt;continue e}case 4:{o[n[Zt>>2]>>0]=m,B=0,l=rt;continue e}case 6:{n[n[Zt>>2]>>2]=m,B=0,l=rt;continue e}case 7:{B=n[Zt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=rt;continue e}default:{B=0,l=rt;continue e}}case 112:{F=120,k=k>>>0>8?k:8,l=Qe|8,Xe=61;break}case 88:case 120:{l=Qe,Xe=61;break}case 111:{F=Zt,l=n[F>>2]|0,F=n[F+4>>2]|0,oe=SUe(l,F,_e)|0,We=Ge-oe|0,M=0,j=5642,k=(Qe&8|0)==0|(k|0)>(We|0)?k:We+1|0,We=Qe,Xe=67;break}case 105:case 100:if(F=Zt,l=n[F>>2]|0,F=n[F+4>>2]|0,(F|0)<0){l=jD(0,0,l|0,F|0)|0,F=Ce,M=Zt,n[M>>2]=l,n[M+4>>2]=F,M=1,j=5642,Xe=66;break t}else{M=(Qe&2049|0)!=0&1,j=Qe&2048|0?5643:Qe&1|0?5644:5642,Xe=66;break t}case 117:{F=Zt,M=0,j=5642,l=n[F>>2]|0,F=n[F+4>>2]|0,Xe=66;break}case 99:{o[Nt>>0]=n[Zt>>2],l=Nt,M=0,j=5642,oe=_e,F=1,k=We;break}case 109:{F=PUe(n[(rm()|0)>>2]|0)|0,Xe=71;break}case 115:{F=n[Zt>>2]|0,F=F|0?F:5652,Xe=71;break}case 67:{n[kr>>2]=n[Zt>>2],n[_r>>2]=0,n[Zt>>2]=kr,oe=-1,F=kr,Xe=75;break}case 83:{l=n[Zt>>2]|0,k?(oe=k,F=l,Xe=75):(Es(s,32,B,0,Qe),l=0,Xe=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{B=bUe(s,+E[Zt>>3],B,k,Qe,F)|0,l=rt;continue e}default:M=0,j=5642,oe=_e,F=k,k=Qe}while(!1);t:do if((Xe|0)==61)Qe=Zt,Oe=n[Qe>>2]|0,Qe=n[Qe+4>>2]|0,oe=DUe(Oe,Qe,_e,F&32)|0,j=(l&8|0)==0|(Oe|0)==0&(Qe|0)==0,M=j?0:2,j=j?5642:5642+(F>>4)|0,We=l,l=Oe,F=Qe,Xe=67;else if((Xe|0)==66)oe=nm(l,F,_e)|0,We=Qe,Xe=67;else if((Xe|0)==71)Xe=0,Qe=xUe(F,0,k)|0,Oe=(Qe|0)==0,l=F,M=0,j=5642,oe=Oe?F+k|0:Qe,F=Oe?k:Qe-F|0,k=We;else if((Xe|0)==75){for(Xe=0,j=F,l=0,k=0;M=n[j>>2]|0,!(!M||(k=H7(Or,M)|0,(k|0)<0|k>>>0>(oe-l|0)>>>0));)if(l=k+l|0,oe>>>0>l>>>0)j=j+4|0;else break;if((k|0)<0){m=-1;break e}if(Es(s,32,B,l,Qe),!l)l=0,Xe=84;else for(M=0;;){if(k=n[F>>2]|0,!k){Xe=84;break t}if(k=H7(Or,k)|0,M=k+M|0,(M|0)>(l|0)){Xe=84;break t}if(os(s,Or,k),M>>>0>=l>>>0){Xe=84;break}else F=F+4|0}}while(!1);if((Xe|0)==67)Xe=0,F=(l|0)!=0|(F|0)!=0,Qe=(k|0)!=0|F,F=((F^1)&1)+(Ge-oe)|0,l=Qe?oe:_e,oe=_e,F=Qe?(k|0)>(F|0)?k:F:k,k=(k|0)>-1?We&-65537:We;else if((Xe|0)==84){Xe=0,Es(s,32,B,l,Qe^8192),B=(B|0)>(l|0)?B:l,l=rt;continue}Oe=oe-l|0,We=(F|0)<(Oe|0)?Oe:F,Qe=We+M|0,B=(B|0)<(Qe|0)?Qe:B,Es(s,32,B,Qe,k),os(s,j,M),Es(s,48,B,Qe,k^65536),Es(s,48,We,Oe,0),os(s,l,Oe),Es(s,32,B,Qe,k^8192),l=rt}e:do if((Xe|0)==87&&!s)if(!O)m=0;else{for(m=1;l=n[d+(m<<2)>>2]|0,!!l;)if(_7(f+(m<<3)|0,l,c),m=m+1|0,(m|0)>=10){m=1;break e}for(;;){if(n[d+(m<<2)>>2]|0){m=-1;break e}if(m=m+1|0,(m|0)>=10){m=1;break}}}while(!1);return C=lr,m|0}function BUe(s){return s=s|0,0}function vUe(s){s=s|0}function os(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]&32||MUe(l,c,s)|0}function U7(s){s=s|0;var l=0,c=0,f=0;if(c=n[s>>2]|0,f=(o[c>>0]|0)+-48|0,f>>>0<10){l=0;do l=f+(l*10|0)|0,c=c+1|0,n[s>>2]=c,f=(o[c>>0]|0)+-48|0;while(f>>>0<10)}else l=0;return l|0}function _7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;e:do if(l>>>0<=20)do switch(l|0){case 9:{f=(n[c>>2]|0)+3&-4,l=n[f>>2]|0,n[c>>2]=f+4,n[s>>2]=l;break e}case 10:{f=(n[c>>2]|0)+3&-4,l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=((l|0)<0)<<31>>31;break e}case 11:{f=(n[c>>2]|0)+3&-4,l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=0;break e}case 12:{f=(n[c>>2]|0)+7&-8,l=f,d=n[l>>2]|0,l=n[l+4>>2]|0,n[c>>2]=f+8,f=s,n[f>>2]=d,n[f+4>>2]=l;break e}case 13:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,f=(f&65535)<<16>>16,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 14:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&65535,n[d+4>>2]=0;break e}case 15:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,f=(f&255)<<24>>24,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 16:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&255,n[d+4>>2]=0;break e}case 17:{d=(n[c>>2]|0)+7&-8,m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}case 18:{d=(n[c>>2]|0)+7&-8,m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}default:break e}while(!1);while(!1)}function DUe(s,l,c,f){if(s=s|0,l=l|0,c=c|0,f=f|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=u[5694+(s&15)>>0]|0|f,s=GD(s|0,l|0,4)|0,l=Ce;while(!((s|0)==0&(l|0)==0));return c|0}function SUe(s,l,c){if(s=s|0,l=l|0,c=c|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=s&7|48,s=GD(s|0,l|0,3)|0,l=Ce;while(!((s|0)==0&(l|0)==0));return c|0}function nm(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if(l>>>0>0|(l|0)==0&s>>>0>4294967295){for(;f=AT(s|0,l|0,10,0)|0,c=c+-1|0,o[c>>0]=f&255|48,f=s,s=uT(s|0,l|0,10,0)|0,l>>>0>9|(l|0)==9&f>>>0>4294967295;)l=Ce;l=s}else l=s;if(l)for(;c=c+-1|0,o[c>>0]=(l>>>0)%10|0|48,!(l>>>0<10);)l=(l>>>0)/10|0;return c|0}function PUe(s){return s=s|0,TUe(s,n[(RUe()|0)+188>>2]|0)|0}function xUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;m=l&255,f=(c|0)!=0;e:do if(f&(s&3|0)!=0)for(d=l&255;;){if((o[s>>0]|0)==d<<24>>24){B=6;break e}if(s=s+1|0,c=c+-1|0,f=(c|0)!=0,!(f&(s&3|0)!=0)){B=5;break}}else B=5;while(!1);(B|0)==5&&(f?B=6:c=0);e:do if((B|0)==6&&(d=l&255,(o[s>>0]|0)!=d<<24>>24)){f=He(m,16843009)|0;t:do if(c>>>0>3){for(;m=n[s>>2]^f,!((m&-2139062144^-2139062144)&m+-16843009|0);)if(s=s+4|0,c=c+-4|0,c>>>0<=3){B=11;break t}}else B=11;while(!1);if((B|0)==11&&!c){c=0;break}for(;;){if((o[s>>0]|0)==d<<24>>24)break e;if(s=s+1|0,c=c+-1|0,!c){c=0;break}}}while(!1);return(c|0?s:0)|0}function Es(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0;if(B=C,C=C+256|0,m=B,(c|0)>(f|0)&(d&73728|0)==0){if(d=c-f|0,sm(m|0,l|0,(d>>>0<256?d:256)|0)|0,d>>>0>255){l=c-f|0;do os(s,m,256),d=d+-256|0;while(d>>>0>255);d=l&255}os(s,m,d)}C=B}function H7(s,l){return s=s|0,l=l|0,s?s=QUe(s,l,0)|0:s=0,s|0}function bUe(s,l,c,f,d,m){s=s|0,l=+l,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0,ct=0,_e=0,Ge=0,Nt=0,_r=0,ur=0,Zt=0,kr=0,Or=0,lr=0,Ln=0;Ln=C,C=C+560|0,F=Ln+8|0,rt=Ln,lr=Ln+524|0,Or=lr,M=Ln+512|0,n[rt>>2]=0,kr=M+12|0,q7(l)|0,(Ce|0)<0?(l=-l,ur=1,_r=5659):(ur=(d&2049|0)!=0&1,_r=d&2048|0?5662:d&1|0?5665:5660),q7(l)|0,Zt=Ce&2146435072;do if(Zt>>>0<2146435072|(Zt|0)==2146435072&!1){if(We=+kUe(l,rt)*2,B=We!=0,B&&(n[rt>>2]=(n[rt>>2]|0)+-1),ct=m|32,(ct|0)==97){Oe=m&32,oe=Oe|0?_r+9|0:_r,j=ur|2,B=12-f|0;do if(f>>>0>11|(B|0)==0)l=We;else{l=8;do B=B+-1|0,l=l*16;while(B|0);if((o[oe>>0]|0)==45){l=-(l+(-We-l));break}else{l=We+l-l;break}}while(!1);k=n[rt>>2]|0,B=(k|0)<0?0-k|0:k,B=nm(B,((B|0)<0)<<31>>31,kr)|0,(B|0)==(kr|0)&&(B=M+11|0,o[B>>0]=48),o[B+-1>>0]=(k>>31&2)+43,O=B+-2|0,o[O>>0]=m+15,M=(f|0)<1,F=(d&8|0)==0,B=lr;do Zt=~~l,k=B+1|0,o[B>>0]=u[5694+Zt>>0]|Oe,l=(l-+(Zt|0))*16,(k-Or|0)==1&&!(F&(M&l==0))?(o[k>>0]=46,B=B+2|0):B=k;while(l!=0);Zt=B-Or|0,Or=kr-O|0,kr=(f|0)!=0&(Zt+-2|0)<(f|0)?f+2|0:Zt,B=Or+j+kr|0,Es(s,32,c,B,d),os(s,oe,j),Es(s,48,c,B,d^65536),os(s,lr,Zt),Es(s,48,kr-Zt|0,0,0),os(s,O,Or),Es(s,32,c,B,d^8192);break}k=(f|0)<0?6:f,B?(B=(n[rt>>2]|0)+-28|0,n[rt>>2]=B,l=We*268435456):(l=We,B=n[rt>>2]|0),Zt=(B|0)<0?F:F+288|0,F=Zt;do Ge=~~l>>>0,n[F>>2]=Ge,F=F+4|0,l=(l-+(Ge>>>0))*1e9;while(l!=0);if((B|0)>0)for(M=Zt,j=F;;){if(O=(B|0)<29?B:29,B=j+-4|0,B>>>0>=M>>>0){F=0;do _e=K7(n[B>>2]|0,0,O|0)|0,_e=cT(_e|0,Ce|0,F|0,0)|0,Ge=Ce,Xe=AT(_e|0,Ge|0,1e9,0)|0,n[B>>2]=Xe,F=uT(_e|0,Ge|0,1e9,0)|0,B=B+-4|0;while(B>>>0>=M>>>0);F&&(M=M+-4|0,n[M>>2]=F)}for(F=j;!(F>>>0<=M>>>0);)if(B=F+-4|0,!(n[B>>2]|0))F=B;else break;if(B=(n[rt>>2]|0)-O|0,n[rt>>2]=B,(B|0)>0)j=F;else break}else M=Zt;if((B|0)<0){f=((k+25|0)/9|0)+1|0,Qe=(ct|0)==102;do{if(Oe=0-B|0,Oe=(Oe|0)<9?Oe:9,M>>>0>>0){O=(1<>>Oe,oe=0,B=M;do Ge=n[B>>2]|0,n[B>>2]=(Ge>>>Oe)+oe,oe=He(Ge&O,j)|0,B=B+4|0;while(B>>>0>>0);B=n[M>>2]|0?M:M+4|0,oe?(n[F>>2]=oe,M=B,B=F+4|0):(M=B,B=F)}else M=n[M>>2]|0?M:M+4|0,B=F;F=Qe?Zt:M,F=(B-F>>2|0)>(f|0)?F+(f<<2)|0:B,B=(n[rt>>2]|0)+Oe|0,n[rt>>2]=B}while((B|0)<0);B=M,f=F}else B=M,f=F;if(Ge=Zt,B>>>0>>0){if(F=(Ge-B>>2)*9|0,O=n[B>>2]|0,O>>>0>=10){M=10;do M=M*10|0,F=F+1|0;while(O>>>0>=M>>>0)}}else F=0;if(Qe=(ct|0)==103,Xe=(k|0)!=0,M=k-((ct|0)!=102?F:0)+((Xe&Qe)<<31>>31)|0,(M|0)<(((f-Ge>>2)*9|0)+-9|0)){if(M=M+9216|0,Oe=Zt+4+(((M|0)/9|0)+-1024<<2)|0,M=((M|0)%9|0)+1|0,(M|0)<9){O=10;do O=O*10|0,M=M+1|0;while((M|0)!=9)}else O=10;if(j=n[Oe>>2]|0,oe=(j>>>0)%(O>>>0)|0,M=(Oe+4|0)==(f|0),M&(oe|0)==0)M=Oe;else if(We=((j>>>0)/(O>>>0)|0)&1|0?9007199254740994:9007199254740992,_e=(O|0)/2|0,l=oe>>>0<_e>>>0?.5:M&(oe|0)==(_e|0)?1:1.5,ur&&(_e=(o[_r>>0]|0)==45,l=_e?-l:l,We=_e?-We:We),M=j-oe|0,n[Oe>>2]=M,We+l!=We){if(_e=M+O|0,n[Oe>>2]=_e,_e>>>0>999999999)for(F=Oe;M=F+-4|0,n[F>>2]=0,M>>>0>>0&&(B=B+-4|0,n[B>>2]=0),_e=(n[M>>2]|0)+1|0,n[M>>2]=_e,_e>>>0>999999999;)F=M;else M=Oe;if(F=(Ge-B>>2)*9|0,j=n[B>>2]|0,j>>>0>=10){O=10;do O=O*10|0,F=F+1|0;while(j>>>0>=O>>>0)}}else M=Oe;M=M+4|0,M=f>>>0>M>>>0?M:f,_e=B}else M=f,_e=B;for(ct=M;;){if(ct>>>0<=_e>>>0){rt=0;break}if(B=ct+-4|0,!(n[B>>2]|0))ct=B;else{rt=1;break}}f=0-F|0;do if(Qe)if(B=((Xe^1)&1)+k|0,(B|0)>(F|0)&(F|0)>-5?(O=m+-1|0,k=B+-1-F|0):(O=m+-2|0,k=B+-1|0),B=d&8,B)Oe=B;else{if(rt&&(Nt=n[ct+-4>>2]|0,(Nt|0)!=0))if((Nt>>>0)%10|0)M=0;else{M=0,B=10;do B=B*10|0,M=M+1|0;while(!((Nt>>>0)%(B>>>0)|0|0))}else M=9;if(B=((ct-Ge>>2)*9|0)+-9|0,(O|32|0)==102){Oe=B-M|0,Oe=(Oe|0)>0?Oe:0,k=(k|0)<(Oe|0)?k:Oe,Oe=0;break}else{Oe=B+F-M|0,Oe=(Oe|0)>0?Oe:0,k=(k|0)<(Oe|0)?k:Oe,Oe=0;break}}else O=m,Oe=d&8;while(!1);if(Qe=k|Oe,j=(Qe|0)!=0&1,oe=(O|32|0)==102,oe)Xe=0,B=(F|0)>0?F:0;else{if(B=(F|0)<0?f:F,B=nm(B,((B|0)<0)<<31>>31,kr)|0,M=kr,(M-B|0)<2)do B=B+-1|0,o[B>>0]=48;while((M-B|0)<2);o[B+-1>>0]=(F>>31&2)+43,B=B+-2|0,o[B>>0]=O,Xe=B,B=M-B|0}if(B=ur+1+k+j+B|0,Es(s,32,c,B,d),os(s,_r,ur),Es(s,48,c,B,d^65536),oe){O=_e>>>0>Zt>>>0?Zt:_e,Oe=lr+9|0,j=Oe,oe=lr+8|0,M=O;do{if(F=nm(n[M>>2]|0,0,Oe)|0,(M|0)==(O|0))(F|0)==(Oe|0)&&(o[oe>>0]=48,F=oe);else if(F>>>0>lr>>>0){sm(lr|0,48,F-Or|0)|0;do F=F+-1|0;while(F>>>0>lr>>>0)}os(s,F,j-F|0),M=M+4|0}while(M>>>0<=Zt>>>0);if(Qe|0&&os(s,5710,1),M>>>0>>0&(k|0)>0)for(;;){if(F=nm(n[M>>2]|0,0,Oe)|0,F>>>0>lr>>>0){sm(lr|0,48,F-Or|0)|0;do F=F+-1|0;while(F>>>0>lr>>>0)}if(os(s,F,(k|0)<9?k:9),M=M+4|0,F=k+-9|0,M>>>0>>0&(k|0)>9)k=F;else{k=F;break}}Es(s,48,k+9|0,9,0)}else{if(Qe=rt?ct:_e+4|0,(k|0)>-1){rt=lr+9|0,Oe=(Oe|0)==0,f=rt,j=0-Or|0,oe=lr+8|0,O=_e;do{F=nm(n[O>>2]|0,0,rt)|0,(F|0)==(rt|0)&&(o[oe>>0]=48,F=oe);do if((O|0)==(_e|0)){if(M=F+1|0,os(s,F,1),Oe&(k|0)<1){F=M;break}os(s,5710,1),F=M}else{if(F>>>0<=lr>>>0)break;sm(lr|0,48,F+j|0)|0;do F=F+-1|0;while(F>>>0>lr>>>0)}while(!1);Or=f-F|0,os(s,F,(k|0)>(Or|0)?Or:k),k=k-Or|0,O=O+4|0}while(O>>>0>>0&(k|0)>-1)}Es(s,48,k+18|0,18,0),os(s,Xe,kr-Xe|0)}Es(s,32,c,B,d^8192)}else lr=(m&32|0)!=0,B=ur+3|0,Es(s,32,c,B,d&-65537),os(s,_r,ur),os(s,l!=l|!1?lr?5686:5690:lr?5678:5682,3),Es(s,32,c,B,d^8192);while(!1);return C=Ln,((B|0)<(c|0)?c:B)|0}function q7(s){s=+s;var l=0;return E[D>>3]=s,l=n[D>>2]|0,Ce=n[D+4>>2]|0,l|0}function kUe(s,l){return s=+s,l=l|0,+ +j7(s,l)}function j7(s,l){s=+s,l=l|0;var c=0,f=0,d=0;switch(E[D>>3]=s,c=n[D>>2]|0,f=n[D+4>>2]|0,d=GD(c|0,f|0,52)|0,d&2047){case 0:{s!=0?(s=+j7(s*18446744073709552e3,l),c=(n[l>>2]|0)+-64|0):c=0,n[l>>2]=c;break}case 2047:break;default:n[l>>2]=(d&2047)+-1022,n[D>>2]=c,n[D+4>>2]=f&-2146435073|1071644672,s=+E[D>>3]}return+s}function QUe(s,l,c){s=s|0,l=l|0,c=c|0;do if(s){if(l>>>0<128){o[s>>0]=l,s=1;break}if(!(n[n[(FUe()|0)+188>>2]>>2]|0))if((l&-128|0)==57216){o[s>>0]=l,s=1;break}else{n[(rm()|0)>>2]=84,s=-1;break}if(l>>>0<2048){o[s>>0]=l>>>6|192,o[s+1>>0]=l&63|128,s=2;break}if(l>>>0<55296|(l&-8192|0)==57344){o[s>>0]=l>>>12|224,o[s+1>>0]=l>>>6&63|128,o[s+2>>0]=l&63|128,s=3;break}if((l+-65536|0)>>>0<1048576){o[s>>0]=l>>>18|240,o[s+1>>0]=l>>>12&63|128,o[s+2>>0]=l>>>6&63|128,o[s+3>>0]=l&63|128,s=4;break}else{n[(rm()|0)>>2]=84,s=-1;break}}else s=1;while(!1);return s|0}function FUe(){return oT()|0}function RUe(){return oT()|0}function TUe(s,l){s=s|0,l=l|0;var c=0,f=0;for(f=0;;){if((u[5712+f>>0]|0)==(s|0)){s=2;break}if(c=f+1|0,(c|0)==87){c=5800,f=87,s=5;break}else f=c}if((s|0)==2&&(f?(c=5800,s=5):c=5800),(s|0)==5)for(;;){do s=c,c=c+1|0;while(o[s>>0]|0);if(f=f+-1|0,f)s=5;else break}return LUe(c,n[l+20>>2]|0)|0}function LUe(s,l){return s=s|0,l=l|0,NUe(s,l)|0}function NUe(s,l){return s=s|0,l=l|0,l?l=OUe(n[l>>2]|0,n[l+4>>2]|0,s)|0:l=0,(l|0?l:s)|0}function OUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;oe=(n[s>>2]|0)+1794895138|0,m=O0(n[s+8>>2]|0,oe)|0,f=O0(n[s+12>>2]|0,oe)|0,d=O0(n[s+16>>2]|0,oe)|0;e:do if(m>>>0>>2>>>0&&(j=l-(m<<2)|0,f>>>0>>0&d>>>0>>0)&&!((d|f)&3|0)){for(j=f>>>2,O=d>>>2,M=0;;){if(k=m>>>1,F=M+k|0,B=F<<1,d=B+j|0,f=O0(n[s+(d<<2)>>2]|0,oe)|0,d=O0(n[s+(d+1<<2)>>2]|0,oe)|0,!(d>>>0>>0&f>>>0<(l-d|0)>>>0)){f=0;break e}if(o[s+(d+f)>>0]|0){f=0;break e}if(f=O7(c,s+d|0)|0,!f)break;if(f=(f|0)<0,(m|0)==1){f=0;break e}else M=f?M:F,m=f?k:m-k|0}f=B+O|0,d=O0(n[s+(f<<2)>>2]|0,oe)|0,f=O0(n[s+(f+1<<2)>>2]|0,oe)|0,f>>>0>>0&d>>>0<(l-f|0)>>>0?f=o[s+(f+d)>>0]|0?0:s+f|0:f=0}else f=0;while(!1);return f|0}function O0(s,l){s=s|0,l=l|0;var c=0;return c=X7(s|0)|0,(l|0?c:s)|0}function MUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=c+16|0,d=n[f>>2]|0,d?m=5:UUe(c)|0?f=0:(d=n[f>>2]|0,m=5);e:do if((m|0)==5){if(k=c+20|0,B=n[k>>2]|0,f=B,(d-B|0)>>>0>>0){f=YD[n[c+36>>2]&7](c,s,l)|0;break}t:do if((o[c+75>>0]|0)>-1){for(B=l;;){if(!B){m=0,d=s;break t}if(d=B+-1|0,(o[s+d>>0]|0)==10)break;B=d}if(f=YD[n[c+36>>2]&7](c,s,B)|0,f>>>0>>0)break e;m=B,d=s+B|0,l=l-B|0,f=n[k>>2]|0}else m=0,d=s;while(!1);br(f|0,d|0,l|0)|0,n[k>>2]=(n[k>>2]|0)+l,f=m+l|0}while(!1);return f|0}function UUe(s){s=s|0;var l=0,c=0;return l=s+74|0,c=o[l>>0]|0,o[l>>0]=c+255|c,l=n[s>>2]|0,l&8?(n[s>>2]=l|32,s=-1):(n[s+8>>2]=0,n[s+4>>2]=0,c=n[s+44>>2]|0,n[s+28>>2]=c,n[s+20>>2]=c,n[s+16>>2]=c+(n[s+48>>2]|0),s=0),s|0}function Yn(s,l){s=y(s),l=y(l);var c=0,f=0;c=G7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=G7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?l:s;break}else{s=s>2]=s,n[D>>2]|0|0}function M0(s,l){s=y(s),l=y(l);var c=0,f=0;c=W7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=W7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?s:l;break}else{s=s>2]=s,n[D>>2]|0|0}function lT(s,l){s=y(s),l=y(l);var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0;m=(h[D>>2]=s,n[D>>2]|0),k=(h[D>>2]=l,n[D>>2]|0),c=m>>>23&255,B=k>>>23&255,F=m&-2147483648,d=k<<1;e:do if(d|0&&!((c|0)==255|((_Ue(l)|0)&2147483647)>>>0>2139095040)){if(f=m<<1,f>>>0<=d>>>0)return l=y(s*y(0)),y((f|0)==(d|0)?l:s);if(c)f=m&8388607|8388608;else{if(c=m<<9,(c|0)>-1){f=c,c=0;do c=c+-1|0,f=f<<1;while((f|0)>-1)}else c=0;f=m<<1-c}if(B)k=k&8388607|8388608;else{if(m=k<<9,(m|0)>-1){d=0;do d=d+-1|0,m=m<<1;while((m|0)>-1)}else d=0;B=d,k=k<<1-d}d=f-k|0,m=(d|0)>-1;t:do if((c|0)>(B|0)){for(;;){if(m)if(d)f=d;else break;if(f=f<<1,c=c+-1|0,d=f-k|0,m=(d|0)>-1,(c|0)<=(B|0))break t}l=y(s*y(0));break e}while(!1);if(m)if(d)f=d;else{l=y(s*y(0));break}if(f>>>0<8388608)do f=f<<1,c=c+-1|0;while(f>>>0<8388608);(c|0)>0?c=f+-8388608|c<<23:c=f>>>(1-c|0),l=(n[D>>2]=c|F,y(h[D>>2]))}else M=3;while(!1);return(M|0)==3&&(l=y(s*l),l=y(l/l)),y(l)}function _Ue(s){return s=y(s),h[D>>2]=s,n[D>>2]|0|0}function HUe(s,l){return s=s|0,l=l|0,M7(n[582]|0,s,l)|0}function Zr(s){s=s|0,Tt()}function im(s){s=s|0}function qUe(s,l){return s=s|0,l=l|0,0}function jUe(s){return s=s|0,(Y7(s+4|0)|0)==-1?(ef[n[(n[s>>2]|0)+8>>2]&127](s),s=1):s=0,s|0}function Y7(s){s=s|0;var l=0;return l=n[s>>2]|0,n[s>>2]=l+-1,l+-1|0}function Rp(s){s=s|0,jUe(s)|0&&GUe(s)}function GUe(s){s=s|0;var l=0;l=s+8|0,n[l>>2]|0&&(Y7(l)|0)!=-1||ef[n[(n[s>>2]|0)+16>>2]&127](s)}function Yt(s){s=s|0;var l=0;for(l=s|0?s:1;s=_D(l)|0,!(s|0);){if(s=YUe()|0,!s){s=0;break}aW[s&0]()}return s|0}function V7(s){return s=s|0,Yt(s)|0}function yt(s){s=s|0,HD(s)}function WUe(s){s=s|0,(o[s+11>>0]|0)<0&&yt(n[s>>2]|0)}function YUe(){var s=0;return s=n[2923]|0,n[2923]=s+0,s|0}function VUe(){}function jD(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,f=l-f-(c>>>0>s>>>0|0)>>>0,Ce=f,s-c>>>0|0|0}function cT(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,c=s+c>>>0,Ce=l+f+(c>>>0>>0|0)>>>0,c|0|0}function sm(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(m=s+c|0,l=l&255,(c|0)>=67){for(;s&3;)o[s>>0]=l,s=s+1|0;for(f=m&-4|0,d=f-64|0,B=l|l<<8|l<<16|l<<24;(s|0)<=(d|0);)n[s>>2]=B,n[s+4>>2]=B,n[s+8>>2]=B,n[s+12>>2]=B,n[s+16>>2]=B,n[s+20>>2]=B,n[s+24>>2]=B,n[s+28>>2]=B,n[s+32>>2]=B,n[s+36>>2]=B,n[s+40>>2]=B,n[s+44>>2]=B,n[s+48>>2]=B,n[s+52>>2]=B,n[s+56>>2]=B,n[s+60>>2]=B,s=s+64|0;for(;(s|0)<(f|0);)n[s>>2]=B,s=s+4|0}for(;(s|0)<(m|0);)o[s>>0]=l,s=s+1|0;return m-c|0}function K7(s,l,c){return s=s|0,l=l|0,c=c|0,(c|0)<32?(Ce=l<>>32-c,s<>>c,s>>>c|(l&(1<>>c-32|0)}function br(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;if((c|0)>=8192)return FA(s|0,l|0,c|0)|0;if(m=s|0,d=s+c|0,(s&3)==(l&3)){for(;s&3;){if(!c)return m|0;o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0,c=c-1|0}for(c=d&-4|0,f=c-64|0;(s|0)<=(f|0);)n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2],n[s+16>>2]=n[l+16>>2],n[s+20>>2]=n[l+20>>2],n[s+24>>2]=n[l+24>>2],n[s+28>>2]=n[l+28>>2],n[s+32>>2]=n[l+32>>2],n[s+36>>2]=n[l+36>>2],n[s+40>>2]=n[l+40>>2],n[s+44>>2]=n[l+44>>2],n[s+48>>2]=n[l+48>>2],n[s+52>>2]=n[l+52>>2],n[s+56>>2]=n[l+56>>2],n[s+60>>2]=n[l+60>>2],s=s+64|0,l=l+64|0;for(;(s|0)<(c|0);)n[s>>2]=n[l>>2],s=s+4|0,l=l+4|0}else for(c=d-4|0;(s|0)<(c|0);)o[s>>0]=o[l>>0]|0,o[s+1>>0]=o[l+1>>0]|0,o[s+2>>0]=o[l+2>>0]|0,o[s+3>>0]=o[l+3>>0]|0,s=s+4|0,l=l+4|0;for(;(s|0)<(d|0);)o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0;return m|0}function J7(s){s=s|0;var l=0;return l=o[N+(s&255)>>0]|0,(l|0)<8?l|0:(l=o[N+(s>>8&255)>>0]|0,(l|0)<8?l+8|0:(l=o[N+(s>>16&255)>>0]|0,(l|0)<8?l+16|0:(o[N+(s>>>24)>>0]|0)+24|0))}function z7(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0;if(O=s,F=l,M=F,B=c,oe=f,k=oe,!M)return m=(d|0)!=0,k?m?(n[d>>2]=s|0,n[d+4>>2]=l&0,oe=0,d=0,Ce=oe,d|0):(oe=0,d=0,Ce=oe,d|0):(m&&(n[d>>2]=(O>>>0)%(B>>>0),n[d+4>>2]=0),oe=0,d=(O>>>0)/(B>>>0)>>>0,Ce=oe,d|0);m=(k|0)==0;do if(B){if(!m){if(m=(P(k|0)|0)-(P(M|0)|0)|0,m>>>0<=31){j=m+1|0,k=31-m|0,l=m-31>>31,B=j,s=O>>>(j>>>0)&l|M<>>(j>>>0)&l,m=0,k=O<>2]=s|0,n[d+4>>2]=F|l&0,oe=0,d=0,Ce=oe,d|0):(oe=0,d=0,Ce=oe,d|0)}if(m=B-1|0,m&B|0){k=(P(B|0)|0)+33-(P(M|0)|0)|0,Oe=64-k|0,j=32-k|0,F=j>>31,We=k-32|0,l=We>>31,B=k,s=j-1>>31&M>>>(We>>>0)|(M<>>(k>>>0))&l,l=l&M>>>(k>>>0),m=O<>>(We>>>0))&F|O<>31;break}return d|0&&(n[d>>2]=m&O,n[d+4>>2]=0),(B|0)==1?(We=F|l&0,Oe=s|0|0,Ce=We,Oe|0):(Oe=J7(B|0)|0,We=M>>>(Oe>>>0)|0,Oe=M<<32-Oe|O>>>(Oe>>>0)|0,Ce=We,Oe|0)}else{if(m)return d|0&&(n[d>>2]=(M>>>0)%(B>>>0),n[d+4>>2]=0),We=0,Oe=(M>>>0)/(B>>>0)>>>0,Ce=We,Oe|0;if(!O)return d|0&&(n[d>>2]=0,n[d+4>>2]=(M>>>0)%(k>>>0)),We=0,Oe=(M>>>0)/(k>>>0)>>>0,Ce=We,Oe|0;if(m=k-1|0,!(m&k))return d|0&&(n[d>>2]=s|0,n[d+4>>2]=m&M|l&0),We=0,Oe=M>>>((J7(k|0)|0)>>>0),Ce=We,Oe|0;if(m=(P(k|0)|0)-(P(M|0)|0)|0,m>>>0<=30){l=m+1|0,k=31-m|0,B=l,s=M<>>(l>>>0),l=M>>>(l>>>0),m=0,k=O<>2]=s|0,n[d+4>>2]=F|l&0,We=0,Oe=0,Ce=We,Oe|0):(We=0,Oe=0,Ce=We,Oe|0)}while(!1);if(!B)M=k,F=0,k=0;else{j=c|0|0,O=oe|f&0,M=cT(j|0,O|0,-1,-1)|0,c=Ce,F=k,k=0;do f=F,F=m>>>31|F<<1,m=k|m<<1,f=s<<1|f>>>31|0,oe=s>>>31|l<<1|0,jD(M|0,c|0,f|0,oe|0)|0,Oe=Ce,We=Oe>>31|((Oe|0)<0?-1:0)<<1,k=We&1,s=jD(f|0,oe|0,We&j|0,(((Oe|0)<0?-1:0)>>31|((Oe|0)<0?-1:0)<<1)&O|0)|0,l=Ce,B=B-1|0;while(B|0);M=F,F=0}return B=0,d|0&&(n[d>>2]=s,n[d+4>>2]=l),We=(m|0)>>>31|(M|B)<<1|(B<<1|m>>>31)&0|F,Oe=(m<<1|0)&-2|k,Ce=We,Oe|0}function uT(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,z7(s,l,c,f,0)|0}function Tp(s){s=s|0;var l=0,c=0;return c=s+15&-16|0,l=n[w>>2]|0,s=l+c|0,(c|0)>0&(s|0)<(l|0)|(s|0)<0?(se()|0,yc(12),-1):(n[w>>2]=s,(s|0)>($()|0)&&!(X()|0)?(n[w>>2]=l,yc(12),-1):l|0)}function rw(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if((l|0)<(s|0)&(s|0)<(l+c|0)){for(f=s,l=l+c|0,s=s+c|0;(c|0)>0;)s=s-1|0,l=l-1|0,c=c-1|0,o[s>>0]=o[l>>0]|0;s=f}else br(s,l,c)|0;return s|0}function AT(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;return m=C,C=C+16|0,d=m|0,z7(s,l,c,f,d)|0,C=m,Ce=n[d+4>>2]|0,n[d>>2]|0|0}function X7(s){return s=s|0,(s&255)<<24|(s>>8&255)<<16|(s>>16&255)<<8|s>>>24|0}function KUe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,Z7[s&1](l|0,c|0,f|0,d|0,m|0)}function JUe(s,l,c){s=s|0,l=l|0,c=y(c),$7[s&1](l|0,y(c))}function zUe(s,l,c){s=s|0,l=l|0,c=+c,eW[s&31](l|0,+c)}function XUe(s,l,c,f){return s=s|0,l=l|0,c=y(c),f=y(f),y(tW[s&0](l|0,y(c),y(f)))}function ZUe(s,l){s=s|0,l=l|0,ef[s&127](l|0)}function $Ue(s,l,c){s=s|0,l=l|0,c=c|0,tf[s&31](l|0,c|0)}function e3e(s,l){return s=s|0,l=l|0,_0[s&31](l|0)|0}function t3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,rW[s&1](l|0,+c,+f,d|0)}function r3e(s,l,c,f){s=s|0,l=l|0,c=+c,f=+f,N3e[s&1](l|0,+c,+f)}function n3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,YD[s&7](l|0,c|0,f|0)|0}function i3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,+O3e[s&1](l|0,c|0,f|0)}function s3e(s,l){return s=s|0,l=l|0,+nW[s&15](l|0)}function o3e(s,l,c){return s=s|0,l=l|0,c=+c,M3e[s&1](l|0,+c)|0}function a3e(s,l,c){return s=s|0,l=l|0,c=c|0,pT[s&15](l|0,c|0)|0}function l3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=+f,d=+d,m=m|0,U3e[s&1](l|0,c|0,+f,+d,m|0)}function c3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,_3e[s&1](l|0,c|0,f|0,d|0,m|0,B|0)}function u3e(s,l,c){return s=s|0,l=l|0,c=c|0,+iW[s&7](l|0,c|0)}function A3e(s){return s=s|0,VD[s&7]()|0}function f3e(s,l,c,f,d,m){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,sW[s&1](l|0,c|0,f|0,d|0,m|0)|0}function p3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=+d,H3e[s&1](l|0,c|0,f|0,+d)}function h3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,oW[s&1](l|0,c|0,y(f),d|0,y(m),B|0)}function g3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,sw[s&15](l|0,c|0,f|0)}function d3e(s){s=s|0,aW[s&0]()}function m3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,lW[s&15](l|0,c|0,+f)}function y3e(s,l,c){return s=s|0,l=+l,c=+c,q3e[s&1](+l,+c)|0}function E3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,hT[s&15](l|0,c|0,f|0,d|0)}function C3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,R(0)}function I3e(s,l){s=s|0,l=y(l),R(1)}function Ca(s,l){s=s|0,l=+l,R(2)}function w3e(s,l,c){return s=s|0,l=y(l),c=y(c),R(3),Ze}function Cr(s){s=s|0,R(4)}function nw(s,l){s=s|0,l=l|0,R(5)}function tl(s){return s=s|0,R(6),0}function B3e(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,R(7)}function v3e(s,l,c){s=s|0,l=+l,c=+c,R(8)}function D3e(s,l,c){return s=s|0,l=l|0,c=c|0,R(9),0}function S3e(s,l,c){return s=s|0,l=l|0,c=c|0,R(10),0}function U0(s){return s=s|0,R(11),0}function P3e(s,l){return s=s|0,l=+l,R(12),0}function iw(s,l){return s=s|0,l=l|0,R(13),0}function x3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,R(14)}function b3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,R(15)}function fT(s,l){return s=s|0,l=l|0,R(16),0}function k3e(){return R(17),0}function Q3e(s,l,c,f,d){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,R(18),0}function F3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,R(19)}function R3e(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0,R(20)}function WD(s,l,c){s=s|0,l=l|0,c=c|0,R(21)}function T3e(){R(22)}function om(s,l,c){s=s|0,l=l|0,c=+c,R(23)}function L3e(s,l){return s=+s,l=+l,R(24),0}function am(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,R(25)}var Z7=[C3e,QNe],$7=[I3e,Od],eW=[Ca,B0,vp,UI,_I,HI,qI,ku,Wd,jI,Qu,v0,D0,GI,WI,bc,S0,YI,Yd,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca],tW=[w3e],ef=[Cr,im,ADe,fDe,pDe,qxe,jxe,Gxe,oLe,aLe,lLe,yNe,ENe,CNe,_4e,H4e,q4e,qa,w0,LI,ir,bl,bD,kD,tDe,IDe,RDe,XDe,pSe,kSe,VSe,lPe,BPe,UPe,txe,mxe,Rxe,abe,Bbe,Ube,tke,mke,Rke,Zke,pQe,PQe,jQe,dD,CFe,NFe,tRe,ERe,TRe,tTe,ATe,hTe,QTe,TTe,XTe,uLe,pLe,kLe,KLe,M5,bOe,oMe,IMe,NMe,i4e,E4e,k4e,R4e,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr],tf=[nw,qd,YF,NI,OI,Pr,Os,Oi,ms,is,Gd,Bp,KI,ID,b0,JF,zF,wD,BD,$F,Fu,ne,rQe,dQe,BRe,FOe,rNe,w7,nw,nw,nw,nw],_0=[tl,mUe,_d,x0,Kd,qo,mD,Dp,VI,KF,ED,Jd,vD,eR,Zd,YQe,MRe,RLe,NOe,Za,tl,tl,tl,tl,tl,tl,tl,tl,tl,tl,tl,tl],rW=[B3e,sR],N3e=[v3e,eLe],YD=[D3e,N7,yUe,IUe,TSe,Abe,vFe,_Me],O3e=[S3e,sxe],nW=[U0,Sp,CD,JA,oR,v,S,Q,H,Y,U0,U0,U0,U0,U0,U0],M3e=[P3e,lTe],pT=[iw,qUe,DD,sDe,tSe,zSe,APe,Oxe,Pbe,QQe,Md,DMe,iw,iw,iw,iw],U3e=[x3e,ODe],_3e=[b3e,l4e],iW=[fT,XF,Be,Ue,ft,Ixe,fT,fT],VD=[k3e,jt,Ud,gD,yTe,MTe,mLe,O4e],sW=[Q3e,kd],H3e=[F3e,ske],oW=[R3e,tR],sw=[WD,oo,yD,ZF,Qc,mSe,SPe,Ike,Oke,WF,eOe,uMe,B4e,WD,WD,WD],aW=[T3e],lW=[om,VF,jd,KA,MI,kc,Vd,P0,jbe,_Fe,iTe,om,om,om,om,om],q3e=[L3e,iLe],hT=[am,jPe,eFe,sRe,VRe,vTe,GTe,vLe,$Le,qOe,K4e,am,am,am,am,am];return{_llvm_bswap_i32:X7,dynCall_idd:y3e,dynCall_i:A3e,_i64Subtract:jD,___udivdi3:uT,dynCall_vif:JUe,setThrew:No,dynCall_viii:g3e,_bitshift64Lshr:GD,_bitshift64Shl:K7,dynCall_vi:ZUe,dynCall_viiddi:l3e,dynCall_diii:i3e,dynCall_iii:a3e,_memset:sm,_sbrk:Tp,_memcpy:br,__GLOBAL__sub_I_Yoga_cpp:FI,dynCall_vii:$Ue,___uremdi3:AT,dynCall_vid:zUe,stackAlloc:ca,_nbind_init:sUe,getTempRet0:TA,dynCall_di:s3e,dynCall_iid:o3e,setTempRet0:RA,_i64Add:cT,dynCall_fiff:XUe,dynCall_iiii:n3e,_emscripten_get_global_libc:dUe,dynCall_viid:m3e,dynCall_viiid:p3e,dynCall_viififi:h3e,dynCall_ii:e3e,__GLOBAL__sub_I_Binding_cc:IOe,dynCall_viiii:E3e,dynCall_iiiiii:f3e,stackSave:mu,dynCall_viiiii:KUe,__GLOBAL__sub_I_nbind_cc:wr,dynCall_vidd:r3e,_free:HD,runPostSets:VUe,dynCall_viiiiii:c3e,establishStackSpace:dn,_memmove:rw,stackRestore:Bl,_malloc:_D,__GLOBAL__sub_I_common_cc:HLe,dynCall_viddi:t3e,dynCall_dii:u3e,dynCall_v:d3e}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(t){this.name="ExitStatus",this.message="Program terminated with exit("+t+")",this.status=t}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function t(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=t)},Module.callMain=Module.callMain=function t(e){e=e||[],ensureInitRuntime();var r=e.length+1;function o(){for(var p=0;p<3;p++)a.push(0)}var a=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];o();for(var n=0;n0||(preRun(),runDependencies>0)||Module.calledRun)return;function e(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(t),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),e()},1)):e()}Module.run=Module.run=run;function exit(t,e){e&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=t,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(t)),ENVIRONMENT_IS_NODE&&process.exit(t),Module.quit(t,new ExitStatus(t)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(t){Module.onAbort&&Module.onAbort(t),t!==void 0?(Module.print(t),Module.printErr(t),t=JSON.stringify(t)):t="",ABORT=!0,EXITSTATUS=1;var e=` -If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,r="abort("+t+") at "+stackTrace()+e;throw abortDecorators&&abortDecorators.forEach(function(o){r=o(r,t)}),r}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var id=_((nVt,PCe)=>{"use strict";var byt=DCe(),kyt=SCe(),pq=!1,hq=null;kyt({},function(t,e){if(!pq){if(pq=!0,t)throw t;hq=e}});if(!pq)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");PCe.exports=byt(hq.bind,hq.lib)});var dq=_((iVt,gq)=>{"use strict";var xCe=t=>Number.isNaN(t)?!1:t>=4352&&(t<=4447||t===9001||t===9002||11904<=t&&t<=12871&&t!==12351||12880<=t&&t<=19903||19968<=t&&t<=42182||43360<=t&&t<=43388||44032<=t&&t<=55203||63744<=t&&t<=64255||65040<=t&&t<=65049||65072<=t&&t<=65131||65281<=t&&t<=65376||65504<=t&&t<=65510||110592<=t&&t<=110593||127488<=t&&t<=127569||131072<=t&&t<=262141);gq.exports=xCe;gq.exports.default=xCe});var kCe=_((sVt,bCe)=>{"use strict";bCe.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var SB=_((oVt,mq)=>{"use strict";var Qyt=hP(),Fyt=dq(),Ryt=kCe(),QCe=t=>{if(typeof t!="string"||t.length===0||(t=Qyt(t),t.length===0))return 0;t=t.replace(Ryt()," ");let e=0;for(let r=0;r=127&&o<=159||o>=768&&o<=879||(o>65535&&r++,e+=Fyt(o)?2:1)}return e};mq.exports=QCe;mq.exports.default=QCe});var Eq=_((aVt,yq)=>{"use strict";var Tyt=SB(),FCe=t=>{let e=0;for(let r of t.split(` -`))e=Math.max(e,Tyt(r));return e};yq.exports=FCe;yq.exports.default=FCe});var RCe=_(PB=>{"use strict";var Lyt=PB&&PB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(PB,"__esModule",{value:!0});var Nyt=Lyt(Eq()),Cq={};PB.default=t=>{if(t.length===0)return{width:0,height:0};if(Cq[t])return Cq[t];let e=Nyt.default(t),r=t.split(` -`).length;return Cq[t]={width:e,height:r},{width:e,height:r}}});var TCe=_(xB=>{"use strict";var Oyt=xB&&xB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(xB,"__esModule",{value:!0});var In=Oyt(id()),Myt=(t,e)=>{"position"in e&&t.setPositionType(e.position==="absolute"?In.default.POSITION_TYPE_ABSOLUTE:In.default.POSITION_TYPE_RELATIVE)},Uyt=(t,e)=>{"marginLeft"in e&&t.setMargin(In.default.EDGE_START,e.marginLeft||0),"marginRight"in e&&t.setMargin(In.default.EDGE_END,e.marginRight||0),"marginTop"in e&&t.setMargin(In.default.EDGE_TOP,e.marginTop||0),"marginBottom"in e&&t.setMargin(In.default.EDGE_BOTTOM,e.marginBottom||0)},_yt=(t,e)=>{"paddingLeft"in e&&t.setPadding(In.default.EDGE_LEFT,e.paddingLeft||0),"paddingRight"in e&&t.setPadding(In.default.EDGE_RIGHT,e.paddingRight||0),"paddingTop"in e&&t.setPadding(In.default.EDGE_TOP,e.paddingTop||0),"paddingBottom"in e&&t.setPadding(In.default.EDGE_BOTTOM,e.paddingBottom||0)},Hyt=(t,e)=>{var r;"flexGrow"in e&&t.setFlexGrow((r=e.flexGrow)!==null&&r!==void 0?r:0),"flexShrink"in e&&t.setFlexShrink(typeof e.flexShrink=="number"?e.flexShrink:1),"flexDirection"in e&&(e.flexDirection==="row"&&t.setFlexDirection(In.default.FLEX_DIRECTION_ROW),e.flexDirection==="row-reverse"&&t.setFlexDirection(In.default.FLEX_DIRECTION_ROW_REVERSE),e.flexDirection==="column"&&t.setFlexDirection(In.default.FLEX_DIRECTION_COLUMN),e.flexDirection==="column-reverse"&&t.setFlexDirection(In.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in e&&(typeof e.flexBasis=="number"?t.setFlexBasis(e.flexBasis):typeof e.flexBasis=="string"?t.setFlexBasisPercent(Number.parseInt(e.flexBasis,10)):t.setFlexBasis(NaN)),"alignItems"in e&&((e.alignItems==="stretch"||!e.alignItems)&&t.setAlignItems(In.default.ALIGN_STRETCH),e.alignItems==="flex-start"&&t.setAlignItems(In.default.ALIGN_FLEX_START),e.alignItems==="center"&&t.setAlignItems(In.default.ALIGN_CENTER),e.alignItems==="flex-end"&&t.setAlignItems(In.default.ALIGN_FLEX_END)),"alignSelf"in e&&((e.alignSelf==="auto"||!e.alignSelf)&&t.setAlignSelf(In.default.ALIGN_AUTO),e.alignSelf==="flex-start"&&t.setAlignSelf(In.default.ALIGN_FLEX_START),e.alignSelf==="center"&&t.setAlignSelf(In.default.ALIGN_CENTER),e.alignSelf==="flex-end"&&t.setAlignSelf(In.default.ALIGN_FLEX_END)),"justifyContent"in e&&((e.justifyContent==="flex-start"||!e.justifyContent)&&t.setJustifyContent(In.default.JUSTIFY_FLEX_START),e.justifyContent==="center"&&t.setJustifyContent(In.default.JUSTIFY_CENTER),e.justifyContent==="flex-end"&&t.setJustifyContent(In.default.JUSTIFY_FLEX_END),e.justifyContent==="space-between"&&t.setJustifyContent(In.default.JUSTIFY_SPACE_BETWEEN),e.justifyContent==="space-around"&&t.setJustifyContent(In.default.JUSTIFY_SPACE_AROUND))},qyt=(t,e)=>{var r,o;"width"in e&&(typeof e.width=="number"?t.setWidth(e.width):typeof e.width=="string"?t.setWidthPercent(Number.parseInt(e.width,10)):t.setWidthAuto()),"height"in e&&(typeof e.height=="number"?t.setHeight(e.height):typeof e.height=="string"?t.setHeightPercent(Number.parseInt(e.height,10)):t.setHeightAuto()),"minWidth"in e&&(typeof e.minWidth=="string"?t.setMinWidthPercent(Number.parseInt(e.minWidth,10)):t.setMinWidth((r=e.minWidth)!==null&&r!==void 0?r:0)),"minHeight"in e&&(typeof e.minHeight=="string"?t.setMinHeightPercent(Number.parseInt(e.minHeight,10)):t.setMinHeight((o=e.minHeight)!==null&&o!==void 0?o:0))},jyt=(t,e)=>{"display"in e&&t.setDisplay(e.display==="flex"?In.default.DISPLAY_FLEX:In.default.DISPLAY_NONE)},Gyt=(t,e)=>{if("borderStyle"in e){let r=typeof e.borderStyle=="string"?1:0;t.setBorder(In.default.EDGE_TOP,r),t.setBorder(In.default.EDGE_BOTTOM,r),t.setBorder(In.default.EDGE_LEFT,r),t.setBorder(In.default.EDGE_RIGHT,r)}};xB.default=(t,e={})=>{Myt(t,e),Uyt(t,e),_yt(t,e),Hyt(t,e),qyt(t,e),jyt(t,e),Gyt(t,e)}});var OCe=_((uVt,NCe)=>{"use strict";var bB=SB(),Wyt=hP(),Yyt=qw(),wq=new Set(["\x1B","\x9B"]),Vyt=39,LCe=t=>`${wq.values().next().value}[${t}m`,Kyt=t=>t.split(" ").map(e=>bB(e)),Iq=(t,e,r)=>{let o=[...e],a=!1,n=bB(Wyt(t[t.length-1]));for(let[u,A]of o.entries()){let p=bB(A);if(n+p<=r?t[t.length-1]+=A:(t.push(A),n=0),wq.has(A))a=!0;else if(a&&A==="m"){a=!1;continue}a||(n+=p,n===r&&u0&&t.length>1&&(t[t.length-2]+=t.pop())},Jyt=t=>{let e=t.split(" "),r=e.length;for(;r>0&&!(bB(e[r-1])>0);)r--;return r===e.length?t:e.slice(0,r).join(" ")+e.slice(r).join("")},zyt=(t,e,r={})=>{if(r.trim!==!1&&t.trim()==="")return"";let o="",a="",n,u=Kyt(t),A=[""];for(let[p,h]of t.split(" ").entries()){r.trim!==!1&&(A[A.length-1]=A[A.length-1].trimLeft());let E=bB(A[A.length-1]);if(p!==0&&(E>=e&&(r.wordWrap===!1||r.trim===!1)&&(A.push(""),E=0),(E>0||r.trim===!1)&&(A[A.length-1]+=" ",E++)),r.hard&&u[p]>e){let w=e-E,D=1+Math.floor((u[p]-w-1)/e);Math.floor((u[p]-1)/e)e&&E>0&&u[p]>0){if(r.wordWrap===!1&&Ee&&r.wordWrap===!1){Iq(A,h,e);continue}A[A.length-1]+=h}r.trim!==!1&&(A=A.map(Jyt)),o=A.join(` -`);for(let[p,h]of[...o].entries()){if(a+=h,wq.has(h)){let w=parseFloat(/\d[^m]*/.exec(o.slice(p,p+4)));n=w===Vyt?null:w}let E=Yyt.codes.get(Number(n));n&&E&&(o[p+1]===` -`?a+=LCe(E):h===` -`&&(a+=LCe(n)))}return a};NCe.exports=(t,e,r)=>String(t).normalize().replace(/\r\n/g,` -`).split(` -`).map(o=>zyt(o,e,r)).join(` -`)});var _Ce=_((AVt,UCe)=>{"use strict";var MCe="[\uD800-\uDBFF][\uDC00-\uDFFF]",Xyt=t=>t&&t.exact?new RegExp(`^${MCe}$`):new RegExp(MCe,"g");UCe.exports=Xyt});var Bq=_((fVt,GCe)=>{"use strict";var Zyt=dq(),$yt=_Ce(),HCe=qw(),jCe=["\x1B","\x9B"],vQ=t=>`${jCe[0]}[${t}m`,qCe=(t,e,r)=>{let o=[];t=[...t];for(let a of t){let n=a;a.match(";")&&(a=a.split(";")[0][0]+"0");let u=HCe.codes.get(parseInt(a,10));if(u){let A=t.indexOf(u.toString());A>=0?t.splice(A,1):o.push(vQ(e?u:n))}else if(e){o.push(vQ(0));break}else o.push(vQ(n))}if(e&&(o=o.filter((a,n)=>o.indexOf(a)===n),r!==void 0)){let a=vQ(HCe.codes.get(parseInt(r,10)));o=o.reduce((n,u)=>u===a?[u,...n]:[...n,u],[])}return o.join("")};GCe.exports=(t,e,r)=>{let o=[...t.normalize()],a=[];r=typeof r=="number"?r:o.length;let n=!1,u,A=0,p="";for(let[h,E]of o.entries()){let w=!1;if(jCe.includes(E)){let D=/\d[^m]*/.exec(t.slice(h,h+18));u=D&&D.length>0?D[0]:void 0,Ae&&A<=r)p+=E;else if(A===e&&!n&&u!==void 0)p=qCe(a);else if(A>=r){p+=qCe(a,!0,u);break}}return p}});var YCe=_((pVt,WCe)=>{"use strict";var _h=Bq(),eEt=SB();function DQ(t,e,r){if(t.charAt(e)===" ")return e;for(let o=1;o<=3;o++)if(r){if(t.charAt(e+o)===" ")return e+o}else if(t.charAt(e-o)===" ")return e-o;return e}WCe.exports=(t,e,r)=>{r={position:"end",preferTruncationOnSpace:!1,...r};let{position:o,space:a,preferTruncationOnSpace:n}=r,u="\u2026",A=1;if(typeof t!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof t}`);if(typeof e!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof e}`);if(e<1)return"";if(e===1)return u;let p=eEt(t);if(p<=e)return t;if(o==="start"){if(n){let h=DQ(t,p-e+1,!0);return u+_h(t,h,p).trim()}return a===!0&&(u+=" ",A=2),u+_h(t,p-e+A,p)}if(o==="middle"){a===!0&&(u=" "+u+" ",A=3);let h=Math.floor(e/2);if(n){let E=DQ(t,h),w=DQ(t,p-(e-h)+1,!0);return _h(t,0,E)+u+_h(t,w,p).trim()}return _h(t,0,h)+u+_h(t,p-(e-h)+A,p)}if(o==="end"){if(n){let h=DQ(t,e-1);return _h(t,0,h)+u}return a===!0&&(u=" "+u,A=2),_h(t,0,e-A)+u}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${o}`)}});var Dq=_(kB=>{"use strict";var VCe=kB&&kB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(kB,"__esModule",{value:!0});var tEt=VCe(OCe()),rEt=VCe(YCe()),vq={};kB.default=(t,e,r)=>{let o=t+String(e)+String(r);if(vq[o])return vq[o];let a=t;if(r==="wrap"&&(a=tEt.default(t,e,{trim:!1,hard:!0})),r.startsWith("truncate")){let n="end";r==="truncate-middle"&&(n="middle"),r==="truncate-start"&&(n="start"),a=rEt.default(t,e,{position:n})}return vq[o]=a,a}});var Pq=_(Sq=>{"use strict";Object.defineProperty(Sq,"__esModule",{value:!0});var KCe=t=>{let e="";if(t.childNodes.length>0)for(let r of t.childNodes){let o="";r.nodeName==="#text"?o=r.nodeValue:((r.nodeName==="ink-text"||r.nodeName==="ink-virtual-text")&&(o=KCe(r)),o.length>0&&typeof r.internal_transform=="function"&&(o=r.internal_transform(o))),e+=o}return e};Sq.default=KCe});var xq=_(Ei=>{"use strict";var QB=Ei&&Ei.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Ei,"__esModule",{value:!0});Ei.setTextNodeValue=Ei.createTextNode=Ei.setStyle=Ei.setAttribute=Ei.removeChildNode=Ei.insertBeforeNode=Ei.appendChildNode=Ei.createNode=Ei.TEXT_NAME=void 0;var nEt=QB(id()),JCe=QB(RCe()),iEt=QB(TCe()),sEt=QB(Dq()),oEt=QB(Pq());Ei.TEXT_NAME="#text";Ei.createNode=t=>{var e;let r={nodeName:t,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:t==="ink-virtual-text"?void 0:nEt.default.Node.create()};return t==="ink-text"&&((e=r.yogaNode)===null||e===void 0||e.setMeasureFunc(aEt.bind(null,r))),r};Ei.appendChildNode=(t,e)=>{var r;e.parentNode&&Ei.removeChildNode(e.parentNode,e),e.parentNode=t,t.childNodes.push(e),e.yogaNode&&((r=t.yogaNode)===null||r===void 0||r.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&SQ(t)};Ei.insertBeforeNode=(t,e,r)=>{var o,a;e.parentNode&&Ei.removeChildNode(e.parentNode,e),e.parentNode=t;let n=t.childNodes.indexOf(r);if(n>=0){t.childNodes.splice(n,0,e),e.yogaNode&&((o=t.yogaNode)===null||o===void 0||o.insertChild(e.yogaNode,n));return}t.childNodes.push(e),e.yogaNode&&((a=t.yogaNode)===null||a===void 0||a.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&SQ(t)};Ei.removeChildNode=(t,e)=>{var r,o;e.yogaNode&&((o=(r=e.parentNode)===null||r===void 0?void 0:r.yogaNode)===null||o===void 0||o.removeChild(e.yogaNode)),e.parentNode=null;let a=t.childNodes.indexOf(e);a>=0&&t.childNodes.splice(a,1),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&SQ(t)};Ei.setAttribute=(t,e,r)=>{t.attributes[e]=r};Ei.setStyle=(t,e)=>{t.style=e,t.yogaNode&&iEt.default(t.yogaNode,e)};Ei.createTextNode=t=>{let e={nodeName:"#text",nodeValue:t,yogaNode:void 0,parentNode:null,style:{}};return Ei.setTextNodeValue(e,t),e};var aEt=function(t,e){var r,o;let a=t.nodeName==="#text"?t.nodeValue:oEt.default(t),n=JCe.default(a);if(n.width<=e||n.width>=1&&e>0&&e<1)return n;let u=(o=(r=t.style)===null||r===void 0?void 0:r.textWrap)!==null&&o!==void 0?o:"wrap",A=sEt.default(a,e,u);return JCe.default(A)},zCe=t=>{var e;if(!(!t||!t.parentNode))return(e=t.yogaNode)!==null&&e!==void 0?e:zCe(t.parentNode)},SQ=t=>{let e=zCe(t);e?.markDirty()};Ei.setTextNodeValue=(t,e)=>{typeof e!="string"&&(e=String(e)),t.nodeValue=e,SQ(t)}});var tIe=_(FB=>{"use strict";var eIe=FB&&FB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(FB,"__esModule",{value:!0});var XCe=uq(),lEt=eIe(ECe()),ZCe=eIe(id()),ko=xq(),$Ce=t=>{t?.unsetMeasureFunc(),t?.freeRecursive()};FB.default=lEt.default({schedulePassiveEffects:XCe.unstable_scheduleCallback,cancelPassiveEffects:XCe.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>null,preparePortalMount:()=>null,clearContainer:()=>!1,shouldDeprioritizeSubtree:()=>!1,resetAfterCommit:t=>{if(t.isStaticDirty){t.isStaticDirty=!1,typeof t.onImmediateRender=="function"&&t.onImmediateRender();return}typeof t.onRender=="function"&&t.onRender()},getChildHostContext:(t,e)=>{let r=t.isInsideText,o=e==="ink-text"||e==="ink-virtual-text";return r===o?t:{isInsideText:o}},shouldSetTextContent:()=>!1,createInstance:(t,e,r,o)=>{if(o.isInsideText&&t==="ink-box")throw new Error(" can\u2019t be nested inside component");let a=t==="ink-text"&&o.isInsideText?"ink-virtual-text":t,n=ko.createNode(a);for(let[u,A]of Object.entries(e))u!=="children"&&(u==="style"?ko.setStyle(n,A):u==="internal_transform"?n.internal_transform=A:u==="internal_static"?n.internal_static=!0:ko.setAttribute(n,u,A));return n},createTextInstance:(t,e,r)=>{if(!r.isInsideText)throw new Error(`Text string "${t}" must be rendered inside component`);return ko.createTextNode(t)},resetTextContent:()=>{},hideTextInstance:t=>{ko.setTextNodeValue(t,"")},unhideTextInstance:(t,e)=>{ko.setTextNodeValue(t,e)},getPublicInstance:t=>t,hideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(ZCe.default.DISPLAY_NONE)},unhideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(ZCe.default.DISPLAY_FLEX)},appendInitialChild:ko.appendChildNode,appendChild:ko.appendChildNode,insertBefore:ko.insertBeforeNode,finalizeInitialChildren:(t,e,r,o)=>(t.internal_static&&(o.isStaticDirty=!0,o.staticNode=t),!1),supportsMutation:!0,appendChildToContainer:ko.appendChildNode,insertInContainerBefore:ko.insertBeforeNode,removeChildFromContainer:(t,e)=>{ko.removeChildNode(t,e),$Ce(e.yogaNode)},prepareUpdate:(t,e,r,o,a)=>{t.internal_static&&(a.isStaticDirty=!0);let n={},u=Object.keys(o);for(let A of u)if(o[A]!==r[A]){if(A==="style"&&typeof o.style=="object"&&typeof r.style=="object"){let h=o.style,E=r.style,w=Object.keys(h);for(let D of w){if(D==="borderStyle"||D==="borderColor"){if(typeof n.style!="object"){let b={};n.style=b}n.style.borderStyle=h.borderStyle,n.style.borderColor=h.borderColor}if(h[D]!==E[D]){if(typeof n.style!="object"){let b={};n.style=b}n.style[D]=h[D]}}continue}n[A]=o[A]}return n},commitUpdate:(t,e)=>{for(let[r,o]of Object.entries(e))r!=="children"&&(r==="style"?ko.setStyle(t,o):r==="internal_transform"?t.internal_transform=o:r==="internal_static"?t.internal_static=!0:ko.setAttribute(t,r,o))},commitTextUpdate:(t,e,r)=>{ko.setTextNodeValue(t,r)},removeChild:(t,e)=>{ko.removeChildNode(t,e),$Ce(e.yogaNode)}})});var nIe=_((yVt,rIe)=>{"use strict";rIe.exports=(t,e=1,r)=>{if(r={indent:" ",includeEmptyLines:!1,...r},typeof t!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof t}\``);if(typeof e!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof e}\``);if(typeof r.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof r.indent}\``);if(e===0)return t;let o=r.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return t.replace(o,r.indent.repeat(e))}});var iIe=_(RB=>{"use strict";var cEt=RB&&RB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(RB,"__esModule",{value:!0});var PQ=cEt(id());RB.default=t=>t.getComputedWidth()-t.getComputedPadding(PQ.default.EDGE_LEFT)-t.getComputedPadding(PQ.default.EDGE_RIGHT)-t.getComputedBorder(PQ.default.EDGE_LEFT)-t.getComputedBorder(PQ.default.EDGE_RIGHT)});var sIe=_((CVt,uEt)=>{uEt.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var aIe=_((IVt,bq)=>{"use strict";var oIe=sIe();bq.exports=oIe;bq.exports.default=oIe});var cIe=_((wVt,lIe)=>{"use strict";var AEt=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u="";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},fEt=(t,e,r,o)=>{let a=0,n="";do{let u=t[o-1]==="\r";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\r -`:` -`)+r,a=o+1,o=t.indexOf(` -`,a)}while(o!==-1);return n+=t.substr(a),n};lIe.exports={stringReplaceAll:AEt,stringEncaseCRLFWithFirstIndex:fEt}});var hIe=_((BVt,pIe)=>{"use strict";var pEt=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,uIe=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,hEt=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,gEt=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,dEt=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function fIe(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):dEt.get(t)||t}function mEt(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(hEt))r.push(a[2].replace(gEt,(A,p,h)=>p?fIe(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function yEt(t){uIe.lastIndex=0;let e=[],r;for(;(r=uIe.exec(t))!==null;){let o=r[1];if(r[2]){let a=mEt(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function AIe(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}pIe.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(pEt,(n,u,A,p,h,E)=>{if(u)a.push(fIe(u));else if(p){let w=a.join("");a=[],o.push(r.length===0?w:AIe(t,r)(w)),r.push({inverse:A,styles:yEt(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");o.push(AIe(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),o.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return o.join("")}});var FQ=_((vVt,CIe)=>{"use strict";var TB=qw(),{stdout:Qq,stderr:Fq}=$L(),{stringReplaceAll:EEt,stringEncaseCRLFWithFirstIndex:CEt}=cIe(),{isArray:xQ}=Array,dIe=["ansi","ansi","ansi256","ansi16m"],DC=Object.create(null),IEt=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let r=Qq?Qq.level:0;t.level=e.level===void 0?r:e.level},Rq=class{constructor(e){return mIe(e)}},mIe=t=>{let e={};return IEt(e,t),e.template=(...r)=>EIe(e.template,...r),Object.setPrototypeOf(e,bQ.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=Rq,e.template};function bQ(t){return mIe(t)}for(let[t,e]of Object.entries(TB))DC[t]={get(){let r=kQ(this,Tq(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};DC.visible={get(){let t=kQ(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var yIe=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of yIe)DC[t]={get(){let{level:e}=this;return function(...r){let o=Tq(TB.color[dIe[e]][t](...r),TB.color.close,this._styler);return kQ(this,o,this._isEmpty)}}};for(let t of yIe){let e="bg"+t[0].toUpperCase()+t.slice(1);DC[e]={get(){let{level:r}=this;return function(...o){let a=Tq(TB.bgColor[dIe[r]][t](...o),TB.bgColor.close,this._styler);return kQ(this,a,this._isEmpty)}}}}var wEt=Object.defineProperties(()=>{},{...DC,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),Tq=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},kQ=(t,e,r)=>{let o=(...a)=>xQ(a[0])&&xQ(a[0].raw)?gIe(o,EIe(o,...a)):gIe(o,a.length===1?""+a[0]:a.join(" "));return Object.setPrototypeOf(o,wEt),o._generator=t,o._styler=e,o._isEmpty=r,o},gIe=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=EEt(e,r.close,r.open),r=r.parent;let n=e.indexOf(` -`);return n!==-1&&(e=CEt(e,a,o,n)),o+e+a},kq,EIe=(t,...e)=>{let[r]=e;if(!xQ(r)||!xQ(r.raw))return e.join(" ");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";var BEt=NB&&NB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(NB,"__esModule",{value:!0});var LB=BEt(FQ()),vEt=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,DEt=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,RQ=(t,e)=>e==="foreground"?t:"bg"+t[0].toUpperCase()+t.slice(1);NB.default=(t,e,r)=>{if(!e)return t;if(e in LB.default){let a=RQ(e,r);return LB.default[a](t)}if(e.startsWith("#")){let a=RQ("hex",r);return LB.default[a](e)(t)}if(e.startsWith("ansi")){let a=DEt.exec(e);if(!a)return t;let n=RQ(a[1],r),u=Number(a[2]);return LB.default[n](u)(t)}if(e.startsWith("rgb")||e.startsWith("hsl")||e.startsWith("hsv")||e.startsWith("hwb")){let a=vEt.exec(e);if(!a)return t;let n=RQ(a[1],r),u=Number(a[2]),A=Number(a[3]),p=Number(a[4]);return LB.default[n](u,A,p)(t)}return t}});var wIe=_(OB=>{"use strict";var IIe=OB&&OB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(OB,"__esModule",{value:!0});var SEt=IIe(aIe()),Nq=IIe(Lq());OB.default=(t,e,r,o)=>{if(typeof r.style.borderStyle=="string"){let a=r.yogaNode.getComputedWidth(),n=r.yogaNode.getComputedHeight(),u=r.style.borderColor,A=SEt.default[r.style.borderStyle],p=Nq.default(A.topLeft+A.horizontal.repeat(a-2)+A.topRight,u,"foreground"),h=(Nq.default(A.vertical,u,"foreground")+` -`).repeat(n-2),E=Nq.default(A.bottomLeft+A.horizontal.repeat(a-2)+A.bottomRight,u,"foreground");o.write(t,e,p,{transformers:[]}),o.write(t,e+1,h,{transformers:[]}),o.write(t+a-1,e+1,h,{transformers:[]}),o.write(t,e+n-1,E,{transformers:[]})}}});var vIe=_(MB=>{"use strict";var sd=MB&&MB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(MB,"__esModule",{value:!0});var PEt=sd(id()),xEt=sd(Eq()),bEt=sd(nIe()),kEt=sd(Dq()),QEt=sd(iIe()),FEt=sd(Pq()),REt=sd(wIe()),TEt=(t,e)=>{var r;let o=(r=t.childNodes[0])===null||r===void 0?void 0:r.yogaNode;if(o){let a=o.getComputedLeft(),n=o.getComputedTop();e=` -`.repeat(n)+bEt.default(e,a)}return e},BIe=(t,e,r)=>{var o;let{offsetX:a=0,offsetY:n=0,transformers:u=[],skipStaticElements:A}=r;if(A&&t.internal_static)return;let{yogaNode:p}=t;if(p){if(p.getDisplay()===PEt.default.DISPLAY_NONE)return;let h=a+p.getComputedLeft(),E=n+p.getComputedTop(),w=u;if(typeof t.internal_transform=="function"&&(w=[t.internal_transform,...u]),t.nodeName==="ink-text"){let D=FEt.default(t);if(D.length>0){let b=xEt.default(D),C=QEt.default(p);if(b>C){let T=(o=t.style.textWrap)!==null&&o!==void 0?o:"wrap";D=kEt.default(D,C,T)}D=TEt(t,D),e.write(h,E,D,{transformers:w})}return}if(t.nodeName==="ink-box"&&REt.default(h,E,t,e),t.nodeName==="ink-root"||t.nodeName==="ink-box")for(let D of t.childNodes)BIe(D,e,{offsetX:h,offsetY:E,transformers:w,skipStaticElements:A})}};MB.default=BIe});var PIe=_(UB=>{"use strict";var SIe=UB&&UB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(UB,"__esModule",{value:!0});var DIe=SIe(Bq()),LEt=SIe(SB()),Oq=class{constructor(e){this.writes=[];let{width:r,height:o}=e;this.width=r,this.height=o}write(e,r,o,a){let{transformers:n}=a;o&&this.writes.push({x:e,y:r,text:o,transformers:n})}get(){let e=[];for(let o=0;oo.trimRight()).join(` -`),height:e.length}}};UB.default=Oq});var kIe=_(_B=>{"use strict";var Mq=_B&&_B.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(_B,"__esModule",{value:!0});var NEt=Mq(id()),xIe=Mq(vIe()),bIe=Mq(PIe());_B.default=(t,e)=>{var r;if(t.yogaNode.setWidth(e),t.yogaNode){t.yogaNode.calculateLayout(void 0,void 0,NEt.default.DIRECTION_LTR);let o=new bIe.default({width:t.yogaNode.getComputedWidth(),height:t.yogaNode.getComputedHeight()});xIe.default(t,o,{skipStaticElements:!0});let a;!((r=t.staticNode)===null||r===void 0)&&r.yogaNode&&(a=new bIe.default({width:t.staticNode.yogaNode.getComputedWidth(),height:t.staticNode.yogaNode.getComputedHeight()}),xIe.default(t.staticNode,a,{skipStaticElements:!1}));let{output:n,height:u}=o.get();return{output:n,outputHeight:u,staticOutput:a?`${a.get().output} -`:""}}return{output:"",outputHeight:0,staticOutput:""}}});var TIe=_((kVt,RIe)=>{"use strict";var QIe=ve("stream"),FIe=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],Uq={},OEt=t=>{let e=new QIe.PassThrough,r=new QIe.PassThrough;e.write=a=>t("stdout",a),r.write=a=>t("stderr",a);let o=new console.Console(e,r);for(let a of FIe)Uq[a]=console[a],console[a]=o[a];return()=>{for(let a of FIe)console[a]=Uq[a];Uq={}}};RIe.exports=OEt});var Hq=_(_q=>{"use strict";Object.defineProperty(_q,"__esModule",{value:!0});_q.default=new WeakMap});var jq=_(qq=>{"use strict";Object.defineProperty(qq,"__esModule",{value:!0});var MEt=ln(),LIe=MEt.createContext({exit:()=>{}});LIe.displayName="InternalAppContext";qq.default=LIe});var Wq=_(Gq=>{"use strict";Object.defineProperty(Gq,"__esModule",{value:!0});var UEt=ln(),NIe=UEt.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});NIe.displayName="InternalStdinContext";Gq.default=NIe});var Vq=_(Yq=>{"use strict";Object.defineProperty(Yq,"__esModule",{value:!0});var _Et=ln(),OIe=_Et.createContext({stdout:void 0,write:()=>{}});OIe.displayName="InternalStdoutContext";Yq.default=OIe});var Jq=_(Kq=>{"use strict";Object.defineProperty(Kq,"__esModule",{value:!0});var HEt=ln(),MIe=HEt.createContext({stderr:void 0,write:()=>{}});MIe.displayName="InternalStderrContext";Kq.default=MIe});var TQ=_(zq=>{"use strict";Object.defineProperty(zq,"__esModule",{value:!0});var qEt=ln(),UIe=qEt.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{},focus:()=>{}});UIe.displayName="InternalFocusContext";zq.default=UIe});var HIe=_((OVt,_Ie)=>{"use strict";var jEt=/[|\\{}()[\]^$+*?.-]/g;_Ie.exports=t=>{if(typeof t!="string")throw new TypeError("Expected a string");return t.replace(jEt,"\\$&")}});var WIe=_((MVt,GIe)=>{"use strict";var GEt=HIe(),WEt=typeof process=="object"&&process&&typeof process.cwd=="function"?process.cwd():".",jIe=[].concat(ve("module").builtinModules,"bootstrap_node","node").map(t=>new RegExp(`(?:\\((?:node:)?${t}(?:\\.js)?:\\d+:\\d+\\)$|^\\s*at (?:node:)?${t}(?:\\.js)?:\\d+:\\d+$)`));jIe.push(/\((?:node:)?internal\/[^:]+:\d+:\d+\)$/,/\s*at (?:node:)?internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var Xq=class t{constructor(e){e={ignoredPackages:[],...e},"internals"in e||(e.internals=t.nodeInternals()),"cwd"in e||(e.cwd=WEt),this._cwd=e.cwd.replace(/\\/g,"/"),this._internals=[].concat(e.internals,YEt(e.ignoredPackages)),this._wrapCallSite=e.wrapCallSite||!1}static nodeInternals(){return[...jIe]}clean(e,r=0){r=" ".repeat(r),Array.isArray(e)||(e=e.split(` -`)),!/^\s*at /.test(e[0])&&/^\s*at /.test(e[1])&&(e=e.slice(1));let o=!1,a=null,n=[];return e.forEach(u=>{if(u=u.replace(/\\/g,"/"),this._internals.some(p=>p.test(u)))return;let A=/^\s*at /.test(u);o?u=u.trimEnd().replace(/^(\s+)at /,"$1"):(u=u.trim(),A&&(u=u.slice(3))),u=u.replace(`${this._cwd}/`,""),u&&(A?(a&&(n.push(a),a=null),n.push(u)):(o=!0,a=u))}),n.map(u=>`${r}${u} -`).join("")}captureString(e,r=this.captureString){typeof e=="function"&&(r=e,e=1/0);let{stackTraceLimit:o}=Error;e&&(Error.stackTraceLimit=e);let a={};Error.captureStackTrace(a,r);let{stack:n}=a;return Error.stackTraceLimit=o,this.clean(n)}capture(e,r=this.capture){typeof e=="function"&&(r=e,e=1/0);let{prepareStackTrace:o,stackTraceLimit:a}=Error;Error.prepareStackTrace=(A,p)=>this._wrapCallSite?p.map(this._wrapCallSite):p,e&&(Error.stackTraceLimit=e);let n={};Error.captureStackTrace(n,r);let{stack:u}=n;return Object.assign(Error,{prepareStackTrace:o,stackTraceLimit:a}),u}at(e=this.at){let[r]=this.capture(1,e);if(!r)return{};let o={line:r.getLineNumber(),column:r.getColumnNumber()};qIe(o,r.getFileName(),this._cwd),r.isConstructor()&&(o.constructor=!0),r.isEval()&&(o.evalOrigin=r.getEvalOrigin()),r.isNative()&&(o.native=!0);let a;try{a=r.getTypeName()}catch{}a&&a!=="Object"&&a!=="[object Object]"&&(o.type=a);let n=r.getFunctionName();n&&(o.function=n);let u=r.getMethodName();return u&&n!==u&&(o.method=u),o}parseLine(e){let r=e&&e.match(VEt);if(!r)return null;let o=r[1]==="new",a=r[2],n=r[3],u=r[4],A=Number(r[5]),p=Number(r[6]),h=r[7],E=r[8],w=r[9],D=r[10]==="native",b=r[11]===")",C,T={};if(E&&(T.line=Number(E)),w&&(T.column=Number(w)),b&&h){let N=0;for(let U=h.length-1;U>0;U--)if(h.charAt(U)===")")N++;else if(h.charAt(U)==="("&&h.charAt(U-1)===" "&&(N--,N===-1&&h.charAt(U-1)===" ")){let J=h.slice(0,U-1);h=h.slice(U+1),a+=` (${J}`;break}}if(a){let N=a.match(KEt);N&&(a=N[1],C=N[2])}return qIe(T,h,this._cwd),o&&(T.constructor=!0),n&&(T.evalOrigin=n,T.evalLine=A,T.evalColumn=p,T.evalFile=u&&u.replace(/\\/g,"/")),D&&(T.native=!0),a&&(T.function=a),C&&a!==C&&(T.method=C),T}};function qIe(t,e,r){e&&(e=e.replace(/\\/g,"/"),e.startsWith(`${r}/`)&&(e=e.slice(r.length+1)),t.file=e)}function YEt(t){if(t.length===0)return[];let e=t.map(r=>GEt(r));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${e.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var VEt=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),KEt=/^(.*?) \[as (.*?)\]$/;GIe.exports=Xq});var VIe=_((UVt,YIe)=>{"use strict";YIe.exports=(t,e)=>t.replace(/^\t+/gm,r=>" ".repeat(r.length*(e||2)))});var JIe=_((_Vt,KIe)=>{"use strict";var JEt=VIe(),zEt=(t,e)=>{let r=[],o=t-e,a=t+e;for(let n=o;n<=a;n++)r.push(n);return r};KIe.exports=(t,e,r)=>{if(typeof t!="string")throw new TypeError("Source code is missing.");if(!e||e<1)throw new TypeError("Line number must start from `1`.");if(t=JEt(t).split(/\r?\n/),!(e>t.length))return r={around:3,...r},zEt(e,r.around).filter(o=>t[o-1]!==void 0).map(o=>({line:o,value:t[o-1]}))}});var LQ=_(lu=>{"use strict";var XEt=lu&&lu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),ZEt=lu&&lu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),$Et=lu&&lu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&XEt(e,t,r);return ZEt(e,t),e},eCt=lu&&lu.__rest||function(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,o=Object.getOwnPropertySymbols(t);a{var{children:r}=t,o=eCt(t,["children"]);let a=Object.assign(Object.assign({},o),{marginLeft:o.marginLeft||o.marginX||o.margin||0,marginRight:o.marginRight||o.marginX||o.margin||0,marginTop:o.marginTop||o.marginY||o.margin||0,marginBottom:o.marginBottom||o.marginY||o.margin||0,paddingLeft:o.paddingLeft||o.paddingX||o.padding||0,paddingRight:o.paddingRight||o.paddingX||o.padding||0,paddingTop:o.paddingTop||o.paddingY||o.padding||0,paddingBottom:o.paddingBottom||o.paddingY||o.padding||0});return zIe.default.createElement("ink-box",{ref:e,style:a},r)});Zq.displayName="Box";Zq.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};lu.default=Zq});var tj=_(HB=>{"use strict";var $q=HB&&HB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(HB,"__esModule",{value:!0});var tCt=$q(ln()),SC=$q(FQ()),XIe=$q(Lq()),ej=({color:t,backgroundColor:e,dimColor:r,bold:o,italic:a,underline:n,strikethrough:u,inverse:A,wrap:p,children:h})=>{if(h==null)return null;let E=w=>(r&&(w=SC.default.dim(w)),t&&(w=XIe.default(w,t,"foreground")),e&&(w=XIe.default(w,e,"background")),o&&(w=SC.default.bold(w)),a&&(w=SC.default.italic(w)),n&&(w=SC.default.underline(w)),u&&(w=SC.default.strikethrough(w)),A&&(w=SC.default.inverse(w)),w);return tCt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:p},internal_transform:E},h)};ej.displayName="Text";ej.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};HB.default=ej});var twe=_(cu=>{"use strict";var rCt=cu&&cu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),nCt=cu&&cu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),iCt=cu&&cu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&rCt(e,t,r);return nCt(e,t),e},qB=cu&&cu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(cu,"__esModule",{value:!0});var ZIe=iCt(ve("fs")),ps=qB(ln()),$Ie=qB(WIe()),sCt=qB(JIe()),Jf=qB(LQ()),mA=qB(tj()),ewe=new $Ie.default({cwd:process.cwd(),internals:$Ie.default.nodeInternals()}),oCt=({error:t})=>{let e=t.stack?t.stack.split(` -`).slice(1):void 0,r=e?ewe.parseLine(e[0]):void 0,o,a=0;if(r?.file&&r?.line&&ZIe.existsSync(r.file)){let n=ZIe.readFileSync(r.file,"utf8");if(o=sCt.default(n,r.line),o)for(let{line:u}of o)a=Math.max(a,String(u).length)}return ps.default.createElement(Jf.default,{flexDirection:"column",padding:1},ps.default.createElement(Jf.default,null,ps.default.createElement(mA.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),ps.default.createElement(mA.default,null," ",t.message)),r&&ps.default.createElement(Jf.default,{marginTop:1},ps.default.createElement(mA.default,{dimColor:!0},r.file,":",r.line,":",r.column)),r&&o&&ps.default.createElement(Jf.default,{marginTop:1,flexDirection:"column"},o.map(({line:n,value:u})=>ps.default.createElement(Jf.default,{key:n},ps.default.createElement(Jf.default,{width:a+1},ps.default.createElement(mA.default,{dimColor:n!==r.line,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0},String(n).padStart(a," "),":")),ps.default.createElement(mA.default,{key:n,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0}," "+u)))),t.stack&&ps.default.createElement(Jf.default,{marginTop:1,flexDirection:"column"},t.stack.split(` -`).slice(1).map(n=>{let u=ewe.parseLine(n);return u?ps.default.createElement(Jf.default,{key:n},ps.default.createElement(mA.default,{dimColor:!0},"- "),ps.default.createElement(mA.default,{dimColor:!0,bold:!0},u.function),ps.default.createElement(mA.default,{dimColor:!0,color:"gray"}," ","(",u.file,":",u.line,":",u.column,")")):ps.default.createElement(Jf.default,{key:n},ps.default.createElement(mA.default,{dimColor:!0},"- "),ps.default.createElement(mA.default,{dimColor:!0,bold:!0},n))})))};cu.default=oCt});var nwe=_(uu=>{"use strict";var aCt=uu&&uu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),lCt=uu&&uu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),cCt=uu&&uu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&aCt(e,t,r);return lCt(e,t),e},ad=uu&&uu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(uu,"__esModule",{value:!0});var od=cCt(ln()),rwe=ad(Z6()),uCt=ad(jq()),ACt=ad(Wq()),fCt=ad(Vq()),pCt=ad(Jq()),hCt=ad(TQ()),gCt=ad(twe()),dCt=" ",mCt="\x1B[Z",yCt="\x1B",NQ=class extends od.PureComponent{constructor(){super(...arguments),this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=e=>{let{stdin:r}=this.props;if(!this.isRawModeSupported())throw r===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. -Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink. -Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(r.setEncoding("utf8"),e){this.rawModeEnabledCount===0&&(r.addListener("data",this.handleInput),r.resume(),r.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount===0&&(r.setRawMode(!1),r.removeListener("data",this.handleInput),r.pause())},this.handleInput=e=>{e===""&&this.props.exitOnCtrlC&&this.handleExit(),e===yCt&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(e===dCt&&this.focusNext(),e===mCt&&this.focusPrevious())},this.handleExit=e=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(e)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focus=e=>{this.setState(r=>r.focusables.some(a=>a?.id===e)?{activeFocusId:e}:r)},this.focusNext=()=>{this.setState(e=>{var r;let o=(r=e.focusables[0])===null||r===void 0?void 0:r.id;return{activeFocusId:this.findNextFocusable(e)||o}})},this.focusPrevious=()=>{this.setState(e=>{var r;let o=(r=e.focusables[e.focusables.length-1])===null||r===void 0?void 0:r.id;return{activeFocusId:this.findPreviousFocusable(e)||o}})},this.addFocusable=(e,{autoFocus:r})=>{this.setState(o=>{let a=o.activeFocusId;return!a&&r&&(a=e),{activeFocusId:a,focusables:[...o.focusables,{id:e,isActive:!0}]}})},this.removeFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.filter(o=>o.id!==e)}))},this.activateFocusable=e=>{this.setState(r=>({focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!0})}))},this.deactivateFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!1})}))},this.findNextFocusable=e=>{var r;let o=e.focusables.findIndex(a=>a.id===e.activeFocusId);for(let a=o+1;a{var r;let o=e.focusables.findIndex(a=>a.id===e.activeFocusId);for(let a=o-1;a>=0;a--)if(!((r=e.focusables[a])===null||r===void 0)&&r.isActive)return e.focusables[a].id}}static getDerivedStateFromError(e){return{error:e}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return od.default.createElement(uCt.default.Provider,{value:{exit:this.handleExit}},od.default.createElement(ACt.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},od.default.createElement(fCt.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},od.default.createElement(pCt.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},od.default.createElement(hCt.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious,focus:this.focus}},this.state.error?od.default.createElement(gCt.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){rwe.default.hide(this.props.stdout)}componentWillUnmount(){rwe.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(e){this.handleExit(e)}};uu.default=NQ;NQ.displayName="InternalApp"});var owe=_(Au=>{"use strict";var ECt=Au&&Au.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),CCt=Au&&Au.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),ICt=Au&&Au.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&ECt(e,t,r);return CCt(e,t),e},fu=Au&&Au.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Au,"__esModule",{value:!0});var wCt=fu(ln()),iwe=WM(),BCt=fu(tCe()),vCt=fu(V6()),DCt=fu(aCe()),SCt=fu(cCe()),rj=fu(tIe()),PCt=fu(kIe()),xCt=fu(X6()),bCt=fu(TIe()),kCt=ICt(xq()),QCt=fu(Hq()),FCt=fu(nwe()),PC=process.env.CI==="false"?!1:DCt.default,swe=()=>{},nj=class{constructor(e){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:r,outputHeight:o,staticOutput:a}=PCt.default(this.rootNode,this.options.stdout.columns||80),n=a&&a!==` -`;if(this.options.debug){n&&(this.fullStaticOutput+=a),this.options.stdout.write(this.fullStaticOutput+r);return}if(PC){n&&this.options.stdout.write(a),this.lastOutput=r;return}if(n&&(this.fullStaticOutput+=a),o>=this.options.stdout.rows){this.options.stdout.write(vCt.default.clearTerminal+this.fullStaticOutput+r),this.lastOutput=r;return}n&&(this.log.clear(),this.options.stdout.write(a),this.log(r)),!n&&r!==this.lastOutput&&this.throttledLog(r),this.lastOutput=r},SCt.default(this),this.options=e,this.rootNode=kCt.createNode("ink-root"),this.rootNode.onRender=e.debug?this.onRender:iwe(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=BCt.default.create(e.stdout),this.throttledLog=e.debug?this.log:iwe(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=rj.default.createContainer(this.rootNode,0,!1,null),this.unsubscribeExit=xCt.default(this.unmount,{alwaysLast:!1}),e.patchConsole&&this.patchConsole(),PC||(e.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{e.stdout.off("resize",this.onRender)})}render(e){let r=wCt.default.createElement(FCt.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},e);rj.default.updateContainer(r,this.container,null,swe)}writeToStdout(e){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(e+this.fullStaticOutput+this.lastOutput);return}if(PC){this.options.stdout.write(e);return}this.log.clear(),this.options.stdout.write(e),this.log(this.lastOutput)}}writeToStderr(e){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(e),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(PC){this.options.stderr.write(e);return}this.log.clear(),this.options.stderr.write(e),this.log(this.lastOutput)}}unmount(e){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),PC?this.options.stdout.write(this.lastOutput+` -`):this.options.debug||this.log.done(),this.isUnmounted=!0,rj.default.updateContainer(null,this.container,null,swe),QCt.default.delete(this.options.stdout),e instanceof Error?this.rejectExitPromise(e):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((e,r)=>{this.resolveExitPromise=e,this.rejectExitPromise=r})),this.exitPromise}clear(){!PC&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=bCt.default((e,r)=>{e==="stdout"&&this.writeToStdout(r),e==="stderr"&&(r.startsWith("The above error occurred")||this.writeToStderr(r))}))}};Au.default=nj});var lwe=_(jB=>{"use strict";var awe=jB&&jB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(jB,"__esModule",{value:!0});var RCt=awe(owe()),OQ=awe(Hq()),TCt=ve("stream"),LCt=(t,e)=>{let r=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},NCt(e)),o=OCt(r.stdout,()=>new RCt.default(r));return o.render(t),{rerender:o.render,unmount:()=>o.unmount(),waitUntilExit:o.waitUntilExit,cleanup:()=>OQ.default.delete(r.stdout),clear:o.clear}};jB.default=LCt;var NCt=(t={})=>t instanceof TCt.Stream?{stdout:t,stdin:process.stdin}:t,OCt=(t,e)=>{let r;return OQ.default.has(t)?r=OQ.default.get(t):(r=e(),OQ.default.set(t,r)),r}});var uwe=_(zf=>{"use strict";var MCt=zf&&zf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),UCt=zf&&zf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),_Ct=zf&&zf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&MCt(e,t,r);return UCt(e,t),e};Object.defineProperty(zf,"__esModule",{value:!0});var GB=_Ct(ln()),cwe=t=>{let{items:e,children:r,style:o}=t,[a,n]=GB.useState(0),u=GB.useMemo(()=>e.slice(a),[e,a]);GB.useLayoutEffect(()=>{n(e.length)},[e.length]);let A=u.map((h,E)=>r(h,a+E)),p=GB.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},o),[o]);return GB.default.createElement("ink-box",{internal_static:!0,style:p},A)};cwe.displayName="Static";zf.default=cwe});var fwe=_(WB=>{"use strict";var HCt=WB&&WB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(WB,"__esModule",{value:!0});var qCt=HCt(ln()),Awe=({children:t,transform:e})=>t==null?null:qCt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:e},t);Awe.displayName="Transform";WB.default=Awe});var hwe=_(YB=>{"use strict";var jCt=YB&&YB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(YB,"__esModule",{value:!0});var GCt=jCt(ln()),pwe=({count:t=1})=>GCt.default.createElement("ink-text",null,` -`.repeat(t));pwe.displayName="Newline";YB.default=pwe});var mwe=_(VB=>{"use strict";var gwe=VB&&VB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(VB,"__esModule",{value:!0});var WCt=gwe(ln()),YCt=gwe(LQ()),dwe=()=>WCt.default.createElement(YCt.default,{flexGrow:1});dwe.displayName="Spacer";VB.default=dwe});var MQ=_(KB=>{"use strict";var VCt=KB&&KB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(KB,"__esModule",{value:!0});var KCt=ln(),JCt=VCt(Wq()),zCt=()=>KCt.useContext(JCt.default);KB.default=zCt});var Ewe=_(JB=>{"use strict";var XCt=JB&&JB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(JB,"__esModule",{value:!0});var ywe=ln(),ZCt=XCt(MQ()),$Ct=(t,e={})=>{let{stdin:r,setRawMode:o,internal_exitOnCtrlC:a}=ZCt.default();ywe.useEffect(()=>{if(e.isActive!==!1)return o(!0),()=>{o(!1)}},[e.isActive,o]),ywe.useEffect(()=>{if(e.isActive===!1)return;let n=u=>{let A=String(u),p={upArrow:A==="\x1B[A",downArrow:A==="\x1B[B",leftArrow:A==="\x1B[D",rightArrow:A==="\x1B[C",pageDown:A==="\x1B[6~",pageUp:A==="\x1B[5~",return:A==="\r",escape:A==="\x1B",ctrl:!1,shift:!1,tab:A===" "||A==="\x1B[Z",backspace:A==="\b",delete:A==="\x7F"||A==="\x1B[3~",meta:!1};A<=""&&!p.return&&(A=String.fromCharCode(A.charCodeAt(0)+97-1),p.ctrl=!0),A.startsWith("\x1B")&&(A=A.slice(1),p.meta=!0);let h=A>="A"&&A<="Z",E=A>="\u0410"&&A<="\u042F";A.length===1&&(h||E)&&(p.shift=!0),p.tab&&A==="[Z"&&(p.shift=!0),(p.tab||p.backspace||p.delete)&&(A=""),(!(A==="c"&&p.ctrl)||!a)&&t(A,p)};return r?.on("data",n),()=>{r?.off("data",n)}},[e.isActive,r,a,t])};JB.default=$Ct});var Cwe=_(zB=>{"use strict";var eIt=zB&&zB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(zB,"__esModule",{value:!0});var tIt=ln(),rIt=eIt(jq()),nIt=()=>tIt.useContext(rIt.default);zB.default=nIt});var Iwe=_(XB=>{"use strict";var iIt=XB&&XB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(XB,"__esModule",{value:!0});var sIt=ln(),oIt=iIt(Vq()),aIt=()=>sIt.useContext(oIt.default);XB.default=aIt});var wwe=_(ZB=>{"use strict";var lIt=ZB&&ZB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ZB,"__esModule",{value:!0});var cIt=ln(),uIt=lIt(Jq()),AIt=()=>cIt.useContext(uIt.default);ZB.default=AIt});var vwe=_(ev=>{"use strict";var Bwe=ev&&ev.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ev,"__esModule",{value:!0});var $B=ln(),fIt=Bwe(TQ()),pIt=Bwe(MQ()),hIt=({isActive:t=!0,autoFocus:e=!1,id:r}={})=>{let{isRawModeSupported:o,setRawMode:a}=pIt.default(),{activeId:n,add:u,remove:A,activate:p,deactivate:h,focus:E}=$B.useContext(fIt.default),w=$B.useMemo(()=>r??Math.random().toString().slice(2,7),[r]);return $B.useEffect(()=>(u(w,{autoFocus:e}),()=>{A(w)}),[w,e]),$B.useEffect(()=>{t?p(w):h(w)},[t,w]),$B.useEffect(()=>{if(!(!o||!t))return a(!0),()=>{a(!1)}},[t]),{isFocused:!!w&&n===w,focus:E}};ev.default=hIt});var Dwe=_(tv=>{"use strict";var gIt=tv&&tv.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(tv,"__esModule",{value:!0});var dIt=ln(),mIt=gIt(TQ()),yIt=()=>{let t=dIt.useContext(mIt.default);return{enableFocus:t.enableFocus,disableFocus:t.disableFocus,focusNext:t.focusNext,focusPrevious:t.focusPrevious,focus:t.focus}};tv.default=yIt});var Swe=_(ij=>{"use strict";Object.defineProperty(ij,"__esModule",{value:!0});ij.default=t=>{var e,r,o,a;return{width:(r=(e=t.yogaNode)===null||e===void 0?void 0:e.getComputedWidth())!==null&&r!==void 0?r:0,height:(a=(o=t.yogaNode)===null||o===void 0?void 0:o.getComputedHeight())!==null&&a!==void 0?a:0}}});var ac=_(Js=>{"use strict";Object.defineProperty(Js,"__esModule",{value:!0});var EIt=lwe();Object.defineProperty(Js,"render",{enumerable:!0,get:function(){return EIt.default}});var CIt=LQ();Object.defineProperty(Js,"Box",{enumerable:!0,get:function(){return CIt.default}});var IIt=tj();Object.defineProperty(Js,"Text",{enumerable:!0,get:function(){return IIt.default}});var wIt=uwe();Object.defineProperty(Js,"Static",{enumerable:!0,get:function(){return wIt.default}});var BIt=fwe();Object.defineProperty(Js,"Transform",{enumerable:!0,get:function(){return BIt.default}});var vIt=hwe();Object.defineProperty(Js,"Newline",{enumerable:!0,get:function(){return vIt.default}});var DIt=mwe();Object.defineProperty(Js,"Spacer",{enumerable:!0,get:function(){return DIt.default}});var SIt=Ewe();Object.defineProperty(Js,"useInput",{enumerable:!0,get:function(){return SIt.default}});var PIt=Cwe();Object.defineProperty(Js,"useApp",{enumerable:!0,get:function(){return PIt.default}});var xIt=MQ();Object.defineProperty(Js,"useStdin",{enumerable:!0,get:function(){return xIt.default}});var bIt=Iwe();Object.defineProperty(Js,"useStdout",{enumerable:!0,get:function(){return bIt.default}});var kIt=wwe();Object.defineProperty(Js,"useStderr",{enumerable:!0,get:function(){return kIt.default}});var QIt=vwe();Object.defineProperty(Js,"useFocus",{enumerable:!0,get:function(){return QIt.default}});var FIt=Dwe();Object.defineProperty(Js,"useFocusManager",{enumerable:!0,get:function(){return FIt.default}});var RIt=Swe();Object.defineProperty(Js,"measureElement",{enumerable:!0,get:function(){return RIt.default}})});var oj={};Vt(oj,{Gem:()=>sj});var Pwe,ld,sj,UQ=It(()=>{Pwe=et(ac()),ld=et(ln()),sj=(0,ld.memo)(({active:t})=>{let e=(0,ld.useMemo)(()=>t?"\u25C9":"\u25EF",[t]),r=(0,ld.useMemo)(()=>t?"green":"yellow",[t]);return ld.default.createElement(Pwe.Text,{color:r},e)})});var bwe={};Vt(bwe,{useKeypress:()=>cd});function cd({active:t},e,r){let{stdin:o}=(0,xwe.useStdin)(),a=(0,_Q.useCallback)((n,u)=>e(n,u),r);(0,_Q.useEffect)(()=>{if(!(!t||!o))return o.on("keypress",a),()=>{o.off("keypress",a)}},[t,a,o])}var xwe,_Q,rv=It(()=>{xwe=et(ac()),_Q=et(ln())});var Qwe={};Vt(Qwe,{FocusRequest:()=>kwe,useFocusRequest:()=>aj});var kwe,aj,lj=It(()=>{rv();kwe=(r=>(r.BEFORE="before",r.AFTER="after",r))(kwe||{}),aj=function({active:t},e,r){cd({active:t},(o,a)=>{a.name==="tab"&&(a.shift?e("before"):e("after"))},r)}});var Fwe={};Vt(Fwe,{useListInput:()=>nv});var nv,HQ=It(()=>{rv();nv=function(t,e,{active:r,minus:o,plus:a,set:n,loop:u=!0}){cd({active:r},(A,p)=>{let h=e.indexOf(t);switch(p.name){case o:{let E=h-1;if(u){n(e[(e.length+E)%e.length]);return}if(E<0)return;n(e[E])}break;case a:{let E=h+1;if(u){n(e[E%e.length]);return}if(E>=e.length)return;n(e[E])}break}},[e,t,a,n,u])}});var qQ={};Vt(qQ,{ScrollableItems:()=>TIt});var Hh,Ua,TIt,jQ=It(()=>{Hh=et(ac()),Ua=et(ln());lj();HQ();TIt=({active:t=!0,children:e=[],radius:r=10,size:o=1,loop:a=!0,onFocusRequest:n,willReachEnd:u})=>{let A=N=>{if(N.key===null)throw new Error("Expected all children to have a key");return N.key},p=Ua.default.Children.map(e,N=>A(N)),h=p[0],[E,w]=(0,Ua.useState)(h),D=p.indexOf(E);(0,Ua.useEffect)(()=>{p.includes(E)||w(h)},[e]),(0,Ua.useEffect)(()=>{u&&D>=p.length-2&&u()},[D]),aj({active:t&&!!n},N=>{n?.(N)},[n]),nv(E,p,{active:t,minus:"up",plus:"down",set:w,loop:a});let b=D-r,C=D+r;C>p.length&&(b-=C-p.length,C=p.length),b<0&&(C+=-b,b=0),C>=p.length&&(C=p.length-1);let T=[];for(let N=b;N<=C;++N){let U=p[N],J=t&&U===E;T.push(Ua.default.createElement(Hh.Box,{key:U,height:o},Ua.default.createElement(Hh.Box,{marginLeft:1,marginRight:1},Ua.default.createElement(Hh.Text,null,J?Ua.default.createElement(Hh.Text,{color:"cyan",bold:!0},">"):" ")),Ua.default.createElement(Hh.Box,null,Ua.default.cloneElement(e[N],{active:J}))))}return Ua.default.createElement(Hh.Box,{flexDirection:"column",width:"100%"},T)}});var Rwe,Xf,Twe,cj,Lwe,uj=It(()=>{Rwe=et(ac()),Xf=et(ln()),Twe=ve("readline"),cj=Xf.default.createContext(null),Lwe=({children:t})=>{let{stdin:e,setRawMode:r}=(0,Rwe.useStdin)();(0,Xf.useEffect)(()=>{r&&r(!0),e&&(0,Twe.emitKeypressEvents)(e)},[e,r]);let[o,a]=(0,Xf.useState)(new Map),n=(0,Xf.useMemo)(()=>({getAll:()=>o,get:u=>o.get(u),set:(u,A)=>a(new Map([...o,[u,A]]))}),[o,a]);return Xf.default.createElement(cj.Provider,{value:n,children:t})}});var Aj={};Vt(Aj,{useMinistore:()=>LIt});function LIt(t,e){let r=(0,GQ.useContext)(cj);if(r===null)throw new Error("Expected this hook to run with a ministore context attached");if(typeof t>"u")return r.getAll();let o=(0,GQ.useCallback)(n=>{r.set(t,n)},[t,r.set]),a=r.get(t);return typeof a>"u"&&(a=e),[a,o]}var GQ,fj=It(()=>{GQ=et(ln());uj()});var YQ={};Vt(YQ,{renderForm:()=>NIt});async function NIt(t,e,{stdin:r,stdout:o,stderr:a}){let n,u=p=>{let{exit:h}=(0,WQ.useApp)();cd({active:!0},(E,w)=>{w.name==="return"&&(n=p,h())},[h,p])},{waitUntilExit:A}=(0,WQ.render)(pj.default.createElement(Lwe,null,pj.default.createElement(t,{...e,useSubmit:u})),{stdin:r,stdout:o,stderr:a});return await A(),n}var WQ,pj,VQ=It(()=>{WQ=et(ac()),pj=et(ln());uj();rv()});var Uwe=_(iv=>{"use strict";Object.defineProperty(iv,"__esModule",{value:!0});iv.UncontrolledTextInput=void 0;var Owe=ln(),hj=ln(),Nwe=ac(),ud=FQ(),Mwe=({value:t,placeholder:e="",focus:r=!0,mask:o,highlightPastedText:a=!1,showCursor:n=!0,onChange:u,onSubmit:A})=>{let[{cursorOffset:p,cursorWidth:h},E]=hj.useState({cursorOffset:(t||"").length,cursorWidth:0});hj.useEffect(()=>{E(T=>{if(!r||!n)return T;let N=t||"";return T.cursorOffset>N.length-1?{cursorOffset:N.length,cursorWidth:0}:T})},[t,r,n]);let w=a?h:0,D=o?o.repeat(t.length):t,b=D,C=e?ud.grey(e):void 0;if(n&&r){C=e.length>0?ud.inverse(e[0])+ud.grey(e.slice(1)):ud.inverse(" "),b=D.length>0?"":ud.inverse(" ");let T=0;for(let N of D)T>=p-w&&T<=p?b+=ud.inverse(N):b+=N,T++;D.length>0&&p===D.length&&(b+=ud.inverse(" "))}return Nwe.useInput((T,N)=>{if(N.upArrow||N.downArrow||N.ctrl&&T==="c"||N.tab||N.shift&&N.tab)return;if(N.return){A&&A(t);return}let U=p,J=t,te=0;N.leftArrow?n&&U--:N.rightArrow?n&&U++:N.backspace||N.delete?p>0&&(J=t.slice(0,p-1)+t.slice(p,t.length),U--):(J=t.slice(0,p)+T+t.slice(p,t.length),U+=T.length,T.length>1&&(te=T.length)),p<0&&(U=0),p>t.length&&(U=t.length),E({cursorOffset:U,cursorWidth:te}),J!==t&&u(J)},{isActive:r}),Owe.createElement(Nwe.Text,null,e?D.length>0?b:C:b)};iv.default=Mwe;iv.UncontrolledTextInput=({initialValue:t="",...e})=>{let[r,o]=hj.useState(t);return Owe.createElement(Mwe,Object.assign({},e,{value:r,onChange:o}))}});var qwe={};Vt(qwe,{Pad:()=>gj});var _we,Hwe,gj,dj=It(()=>{_we=et(ac()),Hwe=et(ln()),gj=({length:t,active:e})=>{if(t===0)return null;let r=t>1?` ${"-".repeat(t-1)}`:" ";return Hwe.default.createElement(_we.Text,{dimColor:!e},r)}});var jwe={};Vt(jwe,{ItemOptions:()=>OIt});var ov,qh,OIt,Gwe=It(()=>{ov=et(ac()),qh=et(ln());HQ();UQ();dj();OIt=function({active:t,skewer:e,options:r,value:o,onChange:a,sizes:n=[]}){let u=r.filter(({label:p})=>!!p).map(({value:p})=>p),A=r.findIndex(p=>p.value===o&&p.label!="");return nv(o,u,{active:t,minus:"left",plus:"right",set:a}),qh.default.createElement(qh.default.Fragment,null,r.map(({label:p},h)=>{let E=h===A,w=n[h]-1||0,D=p.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),b=Math.max(0,w-D.length-2);return p?qh.default.createElement(ov.Box,{key:p,width:w,marginLeft:1},qh.default.createElement(ov.Text,{wrap:"truncate"},qh.default.createElement(sj,{active:E})," ",p),e?qh.default.createElement(gj,{active:t,length:b}):null):qh.default.createElement(ov.Box,{key:`spacer-${h}`,width:w,marginLeft:1})}))}});var s1e=_((xJt,i1e)=>{var Dj;i1e.exports=()=>(typeof Dj>"u"&&(Dj=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),Dj)});var S1e=_(($Jt,D1e)=>{var Tj=Symbol("arg flag"),lc=class t extends Error{constructor(e,r){super(e),this.name="ArgError",this.code=r,Object.setPrototypeOf(this,t.prototype)}};function wv(t,{argv:e=process.argv.slice(2),permissive:r=!1,stopAtPositional:o=!1}={}){if(!t)throw new lc("argument specification object is required","ARG_CONFIG_NO_SPEC");let a={_:[]},n={},u={};for(let A of Object.keys(t)){if(!A)throw new lc("argument key cannot be an empty string","ARG_CONFIG_EMPTY_KEY");if(A[0]!=="-")throw new lc(`argument key must start with '-' but found: '${A}'`,"ARG_CONFIG_NONOPT_KEY");if(A.length===1)throw new lc(`argument key must have a name; singular '-' keys are not allowed: ${A}`,"ARG_CONFIG_NONAME_KEY");if(typeof t[A]=="string"){n[A]=t[A];continue}let p=t[A],h=!1;if(Array.isArray(p)&&p.length===1&&typeof p[0]=="function"){let[E]=p;p=(w,D,b=[])=>(b.push(E(w,D,b[b.length-1])),b),h=E===Boolean||E[Tj]===!0}else if(typeof p=="function")h=p===Boolean||p[Tj]===!0;else throw new lc(`type missing or not a function or valid array type: ${A}`,"ARG_CONFIG_VAD_TYPE");if(A[1]!=="-"&&A.length>2)throw new lc(`short argument keys (with a single hyphen) must have only one character: ${A}`,"ARG_CONFIG_SHORTOPT_TOOLONG");u[A]=[p,h]}for(let A=0,p=e.length;A0){a._=a._.concat(e.slice(A));break}if(h==="--"){a._=a._.concat(e.slice(A+1));break}if(h.length>1&&h[0]==="-"){let E=h[1]==="-"||h.length===2?[h]:h.slice(1).split("").map(w=>`-${w}`);for(let w=0;w1&&e[A+1][0]==="-"&&!(e[A+1].match(/^-?\d*(\.(?=\d))?\d*$/)&&(N===Number||typeof BigInt<"u"&&N===BigInt))){let J=b===T?"":` (alias for ${T})`;throw new lc(`option requires argument: ${b}${J}`,"ARG_MISSING_REQUIRED_LONGARG")}a[T]=N(e[A+1],T,a[T]),++A}else a[T]=N(C,T,a[T])}}else a._.push(h)}return a}wv.flag=t=>(t[Tj]=!0,t);wv.COUNT=wv.flag((t,e,r)=>(r||0)+1);wv.ArgError=lc;D1e.exports=wv});var T1e=_((bzt,R1e)=>{var Mj;R1e.exports=()=>(typeof Mj>"u"&&(Mj=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),Mj)});var U1e=_((Gj,Wj)=>{(function(t){Gj&&typeof Gj=="object"&&typeof Wj<"u"?Wj.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window<"u"?window.isWindows=t():typeof global<"u"?global.isWindows=t():typeof self<"u"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var j1e=_((PXt,q1e)=>{"use strict";Yj.ifExists=Twt;var FC=ve("util"),cc=ve("path"),_1e=U1e(),Qwt=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,Fwt={createPwshFile:!0,createCmdFile:_1e(),fs:ve("fs")},Rwt=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function H1e(t){let e={...Fwt,...t},r=e.fs;return e.fs_={chmod:r.chmod?FC.promisify(r.chmod):async()=>{},mkdir:FC.promisify(r.mkdir),readFile:FC.promisify(r.readFile),stat:FC.promisify(r.stat),unlink:FC.promisify(r.unlink),writeFile:FC.promisify(r.writeFile)},e}async function Yj(t,e,r){let o=H1e(r);await o.fs_.stat(t),await Nwt(t,e,o)}function Twt(t,e,r){return Yj(t,e,r).catch(()=>{})}function Lwt(t,e){return e.fs_.unlink(t).catch(()=>{})}async function Nwt(t,e,r){let o=await Hwt(t,r);return await Owt(e,r),Mwt(t,e,o,r)}function Owt(t,e){return e.fs_.mkdir(cc.dirname(t),{recursive:!0})}function Mwt(t,e,r,o){let a=H1e(o),n=[{generator:Gwt,extension:""}];return a.createCmdFile&&n.push({generator:jwt,extension:".cmd"}),a.createPwshFile&&n.push({generator:Wwt,extension:".ps1"}),Promise.all(n.map(u=>qwt(t,e+u.extension,r,u.generator,a)))}function Uwt(t,e){return Lwt(t,e)}function _wt(t,e){return Ywt(t,e)}async function Hwt(t,e){let a=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(Qwt);if(!a){let n=cc.extname(t).toLowerCase();return{program:Rwt.get(n)||null,additionalArgs:""}}return{program:a[1],additionalArgs:a[2]}}async function qwt(t,e,r,o,a){let n=a.preserveSymlinks?"--preserve-symlinks":"",u=[r.additionalArgs,n].filter(A=>A).join(" ");return a=Object.assign({},a,{prog:r.program,args:u}),await Uwt(e,a),await a.fs_.writeFile(e,o(t,e,a),"utf8"),_wt(e,a)}function jwt(t,e,r){let a=cc.relative(cc.dirname(e),t).split("/").join("\\"),n=cc.isAbsolute(a)?`"${a}"`:`"%~dp0\\${a}"`,u,A=r.prog,p=r.args||"",h=Vj(r.nodePath).win32;A?(u=`"%~dp0\\${A}.exe"`,a=n):(A=n,p="",a="");let E=r.progArgs?`${r.progArgs.join(" ")} `:"",w=h?`@SET NODE_PATH=${h}\r -`:"";return u?w+=`@IF EXIST ${u} (\r - ${u} ${p} ${a} ${E}%*\r -) ELSE (\r - @SETLOCAL\r - @SET PATHEXT=%PATHEXT:;.JS;=;%\r - ${A} ${p} ${a} ${E}%*\r -)\r -`:w+=`@${A} ${p} ${a} ${E}%*\r -`,w}function Gwt(t,e,r){let o=cc.relative(cc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n;o=o.split("\\").join("/");let u=cc.isAbsolute(o)?`"${o}"`:`"$basedir/${o}"`,A=r.args||"",p=Vj(r.nodePath).posix;a?(n=`"$basedir/${r.prog}"`,o=u):(a=u,A="",o="");let h=r.progArgs?`${r.progArgs.join(" ")} `:"",E=`#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") - -case \`uname\` in - *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; -esac - -`,w=r.nodePath?`export NODE_PATH="${p}" -`:"";return n?E+=`${w}if [ -x ${n} ]; then - exec ${n} ${A} ${o} ${h}"$@" -else - exec ${a} ${A} ${o} ${h}"$@" -fi -`:E+=`${w}${a} ${A} ${o} ${h}"$@" -exit $? -`,E}function Wwt(t,e,r){let o=cc.relative(cc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n=a&&`"${a}$exe"`,u;o=o.split("\\").join("/");let A=cc.isAbsolute(o)?`"${o}"`:`"$basedir/${o}"`,p=r.args||"",h=Vj(r.nodePath),E=h.win32,w=h.posix;n?(u=`"$basedir/${r.prog}$exe"`,o=A):(n=A,p="",o="");let D=r.progArgs?`${r.progArgs.join(" ")} `:"",b=`#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -${r.nodePath?`$env_node_path=$env:NODE_PATH -$env:NODE_PATH="${E}" -`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -}`;return r.nodePath&&(b+=` else { - $env:NODE_PATH="${w}" -}`),u?b+=` -$ret=0 -if (Test-Path ${u}) { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${u} ${p} ${o} ${D}$args - } else { - & ${u} ${p} ${o} ${D}$args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${n} ${p} ${o} ${D}$args - } else { - & ${n} ${p} ${o} ${D}$args - } - $ret=$LASTEXITCODE -} -${r.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $ret -`:b+=` -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & ${n} ${p} ${o} ${D}$args -} else { - & ${n} ${p} ${o} ${D}$args -} -${r.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $LASTEXITCODE -`,b}function Ywt(t,e){return e.fs_.chmod(t,493)}function Vj(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(cc.delimiter):Array.from(t),r={};for(let o=0;o`/mnt/${A.toLowerCase()}`):e[o];r.win32=r.win32?`${r.win32};${a}`:a,r.posix=r.posix?`${r.posix}:${n}`:n,r[o]={win32:a,posix:n}}return r}q1e.exports=Yj});var aG=_((KZt,c2e)=>{c2e.exports=ve("stream")});var p2e=_((JZt,f2e)=>{"use strict";function u2e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function E1t(t){for(var e=1;e0?this.tail.next=o:this.head=o,this.tail=o,++this.length}},{key:"unshift",value:function(r){var o={data:r,next:this.head};this.length===0&&(this.tail=o),this.head=o,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var o=this.head,a=""+o.data;o=o.next;)a+=r+o.data;return a}},{key:"concat",value:function(r){if(this.length===0)return sF.alloc(0);for(var o=sF.allocUnsafe(r>>>0),a=this.head,n=0;a;)S1t(a.data,o,n),n+=a.data.length,a=a.next;return o}},{key:"consume",value:function(r,o){var a;return ru.length?u.length:r;if(A===u.length?n+=u:n+=u.slice(0,r),r-=A,r===0){A===u.length?(++a,o.next?this.head=o.next:this.head=this.tail=null):(this.head=o,o.data=u.slice(A));break}++a}return this.length-=a,n}},{key:"_getBuffer",value:function(r){var o=sF.allocUnsafe(r),a=this.head,n=1;for(a.data.copy(o),r-=a.data.length;a=a.next;){var u=a.data,A=r>u.length?u.length:r;if(u.copy(o,o.length-r,0,A),r-=A,r===0){A===u.length?(++n,a.next?this.head=a.next:this.head=this.tail=null):(this.head=a,a.data=u.slice(A));break}++n}return this.length-=n,o}},{key:D1t,value:function(r,o){return lG(this,E1t({},o,{depth:0,customInspect:!1}))}}]),t}()});var uG=_((zZt,g2e)=>{"use strict";function P1t(t,e){var r=this,o=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return o||a?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(cG,this,t)):process.nextTick(cG,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(n){!e&&n?r._writableState?r._writableState.errorEmitted?process.nextTick(oF,r):(r._writableState.errorEmitted=!0,process.nextTick(h2e,r,n)):process.nextTick(h2e,r,n):e?(process.nextTick(oF,r),e(n)):process.nextTick(oF,r)}),this)}function h2e(t,e){cG(t,e),oF(t)}function oF(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function x1t(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function cG(t,e){t.emit("error",e)}function b1t(t,e){var r=t._readableState,o=t._writableState;r&&r.autoDestroy||o&&o.autoDestroy?t.destroy(e):t.emit("error",e)}g2e.exports={destroy:P1t,undestroy:x1t,errorOrDestroy:b1t}});var Jh=_((XZt,y2e)=>{"use strict";var m2e={};function Ac(t,e,r){r||(r=Error);function o(n,u,A){return typeof e=="string"?e:e(n,u,A)}class a extends r{constructor(u,A,p){super(o(u,A,p))}}a.prototype.name=r.name,a.prototype.code=t,m2e[t]=a}function d2e(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(o=>String(o)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function k1t(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function Q1t(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function F1t(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}Ac("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);Ac("ERR_INVALID_ARG_TYPE",function(t,e,r){let o;typeof e=="string"&&k1t(e,"not ")?(o="must not be",e=e.replace(/^not /,"")):o="must be";let a;if(Q1t(t," argument"))a=`The ${t} ${o} ${d2e(e,"type")}`;else{let n=F1t(t,".")?"property":"argument";a=`The "${t}" ${n} ${o} ${d2e(e,"type")}`}return a+=`. Received type ${typeof r}`,a},TypeError);Ac("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");Ac("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});Ac("ERR_STREAM_PREMATURE_CLOSE","Premature close");Ac("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});Ac("ERR_MULTIPLE_CALLBACK","Callback called multiple times");Ac("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");Ac("ERR_STREAM_WRITE_AFTER_END","write after end");Ac("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);Ac("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);Ac("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");y2e.exports.codes=m2e});var AG=_((ZZt,E2e)=>{"use strict";var R1t=Jh().codes.ERR_INVALID_OPT_VALUE;function T1t(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function L1t(t,e,r,o){var a=T1t(e,o,r);if(a!=null){if(!(isFinite(a)&&Math.floor(a)===a)||a<0){var n=o?r:"highWaterMark";throw new R1t(n,a)}return Math.floor(a)}return t.objectMode?16:16*1024}E2e.exports={getHighWaterMark:L1t}});var C2e=_(($Zt,fG)=>{typeof Object.create=="function"?fG.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:fG.exports=function(e,r){if(r){e.super_=r;var o=function(){};o.prototype=r.prototype,e.prototype=new o,e.prototype.constructor=e}}});var zh=_((e$t,hG)=>{try{if(pG=ve("util"),typeof pG.inherits!="function")throw"";hG.exports=pG.inherits}catch{hG.exports=C2e()}var pG});var w2e=_((t$t,I2e)=>{I2e.exports=ve("util").deprecate});var mG=_((r$t,x2e)=>{"use strict";x2e.exports=Li;function v2e(t){var e=this;this.next=null,this.entry=null,this.finish=function(){l2t(e,t)}}var OC;Li.WritableState=Tv;var N1t={deprecate:w2e()},D2e=aG(),lF=ve("buffer").Buffer,O1t=global.Uint8Array||function(){};function M1t(t){return lF.from(t)}function U1t(t){return lF.isBuffer(t)||t instanceof O1t}var dG=uG(),_1t=AG(),H1t=_1t.getHighWaterMark,Xh=Jh().codes,q1t=Xh.ERR_INVALID_ARG_TYPE,j1t=Xh.ERR_METHOD_NOT_IMPLEMENTED,G1t=Xh.ERR_MULTIPLE_CALLBACK,W1t=Xh.ERR_STREAM_CANNOT_PIPE,Y1t=Xh.ERR_STREAM_DESTROYED,V1t=Xh.ERR_STREAM_NULL_VALUES,K1t=Xh.ERR_STREAM_WRITE_AFTER_END,J1t=Xh.ERR_UNKNOWN_ENCODING,MC=dG.errorOrDestroy;zh()(Li,D2e);function z1t(){}function Tv(t,e,r){OC=OC||dd(),t=t||{},typeof r!="boolean"&&(r=e instanceof OC),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=H1t(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var o=t.decodeStrings===!1;this.decodeStrings=!o,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){n2t(e,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new v2e(this)}Tv.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(Tv.prototype,"buffer",{get:N1t.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}})();var aF;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(aF=Function.prototype[Symbol.hasInstance],Object.defineProperty(Li,Symbol.hasInstance,{value:function(e){return aF.call(this,e)?!0:this!==Li?!1:e&&e._writableState instanceof Tv}})):aF=function(e){return e instanceof this};function Li(t){OC=OC||dd();var e=this instanceof OC;if(!e&&!aF.call(Li,this))return new Li(t);this._writableState=new Tv(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),D2e.call(this)}Li.prototype.pipe=function(){MC(this,new W1t)};function X1t(t,e){var r=new K1t;MC(t,r),process.nextTick(e,r)}function Z1t(t,e,r,o){var a;return r===null?a=new V1t:typeof r!="string"&&!e.objectMode&&(a=new q1t("chunk",["string","Buffer"],r)),a?(MC(t,a),process.nextTick(o,a),!1):!0}Li.prototype.write=function(t,e,r){var o=this._writableState,a=!1,n=!o.objectMode&&U1t(t);return n&&!lF.isBuffer(t)&&(t=M1t(t)),typeof e=="function"&&(r=e,e=null),n?e="buffer":e||(e=o.defaultEncoding),typeof r!="function"&&(r=z1t),o.ending?X1t(this,r):(n||Z1t(this,o,t,r))&&(o.pendingcb++,a=e2t(this,o,n,t,e,r)),a};Li.prototype.cork=function(){this._writableState.corked++};Li.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&S2e(this,t))};Li.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new J1t(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Li.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function $1t(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=lF.from(e,r)),e}Object.defineProperty(Li.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function e2t(t,e,r,o,a,n){if(!r){var u=$1t(e,o,a);o!==u&&(r=!0,a="buffer",o=u)}var A=e.objectMode?1:o.length;e.length+=A;var p=e.length{"use strict";var c2t=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};k2e.exports=IA;var b2e=CG(),EG=mG();zh()(IA,b2e);for(yG=c2t(EG.prototype),cF=0;cF{var AF=ve("buffer"),np=AF.Buffer;function Q2e(t,e){for(var r in t)e[r]=t[r]}np.from&&np.alloc&&np.allocUnsafe&&np.allocUnsafeSlow?F2e.exports=AF:(Q2e(AF,IG),IG.Buffer=UC);function UC(t,e,r){return np(t,e,r)}Q2e(np,UC);UC.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return np(t,e,r)};UC.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var o=np(t);return e!==void 0?typeof r=="string"?o.fill(e,r):o.fill(e):o.fill(0),o};UC.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return np(t)};UC.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return AF.SlowBuffer(t)}});var vG=_(L2e=>{"use strict";var BG=R2e().Buffer,T2e=BG.isEncoding||function(t){switch(t=""+t,t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function f2t(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function p2t(t){var e=f2t(t);if(typeof e!="string"&&(BG.isEncoding===T2e||!T2e(t)))throw new Error("Unknown encoding: "+t);return e||t}L2e.StringDecoder=Lv;function Lv(t){this.encoding=p2t(t);var e;switch(this.encoding){case"utf16le":this.text=E2t,this.end=C2t,e=4;break;case"utf8":this.fillLast=d2t,e=4;break;case"base64":this.text=I2t,this.end=w2t,e=3;break;default:this.write=B2t,this.end=v2t;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=BG.allocUnsafe(e)}Lv.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===2?-1:-2}function h2t(t,e,r){var o=e.length-1;if(o=0?(a>0&&(t.lastNeed=a-1),a):--o=0?(a>0&&(t.lastNeed=a-2),a):--o=0?(a>0&&(a===2?a=0:t.lastNeed=a-3),a):0))}function g2t(t,e,r){if((e[0]&192)!==128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return t.lastNeed=2,"\uFFFD"}}function d2t(t){var e=this.lastTotal-this.lastNeed,r=g2t(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function m2t(t,e){var r=h2t(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var o=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,o),t.toString("utf8",e,o)}function y2t(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function E2t(t,e){if((t.length-e)%2===0){var r=t.toString("utf16le",e);if(r){var o=r.charCodeAt(r.length-1);if(o>=55296&&o<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function C2t(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function I2t(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function w2t(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function B2t(t){return t.toString(this.encoding)}function v2t(t){return t&&t.length?this.write(t):""}});var fF=_((s$t,M2e)=>{"use strict";var N2e=Jh().codes.ERR_STREAM_PREMATURE_CLOSE;function D2t(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,o=new Array(r),a=0;a{"use strict";var pF;function Zh(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var x2t=fF(),$h=Symbol("lastResolve"),md=Symbol("lastReject"),Nv=Symbol("error"),hF=Symbol("ended"),yd=Symbol("lastPromise"),DG=Symbol("handlePromise"),Ed=Symbol("stream");function e0(t,e){return{value:t,done:e}}function b2t(t){var e=t[$h];if(e!==null){var r=t[Ed].read();r!==null&&(t[yd]=null,t[$h]=null,t[md]=null,e(e0(r,!1)))}}function k2t(t){process.nextTick(b2t,t)}function Q2t(t,e){return function(r,o){t.then(function(){if(e[hF]){r(e0(void 0,!0));return}e[DG](r,o)},o)}}var F2t=Object.getPrototypeOf(function(){}),R2t=Object.setPrototypeOf((pF={get stream(){return this[Ed]},next:function(){var e=this,r=this[Nv];if(r!==null)return Promise.reject(r);if(this[hF])return Promise.resolve(e0(void 0,!0));if(this[Ed].destroyed)return new Promise(function(u,A){process.nextTick(function(){e[Nv]?A(e[Nv]):u(e0(void 0,!0))})});var o=this[yd],a;if(o)a=new Promise(Q2t(o,this));else{var n=this[Ed].read();if(n!==null)return Promise.resolve(e0(n,!1));a=new Promise(this[DG])}return this[yd]=a,a}},Zh(pF,Symbol.asyncIterator,function(){return this}),Zh(pF,"return",function(){var e=this;return new Promise(function(r,o){e[Ed].destroy(null,function(a){if(a){o(a);return}r(e0(void 0,!0))})})}),pF),F2t),T2t=function(e){var r,o=Object.create(R2t,(r={},Zh(r,Ed,{value:e,writable:!0}),Zh(r,$h,{value:null,writable:!0}),Zh(r,md,{value:null,writable:!0}),Zh(r,Nv,{value:null,writable:!0}),Zh(r,hF,{value:e._readableState.endEmitted,writable:!0}),Zh(r,DG,{value:function(n,u){var A=o[Ed].read();A?(o[yd]=null,o[$h]=null,o[md]=null,n(e0(A,!1))):(o[$h]=n,o[md]=u)},writable:!0}),r));return o[yd]=null,x2t(e,function(a){if(a&&a.code!=="ERR_STREAM_PREMATURE_CLOSE"){var n=o[md];n!==null&&(o[yd]=null,o[$h]=null,o[md]=null,n(a)),o[Nv]=a;return}var u=o[$h];u!==null&&(o[yd]=null,o[$h]=null,o[md]=null,u(e0(void 0,!0))),o[hF]=!0}),e.on("readable",k2t.bind(null,o)),o};U2e.exports=T2t});var G2e=_((a$t,j2e)=>{"use strict";function H2e(t,e,r,o,a,n,u){try{var A=t[n](u),p=A.value}catch(h){r(h);return}A.done?e(p):Promise.resolve(p).then(o,a)}function L2t(t){return function(){var e=this,r=arguments;return new Promise(function(o,a){var n=t.apply(e,r);function u(p){H2e(n,o,a,u,A,"next",p)}function A(p){H2e(n,o,a,u,A,"throw",p)}u(void 0)})}}function q2e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function N2t(t){for(var e=1;e{"use strict";eBe.exports=wn;var _C;wn.ReadableState=K2e;var l$t=ve("events").EventEmitter,V2e=function(e,r){return e.listeners(r).length},Mv=aG(),gF=ve("buffer").Buffer,_2t=global.Uint8Array||function(){};function H2t(t){return gF.from(t)}function q2t(t){return gF.isBuffer(t)||t instanceof _2t}var SG=ve("util"),tn;SG&&SG.debuglog?tn=SG.debuglog("stream"):tn=function(){};var j2t=p2e(),RG=uG(),G2t=AG(),W2t=G2t.getHighWaterMark,dF=Jh().codes,Y2t=dF.ERR_INVALID_ARG_TYPE,V2t=dF.ERR_STREAM_PUSH_AFTER_EOF,K2t=dF.ERR_METHOD_NOT_IMPLEMENTED,J2t=dF.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,HC,PG,xG;zh()(wn,Mv);var Ov=RG.errorOrDestroy,bG=["error","close","destroy","pause","resume"];function z2t(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function K2e(t,e,r){_C=_C||dd(),t=t||{},typeof r!="boolean"&&(r=e instanceof _C),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=W2t(this,t,"readableHighWaterMark",r),this.buffer=new j2t,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(HC||(HC=vG().StringDecoder),this.decoder=new HC(t.encoding),this.encoding=t.encoding)}function wn(t){if(_C=_C||dd(),!(this instanceof wn))return new wn(t);var e=this instanceof _C;this._readableState=new K2e(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),Mv.call(this)}Object.defineProperty(wn.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){this._readableState&&(this._readableState.destroyed=e)}});wn.prototype.destroy=RG.destroy;wn.prototype._undestroy=RG.undestroy;wn.prototype._destroy=function(t,e){e(t)};wn.prototype.push=function(t,e){var r=this._readableState,o;return r.objectMode?o=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=gF.from(t,e),e=""),o=!0),J2e(this,t,e,!1,o)};wn.prototype.unshift=function(t){return J2e(this,t,null,!0,!1)};function J2e(t,e,r,o,a){tn("readableAddChunk",e);var n=t._readableState;if(e===null)n.reading=!1,$2t(t,n);else{var u;if(a||(u=X2t(n,e)),u)Ov(t,u);else if(n.objectMode||e&&e.length>0)if(typeof e!="string"&&!n.objectMode&&Object.getPrototypeOf(e)!==gF.prototype&&(e=H2t(e)),o)n.endEmitted?Ov(t,new J2t):kG(t,n,e,!0);else if(n.ended)Ov(t,new V2t);else{if(n.destroyed)return!1;n.reading=!1,n.decoder&&!r?(e=n.decoder.write(e),n.objectMode||e.length!==0?kG(t,n,e,!1):FG(t,n)):kG(t,n,e,!1)}else o||(n.reading=!1,FG(t,n))}return!n.ended&&(n.length=W2e?t=W2e:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function Y2e(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=Z2t(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}wn.prototype.read=function(t){tn("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return tn("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?QG(this):mF(this),null;if(t=Y2e(t,e),t===0&&e.ended)return e.length===0&&QG(this),null;var o=e.needReadable;tn("need readable",o),(e.length===0||e.length-t0?a=Z2e(t,e):a=null,a===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&QG(this)),a!==null&&this.emit("data",a),a};function $2t(t,e){if(tn("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?mF(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,z2e(t)))}}function mF(t){var e=t._readableState;tn("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(tn("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(z2e,t))}function z2e(t){var e=t._readableState;tn("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,TG(t)}function FG(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(eBt,t,e))}function eBt(t,e){for(;!e.reading&&!e.ended&&(e.length1&&$2e(o.pipes,t)!==-1)&&!h&&(tn("false write response, pause",o.awaitDrain),o.awaitDrain++),r.pause())}function D(N){tn("onerror",N),T(),t.removeListener("error",D),V2e(t,"error")===0&&Ov(t,N)}z2t(t,"error",D);function b(){t.removeListener("finish",C),T()}t.once("close",b);function C(){tn("onfinish"),t.removeListener("close",b),T()}t.once("finish",C);function T(){tn("unpipe"),r.unpipe(t)}return t.emit("pipe",r),o.flowing||(tn("pipe resume"),r.resume()),t};function tBt(t){return function(){var r=t._readableState;tn("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&V2e(t,"data")&&(r.flowing=!0,TG(t))}}wn.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var o=e.pipes,a=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var n=0;n0,o.flowing!==!1&&this.resume()):t==="readable"&&!o.endEmitted&&!o.readableListening&&(o.readableListening=o.needReadable=!0,o.flowing=!1,o.emittedReadable=!1,tn("on readable",o.length,o.reading),o.length?mF(this):o.reading||process.nextTick(rBt,this)),r};wn.prototype.addListener=wn.prototype.on;wn.prototype.removeListener=function(t,e){var r=Mv.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(X2e,this),r};wn.prototype.removeAllListeners=function(t){var e=Mv.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(X2e,this),e};function X2e(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function rBt(t){tn("readable nexttick read 0"),t.read(0)}wn.prototype.resume=function(){var t=this._readableState;return t.flowing||(tn("resume"),t.flowing=!t.readableListening,nBt(this,t)),t.paused=!1,this};function nBt(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(iBt,t,e))}function iBt(t,e){tn("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),TG(t),e.flowing&&!e.reading&&t.read(0)}wn.prototype.pause=function(){return tn("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(tn("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function TG(t){var e=t._readableState;for(tn("flow",e.flowing);e.flowing&&t.read()!==null;);}wn.prototype.wrap=function(t){var e=this,r=this._readableState,o=!1;t.on("end",function(){if(tn("wrapped end"),r.decoder&&!r.ended){var u=r.decoder.end();u&&u.length&&e.push(u)}e.push(null)}),t.on("data",function(u){if(tn("wrapped data"),r.decoder&&(u=r.decoder.write(u)),!(r.objectMode&&u==null)&&!(!r.objectMode&&(!u||!u.length))){var A=e.push(u);A||(o=!0,t.pause())}});for(var a in t)this[a]===void 0&&typeof t[a]=="function"&&(this[a]=function(A){return function(){return t[A].apply(t,arguments)}}(a));for(var n=0;n=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function QG(t){var e=t._readableState;tn("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(sBt,e,t))}function sBt(t,e){if(tn("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(wn.from=function(t,e){return xG===void 0&&(xG=G2e()),xG(wn,t,e)});function $2e(t,e){for(var r=0,o=t.length;r{"use strict";rBe.exports=ip;var yF=Jh().codes,oBt=yF.ERR_METHOD_NOT_IMPLEMENTED,aBt=yF.ERR_MULTIPLE_CALLBACK,lBt=yF.ERR_TRANSFORM_ALREADY_TRANSFORMING,cBt=yF.ERR_TRANSFORM_WITH_LENGTH_0,EF=dd();zh()(ip,EF);function uBt(t,e){var r=this._transformState;r.transforming=!1;var o=r.writecb;if(o===null)return this.emit("error",new aBt);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),o(t);var a=this._readableState;a.reading=!1,(a.needReadable||a.length{"use strict";iBe.exports=Uv;var nBe=LG();zh()(Uv,nBe);function Uv(t){if(!(this instanceof Uv))return new Uv(t);nBe.call(this,t)}Uv.prototype._transform=function(t,e,r){r(null,t)}});var uBe=_((f$t,cBe)=>{"use strict";var NG;function fBt(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var lBe=Jh().codes,pBt=lBe.ERR_MISSING_ARGS,hBt=lBe.ERR_STREAM_DESTROYED;function oBe(t){if(t)throw t}function gBt(t){return t.setHeader&&typeof t.abort=="function"}function dBt(t,e,r,o){o=fBt(o);var a=!1;t.on("close",function(){a=!0}),NG===void 0&&(NG=fF()),NG(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,gBt(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();o(u||new hBt("pipe"))}}}function aBe(t){t()}function mBt(t,e){return t.pipe(e)}function yBt(t){return!t.length||typeof t[t.length-1]!="function"?oBe:t.pop()}function EBt(){for(var t=arguments.length,e=new Array(t),r=0;r0;return dBt(u,p,h,function(E){a||(a=E),E&&n.forEach(aBe),!p&&(n.forEach(aBe),o(a))})});return e.reduce(mBt)}cBe.exports=EBt});var qC=_((fc,Hv)=>{var _v=ve("stream");process.env.READABLE_STREAM==="disable"&&_v?(Hv.exports=_v.Readable,Object.assign(Hv.exports,_v),Hv.exports.Stream=_v):(fc=Hv.exports=CG(),fc.Stream=_v||fc,fc.Readable=fc,fc.Writable=mG(),fc.Duplex=dd(),fc.Transform=LG(),fc.PassThrough=sBe(),fc.finished=fF(),fc.pipeline=uBe())});var pBe=_((p$t,fBe)=>{"use strict";var{Buffer:hu}=ve("buffer"),ABe=Symbol.for("BufferList");function fi(t){if(!(this instanceof fi))return new fi(t);fi._init.call(this,t)}fi._init=function(e){Object.defineProperty(this,ABe,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};fi.prototype._new=function(e){return new fi(e)};fi.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let o=0;othis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};fi.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};fi.prototype.copy=function(e,r,o,a){if((typeof o!="number"||o<0)&&(o=0),(typeof a!="number"||a>this.length)&&(a=this.length),o>=this.length||a<=0)return e||hu.alloc(0);let n=!!e,u=this._offset(o),A=a-o,p=A,h=n&&r||0,E=u[1];if(o===0&&a===this.length){if(!n)return this._bufs.length===1?this._bufs[0]:hu.concat(this._bufs,this.length);for(let w=0;wD)this._bufs[w].copy(e,h,E),h+=D;else{this._bufs[w].copy(e,h,E,E+p),h+=D;break}p-=D,E&&(E=0)}return e.length>h?e.slice(0,h):e};fi.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let o=this._offset(e),a=this._offset(r),n=this._bufs.slice(o[0],a[0]+1);return a[1]===0?n.pop():n[n.length-1]=n[n.length-1].slice(0,a[1]),o[1]!==0&&(n[0]=n[0].slice(o[1])),this._new(n)};fi.prototype.toString=function(e,r,o){return this.slice(r,o).toString(e)};fi.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};fi.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let o=this._offset(e),a=o[0],n=o[1];for(;a=t.length){let p=u.indexOf(t,n);if(p!==-1)return this._reverseOffset([a,p]);n=u.length-t.length+1}else{let p=this._reverseOffset([a,n]);if(this._match(p,t))return p;n++}n=0}return-1};fi.prototype._match=function(t,e){if(this.length-t{"use strict";var OG=qC().Duplex,CBt=zh(),qv=pBe();function Fo(t){if(!(this instanceof Fo))return new Fo(t);if(typeof t=="function"){this._callback=t;let e=function(o){this._callback&&(this._callback(o),this._callback=null)}.bind(this);this.on("pipe",function(o){o.on("error",e)}),this.on("unpipe",function(o){o.removeListener("error",e)}),t=null}qv._init.call(this,t),OG.call(this)}CBt(Fo,OG);Object.assign(Fo.prototype,qv.prototype);Fo.prototype._new=function(e){return new Fo(e)};Fo.prototype._write=function(e,r,o){this._appendBuffer(e),typeof o=="function"&&o()};Fo.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Fo.prototype.end=function(e){OG.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Fo.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};Fo.prototype._isBufferList=function(e){return e instanceof Fo||e instanceof qv||Fo.isBufferList(e)};Fo.isBufferList=qv.isBufferList;CF.exports=Fo;CF.exports.BufferListStream=Fo;CF.exports.BufferList=qv});var _G=_(GC=>{var IBt=Buffer.alloc,wBt="0000000000000000000",BBt="7777777777777777777",gBe=48,dBe=Buffer.from("ustar\0","binary"),vBt=Buffer.from("00","binary"),DBt=Buffer.from("ustar ","binary"),SBt=Buffer.from(" \0","binary"),PBt=parseInt("7777",8),jv=257,UG=263,xBt=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},bBt=function(t){switch(t){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},kBt=function(t){switch(t){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},mBe=function(t,e,r,o){for(;re?BBt.slice(0,e)+" ":wBt.slice(0,e-t.length)+t+" "};function QBt(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],o=t.length-1;o>0;o--){var a=t[o];e?r.push(a):r.push(255-a)}var n=0,u=r.length;for(o=0;o=Math.pow(10,r)&&r++,e+r+t};GC.decodeLongPath=function(t,e){return jC(t,0,t.length,e)};GC.encodePax=function(t){var e="";t.name&&(e+=MG(" path="+t.name+` -`)),t.linkname&&(e+=MG(" linkpath="+t.linkname+` -`));var r=t.pax;if(r)for(var o in r)e+=MG(" "+o+"="+r[o]+` -`);return Buffer.from(e)};GC.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var a=r.indexOf("/");if(a===-1)return null;o+=o?"/"+r.slice(0,a):r.slice(0,a),r=r.slice(a+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(o)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(t0(t.mode&PBt,6),100),e.write(t0(t.uid,6),108),e.write(t0(t.gid,6),116),e.write(t0(t.size,11),124),e.write(t0(t.mtime.getTime()/1e3|0,11),136),e[156]=gBe+kBt(t.type),t.linkname&&e.write(t.linkname,157),dBe.copy(e,jv),vBt.copy(e,UG),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(t0(t.devmajor||0,6),329),e.write(t0(t.devminor||0,6),337),o&&e.write(o,345),e.write(t0(yBe(e),6),148),e)};GC.decode=function(t,e,r){var o=t[156]===0?0:t[156]-gBe,a=jC(t,0,100,e),n=r0(t,100,8),u=r0(t,108,8),A=r0(t,116,8),p=r0(t,124,12),h=r0(t,136,12),E=bBt(o),w=t[157]===0?null:jC(t,157,100,e),D=jC(t,265,32),b=jC(t,297,32),C=r0(t,329,8),T=r0(t,337,8),N=yBe(t);if(N===8*32)return null;if(N!==r0(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(dBe.compare(t,jv,jv+6)===0)t[345]&&(a=jC(t,345,155,e)+"/"+a);else if(!(DBt.compare(t,jv,jv+6)===0&&SBt.compare(t,UG,UG+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return o===0&&a&&a[a.length-1]==="/"&&(o=5),{name:a,mode:n,uid:u,gid:A,size:p,mtime:new Date(1e3*h),type:E,linkname:w,uname:D,gname:b,devmajor:C,devminor:T}}});var DBe=_((d$t,vBe)=>{var CBe=ve("util"),FBt=hBe(),Gv=_G(),IBe=qC().Writable,wBe=qC().PassThrough,BBe=function(){},EBe=function(t){return t&=511,t&&512-t},RBt=function(t,e){var r=new IF(t,e);return r.end(),r},TBt=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},IF=function(t,e){this._parent=t,this.offset=e,wBe.call(this,{autoDestroy:!1})};CBe.inherits(IF,wBe);IF.prototype.destroy=function(t){this._parent.destroy(t)};var sp=function(t){if(!(this instanceof sp))return new sp(t);IBe.call(this,t),t=t||{},this._offset=0,this._buffer=FBt(),this._missing=0,this._partial=!1,this._onparse=BBe,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,o=function(){e._continue()},a=function(D){if(e._locked=!1,D)return e.destroy(D);e._stream||o()},n=function(){e._stream=null;var D=EBe(e._header.size);D?e._parse(D,u):e._parse(512,w),e._locked||o()},u=function(){e._buffer.consume(EBe(e._header.size)),e._parse(512,w),o()},A=function(){var D=e._header.size;e._paxGlobal=Gv.decodePax(r.slice(0,D)),r.consume(D),n()},p=function(){var D=e._header.size;e._pax=Gv.decodePax(r.slice(0,D)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(D),n()},h=function(){var D=e._header.size;this._gnuLongPath=Gv.decodeLongPath(r.slice(0,D),t.filenameEncoding),r.consume(D),n()},E=function(){var D=e._header.size;this._gnuLongLinkPath=Gv.decodeLongPath(r.slice(0,D),t.filenameEncoding),r.consume(D),n()},w=function(){var D=e._offset,b;try{b=e._header=Gv.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(C){e.emit("error",C)}if(r.consume(512),!b){e._parse(512,w),o();return}if(b.type==="gnu-long-path"){e._parse(b.size,h),o();return}if(b.type==="gnu-long-link-path"){e._parse(b.size,E),o();return}if(b.type==="pax-global-header"){e._parse(b.size,A),o();return}if(b.type==="pax-header"){e._parse(b.size,p),o();return}if(e._gnuLongPath&&(b.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(b.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=b=TBt(b,e._pax),e._pax=null),e._locked=!0,!b.size||b.type==="directory"){e._parse(512,w),e.emit("entry",b,RBt(e,D),a);return}e._stream=new IF(e,D),e.emit("entry",b,e._stream,a),e._parse(b.size,n),o()};this._onheader=w,this._parse(512,w)};CBe.inherits(sp,IBe);sp.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};sp.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};sp.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=BBe,this._overflow?this._write(this._overflow,void 0,t):t()}};sp.prototype._write=function(t,e,r){if(!this._destroyed){var o=this._stream,a=this._buffer,n=this._missing;if(t.length&&(this._partial=!0),t.lengthn&&(u=t.slice(n),t=t.slice(0,n)),o?o.end(t):a.append(t),this._overflow=u,this._onparse()}};sp.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};vBe.exports=sp});var PBe=_((m$t,SBe)=>{SBe.exports=ve("fs").constants||ve("constants")});var FBe=_((y$t,QBe)=>{var WC=PBe(),xBe=E4(),BF=zh(),LBt=Buffer.alloc,bBe=qC().Readable,YC=qC().Writable,NBt=ve("string_decoder").StringDecoder,wF=_G(),OBt=parseInt("755",8),MBt=parseInt("644",8),kBe=LBt(1024),qG=function(){},HG=function(t,e){e&=511,e&&t.push(kBe.slice(0,512-e))};function UBt(t){switch(t&WC.S_IFMT){case WC.S_IFBLK:return"block-device";case WC.S_IFCHR:return"character-device";case WC.S_IFDIR:return"directory";case WC.S_IFIFO:return"fifo";case WC.S_IFLNK:return"symlink"}return"file"}var vF=function(t){YC.call(this),this.written=0,this._to=t,this._destroyed=!1};BF(vF,YC);vF.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};vF.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var DF=function(){YC.call(this),this.linkname="",this._decoder=new NBt("utf-8"),this._destroyed=!1};BF(DF,YC);DF.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};DF.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Wv=function(){YC.call(this),this._destroyed=!1};BF(Wv,YC);Wv.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};Wv.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var wA=function(t){if(!(this instanceof wA))return new wA(t);bBe.call(this,t),this._drain=qG,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};BF(wA,bBe);wA.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=qG);var o=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=UBt(t.mode)),t.mode||(t.mode=t.type==="directory"?OBt:MBt),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var a=this.push(e);return HG(o,t.size),a?process.nextTick(r):this._drain=r,new Wv}if(t.type==="symlink"&&!t.linkname){var n=new DF;return xBe(n,function(A){if(A)return o.destroy(),r(A);t.linkname=n.linkname,o._encode(t),r()}),n}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new Wv;var u=new vF(this);return this._stream=u,xBe(u,function(A){if(o._stream=null,A)return o.destroy(),r(A);if(u.written!==t.size)return o.destroy(),r(new Error("size mismatch"));HG(o,t.size),o._finalizing&&o.finalize(),r()}),u}};wA.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(kBe),this.push(null))};wA.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};wA.prototype._encode=function(t){if(!t.pax){var e=wF.encode(t);if(e){this.push(e);return}}this._encodePax(t)};wA.prototype._encodePax=function(t){var e=wF.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(wF.encode(r)),this.push(e),HG(this,e.length),r.size=t.size,r.type=t.type,this.push(wF.encode(r))};wA.prototype._read=function(t){var e=this._drain;this._drain=qG,e()};QBe.exports=wA});var RBe=_(jG=>{jG.extract=DBe();jG.pack=FBe()});var WBe=_((M$t,GBe)=>{"use strict";var Yv=class t{constructor(e,r,o){this.__specs=e||{},Object.keys(this.__specs).forEach(a=>{if(typeof this.__specs[a]=="string"){let n=this.__specs[a],u=this.__specs[n];if(u){let A=u.aliases||[];A.push(a,n),u.aliases=[...new Set(A)],this.__specs[a]=u}else throw new Error(`Alias refers to invalid key: ${n} -> ${a}`)}}),this.__opts=r||{},this.__providers=qBe(o.filter(a=>a!=null&&typeof a=="object")),this.__isFiggyPudding=!0}get(e){return JG(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,r=this){for(let[o,a]of this.entries())e.call(r,a,o,this)}toJSON(){let e={};return this.forEach((r,o)=>{e[o]=r}),e}*entries(e){for(let o of Object.keys(this.__specs))yield[o,this.get(o)];let r=e||this.__opts.other;if(r){let o=new Set;for(let a of this.__providers){let n=a.entries?a.entries(r):evt(a);for(let[u,A]of n)r(u)&&!o.has(u)&&(o.add(u),yield[u,A])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new t(this.__specs,this.__opts,qBe(this.__providers).concat(e)),jBe)}};try{let t=ve("util");Yv.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+" "+t.inspect(this.toJSON(),r)}}catch{}function ZBt(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:"EBADKEY"})}function JG(t,e,r){let o=t.__specs[e];if(r&&!o&&(!t.__opts.other||!t.__opts.other(e)))ZBt(e);else{o||(o={});let a;for(let n of t.__providers){if(a=HBe(e,n),a===void 0&&o.aliases&&o.aliases.length){for(let u of o.aliases)if(u!==e&&(a=HBe(u,n),a!==void 0))break}if(a!==void 0)break}return a===void 0&&o.default!==void 0?typeof o.default=="function"?o.default(t):o.default:a}}function HBe(t,e){let r;return e.__isFiggyPudding?r=JG(e,t,!1):typeof e.get=="function"?r=e.get(t):r=e[t],r}var jBe={has(t,e){return e in t.__specs&&JG(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Yv.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e=="symbol"||e.slice(0,2)==="__")return t[e]=r,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};GBe.exports=$Bt;function $Bt(t,e){function r(...o){return new Proxy(new Yv(t,e,o),jBe)}return r}function qBe(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function evt(t){return Object.keys(t).map(e=>[e,t[e]])}});var KBe=_((U$t,DA)=>{"use strict";var Kv=ve("crypto"),tvt=WBe(),rvt=ve("stream").Transform,YBe=["sha256","sha384","sha512"],nvt=/^[a-z0-9+/]+(?:=?=?)$/i,ivt=/^([^-]+)-([^?]+)([?\S*]*)$/,svt=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,ovt=/^[\x21-\x7E]+$/,na=tvt({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>hvt},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),n0=class{get isHash(){return!0}constructor(e,r){r=na(r);let o=!!r.strict;this.source=e.trim();let a=this.source.match(o?svt:ivt);if(!a||o&&!YBe.some(u=>u===a[1]))return;this.algorithm=a[1],this.digest=a[2];let n=a[3];this.options=n?n.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=na(e),e.strict&&!(YBe.some(o=>o===this.algorithm)&&this.digest.match(nvt)&&(this.options||[]).every(o=>o.match(ovt))))return"";let r=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${r}`}},Cd=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=na(e);let r=e.sep||" ";return e.strict&&(r=r.replace(/\S+/g," ")),Object.keys(this).map(o=>this[o].map(a=>n0.prototype.toString.call(a,e)).filter(a=>a.length).join(r)).filter(o=>o.length).join(r)}concat(e,r){r=na(r);let o=typeof e=="string"?e:Vv(e,r);return vA(`${this.toString(r)} ${o}`,r)}hexDigest(){return vA(this,{single:!0}).hexDigest()}match(e,r){r=na(r);let o=vA(e,r),a=o.pickAlgorithm(r);return this[a]&&o[a]&&this[a].find(n=>o[a].find(u=>n.digest===u.digest))||!1}pickAlgorithm(e){e=na(e);let r=e.pickAlgorithm,o=Object.keys(this);if(!o.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return o.reduce((a,n)=>r(a,n)||a)}};DA.exports.parse=vA;function vA(t,e){if(e=na(e),typeof t=="string")return zG(t,e);if(t.algorithm&&t.digest){let r=new Cd;return r[t.algorithm]=[t],zG(Vv(r,e),e)}else return zG(Vv(t,e),e)}function zG(t,e){return e.single?new n0(t,e):t.trim().split(/\s+/).reduce((r,o)=>{let a=new n0(o,e);if(a.algorithm&&a.digest){let n=a.algorithm;r[n]||(r[n]=[]),r[n].push(a)}return r},new Cd)}DA.exports.stringify=Vv;function Vv(t,e){return e=na(e),t.algorithm&&t.digest?n0.prototype.toString.call(t,e):typeof t=="string"?Vv(vA(t,e),e):Cd.prototype.toString.call(t,e)}DA.exports.fromHex=avt;function avt(t,e,r){r=na(r);let o=r.options&&r.options.length?`?${r.options.join("?")}`:"";return vA(`${e}-${Buffer.from(t,"hex").toString("base64")}${o}`,r)}DA.exports.fromData=lvt;function lvt(t,e){e=na(e);let r=e.algorithms,o=e.options&&e.options.length?`?${e.options.join("?")}`:"";return r.reduce((a,n)=>{let u=Kv.createHash(n).update(t).digest("base64"),A=new n0(`${n}-${u}${o}`,e);if(A.algorithm&&A.digest){let p=A.algorithm;a[p]||(a[p]=[]),a[p].push(A)}return a},new Cd)}DA.exports.fromStream=cvt;function cvt(t,e){e=na(e);let r=e.Promise||Promise,o=XG(e);return new r((a,n)=>{t.pipe(o),t.on("error",n),o.on("error",n);let u;o.on("integrity",A=>{u=A}),o.on("end",()=>a(u)),o.on("data",()=>{})})}DA.exports.checkData=uvt;function uvt(t,e,r){if(r=na(r),e=vA(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let o=e.pickAlgorithm(r),a=Kv.createHash(o).update(t).digest("base64"),n=vA({algorithm:o,digest:a}),u=n.match(e,r);if(u||!r.error)return u;if(typeof r.size=="number"&&t.length!==r.size){let A=new Error(`data size mismatch when checking ${e}. - Wanted: ${r.size} - Found: ${t.length}`);throw A.code="EBADSIZE",A.found=t.length,A.expected=r.size,A.sri=e,A}else{let A=new Error(`Integrity checksum failed when using ${o}: Wanted ${e}, but got ${n}. (${t.length} bytes)`);throw A.code="EINTEGRITY",A.found=n,A.expected=e,A.algorithm=o,A.sri=e,A}}DA.exports.checkStream=Avt;function Avt(t,e,r){r=na(r);let o=r.Promise||Promise,a=XG(r.concat({integrity:e}));return new o((n,u)=>{t.pipe(a),t.on("error",u),a.on("error",u);let A;a.on("verified",p=>{A=p}),a.on("end",()=>n(A)),a.on("data",()=>{})})}DA.exports.integrityStream=XG;function XG(t){t=na(t);let e=t.integrity&&vA(t.integrity,t),r=e&&Object.keys(e).length,o=r&&e.pickAlgorithm(t),a=r&&e[o],n=Array.from(new Set(t.algorithms.concat(o?[o]:[]))),u=n.map(Kv.createHash),A=0,p=new rvt({transform(h,E,w){A+=h.length,u.forEach(D=>D.update(h,E)),w(null,h,E)}}).on("end",()=>{let h=t.options&&t.options.length?`?${t.options.join("?")}`:"",E=vA(u.map((D,b)=>`${n[b]}-${D.digest("base64")}${h}`).join(" "),t),w=r&&E.match(e,t);if(typeof t.size=="number"&&A!==t.size){let D=new Error(`stream size mismatch when checking ${e}. - Wanted: ${t.size} - Found: ${A}`);D.code="EBADSIZE",D.found=A,D.expected=t.size,D.sri=e,p.emit("error",D)}else if(t.integrity&&!w){let D=new Error(`${e} integrity checksum failed when using ${o}: wanted ${a} but got ${E}. (${A} bytes)`);D.code="EINTEGRITY",D.found=E,D.expected=a,D.algorithm=o,D.sri=e,p.emit("error",D)}else p.emit("size",A),p.emit("integrity",E),w&&p.emit("verified",w)});return p}DA.exports.create=fvt;function fvt(t){t=na(t);let e=t.algorithms,r=t.options.length?`?${t.options.join("?")}`:"",o=e.map(Kv.createHash);return{update:function(a,n){return o.forEach(u=>u.update(a,n)),this},digest:function(a){return e.reduce((u,A)=>{let p=o.shift().digest("base64"),h=new n0(`${A}-${p}${r}`,t);if(h.algorithm&&h.digest){let E=h.algorithm;u[E]||(u[E]=[]),u[E].push(h)}return u},new Cd)}}}var pvt=new Set(Kv.getHashes()),VBe=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>pvt.has(t));function hvt(t,e){return VBe.indexOf(t.toLowerCase())>=VBe.indexOf(e.toLowerCase())?t:e}});var Bve=_((qnr,wve)=>{var hDt=WN();function gDt(t){return hDt(t)?void 0:t}wve.exports=gDt});var Dve=_((jnr,vve)=>{var dDt=Cb(),mDt=hH(),yDt=yH(),EDt=Wg(),CDt=Eg(),IDt=Bve(),wDt=l8(),BDt=pH(),vDt=1,DDt=2,SDt=4,PDt=wDt(function(t,e){var r={};if(t==null)return r;var o=!1;e=dDt(e,function(n){return n=EDt(n,t),o||(o=n.length>1),n}),CDt(t,BDt(t),r),o&&(r=mDt(r,vDt|DDt|SDt,IDt));for(var a=e.length;a--;)yDt(r,e[a]);return r});vve.exports=PDt});St();Ve();St();var kve=ve("child_process"),Qve=et(sg());Gt();var oE=new Map([]);var P2={};Vt(P2,{BaseCommand:()=>ut,WorkspaceRequiredError:()=>or,getCli:()=>qhe,getDynamicLibs:()=>Hhe,getPluginConfiguration:()=>lE,openWorkspace:()=>aE,pluginCommands:()=>oE,runExit:()=>Nk});Gt();var ut=class extends ot{constructor(){super(...arguments);this.cwd=de.String("--cwd",{hidden:!0})}validateAndExecute(){if(typeof this.cwd<"u")throw new it("The --cwd option is ambiguous when used anywhere else than the very first parameter provided in the command line, before even the command path");return super.validateAndExecute()}};Ve();St();Gt();var or=class extends it{constructor(e,r){let o=V.relative(e,r),a=V.join(e,_t.fileName);super(`This command can only be run from within a workspace of your project (${o} isn't a workspace of ${a}).`)}};Ve();St();sA();Ol();z1();Gt();var PAt=et(ni());il();var Hhe=()=>new Map([["@yarnpkg/cli",P2],["@yarnpkg/core",S2],["@yarnpkg/fslib",Aw],["@yarnpkg/libzip",K1],["@yarnpkg/parsers",Ew],["@yarnpkg/shell",e2],["clipanion",Qw],["semver",PAt],["typanion",Yo]]);Ve();async function aE(t,e){let{project:r,workspace:o}=await Qt.find(t,e);if(!o)throw new or(r.cwd,e);return o}Ve();St();sA();Ol();z1();Gt();var NDt=et(ni());il();var MH={};Vt(MH,{AddCommand:()=>fE,BinCommand:()=>pE,CacheCleanCommand:()=>hE,ClipanionCommand:()=>CE,ConfigCommand:()=>yE,ConfigGetCommand:()=>gE,ConfigSetCommand:()=>dE,ConfigUnsetCommand:()=>mE,DedupeCommand:()=>EE,EntryCommand:()=>wE,ExecCommand:()=>vE,ExplainCommand:()=>PE,ExplainPeerRequirementsCommand:()=>DE,HelpCommand:()=>IE,InfoCommand:()=>xE,LinkCommand:()=>kE,NodeCommand:()=>QE,PluginCheckCommand:()=>FE,PluginImportCommand:()=>LE,PluginImportSourcesCommand:()=>NE,PluginListCommand:()=>RE,PluginRemoveCommand:()=>OE,PluginRuntimeCommand:()=>ME,RebuildCommand:()=>UE,RemoveCommand:()=>_E,RunCommand:()=>qE,RunIndexCommand:()=>HE,SetResolutionCommand:()=>jE,SetVersionCommand:()=>SE,SetVersionSourcesCommand:()=>TE,UnlinkCommand:()=>GE,UpCommand:()=>WE,VersionCommand:()=>BE,WhyCommand:()=>YE,WorkspaceCommand:()=>XE,WorkspacesListCommand:()=>zE,YarnCommand:()=>bE,dedupeUtils:()=>Yk,default:()=>Igt,suggestUtils:()=>nu});var Eme=et(sg());Ve();Ve();Ve();Gt();var bge=et(Q2());il();var nu={};Vt(nu,{Modifier:()=>lH,Strategy:()=>jk,Target:()=>F2,WorkspaceModifier:()=>vge,applyModifier:()=>Vft,extractDescriptorFromPath:()=>cH,extractRangeModifier:()=>Dge,fetchDescriptorFrom:()=>uH,findProjectDescriptors:()=>xge,getModifier:()=>R2,getSuggestedDescriptors:()=>T2,makeWorkspaceDescriptor:()=>Pge,toWorkspaceModifier:()=>Sge});Ve();Ve();St();var aH=et(ni()),Wft="workspace:",F2=(o=>(o.REGULAR="dependencies",o.DEVELOPMENT="devDependencies",o.PEER="peerDependencies",o))(F2||{}),lH=(o=>(o.CARET="^",o.TILDE="~",o.EXACT="",o))(lH||{}),vge=(o=>(o.CARET="^",o.TILDE="~",o.EXACT="*",o))(vge||{}),jk=(n=>(n.KEEP="keep",n.REUSE="reuse",n.PROJECT="project",n.LATEST="latest",n.CACHE="cache",n))(jk||{});function R2(t,e){return t.exact?"":t.caret?"^":t.tilde?"~":e.configuration.get("defaultSemverRangePrefix")}var Yft=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function Dge(t,{project:e}){let r=t.match(Yft);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function Vft(t,e){let{protocol:r,source:o,params:a,selector:n}=G.parseRange(t.range);return aH.default.valid(n)&&(n=`${e}${t.range}`),G.makeDescriptor(t,G.makeRange({protocol:r,source:o,params:a,selector:n}))}function Sge(t){switch(t){case"^":return"^";case"~":return"~";case"":return"*";default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function Pge(t,e){return G.makeDescriptor(t.anchoredDescriptor,`${Wft}${Sge(e)}`)}async function xge(t,{project:e,target:r}){let o=new Map,a=n=>{let u=o.get(n.descriptorHash);return u||o.set(n.descriptorHash,u={descriptor:n,locators:[]}),u};for(let n of e.workspaces)if(r==="peerDependencies"){let u=n.manifest.peerDependencies.get(t.identHash);u!==void 0&&a(u).locators.push(n.anchoredLocator)}else{let u=n.manifest.dependencies.get(t.identHash),A=n.manifest.devDependencies.get(t.identHash);r==="devDependencies"?A!==void 0?a(A).locators.push(n.anchoredLocator):u!==void 0&&a(u).locators.push(n.anchoredLocator):u!==void 0?a(u).locators.push(n.anchoredLocator):A!==void 0&&a(A).locators.push(n.anchoredLocator)}return o}async function cH(t,{cwd:e,workspace:r}){return await Kft(async o=>{V.isAbsolute(t)||(t=V.relative(r.cwd,V.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:a}=r,n=await uH(G.makeIdent(null,"archive"),t,{project:r.project,cache:o,workspace:r});if(!n)throw new Error("Assertion failed: The descriptor should have been found");let u=new Ri,A=a.configuration.makeResolver(),p=a.configuration.makeFetcher(),h={checksums:a.storedChecksums,project:a,cache:o,fetcher:p,report:u,resolver:A},E=A.bindDescriptor(n,r.anchoredLocator,h),w=G.convertDescriptorToLocator(E),D=await p.fetch(w,h),b=await _t.find(D.prefixPath,{baseFs:D.packageFs});if(!b.name)throw new Error("Target path doesn't have a name");return G.makeDescriptor(b.name,t)})}async function T2(t,{project:e,workspace:r,cache:o,target:a,fixed:n,modifier:u,strategies:A,maxResults:p=1/0}){if(!(p>=0))throw new Error(`Invalid maxResults (${p})`);let[h,E]=t.range!=="unknown"?n||Ur.validRange(t.range)||!t.range.match(/^[a-z0-9._-]+$/i)?[t.range,"latest"]:["unknown",t.range]:["unknown","latest"];if(h!=="unknown")return{suggestions:[{descriptor:t,name:`Use ${G.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let w=typeof r<"u"&&r!==null&&r.manifest[a].get(t.identHash)||null,D=[],b=[],C=async T=>{try{await T()}catch(N){b.push(N)}};for(let T of A){if(D.length>=p)break;switch(T){case"keep":await C(async()=>{w&&D.push({descriptor:w,name:`Keep ${G.prettyDescriptor(e.configuration,w)}`,reason:"(no changes)"})});break;case"reuse":await C(async()=>{for(let{descriptor:N,locators:U}of(await xge(t,{project:e,target:a})).values()){if(U.length===1&&U[0].locatorHash===r.anchoredLocator.locatorHash&&A.includes("keep"))continue;let J=`(originally used by ${G.prettyLocator(e.configuration,U[0])}`;J+=U.length>1?` and ${U.length-1} other${U.length>2?"s":""})`:")",D.push({descriptor:N,name:`Reuse ${G.prettyDescriptor(e.configuration,N)}`,reason:J})}});break;case"cache":await C(async()=>{for(let N of e.storedDescriptors.values())N.identHash===t.identHash&&D.push({descriptor:N,name:`Reuse ${G.prettyDescriptor(e.configuration,N)}`,reason:"(already used somewhere in the lockfile)"})});break;case"project":await C(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let N=e.tryWorkspaceByIdent(t);if(N===null)return;let U=Pge(N,u);D.push({descriptor:U,name:`Attach ${G.prettyDescriptor(e.configuration,U)}`,reason:`(local workspace at ${pe.pretty(e.configuration,N.relativeCwd,pe.Type.PATH)})`})});break;case"latest":{let N=e.configuration.get("enableNetwork"),U=e.configuration.get("enableOfflineMode");await C(async()=>{if(a==="peerDependencies")D.push({descriptor:G.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!N&&!U)D.push({descriptor:null,name:"Resolve from latest",reason:pe.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let J=await uH(t,E,{project:e,cache:o,workspace:r,modifier:u});J&&D.push({descriptor:J,name:`Use ${G.prettyDescriptor(e.configuration,J)}`,reason:`(resolved from ${U?"the cache":"latest"})`})}})}break}}return{suggestions:D.slice(0,p),rejections:b.slice(0,p)}}async function uH(t,e,{project:r,cache:o,workspace:a,preserveModifier:n=!0,modifier:u}){let A=r.configuration.normalizeDependency(G.makeDescriptor(t,e)),p=new Ri,h=r.configuration.makeFetcher(),E=r.configuration.makeResolver(),w={project:r,fetcher:h,cache:o,checksums:r.storedChecksums,report:p,cacheOptions:{skipIntegrityCheck:!0}},D={...w,resolver:E,fetchOptions:w},b=E.bindDescriptor(A,a.anchoredLocator,D),C=await E.getCandidates(b,{},D);if(C.length===0)return null;let T=C[0],{protocol:N,source:U,params:J,selector:te}=G.parseRange(G.convertToManifestRange(T.reference));if(N===r.configuration.get("defaultProtocol")&&(N=null),aH.default.valid(te)){let le=te;if(typeof u<"u")te=u+te;else if(n!==!1){let Ie=typeof n=="string"?n:A.range;te=Dge(Ie,{project:r})+te}let ce=G.makeDescriptor(T,G.makeRange({protocol:N,source:U,params:J,selector:te}));(await E.getCandidates(r.configuration.normalizeDependency(ce),{},D)).length!==1&&(te=le)}return G.makeDescriptor(T,G.makeRange({protocol:N,source:U,params:J,selector:te}))}async function Kft(t){return await ae.mktempPromise(async e=>{let r=ze.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Wr(e,{configuration:r,check:!1,immutable:!1}))})}var fE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.fixed=de.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=de.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=de.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=de.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=de.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=de.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=de.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=de.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=de.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=de.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=de.String("--mode",{description:"Change what artifacts installs generate",validator:js(yl)});this.silent=de.Boolean("--silent",{hidden:!0});this.packages=de.Rest()}static{this.paths=[["add"]]}static{this.usage=ot.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"],["Add a local package (gzipped tarball format) to the current workspace","$0 add local-package-name@file:../path/to/local-package-name-v0.1.2.tgz"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=A||r.get("preferReuse"),h=R2(this,o),E=[p?"reuse":void 0,"project",this.cached?"cache":void 0,"latest"].filter(U=>typeof U<"u"),w=A?1/0:1,D=await Promise.all(this.packages.map(async U=>{let J=U.match(/^\.{0,2}\//)?await cH(U,{cwd:this.context.cwd,workspace:a}):G.tryParseDescriptor(U),te=U.match(/^(https?:|git@github)/);if(te)throw new it(`It seems you are trying to add a package using a ${pe.pretty(r,`${te[0]}...`,pe.Type.RANGE)} url; we now require package names to be explicitly specified. -Try running the command again with the package name prefixed: ${pe.pretty(r,"yarn add",pe.Type.CODE)} ${pe.pretty(r,G.makeDescriptor(G.makeIdent(null,"my-package"),`${te[0]}...`),pe.Type.DESCRIPTOR)}`);if(!J)throw new it(`The ${pe.pretty(r,U,pe.Type.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let le=Jft(a,J,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(le.map(async ue=>{let Ie=await T2(J,{project:o,workspace:a,cache:n,fixed:u,target:ue,modifier:h,strategies:E,maxResults:w});return{request:J,suggestedDescriptors:Ie,target:ue}}))})).then(U=>U.flat()),b=await pA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async U=>{for(let{request:J,suggestedDescriptors:{suggestions:te,rejections:le}}of D)if(te.filter(ue=>ue.descriptor!==null).length===0){let[ue]=le;if(typeof ue>"u")throw new Error("Assertion failed: Expected an error to have been set");o.configuration.get("enableNetwork")?U.reportError(27,`${G.prettyDescriptor(r,J)} can't be resolved to a satisfying range`):U.reportError(27,`${G.prettyDescriptor(r,J)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),U.reportSeparator(),U.reportExceptionOnce(ue)}});if(b.hasErrors())return b.exitCode();let C=!1,T=[],N=[];for(let{suggestedDescriptors:{suggestions:U},target:J}of D){let te,le=U.filter(he=>he.descriptor!==null),ce=le[0].descriptor,ue=le.every(he=>G.areDescriptorsEqual(he.descriptor,ce));le.length===1||ue?te=ce:(C=!0,{answer:te}=await(0,bge.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:U.map(({descriptor:he,name:De,reason:Ee})=>he?{name:De,hint:Ee,descriptor:he}:{name:De,hint:Ee,disabled:!0}),onCancel:()=>process.exit(130),result(he){return this.find(he,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let Ie=a.manifest[J].get(te.identHash);(typeof Ie>"u"||Ie.descriptorHash!==te.descriptorHash)&&(a.manifest[J].set(te.identHash,te),this.optional&&(J==="dependencies"?a.manifest.ensureDependencyMeta({...te,range:"unknown"}).optional=!0:J==="peerDependencies"&&(a.manifest.ensurePeerDependencyMeta({...te,range:"unknown"}).optional=!0)),typeof Ie>"u"?T.push([a,J,te,E]):N.push([a,J,Ie,te]))}return await r.triggerMultipleHooks(U=>U.afterWorkspaceDependencyAddition,T),await r.triggerMultipleHooks(U=>U.afterWorkspaceDependencyReplacement,N),C&&this.context.stdout.write(` -`),await o.installWithNewReport({json:this.json,stdout:this.context.stdout,quiet:this.context.quiet},{cache:n,mode:this.mode})}};function Jft(t,e,{dev:r,peer:o,preferDev:a,optional:n}){let u=t.manifest.dependencies.has(e.identHash),A=t.manifest.devDependencies.has(e.identHash),p=t.manifest.peerDependencies.has(e.identHash);if((r||o)&&u)throw new it(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!o&&p)throw new it(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(n&&A)throw new it(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(n&&!o&&p)throw new it(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||a)&&n)throw new it(`Package "${G.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);let h=[];return o&&h.push("peerDependencies"),(r||a)&&h.push("devDependencies"),n&&h.push("dependencies"),h.length>0?h:A?["devDependencies"]:p?["peerDependencies"]:["dependencies"]}Ve();Ve();Gt();var pE=class extends ut{constructor(){super(...arguments);this.verbose=de.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=de.String({required:!1})}static{this.paths=[["bin"]]}static{this.usage=ot.Usage({description:"get the path to a binary script",details:` - When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. - - When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. - `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await Qt.find(r,this.context.cwd);if(await o.restoreInstallState(),this.name){let A=(await hn.getPackageAccessibleBinaries(a,{project:o})).get(this.name);if(!A)throw new it(`Couldn't find a binary named "${this.name}" for package "${G.prettyLocator(r,a)}"`);let[,p]=A;return this.context.stdout.write(`${p} -`),0}return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async u=>{let A=await hn.getPackageAccessibleBinaries(a,{project:o}),h=Array.from(A.keys()).reduce((E,w)=>Math.max(E,w.length),0);for(let[E,[w,D]]of A)u.reportJson({name:E,source:G.stringifyIdent(w),path:D});if(this.verbose)for(let[E,[w]]of A)u.reportInfo(null,`${E.padEnd(h," ")} ${G.prettyLocator(r,w)}`);else for(let E of A.keys())u.reportInfo(null,E)})).exitCode()}};Ve();St();Gt();var hE=class extends ut{constructor(){super(...arguments);this.mirror=de.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=de.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}static{this.paths=[["cache","clean"],["cache","clear"]]}static{this.usage=ot.Usage({description:"remove the shared cache files",details:` - This command will remove all the files from the cache. - `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(!r.get("enableCacheClean"))throw new it("Cache cleaning is currently disabled. To enable it, set `enableCacheClean: true` in your configuration file. Note: Cache cleaning is typically not required and should be avoided when using Zero-Installs.");let o=await Wr.find(r);return(await Lt.start({configuration:r,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&o.mirrorCwd!==null,u=!this.mirror;n&&(await ae.removePromise(o.mirrorCwd),await r.triggerHook(A=>A.cleanGlobalArtifacts,r)),u&&await ae.removePromise(o.cwd)})).exitCode()}};Ve();Gt();var Qge=et(L2()),AH=ve("util"),gE=class extends ut{constructor(){super(...arguments);this.why=de.Boolean("--why",!1,{description:"Print the explanation for why a setting has its value"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=de.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=de.String()}static{this.paths=[["config","get"]]}static{this.usage=ot.Usage({description:"read a configuration settings",details:` - This command will print a configuration setting. - - Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. - `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=this.name.replace(/[.[].*$/,""),a=this.name.replace(/^[^.[]*/,"");if(typeof r.settings.get(o)>"u")throw new it(`Couldn't find a configuration settings named "${o}"`);let u=r.getSpecial(o,{hideSecrets:!this.unsafe,getNativePaths:!0}),A=qe.convertMapsToIndexableObjects(u),p=a?(0,Qge.default)(A,a):A,h=await Lt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async E=>{E.reportJson(p)});if(!this.json){if(typeof p=="string")return this.context.stdout.write(`${p} -`),h.exitCode();AH.inspect.styles.name="cyan",this.context.stdout.write(`${(0,AH.inspect)(p,{depth:1/0,colors:r.get("enableColors"),compact:!1})} -`)}return h.exitCode()}};Ve();Gt();var Ide=et(gH()),wde=et(L2()),Bde=et(dH()),mH=ve("util"),dE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=de.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=de.String();this.value=de.String()}static{this.paths=[["config","set"]]}static{this.usage=ot.Usage({description:"change a configuration settings",details:` - This command will set a configuration setting. - - When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). - - When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. - `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new it("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new it(`Couldn't find a configuration settings named "${a}"`);if(a==="enableStrictSettings")throw new it("This setting only affects the file it's in, and thus cannot be set from the CLI");let A=this.json?JSON.parse(this.value):this.value;await(this.home?C=>ze.updateHomeConfiguration(C):C=>ze.updateConfiguration(o(),C))(C=>{if(n){let T=(0,Ide.default)(C);return(0,Bde.default)(T,this.name,A),T}else return{...C,[a]:A}});let E=(await ze.find(this.context.cwd,this.context.plugins)).getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),w=qe.convertMapsToIndexableObjects(E),D=n?(0,wde.default)(w,n):w;return(await Lt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async C=>{mH.inspect.styles.name="cyan",C.reportInfo(0,`Successfully set ${this.name} to ${(0,mH.inspect)(D,{depth:1/0,colors:r.get("enableColors"),compact:!1})}`)})).exitCode()}};Ve();Gt();var Tde=et(gH()),Lde=et(Pde()),Nde=et(EH()),mE=class extends ut{constructor(){super(...arguments);this.home=de.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=de.String()}static{this.paths=[["config","unset"]]}static{this.usage=ot.Usage({description:"unset a configuration setting",details:` - This command will unset a configuration setting. - `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new it("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new it(`Couldn't find a configuration settings named "${a}"`);let A=this.home?h=>ze.updateHomeConfiguration(h):h=>ze.updateConfiguration(o(),h);return(await Lt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async h=>{let E=!1;await A(w=>{if(!(0,Lde.default)(w,this.name))return h.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),E=!0,w;let D=n?(0,Tde.default)(w):{...w};return(0,Nde.default)(D,this.name),D}),E||h.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};Ve();St();Gt();var Wk=ve("util"),yE=class extends ut{constructor(){super(...arguments);this.noDefaults=de.Boolean("--no-defaults",!1,{description:"Omit the default values from the display"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.verbose=de.Boolean("-v,--verbose",{hidden:!0});this.why=de.Boolean("--why",{hidden:!0});this.names=de.Rest()}static{this.paths=[["config"]]}static{this.usage=ot.Usage({description:"display the current configuration",details:` - This command prints the current active configuration settings. - `,examples:[["Print the active configuration settings","$0 config"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins,{strict:!1}),o=await Qy({configuration:r,stdout:this.context.stdout,forceError:this.json},[{option:this.verbose,message:"The --verbose option is deprecated, the settings' descriptions are now always displayed"},{option:this.why,message:"The --why option is deprecated, the settings' sources are now always displayed"}]);if(o!==null)return o;let a=this.names.length>0?[...new Set(this.names)].sort():[...r.settings.keys()].sort(),n,u=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async A=>{if(r.invalid.size>0&&!this.json){for(let[p,h]of r.invalid)A.reportError(34,`Invalid configuration key "${p}" in ${h}`);A.reportSeparator()}if(this.json)for(let p of a){let h=r.settings.get(p);typeof h>"u"&&A.reportError(34,`No configuration key named "${p}"`);let E=r.getSpecial(p,{hideSecrets:!0,getNativePaths:!0}),w=r.sources.get(p)??"",D=w&&w[0]!=="<"?Ae.fromPortablePath(w):w;A.reportJson({key:p,effective:E,source:D,...h})}else{let p={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},h={},E={children:h};for(let w of a){if(this.noDefaults&&!r.sources.has(w))continue;let D=r.settings.get(w),b=r.sources.get(w)??"",C=r.getSpecial(w,{hideSecrets:!0,getNativePaths:!0}),T={Description:{label:"Description",value:pe.tuple(pe.Type.MARKDOWN,{text:D.description,format:this.cli.format(),paragraphs:!1})},Source:{label:"Source",value:pe.tuple(b[0]==="<"?pe.Type.CODE:pe.Type.PATH,b)}};h[w]={value:pe.tuple(pe.Type.CODE,w),children:T};let N=(U,J)=>{for(let[te,le]of J)if(le instanceof Map){let ce={};U[te]={children:ce},N(ce,le)}else U[te]={label:te,value:pe.tuple(pe.Type.NO_HINT,(0,Wk.inspect)(le,p))}};C instanceof Map?N(T,C):T.Value={label:"Value",value:pe.tuple(pe.Type.NO_HINT,(0,Wk.inspect)(C,p))}}a.length!==1&&(n=void 0),As.emitTree(E,{configuration:r,json:this.json,stdout:this.context.stdout,separators:2})}});if(!this.json&&typeof n<"u"){let A=a[0],p=(0,Wk.inspect)(r.getSpecial(A,{hideSecrets:!0,getNativePaths:!0}),{colors:r.get("enableColors")});this.context.stdout.write(` -`),this.context.stdout.write(`${p} -`)}return u.exitCode()}};Ve();Gt();il();var Yk={};Vt(Yk,{Strategy:()=>N2,acceptedStrategies:()=>Q0t,dedupe:()=>CH});Ve();Ve();var Ode=et(Xo()),N2=(e=>(e.HIGHEST="highest",e))(N2||{}),Q0t=new Set(Object.values(N2)),F0t={highest:async(t,e,{resolver:r,fetcher:o,resolveOptions:a,fetchOptions:n})=>{let u=new Map;for(let[p,h]of t.storedResolutions){let E=t.storedDescriptors.get(p);if(typeof E>"u")throw new Error(`Assertion failed: The descriptor (${p}) should have been registered`);qe.getSetWithDefault(u,E.identHash).add(h)}let A=new Map(qe.mapAndFilter(t.storedDescriptors.values(),p=>G.isVirtualDescriptor(p)?qe.mapAndFilter.skip:[p.descriptorHash,qe.makeDeferred()]));for(let p of t.storedDescriptors.values()){let h=A.get(p.descriptorHash);if(typeof h>"u")throw new Error(`Assertion failed: The descriptor (${p.descriptorHash}) should have been registered`);let E=t.storedResolutions.get(p.descriptorHash);if(typeof E>"u")throw new Error(`Assertion failed: The resolution (${p.descriptorHash}) should have been registered`);let w=t.originalPackages.get(E);if(typeof w>"u")throw new Error(`Assertion failed: The package (${E}) should have been registered`);Promise.resolve().then(async()=>{let D=r.getResolutionDependencies(p,a),b=Object.fromEntries(await qe.allSettledSafe(Object.entries(D).map(async([te,le])=>{let ce=A.get(le.descriptorHash);if(typeof ce>"u")throw new Error(`Assertion failed: The descriptor (${le.descriptorHash}) should have been registered`);let ue=await ce.promise;if(!ue)throw new Error("Assertion failed: Expected the dependency to have been through the dedupe process itself");return[te,ue.updatedPackage]})));if(e.length&&!Ode.default.isMatch(G.stringifyIdent(p),e)||!r.shouldPersistResolution(w,a))return w;let C=u.get(p.identHash);if(typeof C>"u")throw new Error(`Assertion failed: The resolutions (${p.identHash}) should have been registered`);if(C.size===1)return w;let T=[...C].map(te=>{let le=t.originalPackages.get(te);if(typeof le>"u")throw new Error(`Assertion failed: The package (${te}) should have been registered`);return le}),N=await r.getSatisfying(p,b,T,a),U=N.locators?.[0];if(typeof U>"u"||!N.sorted)return w;let J=t.originalPackages.get(U.locatorHash);if(typeof J>"u")throw new Error(`Assertion failed: The package (${U.locatorHash}) should have been registered`);return J}).then(async D=>{let b=await t.preparePackage(D,{resolver:r,resolveOptions:a});h.resolve({descriptor:p,currentPackage:w,updatedPackage:D,resolvedPackage:b})}).catch(D=>{h.reject(D)})}return[...A.values()].map(p=>p.promise)}};async function CH(t,{strategy:e,patterns:r,cache:o,report:a}){let{configuration:n}=t,u=new Ri,A=n.makeResolver(),p=n.makeFetcher(),h={cache:o,checksums:t.storedChecksums,fetcher:p,project:t,report:u,cacheOptions:{skipIntegrityCheck:!0}},E={project:t,resolver:A,report:u,fetchOptions:h};return await a.startTimerPromise("Deduplication step",async()=>{let w=F0t[e],D=await w(t,r,{resolver:A,resolveOptions:E,fetcher:p,fetchOptions:h}),b=Ws.progressViaCounter(D.length);await a.reportProgress(b);let C=0;await Promise.all(D.map(U=>U.then(J=>{if(J===null||J.currentPackage.locatorHash===J.updatedPackage.locatorHash)return;C++;let{descriptor:te,currentPackage:le,updatedPackage:ce}=J;a.reportInfo(0,`${G.prettyDescriptor(n,te)} can be deduped from ${G.prettyLocator(n,le)} to ${G.prettyLocator(n,ce)}`),a.reportJson({descriptor:G.stringifyDescriptor(te),currentResolution:G.stringifyLocator(le),updatedResolution:G.stringifyLocator(ce)}),t.storedResolutions.set(te.descriptorHash,ce.locatorHash)}).finally(()=>b.tick())));let T;switch(C){case 0:T="No packages";break;case 1:T="One package";break;default:T=`${C} packages`}let N=pe.pretty(n,e,pe.Type.CODE);return a.reportInfo(0,`${T} can be deduped using the ${N} strategy`),C})}var EE=class extends ut{constructor(){super(...arguments);this.strategy=de.String("-s,--strategy","highest",{description:"The strategy to use when deduping dependencies",validator:js(N2)});this.check=de.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=de.String("--mode",{description:"Change what artifacts installs generate",validator:js(yl)});this.patterns=de.Rest()}static{this.paths=[["dedupe"]]}static{this.usage=ot.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd),a=await Wr.find(r);await o.restoreInstallState({restoreResolutions:!1});let n=0,u=await Lt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout,json:this.json},async A=>{n=await CH(o,{strategy:this.strategy,patterns:this.patterns,cache:a,report:A})});return u.hasErrors()?u.exitCode():this.check?n?1:0:await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:a,mode:this.mode})}};Ve();Gt();var CE=class extends ut{static{this.paths=[["--clipanion=definitions"]]}async execute(){let{plugins:e}=await ze.find(this.context.cwd,this.context.plugins),r=[];for(let u of e){let{commands:A}=u[1];if(A){let h=Ko.from(A).definitions();r.push([u[0],h])}}let o=this.cli.definitions(),a=(u,A)=>u.split(" ").slice(1).join()===A.split(" ").slice(1).join(),n=Mde()["@yarnpkg/builder"].bundles.standard;for(let u of r){let A=u[1];for(let p of A)o.find(h=>a(h.path,p.path)).plugin={name:u[0],isDefault:n.includes(u[0])}}this.context.stdout.write(`${JSON.stringify(o,null,2)} -`)}};var IE=class extends ut{static{this.paths=[["help"],["--help"],["-h"]]}async execute(){this.context.stdout.write(this.cli.usage(null))}};Ve();St();Gt();var wE=class extends ut{constructor(){super(...arguments);this.leadingArgument=de.String();this.args=de.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!G.tryParseIdent(this.leadingArgument)){let r=V.resolve(this.context.cwd,Ae.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:r})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}};Ve();var BE=class extends ut{static{this.paths=[["-v"],["--version"]]}async execute(){this.context.stdout.write(`${nn||""} -`)}};Ve();Ve();Gt();var vE=class extends ut{constructor(){super(...arguments);this.commandName=de.String();this.args=de.Proxy()}static{this.paths=[["exec"]]}static{this.usage=ot.Usage({description:"execute a shell script",details:` - This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. - - It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await Qt.find(r,this.context.cwd);return await o.restoreInstallState(),await hn.executePackageShellcode(a,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:o})}};Ve();Gt();il();var DE=class extends ut{constructor(){super(...arguments);this.hash=de.String({required:!1,validator:NS(Pm(),[Bw(/^p[0-9a-f]{5}$/)])})}static{this.paths=[["explain","peer-requirements"]]}static{this.usage=ot.Usage({description:"explain a set of peer requirements",details:` - A peer requirement represents all peer requests that a subject must satisfy when providing a requested package to requesters. - - When the hash argument is specified, this command prints a detailed explanation of the peer requirement corresponding to the hash and whether it is satisfied or not. - - When used without arguments, this command lists all peer requirements and the corresponding hash that can be used to get detailed information about a given requirement. - - **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). - `,examples:[["Explain the corresponding peer requirement for a hash","$0 explain peer-requirements p1a4ed"],["List all peer requirements","$0 explain peer-requirements"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd);return await o.restoreInstallState({restoreResolutions:!1}),await o.applyLightResolution(),typeof this.hash<"u"?await T0t(this.hash,o,{stdout:this.context.stdout}):await L0t(o,{stdout:this.context.stdout})}};async function T0t(t,e,r){let o=e.peerRequirementNodes.get(t);if(typeof o>"u")throw new Error(`No peerDependency requirements found for hash: "${t}"`);let a=new Set,n=p=>a.has(p.requester.locatorHash)?{value:pe.tuple(pe.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:p.children.size>0?[{value:pe.tuple(pe.Type.NO_HINT,"...")}]:[]}:(a.add(p.requester.locatorHash),{value:pe.tuple(pe.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:Object.fromEntries(Array.from(p.children.values(),h=>[G.stringifyLocator(h.requester),n(h)]))}),u=e.peerWarnings.find(p=>p.hash===t);return(await Lt.start({configuration:e.configuration,stdout:r.stdout,includeFooter:!1,includePrefix:!1},async p=>{let h=pe.mark(e.configuration),E=u?h.Cross:h.Check;if(p.reportInfo(0,`Package ${pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)} is requested to provide ${pe.pretty(e.configuration,o.ident,pe.Type.IDENT)} by its descendants`),p.reportSeparator(),p.reportInfo(0,pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)),As.emitTree({children:Object.fromEntries(Array.from(o.requests.values(),w=>[G.stringifyLocator(w.requester),n(w)]))},{configuration:e.configuration,stdout:r.stdout,json:!1}),p.reportSeparator(),o.provided.range==="missing:"){let w=u?"":" , but all peer requests are optional";p.reportInfo(0,`${E} Package ${pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)} does not provide ${pe.pretty(e.configuration,o.ident,pe.Type.IDENT)}${w}.`)}else{let w=e.storedResolutions.get(o.provided.descriptorHash);if(!w)throw new Error("Assertion failed: Expected the descriptor to be registered");let D=e.storedPackages.get(w);if(!D)throw new Error("Assertion failed: Expected the package to be registered");p.reportInfo(0,`${E} Package ${pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)} provides ${pe.pretty(e.configuration,o.ident,pe.Type.IDENT)} with version ${G.prettyReference(e.configuration,D.version??"0.0.0")}, ${u?"which does not satisfy all requests.":"which satisfies all requests"}`),u?.type===3&&(u.range?p.reportInfo(0,` The combined requested range is ${pe.pretty(e.configuration,u.range,pe.Type.RANGE)}`):p.reportInfo(0," Unfortunately, the requested ranges have no overlap"))}})).exitCode()}async function L0t(t,e){return(await Lt.start({configuration:t.configuration,stdout:e.stdout,includeFooter:!1,includePrefix:!1},async o=>{let a=pe.mark(t.configuration),n=qe.sortMap(t.peerRequirementNodes,[([,u])=>G.stringifyLocator(u.subject),([,u])=>G.stringifyIdent(u.ident)]);for(let[,u]of n.values()){if(!u.root)continue;let A=t.peerWarnings.find(E=>E.hash===u.hash),p=[...G.allPeerRequests(u)],h;if(p.length>2?h=` and ${p.length-1} other dependencies`:p.length===2?h=" and 1 other dependency":h="",u.provided.range!=="missing:"){let E=t.storedResolutions.get(u.provided.descriptorHash);if(!E)throw new Error("Assertion failed: Expected the resolution to have been registered");let w=t.storedPackages.get(E);if(!w)throw new Error("Assertion failed: Expected the provided package to have been registered");let D=`${pe.pretty(t.configuration,u.hash,pe.Type.CODE)} \u2192 ${A?a.Cross:a.Check} ${G.prettyLocator(t.configuration,u.subject)} provides ${G.prettyLocator(t.configuration,w)} to ${G.prettyLocator(t.configuration,p[0].requester)}${h}`;A?o.reportWarning(0,D):o.reportInfo(0,D)}else{let E=`${pe.pretty(t.configuration,u.hash,pe.Type.CODE)} \u2192 ${A?a.Cross:a.Check} ${G.prettyLocator(t.configuration,u.subject)} doesn't provide ${G.prettyIdent(t.configuration,u.ident)} to ${G.prettyLocator(t.configuration,p[0].requester)}${h}`;A?o.reportWarning(0,E):o.reportInfo(0,E)}}})).exitCode()}Ve();Gt();il();Ve();Ve();St();Gt();var Ude=et(ni()),SE=class extends ut{constructor(){super(...arguments);this.useYarnPath=de.Boolean("--yarn-path",{description:"Set the yarnPath setting even if the version can be accessed by Corepack"});this.onlyIfNeeded=de.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=de.String()}static{this.paths=[["set","version"]]}static{this.usage=ot.Usage({description:"lock the Yarn version used by the project",details:"\n This command will set a specific release of Yarn to be used by Corepack: https://nodejs.org/api/corepack.html.\n\n By default it only will set the `packageManager` field at the root of your project, but if the referenced release cannot be represented this way, if you already have `yarnPath` configured, or if you set the `--yarn-path` command line flag, then the release will also be downloaded from the Yarn GitHub repository, stored inside your project, and referenced via the `yarnPath` settings from your project `.yarnrc.yml` file.\n\n A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting different behavior.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&r.get("yarnPath")){let A=r.sources.get("yarnPath");if(!A)throw new Error("Assertion failed: Expected 'yarnPath' to have a source");let p=r.projectCwd??r.startingCwd;if(V.contains(p,A))return 0}let o=()=>{if(typeof nn>"u")throw new it("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},a,n=(A,p)=>({version:p,url:A.replace(/\{\}/g,p)});if(this.version==="self")a={url:o(),version:nn??"self"};else if(this.version==="latest"||this.version==="berry"||this.version==="stable")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await O2(r,"stable"));else if(this.version==="canary")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await O2(r,"canary"));else if(this.version==="classic")a={url:"https://classic.yarnpkg.com/latest.js",version:"classic"};else if(this.version.match(/^https?:/))a={url:this.version,version:"remote"};else if(this.version.match(/^\.{0,2}[\\/]/)||Ae.isAbsolute(this.version))a={url:`file://${V.resolve(Ae.toPortablePath(this.version))}`,version:"file"};else if(Ur.satisfiesWithPrereleases(this.version,">=2.0.0"))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",this.version);else if(Ur.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))a=n("https://github.com/yarnpkg/yarn/releases/download/v{}/yarn-{}.js",this.version);else if(Ur.validRange(this.version))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await N0t(r,this.version));else throw new it(`Invalid version descriptor "${this.version}"`);return(await Lt.start({configuration:r,stdout:this.context.stdout,includeLogs:!this.context.quiet},async A=>{let p=async()=>{let h="file://";return a.url.startsWith(h)?(A.reportInfo(0,`Retrieving ${pe.pretty(r,a.url,pe.Type.PATH)}`),await ae.readFilePromise(a.url.slice(h.length))):(A.reportInfo(0,`Downloading ${pe.pretty(r,a.url,pe.Type.URL)}`),await on.get(a.url,{configuration:r}))};await IH(r,a.version,p,{report:A,useYarnPath:this.useYarnPath})})).exitCode()}};async function N0t(t,e){let o=(await on.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(a=>Ur.satisfiesWithPrereleases(a,e));if(o.length===0)throw new it(`No matching release found for range ${pe.pretty(t,e,pe.Type.RANGE)}.`);return o[0]}async function O2(t,e){let r=await on.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new it(`Tag ${pe.pretty(t,e,pe.Type.RANGE)} not found`);return r.latest[e]}async function IH(t,e,r,{report:o,useYarnPath:a}){let n,u=async()=>(typeof n>"u"&&(n=await r()),n);if(e===null){let te=await u();await ae.mktempPromise(async le=>{let ce=V.join(le,"yarn.cjs");await ae.writeFilePromise(ce,te);let{stdout:ue}=await Hr.execvp(process.execPath,[Ae.fromPortablePath(ce),"--version"],{cwd:le,env:{...t.env,YARN_IGNORE_PATH:"1"}});if(e=ue.trim(),!Ude.default.valid(e))throw new Error(`Invalid semver version. ${pe.pretty(t,"yarn --version",pe.Type.CODE)} returned: -${e}`)})}let A=t.projectCwd??t.startingCwd,p=V.resolve(A,".yarn/releases"),h=V.resolve(p,`yarn-${e}.cjs`),E=V.relative(t.startingCwd,h),w=qe.isTaggedYarnVersion(e),D=t.get("yarnPath"),b=!w,C=b||!!D||!!a;if(a===!1){if(b)throw new Jt(0,"You explicitly opted out of yarnPath usage in your command line, but the version you specified cannot be represented by Corepack");C=!1}else!C&&!process.env.COREPACK_ROOT&&(o.reportWarning(0,`You don't seem to have ${pe.applyHyperlink(t,"Corepack","https://nodejs.org/api/corepack.html")} enabled; we'll have to rely on ${pe.applyHyperlink(t,"yarnPath","https://yarnpkg.com/configuration/yarnrc#yarnPath")} instead`),C=!0);if(C){let te=await u();o.reportInfo(0,`Saving the new release in ${pe.pretty(t,E,"magenta")}`),await ae.removePromise(V.dirname(h)),await ae.mkdirPromise(V.dirname(h),{recursive:!0}),await ae.writeFilePromise(h,te,{mode:493}),await ze.updateConfiguration(A,{yarnPath:V.relative(A,h)})}else await ae.removePromise(V.dirname(h)),await ze.updateConfiguration(A,{yarnPath:ze.deleteProperty});let T=await _t.tryFind(A)||new _t;T.packageManager=`yarn@${w?e:await O2(t,"stable")}`;let N={};T.exportTo(N);let U=V.join(A,_t.fileName),J=`${JSON.stringify(N,null,T.indent)} -`;return await ae.changeFilePromise(U,J,{automaticNewlines:!0}),{bundleVersion:e}}function _de(t){return vr[jS(t)]}var O0t=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function M0t(t){let r=`https://repo.yarnpkg.com/${qe.isTaggedYarnVersion(nn)?nn:await O2(t,"canary")}/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx`,o=await on.get(r,{configuration:t});return new Map(Array.from(o.toString().matchAll(O0t),({groups:a})=>{if(!a)throw new Error("Assertion failed: Expected the match to have been successful");let n=_de(a.code);if(a.name!==n)throw new Error(`Assertion failed: Invalid error code data: Expected "${a.name}" to be named "${n}"`);return[a.code,a.details]}))}var PE=class extends ut{constructor(){super(...arguments);this.code=de.String({required:!1,validator:vw(Pm(),[Bw(/^YN[0-9]{4}$/)])});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["explain"]]}static{this.usage=ot.Usage({description:"explain an error code",details:` - When the code argument is specified, this command prints its name and its details. - - When used without arguments, this command lists all error codes and their names. - `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(typeof this.code<"u"){let o=_de(this.code),a=pe.pretty(r,o,pe.Type.CODE),n=this.cli.format().header(`${this.code} - ${a}`),A=(await M0t(r)).get(this.code),p=typeof A<"u"?pe.jsonOrPretty(this.json,r,pe.tuple(pe.Type.MARKDOWN,{text:A,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. - -You can help us by editing this page on GitHub \u{1F642}: -${pe.jsonOrPretty(this.json,r,pe.tuple(pe.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx"))} -`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:o,details:p})} -`):this.context.stdout.write(`${n} - -${p} -`)}else{let o={children:qe.mapAndFilter(Object.entries(vr),([a,n])=>Number.isNaN(Number(a))?qe.mapAndFilter.skip:{label:Ju(Number(a)),value:pe.tuple(pe.Type.CODE,n)})};As.emitTree(o,{configuration:r,stdout:this.context.stdout,json:this.json})}}};Ve();St();Gt();var Hde=et(Xo()),xE=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=de.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=de.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=de.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=de.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=de.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=de.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=de.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=de.Rest()}static{this.paths=[["info"]]}static{this.usage=ot.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a&&!this.all)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let u=new Set(this.extra);this.cache&&u.add("cache"),this.dependents&&u.add("dependents"),this.manifest&&u.add("manifest");let A=(le,{recursive:ce})=>{let ue=le.anchoredLocator.locatorHash,Ie=new Map,he=[ue];for(;he.length>0;){let De=he.shift();if(Ie.has(De))continue;let Ee=o.storedPackages.get(De);if(typeof Ee>"u")throw new Error("Assertion failed: Expected the package to be registered");if(Ie.set(De,Ee),G.isVirtualLocator(Ee)&&he.push(G.devirtualizeLocator(Ee).locatorHash),!(!ce&&De!==ue))for(let g of Ee.dependencies.values()){let me=o.storedResolutions.get(g.descriptorHash);if(typeof me>"u")throw new Error("Assertion failed: Expected the resolution to be registered");he.push(me)}}return Ie.values()},p=({recursive:le})=>{let ce=new Map;for(let ue of o.workspaces)for(let Ie of A(ue,{recursive:le}))ce.set(Ie.locatorHash,Ie);return ce.values()},h=({all:le,recursive:ce})=>le&&ce?o.storedPackages.values():le?p({recursive:ce}):A(a,{recursive:ce}),E=({all:le,recursive:ce})=>{let ue=h({all:le,recursive:ce}),Ie=this.patterns.map(Ee=>{let g=G.parseLocator(Ee),me=Hde.default.makeRe(G.stringifyIdent(g)),Ce=G.isVirtualLocator(g),fe=Ce?G.devirtualizeLocator(g):g;return ie=>{let Z=G.stringifyIdent(ie);if(!me.test(Z))return!1;if(g.reference==="unknown")return!0;let Se=G.isVirtualLocator(ie),Re=Se?G.devirtualizeLocator(ie):ie;return!(Ce&&Se&&g.reference!==ie.reference||fe.reference!==Re.reference)}}),he=qe.sortMap([...ue],Ee=>G.stringifyLocator(Ee));return{selection:he.filter(Ee=>Ie.length===0||Ie.some(g=>g(Ee))),sortedLookup:he}},{selection:w,sortedLookup:D}=E({all:this.all,recursive:this.recursive});if(w.length===0)throw new it("No package matched your request");let b=new Map;if(this.dependents)for(let le of D)for(let ce of le.dependencies.values()){let ue=o.storedResolutions.get(ce.descriptorHash);if(typeof ue>"u")throw new Error("Assertion failed: Expected the resolution to be registered");qe.getArrayWithDefault(b,ue).push(le)}let C=new Map;for(let le of D){if(!G.isVirtualLocator(le))continue;let ce=G.devirtualizeLocator(le);qe.getArrayWithDefault(C,ce.locatorHash).push(le)}let T={},N={children:T},U=r.makeFetcher(),J={project:o,fetcher:U,cache:n,checksums:o.storedChecksums,report:new Ri,cacheOptions:{skipIntegrityCheck:!0}},te=[async(le,ce,ue)=>{if(!ce.has("manifest"))return;let Ie=await U.fetch(le,J),he;try{he=await _t.find(Ie.prefixPath,{baseFs:Ie.packageFs})}finally{Ie.releaseFs?.()}ue("Manifest",{License:pe.tuple(pe.Type.NO_HINT,he.license),Homepage:pe.tuple(pe.Type.URL,he.raw.homepage??null)})},async(le,ce,ue)=>{if(!ce.has("cache"))return;let Ie=o.storedChecksums.get(le.locatorHash)??null,he=n.getLocatorPath(le,Ie),De;if(he!==null)try{De=await ae.statPromise(he)}catch{}let Ee=typeof De<"u"?[De.size,pe.Type.SIZE]:void 0;ue("Cache",{Checksum:pe.tuple(pe.Type.NO_HINT,Ie),Path:pe.tuple(pe.Type.PATH,he),Size:Ee})}];for(let le of w){let ce=G.isVirtualLocator(le);if(!this.virtuals&&ce)continue;let ue={},Ie={value:[le,pe.Type.LOCATOR],children:ue};if(T[G.stringifyLocator(le)]=Ie,this.nameOnly){delete Ie.children;continue}let he=C.get(le.locatorHash);typeof he<"u"&&(ue.Instances={label:"Instances",value:pe.tuple(pe.Type.NUMBER,he.length)}),ue.Version={label:"Version",value:pe.tuple(pe.Type.NO_HINT,le.version)};let De=(g,me)=>{let Ce={};if(ue[g]=Ce,Array.isArray(me))Ce.children=me.map(fe=>({value:fe}));else{let fe={};Ce.children=fe;for(let[ie,Z]of Object.entries(me))typeof Z>"u"||(fe[ie]={label:ie,value:Z})}};if(!ce){for(let g of te)await g(le,u,De);await r.triggerHook(g=>g.fetchPackageInfo,le,u,De)}le.bin.size>0&&!ce&&De("Exported Binaries",[...le.bin.keys()].map(g=>pe.tuple(pe.Type.PATH,g)));let Ee=b.get(le.locatorHash);typeof Ee<"u"&&Ee.length>0&&De("Dependents",Ee.map(g=>pe.tuple(pe.Type.LOCATOR,g))),le.dependencies.size>0&&!ce&&De("Dependencies",[...le.dependencies.values()].map(g=>{let me=o.storedResolutions.get(g.descriptorHash),Ce=typeof me<"u"?o.storedPackages.get(me)??null:null;return pe.tuple(pe.Type.RESOLUTION,{descriptor:g,locator:Ce})})),le.peerDependencies.size>0&&ce&&De("Peer dependencies",[...le.peerDependencies.values()].map(g=>{let me=le.dependencies.get(g.identHash),Ce=typeof me<"u"?o.storedResolutions.get(me.descriptorHash)??null:null,fe=Ce!==null?o.storedPackages.get(Ce)??null:null;return pe.tuple(pe.Type.RESOLUTION,{descriptor:g,locator:fe})}))}As.emitTree(N,{configuration:r,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Ve();St();Ol();var Vk=et(sg());Gt();var wH=et(ni());il();var U0t=[{selector:t=>t===-1,name:"nodeLinker",value:"node-modules"},{selector:t=>t!==-1&&t<8,name:"enableGlobalCache",value:!1},{selector:t=>t!==-1&&t<8,name:"compressionLevel",value:"mixed"}],bE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=de.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=de.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.refreshLockfile=de.Boolean("--refresh-lockfile",{description:"Refresh the package metadata stored in the lockfile"});this.checkCache=de.Boolean("--check-cache",{description:"Always refetch the packages and ensure that their checksums are consistent"});this.checkResolutions=de.Boolean("--check-resolutions",{description:"Validates that the package resolutions are coherent"});this.inlineBuilds=de.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=de.String("--mode",{description:"Change what artifacts installs generate",validator:js(yl)});this.cacheFolder=de.String("--cache-folder",{hidden:!0});this.frozenLockfile=de.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=de.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=de.Boolean("--non-interactive",{hidden:!0});this.preferOffline=de.Boolean("--prefer-offline",{hidden:!0});this.production=de.Boolean("--production",{hidden:!0});this.registry=de.String("--registry",{hidden:!0});this.silent=de.Boolean("--silent",{hidden:!0});this.networkTimeout=de.String("--network-timeout",{hidden:!0})}static{this.paths=[["install"],ot.Default]}static{this.usage=ot.Usage({description:"install the project dependencies",details:"\n This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics:\n\n - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\n\n - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of `cacheFolder` in `yarn config` to see where the cache files are stored).\n\n - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the `.pnp.cjs` file you might know).\n\n - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail.\n\n Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your `.pnp.cjs` file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\n\n If the `--immutable` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the `immutablePatterns` configuration setting). For backward compatibility we offer an alias under the name of `--frozen-lockfile`, but it will be removed in a later release.\n\n If the `--immutable-cache` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\n\n If the `--refresh-lockfile` option is set, Yarn will keep the same resolution for the packages currently in the lockfile but will refresh their metadata. If used together with `--immutable`, it can validate that the lockfile information are consistent. This flag is enabled by default when Yarn detects it runs within a pull request context.\n\n If the `--check-cache` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\n\n If the `--inline-builds` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n ",examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<"u"&&r.useWithSource("",{enableInlineBuilds:this.inlineBuilds},r.startingCwd,{overwrite:!0});let o=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,a=await Qy({configuration:r,stdout:this.context.stdout},[{option:this.ignoreEngines,message:"The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",error:!Vk.default.VERCEL},{option:this.registry,message:"The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file"},{option:this.preferOffline,message:"The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",error:!Vk.default.VERCEL},{option:this.production,message:"The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",error:!0},{option:this.nonInteractive,message:"The --non-interactive option is deprecated",error:!o},{option:this.frozenLockfile,message:"The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",callback:()=>this.immutable=this.frozenLockfile},{option:this.cacheFolder,message:"The cache-folder option has been deprecated; use rc settings instead",error:!Vk.default.NETLIFY}]);if(a!==null)return a;let n=this.mode==="update-lockfile";if(n&&(this.immutable||this.immutableCache))throw new it(`${pe.pretty(r,"--immutable",pe.Type.CODE)} and ${pe.pretty(r,"--immutable-cache",pe.Type.CODE)} cannot be used with ${pe.pretty(r,"--mode=update-lockfile",pe.Type.CODE)}`);let u=(this.immutable??r.get("enableImmutableInstalls"))&&!n,A=this.immutableCache&&!n;if(r.projectCwd!==null){let T=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U=!1;await q0t(r,u)&&(N.reportInfo(48,"Automatically removed core plugins that are now builtins \u{1F44D}"),U=!0),await H0t(r,u)&&(N.reportInfo(48,"Automatically fixed merge conflicts \u{1F44D}"),U=!0),U&&N.reportSeparator()});if(T.hasErrors())return T.exitCode()}if(r.projectCwd!==null){let T=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{if(ze.telemetry?.isNew)ze.telemetry.commitTips(),N.reportInfo(65,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),N.reportInfo(65,`Run ${pe.pretty(r,"yarn config set --home enableTelemetry 0",pe.Type.CODE)} to disable`),N.reportSeparator();else if(ze.telemetry?.shouldShowTips){let U=await on.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0}).catch(()=>null);if(U!==null){let J=null;if(nn!==null){let le=wH.default.prerelease(nn)?"canary":"stable",ce=U.latest[le];wH.default.gt(ce,nn)&&(J=[le,ce])}if(J)ze.telemetry.commitTips(),N.reportInfo(88,`${pe.applyStyle(r,`A new ${J[0]} version of Yarn is available:`,pe.Style.BOLD)} ${G.prettyReference(r,J[1])}!`),N.reportInfo(88,`Upgrade now by running ${pe.pretty(r,`yarn set version ${J[1]}`,pe.Type.CODE)}`),N.reportSeparator();else{let te=ze.telemetry.selectTip(U.tips);te&&(N.reportInfo(89,pe.pretty(r,te.message,pe.Type.MARKDOWN_INLINE)),te.url&&N.reportInfo(89,`Learn more at ${te.url}`),N.reportSeparator())}}}});if(T.hasErrors())return T.exitCode()}let{project:p,workspace:h}=await Qt.find(r,this.context.cwd),E=p.lockfileLastVersion;if(E!==null){let T=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U={};for(let J of U0t)J.selector(E)&&typeof r.sources.get(J.name)>"u"&&(r.use("",{[J.name]:J.value},p.cwd,{overwrite:!0}),U[J.name]=J.value);Object.keys(U).length>0&&(await ze.updateConfiguration(p.cwd,U),N.reportInfo(87,"Migrated your project to the latest Yarn version \u{1F680}"),N.reportSeparator())});if(T.hasErrors())return T.exitCode()}let w=await Wr.find(r,{immutable:A,check:this.checkCache});if(!h)throw new or(p.cwd,this.context.cwd);await p.restoreInstallState({restoreResolutions:!1});let D=r.get("enableHardenedMode");D&&typeof r.sources.get("enableHardenedMode")>"u"&&await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async T=>{T.reportWarning(0,"Yarn detected that the current workflow is executed from a public pull request. For safety the hardened mode has been enabled."),T.reportWarning(0,`It will prevent malicious lockfile manipulations, in exchange for a slower install time. You can opt-out if necessary; check our ${pe.applyHyperlink(r,"documentation","https://yarnpkg.com/features/security#hardened-mode")} for more details.`),T.reportSeparator()}),(this.refreshLockfile??D)&&(p.lockfileNeedsRefresh=!0);let b=this.checkResolutions??D;return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,forceSectionAlignment:!0,includeLogs:!0,includeVersion:!0},async T=>{await p.install({cache:w,report:T,immutable:u,checkResolutions:b,mode:this.mode})})).exitCode()}},_0t="<<<<<<<";async function H0t(t,e){if(!t.projectCwd)return!1;let r=V.join(t.projectCwd,mr.lockfile);if(!await ae.existsPromise(r)||!(await ae.readFilePromise(r,"utf8")).includes(_0t))return!1;if(e)throw new Jt(47,"Cannot autofix a lockfile when running an immutable install");let a=await Hr.execvp("git",["rev-parse","MERGE_HEAD","HEAD"],{cwd:t.projectCwd});if(a.code!==0&&(a=await Hr.execvp("git",["rev-parse","REBASE_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0&&(a=await Hr.execvp("git",["rev-parse","CHERRY_PICK_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0)throw new Jt(83,"Git returned an error when trying to find the commits pertaining to the conflict");let n=await Promise.all(a.stdout.trim().split(/\n/).map(async A=>{let p=await Hr.execvp("git",["show",`${A}:./${mr.lockfile}`],{cwd:t.projectCwd});if(p.code!==0)throw new Jt(83,`Git returned an error when trying to access the lockfile content in ${A}`);try{return Vi(p.stdout)}catch{throw new Jt(46,"A variant of the conflicting lockfile failed to parse")}}));n=n.filter(A=>!!A.__metadata);for(let A of n){if(A.__metadata.version<7)for(let p of Object.keys(A)){if(p==="__metadata")continue;let h=G.parseDescriptor(p,!0),E=t.normalizeDependency(h),w=G.stringifyDescriptor(E);w!==p&&(A[w]=A[p],delete A[p])}for(let p of Object.keys(A)){if(p==="__metadata")continue;let h=A[p].checksum;typeof h>"u"||h.includes("/")||(A[p].checksum=`${A.__metadata.cacheKey}/${h}`)}}let u=Object.assign({},...n);u.__metadata.version=`${Math.min(...n.map(A=>parseInt(A.__metadata.version??0)))}`,u.__metadata.cacheKey="merged";for(let[A,p]of Object.entries(u))typeof p=="string"&&delete u[A];return await ae.changeFilePromise(r,Sa(u),{automaticNewlines:!0}),!0}async function q0t(t,e){if(!t.projectCwd)return!1;let r=[],o=V.join(t.projectCwd,".yarn/plugins/@yarnpkg");return await ze.updateConfiguration(t.projectCwd,{plugins:n=>{if(!Array.isArray(n))return n;let u=n.filter(A=>{if(!A.path)return!0;let p=V.resolve(t.projectCwd,A.path),h=j1.has(A.spec)&&V.contains(o,p);return h&&r.push(p),!h});return u.length===0?ze.deleteProperty:u.length===n.length?n:u}},{immutable:e})?(await Promise.all(r.map(async n=>{await ae.removePromise(n)})),!0):!1}Ve();St();Gt();var kE=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target projects to the current one"});this.private=de.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target projects to the current one"});this.relative=de.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destinations=de.Rest()}static{this.paths=[["link"]]}static{this.usage=ot.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register one or more remote workspaces for use in the current project","$0 link ~/ts-loader ~/jest"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=o.topLevelWorkspace,A=[];for(let p of this.destinations){let h=V.resolve(this.context.cwd,Ae.toPortablePath(p)),E=await ze.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:w,workspace:D}=await Qt.find(E,h);if(o.cwd===w.cwd)throw new it(`Invalid destination '${p}'; Can't link the project to itself`);if(!D)throw new or(w.cwd,h);if(this.all){let b=!1;for(let C of w.workspaces)C.manifest.name&&(!C.manifest.private||this.private)&&(A.push(C),b=!0);if(!b)throw new it(`No workspace found to be linked in the target project: ${p}`)}else{if(!D.manifest.name)throw new it(`The target workspace at '${p}' doesn't have a name and thus cannot be linked`);if(D.manifest.private&&!this.private)throw new it(`The target workspace at '${p}' is marked private - use the --private flag to link it anyway`);A.push(D)}}for(let p of A){let h=G.stringifyIdent(p.anchoredLocator),E=this.relative?V.relative(o.cwd,p.cwd):p.cwd;u.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${E}`})}return await o.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Gt();var QE=class extends ut{constructor(){super(...arguments);this.args=de.Proxy()}static{this.paths=[["node"]]}static{this.usage=ot.Usage({description:"run node with the hook already setup",details:` - This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - - The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. - `,examples:[["Run a Node script","$0 node ./my-script.js"]]})}async execute(){return this.cli.run(["exec","node",...this.args])}};Ve();Gt();var FE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","check"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"find all third-party plugins that differ from their own spec",details:` - Check only the plugins from https. - - If this command detects any plugin differences in the CI environment, it will throw an error. - `,examples:[["find all third-party plugins that differ from their own spec","$0 plugin check"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=await ze.findRcFiles(this.context.cwd);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{for(let u of o)if(u.data?.plugins)for(let A of u.data.plugins){if(!A.checksum||!A.spec.match(/^https?:/))continue;let p=await on.get(A.spec,{configuration:r}),h=bn.makeHash(p);if(A.checksum===h)continue;let E=pe.pretty(r,A.path,pe.Type.PATH),w=pe.pretty(r,A.spec,pe.Type.URL),D=`${E} is different from the file provided by ${w}`;n.reportJson({...A,newChecksum:h}),n.reportError(0,D)}})).exitCode()}};Ve();Ve();St();Gt();var Yde=ve("os");Ve();St();Gt();var qde=ve("os");Ve();Ol();Gt();var j0t="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function Jg(t,e){let r=await on.get(j0t,{configuration:t}),o=Vi(r.toString());return Object.fromEntries(Object.entries(o).filter(([a,n])=>!e||Ur.satisfiesWithPrereleases(e,n.range??"<4.0.0-rc.1")))}var RE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","list"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{let n=await Jg(r,nn);for(let[u,{experimental:A,...p}]of Object.entries(n)){let h=u;A&&(h+=" [experimental]"),a.reportJson({name:u,experimental:A,...p}),a.reportInfo(null,h)}})).exitCode()}};var G0t=/^[0-9]+$/,W0t=process.platform==="win32";function jde(t){return G0t.test(t)?`pull/${t}/head`:t}var Y0t=({repository:t,branch:e},r)=>[["git","init",Ae.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin","--depth=1",jde(e)],["git","reset","--hard","FETCH_HEAD"]],V0t=({branch:t})=>[["git","fetch","origin","--depth=1",jde(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx","-e","packages/yarnpkg-cli/bundles"]],K0t=({plugins:t,noMinify:e},r,o)=>[["yarn","build:cli",...new Array().concat(...t.map(a=>["--plugin",V.resolve(o,a)])),...e?["--no-minify"]:[],"|"],[W0t?"move":"mv","packages/yarnpkg-cli/bundles/yarn.js",Ae.fromPortablePath(r),"|"]],TE=class extends ut{constructor(){super(...arguments);this.installPath=de.String("--path",{description:"The path where the repository should be cloned to"});this.repository=de.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=de.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=de.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.dryRun=de.Boolean("-n,--dry-run",!1,{description:"If set, the bundle will be built but not added to the project"});this.noMinify=de.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=de.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=de.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}static{this.paths=[["set","version","from","sources"]]}static{this.usage=ot.Usage({description:"build Yarn from master",details:` - This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. - - By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. - `,examples:[["Build Yarn from master","$0 set version from sources"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd),a=typeof this.installPath<"u"?V.resolve(this.context.cwd,Ae.toPortablePath(this.installPath)):V.resolve(Ae.toPortablePath((0,qde.tmpdir)()),"yarnpkg-sources",bn.makeHash(this.repository).slice(0,6));return(await Lt.start({configuration:r,stdout:this.context.stdout},async u=>{await BH(this,{configuration:r,report:u,target:a}),u.reportSeparator(),u.reportInfo(0,"Building a fresh bundle"),u.reportSeparator();let A=await Hr.execvp("git",["rev-parse","--short","HEAD"],{cwd:a,strict:!0}),p=V.join(a,`packages/yarnpkg-cli/bundles/yarn-${A.stdout.trim()}.js`);ae.existsSync(p)||(await M2(K0t(this,p,a),{configuration:r,context:this.context,target:a}),u.reportSeparator());let h=await ae.readFilePromise(p);if(!this.dryRun){let{bundleVersion:E}=await IH(r,null,async()=>h,{report:u});this.skipPlugins||await J0t(this,E,{project:o,report:u,target:a})}})).exitCode()}};async function M2(t,{configuration:e,context:r,target:o}){for(let[a,...n]of t){let u=n[n.length-1]==="|";if(u&&n.pop(),u)await Hr.pipevp(a,n,{cwd:o,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${pe.pretty(e,` $ ${[a,...n].join(" ")}`,"grey")} -`);try{await Hr.execvp(a,n,{cwd:o,strict:!0})}catch(A){throw r.stdout.write(A.stdout||A.stack),A}}}}async function BH(t,{configuration:e,report:r,target:o}){let a=!1;if(!t.force&&ae.existsSync(V.join(o,".git"))){r.reportInfo(0,"Fetching the latest commits"),r.reportSeparator();try{await M2(V0t(t),{configuration:e,context:t.context,target:o}),a=!0}catch{r.reportSeparator(),r.reportWarning(0,"Repository update failed; we'll try to regenerate it")}}a||(r.reportInfo(0,"Cloning the remote repository"),r.reportSeparator(),await ae.removePromise(o),await ae.mkdirPromise(o,{recursive:!0}),await M2(Y0t(t,o),{configuration:e,context:t.context,target:o}))}async function J0t(t,e,{project:r,report:o,target:a}){let n=await Jg(r.configuration,e),u=new Set(Object.keys(n));for(let A of r.configuration.plugins.keys())u.has(A)&&await vH(A,t,{project:r,report:o,target:a})}Ve();Ve();St();Gt();var Gde=et(ni()),Wde=ve("vm");var LE=class extends ut{constructor(){super(...arguments);this.name=de.String();this.checksum=de.Boolean("--checksum",!0,{description:"Whether to care if this plugin is modified"})}static{this.paths=[["plugin","import"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"download a plugin",details:` - This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. - - Three types of plugin references are accepted: - - - If the plugin is stored within the Yarn repository, it can be referenced by name. - - Third-party plugins can be referenced directly through their public urls. - - Local plugins can be referenced by their path on the disk. - - If the \`--no-checksum\` option is set, Yarn will no longer care if the plugin is modified. - - Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). - `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Lt.start({configuration:r,stdout:this.context.stdout},async a=>{let{project:n}=await Qt.find(r,this.context.cwd),u,A;if(this.name.match(/^\.{0,2}[\\/]/)||Ae.isAbsolute(this.name)){let p=V.resolve(this.context.cwd,Ae.toPortablePath(this.name));a.reportInfo(0,`Reading ${pe.pretty(r,p,pe.Type.PATH)}`),u=V.relative(n.cwd,p),A=await ae.readFilePromise(p)}else{let p;if(this.name.match(/^https?:/)){try{new URL(this.name)}catch{throw new Jt(52,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}u=this.name,p=this.name}else{let h=G.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(h.reference!=="unknown"&&!Gde.default.valid(h.reference))throw new Jt(0,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let E=G.stringifyIdent(h),w=await Jg(r,nn);if(!Object.hasOwn(w,E)){let D=`Couldn't find a plugin named ${G.prettyIdent(r,h)} on the remote registry. -`;throw r.plugins.has(E)?D+=`A plugin named ${G.prettyIdent(r,h)} is already installed; possibly attempting to import a built-in plugin.`:D+=`Note that only the plugins referenced on our website (${pe.pretty(r,"https://github.com/yarnpkg/berry/blob/master/plugins.yml",pe.Type.URL)}) can be referenced by their name; any other plugin will have to be referenced through its public url (for example ${pe.pretty(r,"https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js",pe.Type.URL)}).`,new Jt(51,D)}u=E,p=w[E].url,h.reference!=="unknown"?p=p.replace(/\/master\//,`/${E}/${h.reference}/`):nn!==null&&(p=p.replace(/\/master\//,`/@yarnpkg/cli/${nn}/`))}a.reportInfo(0,`Downloading ${pe.pretty(r,p,"green")}`),A=await on.get(p,{configuration:r})}await DH(u,A,{checksum:this.checksum,project:n,report:a})})).exitCode()}};async function DH(t,e,{checksum:r=!0,project:o,report:a}){let{configuration:n}=o,u={},A={exports:u};(0,Wde.runInNewContext)(e.toString(),{module:A,exports:u});let h=`.yarn/plugins/${A.exports.name}.cjs`,E=V.resolve(o.cwd,h);a.reportInfo(0,`Saving the new plugin in ${pe.pretty(n,h,"magenta")}`),await ae.mkdirPromise(V.dirname(E),{recursive:!0}),await ae.writeFilePromise(E,e);let w={path:h,spec:t};r&&(w.checksum=bn.makeHash(e)),await ze.addPlugin(o.cwd,[w])}var z0t=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],NE=class extends ut{constructor(){super(...arguments);this.installPath=de.String("--path",{description:"The path where the repository should be cloned to"});this.repository=de.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=de.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=de.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=de.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=de.String()}static{this.paths=[["plugin","import","from","sources"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` - This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. - - The plugins can be referenced by their short name if sourced from the official Yarn repository. - `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=typeof this.installPath<"u"?V.resolve(this.context.cwd,Ae.toPortablePath(this.installPath)):V.resolve(Ae.toPortablePath((0,Yde.tmpdir)()),"yarnpkg-sources",bn.makeHash(this.repository).slice(0,6));return(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{let{project:u}=await Qt.find(r,this.context.cwd),A=G.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),p=G.stringifyIdent(A),h=await Jg(r,nn);if(!Object.hasOwn(h,p))throw new Jt(51,`Couldn't find a plugin named "${p}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let E=p;await BH(this,{configuration:r,report:n,target:o}),await vH(E,this,{project:u,report:n,target:o})})).exitCode()}};async function vH(t,{context:e,noMinify:r},{project:o,report:a,target:n}){let u=t.replace(/@yarnpkg\//,""),{configuration:A}=o;a.reportSeparator(),a.reportInfo(0,`Building a fresh ${u}`),a.reportSeparator(),await M2(z0t({pluginName:u,noMinify:r},n),{configuration:A,context:e,target:n}),a.reportSeparator();let p=V.resolve(n,`packages/${u}/bundles/${t}.js`),h=await ae.readFilePromise(p);await DH(t,h,{project:o,report:a})}Ve();St();Gt();var OE=class extends ut{constructor(){super(...arguments);this.name=de.String()}static{this.paths=[["plugin","remove"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` - This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. - - **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. - `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd);return(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{let u=this.name,A=G.parseIdent(u);if(!r.plugins.has(u))throw new it(`${G.prettyIdent(r,A)} isn't referenced by the current configuration`);let p=`.yarn/plugins/${u}.cjs`,h=V.resolve(o.cwd,p);ae.existsSync(h)&&(n.reportInfo(0,`Removing ${pe.pretty(r,p,pe.Type.PATH)}...`),await ae.removePromise(h)),n.reportInfo(0,"Updating the configuration..."),await ze.updateConfiguration(o.cwd,{plugins:E=>{if(!Array.isArray(E))return E;let w=E.filter(D=>D.path!==p);return w.length===0?ze.deleteProperty:w.length===E.length?E:w}})})).exitCode()}};Ve();Gt();var ME=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","runtime"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` - This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. - `,examples:[["List the currently active plugins","$0 plugin runtime"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{for(let n of r.plugins.keys()){let u=this.context.plugins.plugins.has(n),A=n;u&&(A+=" [builtin]"),a.reportJson({name:n,builtin:u}),a.reportInfo(null,`${A}`)}})).exitCode()}};Ve();Ve();Gt();var UE=class extends ut{constructor(){super(...arguments);this.idents=de.Rest()}static{this.paths=[["rebuild"]]}static{this.usage=ot.Usage({description:"rebuild the project's native packages",details:` - This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. - - Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). - - By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. - `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);let u=new Set;for(let A of this.idents)u.add(G.parseIdent(A).identHash);if(await o.restoreInstallState({restoreResolutions:!1}),await o.resolveEverything({cache:n,report:new Ri}),u.size>0)for(let A of o.storedPackages.values())u.has(A.identHash)&&(o.storedBuildState.delete(A.locatorHash),o.skippedBuilds.delete(A.locatorHash));else o.storedBuildState.clear(),o.skippedBuilds.clear();return await o.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ve();Ve();Ve();Gt();var SH=et(Xo());il();var _E=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=de.String("--mode",{description:"Change what artifacts installs generate",validator:js(yl)});this.patterns=de.Rest()}static{this.paths=[["remove"]]}static{this.usage=ot.Usage({description:"remove dependencies from the project",details:` - This command will remove the packages matching the specified patterns from the current workspace. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - - This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. - `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.all?o.workspaces:[a],A=["dependencies","devDependencies","peerDependencies"],p=[],h=!1,E=[];for(let C of this.patterns){let T=!1,N=G.parseIdent(C);for(let U of u){let J=[...U.manifest.peerDependenciesMeta.keys()];for(let te of(0,SH.default)(J,C))U.manifest.peerDependenciesMeta.delete(te),h=!0,T=!0;for(let te of A){let le=U.manifest.getForScope(te),ce=[...le.values()].map(ue=>G.stringifyIdent(ue));for(let ue of(0,SH.default)(ce,G.stringifyIdent(N))){let{identHash:Ie}=G.parseIdent(ue),he=le.get(Ie);if(typeof he>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");U.manifest[te].delete(Ie),E.push([U,te,he]),h=!0,T=!0}}}T||p.push(C)}let w=p.length>1?"Patterns":"Pattern",D=p.length>1?"don't":"doesn't",b=this.all?"any":"this";if(p.length>0)throw new it(`${w} ${pe.prettyList(r,p,pe.Type.CODE)} ${D} match any packages referenced by ${b} workspace`);return h?(await r.triggerMultipleHooks(C=>C.afterWorkspaceDependencyRemoval,E),await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})):0}};Ve();Ve();Gt();var Vde=ve("util"),HE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["run"]]}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);return(await Lt.start({configuration:r,stdout:this.context.stdout,json:this.json},async u=>{let A=a.manifest.scripts,p=qe.sortMap(A.keys(),w=>w),h={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},E=p.reduce((w,D)=>Math.max(w,D.length),0);for(let[w,D]of A.entries())u.reportInfo(null,`${w.padEnd(E," ")} ${(0,Vde.inspect)(D,h)}`),u.reportJson({name:w,script:D})})).exitCode()}};Ve();Ve();Gt();var qE=class extends ut{constructor(){super(...arguments);this.inspect=de.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=de.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=de.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=de.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.require=de.String("--require",{description:"Forwarded to the underlying Node process when executing a binary"});this.silent=de.Boolean("--silent",{hidden:!0});this.scriptName=de.String();this.args=de.Proxy()}static{this.paths=[["run"]]}static{this.usage=ot.Usage({description:"run a script defined in the package.json",details:` - This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: - - - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. - - - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. - - - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. - - Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). - `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a,locator:n}=await Qt.find(r,this.context.cwd);await o.restoreInstallState();let u=this.topLevel?o.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await hn.hasPackageScript(u,this.scriptName,{project:o}))return await hn.executePackageScript(u,this.scriptName,this.args,{project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let A=await hn.getPackageAccessibleBinaries(u,{project:o});if(A.get(this.scriptName)){let h=[];return this.inspect&&(typeof this.inspect=="string"?h.push(`--inspect=${this.inspect}`):h.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?h.push(`--inspect-brk=${this.inspectBrk}`):h.push("--inspect-brk")),this.require&&h.push(`--require=${this.require}`),await hn.executePackageAccessibleBinary(u,this.scriptName,this.args,{cwd:this.context.cwd,project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:h,packageAccessibleBinaries:A})}if(!this.topLevel&&!this.binariesOnly&&a&&this.scriptName.includes(":")){let E=(await Promise.all(o.workspaces.map(async w=>w.manifest.scripts.has(this.scriptName)?w:null))).filter(w=>w!==null);if(E.length===1)return await hn.executeWorkspaceScript(E[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new it(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${G.prettyLocator(r,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new it(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${G.prettyLocator(r,n)}).`);{if(this.scriptName==="global")throw new it("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let h=[this.scriptName].concat(this.args);for(let[E,w]of oE)for(let D of w)if(h.length>=D.length&&JSON.stringify(h.slice(0,D.length))===JSON.stringify(D))throw new it(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${E} plugin. You can install it with "yarn plugin import ${E}".`);throw new it(`Couldn't find a script named "${this.scriptName}".`)}}};Ve();Ve();Gt();var jE=class extends ut{constructor(){super(...arguments);this.descriptor=de.String();this.resolution=de.String()}static{this.paths=[["set","resolution"]]}static{this.usage=ot.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, edit the `resolutions` field in your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(await o.restoreInstallState({restoreResolutions:!1}),!a)throw new or(o.cwd,this.context.cwd);let u=G.parseDescriptor(this.descriptor,!0),A=G.makeDescriptor(u,this.resolution);return o.storedDescriptors.set(u.descriptorHash,u),o.storedDescriptors.set(A.descriptorHash,A),o.resolutionAliases.set(u.descriptorHash,A.descriptorHash),await o.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Ve();St();Gt();var Kde=et(Xo()),GE=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=de.Rest()}static{this.paths=[["unlink"]]}static{this.usage=ot.Usage({description:"disconnect the local project from another one",details:` - This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. - `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);let u=o.topLevelWorkspace,A=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:p,reference:h}of u.manifest.resolutions)h.startsWith("portal:")&&A.add(p.descriptor.fullName);if(this.leadingArguments.length>0)for(let p of this.leadingArguments){let h=V.resolve(this.context.cwd,Ae.toPortablePath(p));if(qe.isPathLike(p)){let E=await ze.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:w,workspace:D}=await Qt.find(E,h);if(!D)throw new or(w.cwd,h);if(this.all){for(let b of w.workspaces)b.manifest.name&&A.add(G.stringifyIdent(b.anchoredLocator));if(A.size===0)throw new it("No workspace found to be unlinked in the target project")}else{if(!D.manifest.name)throw new it("The target workspace doesn't have a name and thus cannot be unlinked");A.add(G.stringifyIdent(D.anchoredLocator))}}else{let E=[...u.manifest.resolutions.map(({pattern:w})=>w.descriptor.fullName)];for(let w of(0,Kde.default)(E,p))A.add(w)}}return u.manifest.resolutions=u.manifest.resolutions.filter(({pattern:p})=>!A.has(p.descriptor.fullName)),await o.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ve();Ve();Ve();Gt();var Jde=et(Q2()),PH=et(Xo());il();var WE=class extends ut{constructor(){super(...arguments);this.interactive=de.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.fixed=de.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=de.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=de.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=de.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=de.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=de.String("--mode",{description:"Change what artifacts installs generate",validator:js(yl)});this.patterns=de.Rest()}static{this.paths=[["up"]]}static{this.usage=ot.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]})}static{this.schema=[Sw("recursive",Vu.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})]}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=[...o.storedDescriptors.values()],A=u.map(E=>G.stringifyIdent(E)),p=new Set;for(let E of this.patterns){if(G.parseDescriptor(E).range!=="unknown")throw new it("Ranges aren't allowed when using --recursive");for(let w of(0,PH.default)(A,E)){let D=G.parseIdent(w);p.add(D.identHash)}}let h=u.filter(E=>p.has(E.identHash));for(let E of h)o.storedDescriptors.delete(E.descriptorHash),o.storedResolutions.delete(E.descriptorHash);return await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}async executeUpClassic(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=R2(this,o),h=A?["keep","reuse","project","latest"]:["project","latest"],E=[],w=[];for(let N of this.patterns){let U=!1,J=G.parseDescriptor(N),te=G.stringifyIdent(J);for(let le of o.workspaces)for(let ce of["dependencies","devDependencies"]){let Ie=[...le.manifest.getForScope(ce).values()].map(De=>G.stringifyIdent(De)),he=te==="*"?Ie:(0,PH.default)(Ie,te);for(let De of he){let Ee=G.parseIdent(De),g=le.manifest[ce].get(Ee.identHash);if(typeof g>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let me=G.makeDescriptor(Ee,J.range);E.push(Promise.resolve().then(async()=>[le,ce,g,await T2(me,{project:o,workspace:le,cache:n,target:ce,fixed:u,modifier:p,strategies:h})])),U=!0}}U||w.push(N)}if(w.length>1)throw new it(`Patterns ${pe.prettyList(r,w,pe.Type.CODE)} don't match any packages referenced by any workspace`);if(w.length>0)throw new it(`Pattern ${pe.prettyList(r,w,pe.Type.CODE)} doesn't match any packages referenced by any workspace`);let D=await Promise.all(E),b=await pA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async N=>{for(let[,,U,{suggestions:J,rejections:te}]of D){let le=J.filter(ce=>ce.descriptor!==null);if(le.length===0){let[ce]=te;if(typeof ce>"u")throw new Error("Assertion failed: Expected an error to have been set");let ue=this.cli.error(ce);o.configuration.get("enableNetwork")?N.reportError(27,`${G.prettyDescriptor(r,U)} can't be resolved to a satisfying range - -${ue}`):N.reportError(27,`${G.prettyDescriptor(r,U)} can't be resolved to a satisfying range (note: network resolution has been disabled) - -${ue}`)}else le.length>1&&!A&&N.reportError(27,`${G.prettyDescriptor(r,U)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(b.hasErrors())return b.exitCode();let C=!1,T=[];for(let[N,U,,{suggestions:J}]of D){let te,le=J.filter(he=>he.descriptor!==null),ce=le[0].descriptor,ue=le.every(he=>G.areDescriptorsEqual(he.descriptor,ce));le.length===1||ue?te=ce:(C=!0,{answer:te}=await(0,Jde.prompt)({type:"select",name:"answer",message:`Which range do you want to use in ${G.prettyWorkspace(r,N)} \u276F ${U}?`,choices:J.map(({descriptor:he,name:De,reason:Ee})=>he?{name:De,hint:Ee,descriptor:he}:{name:De,hint:Ee,disabled:!0}),onCancel:()=>process.exit(130),result(he){return this.find(he,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let Ie=N.manifest[U].get(te.identHash);if(typeof Ie>"u")throw new Error("Assertion failed: This descriptor should have a matching entry");if(Ie.descriptorHash!==te.descriptorHash)N.manifest[U].set(te.identHash,te),T.push([N,U,Ie,te]);else{let he=r.makeResolver(),De={project:o,resolver:he},Ee=r.normalizeDependency(Ie),g=he.bindDescriptor(Ee,N.anchoredLocator,De);o.forgetResolution(g)}}return await r.triggerMultipleHooks(N=>N.afterWorkspaceDependencyReplacement,T),C&&this.context.stdout.write(` -`),await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}};Ve();Ve();Ve();Gt();var YE=class extends ut{constructor(){super(...arguments);this.recursive=de.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=de.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=de.String()}static{this.paths=[["why"]]}static{this.usage=ot.Usage({description:"display the reason why a package is needed",details:` - This command prints the exact reasons why a package appears in the dependency tree. - - If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. - `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let n=G.parseIdent(this.package).identHash,u=this.recursive?Z0t(o,n,{configuration:r,peers:this.peers}):X0t(o,n,{configuration:r,peers:this.peers});As.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1})}};function X0t(t,e,{configuration:r,peers:o}){let a=qe.sortMap(t.storedPackages.values(),A=>G.stringifyLocator(A)),n={},u={children:n};for(let A of a){let p={};for(let E of A.dependencies.values()){if(!o&&A.peerDependencies.has(E.identHash))continue;let w=t.storedResolutions.get(E.descriptorHash);if(!w)throw new Error("Assertion failed: The resolution should have been registered");let D=t.storedPackages.get(w);if(!D)throw new Error("Assertion failed: The package should have been registered");if(D.identHash!==e)continue;{let C=G.stringifyLocator(A);n[C]={value:[A,pe.Type.LOCATOR],children:p}}let b=G.stringifyLocator(D);p[b]={value:[{descriptor:E,locator:D},pe.Type.DEPENDENT]}}}return u}function Z0t(t,e,{configuration:r,peers:o}){let a=qe.sortMap(t.workspaces,D=>G.stringifyLocator(D.anchoredLocator)),n=new Set,u=new Set,A=D=>{if(n.has(D.locatorHash))return u.has(D.locatorHash);if(n.add(D.locatorHash),D.identHash===e)return u.add(D.locatorHash),!0;let b=!1;D.identHash===e&&(b=!0);for(let C of D.dependencies.values()){if(!o&&D.peerDependencies.has(C.identHash))continue;let T=t.storedResolutions.get(C.descriptorHash);if(!T)throw new Error("Assertion failed: The resolution should have been registered");let N=t.storedPackages.get(T);if(!N)throw new Error("Assertion failed: The package should have been registered");A(N)&&(b=!0)}return b&&u.add(D.locatorHash),b};for(let D of a)A(D.anchoredPackage);let p=new Set,h={},E={children:h},w=(D,b,C)=>{if(!u.has(D.locatorHash))return;let T=C!==null?pe.tuple(pe.Type.DEPENDENT,{locator:D,descriptor:C}):pe.tuple(pe.Type.LOCATOR,D),N={},U={value:T,children:N},J=G.stringifyLocator(D);if(b[J]=U,!(C!==null&&t.tryWorkspaceByLocator(D))&&!p.has(D.locatorHash)){p.add(D.locatorHash);for(let te of D.dependencies.values()){if(!o&&D.peerDependencies.has(te.identHash))continue;let le=t.storedResolutions.get(te.descriptorHash);if(!le)throw new Error("Assertion failed: The resolution should have been registered");let ce=t.storedPackages.get(le);if(!ce)throw new Error("Assertion failed: The package should have been registered");w(ce,N,te)}}};for(let D of a)w(D.anchoredPackage,h,null);return E}Ve();var OH={};Vt(OH,{GitFetcher:()=>_2,GitResolver:()=>H2,default:()=>Egt,gitUtils:()=>ra});Ve();St();var ra={};Vt(ra,{TreeishProtocols:()=>U2,clone:()=>NH,fetchBase:()=>mme,fetchChangedFiles:()=>yme,fetchChangedWorkspaces:()=>mgt,fetchRoot:()=>dme,isGitUrl:()=>JE,lsRemote:()=>gme,normalizeLocator:()=>dgt,normalizeRepoUrl:()=>VE,resolveUrl:()=>LH,splitRepoUrl:()=>Rh,validateRepoUrl:()=>TH});Ve();St();Gt();var fme=et(cme()),pme=et(t3()),KE=et(ve("querystring")),FH=et(ni());function QH(t,e,r){let o=t.indexOf(r);return t.lastIndexOf(e,o>-1?o:1/0)}function ume(t){try{return new URL(t)}catch{return}}function hgt(t){let e=QH(t,"@","#"),r=QH(t,":","#");return r>e&&(t=`${t.slice(0,r)}/${t.slice(r+1)}`),QH(t,":","#")===-1&&t.indexOf("//")===-1&&(t=`ssh://${t}`),t}function Ame(t){return ume(t)||ume(hgt(t))}function VE(t,{git:e=!1}={}){if(t=t.replace(/^git\+https:/,"https:"),t=t.replace(/^(?:github:|https:\/\/github\.com\/|git:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){let r=Ame(t);r&&(t=r.href),t=t.replace(/^git\+([^:]+):/,"$1:")}return t}function hme(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`}}var ggt=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],U2=(a=>(a.Commit="commit",a.Head="head",a.Tag="tag",a.Semver="semver",a))(U2||{});function JE(t){return t?ggt.some(e=>!!t.match(e)):!1}function Rh(t){t=VE(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:"head",request:"HEAD"},extra:{}};let r=t.slice(0,e),o=t.slice(e+1);if(o.match(/^[a-z]+=/)){let a=KE.default.parse(o);for(let[p,h]of Object.entries(a))if(typeof h!="string")throw new Error(`Assertion failed: The ${p} parameter must be a literal string`);let n=Object.values(U2).find(p=>Object.hasOwn(a,p)),[u,A]=typeof n<"u"?[n,a[n]]:["head","HEAD"];for(let p of Object.values(U2))delete a[p];return{repo:r,treeish:{protocol:u,request:A},extra:a}}else{let a=o.indexOf(":"),[n,u]=a===-1?[null,o]:[o.slice(0,a),o.slice(a+1)];return{repo:r,treeish:{protocol:n,request:u},extra:{}}}}function dgt(t){return G.makeLocator(t,VE(t.reference))}function TH(t,{configuration:e}){let r=VE(t,{git:!0});if(!on.getNetworkSettings(`https://${(0,fme.default)(r).resource}`,{configuration:e}).enableNetwork)throw new Jt(80,`Request to '${r}' has been blocked because of your configuration settings`);return r}async function gme(t,e){let r=TH(t,{configuration:e}),o=await RH("listing refs",["ls-remote",r],{cwd:e.startingCwd,env:hme()},{configuration:e,normalizedRepoUrl:r}),a=new Map,n=/^([a-f0-9]{40})\t([^\n]+)/gm,u;for(;(u=n.exec(o.stdout))!==null;)a.set(u[2],u[1]);return a}async function LH(t,e){let{repo:r,treeish:{protocol:o,request:a},extra:n}=Rh(t),u=await gme(r,e),A=(h,E)=>{switch(h){case"commit":{if(!E.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return KE.default.stringify({...n,commit:E})}case"head":{let w=u.get(E==="HEAD"?E:`refs/heads/${E}`);if(typeof w>"u")throw new Error(`Unknown head ("${E}")`);return KE.default.stringify({...n,commit:w})}case"tag":{let w=u.get(`refs/tags/${E}`);if(typeof w>"u")throw new Error(`Unknown tag ("${E}")`);return KE.default.stringify({...n,commit:w})}case"semver":{let w=Ur.validRange(E);if(!w)throw new Error(`Invalid range ("${E}")`);let D=new Map([...u.entries()].filter(([C])=>C.startsWith("refs/tags/")).map(([C,T])=>[FH.default.parse(C.slice(10)),T]).filter(C=>C[0]!==null)),b=FH.default.maxSatisfying([...D.keys()],w);if(b===null)throw new Error(`No matching range ("${E}")`);return KE.default.stringify({...n,commit:D.get(b)})}case null:{let w;if((w=p("commit",E))!==null||(w=p("tag",E))!==null||(w=p("head",E))!==null)return w;throw E.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${h}")`)}},p=(h,E)=>{try{return A(h,E)}catch{return null}};return VE(`${r}#${A(o,a)}`)}async function NH(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:o,request:a}}=Rh(t);if(o!=="commit")throw new Error("Invalid treeish protocol when cloning");let n=TH(r,{configuration:e}),u=await ae.mktempPromise(),A={cwd:u,env:hme()};return await RH("cloning the repository",["clone","-c core.autocrlf=false",n,Ae.fromPortablePath(u)],A,{configuration:e,normalizedRepoUrl:n}),await RH("switching branch",["checkout",`${a}`],A,{configuration:e,normalizedRepoUrl:n}),u})}async function dme(t){let e,r=t;do{if(e=r,await ae.existsPromise(V.join(e,".git")))return e;r=V.dirname(e)}while(r!==e);return null}async function mme(t,{baseRefs:e}){if(e.length===0)throw new it("Can't run this command with zero base refs specified.");let r=[];for(let A of e){let{code:p}=await Hr.execvp("git",["merge-base",A,"HEAD"],{cwd:t});p===0&&r.push(A)}if(r.length===0)throw new it(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:o}=await Hr.execvp("git",["merge-base","HEAD",...r],{cwd:t,strict:!0}),a=o.trim(),{stdout:n}=await Hr.execvp("git",["show","--quiet","--pretty=format:%s",a],{cwd:t,strict:!0}),u=n.trim();return{hash:a,title:u}}async function yme(t,{base:e,project:r}){let o=qe.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:a}=await Hr.execvp("git",["diff","--name-only",`${e}`],{cwd:t,strict:!0}),n=a.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>V.resolve(t,Ae.toPortablePath(h))),{stdout:u}=await Hr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:t,strict:!0}),A=u.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>V.resolve(t,Ae.toPortablePath(h))),p=[...new Set([...n,...A].sort())];return o?p.filter(h=>!V.relative(r.cwd,h).match(o)):p}async function mgt({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new it("This command can only be run from within a Yarn project");let r=[V.resolve(e.cwd,mr.lockfile),V.resolve(e.cwd,e.configuration.get("cacheFolder")),V.resolve(e.cwd,e.configuration.get("installStatePath")),V.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(u=>u.populateYarnPaths,e,u=>{u!=null&&r.push(u)});let o=await dme(e.configuration.projectCwd);if(o==null)throw new it("This command can only be run on Git repositories");let a=await mme(o,{baseRefs:typeof t=="string"?[t]:e.configuration.get("changesetBaseRefs")}),n=await yme(o,{base:a.hash,project:e});return new Set(qe.mapAndFilter(n,u=>{let A=e.tryWorkspaceByFilePath(u);return A===null?qe.mapAndFilter.skip:r.some(p=>u.startsWith(p))?qe.mapAndFilter.skip:A}))}async function RH(t,e,r,{configuration:o,normalizedRepoUrl:a}){try{return await Hr.execvp("git",e,{...r,strict:!0})}catch(n){if(!(n instanceof Hr.ExecError))throw n;let u=n.reportExtra,A=n.stderr.toString();throw new Jt(1,`Failed ${t}`,p=>{p.reportError(1,` ${pe.prettyField(o,{label:"Repository URL",value:pe.tuple(pe.Type.URL,a)})}`);for(let h of A.matchAll(/^(.+?): (.*)$/gm)){let[,E,w]=h;E=E.toLowerCase();let D=E==="error"?"Error":`${(0,pme.default)(E)} Error`;p.reportError(1,` ${pe.prettyField(o,{label:D,value:pe.tuple(pe.Type.NO_HINT,w)})}`)}u?.(p)})}}var _2=class{supports(e,r){return JE(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,a=new Map(r.checksums);a.set(e.locatorHash,o);let n={...r,checksums:a},u=await this.downloadHosted(e,n);if(u!==null)return u;let[A,p,h]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(e,n),...r.cacheOptions});return{packageFs:A,releaseFs:p,prefixPath:G.getIdentVendorPath(e),checksum:h}}async downloadHosted(e,r){return r.project.configuration.reduceHook(o=>o.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let o=Rh(e.reference),a=await NH(e.reference,r.project.configuration),n=V.resolve(a,o.extra.cwd??Bt.dot),u=V.join(n,"package.tgz");await hn.prepareExternalProject(n,u,{configuration:r.project.configuration,report:r.report,workspace:o.extra.workspace,locator:e});let A=await ae.readFilePromise(u);return await qe.releaseAfterUseAsync(async()=>await $i.convertToZip(A,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1}))}};Ve();Ve();var H2=class{supportsDescriptor(e,r){return JE(e.range)}supportsLocator(e,r){return JE(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=await LH(e.range,o.project.configuration);return[G.makeLocator(e,a)]}async getSatisfying(e,r,o,a){let n=Rh(e.range);return{locators:o.filter(A=>{if(A.identHash!==e.identHash)return!1;let p=Rh(A.reference);return!(n.repo!==p.repo||n.treeish.protocol==="commit"&&n.treeish.request!==p.treeish.request)}),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var ygt={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:"STRING",isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:"STRING",default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:"NUMBER",default:2}},fetchers:[_2],resolvers:[H2]};var Egt=ygt;Gt();var zE=class extends ut{constructor(){super(...arguments);this.since=de.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=de.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.noPrivate=de.Boolean("--no-private",{description:"Exclude workspaces that have the private field set to true"});this.verbose=de.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["workspaces","list"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{let u=this.since?await ra.fetchChangedWorkspaces({ref:this.since,project:o}):o.workspaces,A=new Set(u);if(this.recursive)for(let p of[...u].map(h=>h.getRecursiveWorkspaceDependents()))for(let h of p)A.add(h);for(let p of A){let{manifest:h}=p;if(h.private&&this.noPrivate)continue;let E;if(this.verbose){let w=new Set,D=new Set;for(let b of _t.hardDependencies)for(let[C,T]of h.getForScope(b)){let N=o.tryWorkspaceByDescriptor(T);N===null?o.workspacesByIdent.has(C)&&D.add(T):w.add(N)}E={workspaceDependencies:Array.from(w).map(b=>b.relativeCwd),mismatchedWorkspaceDependencies:Array.from(D).map(b=>G.stringifyDescriptor(b))}}n.reportInfo(null,`${p.relativeCwd}`),n.reportJson({location:p.relativeCwd,name:h.name?G.stringifyIdent(h.name):null,...E})}})).exitCode()}};Ve();Ve();Gt();var XE=class extends ut{constructor(){super(...arguments);this.workspaceName=de.String();this.commandName=de.String();this.args=de.Proxy()}static{this.paths=[["workspace"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` - This command will run a given sub-command on a single workspace. - `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);let n=o.workspaces,u=new Map(n.map(p=>[G.stringifyIdent(p.anchoredLocator),p])),A=u.get(this.workspaceName);if(A===void 0){let p=Array.from(u.keys()).sort();throw new it(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: - - ${p.join(` - - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:A.cwd})}};var Cgt={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:"BOOLEAN",default:Eme.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:"STRING",values:["^","~",""],default:"^"},preferReuse:{description:"If true, `yarn add` will attempt to reuse the most common dependency range in other workspaces.",type:"BOOLEAN",default:!1}},commands:[hE,gE,dE,mE,jE,TE,SE,zE,CE,IE,wE,BE,fE,pE,yE,EE,vE,DE,PE,xE,bE,kE,GE,QE,FE,NE,LE,OE,RE,ME,UE,_E,HE,qE,WE,YE,XE]},Igt=Cgt;var jH={};Vt(jH,{default:()=>Bgt});Ve();var kt={optional:!0},UH=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:kt,zenObservable:kt}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:kt,zenObservable:kt}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{"supports-color":kt}}],["got@<11",{dependencies:{"@types/responselike":"^1.0.0","@types/keyv":"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{"@types/keyv":"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{"vscode-jsonrpc":"^5.0.1","vscode-languageserver-protocol":"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{"postcss-html":kt,"postcss-jsx":kt,"postcss-less":kt,"postcss-markdown":kt,"postcss-scss":kt}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{"tiny-warning":"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:kt}}],["snowpack@>=3.3.0",{dependencies:{"node-gyp":"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:kt}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@<=0.5.2",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:kt,"vue-template-compiler":kt}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:kt,"utf-8-validate":kt}}],["react-portal@<4.2.2",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{"babel-polyfill":"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{"cross-spawn":"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{"prop-types":"^15.7.2"}}],["@rebass/forms@*",{dependencies:{"@styled-system/should-forward-prop":"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":kt,"vuetify-loader":kt}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":kt}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":kt}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":kt}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:kt}}],["consolidate@<=0.16.0",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:kt,tinyliquid:kt,"liquid-node":kt,jade:kt,"then-jade":kt,dust:kt,"dustjs-helpers":kt,"dustjs-linkedin":kt,swig:kt,"swig-templates":kt,"razor-tmpl":kt,atpl:kt,liquor:kt,twig:kt,ejs:kt,eco:kt,jazz:kt,jqtpl:kt,hamljs:kt,hamlet:kt,whiskers:kt,"haml-coffee":kt,"hogan.js":kt,templayed:kt,handlebars:kt,underscore:kt,lodash:kt,pug:kt,"then-pug":kt,qejs:kt,walrus:kt,mustache:kt,just:kt,ect:kt,mote:kt,toffee:kt,dot:kt,"bracket-template":kt,ractive:kt,nunjucks:kt,htmling:kt,"babel-core":kt,plates:kt,"react-dom":kt,react:kt,"arc-templates":kt,vash:kt,slm:kt,marko:kt,teacup:kt,"coffee-script":kt,squirrelly:kt,twing:kt}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":kt}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":kt,vue:kt}}],["scss-parser@<=1.0.5",{dependencies:{lodash:"^4.17.21"}}],["query-ast@<1.0.5",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:kt}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:kt}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(t=>[t,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":kt,"webpack-command":kt}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":kt}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":kt}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:kt,jimp:kt}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":kt,"eslint-import-resolver-typescript":kt,"eslint-import-resolver-webpack":kt,"@typescript-eslint/parser":kt}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":kt}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":kt}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x <10.0.2",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.7"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:kt}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:kt}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@<=0.14.0",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{"vue-template-compiler":"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{"@parcel/core":"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{"@parcel/core":"*"}}],["parcel@*",{peerDependenciesMeta:{"@parcel/core":kt}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@<5.0.0",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:kt}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}],["xo@*",{peerDependencies:{webpack:">=1.11.0"},peerDependenciesMeta:{webpack:kt}}],["babel-plugin-remove-graphql-queries@<=4.20.0-next.0",{dependencies:{"@babel/types":"^7.15.4"}}],["gatsby-plugin-page-creator@<=4.20.0-next.1",{dependencies:{"fs-extra":"^10.1.0"}}],["gatsby-plugin-utils@<=3.14.0-next.1",{dependencies:{fastq:"^1.13.0"},peerDependencies:{graphql:"^15.0.0"}}],["gatsby-plugin-mdx@<3.1.0-next.1",{dependencies:{mkdirp:"^1.0.4"}}],["gatsby-plugin-mdx@^2",{peerDependencies:{gatsby:"^3.0.0-next"}}],["fdir@<=5.2.0",{peerDependencies:{picomatch:"2.x"},peerDependenciesMeta:{picomatch:kt}}],["babel-plugin-transform-typescript-metadata@<=0.3.2",{peerDependencies:{"@babel/core":"^7","@babel/traverse":"^7"},peerDependenciesMeta:{"@babel/traverse":kt}}],["graphql-compose@>=9.0.10",{peerDependencies:{graphql:"^14.2.0 || ^15.0.0 || ^16.0.0"}}],["vite-plugin-vuetify@<=1.0.2",{peerDependencies:{vue:"^3.0.0"}}],["webpack-plugin-vuetify@<=2.0.1",{peerDependencies:{vue:"^3.2.6"}}],["eslint-import-resolver-vite@<2.0.1",{dependencies:{debug:"^4.3.4",resolve:"^1.22.8"}}],["notistack@^3.0.0",{dependencies:{csstype:"^3.0.10"}}]];var _H;function Cme(){return typeof _H>"u"&&(_H=ve("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),_H}var HH;function Ime(){return typeof HH>"u"&&(HH=ve("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),HH}var qH;function wme(){return typeof qH>"u"&&(qH=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),qH}var Bme=new Map([[G.makeIdent(null,"fsevents").identHash,Cme],[G.makeIdent(null,"resolve").identHash,Ime],[G.makeIdent(null,"typescript").identHash,wme]]),wgt={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,o]of UH)e(G.parseDescriptor(r,!0),o)},getBuiltinPatch:async(t,e)=>{let r="compat/";if(!e.startsWith(r))return;let o=G.parseIdent(e.slice(r.length)),a=Bme.get(o.identHash)?.();return typeof a<"u"?a:null},reduceDependency:async(t,e,r,o)=>typeof Bme.get(t.identHash)>"u"?t:G.makeDescriptor(t,G.makeRange({protocol:"patch:",source:G.stringifyDescriptor(t),selector:`optional!builtin`,params:null}))}},Bgt=wgt;var a6={};Vt(a6,{ConstraintsCheckCommand:()=>sC,ConstraintsQueryCommand:()=>nC,ConstraintsSourceCommand:()=>iC,default:()=>zgt});Ve();Ve();j2();var $E=class{constructor(e){this.project=e}createEnvironment(){let e=new ZE(["cwd","ident"]),r=new ZE(["workspace","type","ident"]),o=new ZE(["ident"]),a={manifestUpdates:new Map,reportedErrors:new Map},n=new Map,u=new Map;for(let A of this.project.storedPackages.values()){let p=Array.from(A.peerDependencies.values(),h=>[G.stringifyIdent(h),h.range]);n.set(A.locatorHash,{workspace:null,ident:G.stringifyIdent(A),version:A.version,dependencies:new Map,peerDependencies:new Map(p.filter(([h])=>A.peerDependenciesMeta.get(h)?.optional!==!0)),optionalPeerDependencies:new Map(p.filter(([h])=>A.peerDependenciesMeta.get(h)?.optional===!0))})}for(let A of this.project.storedPackages.values()){let p=n.get(A.locatorHash);p.dependencies=new Map(Array.from(A.dependencies.values(),h=>{let E=this.project.storedResolutions.get(h.descriptorHash);if(typeof E>"u")throw new Error("Assertion failed: The resolution should have been registered");let w=n.get(E);if(typeof w>"u")throw new Error("Assertion failed: The package should have been registered");return[G.stringifyIdent(h),w]})),p.dependencies.delete(p.ident)}for(let A of this.project.workspaces){let p=G.stringifyIdent(A.anchoredLocator),h=A.manifest.exportTo({}),E=n.get(A.anchoredLocator.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");let w=(T,N,{caller:U=Xi.getCaller()}={})=>{let J=q2(T),te=qe.getMapWithDefault(a.manifestUpdates,A.cwd),le=qe.getMapWithDefault(te,J),ce=qe.getSetWithDefault(le,N);U!==null&&ce.add(U)},D=T=>w(T,void 0,{caller:Xi.getCaller()}),b=T=>{qe.getArrayWithDefault(a.reportedErrors,A.cwd).push(T)},C=e.insert({cwd:A.relativeCwd,ident:p,manifest:h,pkg:E,set:w,unset:D,error:b});u.set(A,C);for(let T of _t.allDependencies)for(let N of A.manifest[T].values()){let U=G.stringifyIdent(N),J=()=>{w([T,U],void 0,{caller:Xi.getCaller()})},te=ce=>{w([T,U],ce,{caller:Xi.getCaller()})},le=null;if(T!=="peerDependencies"&&(T!=="dependencies"||!A.manifest.devDependencies.has(N.identHash))){let ce=A.anchoredPackage.dependencies.get(N.identHash);if(ce){if(typeof ce>"u")throw new Error("Assertion failed: The dependency should have been registered");let ue=this.project.storedResolutions.get(ce.descriptorHash);if(typeof ue>"u")throw new Error("Assertion failed: The resolution should have been registered");let Ie=n.get(ue);if(typeof Ie>"u")throw new Error("Assertion failed: The package should have been registered");le=Ie}}r.insert({workspace:C,ident:U,range:N.range,type:T,resolution:le,update:te,delete:J,error:b})}}for(let A of this.project.storedPackages.values()){let p=this.project.tryWorkspaceByLocator(A);if(!p)continue;let h=u.get(p);if(typeof h>"u")throw new Error("Assertion failed: The workspace should have been registered");let E=n.get(A.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");E.workspace=h}return{workspaces:e,dependencies:r,packages:o,result:a}}async process(){let e=this.createEnvironment(),r={Yarn:{workspace:a=>e.workspaces.find(a)[0]??null,workspaces:a=>e.workspaces.find(a),dependency:a=>e.dependencies.find(a)[0]??null,dependencies:a=>e.dependencies.find(a),package:a=>e.packages.find(a)[0]??null,packages:a=>e.packages.find(a)}},o=await this.project.loadUserConfig();return o?.constraints?(await o.constraints(r),e.result):null}};Ve();Ve();Gt();var nC=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.query=de.String()}static{this.paths=[["constraints","query"]]}static{this.usage=ot.Usage({category:"Constraints-related commands",description:"query the constraints fact database",details:` - This command will output all matches to the given prolog query. - `,examples:[["List all dependencies throughout the workspace","yarn constraints query 'workspace_has_dependency(_, DependencyName, _, _).'"]]})}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(V2(),Y2)),o=await ze.find(this.context.cwd,this.context.plugins),{project:a}=await Qt.find(o,this.context.cwd),n=await r.find(a),u=this.query;return u.endsWith(".")||(u=`${u}.`),(await Lt.start({configuration:o,json:this.json,stdout:this.context.stdout},async p=>{for await(let h of n.query(u)){let E=Array.from(Object.entries(h)),w=E.length,D=E.reduce((b,[C])=>Math.max(b,C.length),0);for(let b=0;b(V2(),Y2)),o=await ze.find(this.context.cwd,this.context.plugins),{project:a}=await Qt.find(o,this.context.cwd),n=await r.find(a);this.context.stdout.write(this.verbose?n.fullSource:n.source)}};Ve();Ve();Gt();j2();var sC=class extends ut{constructor(){super(...arguments);this.fix=de.Boolean("--fix",!1,{description:"Attempt to automatically fix unambiguous issues, following a multi-pass process"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["constraints"]]}static{this.usage=ot.Usage({category:"Constraints-related commands",description:"check that the project constraints are met",details:` - This command will run constraints on your project and emit errors for each one that is found but isn't met. If any error is emitted the process will exit with a non-zero exit code. - - If the \`--fix\` flag is used, Yarn will attempt to automatically fix the issues the best it can, following a multi-pass process (with a maximum of 10 iterations). Some ambiguous patterns cannot be autofixed, in which case you'll have to manually specify the right resolution. - - For more information as to how to write constraints, please consult our dedicated page on our website: https://yarnpkg.com/features/constraints. - `,examples:[["Check that all constraints are satisfied","yarn constraints"],["Autofix all unmet constraints","yarn constraints --fix"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd);await o.restoreInstallState();let a=await o.loadUserConfig(),n;if(a?.constraints)n=new $E(o);else{let{Constraints:h}=await Promise.resolve().then(()=>(V2(),Y2));n=await h.find(o)}let u,A=!1,p=!1;for(let h=this.fix?10:1;h>0;--h){let E=await n.process();if(!E)break;let{changedWorkspaces:w,remainingErrors:D}=Kk(o,E,{fix:this.fix}),b=[];for(let[C,T]of w){let N=C.manifest.indent;C.manifest=new _t,C.manifest.indent=N,C.manifest.load(T),b.push(C.persistManifest())}if(await Promise.all(b),!(w.size>0&&h>1)){u=kme(D,{configuration:r}),A=!1,p=!0;for(let[,C]of D)for(let T of C)T.fixable?A=!0:p=!1}}if(u.children.length===0)return 0;if(A){let h=p?`Those errors can all be fixed by running ${pe.pretty(r,"yarn constraints --fix",pe.Type.CODE)}`:`Errors prefixed by '\u2699' can be fixed by running ${pe.pretty(r,"yarn constraints --fix",pe.Type.CODE)}`;await Lt.start({configuration:r,stdout:this.context.stdout,includeNames:!1,includeFooter:!1},async E=>{E.reportInfo(0,h),E.reportSeparator()})}return u.children=qe.sortMap(u.children,h=>h.value[1]),As.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1}),1}};j2();var Jgt={configuration:{enableConstraintsChecks:{description:"If true, constraints will run during installs",type:"BOOLEAN",default:!1},constraintsPath:{description:"The path of the constraints file.",type:"ABSOLUTE_PATH",default:"./constraints.pro"}},commands:[nC,iC,sC],hooks:{async validateProjectAfterInstall(t,{reportError:e}){if(!t.configuration.get("enableConstraintsChecks"))return;let r=await t.loadUserConfig(),o;if(r?.constraints)o=new $E(t);else{let{Constraints:u}=await Promise.resolve().then(()=>(V2(),Y2));o=await u.find(t)}let a=await o.process();if(!a)return;let{remainingErrors:n}=Kk(t,a);if(n.size!==0)if(t.configuration.isCI)for(let[u,A]of n)for(let p of A)e(84,`${pe.pretty(t.configuration,u.anchoredLocator,pe.Type.IDENT)}: ${p.text}`);else e(84,`Constraint check failed; run ${pe.pretty(t.configuration,"yarn constraints",pe.Type.CODE)} for more details`)}}},zgt=Jgt;var l6={};Vt(l6,{CreateCommand:()=>oC,DlxCommand:()=>aC,default:()=>Zgt});Ve();Gt();var oC=class extends ut{constructor(){super(...arguments);this.pkg=de.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=de.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=de.String();this.args=de.Proxy()}static{this.paths=[["create"]]}async execute(){let r=[];this.pkg&&r.push("--package",this.pkg),this.quiet&&r.push("--quiet");let o=this.command.replace(/^(@[^@/]+)(@|$)/,"$1/create$2"),a=G.parseDescriptor(o),n=a.name.match(/^create(-|$)/)?a:a.scope?G.makeIdent(a.scope,`create-${a.name}`):G.makeIdent(null,`create-${a.name}`),u=G.stringifyIdent(n);return a.range!=="unknown"&&(u+=`@${a.range}`),this.cli.run(["dlx",...r,u,...this.args])}};Ve();Ve();St();Gt();var aC=class extends ut{constructor(){super(...arguments);this.packages=de.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=de.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=de.String();this.args=de.Proxy()}static{this.paths=[["dlx"]]}static{this.usage=ot.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]})}async execute(){return ze.telemetry=null,await ae.mktempPromise(async r=>{let o=V.join(r,`dlx-${process.pid}`);await ae.mkdirPromise(o),await ae.writeFilePromise(V.join(o,"package.json"),`{} -`),await ae.writeFilePromise(V.join(o,"yarn.lock"),"");let a=V.join(o,".yarnrc.yml"),n=await ze.findProjectCwd(this.context.cwd),A={enableGlobalCache:!(await ze.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),enableTelemetry:!1,logFilters:[{code:Ju(68),level:pe.LogLevel.Discard}]},p=n!==null?V.join(n,".yarnrc.yml"):null;p!==null&&ae.existsSync(p)?(await ae.copyFilePromise(p,a),await ze.updateConfiguration(o,N=>{let U=qe.toMerged(N,A);return Array.isArray(N.plugins)&&(U.plugins=N.plugins.map(J=>{let te=typeof J=="string"?J:J.path,le=Ae.isAbsolute(te)?te:Ae.resolve(Ae.fromPortablePath(n),te);return typeof J=="string"?le:{path:le,spec:J.spec}})),U})):await ae.writeJsonPromise(a,A);let h=this.packages??[this.command],E=G.parseDescriptor(this.command).name,w=await this.cli.run(["add","--fixed","--",...h],{cwd:o,quiet:this.quiet});if(w!==0)return w;this.quiet||this.context.stdout.write(` -`);let D=await ze.find(o,this.context.plugins),{project:b,workspace:C}=await Qt.find(D,o);if(C===null)throw new or(b.cwd,o);await b.restoreInstallState();let T=await hn.getWorkspaceAccessibleBinaries(C);return T.has(E)===!1&&T.size===1&&typeof this.packages>"u"&&(E=Array.from(T)[0][0]),await hn.executeWorkspaceAccessibleBinary(C,E,this.args,{packageAccessibleBinaries:T,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};var Xgt={commands:[oC,aC]},Zgt=Xgt;var A6={};Vt(A6,{ExecFetcher:()=>J2,ExecResolver:()=>z2,default:()=>tdt,execUtils:()=>Zk});Ve();Ve();St();var hA="exec:";var Zk={};Vt(Zk,{loadGeneratorFile:()=>K2,makeLocator:()=>u6,makeSpec:()=>rye,parseSpec:()=>c6});Ve();St();function c6(t){let{params:e,selector:r}=G.parseRange(t),o=Ae.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?G.parseLocator(e.locator):null,path:o}}function rye({parentLocator:t,path:e,generatorHash:r,protocol:o}){let a=t!==null?{locator:G.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return G.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function u6(t,{parentLocator:e,path:r,generatorHash:o,protocol:a}){return G.makeLocator(t,rye({parentLocator:e,path:r,generatorHash:o,protocol:a}))}async function K2(t,e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(t,{protocol:e}),n=V.isAbsolute(a)?{packageFs:new En(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,n.localPath)}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=V.join(u.prefixPath,a);return await A.readFilePromise(p,"utf8")}var J2=class{supports(e,r){return!!e.reference.startsWith(hA)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:hA});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){let o=await K2(e.reference,hA,r);return ae.mktempPromise(async a=>{let n=V.join(a,"generator.js");return await ae.writeFilePromise(n,o),ae.mktempPromise(async u=>{if(await this.generatePackage(u,e,n,r),!ae.existsSync(V.join(u,"build")))throw new Error("The script should have generated a build directory");return await $i.makeArchiveFromDirectory(V.join(u,"build"),{prefixPath:G.getIdentVendorPath(e),compressionLevel:r.project.configuration.get("compressionLevel")})})})}async generatePackage(e,r,o,a){return await ae.mktempPromise(async n=>{let u=await hn.makeScriptEnv({project:a.project,binFolder:n}),A=V.join(e,"runtime.js");return await ae.mktempPromise(async p=>{let h=V.join(p,"buildfile.log"),E=V.join(e,"generator"),w=V.join(e,"build");await ae.mkdirPromise(E),await ae.mkdirPromise(w);let D={tempDir:Ae.fromPortablePath(E),buildDir:Ae.fromPortablePath(w),locator:G.stringifyLocator(r)};await ae.writeFilePromise(A,` - // Expose 'Module' as a global variable - Object.defineProperty(global, 'Module', { - get: () => require('module'), - configurable: true, - enumerable: false, - }); - - // Expose non-hidden built-in modules as global variables - for (const name of Module.builtinModules.filter((name) => name !== 'module' && !name.startsWith('_'))) { - Object.defineProperty(global, name, { - get: () => require(name), - configurable: true, - enumerable: false, - }); - } - - // Expose the 'execEnv' global variable - Object.defineProperty(global, 'execEnv', { - value: { - ...${JSON.stringify(D)}, - }, - enumerable: true, - }); - `);let b=u.NODE_OPTIONS||"",C=/\s*--require\s+\S*\.pnp\.c?js\s*/g;b=b.replace(C," ").trim(),u.NODE_OPTIONS=b;let{stdout:T,stderr:N}=a.project.configuration.getSubprocessStreams(h,{header:`# This file contains the result of Yarn generating a package (${G.stringifyLocator(r)}) -`,prefix:G.prettyLocator(a.project.configuration,r),report:a.report}),{code:U}=await Hr.pipevp(process.execPath,["--require",Ae.fromPortablePath(A),Ae.fromPortablePath(o),G.stringifyIdent(r)],{cwd:e,env:u,stdin:null,stdout:T,stderr:N});if(U!==0)throw ae.detachTemp(p),new Error(`Package generation failed (exit code ${U}, logs can be found here: ${pe.pretty(a.project.configuration,h,pe.Type.PATH)})`)})})}};Ve();Ve();var $gt=2,z2=class{supportsDescriptor(e,r){return!!e.range.startsWith(hA)}supportsLocator(e,r){return!!e.reference.startsWith(hA)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=c6(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=await K2(G.makeRange({protocol:hA,source:a,selector:a,params:{locator:G.stringifyLocator(n)}}),hA,o.fetchOptions),A=bn.makeHash(`${$gt}`,u).slice(0,6);return[u6(e,{parentLocator:n,path:a,generatorHash:A,protocol:hA})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var edt={fetchers:[J2],resolvers:[z2]},tdt=edt;var p6={};Vt(p6,{FileFetcher:()=>eB,FileResolver:()=>tB,TarballFileFetcher:()=>rB,TarballFileResolver:()=>nB,default:()=>idt,fileUtils:()=>$g});Ve();St();var lC=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,X2=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,_i="file:";var $g={};Vt($g,{fetchArchiveFromLocator:()=>$2,makeArchiveFromLocator:()=>$k,makeBufferFromLocator:()=>f6,makeLocator:()=>cC,makeSpec:()=>nye,parseSpec:()=>Z2});Ve();St();function Z2(t){let{params:e,selector:r}=G.parseRange(t),o=Ae.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?G.parseLocator(e.locator):null,path:o}}function nye({parentLocator:t,path:e,hash:r,protocol:o}){let a=t!==null?{locator:G.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return G.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function cC(t,{parentLocator:e,path:r,hash:o,protocol:a}){return G.makeLocator(t,nye({parentLocator:e,path:r,hash:o,protocol:a}))}async function $2(t,e){let{parentLocator:r,path:o}=G.parseFileStyleRange(t.reference,{protocol:_i}),a=V.isAbsolute(o)?{packageFs:new En(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await e.fetcher.fetch(r,e),n=a.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,a.localPath)}:a;a!==n&&a.releaseFs&&a.releaseFs();let u=n.packageFs,A=V.join(n.prefixPath,o);return await qe.releaseAfterUseAsync(async()=>await u.readFilePromise(A),n.releaseFs)}async function $k(t,{protocol:e,fetchOptions:r,inMemory:o=!1}){let{parentLocator:a,path:n}=G.parseFileStyleRange(t.reference,{protocol:e}),u=V.isAbsolute(n)?{packageFs:new En(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(a,r),A=u.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,u.localPath)}:u;u!==A&&u.releaseFs&&u.releaseFs();let p=A.packageFs,h=V.join(A.prefixPath,n);return await qe.releaseAfterUseAsync(async()=>await $i.makeArchiveFromDirectory(h,{baseFs:p,prefixPath:G.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:o}),A.releaseFs)}async function f6(t,{protocol:e,fetchOptions:r}){return(await $k(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var eB=class{supports(e,r){return!!e.reference.startsWith(_i)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:_i});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){return $k(e,{protocol:_i,fetchOptions:r})}};Ve();Ve();var rdt=2,tB=class{supportsDescriptor(e,r){return e.range.match(lC)?!0:!!e.range.startsWith(_i)}supportsLocator(e,r){return!!e.reference.startsWith(_i)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return lC.test(e.range)&&(e=G.makeDescriptor(e,`${_i}${e.range}`)),G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=Z2(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=await f6(G.makeLocator(e,G.makeRange({protocol:_i,source:a,selector:a,params:{locator:G.stringifyLocator(n)}})),{protocol:_i,fetchOptions:o.fetchOptions}),A=bn.makeHash(`${rdt}`,u).slice(0,6);return[cC(e,{parentLocator:n,path:a,hash:A,protocol:_i})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};Ve();var rB=class{supports(e,r){return X2.test(e.reference)?!!e.reference.startsWith(_i):!1}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromDisk(e,r){let o=await $2(e,r);return await $i.convertToZip(o,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ve();Ve();Ve();var nB=class{supportsDescriptor(e,r){return X2.test(e.range)?!!(e.range.startsWith(_i)||lC.test(e.range)):!1}supportsLocator(e,r){return X2.test(e.reference)?!!e.reference.startsWith(_i):!1}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return lC.test(e.range)&&(e=G.makeDescriptor(e,`${_i}${e.range}`)),G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=Z2(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=cC(e,{parentLocator:n,path:a,hash:"",protocol:_i}),A=await $2(u,o.fetchOptions),p=bn.makeHash(A).slice(0,6);return[cC(e,{parentLocator:n,path:a,hash:p,protocol:_i})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var ndt={fetchers:[rB,eB],resolvers:[nB,tB]},idt=ndt;var d6={};Vt(d6,{GithubFetcher:()=>iB,default:()=>odt,githubUtils:()=>eQ});Ve();St();var eQ={};Vt(eQ,{invalidGithubUrlMessage:()=>oye,isGithubUrl:()=>h6,parseGithubUrl:()=>g6});var iye=et(ve("querystring")),sye=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function h6(t){return t?sye.some(e=>!!t.match(e)):!1}function g6(t){let e;for(let A of sye)if(e=t.match(A),e)break;if(!e)throw new Error(oye(t));let[,r,o,a,n="master"]=e,{commit:u}=iye.default.parse(n);return n=u||n.replace(/[^:]*:/,""),{auth:r,username:o,reponame:a,treeish:n}}function oye(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var iB=class{supports(e,r){return!!h6(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await on.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await ae.mktempPromise(async a=>{let n=new En(a);await $i.extractArchiveTo(o,n,{stripComponents:1});let u=ra.splitRepoUrl(e.reference),A=V.join(a,"package.tgz");await hn.prepareExternalProject(a,A,{configuration:r.project.configuration,report:r.report,workspace:u.extra.workspace,locator:e});let p=await ae.readFilePromise(A);return await $i.convertToZip(p,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:o,username:a,reponame:n,treeish:u}=g6(e.reference);return`https://${o?`${o}@`:""}github.com/${a}/${n}/archive/${u}.tar.gz`}};var sdt={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let o=new iB;if(!o.supports(e,r))return null;try{return await o.fetch(e,r)}catch{return null}}}},odt=sdt;var m6={};Vt(m6,{TarballHttpFetcher:()=>oB,TarballHttpResolver:()=>aB,default:()=>ldt});Ve();function sB(t){let e;try{e=new URL(t)}catch{return!1}return!(e.protocol!=="http:"&&e.protocol!=="https:"||!e.pathname.match(/(\.tar\.gz|\.tgz|\/[^.]+)$/))}var oB=class{supports(e,r){return sB(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await on.get(e.reference,{configuration:r.project.configuration});return await $i.convertToZip(o,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ve();Ve();var aB=class{supportsDescriptor(e,r){return sB(e.range)}supportsLocator(e,r){return sB(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[G.convertDescriptorToLocator(e)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var adt={fetchers:[oB],resolvers:[aB]},ldt=adt;var y6={};Vt(y6,{InitCommand:()=>uC,default:()=>udt});Ve();Ve();St();Gt();var uC=class extends ut{constructor(){super(...arguments);this.private=de.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=de.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=de.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.name=de.String("-n,--name",{description:"Initialize a package with the given name"});this.initializer=de.String({required:!1});this.usev2=de.Boolean("-2",!1,{hidden:!0});this.yes=de.Boolean("-y,--yes",{hidden:!0})}static{this.paths=[["init"]]}static{this.usage=ot.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return o!==null?await this.executeProxy(r,o):await this.executeRegular(r)}async executeProxy(r,o){if(r.projectCwd!==null&&r.projectCwd!==this.context.cwd)throw new it("Cannot use the --install flag from within a project subdirectory");ae.existsSync(this.context.cwd)||await ae.mkdirPromise(this.context.cwd,{recursive:!0});let a=V.join(this.context.cwd,mr.lockfile);ae.existsSync(a)||await ae.writeFilePromise(a,"");let n=await this.cli.run(["set","version",o],{quiet:!0});if(n!==0)return n;let u=[];return this.private&&u.push("-p"),this.workspace&&u.push("-w"),this.name&&u.push(`-n=${this.name}`),this.yes&&u.push("-y"),await ae.mktempPromise(async A=>{let{code:p}=await Hr.pipevp("yarn",["init",...u],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await hn.makeScriptEnv({binFolder:A})});return p})}async executeRegular(r){let o=null;try{o=(await Qt.find(r,this.context.cwd)).project}catch{o=null}ae.existsSync(this.context.cwd)||await ae.mkdirPromise(this.context.cwd,{recursive:!0});let a=await _t.tryFind(this.context.cwd),n=a??new _t,u=Object.fromEntries(r.get("initFields").entries());n.load(u),n.name=n.name??G.makeIdent(r.get("initScope"),this.name??V.basename(this.context.cwd)),n.packageManager=nn&&qe.isTaggedYarnVersion(nn)?`yarn@${nn}`:null,(!a&&this.workspace||this.private)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await ae.mkdirPromise(V.join(this.context.cwd,"packages"),{recursive:!0}),n.workspaceDefinitions=[{pattern:"packages/*"}]);let A={};n.exportTo(A);let p=V.join(this.context.cwd,_t.fileName);await ae.changeFilePromise(p,`${JSON.stringify(A,null,2)} -`,{automaticNewlines:!0});let h=[p],E=V.join(this.context.cwd,"README.md");if(ae.existsSync(E)||(await ae.writeFilePromise(E,`# ${G.stringifyIdent(n.name)} -`),h.push(E)),!o||o.cwd===this.context.cwd){let w=V.join(this.context.cwd,mr.lockfile);ae.existsSync(w)||(await ae.writeFilePromise(w,""),h.push(w));let b=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Whether you use PnP or not, the node_modules folder is often used to store","# build artifacts that should be gitignored","node_modules","","# Swap the comments on the following lines if you wish to use zero-installs","# In that case, don't forget to run `yarn config set enableGlobalCache false`!","# Documentation here: https://yarnpkg.com/features/caching#zero-installs","","#!.yarn/cache",".pnp.*"].map(ce=>`${ce} -`).join(""),C=V.join(this.context.cwd,".gitignore");ae.existsSync(C)||(await ae.writeFilePromise(C,b),h.push(C));let N=["/.yarn/** linguist-vendored","/.yarn/releases/* binary","/.yarn/plugins/**/* binary","/.pnp.* binary linguist-generated"].map(ce=>`${ce} -`).join(""),U=V.join(this.context.cwd,".gitattributes");ae.existsSync(U)||(await ae.writeFilePromise(U,N),h.push(U));let J={"*":{charset:"utf-8",endOfLine:"lf",indentSize:2,indentStyle:"space",insertFinalNewline:!0}};qe.mergeIntoTarget(J,r.get("initEditorConfig"));let te=`root = true -`;for(let[ce,ue]of Object.entries(J)){te+=` -[${ce}] -`;for(let[Ie,he]of Object.entries(ue)){let De=Ie.replace(/[A-Z]/g,Ee=>`_${Ee.toLowerCase()}`);te+=`${De} = ${he} -`}}let le=V.join(this.context.cwd,".editorconfig");ae.existsSync(le)||(await ae.writeFilePromise(le,te),h.push(le)),await this.cli.run(["install"],{quiet:!0}),this.initializer&&(this.context.stdout.write(` -`),await this.cli.run(["dlx",this.initializer],{quiet:!0})),ae.existsSync(V.join(this.context.cwd,".git"))||(await Hr.execvp("git",["init"],{cwd:this.context.cwd}),await Hr.execvp("git",["add","--",...h],{cwd:this.context.cwd}),await Hr.execvp("git",["commit","--allow-empty","-m","First commit"],{cwd:this.context.cwd}))}}};var cdt={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:"STRING",default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:"MAP",valueDefinition:{description:"",type:"ANY"}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:"MAP",valueDefinition:{description:"",type:"ANY"}}},commands:[uC]},udt=cdt;var mj={};Vt(mj,{SearchCommand:()=>xC,UpgradeInteractiveCommand:()=>bC,default:()=>UIt});Ve();var lye=et(ve("os"));function AC({stdout:t}){if(lye.default.endianness()==="BE")throw new Error("Interactive commands cannot be used on big-endian systems because ink depends on yoga-layout-prebuilt which only supports little-endian architectures");if(!t.isTTY)throw new Error("Interactive commands can only be used inside a TTY environment")}Gt();var CEe=et(N6()),O6={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},ayt=(0,CEe.default)(O6.appId,O6.apiKey).initIndex(O6.indexName),M6=async(t,e=0)=>await ayt.search(t,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:e,hitsPerPage:10});var sv=["regular","dev","peer"],xC=class extends ut{static{this.paths=[["search"]]}static{this.usage=ot.Usage({category:"Interactive commands",description:"open the search interface",details:` - This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry. - `,examples:[["Open the search window","yarn search"]]})}async execute(){AC(this.context);let{Gem:e}=await Promise.resolve().then(()=>(UQ(),oj)),{ScrollableItems:r}=await Promise.resolve().then(()=>(jQ(),qQ)),{useKeypress:o}=await Promise.resolve().then(()=>(rv(),bwe)),{useMinistore:a}=await Promise.resolve().then(()=>(fj(),Aj)),{renderForm:n}=await Promise.resolve().then(()=>(VQ(),YQ)),{default:u}=await Promise.resolve().then(()=>et(Uwe())),{Box:A,Text:p}=await Promise.resolve().then(()=>et(ac())),{default:h,useEffect:E,useState:w}=await Promise.resolve().then(()=>et(ln())),D=await ze.find(this.context.cwd,this.context.plugins),b=()=>h.createElement(A,{flexDirection:"row"},h.createElement(A,{flexDirection:"column",width:48},h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move between packages.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select a package.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," again to change the target."))),h.createElement(A,{flexDirection:"column"},h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),C=()=>h.createElement(h.Fragment,null,h.createElement(A,{width:15},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Owner")),h.createElement(A,{width:11},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Version")),h.createElement(A,{width:10},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Downloads"))),T=()=>h.createElement(A,{width:17},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Target")),N=({hit:he,active:De})=>{let[Ee,g]=a(he.name,null);o({active:De},(fe,ie)=>{if(ie.name!=="space")return;if(!Ee){g(sv[0]);return}let Z=sv.indexOf(Ee)+1;Z===sv.length?g(null):g(sv[Z])},[Ee,g]);let me=G.parseIdent(he.name),Ce=G.prettyIdent(D,me);return h.createElement(A,null,h.createElement(A,{width:45},h.createElement(p,{bold:!0,wrap:"wrap"},Ce)),h.createElement(A,{width:14,marginLeft:1},h.createElement(p,{bold:!0,wrap:"truncate"},he.owner.name)),h.createElement(A,{width:10,marginLeft:1},h.createElement(p,{italic:!0,wrap:"truncate"},he.version)),h.createElement(A,{width:16,marginLeft:1},h.createElement(p,null,he.humanDownloadsLast30Days)))},U=({name:he,active:De})=>{let[Ee]=a(he,null),g=G.parseIdent(he);return h.createElement(A,null,h.createElement(A,{width:47},h.createElement(p,{bold:!0}," - ",G.prettyIdent(D,g))),sv.map(me=>h.createElement(A,{key:me,width:14,marginLeft:1},h.createElement(p,null," ",h.createElement(e,{active:Ee===me})," ",h.createElement(p,{bold:!0},me)))))},J=()=>h.createElement(A,{marginTop:1},h.createElement(p,null,"Powered by Algolia.")),le=await n(({useSubmit:he})=>{let De=a();he(De);let Ee=Array.from(De.keys()).filter(q=>De.get(q)!==null),[g,me]=w(""),[Ce,fe]=w(0),[ie,Z]=w([]),Se=q=>{q.match(/\t| /)||me(q)},Re=async()=>{fe(0);let q=await M6(g);q.query===g&&Z(q.hits)},ht=async()=>{let q=await M6(g,Ce+1);q.query===g&&q.page-1===Ce&&(fe(q.page),Z([...ie,...q.hits]))};return E(()=>{g?Re():Z([])},[g]),h.createElement(A,{flexDirection:"column"},h.createElement(b,null),h.createElement(A,{flexDirection:"row",marginTop:1},h.createElement(p,{bold:!0},"Search: "),h.createElement(A,{width:41},h.createElement(u,{value:g,onChange:Se,placeholder:"i.e. babel, webpack, react...",showCursor:!1})),h.createElement(C,null)),ie.length?h.createElement(r,{radius:2,loop:!1,children:ie.map(q=>h.createElement(N,{key:q.name,hit:q,active:!1})),willReachEnd:ht}):h.createElement(p,{color:"gray"},"Start typing..."),h.createElement(A,{flexDirection:"row",marginTop:1},h.createElement(A,{width:49},h.createElement(p,{bold:!0},"Selected:")),h.createElement(T,null)),Ee.length?Ee.map(q=>h.createElement(U,{key:q,name:q,active:!1})):h.createElement(p,{color:"gray"},"No selected packages..."),h.createElement(J,null))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof le>"u")return 1;let ce=Array.from(le.keys()).filter(he=>le.get(he)==="regular"),ue=Array.from(le.keys()).filter(he=>le.get(he)==="dev"),Ie=Array.from(le.keys()).filter(he=>le.get(he)==="peer");return ce.length&&await this.cli.run(["add",...ce]),ue.length&&await this.cli.run(["add","--dev",...ue]),Ie&&await this.cli.run(["add","--peer",...Ie]),0}};Ve();Gt();n8();var Ywe=et(ni()),Wwe=/^((?:[\^~]|>=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/;function Vwe(t,e){return t.length>0?[t.slice(0,e)].concat(Vwe(t.slice(e),e)):[]}var bC=class extends ut{static{this.paths=[["upgrade-interactive"]]}static{this.usage=ot.Usage({category:"Interactive commands",description:"open the upgrade interface",details:` - This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade. - `,examples:[["Open the upgrade window","yarn upgrade-interactive"]]})}async execute(){AC(this.context);let{ItemOptions:e}=await Promise.resolve().then(()=>(Gwe(),jwe)),{Pad:r}=await Promise.resolve().then(()=>(dj(),qwe)),{ScrollableItems:o}=await Promise.resolve().then(()=>(jQ(),qQ)),{useMinistore:a}=await Promise.resolve().then(()=>(fj(),Aj)),{renderForm:n}=await Promise.resolve().then(()=>(VQ(),YQ)),{Box:u,Text:A}=await Promise.resolve().then(()=>et(ac())),{default:p,useEffect:h,useRef:E,useState:w}=await Promise.resolve().then(()=>et(ln())),D=await ze.find(this.context.cwd,this.context.plugins),{project:b,workspace:C}=await Qt.find(D,this.context.cwd),T=await Wr.find(D);if(!C)throw new or(b.cwd,this.context.cwd);await b.restoreInstallState({restoreResolutions:!1});let N=this.context.stdout.rows-7,U=(me,Ce)=>{let fe=$pe(me,Ce),ie="";for(let Z of fe)Z.added?ie+=pe.pretty(D,Z.value,"green"):Z.removed||(ie+=Z.value);return ie},J=(me,Ce)=>{if(me===Ce)return Ce;let fe=G.parseRange(me),ie=G.parseRange(Ce),Z=fe.selector.match(Wwe),Se=ie.selector.match(Wwe);if(!Z||!Se)return U(me,Ce);let Re=["gray","red","yellow","green","magenta"],ht=null,q="";for(let nt=1;nt{let ie=await nu.fetchDescriptorFrom(me,fe,{project:b,cache:T,preserveModifier:Ce,workspace:C});return ie!==null?ie.range:me.range},le=async me=>{let Ce=Ywe.default.valid(me.range)?`^${me.range}`:me.range,[fe,ie]=await Promise.all([te(me,me.range,Ce).catch(()=>null),te(me,me.range,"latest").catch(()=>null)]),Z=[{value:null,label:me.range}];return fe&&fe!==me.range?Z.push({value:fe,label:J(me.range,fe)}):Z.push({value:null,label:""}),ie&&ie!==fe&&ie!==me.range?Z.push({value:ie,label:J(me.range,ie)}):Z.push({value:null,label:""}),Z},ce=()=>p.createElement(u,{flexDirection:"row"},p.createElement(u,{flexDirection:"column",width:49},p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},""),"/",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to select packages.")),p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},""),"/",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to select versions."))),p.createElement(u,{flexDirection:"column"},p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to install.")),p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to abort.")))),ue=()=>p.createElement(u,{flexDirection:"row",paddingTop:1,paddingBottom:1},p.createElement(u,{width:50},p.createElement(A,{bold:!0},p.createElement(A,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Current")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Range")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Latest"))),Ie=({active:me,descriptor:Ce,suggestions:fe})=>{let[ie,Z]=a(Ce.descriptorHash,null),Se=G.stringifyIdent(Ce),Re=Math.max(0,45-Se.length);return p.createElement(p.Fragment,null,p.createElement(u,null,p.createElement(u,{width:45},p.createElement(A,{bold:!0},G.prettyIdent(D,Ce)),p.createElement(r,{active:me,length:Re})),p.createElement(e,{active:me,options:fe,value:ie,skewer:!0,onChange:Z,sizes:[17,17,17]})))},he=({dependencies:me})=>{let[Ce,fe]=w(me.map(()=>null)),ie=E(!0),Z=async Se=>{let Re=await le(Se);return Re.filter(ht=>ht.label!=="").length<=1?null:{descriptor:Se,suggestions:Re}};return h(()=>()=>{ie.current=!1},[]),h(()=>{let Se=Math.trunc(N*1.75),Re=me.slice(0,Se),ht=me.slice(Se),q=Vwe(ht,N),nt=Re.map(Z).reduce(async(Le,Te)=>{await Le;let ke=await Te;ke!==null&&ie.current&&fe(Ke=>{let xe=Ke.findIndex(He=>He===null),tt=[...Ke];return tt[xe]=ke,tt})},Promise.resolve());q.reduce((Le,Te)=>Promise.all(Te.map(ke=>Promise.resolve().then(()=>Z(ke)))).then(async ke=>{ke=ke.filter(Ke=>Ke!==null),await Le,ie.current&&fe(Ke=>{let xe=Ke.findIndex(tt=>tt===null);return Ke.slice(0,xe).concat(ke).concat(Ke.slice(xe+ke.length))})}),nt).then(()=>{ie.current&&fe(Le=>Le.filter(Te=>Te!==null))})},[]),Ce.length?p.createElement(o,{radius:N>>1,children:Ce.map((Se,Re)=>Se!==null?p.createElement(Ie,{key:Re,active:!1,descriptor:Se.descriptor,suggestions:Se.suggestions}):p.createElement(A,{key:Re},"Loading..."))}):p.createElement(A,null,"No upgrades found")},Ee=await n(({useSubmit:me})=>{me(a());let Ce=new Map;for(let ie of b.workspaces)for(let Z of["dependencies","devDependencies"])for(let Se of ie.manifest[Z].values())b.tryWorkspaceByDescriptor(Se)===null&&(Se.range.startsWith("link:")||Ce.set(Se.descriptorHash,Se));let fe=qe.sortMap(Ce.values(),ie=>G.stringifyDescriptor(ie));return p.createElement(u,{flexDirection:"column"},p.createElement(ce,null),p.createElement(ue,null),p.createElement(he,{dependencies:fe}))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof Ee>"u")return 1;let g=!1;for(let me of b.workspaces)for(let Ce of["dependencies","devDependencies"]){let fe=me.manifest[Ce];for(let ie of fe.values()){let Z=Ee.get(ie.descriptorHash);typeof Z<"u"&&Z!==null&&(fe.set(ie.identHash,G.makeDescriptor(ie,Z)),g=!0)}}return g?await b.installWithNewReport({quiet:this.context.quiet,stdout:this.context.stdout},{cache:T}):0}};var MIt={commands:[xC,bC]},UIt=MIt;var yj={};Vt(yj,{LinkFetcher:()=>av,LinkResolver:()=>lv,PortalFetcher:()=>cv,PortalResolver:()=>uv,default:()=>HIt});Ve();St();var Zf="portal:",$f="link:";var av=class{supports(e,r){return!!e.reference.startsWith($f)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:$f});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:$f}),n=V.isAbsolute(a)?{packageFs:new En(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,n.localPath),localPath:Bt.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=V.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new En(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,discardFromLookup:!0,localPath:p}:{packageFs:new Gu(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,discardFromLookup:!0}}};Ve();St();var lv=class{supportsDescriptor(e,r){return!!e.range.startsWith($f)}supportsLocator(e,r){return!!e.reference.startsWith($f)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice($f.length);return[G.makeLocator(e,`${$f}${Ae.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){return{...e,version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};Ve();St();var cv=class{supports(e,r){return!!e.reference.startsWith(Zf)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:Zf});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:Zf}),n=V.isAbsolute(a)?{packageFs:new En(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,n.localPath),localPath:Bt.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=V.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new En(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,localPath:p}:{packageFs:new Gu(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot}}};Ve();Ve();St();var uv=class{supportsDescriptor(e,r){return!!e.range.startsWith(Zf)}supportsLocator(e,r){return!!e.reference.startsWith(Zf)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(Zf.length);return[G.makeLocator(e,`${Zf}${Ae.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var _It={fetchers:[av,cv],resolvers:[lv,uv]},HIt=_It;var tG={};Vt(tG,{NodeModulesLinker:()=>Dv,NodeModulesMode:()=>Xj,PnpLooseLinker:()=>Sv,default:()=>n1t});St();Ve();St();St();var Cj=(t,e)=>`${t}@${e}`,Kwe=(t,e)=>{let r=e.indexOf("#"),o=r>=0?e.substring(r+1):e;return Cj(t,o)};var zwe=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),o=e.check||r>=9,a=e.hoistingLimits||new Map,n={check:o,debugLevel:r,hoistingLimits:a,fastLookupPossible:!0},u;n.debugLevel>=0&&(u=Date.now());let A=KIt(t,n),p=!1,h=0;do{let E=Ij(A,[A],new Set([A.locator]),new Map,n);p=E.anotherRoundNeeded||E.isGraphChanged,n.fastLookupPossible=!1,h++}while(p);if(n.debugLevel>=0&&console.log(`hoist time: ${Date.now()-u}ms, rounds: ${h}`),n.debugLevel>=1){let E=Av(A);if(Ij(A,[A],new Set([A.locator]),new Map,n).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: -${E}, next tree: -${Av(A)}`);let D=Xwe(A);if(D)throw new Error(`${D}, after hoisting finished: -${Av(A)}`)}return n.debugLevel>=2&&console.log(Av(A)),JIt(A)},qIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=n=>{if(!o.has(n)){o.add(n);for(let u of n.hoistedDependencies.values())r.set(u.name,u);for(let u of n.dependencies.values())n.peerNames.has(u.name)||a(u)}};return a(e),r},jIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=new Set,n=(u,A)=>{if(o.has(u))return;o.add(u);for(let h of u.hoistedDependencies.values())if(!A.has(h.name)){let E;for(let w of t)E=w.dependencies.get(h.name),E&&r.set(E.name,E)}let p=new Set;for(let h of u.dependencies.values())p.add(h.name);for(let h of u.dependencies.values())u.peerNames.has(h.name)||n(h,p)};return n(e,a),r},Jwe=(t,e)=>{if(e.decoupled)return e;let{name:r,references:o,ident:a,locator:n,dependencies:u,originalDependencies:A,hoistedDependencies:p,peerNames:h,reasons:E,isHoistBorder:w,hoistPriority:D,dependencyKind:b,hoistedFrom:C,hoistedTo:T}=e,N={name:r,references:new Set(o),ident:a,locator:n,dependencies:new Map(u),originalDependencies:new Map(A),hoistedDependencies:new Map(p),peerNames:new Set(h),reasons:new Map(E),decoupled:!0,isHoistBorder:w,hoistPriority:D,dependencyKind:b,hoistedFrom:new Map(C),hoistedTo:new Map(T)},U=N.dependencies.get(r);return U&&U.ident==N.ident&&N.dependencies.set(r,N),t.dependencies.set(N.name,N),N},GIt=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let a of t.dependencies.values())t.peerNames.has(a.name)||r.set(a.name,[a.ident]);let o=Array.from(e.keys());o.sort((a,n)=>{let u=e.get(a),A=e.get(n);if(A.hoistPriority!==u.hoistPriority)return A.hoistPriority-u.hoistPriority;{let p=u.dependents.size+u.peerDependents.size;return A.dependents.size+A.peerDependents.size-p}});for(let a of o){let n=a.substring(0,a.indexOf("@",1)),u=a.substring(n.length+1);if(!t.peerNames.has(n)){let A=r.get(n);A||(A=[],r.set(n,A)),A.indexOf(u)<0&&A.push(u)}}return r},Ej=t=>{let e=new Set,r=(o,a=new Set)=>{if(!a.has(o)){a.add(o);for(let n of o.peerNames)if(!t.peerNames.has(n)){let u=t.dependencies.get(n);u&&!e.has(u)&&r(u,a)}e.add(o)}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||r(o);return e},Ij=(t,e,r,o,a,n=new Set)=>{let u=e[e.length-1];if(n.has(u))return{anotherRoundNeeded:!1,isGraphChanged:!1};n.add(u);let A=zIt(u),p=GIt(u,A),h=t==u?new Map:a.fastLookupPossible?qIt(e):jIt(e),E,w=!1,D=!1,b=new Map(Array.from(p.entries()).map(([T,N])=>[T,N[0]])),C=new Map;do{let T=VIt(t,e,r,h,b,p,o,C,a);T.isGraphChanged&&(D=!0),T.anotherRoundNeeded&&(w=!0),E=!1;for(let[N,U]of p)U.length>1&&!u.dependencies.has(N)&&(b.delete(N),U.shift(),b.set(N,U[0]),E=!0)}while(E);for(let T of u.dependencies.values())if(!u.peerNames.has(T.name)&&!r.has(T.locator)){r.add(T.locator);let N=Ij(t,[...e,T],r,C,a);N.isGraphChanged&&(D=!0),N.anotherRoundNeeded&&(w=!0),r.delete(T.locator)}return{anotherRoundNeeded:w,isGraphChanged:D}},WIt=t=>{for(let[e,r]of t.dependencies)if(!t.peerNames.has(e)&&r.ident!==t.ident)return!0;return!1},YIt=(t,e,r,o,a,n,u,A,{outputReason:p,fastLookupPossible:h})=>{let E,w=null,D=new Set;p&&(E=`${Array.from(e).map(N=>zs(N)).join("\u2192")}`);let b=r[r.length-1],T=!(o.ident===b.ident);if(p&&!T&&(w="- self-reference"),T&&(T=o.dependencyKind!==1,p&&!T&&(w="- workspace")),T&&o.dependencyKind===2&&(T=!WIt(o),p&&!T&&(w="- external soft link with unhoisted dependencies")),T&&(T=!t.peerNames.has(o.name),p&&!T&&(w=`- cannot shadow peer: ${zs(t.originalDependencies.get(o.name).locator)} at ${E}`)),T){let N=!1,U=a.get(o.name);if(N=!U||U.ident===o.ident,p&&!N&&(w=`- filled by: ${zs(U.locator)} at ${E}`),N)for(let J=r.length-1;J>=1;J--){let le=r[J].dependencies.get(o.name);if(le&&le.ident!==o.ident){N=!1;let ce=A.get(b);ce||(ce=new Set,A.set(b,ce)),ce.add(o.name),p&&(w=`- filled by ${zs(le.locator)} at ${r.slice(0,J).map(ue=>zs(ue.locator)).join("\u2192")}`);break}}T=N}if(T&&(T=n.get(o.name)===o.ident,p&&!T&&(w=`- filled by: ${zs(u.get(o.name)[0])} at ${E}`)),T){let N=!0,U=new Set(o.peerNames);for(let J=r.length-1;J>=1;J--){let te=r[J];for(let le of U){if(te.peerNames.has(le)&&te.originalDependencies.has(le))continue;let ce=te.dependencies.get(le);ce&&t.dependencies.get(le)!==ce&&(J===r.length-1?D.add(ce):(D=null,N=!1,p&&(w=`- peer dependency ${zs(ce.locator)} from parent ${zs(te.locator)} was not hoisted to ${E}`))),U.delete(le)}if(!N)break}T=N}if(T&&!h)for(let N of o.hoistedDependencies.values()){let U=a.get(N.name)||t.dependencies.get(N.name);if(!U||N.ident!==U.ident){T=!1,p&&(w=`- previously hoisted dependency mismatch, needed: ${zs(N.locator)}, available: ${zs(U?.locator)}`);break}}return D!==null&&D.size>0?{isHoistable:2,dependsOn:D,reason:w}:{isHoistable:T?0:1,reason:w}},KQ=t=>`${t.name}@${t.locator}`,VIt=(t,e,r,o,a,n,u,A,p)=>{let h=e[e.length-1],E=new Set,w=!1,D=!1,b=(U,J,te,le,ce)=>{if(E.has(le))return;let ue=[...J,KQ(le)],Ie=[...te,KQ(le)],he=new Map,De=new Map;for(let fe of Ej(le)){let ie=YIt(h,r,[h,...U,le],fe,o,a,n,A,{outputReason:p.debugLevel>=2,fastLookupPossible:p.fastLookupPossible});if(De.set(fe,ie),ie.isHoistable===2)for(let Z of ie.dependsOn){let Se=he.get(Z.name)||new Set;Se.add(fe.name),he.set(Z.name,Se)}}let Ee=new Set,g=(fe,ie,Z)=>{if(!Ee.has(fe)){Ee.add(fe),De.set(fe,{isHoistable:1,reason:Z});for(let Se of he.get(fe.name)||[])g(le.dependencies.get(Se),ie,p.debugLevel>=2?`- peer dependency ${zs(fe.locator)} from parent ${zs(le.locator)} was not hoisted`:"")}};for(let[fe,ie]of De)ie.isHoistable===1&&g(fe,ie,ie.reason);let me=!1;for(let fe of De.keys())if(!Ee.has(fe)){D=!0;let ie=u.get(le);ie&&ie.has(fe.name)&&(w=!0),me=!0,le.dependencies.delete(fe.name),le.hoistedDependencies.set(fe.name,fe),le.reasons.delete(fe.name);let Z=h.dependencies.get(fe.name);if(p.debugLevel>=2){let Se=Array.from(J).concat([le.locator]).map(ht=>zs(ht)).join("\u2192"),Re=h.hoistedFrom.get(fe.name);Re||(Re=[],h.hoistedFrom.set(fe.name,Re)),Re.push(Se),le.hoistedTo.set(fe.name,Array.from(e).map(ht=>zs(ht.locator)).join("\u2192"))}if(!Z)h.ident!==fe.ident&&(h.dependencies.set(fe.name,fe),ce.add(fe));else for(let Se of fe.references)Z.references.add(Se)}if(le.dependencyKind===2&&me&&(w=!0),p.check){let fe=Xwe(t);if(fe)throw new Error(`${fe}, after hoisting dependencies of ${[h,...U,le].map(ie=>zs(ie.locator)).join("\u2192")}: -${Av(t)}`)}let Ce=Ej(le);for(let fe of Ce)if(Ee.has(fe)){let ie=De.get(fe);if((a.get(fe.name)===fe.ident||!le.reasons.has(fe.name))&&ie.isHoistable!==0&&le.reasons.set(fe.name,ie.reason),!fe.isHoistBorder&&Ie.indexOf(KQ(fe))<0){E.add(le);let Se=Jwe(le,fe);b([...U,le],ue,Ie,Se,T),E.delete(le)}}},C,T=new Set(Ej(h)),N=Array.from(e).map(U=>KQ(U));do{C=T,T=new Set;for(let U of C){if(U.locator===h.locator||U.isHoistBorder)continue;let J=Jwe(h,U);b([],Array.from(r),N,J,T)}}while(T.size>0);return{anotherRoundNeeded:w,isGraphChanged:D}},Xwe=t=>{let e=[],r=new Set,o=new Set,a=(n,u,A)=>{if(r.has(n)||(r.add(n),o.has(n)))return;let p=new Map(u);for(let h of n.dependencies.values())n.peerNames.has(h.name)||p.set(h.name,h);for(let h of n.originalDependencies.values()){let E=p.get(h.name),w=()=>`${Array.from(o).concat([n]).map(D=>zs(D.locator)).join("\u2192")}`;if(n.peerNames.has(h.name)){let D=u.get(h.name);(D!==E||!D||D.ident!==h.ident)&&e.push(`${w()} - broken peer promise: expected ${h.ident} but found ${D&&D.ident}`)}else{let D=A.hoistedFrom.get(n.name),b=n.hoistedTo.get(h.name),C=`${D?` hoisted from ${D.join(", ")}`:""}`,T=`${b?` hoisted to ${b}`:""}`,N=`${w()}${C}`;E?E.ident!==h.ident&&e.push(`${N} - broken require promise for ${h.name}${T}: expected ${h.ident}, but found: ${E.ident}`):e.push(`${N} - broken require promise: no required dependency ${h.name}${T} found`)}}o.add(n);for(let h of n.dependencies.values())n.peerNames.has(h.name)||a(h,p,n);o.delete(n)};return a(t,t.dependencies,t),e.join(` -`)},KIt=(t,e)=>{let{identName:r,name:o,reference:a,peerNames:n}=t,u={name:o,references:new Set([a]),locator:Cj(r,a),ident:Kwe(r,a),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(n),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},A=new Map([[t,u]]),p=(h,E)=>{let w=A.get(h),D=!!w;if(!w){let{name:b,identName:C,reference:T,peerNames:N,hoistPriority:U,dependencyKind:J}=h,te=e.hoistingLimits.get(E.locator);w={name:b,references:new Set([T]),locator:Cj(C,T),ident:Kwe(C,T),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(N),reasons:new Map,decoupled:!0,isHoistBorder:te?te.has(b):!1,hoistPriority:U||0,dependencyKind:J||0,hoistedFrom:new Map,hoistedTo:new Map},A.set(h,w)}if(E.dependencies.set(h.name,w),E.originalDependencies.set(h.name,w),D){let b=new Set,C=T=>{if(!b.has(T)){b.add(T),T.decoupled=!1;for(let N of T.dependencies.values())T.peerNames.has(N.name)||C(N)}};C(w)}else for(let b of h.dependencies)p(b,w)};for(let h of t.dependencies)p(h,u);return u},wj=t=>t.substring(0,t.indexOf("@",1)),JIt=t=>{let e={name:t.name,identName:wj(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),o=(a,n,u)=>{let A=r.has(a),p;if(n===a)p=u;else{let{name:h,references:E,locator:w}=a;p={name:h,identName:wj(w),references:E,dependencies:new Set}}if(u.dependencies.add(p),!A){r.add(a);for(let h of a.dependencies.values())a.peerNames.has(h.name)||o(h,a,p);r.delete(a)}};for(let a of t.dependencies.values())o(a,t,e);return e},zIt=t=>{let e=new Map,r=new Set([t]),o=u=>`${u.name}@${u.ident}`,a=u=>{let A=o(u),p=e.get(A);return p||(p={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(A,p)),p},n=(u,A)=>{let p=!!r.has(A);if(a(A).dependents.add(u.ident),!p){r.add(A);for(let E of A.dependencies.values()){let w=a(E);w.hoistPriority=Math.max(w.hoistPriority,E.hoistPriority),A.peerNames.has(E.name)?w.peerDependents.add(A.ident):n(A,E)}}};for(let u of t.dependencies.values())t.peerNames.has(u.name)||n(t,u);return e},zs=t=>{if(!t)return"none";let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let o=t.substring(e+1);if(o==="workspace:.")return".";if(o){let a=(o.indexOf("#")>0?o.split("#")[1]:o).replace("npm:","");return o.startsWith("virtual")&&(r=`v:${r}`),a.startsWith("workspace")&&(r=`w:${r}`,a=""),`${r}${a?`@${a}`:""}`}else return`${r}`};var Av=t=>{let e=0,r=(a,n,u="")=>{if(e>5e4||n.has(a))return"";e++;let A=Array.from(a.dependencies.values()).sort((h,E)=>h.name===E.name?0:h.name>E.name?1:-1),p="";n.add(a);for(let h=0;h":"")+(D!==E.name?`a:${E.name}:`:"")+zs(E.locator)+(w?` ${w}`:"")} -`,p+=r(E,n,`${u}${h5e4?` -Tree is too large, part of the tree has been dunped -`:"")};var fv=(o=>(o.WORKSPACES="workspaces",o.DEPENDENCIES="dependencies",o.NONE="none",o))(fv||{}),Zwe="node_modules",jh="$wsroot$";var pv=(t,e)=>{let{packageTree:r,hoistingLimits:o,errors:a,preserveSymlinksRequired:n}=ZIt(t,e),u=null;if(a.length===0){let A=zwe(r,{hoistingLimits:o});u=ewt(t,A,e)}return{tree:u,errors:a,preserveSymlinksRequired:n}},yA=t=>`${t.name}@${t.reference}`,vj=t=>{let e=new Map;for(let[r,o]of t.entries())if(!o.dirList){let a=e.get(o.locator);a||(a={target:o.target,linkType:o.linkType,locations:[],aliases:o.aliases},e.set(o.locator,a)),a.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((o,a)=>{let n=o.split(V.delimiter).length,u=a.split(V.delimiter).length;return a===o?0:n!==u?u-n:a>o?1:-1});return e},$we=(t,e)=>{let r=G.isVirtualLocator(t)?G.devirtualizeLocator(t):t,o=G.isVirtualLocator(e)?G.devirtualizeLocator(e):e;return G.areLocatorsEqual(r,o)},Bj=(t,e,r,o)=>{if(t.linkType!=="SOFT")return!1;let a=Ae.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation);return V.contains(o,a)===null},XIt=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(t.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let o=Ae.toPortablePath(e.packageLocation.slice(0,-1)),a=new Map,n={children:new Map},u=t.getDependencyTreeRoots(),A=new Map,p=new Set,h=(D,b)=>{let C=yA(D);if(p.has(C))return;p.add(C);let T=t.getPackageInformation(D);if(T){let N=b?yA(b):"";if(yA(D)!==N&&T.linkType==="SOFT"&&!D.reference.startsWith("link:")&&!Bj(T,D,t,o)){let U=e1e(T,D,t);(!A.get(U)||D.reference.startsWith("workspace:"))&&A.set(U,D)}for(let[U,J]of T.packageDependencies)J!==null&&(T.packagePeers.has(U)||h(t.getLocator(U,J),D))}};for(let D of u)h(D,null);let E=o.split(V.sep);for(let D of A.values()){let b=t.getPackageInformation(D),T=Ae.toPortablePath(b.packageLocation.slice(0,-1)).split(V.sep).slice(E.length),N=n;for(let U of T){let J=N.children.get(U);J||(J={children:new Map},N.children.set(U,J)),N=J}N.workspaceLocator=D}let w=(D,b)=>{if(D.workspaceLocator){let C=yA(b),T=a.get(C);T||(T=new Set,a.set(C,T)),T.add(D.workspaceLocator)}for(let C of D.children.values())w(C,D.workspaceLocator||b)};for(let D of n.children.values())w(D,n.workspaceLocator);return a},ZIt=(t,e)=>{let r=[],o=!1,a=new Map,n=XIt(t),u=t.getPackageInformation(t.topLevel);if(u===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let A=t.findPackageLocator(u.packageLocation);if(A===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let p=Ae.toPortablePath(u.packageLocation.slice(0,-1)),h={name:A.name,identName:A.name,reference:A.reference,peerNames:u.packagePeers,dependencies:new Set,dependencyKind:1},E=new Map,w=(b,C)=>`${yA(C)}:${b}`,D=(b,C,T,N,U,J,te,le)=>{let ce=w(b,T),ue=E.get(ce),Ie=!!ue;!Ie&&T.name===A.name&&T.reference===A.reference&&(ue=h,E.set(ce,h));let he=Bj(C,T,t,p);if(!ue){let fe=0;he?fe=2:C.linkType==="SOFT"&&T.name.endsWith(jh)&&(fe=1),ue={name:b,identName:T.name,reference:T.reference,dependencies:new Set,peerNames:fe===1?new Set:C.packagePeers,dependencyKind:fe},E.set(ce,ue)}let De;if(he?De=2:U.linkType==="SOFT"?De=1:De=0,ue.hoistPriority=Math.max(ue.hoistPriority||0,De),le&&!he){let fe=yA({name:N.identName,reference:N.reference}),ie=a.get(fe)||new Set;a.set(fe,ie),ie.add(ue.name)}let Ee=new Map(C.packageDependencies);if(e.project){let fe=e.project.workspacesByCwd.get(Ae.toPortablePath(C.packageLocation.slice(0,-1)));if(fe){let ie=new Set([...Array.from(fe.manifest.peerDependencies.values(),Z=>G.stringifyIdent(Z)),...Array.from(fe.manifest.peerDependenciesMeta.keys())]);for(let Z of ie)Ee.has(Z)||(Ee.set(Z,J.get(Z)||null),ue.peerNames.add(Z))}}let g=yA({name:T.name.replace(jh,""),reference:T.reference}),me=n.get(g);if(me)for(let fe of me)Ee.set(`${fe.name}${jh}`,fe.reference);(C!==U||C.linkType!=="SOFT"||!he&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(te)))&&N.dependencies.add(ue);let Ce=T!==A&&C.linkType==="SOFT"&&!T.name.endsWith(jh)&&!he;if(!Ie&&!Ce){let fe=new Map;for(let[ie,Z]of Ee)if(Z!==null){let Se=t.getLocator(ie,Z),Re=t.getLocator(ie.replace(jh,""),Z),ht=t.getPackageInformation(Re);if(ht===null)throw new Error("Assertion failed: Expected the package to have been registered");let q=Bj(ht,Se,t,p);if(e.validateExternalSoftLinks&&e.project&&q){ht.packageDependencies.size>0&&(o=!0);for(let[Ke,xe]of ht.packageDependencies)if(xe!==null){let tt=G.parseLocator(Array.isArray(xe)?`${xe[0]}@${xe[1]}`:`${Ke}@${xe}`);if(yA(tt)!==yA(Se)){let He=Ee.get(Ke);if(He){let x=G.parseLocator(Array.isArray(He)?`${He[0]}@${He[1]}`:`${Ke}@${He}`);$we(x,tt)||r.push({messageName:71,text:`Cannot link ${G.prettyIdent(e.project.configuration,G.parseIdent(Se.name))} into ${G.prettyLocator(e.project.configuration,G.parseLocator(`${T.name}@${T.reference}`))} dependency ${G.prettyLocator(e.project.configuration,tt)} conflicts with parent dependency ${G.prettyLocator(e.project.configuration,x)}`})}else{let x=fe.get(Ke);if(x){let I=x.target,P=G.parseLocator(Array.isArray(I)?`${I[0]}@${I[1]}`:`${Ke}@${I}`);$we(P,tt)||r.push({messageName:71,text:`Cannot link ${G.prettyIdent(e.project.configuration,G.parseIdent(Se.name))} into ${G.prettyLocator(e.project.configuration,G.parseLocator(`${T.name}@${T.reference}`))} dependency ${G.prettyLocator(e.project.configuration,tt)} conflicts with dependency ${G.prettyLocator(e.project.configuration,P)} from sibling portal ${G.prettyIdent(e.project.configuration,G.parseIdent(x.portal.name))}`})}else fe.set(Ke,{target:tt.reference,portal:Se})}}}}let nt=e.hoistingLimitsByCwd?.get(te),Le=q?te:V.relative(p,Ae.toPortablePath(ht.packageLocation))||Bt.dot,Te=e.hoistingLimitsByCwd?.get(Le);D(ie,ht,Se,ue,C,Ee,Le,nt==="dependencies"||Te==="dependencies"||Te==="workspaces")}}};return D(A.name,u,A,h,u,u.packageDependencies,Bt.dot,!1),{packageTree:h,hoistingLimits:a,errors:r,preserveSymlinksRequired:o}};function e1e(t,e,r){let o=r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation;return Ae.toPortablePath(o||t.packageLocation)}function $It(t,e,r){let o=e.getLocator(t.name.replace(jh,""),t.reference),a=e.getPackageInformation(o);if(a===null)throw new Error("Assertion failed: Expected the package to be registered");return r.pnpifyFs?{linkType:"SOFT",target:Ae.toPortablePath(a.packageLocation)}:{linkType:a.linkType,target:e1e(a,t,e)}}var ewt=(t,e,r)=>{let o=new Map,a=(E,w,D)=>{let{linkType:b,target:C}=$It(E,t,r);return{locator:yA(E),nodePath:w,target:C,linkType:b,aliases:D}},n=E=>{let[w,D]=E.split("/");return D?{scope:w,name:D}:{scope:null,name:w}},u=new Set,A=(E,w,D)=>{if(u.has(E))return;u.add(E);let b=Array.from(E.references).sort().join("#");for(let C of E.dependencies){let T=Array.from(C.references).sort().join("#");if(C.identName===E.identName.replace(jh,"")&&T===b)continue;let N=Array.from(C.references).sort(),U={name:C.identName,reference:N[0]},{name:J,scope:te}=n(C.name),le=te?[te,J]:[J],ce=V.join(w,Zwe),ue=V.join(ce,...le),Ie=`${D}/${U.name}`,he=a(U,D,N.slice(1)),De=!1;if(he.linkType==="SOFT"&&r.project){let Ee=r.project.workspacesByCwd.get(he.target.slice(0,-1));De=!!(Ee&&!Ee.manifest.name)}if(!C.name.endsWith(jh)&&!De){let Ee=o.get(ue);if(Ee){if(Ee.dirList)throw new Error(`Assertion failed: ${ue} cannot merge dir node with leaf node`);{let Ce=G.parseLocator(Ee.locator),fe=G.parseLocator(he.locator);if(Ee.linkType!==he.linkType)throw new Error(`Assertion failed: ${ue} cannot merge nodes with different link types ${Ee.nodePath}/${G.stringifyLocator(Ce)} and ${D}/${G.stringifyLocator(fe)}`);if(Ce.identHash!==fe.identHash)throw new Error(`Assertion failed: ${ue} cannot merge nodes with different idents ${Ee.nodePath}/${G.stringifyLocator(Ce)} and ${D}/s${G.stringifyLocator(fe)}`);he.aliases=[...he.aliases,...Ee.aliases,G.parseLocator(Ee.locator).reference]}}o.set(ue,he);let g=ue.split("/"),me=g.indexOf(Zwe);for(let Ce=g.length-1;me>=0&&Ce>me;Ce--){let fe=Ae.toPortablePath(g.slice(0,Ce).join(V.sep)),ie=g[Ce],Z=o.get(fe);if(!Z)o.set(fe,{dirList:new Set([ie])});else if(Z.dirList){if(Z.dirList.has(ie))break;Z.dirList.add(ie)}}}A(C,he.linkType==="SOFT"?he.target:ue,Ie)}},p=a({name:e.name,reference:Array.from(e.references)[0]},"",[]),h=p.target;return o.set(h,p),A(e,h,""),o};Ve();Ve();St();St();sA();Ol();var jj={};Vt(jj,{PnpInstaller:()=>pd,PnpLinker:()=>Yh,UnplugCommand:()=>QC,default:()=>kwt,getPnpPath:()=>Vh,jsInstallUtils:()=>CA,pnpUtils:()=>vv,quotePathIfNeeded:()=>M1e});St();var O1e=ve("url");Ve();Ve();St();St();var t1e={DEFAULT:{collapsed:!1,next:{"*":"DEFAULT"}},TOP_LEVEL:{collapsed:!1,next:{fallbackExclusionList:"FALLBACK_EXCLUSION_LIST",packageRegistryData:"PACKAGE_REGISTRY_DATA","*":"DEFAULT"}},FALLBACK_EXCLUSION_LIST:{collapsed:!1,next:{"*":"FALLBACK_EXCLUSION_ENTRIES"}},FALLBACK_EXCLUSION_ENTRIES:{collapsed:!0,next:{"*":"FALLBACK_EXCLUSION_DATA"}},FALLBACK_EXCLUSION_DATA:{collapsed:!0,next:{"*":"DEFAULT"}},PACKAGE_REGISTRY_DATA:{collapsed:!1,next:{"*":"PACKAGE_REGISTRY_ENTRIES"}},PACKAGE_REGISTRY_ENTRIES:{collapsed:!0,next:{"*":"PACKAGE_STORE_DATA"}},PACKAGE_STORE_DATA:{collapsed:!1,next:{"*":"PACKAGE_STORE_ENTRIES"}},PACKAGE_STORE_ENTRIES:{collapsed:!0,next:{"*":"PACKAGE_INFORMATION_DATA"}},PACKAGE_INFORMATION_DATA:{collapsed:!1,next:{packageDependencies:"PACKAGE_DEPENDENCIES","*":"DEFAULT"}},PACKAGE_DEPENDENCIES:{collapsed:!1,next:{"*":"PACKAGE_DEPENDENCY"}},PACKAGE_DEPENDENCY:{collapsed:!0,next:{"*":"DEFAULT"}}};function twt(t,e,r){let o="";o+="[";for(let a=0,n=t.length;a"u"||(A!==0&&(a+=", "),a+=JSON.stringify(p),a+=": ",a+=JQ(p,h,e,r).replace(/^ +/g,""),A+=1)}return a+="}",a}function iwt(t,e,r){let o=Object.keys(t),a=`${r} `,n="";n+=r,n+=`{ -`;let u=0;for(let A=0,p=o.length;A"u"||(u!==0&&(n+=",",n+=` -`),n+=a,n+=JSON.stringify(h),n+=": ",n+=JQ(h,E,e,a).replace(/^ +/g,""),u+=1)}return u!==0&&(n+=` -`),n+=r,n+="}",n}function JQ(t,e,r,o){let{next:a}=t1e[r],n=a[t]||a["*"];return r1e(e,n,o)}function r1e(t,e,r){let{collapsed:o}=t1e[e];return Array.isArray(t)?o?twt(t,e,r):rwt(t,e,r):typeof t=="object"&&t!==null?o?nwt(t,e,r):iwt(t,e,r):JSON.stringify(t)}function n1e(t){return r1e(t,"TOP_LEVEL","")}function hv(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function swt(t){let e=new Map,r=hv(t.fallbackExclusionList||[],[({name:o,reference:a})=>o,({name:o,reference:a})=>a]);for(let{name:o,reference:a}of r){let n=e.get(o);typeof n>"u"&&e.set(o,n=new Set),n.add(a)}return Array.from(e).map(([o,a])=>[o,Array.from(a)])}function owt(t){return hv(t.fallbackPool||[],([e])=>e)}function awt(t){let e=[];for(let[r,o]of hv(t.packageRegistry,([a])=>a===null?"0":`1${a}`)){let a=[];e.push([r,a]);for(let[n,{packageLocation:u,packageDependencies:A,packagePeers:p,linkType:h,discardFromLookup:E}]of hv(o,([w])=>w===null?"0":`1${w}`)){let w=[];r!==null&&n!==null&&!A.has(r)&&w.push([r,n]);for(let[C,T]of hv(A.entries(),([N])=>N))w.push([C,T]);let D=p&&p.size>0?Array.from(p):void 0,b=E||void 0;a.push([n,{packageLocation:u,packageDependencies:w,packagePeers:D,linkType:h,discardFromLookup:b}])}}return e}function gv(t){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost."],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:swt(t),fallbackPool:owt(t),packageRegistryData:awt(t)}}var o1e=et(s1e());function a1e(t,e){return[t?`${t} -`:"",`/* eslint-disable */ -`,`// @ts-nocheck -`,`"use strict"; -`,` -`,e,` -`,(0,o1e.default)()].join("")}function lwt(t){return JSON.stringify(t,null,2)}function cwt(t){return`'${t.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ -`)}'`}function uwt(t){return[`const RAW_RUNTIME_STATE = -`,`${cwt(n1e(t))}; - -`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { -`,` return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname}); -`,`} -`].join("")}function Awt(){return[`function $$SETUP_STATE(hydrateRuntimeState, basePath) { -`,` const fs = require('fs'); -`,` const path = require('path'); -`,` const pnpDataFilepath = path.resolve(__dirname, ${JSON.stringify(mr.pnpData)}); -`,` return hydrateRuntimeState(JSON.parse(fs.readFileSync(pnpDataFilepath, 'utf8')), {basePath: basePath || __dirname}); -`,`} -`].join("")}function l1e(t){let e=gv(t),r=uwt(e);return a1e(t.shebang,r)}function c1e(t){let e=gv(t),r=Awt(),o=a1e(t.shebang,r);return{dataFile:lwt(e),loaderFile:o}}St();function Sj(t,{basePath:e}){let r=Ae.toPortablePath(e),o=V.resolve(r),a=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,n=new Map,u=new Map(t.packageRegistryData.map(([w,D])=>[w,new Map(D.map(([b,C])=>{if(w===null!=(b===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let T=C.discardFromLookup??!1,N={name:w,reference:b},U=n.get(C.packageLocation);U?(U.discardFromLookup=U.discardFromLookup&&T,T||(U.locator=N)):n.set(C.packageLocation,{locator:N,discardFromLookup:T});let J=null;return[b,{packageDependencies:new Map(C.packageDependencies),packagePeers:new Set(C.packagePeers),linkType:C.linkType,discardFromLookup:T,get packageLocation(){return J||(J=V.join(o,C.packageLocation))}}]}))])),A=new Map(t.fallbackExclusionList.map(([w,D])=>[w,new Set(D)])),p=new Map(t.fallbackPool),h=t.dependencyTreeRoots,E=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:h,enableTopLevelFallback:E,fallbackExclusionList:A,fallbackPool:p,ignorePattern:a,packageLocatorsByLocations:n,packageRegistry:u}}St();St();var tp=ve("module"),fd=ve("url"),Nj=ve("util");var Qo=ve("url");var p1e=et(ve("assert"));var Pj=Array.isArray,dv=JSON.stringify,mv=Object.getOwnPropertyNames,Ad=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),xj=(t,e)=>RegExp.prototype.exec.call(t,e),bj=(t,...e)=>RegExp.prototype[Symbol.replace].apply(t,e),Gh=(t,...e)=>String.prototype.endsWith.apply(t,e),kj=(t,...e)=>String.prototype.includes.apply(t,e),Qj=(t,...e)=>String.prototype.lastIndexOf.apply(t,e),yv=(t,...e)=>String.prototype.indexOf.apply(t,e),u1e=(t,...e)=>String.prototype.replace.apply(t,e),Wh=(t,...e)=>String.prototype.slice.apply(t,e),EA=(t,...e)=>String.prototype.startsWith.apply(t,e),A1e=Map,f1e=JSON.parse;function Ev(t,e,r){return class extends r{constructor(...o){super(e(...o)),this.code=t,this.name=`${r.name} [${t}]`}}}var h1e=Ev("ERR_PACKAGE_IMPORT_NOT_DEFINED",(t,e,r)=>`Package import specifier "${t}" is not defined${e?` in package ${e}package.json`:""} imported from ${r}`,TypeError),Fj=Ev("ERR_INVALID_MODULE_SPECIFIER",(t,e,r=void 0)=>`Invalid module "${t}" ${e}${r?` imported from ${r}`:""}`,TypeError),g1e=Ev("ERR_INVALID_PACKAGE_TARGET",(t,e,r,o=!1,a=void 0)=>{let n=typeof r=="string"&&!o&&r.length&&!EA(r,"./");return e==="."?((0,p1e.default)(o===!1),`Invalid "exports" main target ${dv(r)} defined in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`):`Invalid "${o?"imports":"exports"}" target ${dv(r)} defined for '${e}' in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`},Error),Cv=Ev("ERR_INVALID_PACKAGE_CONFIG",(t,e,r)=>`Invalid package config ${t}${e?` while importing ${e}`:""}${r?`. ${r}`:""}`,Error),d1e=Ev("ERR_PACKAGE_PATH_NOT_EXPORTED",(t,e,r=void 0)=>e==="."?`No "exports" main defined in ${t}package.json${r?` imported from ${r}`:""}`:`Package subpath '${e}' is not defined by "exports" in ${t}package.json${r?` imported from ${r}`:""}`,Error);var XQ=ve("url");function m1e(t,e){let r=Object.create(null);for(let o=0;oe):t+e}Iv(r,t,o,u,a)}xj(E1e,Wh(t,2))!==null&&Iv(r,t,o,u,a);let p=new URL(t,o),h=p.pathname,E=new URL(".",o).pathname;if(EA(h,E)||Iv(r,t,o,u,a),e==="")return p;if(xj(E1e,e)!==null){let w=n?u1e(r,"*",()=>e):r+e;hwt(w,o,u,a)}return n?new URL(bj(C1e,p.href,()=>e)):new URL(e,p)}function dwt(t){let e=+t;return`${e}`!==t?!1:e>=0&&e<4294967295}function kC(t,e,r,o,a,n,u,A){if(typeof e=="string")return gwt(e,r,o,t,a,n,u,A);if(Pj(e)){if(e.length===0)return null;let p;for(let h=0;hn?-1:n>a||r===-1?1:o===-1||t.length>e.length?-1:e.length>t.length?1:0}function mwt(t,e,r){if(typeof t=="string"||Pj(t))return!0;if(typeof t!="object"||t===null)return!1;let o=mv(t),a=!1,n=0;for(let u=0;u=h.length&&Gh(e,w)&&w1e(n,h)===1&&Qj(h,"*")===E&&(n=h,u=Wh(e,E,e.length-w.length))}}if(n){let p=r[n],h=kC(t,p,u,n,o,!0,!1,a);return h==null&&Rj(e,t,o),h}Rj(e,t,o)}function v1e({name:t,base:e,conditions:r,readFileSyncFn:o}){if(t==="#"||EA(t,"#/")||Gh(t,"/")){let u="is not a valid internal imports specifier name";throw new Fj(t,u,(0,Qo.fileURLToPath)(e))}let a,n=y1e(e,o);if(n.exists){a=(0,Qo.pathToFileURL)(n.pjsonPath);let u=n.imports;if(u)if(Ad(u,t)&&!kj(t,"*")){let A=kC(a,u[t],"",t,e,!1,!0,r);if(A!=null)return A}else{let A="",p,h=mv(u);for(let E=0;E=w.length&&Gh(t,b)&&w1e(A,w)===1&&Qj(w,"*")===D&&(A=w,p=Wh(t,D,t.length-b.length))}}if(A){let E=u[A],w=kC(a,E,p,A,e,!0,!0,r);if(w!=null)return w}}}pwt(t,a,e)}St();var Ewt=new Set(["BUILTIN_NODE_RESOLUTION_FAILED","MISSING_DEPENDENCY","MISSING_PEER_DEPENDENCY","QUALIFIED_PATH_RESOLUTION_FAILED","UNDECLARED_DEPENDENCY"]);function ts(t,e,r={},o){o??=Ewt.has(t)?"MODULE_NOT_FOUND":t;let a={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:{...a,value:o},pnpCode:{...a,value:t},data:{...a,value:r}})}function pu(t){return Ae.normalize(Ae.fromPortablePath(t))}var x1e=et(S1e());function b1e(t){return Cwt(),Lj[t]}var Lj;function Cwt(){Lj||(Lj={"--conditions":[],...P1e(Iwt()),...P1e(process.execArgv)})}function P1e(t){return(0,x1e.default)({"--conditions":[String],"-C":"--conditions"},{argv:t,permissive:!0})}function Iwt(){let t=[],e=wwt(process.env.NODE_OPTIONS||"",t);return t.length,e}function wwt(t,e){let r=[],o=!1,a=!0;for(let n=0;nparseInt(t,10)),k1e=Ha>19||Ha===19&&ep>=2||Ha===18&&ep>=13,tzt=Ha===20&&ep<6||Ha===19&&ep>=3,rzt=Ha>19||Ha===19&&ep>=6,nzt=Ha>=21||Ha===20&&ep>=10||Ha===18&&ep>=19,izt=Ha>=21||Ha===20&&ep>=10||Ha===18&&ep>=20,szt=Ha>=22;function Q1e(t){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(t=t.map(e=>Ae.fromPortablePath(qs.resolveVirtual(Ae.toPortablePath(e)))),k1e)process.send({"watch:require":t});else for(let e of t)process.send({"watch:require":e})}function Oj(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,o=Number(process.env.PNP_DEBUG_LEVEL),a=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,n=/^(\/|\.{1,2}(\/|$))/,u=/\/$/,A=/^\.{0,2}\//,p={name:null,reference:null},h=[],E=new Set;if(t.enableTopLevelFallback===!0&&h.push(p),e.compatibilityMode!==!1)for(let Le of["react-scripts","gatsby"]){let Te=t.packageRegistry.get(Le);if(Te)for(let ke of Te.keys()){if(ke===null)throw new Error("Assertion failed: This reference shouldn't be null");h.push({name:Le,reference:ke})}}let{ignorePattern:w,packageRegistry:D,packageLocatorsByLocations:b}=t;function C(Le,Te){return{fn:Le,args:Te,error:null,result:null}}function T(Le){let Te=process.stderr?.hasColors?.()??process.stdout.isTTY,ke=(tt,He)=>`\x1B[${tt}m${He}\x1B[0m`,Ke=Le.error;console.error(Ke?ke("31;1",`\u2716 ${Le.error?.message.replace(/\n.*/s,"")}`):ke("33;1","\u203C Resolution")),Le.args.length>0&&console.error();for(let tt of Le.args)console.error(` ${ke("37;1","In \u2190")} ${(0,Nj.inspect)(tt,{colors:Te,compact:!0})}`);Le.result&&(console.error(),console.error(` ${ke("37;1","Out \u2192")} ${(0,Nj.inspect)(Le.result,{colors:Te,compact:!0})}`));let xe=new Error().stack.match(/(?<=^ +)at.*/gm)?.slice(2)??[];if(xe.length>0){console.error();for(let tt of xe)console.error(` ${ke("38;5;244",tt)}`)}console.error()}function N(Le,Te){if(e.allowDebug===!1)return Te;if(Number.isFinite(o)){if(o>=2)return(...ke)=>{let Ke=C(Le,ke);try{return Ke.result=Te(...ke)}catch(xe){throw Ke.error=xe}finally{T(Ke)}};if(o>=1)return(...ke)=>{try{return Te(...ke)}catch(Ke){let xe=C(Le,ke);throw xe.error=Ke,T(xe),Ke}}}return Te}function U(Le){let Te=g(Le);if(!Te)throw ts("INTERNAL","Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return Te}function J(Le){if(Le.name===null)return!0;for(let Te of t.dependencyTreeRoots)if(Te.name===Le.name&&Te.reference===Le.reference)return!0;return!1}let te=new Set(["node","require",...b1e("--conditions")]);function le(Le,Te=te,ke){let Ke=fe(V.join(Le,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(Ke===null)throw ts("INTERNAL",`The locator that owns the "${Le}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:xe}=U(Ke),tt=V.join(xe,mr.manifest);if(!e.fakeFs.existsSync(tt))return null;let He=JSON.parse(e.fakeFs.readFileSync(tt,"utf8"));if(He.exports==null)return null;let x=V.contains(xe,Le);if(x===null)throw ts("INTERNAL","unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");x!=="."&&!A.test(x)&&(x=`./${x}`);try{let I=B1e({packageJSONUrl:(0,fd.pathToFileURL)(Ae.fromPortablePath(tt)),packageSubpath:x,exports:He.exports,base:ke?(0,fd.pathToFileURL)(Ae.fromPortablePath(ke)):null,conditions:Te});return Ae.toPortablePath((0,fd.fileURLToPath)(I))}catch(I){throw ts("EXPORTS_RESOLUTION_FAILED",I.message,{unqualifiedPath:pu(Le),locator:Ke,pkgJson:He,subpath:pu(x),conditions:Te},I.code)}}function ce(Le,Te,{extensions:ke}){let Ke;try{Te.push(Le),Ke=e.fakeFs.statSync(Le)}catch{}if(Ke&&!Ke.isDirectory())return e.fakeFs.realpathSync(Le);if(Ke&&Ke.isDirectory()){let xe;try{xe=JSON.parse(e.fakeFs.readFileSync(V.join(Le,mr.manifest),"utf8"))}catch{}let tt;if(xe&&xe.main&&(tt=V.resolve(Le,xe.main)),tt&&tt!==Le){let He=ce(tt,Te,{extensions:ke});if(He!==null)return He}}for(let xe=0,tt=ke.length;xe{let x=JSON.stringify(He.name);if(Ke.has(x))return;Ke.add(x);let I=me(He);for(let P of I)if(U(P).packagePeers.has(Le))xe(P);else{let R=ke.get(P.name);typeof R>"u"&&ke.set(P.name,R=new Set),R.add(P.reference)}};xe(Te);let tt=[];for(let He of[...ke.keys()].sort())for(let x of[...ke.get(He)].sort())tt.push({name:He,reference:x});return tt}function fe(Le,{resolveIgnored:Te=!1,includeDiscardFromLookup:ke=!1}={}){if(he(Le)&&!Te)return null;let Ke=V.relative(t.basePath,Le);Ke.match(n)||(Ke=`./${Ke}`),Ke.endsWith("/")||(Ke=`${Ke}/`);do{let xe=b.get(Ke);if(typeof xe>"u"||xe.discardFromLookup&&!ke){Ke=Ke.substring(0,Ke.lastIndexOf("/",Ke.length-2)+1);continue}return xe.locator}while(Ke!=="");return null}function ie(Le){try{return e.fakeFs.readFileSync(Ae.toPortablePath(Le),"utf8")}catch(Te){if(Te.code==="ENOENT")return;throw Te}}function Z(Le,Te,{considerBuiltins:ke=!0}={}){if(Le.startsWith("#"))throw new Error("resolveToUnqualified can not handle private import mappings");if(Le==="pnpapi")return Ae.toPortablePath(e.pnpapiResolution);if(ke&&(0,tp.isBuiltin)(Le))return null;let Ke=pu(Le),xe=Te&&pu(Te);if(Te&&he(Te)&&(!V.isAbsolute(Le)||fe(Le)===null)){let x=Ie(Le,Te);if(x===!1)throw ts("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) - -Require request: "${Ke}" -Required by: ${xe} -`,{request:Ke,issuer:xe});return Ae.toPortablePath(x)}let tt,He=Le.match(a);if(He){if(!Te)throw ts("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:Ke,issuer:xe});let[,x,I]=He,P=fe(Te);if(!P){let Fe=Ie(Le,Te);if(Fe===!1)throw ts("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). - -Require path: "${Ke}" -Required by: ${xe} -`,{request:Ke,issuer:xe});return Ae.toPortablePath(Fe)}let R=U(P).packageDependencies.get(x),z=null;if(R==null&&P.name!==null){let Fe=t.fallbackExclusionList.get(P.name);if(!Fe||!Fe.has(P.reference)){for(let Et=0,qt=h.length;EtJ(lt))?X=ts("MISSING_PEER_DEPENDENCY",`${P.name} tried to access ${x} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${P.name}@${P.reference} (via ${xe}) -${Fe.map(lt=>`Ancestor breaking the chain: ${lt.name}@${lt.reference} -`).join("")} -`,{request:Ke,issuer:xe,issuerLocator:Object.assign({},P),dependencyName:x,brokenAncestors:Fe}):X=ts("MISSING_PEER_DEPENDENCY",`${P.name} tried to access ${x} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${P.name}@${P.reference} (via ${xe}) - -${Fe.map(lt=>`Ancestor breaking the chain: ${lt.name}@${lt.reference} -`).join("")} -`,{request:Ke,issuer:xe,issuerLocator:Object.assign({},P),dependencyName:x,brokenAncestors:Fe})}else R===void 0&&(!ke&&(0,tp.isBuiltin)(Le)?J(P)?X=ts("UNDECLARED_DEPENDENCY",`Your application tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${xe} -`,{request:Ke,issuer:xe,dependencyName:x}):X=ts("UNDECLARED_DEPENDENCY",`${P.name} tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in ${P.name}'s dependencies, this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${xe} -`,{request:Ke,issuer:xe,issuerLocator:Object.assign({},P),dependencyName:x}):J(P)?X=ts("UNDECLARED_DEPENDENCY",`Your application tried to access ${x}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${xe} -`,{request:Ke,issuer:xe,dependencyName:x}):X=ts("UNDECLARED_DEPENDENCY",`${P.name} tried to access ${x}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${P.name}@${P.reference} (via ${xe}) -`,{request:Ke,issuer:xe,issuerLocator:Object.assign({},P),dependencyName:x}));if(R==null){if(z===null||X===null)throw X||new Error("Assertion failed: Expected an error to have been set");R=z;let Fe=X.message.replace(/\n.*/g,"");X.message=Fe,!E.has(Fe)&&o!==0&&(E.add(Fe),process.emitWarning(X))}let $=Array.isArray(R)?{name:R[0],reference:R[1]}:{name:x,reference:R},se=U($);if(!se.packageLocation)throw ts("MISSING_DEPENDENCY",`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. - -Required package: ${$.name}@${$.reference}${$.name!==Ke?` (via "${Ke}")`:""} -Required by: ${P.name}@${P.reference} (via ${xe}) -`,{request:Ke,issuer:xe,dependencyLocator:Object.assign({},$)});let be=se.packageLocation;I?tt=V.join(be,I):tt=be}else if(V.isAbsolute(Le))tt=V.normalize(Le);else{if(!Te)throw ts("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:Ke,issuer:xe});let x=V.resolve(Te);Te.match(u)?tt=V.normalize(V.join(x,Le)):tt=V.normalize(V.join(V.dirname(x),Le))}return V.normalize(tt)}function Se(Le,Te,ke=te,Ke){if(n.test(Le))return Te;let xe=le(Te,ke,Ke);return xe?V.normalize(xe):Te}function Re(Le,{extensions:Te=Object.keys(tp.Module._extensions)}={}){let ke=[],Ke=ce(Le,ke,{extensions:Te});if(Ke)return V.normalize(Ke);{Q1e(ke.map(He=>Ae.fromPortablePath(He)));let xe=pu(Le),tt=fe(Le);if(tt){let{packageLocation:He}=U(tt),x=!0;try{e.fakeFs.accessSync(He)}catch(I){if(I?.code==="ENOENT")x=!1;else{let P=(I?.message??I??"empty exception thrown").replace(/^[A-Z]/,y=>y.toLowerCase());throw ts("QUALIFIED_PATH_RESOLUTION_FAILED",`Required package exists but could not be accessed (${P}). - -Missing package: ${tt.name}@${tt.reference} -Expected package location: ${pu(He)} -`,{unqualifiedPath:xe,extensions:Te})}}if(!x){let I=He.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw ts("QUALIFIED_PATH_RESOLUTION_FAILED",`${I} - -Missing package: ${tt.name}@${tt.reference} -Expected package location: ${pu(He)} -`,{unqualifiedPath:xe,extensions:Te})}}throw ts("QUALIFIED_PATH_RESOLUTION_FAILED",`Qualified path resolution failed: we looked for the following paths, but none could be accessed. - -Source path: ${xe} -${ke.map(He=>`Not found: ${pu(He)} -`).join("")}`,{unqualifiedPath:xe,extensions:Te})}}function ht(Le,Te,ke){if(!Te)throw new Error("Assertion failed: An issuer is required to resolve private import mappings");let Ke=v1e({name:Le,base:(0,fd.pathToFileURL)(Ae.fromPortablePath(Te)),conditions:ke.conditions??te,readFileSyncFn:ie});if(Ke instanceof URL)return Re(Ae.toPortablePath((0,fd.fileURLToPath)(Ke)),{extensions:ke.extensions});if(Ke.startsWith("#"))throw new Error("Mapping from one private import to another isn't allowed");return q(Ke,Te,ke)}function q(Le,Te,ke={}){try{if(Le.startsWith("#"))return ht(Le,Te,ke);let{considerBuiltins:Ke,extensions:xe,conditions:tt}=ke,He=Z(Le,Te,{considerBuiltins:Ke});if(Le==="pnpapi")return He;if(He===null)return null;let x=()=>Te!==null?he(Te):!1,I=(!Ke||!(0,tp.isBuiltin)(Le))&&!x()?Se(Le,He,tt,Te):He;return Re(I,{extensions:xe})}catch(Ke){throw Object.hasOwn(Ke,"pnpCode")&&Object.assign(Ke.data,{request:pu(Le),issuer:Te&&pu(Te)}),Ke}}function nt(Le){let Te=V.normalize(Le),ke=qs.resolveVirtual(Te);return ke!==Te?ke:null}return{VERSIONS:De,topLevel:Ee,getLocator:(Le,Te)=>Array.isArray(Te)?{name:Te[0],reference:Te[1]}:{name:Le,reference:Te},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let Le=[];for(let[Te,ke]of D)for(let Ke of ke.keys())Te!==null&&Ke!==null&&Le.push({name:Te,reference:Ke});return Le},getPackageInformation:Le=>{let Te=g(Le);if(Te===null)return null;let ke=Ae.fromPortablePath(Te.packageLocation);return{...Te,packageLocation:ke}},findPackageLocator:Le=>fe(Ae.toPortablePath(Le)),resolveToUnqualified:N("resolveToUnqualified",(Le,Te,ke)=>{let Ke=Te!==null?Ae.toPortablePath(Te):null,xe=Z(Ae.toPortablePath(Le),Ke,ke);return xe===null?null:Ae.fromPortablePath(xe)}),resolveUnqualified:N("resolveUnqualified",(Le,Te)=>Ae.fromPortablePath(Re(Ae.toPortablePath(Le),Te))),resolveRequest:N("resolveRequest",(Le,Te,ke)=>{let Ke=Te!==null?Ae.toPortablePath(Te):null,xe=q(Ae.toPortablePath(Le),Ke,ke);return xe===null?null:Ae.fromPortablePath(xe)}),resolveVirtual:N("resolveVirtual",Le=>{let Te=nt(Ae.toPortablePath(Le));return Te!==null?Ae.fromPortablePath(Te):null})}}St();var F1e=(t,e,r)=>{let o=gv(t),a=Sj(o,{basePath:e}),n=Ae.join(e,mr.pnpCjs);return Oj(a,{fakeFs:r,pnpapiResolution:n})};var Uj=et(T1e());Gt();var CA={};Vt(CA,{checkManifestCompatibility:()=>L1e,extractBuildRequest:()=>ZQ,getExtractHint:()=>_j,hasBindingGyp:()=>Hj});Ve();St();function L1e(t){return G.isPackageCompatible(t,Xi.getArchitectureSet())}function ZQ(t,e,r,{configuration:o}){let a=[];for(let n of["preinstall","install","postinstall"])e.manifest.scripts.has(n)&&a.push({type:0,script:n});return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&a.push({type:1,script:"node-gyp rebuild"}),a.length===0?null:t.linkType!=="HARD"?{skipped:!0,explain:n=>n.reportWarningOnce(6,`${G.prettyLocator(o,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`)}:r&&r.built===!1?{skipped:!0,explain:n=>n.reportInfoOnce(5,`${G.prettyLocator(o,t)} lists build scripts, but its build has been explicitly disabled through configuration.`)}:!o.get("enableScripts")&&!r.built?{skipped:!0,explain:n=>n.reportWarningOnce(4,`${G.prettyLocator(o,t)} lists build scripts, but all build scripts have been disabled.`)}:L1e(t)?{skipped:!1,directives:a}:{skipped:!0,explain:n=>n.reportWarningOnce(76,`${G.prettyLocator(o,t)} The ${Xi.getArchitectureName()} architecture is incompatible with this package, build skipped.`)}}var vwt=new Set([".exe",".bin",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function _j(t){return t.packageFs.getExtractHint({relevantExtensions:vwt})}function Hj(t){let e=V.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var vv={};Vt(vv,{getUnpluggedPath:()=>Bv});Ve();St();function Bv(t,{configuration:e}){return V.resolve(e.get("pnpUnpluggedFolder"),G.slugifyLocator(t))}var Dwt=new Set([G.makeIdent(null,"open").identHash,G.makeIdent(null,"opn").identHash]),Yh=class{constructor(){this.mode="strict";this.pnpCache=new Map}getCustomDataKey(){return JSON.stringify({name:"PnpLinker",version:2})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let o=Vh(r.project).cjs;if(!ae.existsSync(o))throw new it(`The project in ${pe.pretty(r.project.configuration,`${r.project.cwd}/package.json`,pe.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let a=qe.getFactoryWithDefault(this.pnpCache,o,()=>qe.dynamicRequire(o,{cachingStrategy:qe.CachingStrategy.FsTime})),n={name:G.stringifyIdent(e),reference:e.reference},u=a.getPackageInformation(n);if(!u)throw new it(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return Ae.toPortablePath(u.packageLocation)}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=Vh(r.project).cjs;if(!ae.existsSync(o))return null;let n=qe.getFactoryWithDefault(this.pnpCache,o,()=>qe.dynamicRequire(o,{cachingStrategy:qe.CachingStrategy.FsTime})).findPackageLocator(Ae.fromPortablePath(e));return n?G.makeLocator(G.parseIdent(n.name),n.reference):null}makeInstaller(e){return new pd(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},pd=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new qe.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}attachCustomData(e){this.customData=e}async installPackage(e,r,o){let a=G.stringifyIdent(e),n=e.reference,u=!!this.opts.project.tryWorkspaceByLocator(e),A=G.isVirtualLocator(e),p=e.peerDependencies.size>0&&!A,h=!p&&!u,E=!p&&e.linkType!=="SOFT",w,D;if(h||E){let te=A?G.devirtualizeLocator(e):e;w=this.customData.store.get(te.locatorHash),typeof w>"u"&&(w=await Swt(r),e.linkType==="HARD"&&this.customData.store.set(te.locatorHash,w)),w.manifest.type==="module"&&(this.isESMLoaderRequired=!0),D=this.opts.project.getDependencyMeta(te,e.version)}let b=h?ZQ(e,w,D,{configuration:this.opts.project.configuration}):null,C=E?await this.unplugPackageIfNeeded(e,w,r,D,o):r.packageFs;if(V.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let T=V.resolve(C.getRealPath(),r.prefixPath),N=qj(this.opts.project.cwd,T),U=new Map,J=new Set;if(A){for(let te of e.peerDependencies.values())U.set(G.stringifyIdent(te),null),J.add(G.stringifyIdent(te));if(!u){let te=G.devirtualizeLocator(e);this.virtualTemplates.set(te.locatorHash,{location:qj(this.opts.project.cwd,qs.resolveVirtual(T)),locator:te})}}return qe.getMapWithDefault(this.packageRegistry,a).set(n,{packageLocation:N,packageDependencies:U,packagePeers:J,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:T,buildRequest:b}}async attachInternalDependencies(e,r){let o=this.getPackageInformation(e);for(let[a,n]of r){let u=G.areIdentsEqual(a,n)?n.reference:[G.stringifyIdent(n),n.reference];o.packageDependencies.set(G.stringifyIdent(a),u)}}async attachExternalDependents(e,r){for(let o of r)this.getDiskInformation(o).packageDependencies.set(G.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=Vh(this.opts.project);if(this.isEsmEnabled()||await ae.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await ae.removePromise(e.cjs),await ae.removePromise(e.data),await ae.removePromise(e.esmLoader),await ae.removePromise(this.opts.project.configuration.get("pnpUnpluggedFolder"));return}for(let{locator:E,location:w}of this.virtualTemplates.values())qe.getMapWithDefault(this.packageRegistry,G.stringifyIdent(E)).set(E.reference,{packageLocation:w,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get("pnpFallbackMode"),o=this.opts.project.workspaces.map(({anchoredLocator:E})=>({name:G.stringifyIdent(E),reference:E.reference})),a=r!=="none",n=[],u=new Map,A=qe.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),p=this.packageRegistry,h=this.opts.project.configuration.get("pnpShebang");if(r==="dependencies-only")for(let E of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(E)&&n.push({name:G.stringifyIdent(E),reference:E.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:o,enableTopLevelFallback:a,fallbackExclusionList:n,fallbackPool:u,ignorePattern:A,packageRegistry:p,shebang:h}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let r=Vh(this.opts.project),o=await this.locateNodeModules(e.ignorePattern);if(o.length>0){this.opts.report.reportWarning(31,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let n of o)await ae.removePromise(n)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let n=l1e(e);await ae.changeFilePromise(r.cjs,n,{automaticNewlines:!0,mode:493}),await ae.removePromise(r.data)}else{let{dataFile:n,loaderFile:u}=c1e(e);await ae.changeFilePromise(r.cjs,u,{automaticNewlines:!0,mode:493}),await ae.changeFilePromise(r.data,n,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(0,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await ae.changeFilePromise(r.esmLoader,(0,Uj.default)(),{automaticNewlines:!0,mode:420}));let a=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await ae.removePromise(a);else for(let n of await ae.readdirPromise(a)){let u=V.resolve(a,n);this.unpluggedPaths.has(u)||await ae.removePromise(u)}}async locateNodeModules(e){let r=[],o=e?new RegExp(e):null;for(let a of this.opts.project.workspaces){let n=V.join(a.cwd,"node_modules");if(o&&o.test(V.relative(this.opts.project.cwd,a.cwd))||!ae.existsSync(n))continue;let u=await ae.readdirPromise(n,{withFileTypes:!0}),A=u.filter(p=>!p.isDirectory()||p.name===".bin"||!p.name.startsWith("."));if(A.length===u.length)r.push(n);else for(let p of A)r.push(V.join(n,p.name))}return r}async unplugPackageIfNeeded(e,r,o,a,n){return this.shouldBeUnplugged(e,r,a)?this.unplugPackage(e,o,n):o.packageFs}shouldBeUnplugged(e,r,o){return typeof o.unplugged<"u"?o.unplugged:Dwt.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(ZQ(e,r,o,{configuration:this.opts.project.configuration})?.skipped===!1||r.misc.extractHint)}async unplugPackage(e,r,o){let a=Bv(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new ju(a,{baseFs:r.packageFs,pathUtils:V}):(this.unpluggedPaths.add(a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let n=V.join(a,r.prefixPath,".ready");await ae.existsPromise(n)||(this.opts.project.storedBuildState.delete(e.locatorHash),await ae.mkdirPromise(a,{recursive:!0}),await ae.copyPromise(a,Bt.dot,{baseFs:r.packageFs,overwrite:!1}),await ae.writeFilePromise(n,""))})),new En(a))}getPackageInformation(e){let r=G.stringifyIdent(e),o=e.reference,a=this.packageRegistry.get(r);if(!a)throw new Error(`Assertion failed: The package information store should have been available (for ${G.prettyIdent(this.opts.project.configuration,e)})`);let n=a.get(o);if(!n)throw new Error(`Assertion failed: The package information should have been available (for ${G.prettyLocator(this.opts.project.configuration,e)})`);return n}getDiskInformation(e){let r=qe.getMapWithDefault(this.packageRegistry,"@@disk"),o=qj(this.opts.project.cwd,e);return qe.getFactoryWithDefault(r,o,()=>({packageLocation:o,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1}))}};function qj(t,e){let r=V.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function Swt(t){let e=await _t.tryFind(t.prefixPath,{baseFs:t.packageFs})??new _t,r=new Set(["preinstall","install","postinstall"]);for(let o of e.scripts.keys())r.has(o)||e.scripts.delete(o);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:_j(t),hasBindingGyp:Hj(t)}}}Ve();Ve();Gt();var N1e=et(Xo());var QC=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=de.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=de.Rest()}static{this.paths=[["unplug"]]}static{this.usage=ot.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);if(r.get("nodeLinker")!=="pnp")throw new it("This command can only be used if the `nodeLinker` option is set to `pnp`");await o.restoreInstallState();let u=new Set(this.patterns),A=this.patterns.map(b=>{let C=G.parseDescriptor(b),T=C.range!=="unknown"?C:G.makeDescriptor(C,"*");if(!Ur.validRange(T.range))throw new it(`The range of the descriptor patterns must be a valid semver range (${G.prettyDescriptor(r,T)})`);return N=>{let U=G.stringifyIdent(N);return!N1e.default.isMatch(U,G.stringifyIdent(T))||N.version&&!Ur.satisfiesWithPrereleases(N.version,T.range)?!1:(u.delete(b),!0)}}),p=()=>{let b=[];for(let C of o.storedPackages.values())!o.tryWorkspaceByLocator(C)&&!G.isVirtualLocator(C)&&A.some(T=>T(C))&&b.push(C);return b},h=b=>{let C=new Set,T=[],N=(U,J)=>{if(C.has(U.locatorHash))return;let te=!!o.tryWorkspaceByLocator(U);if(!(J>0&&!this.recursive&&te)&&(C.add(U.locatorHash),!o.tryWorkspaceByLocator(U)&&A.some(le=>le(U))&&T.push(U),!(J>0&&!this.recursive)))for(let le of U.dependencies.values()){let ce=o.storedResolutions.get(le.descriptorHash);if(!ce)throw new Error("Assertion failed: The resolution should have been registered");let ue=o.storedPackages.get(ce);if(!ue)throw new Error("Assertion failed: The package should have been registered");N(ue,J+1)}};for(let U of b)N(U.anchoredPackage,0);return T},E,w;if(this.all&&this.recursive?(E=p(),w="the project"):this.all?(E=h(o.workspaces),w="any workspace"):(E=h([a]),w="this workspace"),u.size>1)throw new it(`Patterns ${pe.prettyList(r,u,pe.Type.CODE)} don't match any packages referenced by ${w}`);if(u.size>0)throw new it(`Pattern ${pe.prettyList(r,u,pe.Type.CODE)} doesn't match any packages referenced by ${w}`);E=qe.sortMap(E,b=>G.stringifyLocator(b));let D=await Lt.start({configuration:r,stdout:this.context.stdout,json:this.json},async b=>{for(let C of E){let T=C.version??"unknown",N=o.topLevelWorkspace.manifest.ensureDependencyMeta(G.makeDescriptor(C,T));N.unplugged=!0,b.reportInfo(0,`Will unpack ${G.prettyLocator(r,C)} to ${pe.pretty(r,Bv(C,{configuration:r}),pe.Type.PATH)}`),b.reportJson({locator:G.stringifyLocator(C),version:T})}await o.topLevelWorkspace.persistManifest(),this.json||b.reportSeparator()});return D.hasErrors()?D.exitCode():await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};var Vh=t=>({cjs:V.join(t.cwd,mr.pnpCjs),data:V.join(t.cwd,mr.pnpData),esmLoader:V.join(t.cwd,mr.pnpEsmLoader)}),M1e=t=>/\s/.test(t)?JSON.stringify(t):t;async function Pwt(t,e,r){let o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/,n=(e.NODE_OPTIONS??"").replace(o," ").replace(a," ").trim();if(t.configuration.get("nodeLinker")!=="pnp"){e.NODE_OPTIONS=n||void 0;return}let u=Vh(t),A=`--require ${M1e(Ae.fromPortablePath(u.cjs))}`;ae.existsSync(u.esmLoader)&&(A=`${A} --experimental-loader ${(0,O1e.pathToFileURL)(Ae.fromPortablePath(u.esmLoader)).href}`),ae.existsSync(u.cjs)&&(e.NODE_OPTIONS=n?`${A} ${n}`:A)}async function xwt(t,e){let r=Vh(t);e(r.cjs),e(r.data),e(r.esmLoader),e(t.configuration.get("pnpUnpluggedFolder"))}var bwt={hooks:{populateYarnPaths:xwt,setupScriptEnvironment:Pwt},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "pnpm", or "node-modules"',type:"STRING",default:"pnp"},winLinkType:{description:"Whether Yarn should use Windows Junctions or symlinks when creating links on Windows.",type:"STRING",values:["junctions","symlinks"],default:"junctions"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:"STRING",default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:"STRING",default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:"STRING",default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:"BOOLEAN",default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:"BOOLEAN",default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:"STRING",default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:"ABSOLUTE_PATH",default:"./.yarn/unplugged"}},linkers:[Yh],commands:[QC]},kwt=bwt;var Y1e=et(j1e());Gt();var zj=et(ve("crypto")),V1e=et(ve("fs")),K1e=1,xi="node_modules",$Q=".bin",J1e=".yarn-state.yml",Vwt=1e3,Xj=(o=>(o.CLASSIC="classic",o.HARDLINKS_LOCAL="hardlinks-local",o.HARDLINKS_GLOBAL="hardlinks-global",o))(Xj||{}),Dv=class{constructor(){this.installStateCache=new Map}getCustomDataKey(){return JSON.stringify({name:"NodeModulesLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let o=r.project.tryWorkspaceByLocator(e);if(o)return o.cwd;let a=await qe.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await Jj(r.project,{unrollAliases:!0}));if(a===null)throw new it("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let n=a.locatorMap.get(G.stringifyLocator(e));if(!n){let p=new it(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw p.code="LOCATOR_NOT_INSTALLED",p}let u=n.locations.sort((p,h)=>p.split(V.sep).length-h.split(V.sep).length),A=V.join(r.project.configuration.startingCwd,xi);return u.find(p=>V.contains(A,p))||n.locations[0]}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=await qe.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await Jj(r.project,{unrollAliases:!0}));if(o===null)return null;let{locationRoot:a,segments:n}=eF(V.resolve(e),{skipPrefix:r.project.cwd}),u=o.locationTree.get(a);if(!u)return null;let A=u.locator;for(let p of n){if(u=u.children.get(p),!u)break;A=u.locator||A}return G.parseLocator(A)}makeInstaller(e){return new Kj(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},Kj=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}attachCustomData(e){this.customData=e}async installPackage(e,r){let o=V.resolve(r.packageFs.getRealPath(),r.prefixPath),a=this.customData.store.get(e.locatorHash);if(typeof a>"u"&&(a=await Kwt(e,r),e.linkType==="HARD"&&this.customData.store.set(e.locatorHash,a)),!G.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildRequest:null};let n=new Map,u=new Set;n.has(G.stringifyIdent(e))||n.set(G.stringifyIdent(e),e.reference);let A=e;if(G.isVirtualLocator(e)){A=G.devirtualizeLocator(e);for(let E of e.peerDependencies.values())n.set(G.stringifyIdent(E),null),u.add(G.stringifyIdent(E))}let p={packageLocation:`${Ae.fromPortablePath(o)}/`,packageDependencies:n,packagePeers:u,linkType:e.linkType,discardFromLookup:r.discardFromLookup??!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:a,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:p});let h=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(A.locatorHash,h),{packageLocation:o,buildRequest:null}}async attachInternalDependencies(e,r){let o=this.localStore.get(e.locatorHash);if(typeof o>"u")throw new Error("Assertion failed: Expected information object to have been registered");for(let[a,n]of r){let u=G.areIdentsEqual(a,n)?n.reference:[G.stringifyIdent(n),n.reference];o.pnpNode.packageDependencies.set(G.stringifyIdent(a),u)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new qs({baseFs:new iA({maxOpenFiles:80,readOnlyArchives:!0})}),r=await Jj(this.opts.project),o=this.opts.project.configuration.get("nmMode");(r===null||o!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:o,mtimeMs:0});let a=new Map(this.opts.project.workspaces.map(D=>{let b=this.opts.project.configuration.get("nmHoistingLimits");try{b=qe.validateEnum(fv,D.manifest.installConfig?.hoistingLimits??b)}catch{let C=G.prettyWorkspace(this.opts.project.configuration,D);this.opts.report.reportWarning(57,`${C}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(fv).join(", ")}, using default: "${b}"`)}return[D.relativeCwd,b]})),n=new Map(this.opts.project.workspaces.map(D=>{let b=this.opts.project.configuration.get("nmSelfReferences");return b=D.manifest.installConfig?.selfReferences??b,[D.relativeCwd,b]})),u={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(D,b)=>Array.isArray(b)?{name:b[0],reference:b[1]}:{name:D,reference:b},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(D=>{let b=D.anchoredLocator;return{name:G.stringifyIdent(b),reference:b.reference}}),getPackageInformation:D=>{let b=D.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:G.makeLocator(G.parseIdent(D.name),D.reference),C=this.localStore.get(b.locatorHash);if(typeof C>"u")throw new Error("Assertion failed: Expected the package reference to have been registered");return C.pnpNode},findPackageLocator:D=>{let b=this.opts.project.tryWorkspaceByCwd(Ae.toPortablePath(D));if(b!==null){let C=b.anchoredLocator;return{name:G.stringifyIdent(C),reference:C.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:D=>Ae.fromPortablePath(qs.resolveVirtual(Ae.toPortablePath(D)))},{tree:A,errors:p,preserveSymlinksRequired:h}=pv(u,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:a,project:this.opts.project,selfReferencesByCwd:n});if(!A){for(let{messageName:D,text:b}of p)this.opts.report.reportError(D,b);return}let E=vj(A);await e1t(r,E,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async D=>{let b=G.parseLocator(D),C=this.localStore.get(b.locatorHash);if(typeof C>"u")throw new Error("Assertion failed: Expected the slot to exist");return C.customPackageData.manifest}});let w=[];for(let[D,b]of E.entries()){if(Z1e(D))continue;let C=G.parseLocator(D),T=this.localStore.get(C.locatorHash);if(typeof T>"u")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(T.pkg))continue;let N=CA.extractBuildRequest(T.pkg,T.customPackageData,T.dependencyMeta,{configuration:this.opts.project.configuration});N&&w.push({buildLocations:b.locations,locator:C,buildRequest:N})}return h&&this.opts.report.reportWarning(72,`The application uses portals and that's why ${pe.pretty(this.opts.project.configuration,"--preserve-symlinks",pe.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:w}}};async function Kwt(t,e){let r=await _t.tryFind(e.prefixPath,{baseFs:e.packageFs})??new _t,o=new Set(["preinstall","install","postinstall"]);for(let a of r.scripts.keys())o.has(a)||r.scripts.delete(a);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{hasBindingGyp:CA.hasBindingGyp(e)}}}async function Jwt(t,e,r,o,{installChangedByUser:a}){let n="";n+=`# Warning: This file is automatically generated. Removing it is fine, but will -`,n+=`# cause your node_modules installation to become invalidated. -`,n+=` -`,n+=`__metadata: -`,n+=` version: ${K1e} -`,n+=` nmMode: ${o.value} -`;let u=Array.from(e.keys()).sort(),A=G.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let E of u){let w=e.get(E);n+=` -`,n+=`${JSON.stringify(E)}: -`,n+=` locations: -`;for(let D of w.locations){let b=V.contains(t.cwd,D);if(b===null)throw new Error(`Assertion failed: Expected the path to be within the project (${D})`);n+=` - ${JSON.stringify(b)} -`}if(w.aliases.length>0){n+=` aliases: -`;for(let D of w.aliases)n+=` - ${JSON.stringify(D)} -`}if(E===A&&r.size>0){n+=` bin: -`;for(let[D,b]of r){let C=V.contains(t.cwd,D);if(C===null)throw new Error(`Assertion failed: Expected the path to be within the project (${D})`);n+=` ${JSON.stringify(C)}: -`;for(let[T,N]of b){let U=V.relative(V.join(D,xi),N);n+=` ${JSON.stringify(T)}: ${JSON.stringify(U)} -`}}}}let p=t.cwd,h=V.join(p,xi,J1e);a&&await ae.removePromise(h),await ae.changeFilePromise(h,n,{automaticNewlines:!0})}async function Jj(t,{unrollAliases:e=!1}={}){let r=t.cwd,o=V.join(r,xi,J1e),a;try{a=await ae.statPromise(o)}catch{}if(!a)return null;let n=Vi(await ae.readFilePromise(o,"utf8"));if(n.__metadata.version>K1e)return null;let u=n.__metadata.nmMode||"classic",A=new Map,p=new Map;delete n.__metadata;for(let[h,E]of Object.entries(n)){let w=E.locations.map(b=>V.join(r,b)),D=E.bin;if(D)for(let[b,C]of Object.entries(D)){let T=V.join(r,Ae.toPortablePath(b)),N=qe.getMapWithDefault(p,T);for(let[U,J]of Object.entries(C))N.set(U,Ae.toPortablePath([T,xi,J].join(V.sep)))}if(A.set(h,{target:Bt.dot,linkType:"HARD",locations:w,aliases:E.aliases||[]}),e&&E.aliases)for(let b of E.aliases){let{scope:C,name:T}=G.parseLocator(h),N=G.makeLocator(G.makeIdent(C,T),b),U=G.stringifyLocator(N);A.set(U,{target:Bt.dot,linkType:"HARD",locations:w,aliases:[]})}}return{locatorMap:A,binSymlinks:p,locationTree:z1e(A,{skipPrefix:t.cwd}),nmMode:u,mtimeMs:a.mtimeMs}}var RC=async(t,e)=>{if(t.split(V.sep).indexOf(xi)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{let r;if(!e.innerLoop&&(r=await ae.lstatPromise(t),!r.isDirectory()&&!r.isSymbolicLink()||r.isSymbolicLink()&&!e.isWorkspaceDir)){await ae.unlinkPromise(t);return}let o=await ae.readdirPromise(t,{withFileTypes:!0});for(let n of o){let u=V.join(t,n.name);n.isDirectory()?(n.name!==xi||e&&e.innerLoop)&&await RC(u,{innerLoop:!0,contentsOnly:!1}):await ae.unlinkPromise(u)}let a=!e.innerLoop&&e.isWorkspaceDir&&r?.isSymbolicLink();!e.contentsOnly&&!a&&await ae.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},G1e=4,eF=(t,{skipPrefix:e})=>{let r=V.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let o=r.split(V.sep).filter(p=>p!==""),a=o.indexOf(xi),n=o.slice(0,a).join(V.sep),u=V.join(e,n),A=o.slice(a);return{locationRoot:u,segments:A}},z1e=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let o=()=>({children:new Map,linkType:"HARD"});for(let[a,n]of t.entries()){if(n.linkType==="SOFT"&&V.contains(e,n.target)!==null){let A=qe.getFactoryWithDefault(r,n.target,o);A.locator=a,A.linkType=n.linkType}for(let u of n.locations){let{locationRoot:A,segments:p}=eF(u,{skipPrefix:e}),h=qe.getFactoryWithDefault(r,A,o);for(let E=0;E{if(process.platform==="win32"&&r==="junctions"){let o;try{o=await ae.lstatPromise(t)}catch{}if(!o||o.isDirectory()){await ae.symlinkPromise(t,e,"junction");return}}await ae.symlinkPromise(V.relative(V.dirname(e),t),e)};async function X1e(t,e,r){let o=V.join(t,`${zj.default.randomBytes(16).toString("hex")}.tmp`);try{await ae.writeFilePromise(o,r);try{await ae.linkPromise(o,e)}catch{}}finally{await ae.unlinkPromise(o)}}async function zwt({srcPath:t,dstPath:e,entry:r,globalHardlinksStore:o,baseFs:a,nmMode:n}){if(r.kind==="file"){if(n.value==="hardlinks-global"&&o&&r.digest){let A=V.join(o,r.digest.substring(0,2),`${r.digest.substring(2)}.dat`),p;try{let h=await ae.statPromise(A);if(h&&(!r.mtimeMs||h.mtimeMs>r.mtimeMs||h.mtimeMs{await ae.mkdirPromise(t,{recursive:!0});let A=async(E=Bt.dot)=>{let w=V.join(e,E),D=await r.readdirPromise(w,{withFileTypes:!0}),b=new Map;for(let C of D){let T=V.join(E,C.name),N,U=V.join(w,C.name);if(C.isFile()){if(N={kind:"file",mode:(await r.lstatPromise(U)).mode},a.value==="hardlinks-global"){let J=await bn.checksumFile(U,{baseFs:r,algorithm:"sha1"});N.digest=J}}else if(C.isDirectory())N={kind:"directory"};else if(C.isSymbolicLink())N={kind:"symlink",symlinkTo:await r.readlinkPromise(U)};else throw new Error(`Unsupported file type (file: ${U}, mode: 0o${await r.statSync(U).mode.toString(8).padStart(6,"0")})`);if(b.set(T,N),C.isDirectory()&&T!==xi){let J=await A(T);for(let[te,le]of J)b.set(te,le)}}return b},p;if(a.value==="hardlinks-global"&&o&&u){let E=V.join(o,u.substring(0,2),`${u.substring(2)}.json`);try{p=new Map(Object.entries(JSON.parse(await ae.readFilePromise(E,"utf8"))))}catch{p=await A()}}else p=await A();let h=!1;for(let[E,w]of p){let D=V.join(e,E),b=V.join(t,E);if(w.kind==="directory")await ae.mkdirPromise(b,{recursive:!0});else if(w.kind==="file"){let C=w.mtimeMs;await zwt({srcPath:D,dstPath:b,entry:w,nmMode:a,baseFs:r,globalHardlinksStore:o}),w.mtimeMs!==C&&(h=!0)}else w.kind==="symlink"&&await Zj(V.resolve(V.dirname(b),w.symlinkTo),b,n)}if(a.value==="hardlinks-global"&&o&&h&&u){let E=V.join(o,u.substring(0,2),`${u.substring(2)}.json`);await ae.removePromise(E),await X1e(o,E,Buffer.from(JSON.stringify(Object.fromEntries(p))))}};function Zwt(t,e,r,o){let a=new Map,n=new Map,u=new Map,A=!1,p=(h,E,w,D,b)=>{let C=!0,T=V.join(h,E),N=new Set;if(E===xi||E.startsWith("@")){let J;try{J=ae.statSync(T)}catch{}C=!!J,J?J.mtimeMs>r?(A=!0,N=new Set(ae.readdirSync(T))):N=new Set(w.children.get(E).children.keys()):A=!0;let te=e.get(h);if(te){let le=V.join(h,xi,$Q),ce;try{ce=ae.statSync(le)}catch{}if(!ce)A=!0;else if(ce.mtimeMs>r){A=!0;let ue=new Set(ae.readdirSync(le)),Ie=new Map;n.set(h,Ie);for(let[he,De]of te)ue.has(he)&&Ie.set(he,De)}else n.set(h,te)}}else C=b.has(E);let U=w.children.get(E);if(C){let{linkType:J,locator:te}=U,le={children:new Map,linkType:J,locator:te};if(D.children.set(E,le),te){let ce=qe.getSetWithDefault(u,te);ce.add(T),u.set(te,ce)}for(let ce of U.children.keys())p(T,ce,U,le,N)}else U.locator&&o.storedBuildState.delete(G.parseLocator(U.locator).locatorHash)};for(let[h,E]of t){let{linkType:w,locator:D}=E,b={children:new Map,linkType:w,locator:D};if(a.set(h,b),D){let C=qe.getSetWithDefault(u,E.locator);C.add(h),u.set(E.locator,C)}E.children.has(xi)&&p(h,xi,E,b,new Set)}return{locationTree:a,binSymlinks:n,locatorLocations:u,installChangedByUser:A}}function Z1e(t){let e=G.parseDescriptor(t);return G.isVirtualDescriptor(e)&&(e=G.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function $wt(t,e,r,{loadManifest:o}){let a=new Map;for(let[A,{locations:p}]of t){let h=Z1e(A)?null:await o(A,p[0]),E=new Map;if(h)for(let[w,D]of h.bin){let b=V.join(p[0],D);D!==""&&ae.existsSync(b)&&E.set(w,D)}a.set(A,E)}let n=new Map,u=(A,p,h)=>{let E=new Map,w=V.contains(r,A);if(h.locator&&w!==null){let D=a.get(h.locator);for(let[b,C]of D){let T=V.join(A,Ae.toPortablePath(C));E.set(b,T)}for(let[b,C]of h.children){let T=V.join(A,b),N=u(T,T,C);N.size>0&&n.set(A,new Map([...n.get(A)||new Map,...N]))}}else for(let[D,b]of h.children){let C=u(V.join(A,D),p,b);for(let[T,N]of C)E.set(T,N)}return E};for(let[A,p]of e){let h=u(A,A,p);h.size>0&&n.set(A,new Map([...n.get(A)||new Map,...h]))}return n}var W1e=(t,e)=>{if(!t||!e)return t===e;let r=G.parseLocator(t);G.isVirtualLocator(r)&&(r=G.devirtualizeLocator(r));let o=G.parseLocator(e);return G.isVirtualLocator(o)&&(o=G.devirtualizeLocator(o)),G.areLocatorsEqual(r,o)};function $j(t){return V.join(t.get("globalFolder"),"store")}async function e1t(t,e,{baseFs:r,project:o,report:a,loadManifest:n,realLocatorChecksums:u}){let A=V.join(o.cwd,xi),{locationTree:p,binSymlinks:h,locatorLocations:E,installChangedByUser:w}=Zwt(t.locationTree,t.binSymlinks,t.mtimeMs,o),D=z1e(e,{skipPrefix:o.cwd}),b=[],C=async({srcDir:De,dstDir:Ee,linkType:g,globalHardlinksStore:me,nmMode:Ce,windowsLinkType:fe,packageChecksum:ie})=>{let Z=(async()=>{try{g==="SOFT"?(await ae.mkdirPromise(V.dirname(Ee),{recursive:!0}),await Zj(V.resolve(De),Ee,fe)):await Xwt(Ee,De,{baseFs:r,globalHardlinksStore:me,nmMode:Ce,windowsLinkType:fe,packageChecksum:ie})}catch(Se){throw Se.message=`While persisting ${De} -> ${Ee} ${Se.message}`,Se}finally{le.tick()}})().then(()=>b.splice(b.indexOf(Z),1));b.push(Z),b.length>G1e&&await Promise.race(b)},T=async(De,Ee,g)=>{let me=(async()=>{let Ce=async(fe,ie,Z)=>{try{Z.innerLoop||await ae.mkdirPromise(ie,{recursive:!0});let Se=await ae.readdirPromise(fe,{withFileTypes:!0});for(let Re of Se){if(!Z.innerLoop&&Re.name===$Q)continue;let ht=V.join(fe,Re.name),q=V.join(ie,Re.name);Re.isDirectory()?(Re.name!==xi||Z&&Z.innerLoop)&&(await ae.mkdirPromise(q,{recursive:!0}),await Ce(ht,q,{...Z,innerLoop:!0})):Ie.value==="hardlinks-local"||Ie.value==="hardlinks-global"?await ae.linkPromise(ht,q):await ae.copyFilePromise(ht,q,V1e.default.constants.COPYFILE_FICLONE)}}catch(Se){throw Z.innerLoop||(Se.message=`While cloning ${fe} -> ${ie} ${Se.message}`),Se}finally{Z.innerLoop||le.tick()}};await Ce(De,Ee,g)})().then(()=>b.splice(b.indexOf(me),1));b.push(me),b.length>G1e&&await Promise.race(b)},N=async(De,Ee,g)=>{if(g)for(let[me,Ce]of Ee.children){let fe=g.children.get(me);await N(V.join(De,me),Ce,fe)}else{Ee.children.has(xi)&&await RC(V.join(De,xi),{contentsOnly:!1});let me=V.basename(De)===xi&&p.has(V.join(V.dirname(De)));await RC(De,{contentsOnly:De===A,isWorkspaceDir:me})}};for(let[De,Ee]of p){let g=D.get(De);for(let[me,Ce]of Ee.children){if(me===".")continue;let fe=g&&g.children.get(me),ie=V.join(De,me);await N(ie,Ce,fe)}}let U=async(De,Ee,g)=>{if(g){W1e(Ee.locator,g.locator)||await RC(De,{contentsOnly:Ee.linkType==="HARD"});for(let[me,Ce]of Ee.children){let fe=g.children.get(me);await U(V.join(De,me),Ce,fe)}}else{Ee.children.has(xi)&&await RC(V.join(De,xi),{contentsOnly:!0});let me=V.basename(De)===xi&&D.has(V.join(V.dirname(De)));await RC(De,{contentsOnly:Ee.linkType==="HARD",isWorkspaceDir:me})}};for(let[De,Ee]of D){let g=p.get(De);for(let[me,Ce]of Ee.children){if(me===".")continue;let fe=g&&g.children.get(me);await U(V.join(De,me),Ce,fe)}}let J=new Map,te=[];for(let[De,Ee]of E)for(let g of Ee){let{locationRoot:me,segments:Ce}=eF(g,{skipPrefix:o.cwd}),fe=D.get(me),ie=me;if(fe){for(let Z of Ce)if(ie=V.join(ie,Z),fe=fe.children.get(Z),!fe)break;if(fe){let Z=W1e(fe.locator,De),Se=e.get(fe.locator),Re=Se.target,ht=ie,q=Se.linkType;if(Z)J.has(Re)||J.set(Re,ht);else if(Re!==ht){let nt=G.parseLocator(fe.locator);G.isVirtualLocator(nt)&&(nt=G.devirtualizeLocator(nt)),te.push({srcDir:Re,dstDir:ht,linkType:q,realLocatorHash:nt.locatorHash})}}}}for(let[De,{locations:Ee}]of e.entries())for(let g of Ee){let{locationRoot:me,segments:Ce}=eF(g,{skipPrefix:o.cwd}),fe=p.get(me),ie=D.get(me),Z=me,Se=e.get(De),Re=G.parseLocator(De);G.isVirtualLocator(Re)&&(Re=G.devirtualizeLocator(Re));let ht=Re.locatorHash,q=Se.target,nt=g;if(q===nt)continue;let Le=Se.linkType;for(let Te of Ce)ie=ie.children.get(Te);if(!fe)te.push({srcDir:q,dstDir:nt,linkType:Le,realLocatorHash:ht});else for(let Te of Ce)if(Z=V.join(Z,Te),fe=fe.children.get(Te),!fe){te.push({srcDir:q,dstDir:nt,linkType:Le,realLocatorHash:ht});break}}let le=Ws.progressViaCounter(te.length),ce=a.reportProgress(le),ue=o.configuration.get("nmMode"),Ie={value:ue},he=o.configuration.get("winLinkType");try{let De=Ie.value==="hardlinks-global"?`${$j(o.configuration)}/v1`:null;if(De&&!await ae.existsPromise(De)){await ae.mkdirpPromise(De);for(let g=0;g<256;g++)await ae.mkdirPromise(V.join(De,g.toString(16).padStart(2,"0")))}for(let g of te)(g.linkType==="SOFT"||!J.has(g.srcDir))&&(J.set(g.srcDir,g.dstDir),await C({...g,globalHardlinksStore:De,nmMode:Ie,windowsLinkType:he,packageChecksum:u.get(g.realLocatorHash)||null}));await Promise.all(b),b.length=0;for(let g of te){let me=J.get(g.srcDir);g.linkType!=="SOFT"&&g.dstDir!==me&&await T(me,g.dstDir,{nmMode:Ie})}await Promise.all(b),await ae.mkdirPromise(A,{recursive:!0});let Ee=await $wt(e,D,o.cwd,{loadManifest:n});await t1t(h,Ee,o.cwd,he),await Jwt(o,e,Ee,Ie,{installChangedByUser:w}),ue=="hardlinks-global"&&Ie.value=="hardlinks-local"&&a.reportWarningOnce(74,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{ce.stop()}}async function t1t(t,e,r,o){for(let a of t.keys()){if(V.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);if(!e.has(a)){let n=V.join(a,xi,$Q);await ae.removePromise(n)}}for(let[a,n]of e){if(V.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);let u=V.join(a,xi,$Q),A=t.get(a)||new Map;await ae.mkdirPromise(u,{recursive:!0});for(let p of A.keys())n.has(p)||(await ae.removePromise(V.join(u,p)),process.platform==="win32"&&await ae.removePromise(V.join(u,`${p}.cmd`)));for(let[p,h]of n){let E=A.get(p),w=V.join(u,p);E!==h&&(process.platform==="win32"?await(0,Y1e.default)(Ae.fromPortablePath(h),Ae.fromPortablePath(w),{createPwshFile:!1}):(await ae.removePromise(w),await Zj(h,w,o),V.contains(r,await ae.realpathPromise(h))!==null&&await ae.chmodPromise(h,493)))}}}Ve();St();sA();var Sv=class extends Yh{constructor(){super(...arguments);this.mode="loose"}makeInstaller(r){return new eG(r)}},eG=class extends pd{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(r){let o=new qs({baseFs:new iA({maxOpenFiles:80,readOnlyArchives:!0})}),a=F1e(r,this.opts.project.cwd,o),{tree:n,errors:u}=pv(a,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:w,text:D}of u)this.opts.report.reportError(w,D);return}let A=new Map;r.fallbackPool=A;let p=(w,D)=>{let b=G.parseLocator(D.locator),C=G.stringifyIdent(b);C===w?A.set(w,b.reference):A.set(w,[C,b.reference])},h=V.join(this.opts.project.cwd,mr.nodeModules),E=n.get(h);if(!(typeof E>"u")){if("target"in E)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let w of E.dirList){let D=V.join(h,w),b=n.get(D);if(typeof b>"u")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in b)p(w,b);else for(let C of b.dirList){let T=V.join(D,C),N=n.get(T);if(typeof N>"u")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in N)p(`${w}/${C}`,N);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var r1t={hooks:{cleanGlobalArtifacts:async t=>{let e=$j(t);await ae.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevents packages to be hoisted past specific levels",type:"STRING",values:["workspaces","dependencies","none"],default:"none"},nmMode:{description:"Defines in which measure Yarn must use hardlinks and symlinks when generated `node_modules` directories.",type:"STRING",values:["classic","hardlinks-local","hardlinks-global"],default:"classic"},nmSelfReferences:{description:"Defines whether the linker should generate self-referencing symlinks for workspaces.",type:"BOOLEAN",default:!0}},linkers:[Dv,Sv]},n1t=r1t;var $G={};Vt($G,{NpmHttpFetcher:()=>bv,NpmRemapResolver:()=>kv,NpmSemverFetcher:()=>rp,NpmSemverResolver:()=>Qv,NpmTagResolver:()=>Fv,default:()=>yvt,npmConfigUtils:()=>si,npmHttpUtils:()=>en,npmPublishUtils:()=>KC});Ve();var o2e=et(ni());var Zn="npm:";var en={};Vt(en,{AuthType:()=>n2e,customPackageError:()=>hd,del:()=>g1t,get:()=>gd,getIdentUrl:()=>tF,getPackageMetadata:()=>NC,handleInvalidAuthenticationError:()=>Kh,post:()=>p1t,put:()=>h1t});Ve();Ve();St();var iG=et(Q2()),t2e=et(c8()),r2e=et(ni());var si={};Vt(si,{RegistryType:()=>$1e,getAuditRegistry:()=>i1t,getAuthConfiguration:()=>nG,getDefaultRegistry:()=>Pv,getPublishRegistry:()=>s1t,getRegistryConfiguration:()=>e2e,getScopeConfiguration:()=>rG,getScopeRegistry:()=>TC,normalizeRegistry:()=>uc});var $1e=(o=>(o.AUDIT_REGISTRY="npmAuditRegistry",o.FETCH_REGISTRY="npmRegistryServer",o.PUBLISH_REGISTRY="npmPublishRegistry",o))($1e||{});function uc(t){return t.replace(/\/$/,"")}function i1t({configuration:t}){return Pv({configuration:t,type:"npmAuditRegistry"})}function s1t(t,{configuration:e}){return t.publishConfig?.registry?uc(t.publishConfig.registry):t.name?TC(t.name.scope,{configuration:e,type:"npmPublishRegistry"}):Pv({configuration:e,type:"npmPublishRegistry"})}function TC(t,{configuration:e,type:r="npmRegistryServer"}){let o=rG(t,{configuration:e});if(o===null)return Pv({configuration:e,type:r});let a=o.get(r);return a===null?Pv({configuration:e,type:r}):uc(a)}function Pv({configuration:t,type:e="npmRegistryServer"}){let r=t.get(e);return uc(r!==null?r:t.get("npmRegistryServer"))}function e2e(t,{configuration:e}){let r=e.get("npmRegistries"),o=uc(t),a=r.get(o);if(typeof a<"u")return a;let n=r.get(o.replace(/^[a-z]+:/,""));return typeof n<"u"?n:null}function rG(t,{configuration:e}){if(t===null)return null;let o=e.get("npmScopes").get(t);return o||null}function nG(t,{configuration:e,ident:r}){let o=r&&rG(r.scope,{configuration:e});return o?.get("npmAuthIdent")||o?.get("npmAuthToken")?o:e2e(t,{configuration:e})||e}var n2e=(a=>(a[a.NO_AUTH=0]="NO_AUTH",a[a.BEST_EFFORT=1]="BEST_EFFORT",a[a.CONFIGURATION=2]="CONFIGURATION",a[a.ALWAYS_AUTH=3]="ALWAYS_AUTH",a))(n2e||{});async function Kh(t,{attemptedAs:e,registry:r,headers:o,configuration:a}){if(nF(t))throw new Jt(41,"Invalid OTP token");if(t.originalError?.name==="HTTPError"&&t.originalError?.response.statusCode===401)throw new Jt(41,`Invalid authentication (${typeof e!="string"?`as ${await m1t(r,o,{configuration:a})}`:`attempted as ${e}`})`)}function hd(t,e){let r=t.response?.statusCode;return r?r===404?"Package not found":r>=500&&r<600?`The registry appears to be down (using a ${pe.applyHyperlink(e,"local cache","https://yarnpkg.com/advanced/lexicon#local-cache")} might have protected you against such outages)`:null:null}function tF(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}var i2e=new Map,o1t=new Map;async function a1t(t){return await qe.getFactoryWithDefault(i2e,t,async()=>{let e=null;try{e=await ae.readJsonPromise(t)}catch{}return e})}async function l1t(t,e,{configuration:r,cached:o,registry:a,headers:n,version:u,...A}){return await qe.getFactoryWithDefault(o1t,t,async()=>await gd(tF(e),{...A,customErrorMessage:hd,configuration:r,registry:a,ident:e,headers:{...n,"If-None-Match":o?.etag,"If-Modified-Since":o?.lastModified},wrapNetworkRequest:async p=>async()=>{let h=await p();if(h.statusCode===304){if(o===null)throw new Error("Assertion failed: cachedMetadata should not be null");return{...h,body:o.metadata}}let E=c1t(JSON.parse(h.body.toString())),w={metadata:E,etag:h.headers.etag,lastModified:h.headers["last-modified"]};return i2e.set(t,Promise.resolve(w)),Promise.resolve().then(async()=>{let D=`${t}-${process.pid}.tmp`;await ae.mkdirPromise(V.dirname(D),{recursive:!0}),await ae.writeJsonPromise(D,w,{compact:!0}),await ae.renamePromise(D,t)}).catch(()=>{}),{...h,body:E}}}))}async function NC(t,{cache:e,project:r,registry:o,headers:a,version:n,...u}){let{configuration:A}=r;o=xv(A,{ident:t,registry:o});let p=A1t(A,o),h=V.join(p,`${G.slugifyIdent(t)}.json`),E=null;if(!r.lockfileNeedsRefresh&&(E=await a1t(h),E)){if(typeof n<"u"&&typeof E.metadata.versions[n]<"u")return E.metadata;if(A.get("enableOfflineMode")){let w=structuredClone(E.metadata),D=new Set;if(e){for(let C of Object.keys(w.versions)){let T=G.makeLocator(t,`npm:${C}`),N=e.getLocatorMirrorPath(T);(!N||!ae.existsSync(N))&&(delete w.versions[C],D.add(C))}let b=w["dist-tags"].latest;if(D.has(b)){let C=Object.keys(E.metadata.versions).sort(r2e.default.compare),T=C.indexOf(b);for(;D.has(C[T])&&T>=0;)T-=1;T>=0?w["dist-tags"].latest=C[T]:delete w["dist-tags"].latest}}return w}}return await l1t(h,t,{...u,configuration:A,cached:E,registry:o,headers:a,version:n})}var s2e=["name","dist.tarball","bin","scripts","os","cpu","libc","dependencies","dependenciesMeta","optionalDependencies","peerDependencies","peerDependenciesMeta","deprecated"];function c1t(t){return{"dist-tags":t["dist-tags"],versions:Object.fromEntries(Object.entries(t.versions).map(([e,r])=>[e,(0,t2e.default)(r,s2e)]))}}var u1t=bn.makeHash(...s2e).slice(0,6);function A1t(t,e){let r=f1t(t),o=new URL(e);return V.join(r,u1t,o.hostname)}function f1t(t){return V.join(t.get("globalFolder"),"metadata/npm")}async function gd(t,{configuration:e,headers:r,ident:o,authType:a,registry:n,...u}){n=xv(e,{ident:o,registry:n}),o&&o.scope&&typeof a>"u"&&(a=1);let A=await rF(n,{authType:a,configuration:e,ident:o});A&&(r={...r,authorization:A});try{return await on.get(t.charAt(0)==="/"?`${n}${t}`:t,{configuration:e,headers:r,...u})}catch(p){throw await Kh(p,{registry:n,configuration:e,headers:r}),p}}async function p1t(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){A=xv(o,{ident:n,registry:A});let E=await rF(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...LC(p)});try{return await on.post(A+t,e,{configuration:o,headers:a,...h})}catch(w){if(!nF(w)||p)throw await Kh(w,{attemptedAs:r,registry:A,configuration:o,headers:a}),w;p=await sG(w,{configuration:o});let D={...a,...LC(p)};try{return await on.post(`${A}${t}`,e,{configuration:o,headers:D,...h})}catch(b){throw await Kh(b,{attemptedAs:r,registry:A,configuration:o,headers:a}),b}}}async function h1t(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){A=xv(o,{ident:n,registry:A});let E=await rF(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...LC(p)});try{return await on.put(A+t,e,{configuration:o,headers:a,...h})}catch(w){if(!nF(w))throw await Kh(w,{attemptedAs:r,registry:A,configuration:o,headers:a}),w;p=await sG(w,{configuration:o});let D={...a,...LC(p)};try{return await on.put(`${A}${t}`,e,{configuration:o,headers:D,...h})}catch(b){throw await Kh(b,{attemptedAs:r,registry:A,configuration:o,headers:a}),b}}}async function g1t(t,{attemptedAs:e,configuration:r,headers:o,ident:a,authType:n=3,registry:u,otp:A,...p}){u=xv(r,{ident:a,registry:u});let h=await rF(u,{authType:n,configuration:r,ident:a});h&&(o={...o,authorization:h}),A&&(o={...o,...LC(A)});try{return await on.del(u+t,{configuration:r,headers:o,...p})}catch(E){if(!nF(E)||A)throw await Kh(E,{attemptedAs:e,registry:u,configuration:r,headers:o}),E;A=await sG(E,{configuration:r});let w={...o,...LC(A)};try{return await on.del(`${u}${t}`,{configuration:r,headers:w,...p})}catch(D){throw await Kh(D,{attemptedAs:e,registry:u,configuration:r,headers:o}),D}}}function xv(t,{ident:e,registry:r}){if(typeof r>"u"&&e)return TC(e.scope,{configuration:t});if(typeof r!="string")throw new Error("Assertion failed: The registry should be a string");return uc(r)}async function rF(t,{authType:e=2,configuration:r,ident:o}){let a=nG(t,{configuration:r,ident:o}),n=d1t(a,e);if(!n)return null;let u=await r.reduceHook(A=>A.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:o});if(u)return u;if(a.get("npmAuthToken"))return`Bearer ${a.get("npmAuthToken")}`;if(a.get("npmAuthIdent")){let A=a.get("npmAuthIdent");return A.includes(":")?`Basic ${Buffer.from(A).toString("base64")}`:`Basic ${A}`}if(n&&e!==1)throw new Jt(33,"No authentication configured for request");return null}function d1t(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function m1t(t,e,{configuration:r}){if(typeof e>"u"||typeof e.authorization>"u")return"an anonymous user";try{return(await on.get(new URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username??"an unknown user"}catch{return"an unknown user"}}async function sG(t,{configuration:e}){let r=t.originalError?.response.headers["npm-notice"];if(r&&(await Lt.start({configuration:e,stdout:process.stdout,includeFooter:!1},async a=>{if(a.reportInfo(0,r.replace(/(https?:\/\/\S+)/g,pe.pretty(e,"$1",pe.Type.URL))),!process.env.YARN_IS_TEST_ENV){let n=r.match(/open (https?:\/\/\S+)/i);if(n&&Xi.openUrl){let{openNow:u}=await(0,iG.prompt)({type:"confirm",name:"openNow",message:"Do you want to try to open this url now?",required:!0,initial:!0,onCancel:()=>process.exit(130)});u&&(await Xi.openUrl(n[1])||(a.reportSeparator(),a.reportWarning(0,"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.")))}}}),process.stdout.write(` -`)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||"";let{otp:o}=await(0,iG.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(` -`),o}function nF(t){if(t.originalError?.name!=="HTTPError")return!1;try{return(t.originalError?.response.headers["www-authenticate"].split(/,\s*/).map(r=>r.toLowerCase())).includes("otp")}catch{return!1}}function LC(t){return{"npm-otp":t}}var bv=class{supports(e,r){if(!e.reference.startsWith(Zn))return!1;let{selector:o,params:a}=G.parseRange(e.reference);return!(!o2e.default.valid(o)||a===null||typeof a.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let{params:o}=G.parseRange(e.reference);if(o===null||typeof o.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let a=await gd(o.__archiveUrl,{customErrorMessage:hd,configuration:r.project.configuration,ident:e});return await $i.convertToZip(a,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ve();var kv=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Zn)||!G.tryParseDescriptor(e.range.slice(Zn.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){let o=r.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(Zn.length),!0));return r.resolver.getResolutionDependencies(o,r)}async getCandidates(e,r,o){let a=o.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(Zn.length),!0));return await o.resolver.getCandidates(a,r,o)}async getSatisfying(e,r,o,a){let n=a.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(Zn.length),!0));return a.resolver.getSatisfying(n,r,o,a)}resolve(e,r){throw new Error("Unreachable")}};Ve();Ve();var a2e=et(ni());var rp=class t{supports(e,r){if(!e.reference.startsWith(Zn))return!1;let o=new URL(e.reference);return!(!a2e.default.valid(o.pathname)||o.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o;try{o=await gd(t.getLocatorUrl(e),{customErrorMessage:hd,configuration:r.project.configuration,ident:e})}catch{o=await gd(t.getLocatorUrl(e).replace(/%2f/g,"/"),{customErrorMessage:hd,configuration:r.project.configuration,ident:e})}return await $i.convertToZip(o,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:o}){let a=TC(e.scope,{configuration:o}),n=t.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),a=a.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===a+n||r===a+n.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=Ur.clean(e.reference.slice(Zn.length));if(r===null)throw new Jt(10,"The npm semver resolver got selected, but the version isn't semver");return`${tF(e)}/-/${e.name}-${r}.tgz`}};Ve();Ve();Ve();var oG=et(ni());var iF=G.makeIdent(null,"node-gyp"),y1t=/\b(node-gyp|prebuild-install)\b/,Qv=class{supportsDescriptor(e,r){return e.range.startsWith(Zn)?!!Ur.validRange(e.range.slice(Zn.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(Zn))return!1;let{selector:o}=G.parseRange(e.reference);return!!oG.default.valid(o)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=Ur.validRange(e.range.slice(Zn.length));if(a===null)throw new Error(`Expected a valid range, got ${e.range.slice(Zn.length)}`);let n=await NC(e,{cache:o.fetchOptions?.cache,project:o.project,version:oG.default.valid(a.raw)?a.raw:void 0}),u=qe.mapAndFilter(Object.keys(n.versions),h=>{try{let E=new Ur.SemVer(h);if(a.test(E))return E}catch{}return qe.mapAndFilter.skip}),A=u.filter(h=>!n.versions[h.raw].deprecated),p=A.length>0?A:u;return p.sort((h,E)=>-h.compare(E)),p.map(h=>{let E=G.makeLocator(e,`${Zn}${h.raw}`),w=n.versions[h.raw].dist.tarball;return rp.isConventionalTarballUrl(E,w,{configuration:o.project.configuration})?E:G.bindLocator(E,{__archiveUrl:w})})}async getSatisfying(e,r,o,a){let n=Ur.validRange(e.range.slice(Zn.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Zn.length)}`);return{locators:qe.mapAndFilter(o,p=>{if(p.identHash!==e.identHash)return qe.mapAndFilter.skip;let h=G.tryParseRange(p.reference,{requireProtocol:Zn});if(!h)return qe.mapAndFilter.skip;let E=new Ur.SemVer(h.selector);return n.test(E)?{locator:p,version:E}:qe.mapAndFilter.skip}).sort((p,h)=>-p.version.compare(h.version)).map(({locator:p})=>p),sorted:!0}}async resolve(e,r){let{selector:o}=G.parseRange(e.reference),a=Ur.clean(o);if(a===null)throw new Jt(10,"The npm semver resolver got selected, but the version isn't semver");let n=await NC(e,{cache:r.fetchOptions?.cache,project:r.project,version:a});if(!Object.hasOwn(n,"versions"))throw new Jt(15,'Registry returned invalid data for - missing "versions" field');if(!Object.hasOwn(n.versions,a))throw new Jt(16,`Registry failed to return reference "${a}"`);let u=new _t;if(u.load(n.versions[a]),!u.dependencies.has(iF.identHash)&&!u.peerDependencies.has(iF.identHash)){for(let A of u.scripts.values())if(A.match(y1t)){u.dependencies.set(iF.identHash,G.makeDescriptor(iF,"latest"));break}}return{...e,version:a,languageName:"node",linkType:"HARD",conditions:u.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(u.dependencies),peerDependencies:u.peerDependencies,dependenciesMeta:u.dependenciesMeta,peerDependenciesMeta:u.peerDependenciesMeta,bin:u.bin}}};Ve();Ve();var l2e=et(ni());var Fv=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Zn)||!by.test(e.range.slice(Zn.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(Zn.length),n=await NC(e,{cache:o.fetchOptions?.cache,project:o.project});if(!Object.hasOwn(n,"dist-tags"))throw new Jt(15,'Registry returned invalid data - missing "dist-tags" field');let u=n["dist-tags"];if(!Object.hasOwn(u,a))throw new Jt(16,`Registry failed to return tag "${a}"`);let A=u[a],p=G.makeLocator(e,`${Zn}${A}`),h=n.versions[A].dist.tarball;return rp.isConventionalTarballUrl(p,h,{configuration:o.project.configuration})?[p]:[G.bindLocator(p,{__archiveUrl:h})]}async getSatisfying(e,r,o,a){let n=[];for(let u of o){if(u.identHash!==e.identHash)continue;let A=G.tryParseRange(u.reference,{requireProtocol:Zn});if(!(!A||!l2e.default.valid(A.selector))){if(A.params?.__archiveUrl){let p=G.makeRange({protocol:Zn,selector:A.selector,source:null,params:null}),[h]=await a.resolver.getCandidates(G.makeDescriptor(e,p),r,a);if(u.reference!==h.reference)continue}n.push(u)}}return{locators:n,sorted:!1}}async resolve(e,r){throw new Error("Unreachable")}};var KC={};Vt(KC,{getGitHead:()=>dvt,getPublishAccess:()=>XBe,getReadmeContent:()=>ZBe,makePublishBody:()=>gvt});Ve();Ve();St();var KG={};Vt(KG,{PackCommand:()=>VC,default:()=>XBt,packUtils:()=>BA});Ve();Ve();Ve();St();Gt();var BA={};Vt(BA,{genPackList:()=>PF,genPackStream:()=>VG,genPackageManifest:()=>UBe,hasPackScripts:()=>WG,prepareForPack:()=>YG});Ve();St();var GG=et(Xo()),OBe=et(RBe()),MBe=ve("zlib"),_Bt=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],HBt=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function WG(t){return!!(hn.hasWorkspaceScript(t,"prepack")||hn.hasWorkspaceScript(t,"postpack"))}async function YG(t,{report:e},r){await hn.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let o=V.join(t.cwd,_t.fileName);await ae.existsPromise(o)&&await t.manifest.loadFile(o,{baseFs:ae}),await r()}finally{await hn.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function VG(t,e){typeof e>"u"&&(e=await PF(t));let r=new Set;for(let n of t.manifest.publishConfig?.executableFiles??new Set)r.add(V.normalize(n));for(let n of t.manifest.bin.values())r.add(V.normalize(n));let o=OBe.default.pack();process.nextTick(async()=>{for(let n of e){let u=V.normalize(n),A=V.resolve(t.cwd,u),p=V.join("package",u),h=await ae.lstatPromise(A),E={name:p,mtime:new Date(Si.SAFE_TIME*1e3)},w=r.has(u)?493:420,D,b,C=new Promise((N,U)=>{D=N,b=U}),T=N=>{N?b(N):D()};if(h.isFile()){let N;u==="package.json"?N=Buffer.from(JSON.stringify(await UBe(t),null,2)):N=await ae.readFilePromise(A),o.entry({...E,mode:w,type:"file"},N,T)}else h.isSymbolicLink()?o.entry({...E,mode:w,type:"symlink",linkname:await ae.readlinkPromise(A)},T):T(new Error(`Unsupported file type ${h.mode} for ${Ae.fromPortablePath(u)}`));await C}o.finalize()});let a=(0,MBe.createGzip)();return o.pipe(a),a}async function UBe(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function PF(t){let e=t.project,r=e.configuration,o={accept:[],reject:[]};for(let w of HBt)o.reject.push(w);for(let w of _Bt)o.accept.push(w);o.reject.push(r.get("rcFilename"));let a=w=>{if(w===null||!w.startsWith(`${t.cwd}/`))return;let D=V.relative(t.cwd,w),b=V.resolve(Bt.root,D);o.reject.push(b)};a(V.resolve(e.cwd,mr.lockfile)),a(r.get("cacheFolder")),a(r.get("globalFolder")),a(r.get("installStatePath")),a(r.get("virtualFolder")),a(r.get("yarnPath")),await r.triggerHook(w=>w.populateYarnPaths,e,w=>{a(w)});for(let w of e.workspaces){let D=V.relative(t.cwd,w.cwd);D!==""&&!D.match(/^(\.\.)?\//)&&o.reject.push(`/${D}`)}let n={accept:[],reject:[]},u=t.manifest.publishConfig?.main??t.manifest.main,A=t.manifest.publishConfig?.module??t.manifest.module,p=t.manifest.publishConfig?.browser??t.manifest.browser,h=t.manifest.publishConfig?.bin??t.manifest.bin;u!=null&&n.accept.push(V.resolve(Bt.root,u)),A!=null&&n.accept.push(V.resolve(Bt.root,A)),typeof p=="string"&&n.accept.push(V.resolve(Bt.root,p));for(let w of h.values())n.accept.push(V.resolve(Bt.root,w));if(p instanceof Map)for(let[w,D]of p.entries())n.accept.push(V.resolve(Bt.root,w)),typeof D=="string"&&n.accept.push(V.resolve(Bt.root,D));let E=t.manifest.files!==null;if(E){n.reject.push("/*");for(let w of t.manifest.files)_Be(n.accept,w,{cwd:Bt.root})}return await qBt(t.cwd,{hasExplicitFileList:E,globalList:o,ignoreList:n})}async function qBt(t,{hasExplicitFileList:e,globalList:r,ignoreList:o}){let a=[],n=new Gu(t),u=[[Bt.root,[o]]];for(;u.length>0;){let[A,p]=u.pop(),h=await n.lstatPromise(A);if(!LBe(A,{globalList:r,ignoreLists:h.isDirectory()?null:p}))if(h.isDirectory()){let E=await n.readdirPromise(A),w=!1,D=!1;if(!e||A!==Bt.root)for(let T of E)w=w||T===".gitignore",D=D||T===".npmignore";let b=D?await TBe(n,A,".npmignore"):w?await TBe(n,A,".gitignore"):null,C=b!==null?[b].concat(p):p;LBe(A,{globalList:r,ignoreLists:p})&&(C=[...p,{accept:[],reject:["**/*"]}]);for(let T of E)u.push([V.resolve(A,T),C])}else(h.isFile()||h.isSymbolicLink())&&a.push(V.relative(Bt.root,A))}return a.sort()}async function TBe(t,e,r){let o={accept:[],reject:[]},a=await t.readFilePromise(V.join(e,r),"utf8");for(let n of a.split(/\n/g))_Be(o.reject,n,{cwd:e});return o}function jBt(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=V.resolve(e,t)),r&&(t=`!${t}`),t}function _Be(t,e,{cwd:r}){let o=e.trim();o===""||o[0]==="#"||t.push(jBt(o,{cwd:r}))}function LBe(t,{globalList:e,ignoreLists:r}){let o=SF(t,e.accept);if(o!==0)return o===2;let a=SF(t,e.reject);if(a!==0)return a===1;if(r!==null)for(let n of r){let u=SF(t,n.accept);if(u!==0)return u===2;let A=SF(t,n.reject);if(A!==0)return A===1}return!1}function SF(t,e){let r=e,o=[];for(let a=0;a{await YG(a,{report:p},async()=>{p.reportJson({base:Ae.fromPortablePath(a.cwd)});let h=await PF(a);for(let E of h)p.reportInfo(null,Ae.fromPortablePath(E)),p.reportJson({location:Ae.fromPortablePath(E)});if(!this.dryRun){let E=await VG(a,h);await ae.mkdirPromise(V.dirname(u),{recursive:!0});let w=ae.createWriteStream(u);E.pipe(w),await new Promise(D=>{w.on("finish",D)})}}),this.dryRun||(p.reportInfo(0,`Package archive generated in ${pe.pretty(r,u,pe.Type.PATH)}`),p.reportJson({output:Ae.fromPortablePath(u)}))})).exitCode()}};function GBt(t,{workspace:e}){let r=t.replace("%s",WBt(e)).replace("%v",YBt(e));return Ae.toPortablePath(r)}function WBt(t){return t.manifest.name!==null?G.slugifyIdent(t.manifest.name):"package"}function YBt(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var VBt=["dependencies","devDependencies","peerDependencies"],KBt="workspace:",JBt=(t,e)=>{e.publishConfig&&(e.publishConfig.type&&(e.type=e.publishConfig.type),e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.imports&&(e.imports=e.publishConfig.imports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let o of VBt)for(let a of t.manifest.getForScope(o).values()){let n=r.tryWorkspaceByDescriptor(a),u=G.parseRange(a.range);if(u.protocol===KBt)if(n===null){if(r.tryWorkspaceByIdent(a)===null)throw new Jt(21,`${G.prettyDescriptor(r.configuration,a)}: No local workspace found for this range`)}else{let A;G.areDescriptorsEqual(a,n.anchoredDescriptor)||u.selector==="*"?A=n.manifest.version??"0.0.0":u.selector==="~"||u.selector==="^"?A=`${u.selector}${n.manifest.version??"0.0.0"}`:A=u.selector;let p=o==="dependencies"?G.makeDescriptor(a,"unknown"):null,h=p!==null&&t.manifest.ensureDependencyMeta(p).optional?"optionalDependencies":o;e[h][G.stringifyIdent(a)]=A}}},zBt={hooks:{beforeWorkspacePacking:JBt},commands:[VC]},XBt=zBt;var JBe=ve("crypto"),zBe=et(KBe());async function gvt(t,e,{access:r,tag:o,registry:a,gitHead:n}){let u=t.manifest.name,A=t.manifest.version,p=G.stringifyIdent(u),h=(0,JBe.createHash)("sha1").update(e).digest("hex"),E=zBe.default.fromData(e).toString(),w=r??XBe(t,u),D=await ZBe(t),b=await BA.genPackageManifest(t),C=`${p}-${A}.tgz`,T=new URL(`${uc(a)}/${p}/-/${C}`);return{_id:p,_attachments:{[C]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:p,access:w,"dist-tags":{[o]:A},versions:{[A]:{...b,_id:`${p}@${A}`,name:p,version:A,gitHead:n,dist:{shasum:h,integrity:E,tarball:T.toString()}}},readme:D}}async function dvt(t){try{let{stdout:e}=await Hr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:t});return e.trim()===""?void 0:e.trim()}catch{return}}function XBe(t,e){let r=t.project.configuration;return t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?t.manifest.publishConfig.access:r.get("npmPublishAccess")!==null?r.get("npmPublishAccess"):e.scope?"restricted":"public"}async function ZBe(t){let e=Ae.toPortablePath(`${t.cwd}/README.md`),r=t.manifest.name,a=`# ${G.stringifyIdent(r)} -`;try{a=await ae.readFilePromise(e,"utf8")}catch(n){if(n.code==="ENOENT")return a;throw n}return a}var ZG={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"BOOLEAN",default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:"SECRET",default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:"SECRET",default:null}},$Be={npmAuditRegistry:{description:"Registry to query for audit reports",type:"STRING",default:null},npmPublishRegistry:{description:"Registry to push packages to",type:"STRING",default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"STRING",default:"https://registry.yarnpkg.com"}},mvt={configuration:{...ZG,...$Be,npmScopes:{description:"Settings per package scope",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{...ZG,...$Be}}},npmRegistries:{description:"Settings per registry",type:"MAP",normalizeKeys:uc,valueDefinition:{description:"",type:"SHAPE",properties:{...ZG}}}},fetchers:[bv,rp],resolvers:[kv,Qv,Fv]},yvt=mvt;var l5={};Vt(l5,{NpmAuditCommand:()=>zC,NpmInfoCommand:()=>XC,NpmLoginCommand:()=>ZC,NpmLogoutCommand:()=>eI,NpmPublishCommand:()=>tI,NpmTagAddCommand:()=>nI,NpmTagListCommand:()=>rI,NpmTagRemoveCommand:()=>iI,NpmWhoamiCommand:()=>sI,default:()=>Dvt,npmAuditTypes:()=>Xv,npmAuditUtils:()=>xF});Ve();Ve();Gt();var i5=et(Xo());il();var Xv={};Vt(Xv,{Environment:()=>Jv,Severity:()=>zv});var Jv=(o=>(o.All="all",o.Production="production",o.Development="development",o))(Jv||{}),zv=(n=>(n.Info="info",n.Low="low",n.Moderate="moderate",n.High="high",n.Critical="critical",n))(zv||{});var xF={};Vt(xF,{allSeverities:()=>JC,getPackages:()=>n5,getReportTree:()=>t5,getSeverityInclusions:()=>e5,getTopLevelDependencies:()=>r5});Ve();var eve=et(ni());var JC=["info","low","moderate","high","critical"];function e5(t){if(typeof t>"u")return new Set(JC);let e=JC.indexOf(t),r=JC.slice(e);return new Set(r)}function t5(t){let e={},r={children:e};for(let[o,a]of qe.sortMap(Object.entries(t),n=>n[0]))for(let n of qe.sortMap(a,u=>`${u.id}`))e[`${o}/${n.id}`]={value:pe.tuple(pe.Type.IDENT,G.parseIdent(o)),children:{ID:typeof n.id<"u"&&{label:"ID",value:pe.tuple(pe.Type.ID,n.id)},Issue:{label:"Issue",value:pe.tuple(pe.Type.NO_HINT,n.title)},URL:typeof n.url<"u"&&{label:"URL",value:pe.tuple(pe.Type.URL,n.url)},Severity:{label:"Severity",value:pe.tuple(pe.Type.NO_HINT,n.severity)},"Vulnerable Versions":{label:"Vulnerable Versions",value:pe.tuple(pe.Type.RANGE,n.vulnerable_versions)},"Tree Versions":{label:"Tree Versions",children:[...n.versions].sort(eve.default.compare).map(u=>({value:pe.tuple(pe.Type.REFERENCE,u)}))},Dependents:{label:"Dependents",children:qe.sortMap(n.dependents,u=>G.stringifyLocator(u)).map(u=>({value:pe.tuple(pe.Type.LOCATOR,u)}))}}};return r}function r5(t,e,{all:r,environment:o}){let a=[],n=r?t.workspaces:[e],u=["all","production"].includes(o),A=["all","development"].includes(o);for(let p of n)for(let h of p.anchoredPackage.dependencies.values())(p.manifest.devDependencies.has(h.identHash)?!A:!u)||a.push({workspace:p,dependency:h});return a}function n5(t,e,{recursive:r}){let o=new Map,a=new Set,n=[],u=(A,p)=>{let h=t.storedResolutions.get(p.descriptorHash);if(typeof h>"u")throw new Error("Assertion failed: The resolution should have been registered");if(!a.has(h))a.add(h);else return;let E=t.storedPackages.get(h);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");if(G.ensureDevirtualizedLocator(E).reference.startsWith("npm:")&&E.version!==null){let D=G.stringifyIdent(E),b=qe.getMapWithDefault(o,D);qe.getArrayWithDefault(b,E.version).push(A)}if(r)for(let D of E.dependencies.values())n.push([E,D])};for(let{workspace:A,dependency:p}of e)n.push([A.anchoredLocator,p]);for(;n.length>0;){let[A,p]=n.shift();u(A,p)}return o}var zC=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=de.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=de.String("--environment","all",{description:"Which environments to cover",validator:js(Jv)});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.noDeprecations=de.Boolean("--no-deprecations",!1,{description:"Don't warn about deprecated packages"});this.severity=de.String("--severity","info",{description:"Minimal severity requested for packages to be displayed",validator:js(zv)});this.excludes=de.Array("--exclude",[],{description:"Array of glob patterns of packages to exclude from audit"});this.ignores=de.Array("--ignore",[],{description:"Array of glob patterns of advisory ID's to ignore in the audit report"})}static{this.paths=[["npm","audit"]]}static{this.usage=ot.Usage({description:"perform a vulnerability audit against the installed packages",details:` - This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). - - For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. - - Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${JC.map(r=>`\`${r}\``).join(", ")}. - - If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. - - If certain packages produce false positives for a particular environment, the \`--exclude\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \`npmAuditExcludePackages\` option. - - If particular advisories are needed to be ignored, the \`--ignore\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \`npmAuditIgnoreAdvisories\` option. - - To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why package\` to get more information as to who depends on them. - `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"],["Exclude certain packages","yarn npm audit --exclude package1 --exclude package2"],["Ignore specific advisories","yarn npm audit --ignore 1234567 --ignore 7654321"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let n=r5(o,a,{all:this.all,environment:this.environment}),u=n5(o,n,{recursive:this.recursive}),A=Array.from(new Set([...r.get("npmAuditExcludePackages"),...this.excludes])),p=Object.create(null);for(let[N,U]of u)A.some(J=>i5.default.isMatch(N,J))||(p[N]=[...U.keys()]);let h=si.getAuditRegistry({configuration:r}),E,w=await pA.start({configuration:r,stdout:this.context.stdout},async()=>{let N=en.post("/-/npm/v1/security/advisories/bulk",p,{authType:en.AuthType.BEST_EFFORT,configuration:r,jsonResponse:!0,registry:h}),U=this.noDeprecations?[]:await Promise.all(Array.from(Object.entries(p),async([te,le])=>{let ce=await en.getPackageMetadata(G.parseIdent(te),{project:o});return qe.mapAndFilter(le,ue=>{let{deprecated:Ie}=ce.versions[ue];return Ie?[te,ue,Ie]:qe.mapAndFilter.skip})})),J=await N;for(let[te,le,ce]of U.flat(1))Object.hasOwn(J,te)&&J[te].some(ue=>Ur.satisfiesWithPrereleases(le,ue.vulnerable_versions))||(J[te]??=[],J[te].push({id:`${te} (deprecation)`,title:ce.trim()||"This package has been deprecated.",severity:"moderate",vulnerable_versions:le}));E=J});if(w.hasErrors())return w.exitCode();let D=e5(this.severity),b=Array.from(new Set([...r.get("npmAuditIgnoreAdvisories"),...this.ignores])),C=Object.create(null);for(let[N,U]of Object.entries(E)){let J=U.filter(te=>!i5.default.isMatch(`${te.id}`,b)&&D.has(te.severity));J.length>0&&(C[N]=J.map(te=>{let le=u.get(N);if(typeof le>"u")throw new Error("Assertion failed: Expected the registry to only return packages that were requested");let ce=[...le.keys()].filter(Ie=>Ur.satisfiesWithPrereleases(Ie,te.vulnerable_versions)),ue=new Map;for(let Ie of ce)for(let he of le.get(Ie))ue.set(he.locatorHash,he);return{...te,versions:ce,dependents:[...ue.values()]}}))}let T=Object.keys(C).length>0;return T?(As.emitTree(t5(C),{configuration:r,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Lt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async N=>{N.reportInfo(1,"No audit suggestions")}),T?1:0)}};Ve();Ve();St();Gt();var s5=et(ni()),o5=ve("util"),XC=class extends ut{constructor(){super(...arguments);this.fields=de.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=de.Rest()}static{this.paths=[["npm","info"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches information about a package from the npm registry and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react@16.12.0","yarn npm info react@16.12.0"],["Show all available information about react@next","yarn npm info react@next"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd),a=typeof this.fields<"u"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],u=!1,A=await Lt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async p=>{for(let h of this.packages){let E;if(h==="."){let le=o.topLevelWorkspace;if(!le.manifest.name)throw new it(`Missing ${pe.pretty(r,"name",pe.Type.CODE)} field in ${Ae.fromPortablePath(V.join(le.cwd,mr.manifest))}`);E=G.makeDescriptor(le.manifest.name,"unknown")}else E=G.parseDescriptor(h);let w=en.getIdentUrl(E),D=a5(await en.get(w,{configuration:r,ident:E,jsonResponse:!0,customErrorMessage:en.customPackageError})),b=Object.keys(D.versions).sort(s5.default.compareLoose),T=D["dist-tags"].latest||b[b.length-1],N=Ur.validRange(E.range);if(N){let le=s5.default.maxSatisfying(b,N);le!==null?T=le:(p.reportWarning(0,`Unmet range ${G.prettyRange(r,E.range)}; falling back to the latest version`),u=!0)}else Object.hasOwn(D["dist-tags"],E.range)?T=D["dist-tags"][E.range]:E.range!=="unknown"&&(p.reportWarning(0,`Unknown tag ${G.prettyRange(r,E.range)}; falling back to the latest version`),u=!0);let U=D.versions[T],J={...D,...U,version:T,versions:b},te;if(a!==null){te={};for(let le of a){let ce=J[le];if(typeof ce<"u")te[le]=ce;else{p.reportWarning(1,`The ${pe.pretty(r,le,pe.Type.CODE)} field doesn't exist inside ${G.prettyIdent(r,E)}'s information`),u=!0;continue}}}else this.json||(delete J.dist,delete J.readme,delete J.users),te=J;p.reportJson(te),this.json||n.push(te)}});o5.inspect.styles.name="cyan";for(let p of n)(p!==n[0]||u)&&this.context.stdout.write(` -`),this.context.stdout.write(`${(0,o5.inspect)(p,{depth:1/0,colors:!0,compact:!1})} -`);return A.exitCode()}};function a5(t){if(Array.isArray(t)){let e=[];for(let r of t)r=a5(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let o=a5(t[r]);o&&(e[r]=o)}return e}else return t||null}Ve();Ve();Gt();var tve=et(Q2()),ZC=class extends ut{constructor(){super(...arguments);this.scope=de.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=de.Boolean("--publish",!1,{description:"Login to the publish registry"});this.alwaysAuth=de.Boolean("--always-auth",{description:"Set the npmAlwaysAuth configuration"})}static{this.paths=[["npm","login"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=await bF({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Lt.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async n=>{let u=await Ivt({configuration:r,registry:o,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),A=await Evt(o,u,r);return await Cvt(o,A,{alwaysAuth:this.alwaysAuth,scope:this.scope}),n.reportInfo(0,"Successfully logged in")})).exitCode()}};async function bF({scope:t,publish:e,configuration:r,cwd:o}){return t&&e?si.getScopeRegistry(t,{configuration:r,type:si.RegistryType.PUBLISH_REGISTRY}):t?si.getScopeRegistry(t,{configuration:r}):e?si.getPublishRegistry((await aE(r,o)).manifest,{configuration:r}):si.getDefaultRegistry({configuration:r})}async function Evt(t,e,r){let o=`/-/user/org.couchdb.user:${encodeURIComponent(e.name)}`,a={_id:`org.couchdb.user:${e.name}`,name:e.name,password:e.password,type:"user",roles:[],date:new Date().toISOString()},n={attemptedAs:e.name,configuration:r,registry:t,jsonResponse:!0,authType:en.AuthType.NO_AUTH};try{return(await en.put(o,a,n)).token}catch(E){if(!(E.originalError?.name==="HTTPError"&&E.originalError?.response.statusCode===409))throw E}let u={...n,authType:en.AuthType.NO_AUTH,headers:{authorization:`Basic ${Buffer.from(`${e.name}:${e.password}`).toString("base64")}`}},A=await en.get(o,u);for(let[E,w]of Object.entries(A))(!a[E]||E==="roles")&&(a[E]=w);let p=`${o}/-rev/${a._rev}`;return(await en.put(p,a,u)).token}async function Cvt(t,e,{alwaysAuth:r,scope:o}){let a=u=>A=>{let p=qe.isIndexableObject(A)?A:{},h=p[u],E=qe.isIndexableObject(h)?h:{};return{...p,[u]:{...E,...r!==void 0?{npmAlwaysAuth:r}:{},npmAuthToken:e}}},n=o?{npmScopes:a(o)}:{npmRegistries:a(t)};return await ze.updateHomeConfiguration(n)}async function Ivt({configuration:t,registry:e,report:r,stdin:o,stdout:a}){r.reportInfo(0,`Logging in to ${pe.pretty(t,e,pe.Type.URL)}`);let n=!1;if(e.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(r.reportInfo(0,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),r.reportSeparator(),t.env.YARN_IS_TEST_ENV)return{name:t.env.YARN_INJECT_NPM_USER||"",password:t.env.YARN_INJECT_NPM_PASSWORD||""};let u=await(0,tve.prompt)([{type:"input",name:"name",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a}]);return r.reportSeparator(),u}Ve();Ve();Gt();var $C=new Set(["npmAuthIdent","npmAuthToken"]),eI=class extends ut{constructor(){super(...arguments);this.scope=de.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=de.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=de.Boolean("-A,--all",!1,{description:"Logout of all registries"})}static{this.paths=[["npm","logout"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=async()=>{let n=await bF({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),u=await ze.find(this.context.cwd,this.context.plugins),A=G.makeIdent(this.scope??null,"pkg");return!si.getAuthConfiguration(n,{configuration:u,ident:A}).get("npmAuthToken")};return(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{if(this.all&&(await Bvt(),n.reportInfo(0,"Successfully logged out from everything")),this.scope){await rve("npmScopes",this.scope),await o()?n.reportInfo(0,`Successfully logged out from ${this.scope}`):n.reportWarning(0,"Scope authentication settings removed, but some other ones settings still apply to it");return}let u=await bF({configuration:r,cwd:this.context.cwd,publish:this.publish});await rve("npmRegistries",u),await o()?n.reportInfo(0,`Successfully logged out from ${u}`):n.reportWarning(0,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};function wvt(t,e){let r=t[e];if(!qe.isIndexableObject(r))return!1;let o=new Set(Object.keys(r));if([...$C].every(n=>!o.has(n)))return!1;for(let n of $C)o.delete(n);if(o.size===0)return t[e]=void 0,!0;let a={...r};for(let n of $C)delete a[n];return t[e]=a,!0}async function Bvt(){let t=e=>{let r=!1,o=qe.isIndexableObject(e)?{...e}:{};o.npmAuthToken&&(delete o.npmAuthToken,r=!0);for(let a of Object.keys(o))wvt(o,a)&&(r=!0);if(Object.keys(o).length!==0)return r?o:e};return await ze.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function rve(t,e){return await ze.updateHomeConfiguration({[t]:r=>{let o=qe.isIndexableObject(r)?r:{};if(!Object.hasOwn(o,e))return r;let a=o[e],n=qe.isIndexableObject(a)?a:{},u=new Set(Object.keys(n));if([...$C].every(p=>!u.has(p)))return r;for(let p of $C)u.delete(p);if(u.size===0)return Object.keys(o).length===1?void 0:{...o,[e]:void 0};let A={};for(let p of $C)A[p]=void 0;return{...o,[e]:{...n,...A}}}})}Ve();Gt();var tI=class extends ut{constructor(){super(...arguments);this.access=de.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=de.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=de.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=de.String("--otp",{description:"The OTP token to use with the command"})}static{this.paths=[["npm","publish"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overridden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);if(a.manifest.private)throw new it("Private workspaces cannot be published");if(a.manifest.name===null||a.manifest.version===null)throw new it("Workspaces must have valid names and versions to be published on an external registry");await o.restoreInstallState();let n=a.manifest.name,u=a.manifest.version,A=si.getPublishRegistry(a.manifest,{configuration:r});return(await Lt.start({configuration:r,stdout:this.context.stdout},async h=>{if(this.tolerateRepublish)try{let E=await en.get(en.getIdentUrl(n),{configuration:r,registry:A,ident:n,jsonResponse:!0});if(!Object.hasOwn(E,"versions"))throw new Jt(15,'Registry returned invalid data for - missing "versions" field');if(Object.hasOwn(E.versions,u)){h.reportWarning(0,`Registry already knows about version ${u}; skipping.`);return}}catch(E){if(E.originalError?.response?.statusCode!==404)throw E}await hn.maybeExecuteWorkspaceLifecycleScript(a,"prepublish",{report:h}),await BA.prepareForPack(a,{report:h},async()=>{let E=await BA.genPackList(a);for(let T of E)h.reportInfo(null,T);let w=await BA.genPackStream(a,E),D=await qe.bufferStream(w),b=await KC.getGitHead(a.cwd),C=await KC.makePublishBody(a,D,{access:this.access,tag:this.tag,registry:A,gitHead:b});await en.put(en.getIdentUrl(n),C,{configuration:r,registry:A,ident:n,otp:this.otp,jsonResponse:!0})}),h.reportInfo(0,"Package archive published")})).exitCode()}};Ve();Gt();var nve=et(ni());Ve();St();Gt();var rI=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=de.String({required:!1})}static{this.paths=[["npm","tag","list"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` - This command will list all tags of a package from the npm registry. - - If the package is not specified, Yarn will default to the current workspace. - `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n;if(typeof this.package<"u")n=G.parseIdent(this.package);else{if(!a)throw new or(o.cwd,this.context.cwd);if(!a.manifest.name)throw new it(`Missing 'name' field in ${Ae.fromPortablePath(V.join(a.cwd,mr.manifest))}`);n=a.manifest.name}let u=await Zv(n,r),p={children:qe.sortMap(Object.entries(u),([h])=>h).map(([h,E])=>({value:pe.tuple(pe.Type.RESOLUTION,{descriptor:G.makeDescriptor(n,h),locator:G.makeLocator(n,E)})}))};return As.emitTree(p,{configuration:r,json:this.json,stdout:this.context.stdout})}};async function Zv(t,e){let r=`/-/package${en.getIdentUrl(t)}/dist-tags`;return en.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:en.customPackageError})}var nI=class extends ut{constructor(){super(...arguments);this.package=de.String();this.tag=de.String()}static{this.paths=[["npm","tag","add"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` - This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. - `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);let n=G.parseDescriptor(this.package,!0),u=n.range;if(!nve.default.valid(u))throw new it(`The range ${pe.pretty(r,n.range,pe.Type.RANGE)} must be a valid semver version`);let A=si.getPublishRegistry(a.manifest,{configuration:r}),p=pe.pretty(r,n,pe.Type.IDENT),h=pe.pretty(r,u,pe.Type.RANGE),E=pe.pretty(r,this.tag,pe.Type.CODE);return(await Lt.start({configuration:r,stdout:this.context.stdout},async D=>{let b=await Zv(n,r);Object.hasOwn(b,this.tag)&&b[this.tag]===u&&D.reportWarning(0,`Tag ${E} is already set to version ${h}`);let C=`/-/package${en.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await en.put(C,u,{configuration:r,registry:A,ident:n,jsonRequest:!0,jsonResponse:!0}),D.reportInfo(0,`Tag ${E} added to version ${h} of package ${p}`)})).exitCode()}};Ve();Gt();var iI=class extends ut{constructor(){super(...arguments);this.package=de.String();this.tag=de.String()}static{this.paths=[["npm","tag","remove"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` - This command will remove a tag from a package from the npm registry. - `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]})}async execute(){if(this.tag==="latest")throw new it("The 'latest' tag cannot be removed.");let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);let n=G.parseIdent(this.package),u=si.getPublishRegistry(a.manifest,{configuration:r}),A=pe.pretty(r,this.tag,pe.Type.CODE),p=pe.pretty(r,n,pe.Type.IDENT),h=await Zv(n,r);if(!Object.hasOwn(h,this.tag))throw new it(`${A} is not a tag of package ${p}`);return(await Lt.start({configuration:r,stdout:this.context.stdout},async w=>{let D=`/-/package${en.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await en.del(D,{configuration:r,registry:u,ident:n,jsonResponse:!0}),w.reportInfo(0,`Tag ${A} removed from package ${p}`)})).exitCode()}};Ve();Ve();Gt();var sI=class extends ut{constructor(){super(...arguments);this.scope=de.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=de.Boolean("--publish",!1,{description:"Print username for the publish registry"})}static{this.paths=[["npm","whoami"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o;return this.scope&&this.publish?o=si.getScopeRegistry(this.scope,{configuration:r,type:si.RegistryType.PUBLISH_REGISTRY}):this.scope?o=si.getScopeRegistry(this.scope,{configuration:r}):this.publish?o=si.getPublishRegistry((await aE(r,this.context.cwd)).manifest,{configuration:r}):o=si.getDefaultRegistry({configuration:r}),(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{let u;try{u=await en.get("/-/whoami",{configuration:r,registry:o,authType:en.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?G.makeIdent(this.scope,""):void 0})}catch(A){if(A.response?.statusCode===401||A.response?.statusCode===403){n.reportError(41,"Authentication failed - your credentials may have expired");return}else throw A}n.reportInfo(0,u.username)})).exitCode()}};var vvt={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:"STRING",default:null},npmAuditExcludePackages:{description:"Array of glob patterns of packages to exclude from npm audit",type:"STRING",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:"Array of glob patterns of advisory IDs to exclude from npm audit",type:"STRING",default:[],isArray:!0}},commands:[zC,XC,ZC,eI,tI,nI,rI,iI,sI]},Dvt=vvt;var g5={};Vt(g5,{PatchCommand:()=>AI,PatchCommitCommand:()=>uI,PatchFetcher:()=>nD,PatchResolver:()=>iD,default:()=>jvt,patchUtils:()=>Id});Ve();Ve();St();sA();var Id={};Vt(Id,{applyPatchFile:()=>QF,diffFolders:()=>p5,ensureUnpatchedDescriptor:()=>c5,ensureUnpatchedLocator:()=>RF,extractPackageToDisk:()=>f5,extractPatchFlags:()=>uve,isParentRequired:()=>A5,isPatchDescriptor:()=>FF,isPatchLocator:()=>i0,loadPatchFiles:()=>rD,makeDescriptor:()=>TF,makeLocator:()=>u5,makePatchHash:()=>h5,parseDescriptor:()=>eD,parseLocator:()=>tD,parsePatchFile:()=>$v,unpatchDescriptor:()=>_vt,unpatchLocator:()=>Hvt});Ve();St();Ve();St();var Svt=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function oI(t){return V.relative(Bt.root,V.resolve(Bt.root,Ae.toPortablePath(t)))}function Pvt(t){let e=t.trim().match(Svt);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var xvt=420,bvt=493;var ive=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),kvt=t=>({header:Pvt(t),parts:[]}),Qvt={"@":"header","-":"deletion","+":"insertion"," ":"context","\\":"pragma",undefined:"context"};function Fvt(t){let e=[],r=ive(),o="parsing header",a=null,n=null;function u(){a&&(n&&(a.parts.push(n),n=null),r.hunks.push(a),a=null)}function A(){u(),e.push(r),r=ive()}for(let p=0;p0?"patch":"mode change",J=null;switch(U){case"rename":{if(!E||!w)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:o,fromPath:oI(E),toPath:oI(w)}),J=w}break;case"file deletion":{let te=a||C;if(!te)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:o,hunk:N&&N[0]||null,path:oI(te),mode:kF(p),hash:D})}break;case"file creation":{let te=n||T;if(!te)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:o,hunk:N&&N[0]||null,path:oI(te),mode:kF(h),hash:b})}break;case"patch":case"mode change":J=T||n;break;default:qe.assertNever(U);break}J&&u&&A&&u!==A&&e.push({type:"mode change",semverExclusivity:o,path:oI(J),oldMode:kF(u),newMode:kF(A)}),J&&N&&N.length&&e.push({type:"patch",semverExclusivity:o,path:oI(J),hunks:N,beforeHash:D,afterHash:b})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function kF(t){let e=parseInt(t,8)&511;if(e!==xvt&&e!==bvt)throw new Error(`Unexpected file mode string: ${t}`);return e}function $v(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),Rvt(Fvt(e))}function Tvt(t){let e=0,r=0;for(let{type:o,lines:a}of t.parts)switch(o){case"context":r+=a.length,e+=a.length;break;case"deletion":e+=a.length;break;case"insertion":r+=a.length;break;default:qe.assertNever(o);break}if(e!==t.header.original.length||r!==t.header.patched.length){let o=a=>a<0?a:`+${a}`;throw new Error(`hunk header integrity check failed (expected @@ ${o(t.header.original.length)} ${o(t.header.patched.length)} @@, got @@ ${o(e)} ${o(r)} @@)`)}}Ve();St();var aI=class extends Error{constructor(r,o){super(`Cannot apply hunk #${r+1}`);this.hunk=o}};async function lI(t,e,r){let o=await t.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await t.lutimesPromise(e,o.atime,o.mtime)}async function QF(t,{baseFs:e=new _n,dryRun:r=!1,version:o=null}={}){for(let a of t)if(!(a.semverExclusivity!==null&&o!==null&&!Ur.satisfiesWithPrereleases(o,a.semverExclusivity)))switch(a.type){case"file deletion":if(r){if(!e.existsSync(a.path))throw new Error(`Trying to delete a file that doesn't exist: ${a.path}`)}else await lI(e,V.dirname(a.path),async()=>{await e.unlinkPromise(a.path)});break;case"rename":if(r){if(!e.existsSync(a.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${a.fromPath}`)}else await lI(e,V.dirname(a.fromPath),async()=>{await lI(e,V.dirname(a.toPath),async()=>{await lI(e,a.fromPath,async()=>(await e.movePromise(a.fromPath,a.toPath),a.toPath))})});break;case"file creation":if(r){if(e.existsSync(a.path))throw new Error(`Trying to create a file that already exists: ${a.path}`)}else{let n=a.hunk?a.hunk.parts[0].lines.join(` -`)+(a.hunk.parts[0].noNewlineAtEndOfFile?"":` -`):"";await e.mkdirpPromise(V.dirname(a.path),{chmod:493,utimes:[Si.SAFE_TIME,Si.SAFE_TIME]}),await e.writeFilePromise(a.path,n,{mode:a.mode}),await e.utimesPromise(a.path,Si.SAFE_TIME,Si.SAFE_TIME)}break;case"patch":await lI(e,a.path,async()=>{await Ovt(a,{baseFs:e,dryRun:r})});break;case"mode change":{let u=(await e.statPromise(a.path)).mode;if(sve(a.newMode)!==sve(u))continue;await lI(e,a.path,async()=>{await e.chmodPromise(a.path,a.newMode)})}break;default:qe.assertNever(a);break}}function sve(t){return(t&64)>0}function ove(t){return t.replace(/\s+$/,"")}function Nvt(t,e){return ove(t)===ove(e)}async function Ovt({hunks:t,path:e},{baseFs:r,dryRun:o=!1}){let a=await r.statSync(e).mode,u=(await r.readFileSync(e,"utf8")).split(/\n/),A=[],p=0,h=0;for(let w of t){let D=Math.max(h,w.header.patched.start+p),b=Math.max(0,D-h),C=Math.max(0,u.length-D-w.header.original.length),T=Math.max(b,C),N=0,U=0,J=null;for(;N<=T;){if(N<=b&&(U=D-N,J=ave(w,u,U),J!==null)){N=-N;break}if(N<=C&&(U=D+N,J=ave(w,u,U),J!==null))break;N+=1}if(J===null)throw new aI(t.indexOf(w),w);A.push(J),p+=N,h=U+w.header.original.length}if(o)return;let E=0;for(let w of A)for(let D of w)switch(D.type){case"splice":{let b=D.index+E;u.splice(b,D.numToDelete,...D.linesToInsert),E+=D.linesToInsert.length-D.numToDelete}break;case"pop":u.pop();break;case"push":u.push(D.line);break;default:qe.assertNever(D);break}await r.writeFilePromise(e,u.join(` -`),{mode:a})}function ave(t,e,r){let o=[];for(let a of t.parts)switch(a.type){case"context":case"deletion":{for(let n of a.lines){let u=e[r];if(u==null||!Nvt(u,n))return null;r+=1}a.type==="deletion"&&(o.push({type:"splice",index:r-a.lines.length,numToDelete:a.lines.length,linesToInsert:[]}),a.noNewlineAtEndOfFile&&o.push({type:"push",line:""}))}break;case"insertion":o.push({type:"splice",index:r,numToDelete:0,linesToInsert:a.lines}),a.noNewlineAtEndOfFile&&o.push({type:"pop"});break;default:qe.assertNever(a.type);break}return o}var Uvt=/^builtin<([^>]+)>$/;function cI(t,e){let{protocol:r,source:o,selector:a,params:n}=G.parseRange(t);if(r!=="patch:")throw new Error("Invalid patch range");if(o===null)throw new Error("Patch locators must explicitly define their source");let u=a?a.split(/&/).map(E=>Ae.toPortablePath(E)):[],A=n&&typeof n.locator=="string"?G.parseLocator(n.locator):null,p=n&&typeof n.version=="string"?n.version:null,h=e(o);return{parentLocator:A,sourceItem:h,patchPaths:u,sourceVersion:p}}function FF(t){return t.range.startsWith("patch:")}function i0(t){return t.reference.startsWith("patch:")}function eD(t){let{sourceItem:e,...r}=cI(t.range,G.parseDescriptor);return{...r,sourceDescriptor:e}}function tD(t){let{sourceItem:e,...r}=cI(t.reference,G.parseLocator);return{...r,sourceLocator:e}}function _vt(t){let{sourceItem:e}=cI(t.range,G.parseDescriptor);return e}function Hvt(t){let{sourceItem:e}=cI(t.reference,G.parseLocator);return e}function c5(t){if(!FF(t))return t;let{sourceItem:e}=cI(t.range,G.parseDescriptor);return e}function RF(t){if(!i0(t))return t;let{sourceItem:e}=cI(t.reference,G.parseLocator);return e}function lve({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:o,patchHash:a},n){let u=t!==null?{locator:G.stringifyLocator(t)}:{},A=typeof o<"u"?{version:o}:{},p=typeof a<"u"?{hash:a}:{};return G.makeRange({protocol:"patch:",source:n(e),selector:r.join("&"),params:{...A,...p,...u}})}function TF(t,{parentLocator:e,sourceDescriptor:r,patchPaths:o}){return G.makeDescriptor(t,lve({parentLocator:e,sourceItem:r,patchPaths:o},G.stringifyDescriptor))}function u5(t,{parentLocator:e,sourcePackage:r,patchPaths:o,patchHash:a}){return G.makeLocator(t,lve({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:o,patchHash:a},G.stringifyLocator))}function cve({onAbsolute:t,onRelative:e,onProject:r,onBuiltin:o},a){let n=a.lastIndexOf("!");n!==-1&&(a=a.slice(n+1));let u=a.match(Uvt);return u!==null?o(u[1]):a.startsWith("~/")?r(a.slice(2)):V.isAbsolute(a)?t(a):e(a)}function uve(t){let e=t.lastIndexOf("!");return{optional:(e!==-1?new Set(t.slice(0,e).split(/!/)):new Set).has("optional")}}function A5(t){return cve({onAbsolute:()=>!1,onRelative:()=>!0,onProject:()=>!1,onBuiltin:()=>!1},t)}async function rD(t,e,r){let o=t!==null?await r.fetcher.fetch(t,r):null,a=o&&o.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,o.localPath)}:o;o&&o!==a&&o.releaseFs&&o.releaseFs();let n=await qe.releaseAfterUseAsync(async()=>await Promise.all(e.map(async u=>{let A=uve(u),p=await cve({onAbsolute:async h=>await ae.readFilePromise(h,"utf8"),onRelative:async h=>{if(a===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await a.packageFs.readFilePromise(V.join(a.prefixPath,h),"utf8")},onProject:async h=>await ae.readFilePromise(V.join(r.project.cwd,h),"utf8"),onBuiltin:async h=>await r.project.configuration.firstHook(E=>E.getBuiltinPatch,r.project,h)},u);return{...A,source:p}})));for(let u of n)typeof u.source=="string"&&(u.source=u.source.replace(/\r\n?/g,` -`));return n}async function f5(t,{cache:e,project:r}){let o=r.storedPackages.get(t.locatorHash);if(typeof o>"u")throw new Error("Assertion failed: Expected the package to be registered");let a=RF(t),n=r.storedChecksums,u=new Ri,A=await ae.mktempPromise(),p=V.join(A,"source"),h=V.join(A,"user"),E=V.join(A,".yarn-patch.json"),w=r.configuration.makeFetcher(),D=[];try{let b,C;if(t.locatorHash===a.locatorHash){let T=await w.fetch(t,{cache:e,project:r,fetcher:w,checksums:n,report:u});D.push(()=>T.releaseFs?.()),b=T,C=T}else b=await w.fetch(t,{cache:e,project:r,fetcher:w,checksums:n,report:u}),D.push(()=>b.releaseFs?.()),C=await w.fetch(t,{cache:e,project:r,fetcher:w,checksums:n,report:u}),D.push(()=>C.releaseFs?.());await Promise.all([ae.copyPromise(p,b.prefixPath,{baseFs:b.packageFs}),ae.copyPromise(h,C.prefixPath,{baseFs:C.packageFs}),ae.writeJsonPromise(E,{locator:G.stringifyLocator(t),version:o.version})])}finally{for(let b of D)b()}return ae.detachTemp(A),h}async function p5(t,e){let r=Ae.fromPortablePath(t).replace(/\\/g,"/"),o=Ae.fromPortablePath(e).replace(/\\/g,"/"),{stdout:a,stderr:n}=await Hr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",r,o],{cwd:Ae.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""}});if(n.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. -The following error was reported by 'git': -${n}`);let u=r.startsWith("/")?A=>A.slice(1):A=>A;return a.replace(new RegExp(`(a|b)(${qe.escapeRegExp(`/${u(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${qe.escapeRegExp(`/${u(o)}/`)}`,"g"),"$1/").replace(new RegExp(qe.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(qe.escapeRegExp(`${o}/`),"g"),"")}function h5(t,e){let r=[];for(let{source:o}of t){if(o===null)continue;let a=$v(o);for(let n of a){let{semverExclusivity:u,...A}=n;u!==null&&e!==null&&!Ur.satisfiesWithPrereleases(e,u)||r.push(JSON.stringify(A))}}return bn.makeHash(`${3}`,...r).slice(0,6)}Ve();function Ave(t,{configuration:e,report:r}){for(let o of t.parts)for(let a of o.lines)switch(o.type){case"context":r.reportInfo(null,` ${pe.pretty(e,a,"grey")}`);break;case"deletion":r.reportError(28,`- ${pe.pretty(e,a,pe.Type.REMOVED)}`);break;case"insertion":r.reportError(28,`+ ${pe.pretty(e,a,pe.Type.ADDED)}`);break;default:qe.assertNever(o.type)}}var nD=class{supports(e,r){return!!i0(e)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async patchPackage(e,r){let{parentLocator:o,sourceLocator:a,sourceVersion:n,patchPaths:u}=tD(e),A=await rD(o,u,r),p=await ae.mktempPromise(),h=V.join(p,"current.zip"),E=await r.fetcher.fetch(a,r),w=G.getIdentVendorPath(e),D=new Zi(h,{create:!0,level:r.project.configuration.get("compressionLevel")});await qe.releaseAfterUseAsync(async()=>{await D.copyPromise(w,E.prefixPath,{baseFs:E.packageFs,stableSort:!0})},E.releaseFs),D.saveAndClose();for(let{source:b,optional:C}of A){if(b===null)continue;let T=new Zi(h,{level:r.project.configuration.get("compressionLevel")}),N=new En(V.resolve(Bt.root,w),{baseFs:T});try{await QF($v(b),{baseFs:N,version:n})}catch(U){if(!(U instanceof aI))throw U;let J=r.project.configuration.get("enableInlineHunks"),te=!J&&!C?" (set enableInlineHunks for details)":"",le=`${G.prettyLocator(r.project.configuration,e)}: ${U.message}${te}`,ce=ue=>{J&&Ave(U.hunk,{configuration:r.project.configuration,report:ue})};if(T.discardAndClose(),C){r.report.reportWarningOnce(66,le,{reportExtra:ce});continue}else throw new Jt(66,le,ce)}T.saveAndClose()}return new Zi(h,{level:r.project.configuration.get("compressionLevel")})}};Ve();var iD=class{supportsDescriptor(e,r){return!!FF(e)}supportsLocator(e,r){return!!i0(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){let{patchPaths:a}=eD(e);return a.every(n=>!A5(n))?e:G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:o}=eD(e);return{sourceDescriptor:r.project.configuration.normalizeDependency(o)}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:a,patchPaths:n}=eD(e),u=await rD(a,n,o.fetchOptions),A=r.sourceDescriptor;if(typeof A>"u")throw new Error("Assertion failed: The dependency should have been resolved");let p=h5(u,A.version);return[u5(e,{parentLocator:a,sourcePackage:A,patchPaths:n,patchHash:p})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let{sourceLocator:o}=tD(e);return{...await r.resolver.resolve(o,r),...e}}};Ve();St();Gt();var uI=class extends ut{constructor(){super(...arguments);this.save=de.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=de.String()}static{this.paths=[["patch-commit"]]}static{this.usage=ot.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let n=V.resolve(this.context.cwd,Ae.toPortablePath(this.patchFolder)),u=V.join(n,"../source"),A=V.join(n,"../.yarn-patch.json");if(!ae.existsSync(u))throw new it("The argument folder didn't get created by 'yarn patch'");let p=await p5(u,n),h=await ae.readJsonPromise(A),E=G.parseLocator(h.locator,!0);if(!o.storedPackages.has(E.locatorHash))throw new it("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(p);return}let w=r.get("patchFolder"),D=V.join(w,`${G.slugifyLocator(E)}.patch`);await ae.mkdirPromise(w,{recursive:!0}),await ae.writeFilePromise(D,p);let b=[],C=new Map;for(let T of o.storedPackages.values()){if(G.isVirtualLocator(T))continue;let N=T.dependencies.get(E.identHash);if(!N)continue;let U=G.ensureDevirtualizedDescriptor(N),J=c5(U),te=o.storedResolutions.get(J.descriptorHash);if(!te)throw new Error("Assertion failed: Expected the resolution to have been registered");if(!o.storedPackages.get(te))throw new Error("Assertion failed: Expected the package to have been registered");let ce=o.tryWorkspaceByLocator(T);if(ce)b.push(ce);else{let ue=o.originalPackages.get(T.locatorHash);if(!ue)throw new Error("Assertion failed: Expected the original package to have been registered");let Ie=ue.dependencies.get(N.identHash);if(!Ie)throw new Error("Assertion failed: Expected the original dependency to have been registered");C.set(Ie.descriptorHash,Ie)}}for(let T of b)for(let N of _t.hardDependencies){let U=T.manifest[N].get(E.identHash);if(!U)continue;let J=TF(U,{parentLocator:null,sourceDescriptor:G.convertLocatorToDescriptor(E),patchPaths:[V.join(mr.home,V.relative(o.cwd,D))]});T.manifest[N].set(U.identHash,J)}for(let T of C.values()){let N=TF(T,{parentLocator:null,sourceDescriptor:G.convertLocatorToDescriptor(E),patchPaths:[V.join(mr.home,V.relative(o.cwd,D))]});o.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:G.stringifyIdent(N),description:T.range}},reference:N.range})}await o.persist()}};Ve();St();Gt();var AI=class extends ut{constructor(){super(...arguments);this.update=de.Boolean("-u,--update",!1,{description:"Reapply local patches that already apply to this packages"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=de.String()}static{this.paths=[["patch"]]}static{this.usage=ot.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n\n Once you're done with your changes, run `yarn patch-commit -s path` (with `path` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n\n Calling the command when you already have a patch won't import it by default (in other words, the default behavior is to reset existing patches). However, adding the `-u,--update` flag will import any current patch.\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let u=G.parseLocator(this.package);if(u.reference==="unknown"){let A=qe.mapAndFilter([...o.storedPackages.values()],p=>p.identHash!==u.identHash?qe.mapAndFilter.skip:G.isVirtualLocator(p)?qe.mapAndFilter.skip:i0(p)!==this.update?qe.mapAndFilter.skip:p);if(A.length===0)throw new it("No package found in the project for the given locator");if(A.length>1)throw new it(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): -${A.map(p=>` -- ${G.prettyLocator(r,p)}`).join("")}`);u=A[0]}if(!o.storedPackages.has(u.locatorHash))throw new it("No package found in the project for the given locator");await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=RF(u),h=await f5(u,{cache:n,project:o});A.reportJson({locator:G.stringifyLocator(p),path:Ae.fromPortablePath(h)});let E=this.update?" along with its current modifications":"";A.reportInfo(0,`Package ${G.prettyLocator(r,p)} got extracted with success${E}!`),A.reportInfo(0,`You can now edit the following folder: ${pe.pretty(r,Ae.fromPortablePath(h),"magenta")}`),A.reportInfo(0,`Once you are done run ${pe.pretty(r,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${Ae.fromPortablePath(h)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};var qvt={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:"BOOLEAN",default:!1},patchFolder:{description:"Folder where the patch files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/patches"}},commands:[uI,AI],fetchers:[nD],resolvers:[iD]},jvt=qvt;var y5={};Vt(y5,{PnpmLinker:()=>sD,default:()=>Kvt});Ve();St();Gt();var sD=class{getCustomDataKey(){return JSON.stringify({name:"PnpmLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new it(`The project in ${pe.pretty(r.project.configuration,`${r.project.cwd}/package.json`,pe.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=a.pathsByLocator.get(e.locatorHash);if(typeof n>"u")throw new it(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return n.packageLocation}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new it(`The project in ${pe.pretty(r.project.configuration,`${r.project.cwd}/package.json`,pe.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(n){let p=a.locatorByPath.get(n[1]);if(p)return p}let u=e,A=e;do{A=u,u=V.dirname(A);let p=a.locatorByPath.get(A);if(p)return p}while(u!==A);return null}makeInstaller(e){return new d5(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},d5=class{constructor(e){this.opts=e;this.asyncActions=new qe.AsyncActions(10);this.customData={pathsByLocator:new Map,locatorByPath:new Map};this.indexFolderPromise=$D(ae,{indexPath:V.join(e.project.configuration.get("globalFolder"),"index")})}attachCustomData(e){}async installPackage(e,r,o){switch(e.linkType){case"SOFT":return this.installPackageSoft(e,r,o);case"HARD":return this.installPackageHard(e,r,o)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,o){let a=V.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.opts.project.tryWorkspaceByLocator(e)?V.join(a,mr.nodeModules):null;return this.customData.pathsByLocator.set(e.locatorHash,{packageLocation:a,dependenciesLocation:n}),{packageLocation:a,buildRequest:null}}async installPackageHard(e,r,o){let a=Gvt(e,{project:this.opts.project}),n=a.packageLocation;this.customData.locatorByPath.set(n,G.stringifyLocator(e)),this.customData.pathsByLocator.set(e.locatorHash,a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await ae.mkdirPromise(n,{recursive:!0}),await ae.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1,linkStrategy:{type:"HardlinkFromIndex",indexPath:await this.indexFolderPromise,autoRepair:!0}})}));let A=G.isVirtualLocator(e)?G.devirtualizeLocator(e):e,p={manifest:await _t.tryFind(r.prefixPath,{baseFs:r.packageFs})??new _t,misc:{hasBindingGyp:CA.hasBindingGyp(r)}},h=this.opts.project.getDependencyMeta(A,e.version),E=CA.extractBuildRequest(e,p,h,{configuration:this.opts.project.configuration});return{packageLocation:n,buildRequest:E}}async attachInternalDependencies(e,r){if(this.opts.project.configuration.get("nodeLinker")!=="pnpm"||!fve(e,{project:this.opts.project}))return;let o=this.customData.pathsByLocator.get(e.locatorHash);if(typeof o>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${G.stringifyLocator(e)})`);let{dependenciesLocation:a}=o;a&&this.asyncActions.reduce(e.locatorHash,async n=>{await ae.mkdirPromise(a,{recursive:!0});let u=await Wvt(a),A=new Map(u),p=[n],h=(w,D)=>{let b=D;fve(D,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),b=G.devirtualizeLocator(D));let C=this.customData.pathsByLocator.get(b.locatorHash);if(typeof C>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${G.stringifyLocator(D)})`);let T=G.stringifyIdent(w),N=V.join(a,T),U=V.relative(V.dirname(N),C.packageLocation),J=A.get(T);A.delete(T),p.push(Promise.resolve().then(async()=>{if(J){if(J.isSymbolicLink()&&await ae.readlinkPromise(N)===U)return;await ae.removePromise(N)}await ae.mkdirpPromise(V.dirname(N)),process.platform=="win32"&&this.opts.project.configuration.get("winLinkType")==="junctions"?await ae.symlinkPromise(C.packageLocation,N,"junction"):await ae.symlinkPromise(U,N)}))},E=!1;for(let[w,D]of r)w.identHash===e.identHash&&(E=!0),h(w,D);!E&&!this.opts.project.tryWorkspaceByLocator(e)&&h(G.convertLocatorToDescriptor(e),e),p.push(Yvt(a,A)),await Promise.all(p)})}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=hve(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await ae.removePromise(e);else{let r;try{r=new Set(await ae.readdirPromise(e))}catch{r=new Set}for(let{dependenciesLocation:o}of this.customData.pathsByLocator.values()){if(!o)continue;let a=V.contains(e,o);if(a===null)continue;let[n]=a.split(V.sep);r.delete(n)}await Promise.all([...r].map(async o=>{await ae.removePromise(V.join(e,o))}))}return await this.asyncActions.wait(),await m5(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await m5(pve(this.opts.project)),{customData:this.customData}}};function pve(t){return V.join(t.cwd,mr.nodeModules)}function hve(t){return V.join(pve(t),".store")}function Gvt(t,{project:e}){let r=G.slugifyLocator(t),o=hve(e),a=V.join(o,r,"package"),n=V.join(o,r,mr.nodeModules);return{packageLocation:a,dependenciesLocation:n}}function fve(t,{project:e}){return!G.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function Wvt(t){let e=new Map,r=[];try{r=await ae.readdirPromise(t,{withFileTypes:!0})}catch(o){if(o.code!=="ENOENT")throw o}try{for(let o of r)if(!o.name.startsWith("."))if(o.name.startsWith("@")){let a=await ae.readdirPromise(V.join(t,o.name),{withFileTypes:!0});if(a.length===0)e.set(o.name,o);else for(let n of a)e.set(`${o.name}/${n.name}`,n)}else e.set(o.name,o)}catch(o){if(o.code!=="ENOENT")throw o}return e}async function Yvt(t,e){let r=[],o=new Set;for(let a of e.keys()){r.push(ae.removePromise(V.join(t,a)));let n=G.tryParseIdent(a)?.scope;n&&o.add(`@${n}`)}return Promise.all(r).then(()=>Promise.all([...o].map(a=>m5(V.join(t,a)))))}async function m5(t){try{await ae.rmdirPromise(t)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY")throw e}}var Vvt={linkers:[sD]},Kvt=Vvt;var D5={};Vt(D5,{StageCommand:()=>fI,default:()=>sDt,stageUtils:()=>NF});Ve();St();Gt();Ve();St();var NF={};Vt(NF,{ActionType:()=>E5,checkConsensus:()=>LF,expandDirectory:()=>w5,findConsensus:()=>B5,findVcsRoot:()=>C5,genCommitMessage:()=>v5,getCommitPrefix:()=>gve,isYarnFile:()=>I5});St();var E5=(n=>(n[n.CREATE=0]="CREATE",n[n.DELETE=1]="DELETE",n[n.ADD=2]="ADD",n[n.REMOVE=3]="REMOVE",n[n.MODIFY=4]="MODIFY",n))(E5||{});async function C5(t,{marker:e}){do if(!ae.existsSync(V.join(t,e)))t=V.dirname(t);else return t;while(t!=="/");return null}function I5(t,{roots:e,names:r}){if(r.has(V.basename(t)))return!0;do if(!e.has(t))t=V.dirname(t);else return!0;while(t!=="/");return!1}function w5(t){let e=[],r=[t];for(;r.length>0;){let o=r.pop(),a=ae.readdirSync(o);for(let n of a){let u=V.resolve(o,n);ae.lstatSync(u).isDirectory()?r.push(u):e.push(u)}}return e}function LF(t,e){let r=0,o=0;for(let a of t)a!=="wip"&&(e.test(a)?r+=1:o+=1);return r>=o}function B5(t){let e=LF(t,/^(\w\(\w+\):\s*)?\w+s/),r=LF(t,/^(\w\(\w+\):\s*)?[A-Z]/),o=LF(t,/^\w\(\w+\):/);return{useThirdPerson:e,useUpperCase:r,useComponent:o}}function gve(t){return t.useComponent?"chore(yarn): ":""}var Jvt=new Map([[0,"create"],[1,"delete"],[2,"add"],[3,"remove"],[4,"update"]]);function v5(t,e){let r=gve(t),o=[],a=e.slice().sort((n,u)=>n[0]-u[0]);for(;a.length>0;){let[n,u]=a.shift(),A=Jvt.get(n);t.useUpperCase&&o.length===0&&(A=`${A[0].toUpperCase()}${A.slice(1)}`),t.useThirdPerson&&(A+="s");let p=[u];for(;a.length>0&&a[0][0]===n;){let[,E]=a.shift();p.push(E)}p.sort();let h=p.shift();p.length===1?h+=" (and one other)":p.length>1&&(h+=` (and ${p.length} others)`),o.push(`${A} ${h}`)}return`${r}${o.join(", ")}`}var zvt="Commit generated via `yarn stage`",Xvt=11;async function dve(t){let{code:e,stdout:r}=await Hr.execvp("git",["log","-1","--pretty=format:%H"],{cwd:t});return e===0?r.trim():null}async function Zvt(t,e){let r=[],o=e.filter(h=>V.basename(h.path)==="package.json");for(let{action:h,path:E}of o){let w=V.relative(t,E);if(h===4){let D=await dve(t),{stdout:b}=await Hr.execvp("git",["show",`${D}:${w}`],{cwd:t,strict:!0}),C=await _t.fromText(b),T=await _t.fromFile(E),N=new Map([...T.dependencies,...T.devDependencies]),U=new Map([...C.dependencies,...C.devDependencies]);for(let[J,te]of U){let le=G.stringifyIdent(te),ce=N.get(J);ce?ce.range!==te.range&&r.push([4,`${le} to ${ce.range}`]):r.push([3,le])}for(let[J,te]of N)U.has(J)||r.push([2,G.stringifyIdent(te)])}else if(h===0){let D=await _t.fromFile(E);D.name?r.push([0,G.stringifyIdent(D.name)]):r.push([0,"a package"])}else if(h===1){let D=await dve(t),{stdout:b}=await Hr.execvp("git",["show",`${D}:${w}`],{cwd:t,strict:!0}),C=await _t.fromText(b);C.name?r.push([1,G.stringifyIdent(C.name)]):r.push([1,"a package"])}else throw new Error("Assertion failed: Unsupported action type")}let{code:a,stdout:n}=await Hr.execvp("git",["log",`-${Xvt}`,"--pretty=format:%s"],{cwd:t}),u=a===0?n.split(/\n/g).filter(h=>h!==""):[],A=B5(u);return v5(A,r)}var $vt={0:[" A ","?? "],4:[" M "],1:[" D "]},eDt={0:["A "],4:["M "],1:["D "]},mve={async findRoot(t){return await C5(t,{marker:".git"})},async filterChanges(t,e,r,o){let{stdout:a}=await Hr.execvp("git",["status","-s"],{cwd:t,strict:!0}),n=a.toString().split(/\n/g),u=o?.staged?eDt:$vt;return[].concat(...n.map(p=>{if(p==="")return[];let h=p.slice(0,3),E=V.resolve(t,p.slice(3));if(!o?.staged&&h==="?? "&&p.endsWith("/"))return w5(E).map(w=>({action:0,path:w}));{let D=[0,4,1].find(b=>u[b].includes(h));return D!==void 0?[{action:D,path:E}]:[]}})).filter(p=>I5(p.path,{roots:e,names:r}))},async genCommitMessage(t,e){return await Zvt(t,e)},async makeStage(t,e){let r=e.map(o=>Ae.fromPortablePath(o.path));await Hr.execvp("git",["add","--",...r],{cwd:t,strict:!0})},async makeCommit(t,e,r){let o=e.map(a=>Ae.fromPortablePath(a.path));await Hr.execvp("git",["add","-N","--",...o],{cwd:t,strict:!0}),await Hr.execvp("git",["commit","-m",`${r} - -${zvt} -`,"--",...o],{cwd:t,strict:!0})},async makeReset(t,e){let r=e.map(o=>Ae.fromPortablePath(o.path));await Hr.execvp("git",["reset","HEAD","--",...r],{cwd:t,strict:!0})}};var tDt=[mve],fI=class extends ut{constructor(){super(...arguments);this.commit=de.Boolean("-c,--commit",!1,{description:"Commit the staged files"});this.reset=de.Boolean("-r,--reset",!1,{description:"Remove all files from the staging area"});this.dryRun=de.Boolean("-n,--dry-run",!1,{description:"Print the commit message and the list of modified files without staging / committing"});this.update=de.Boolean("-u,--update",!1,{hidden:!0})}static{this.paths=[["stage"]]}static{this.usage=ot.Usage({description:"add all yarn files to your vcs",details:"\n This command will add to your staging area the files belonging to Yarn (typically any modified `package.json` and `.yarnrc.yml` files, but also linker-generated files, cache data, etc). It will take your ignore list into account, so the cache files won't be added if the cache is ignored in a `.gitignore` file (assuming you use Git).\n\n Running `--reset` will instead remove them from the staging area (the changes will still be there, but won't be committed until you stage them back).\n\n Since the staging area is a non-existent concept in Mercurial, Yarn will always create a new commit when running this command on Mercurial repositories. You can get this behavior when using Git by using the `--commit` flag which will directly create a commit.\n ",examples:[["Adds all modified project files to the staging area","yarn stage"],["Creates a new commit containing all modified project files","yarn stage --commit"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd),{driver:a,root:n}=await rDt(o.cwd),u=[r.get("cacheFolder"),r.get("globalFolder"),r.get("virtualFolder"),r.get("yarnPath")];await r.triggerHook(w=>w.populateYarnPaths,o,w=>{u.push(w)});let A=new Set;for(let w of u)for(let D of nDt(n,w))A.add(D);let p=new Set([r.get("rcFilename"),mr.lockfile,mr.manifest]),h=await a.filterChanges(n,A,p),E=await a.genCommitMessage(n,h);if(this.dryRun)if(this.commit)this.context.stdout.write(`${E} -`);else for(let w of h)this.context.stdout.write(`${Ae.fromPortablePath(w.path)} -`);else if(this.reset){let w=await a.filterChanges(n,A,p,{staged:!0});w.length===0?this.context.stdout.write("No staged changes found!"):await a.makeReset(n,w)}else h.length===0?this.context.stdout.write("No changes found!"):this.commit?await a.makeCommit(n,h,E):(await a.makeStage(n,h),this.context.stdout.write(E))}};async function rDt(t){let e=null,r=null;for(let o of tDt)if((r=await o.findRoot(t))!==null){e=o;break}if(e===null||r===null)throw new it("No stage driver has been found for your current project");return{driver:e,root:r}}function nDt(t,e){let r=[];if(e===null)return r;for(;;){(e===t||e.startsWith(`${t}/`))&&r.push(e);let o;try{o=ae.statSync(e)}catch{break}if(o.isSymbolicLink())e=V.resolve(V.dirname(e),ae.readlinkSync(e));else break}return r}var iDt={commands:[fI]},sDt=iDt;var S5={};Vt(S5,{default:()=>pDt});Ve();Ve();St();var Cve=et(ni());Ve();var yve=et(N6()),oDt="e8e1bd300d860104bb8c58453ffa1eb4",aDt="OFCNCOG2CU",Eve=async(t,e)=>{let r=G.stringifyIdent(t),a=lDt(e).initIndex("npm-search");try{return(await a.getObject(r,{attributesToRetrieve:["types"]})).types?.ts==="definitely-typed"}catch{return!1}},lDt=t=>(0,yve.default)(aDt,oDt,{requester:{async send(r){try{let o=await on.request(r.url,r.data||null,{configuration:t,headers:r.headers});return{content:o.body,isTimedOut:!1,status:o.statusCode}}catch(o){return{content:o.response.body,isTimedOut:!1,status:o.response.statusCode}}}}});var Ive=t=>t.scope?`${t.scope}__${t.name}`:`${t.name}`,cDt=async(t,e,r,o)=>{if(r.scope==="types")return;let{project:a}=t,{configuration:n}=a;if(!(n.get("tsEnableAutoTypes")??(ae.existsSync(V.join(t.cwd,"tsconfig.json"))||ae.existsSync(V.join(a.cwd,"tsconfig.json")))))return;let A=n.makeResolver(),p={project:a,resolver:A,report:new Ri};if(!await Eve(r,n))return;let E=Ive(r),w=G.parseRange(r.range).selector;if(!Ur.validRange(w)){let N=n.normalizeDependency(r),U=await A.getCandidates(N,{},p);w=G.parseRange(U[0].reference).selector}let D=Cve.default.coerce(w);if(D===null)return;let b=`${nu.Modifier.CARET}${D.major}`,C=G.makeDescriptor(G.makeIdent("types",E),b),T=qe.mapAndFind(a.workspaces,N=>{let U=N.manifest.dependencies.get(r.identHash)?.descriptorHash,J=N.manifest.devDependencies.get(r.identHash)?.descriptorHash;if(U!==r.descriptorHash&&J!==r.descriptorHash)return qe.mapAndFind.skip;let te=[];for(let le of _t.allDependencies){let ce=N.manifest[le].get(C.identHash);typeof ce>"u"||te.push([le,ce])}return te.length===0?qe.mapAndFind.skip:te});if(typeof T<"u")for(let[N,U]of T)t.manifest[N].set(U.identHash,U);else{try{let N=n.normalizeDependency(C);if((await A.getCandidates(N,{},p)).length===0)return}catch{return}t.manifest[nu.Target.DEVELOPMENT].set(C.identHash,C)}},uDt=async(t,e,r)=>{if(r.scope==="types")return;let{project:o}=t,{configuration:a}=o;if(!(a.get("tsEnableAutoTypes")??(ae.existsSync(V.join(t.cwd,"tsconfig.json"))||ae.existsSync(V.join(o.cwd,"tsconfig.json")))))return;let u=Ive(r),A=G.makeIdent("types",u);for(let p of _t.allDependencies)typeof t.manifest[p].get(A.identHash)>"u"||t.manifest[p].delete(A.identHash)},ADt=(t,e)=>{e.publishConfig&&e.publishConfig.typings&&(e.typings=e.publishConfig.typings),e.publishConfig&&e.publishConfig.types&&(e.types=e.publishConfig.types)},fDt={configuration:{tsEnableAutoTypes:{description:"Whether Yarn should auto-install @types/ dependencies on 'yarn add'",type:"BOOLEAN",isNullable:!0,default:null}},hooks:{afterWorkspaceDependencyAddition:cDt,afterWorkspaceDependencyRemoval:uDt,beforeWorkspacePacking:ADt}},pDt=fDt;var Q5={};Vt(Q5,{VersionApplyCommand:()=>mI,VersionCheckCommand:()=>yI,VersionCommand:()=>EI,default:()=>FDt,versionUtils:()=>dI});Ve();Ve();Gt();var dI={};Vt(dI,{Decision:()=>hI,applyPrerelease:()=>Pve,applyReleases:()=>k5,applyStrategy:()=>MF,clearVersionFiles:()=>P5,getUndecidedDependentWorkspaces:()=>aD,getUndecidedWorkspaces:()=>OF,openVersionFile:()=>gI,requireMoreDecisions:()=>bDt,resolveVersionFiles:()=>oD,suggestStrategy:()=>b5,updateVersionFiles:()=>x5,validateReleaseDecision:()=>pI});Ve();St();Ol();Gt();var Sve=et(Dve()),SA=et(ni()),xDt=/^(>=|[~^]|)(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/,hI=(u=>(u.UNDECIDED="undecided",u.DECLINE="decline",u.MAJOR="major",u.MINOR="minor",u.PATCH="patch",u.PRERELEASE="prerelease",u))(hI||{});function pI(t){let e=SA.default.valid(t);return e||qe.validateEnum((0,Sve.default)(hI,"UNDECIDED"),t)}async function oD(t,{prerelease:e=null}={}){let r=new Map,o=t.configuration.get("deferredVersionFolder");if(!ae.existsSync(o))return r;let a=await ae.readdirPromise(o);for(let n of a){if(!n.endsWith(".yml"))continue;let u=V.join(o,n),A=await ae.readFilePromise(u,"utf8"),p=Vi(A);for(let[h,E]of Object.entries(p.releases||{})){if(E==="decline")continue;let w=G.parseIdent(h),D=t.tryWorkspaceByIdent(w);if(D===null)throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${V.basename(u)} references ${h})`);if(D.manifest.version===null)throw new Error(`Assertion failed: Expected the workspace to have a version (${G.prettyLocator(t.configuration,D.anchoredLocator)})`);let b=D.manifest.raw.stableVersion??D.manifest.version,C=r.get(D),T=MF(b,pI(E));if(T===null)throw new Error(`Assertion failed: Expected ${b} to support being bumped via strategy ${E}`);let N=typeof C<"u"?SA.default.gt(T,C)?T:C:T;r.set(D,N)}}return e&&(r=new Map([...r].map(([n,u])=>[n,Pve(u,{current:n.manifest.version,prerelease:e})]))),r}async function P5(t){let e=t.configuration.get("deferredVersionFolder");ae.existsSync(e)&&await ae.removePromise(e)}async function x5(t,e){let r=new Set(e),o=t.configuration.get("deferredVersionFolder");if(!ae.existsSync(o))return;let a=await ae.readdirPromise(o);for(let n of a){if(!n.endsWith(".yml"))continue;let u=V.join(o,n),A=await ae.readFilePromise(u,"utf8"),p=Vi(A),h=p?.releases;if(h){for(let E of Object.keys(h)){let w=G.parseIdent(E),D=t.tryWorkspaceByIdent(w);(D===null||r.has(D))&&delete p.releases[E]}Object.keys(p.releases).length>0?await ae.changeFilePromise(u,Sa(new Sa.PreserveOrdering(p))):await ae.unlinkPromise(u)}}}async function gI(t,{allowEmpty:e=!1}={}){let r=t.configuration;if(r.projectCwd===null)throw new it("This command can only be run from within a Yarn project");let o=await ra.fetchRoot(r.projectCwd),a=o!==null?await ra.fetchBase(o,{baseRefs:r.get("changesetBaseRefs")}):null,n=o!==null?await ra.fetchChangedFiles(o,{base:a.hash,project:t}):[],u=r.get("deferredVersionFolder"),A=n.filter(b=>V.contains(u,b)!==null);if(A.length>1)throw new it(`Your current branch contains multiple versioning files; this isn't supported: -- ${A.map(b=>Ae.fromPortablePath(b)).join(` -- `)}`);let p=new Set(qe.mapAndFilter(n,b=>{let C=t.tryWorkspaceByFilePath(b);return C===null?qe.mapAndFilter.skip:C}));if(A.length===0&&p.size===0&&!e)return null;let h=A.length===1?A[0]:V.join(u,`${bn.makeHash(Math.random().toString()).slice(0,8)}.yml`),E=ae.existsSync(h)?await ae.readFilePromise(h,"utf8"):"{}",w=Vi(E),D=new Map;for(let b of w.declined||[]){let C=G.parseIdent(b),T=t.getWorkspaceByIdent(C);D.set(T,"decline")}for(let[b,C]of Object.entries(w.releases||{})){let T=G.parseIdent(b),N=t.getWorkspaceByIdent(T);D.set(N,pI(C))}return{project:t,root:o,baseHash:a!==null?a.hash:null,baseTitle:a!==null?a.title:null,changedFiles:new Set(n),changedWorkspaces:p,releaseRoots:new Set([...p].filter(b=>b.manifest.version!==null)),releases:D,async saveAll(){let b={},C=[],T=[];for(let N of t.workspaces){if(N.manifest.version===null)continue;let U=G.stringifyIdent(N.anchoredLocator),J=D.get(N);J==="decline"?C.push(U):typeof J<"u"?b[U]=pI(J):p.has(N)&&T.push(U)}await ae.mkdirPromise(V.dirname(h),{recursive:!0}),await ae.changeFilePromise(h,Sa(new Sa.PreserveOrdering({releases:Object.keys(b).length>0?b:void 0,declined:C.length>0?C:void 0,undecided:T.length>0?T:void 0})))}}}function bDt(t){return OF(t).size>0||aD(t).length>0}function OF(t){let e=new Set;for(let r of t.changedWorkspaces)r.manifest.version!==null&&(t.releases.has(r)||e.add(r));return e}function aD(t,{include:e=new Set}={}){let r=[],o=new Map(qe.mapAndFilter([...t.releases],([n,u])=>u==="decline"?qe.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n])),a=new Map(qe.mapAndFilter([...t.releases],([n,u])=>u!=="decline"?qe.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n]));for(let n of t.project.workspaces)if(!(!e.has(n)&&(a.has(n.anchoredLocator.locatorHash)||o.has(n.anchoredLocator.locatorHash)))&&n.manifest.version!==null)for(let u of _t.hardDependencies)for(let A of n.manifest.getForScope(u).values()){let p=t.project.tryWorkspaceByDescriptor(A);p!==null&&o.has(p.anchoredLocator.locatorHash)&&r.push([n,p])}return r}function b5(t,e){let r=SA.default.clean(e);for(let o of Object.values(hI))if(o!=="undecided"&&o!=="decline"&&SA.default.inc(t,o)===r)return o;return null}function MF(t,e){if(SA.default.valid(e))return e;if(t===null)throw new it(`Cannot apply the release strategy "${e}" unless the workspace already has a valid version`);if(!SA.default.valid(t))throw new it(`Cannot apply the release strategy "${e}" on a non-semver version (${t})`);let r=SA.default.inc(t,e);if(r===null)throw new it(`Cannot apply the release strategy "${e}" on the specified version (${t})`);return r}function k5(t,e,{report:r}){let o=new Map;for(let a of t.workspaces)for(let n of _t.allDependencies)for(let u of a.manifest[n].values()){let A=t.tryWorkspaceByDescriptor(u);if(A===null||!e.has(A))continue;qe.getArrayWithDefault(o,A).push([a,n,u.identHash])}for(let[a,n]of e){let u=a.manifest.version;a.manifest.version=n,SA.default.prerelease(n)===null?delete a.manifest.raw.stableVersion:a.manifest.raw.stableVersion||(a.manifest.raw.stableVersion=u);let A=a.manifest.name!==null?G.stringifyIdent(a.manifest.name):null;r.reportInfo(0,`${G.prettyLocator(t.configuration,a.anchoredLocator)}: Bumped to ${n}`),r.reportJson({cwd:Ae.fromPortablePath(a.cwd),ident:A,oldVersion:u,newVersion:n});let p=o.get(a);if(!(typeof p>"u"))for(let[h,E,w]of p){let D=h.manifest[E].get(w);if(typeof D>"u")throw new Error("Assertion failed: The dependency should have existed");let b=D.range,C=!1;if(b.startsWith(ci.protocol)&&(b=b.slice(ci.protocol.length),C=!0,b===a.relativeCwd))continue;let T=b.match(xDt);if(!T){r.reportWarning(0,`Couldn't auto-upgrade range ${b} (in ${G.prettyLocator(t.configuration,h.anchoredLocator)})`);continue}let N=`${T[1]}${n}`;C&&(N=`${ci.protocol}${N}`);let U=G.makeDescriptor(D,N);h.manifest[E].set(w,U)}}}var kDt=new Map([["%n",{extract:t=>t.length>=1?[t[0],t.slice(1)]:null,generate:(t=0)=>`${t+1}`}]]);function Pve(t,{current:e,prerelease:r}){let o=new SA.default.SemVer(e),a=o.prerelease.slice(),n=[];o.prerelease=[],o.format()!==t&&(a.length=0);let u=!0,A=r.split(/\./g);for(let p of A){let h=kDt.get(p);if(typeof h>"u")n.push(p),a[0]===p?a.shift():u=!1;else{let E=u?h.extract(a):null;E!==null&&typeof E[0]=="number"?(n.push(h.generate(E[0])),a=E[1]):(n.push(h.generate()),u=!1)}}return o.prerelease&&(o.prerelease=[]),`${t}-${n.join(".")}`}var mI=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("--all",!1,{description:"Apply the deferred version changes on all workspaces"});this.dryRun=de.Boolean("--dry-run",!1,{description:"Print the versions without actually generating the package archive"});this.prerelease=de.String("--prerelease",{description:"Add a prerelease identifier to new versions",tolerateBoolean:!0});this.recursive=de.Boolean("-R,--recursive",{description:"Release the transitive workspaces as well"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["version","apply"]]}static{this.usage=ot.Usage({category:"Release-related commands",description:"apply all the deferred version bumps at once",details:` - This command will apply the deferred version changes and remove their definitions from the repository. - - Note that if \`--prerelease\` is set, the given prerelease identifier (by default \`rc.%n\`) will be used on all new versions and the version definitions will be kept as-is. - - By default only the current workspace will be bumped, but you can configure this behavior by using one of: - - - \`--recursive\` to also apply the version bump on its dependencies - - \`--all\` to apply the version bump on all packages in the repository - - Note that this command will also update the \`workspace:\` references across all your local workspaces, thus ensuring that they keep referring to the same workspaces even after the version bump. - `,examples:[["Apply the version change to the local workspace","yarn version apply"],["Apply the version change to all the workspaces in the local workspace","yarn version apply --all"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=this.prerelease?typeof this.prerelease!="boolean"?this.prerelease:"rc.%n":null,h=await oD(o,{prerelease:p}),E=new Map;if(this.all)E=h;else{let w=this.recursive?a.getRecursiveWorkspaceDependencies():[a];for(let D of w){let b=h.get(D);typeof b<"u"&&E.set(D,b)}}if(E.size===0){let w=h.size>0?" Did you want to add --all?":"";A.reportWarning(0,`The current workspace doesn't seem to require a version bump.${w}`);return}k5(o,E,{report:A}),this.dryRun||(p||(this.all?await P5(o):await x5(o,[...E.keys()])),A.reportSeparator())});return this.dryRun||u.hasErrors()?u.exitCode():await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};Ve();St();Gt();var UF=et(ni());var yI=class extends ut{constructor(){super(...arguments);this.interactive=de.Boolean("-i,--interactive",{description:"Open an interactive interface used to set version bumps"})}static{this.paths=[["version","check"]]}static{this.usage=ot.Usage({category:"Release-related commands",description:"check that all the relevant packages have been bumped",details:"\n **Warning:** This command currently requires Git.\n\n This command will check that all the packages covered by the files listed in argument have been properly bumped or declined to bump.\n\n In the case of a bump, the check will also cover transitive packages - meaning that should `Foo` be bumped, a package `Bar` depending on `Foo` will require a decision as to whether `Bar` will need to be bumped. This check doesn't cross packages that have declined to bump.\n\n In case no arguments are passed to the function, the list of modified files will be generated by comparing the HEAD against `master`.\n ",examples:[["Check whether the modified packages need a bump","yarn version check"]]})}async execute(){return this.interactive?await this.executeInteractive():await this.executeStandard()}async executeInteractive(){AC(this.context);let{Gem:r}=await Promise.resolve().then(()=>(UQ(),oj)),{ScrollableItems:o}=await Promise.resolve().then(()=>(jQ(),qQ)),{FocusRequest:a}=await Promise.resolve().then(()=>(lj(),Qwe)),{useListInput:n}=await Promise.resolve().then(()=>(HQ(),Fwe)),{renderForm:u}=await Promise.resolve().then(()=>(VQ(),YQ)),{Box:A,Text:p}=await Promise.resolve().then(()=>et(ac())),{default:h,useCallback:E,useState:w}=await Promise.resolve().then(()=>et(ln())),D=await ze.find(this.context.cwd,this.context.plugins),{project:b,workspace:C}=await Qt.find(D,this.context.cwd);if(!C)throw new or(b.cwd,this.context.cwd);await b.restoreInstallState();let T=await gI(b);if(T===null||T.releaseRoots.size===0)return 0;if(T.root===null)throw new it("This command can only be run on Git repositories");let N=()=>h.createElement(A,{flexDirection:"row",paddingBottom:1},h.createElement(A,{flexDirection:"column",width:60},h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select workspaces.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select release strategies."))),h.createElement(A,{flexDirection:"column"},h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to save.")),h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),U=({workspace:Ie,active:he,decision:De,setDecision:Ee})=>{let g=Ie.manifest.raw.stableVersion??Ie.manifest.version;if(g===null)throw new Error(`Assertion failed: The version should have been set (${G.prettyLocator(D,Ie.anchoredLocator)})`);if(UF.default.prerelease(g)!==null)throw new Error(`Assertion failed: Prerelease identifiers shouldn't be found (${g})`);let me=["undecided","decline","patch","minor","major"];n(De,me,{active:he,minus:"left",plus:"right",set:Ee});let Ce=De==="undecided"?h.createElement(p,{color:"yellow"},g):De==="decline"?h.createElement(p,{color:"green"},g):h.createElement(p,null,h.createElement(p,{color:"magenta"},g)," \u2192 ",h.createElement(p,{color:"green"},UF.default.valid(De)?De:UF.default.inc(g,De)));return h.createElement(A,{flexDirection:"column"},h.createElement(A,null,h.createElement(p,null,G.prettyLocator(D,Ie.anchoredLocator)," - ",Ce)),h.createElement(A,null,me.map(fe=>h.createElement(A,{key:fe,paddingLeft:2},h.createElement(p,null,h.createElement(r,{active:fe===De})," ",fe)))))},J=Ie=>{let he=new Set(T.releaseRoots),De=new Map([...Ie].filter(([Ee])=>he.has(Ee)));for(;;){let Ee=aD({project:T.project,releases:De}),g=!1;if(Ee.length>0){for(let[me]of Ee)if(!he.has(me)){he.add(me),g=!0;let Ce=Ie.get(me);typeof Ce<"u"&&De.set(me,Ce)}}if(!g)break}return{relevantWorkspaces:he,relevantReleases:De}},te=()=>{let[Ie,he]=w(()=>new Map(T.releases)),De=E((Ee,g)=>{let me=new Map(Ie);g!=="undecided"?me.set(Ee,g):me.delete(Ee);let{relevantReleases:Ce}=J(me);he(Ce)},[Ie,he]);return[Ie,De]},le=({workspaces:Ie,releases:he})=>{let De=[];De.push(`${Ie.size} total`);let Ee=0,g=0;for(let me of Ie){let Ce=he.get(me);typeof Ce>"u"?g+=1:Ce!=="decline"&&(Ee+=1)}return De.push(`${Ee} release${Ee===1?"":"s"}`),De.push(`${g} remaining`),h.createElement(p,{color:"yellow"},De.join(", "))},ue=await u(({useSubmit:Ie})=>{let[he,De]=te();Ie(he);let{relevantWorkspaces:Ee}=J(he),g=new Set([...Ee].filter(ie=>!T.releaseRoots.has(ie))),[me,Ce]=w(0),fe=E(ie=>{switch(ie){case a.BEFORE:Ce(me-1);break;case a.AFTER:Ce(me+1);break}},[me,Ce]);return h.createElement(A,{flexDirection:"column"},h.createElement(N,null),h.createElement(A,null,h.createElement(p,{wrap:"wrap"},"The following files have been modified in your local checkout.")),h.createElement(A,{flexDirection:"column",marginTop:1,paddingLeft:2},[...T.changedFiles].map(ie=>h.createElement(A,{key:ie},h.createElement(p,null,h.createElement(p,{color:"grey"},Ae.fromPortablePath(T.root)),Ae.sep,Ae.relative(Ae.fromPortablePath(T.root),Ae.fromPortablePath(ie)))))),T.releaseRoots.size>0&&h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:"wrap"},"Because of those files having been modified, the following workspaces may need to be released again (note that private workspaces are also shown here, because even though they won't be published, releasing them will allow us to flag their dependents for potential re-release):")),g.size>3?h.createElement(A,{marginTop:1},h.createElement(le,{workspaces:T.releaseRoots,releases:he})):null,h.createElement(A,{marginTop:1,flexDirection:"column"},h.createElement(o,{active:me%2===0,radius:1,size:2,onFocusRequest:fe},[...T.releaseRoots].map(ie=>h.createElement(U,{key:ie.cwd,workspace:ie,decision:he.get(ie)||"undecided",setDecision:Z=>De(ie,Z)}))))),g.size>0?h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:"wrap"},"The following workspaces depend on other workspaces that have been marked for release, and thus may need to be released as well:")),h.createElement(A,null,h.createElement(p,null,"(Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move the focus between the workspace groups.)")),g.size>5?h.createElement(A,{marginTop:1},h.createElement(le,{workspaces:g,releases:he})):null,h.createElement(A,{marginTop:1,flexDirection:"column"},h.createElement(o,{active:me%2===1,radius:2,size:2,onFocusRequest:fe},[...g].map(ie=>h.createElement(U,{key:ie.cwd,workspace:ie,decision:he.get(ie)||"undecided",setDecision:Z=>De(ie,Z)}))))):null)},{versionFile:T},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof ue>"u")return 1;T.releases.clear();for(let[Ie,he]of ue)T.releases.set(Ie,he);await T.saveAll()}async executeStandard(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);return await o.restoreInstallState(),(await Lt.start({configuration:r,stdout:this.context.stdout},async u=>{let A=await gI(o);if(A===null||A.releaseRoots.size===0)return;if(A.root===null)throw new it("This command can only be run on Git repositories");if(u.reportInfo(0,`Your PR was started right after ${pe.pretty(r,A.baseHash.slice(0,7),"yellow")} ${pe.pretty(r,A.baseTitle,"magenta")}`),A.changedFiles.size>0){u.reportInfo(0,"You have changed the following files since then:"),u.reportSeparator();for(let D of A.changedFiles)u.reportInfo(null,`${pe.pretty(r,Ae.fromPortablePath(A.root),"gray")}${Ae.sep}${Ae.relative(Ae.fromPortablePath(A.root),Ae.fromPortablePath(D))}`)}let p=!1,h=!1,E=OF(A);if(E.size>0){p||u.reportSeparator();for(let D of E)u.reportError(0,`${G.prettyLocator(r,D.anchoredLocator)} has been modified but doesn't have a release strategy attached`);p=!0}let w=aD(A);for(let[D,b]of w)h||u.reportSeparator(),u.reportError(0,`${G.prettyLocator(r,D.anchoredLocator)} doesn't have a release strategy attached, but depends on ${G.prettyWorkspace(r,b)} which is planned for release.`),h=!0;(p||h)&&(u.reportSeparator(),u.reportInfo(0,"This command detected that at least some workspaces have received modifications without explicit instructions as to how they had to be released (if needed)."),u.reportInfo(0,"To correct these errors, run `yarn version check --interactive` then follow the instructions."))})).exitCode()}};Ve();Gt();var _F=et(ni());var EI=class extends ut{constructor(){super(...arguments);this.deferred=de.Boolean("-d,--deferred",{description:"Prepare the version to be bumped during the next release cycle"});this.immediate=de.Boolean("-i,--immediate",{description:"Bump the version immediately"});this.strategy=de.String()}static{this.paths=[["version"]]}static{this.usage=ot.Usage({category:"Release-related commands",description:"apply a new version to the current package",details:"\n This command will bump the version number for the given package, following the specified strategy:\n\n - If `major`, the first number from the semver range will be increased (`X.0.0`).\n - If `minor`, the second number from the semver range will be increased (`0.X.0`).\n - If `patch`, the third number from the semver range will be increased (`0.0.X`).\n - If prefixed by `pre` (`premajor`, ...), a `-0` suffix will be set (`0.0.0-0`).\n - If `prerelease`, the suffix will be increased (`0.0.0-X`); the third number from the semver range will also be increased if there was no suffix in the previous version.\n - If `decline`, the nonce will be increased for `yarn version check` to pass without version bump.\n - If a valid semver range, it will be used as new version.\n - If unspecified, Yarn will ask you for guidance.\n\n For more information about the `--deferred` flag, consult our documentation (https://yarnpkg.com/features/release-workflow#deferred-versioning).\n ",examples:[["Immediately bump the version to the next major","yarn version major"],["Prepare the version to be bumped to the next major","yarn version major --deferred"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);let n=r.get("preferDeferredVersions");this.deferred&&(n=!0),this.immediate&&(n=!1);let u=_F.default.valid(this.strategy),A=this.strategy==="decline",p;if(u)if(a.manifest.version!==null){let E=b5(a.manifest.version,this.strategy);E!==null?p=E:p=this.strategy}else p=this.strategy;else{let E=a.manifest.version;if(!A){if(E===null)throw new it("Can't bump the version if there wasn't a version to begin with - use 0.0.0 as initial version then run the command again.");if(typeof E!="string"||!_F.default.valid(E))throw new it(`Can't bump the version (${E}) if it's not valid semver`)}p=pI(this.strategy)}if(!n){let w=(await oD(o)).get(a);if(typeof w<"u"&&p!=="decline"){let D=MF(a.manifest.version,p);if(_F.default.lt(D,w))throw new it(`Can't bump the version to one that would be lower than the current deferred one (${w})`)}}let h=await gI(o,{allowEmpty:!0});return h.releases.set(a,p),await h.saveAll(),n?0:await this.cli.run(["version","apply"])}};var QDt={configuration:{deferredVersionFolder:{description:"Folder where are stored the versioning files",type:"ABSOLUTE_PATH",default:"./.yarn/versions"},preferDeferredVersions:{description:"If true, running `yarn version` will assume the `--deferred` flag unless `--immediate` is set",type:"BOOLEAN",default:!1}},commands:[mI,yI,EI]},FDt=QDt;var F5={};Vt(F5,{WorkspacesFocusCommand:()=>CI,WorkspacesForeachCommand:()=>wI,default:()=>LDt});Ve();Ve();Gt();var CI=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.production=de.Boolean("--production",!1,{description:"Only install regular dependencies by omitting dev dependencies"});this.all=de.Boolean("-A,--all",!1,{description:"Install the entire project"});this.workspaces=de.Rest()}static{this.paths=[["workspaces","focus"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"install a single workspace and its dependencies",details:"\n This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\n\n Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\n\n If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);await o.restoreInstallState({restoreResolutions:!1});let u;if(this.all)u=new Set(o.workspaces);else if(this.workspaces.length===0){if(!a)throw new or(o.cwd,this.context.cwd);u=new Set([a])}else u=new Set(this.workspaces.map(A=>o.getWorkspaceByIdent(G.parseIdent(A))));for(let A of u)for(let p of this.production?["dependencies"]:_t.hardDependencies)for(let h of A.manifest.getForScope(p).values()){let E=o.tryWorkspaceByDescriptor(h);E!==null&&u.add(E)}for(let A of o.workspaces)u.has(A)?this.production&&A.manifest.devDependencies.clear():(A.manifest.installConfig=A.manifest.installConfig||{},A.manifest.installConfig.selfReferences=!1,A.manifest.dependencies.clear(),A.manifest.devDependencies.clear(),A.manifest.peerDependencies.clear(),A.manifest.scripts.clear());return await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n,persistProject:!1})}};Ve();Ve();Ve();Gt();var II=et(Xo()),bve=et(lg());il();var wI=class extends ut{constructor(){super(...arguments);this.from=de.Array("--from",{description:"An array of glob pattern idents or paths from which to base any recursion"});this.all=de.Boolean("-A,--all",{description:"Run the command on all workspaces of a project"});this.recursive=de.Boolean("-R,--recursive",{description:"Run the command on the current workspace and all of its recursive dependencies"});this.worktree=de.Boolean("-W,--worktree",{description:"Run the command on all workspaces of the current worktree"});this.verbose=de.Counter("-v,--verbose",{description:"Increase level of logging verbosity up to 2 times"});this.parallel=de.Boolean("-p,--parallel",!1,{description:"Run the commands in parallel"});this.interlaced=de.Boolean("-i,--interlaced",!1,{description:"Print the output of commands in real-time instead of buffering it"});this.jobs=de.String("-j,--jobs",{description:"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`",validator:pL([js(["unlimited"]),vw(fL(),[gL(),hL(1)])])});this.topological=de.Boolean("-t,--topological",!1,{description:"Run the command after all workspaces it depends on (regular) have finished"});this.topologicalDev=de.Boolean("--topological-dev",!1,{description:"Run the command after all workspaces it depends on (regular + dev) have finished"});this.include=de.Array("--include",[],{description:"An array of glob pattern idents or paths; only matching workspaces will be traversed"});this.exclude=de.Array("--exclude",[],{description:"An array of glob pattern idents or paths; matching workspaces won't be traversed"});this.publicOnly=de.Boolean("--no-private",{description:"Avoid running the command on private workspaces"});this.since=de.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.dryRun=de.Boolean("-n,--dry-run",{description:"Print the commands that would be run, without actually running them"});this.commandName=de.String();this.args=de.Proxy()}static{this.paths=[["workspaces","foreach"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"run a command on all workspaces",details:"\n This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\n\n - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\n\n - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\n\n - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\n\n - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `-W,--worktree` is set, Yarn will find workspaces to run the command on by looking at the current worktree.\n\n - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\n\n - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `--dry-run` is set, Yarn will explain what it would do without actually doing anything.\n\n - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n The `-v,--verbose` flag can be passed up to twice: once to prefix output lines with the originating workspace's name, and again to include start/finish/timing log lines. Maximum verbosity is enabled by default in terminal environments.\n\n If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\n ",examples:[["Publish all packages","yarn workspaces foreach -A npm publish --tolerate-republish"],["Run the build script on all descendant packages","yarn workspaces foreach -A run build"],["Run the build script on current and all descendant packages in parallel, building package dependencies first","yarn workspaces foreach -Apt run build"],["Run the build script on several packages and all their dependencies, building dependencies first","yarn workspaces foreach -Rpt --from '{workspace-a,workspace-b}' run build"]]})}static{this.schema=[Sw("all",Vu.Forbids,["from","recursive","since","worktree"],{missingIf:"undefined"}),dL(["all","recursive","since","worktree"],{missingIf:"undefined"})]}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!this.all&&!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let n=this.cli.process([this.commandName,...this.args]),u=n.path.length===1&&n.path[0]==="run"&&typeof n.scriptName<"u"?n.scriptName:null;if(n.path.length===0)throw new it("Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script");let A=Ee=>{this.dryRun&&this.context.stdout.write(`${Ee} -`)},p=()=>{let Ee=this.from.map(g=>II.default.matcher(g));return o.workspaces.filter(g=>{let me=G.stringifyIdent(g.anchoredLocator),Ce=g.relativeCwd;return Ee.some(fe=>fe(me)||fe(Ce))})},h=[];if(this.since?(A("Option --since is set; selecting the changed workspaces as root for workspace selection"),h=Array.from(await ra.fetchChangedWorkspaces({ref:this.since,project:o}))):this.from?(A("Option --from is set; selecting the specified workspaces"),h=[...p()]):this.worktree?(A("Option --worktree is set; selecting the current workspace"),h=[a]):this.recursive?(A("Option --recursive is set; selecting the current workspace"),h=[a]):this.all&&(A("Option --all is set; selecting all workspaces"),h=[...o.workspaces]),this.dryRun&&!this.all){for(let Ee of h)A(` -- ${Ee.relativeCwd} - ${G.prettyLocator(r,Ee.anchoredLocator)}`);h.length>0&&A("")}let E;if(this.recursive?this.since?(A("Option --recursive --since is set; recursively selecting all dependent workspaces"),E=new Set(h.map(Ee=>[...Ee.getRecursiveWorkspaceDependents()]).flat())):(A("Option --recursive is set; recursively selecting all transitive dependencies"),E=new Set(h.map(Ee=>[...Ee.getRecursiveWorkspaceDependencies()]).flat())):this.worktree?(A("Option --worktree is set; recursively selecting all nested workspaces"),E=new Set(h.map(Ee=>[...Ee.getRecursiveWorkspaceChildren()]).flat())):E=null,E!==null&&(h=[...new Set([...h,...E])],this.dryRun))for(let Ee of E)A(` -- ${Ee.relativeCwd} - ${G.prettyLocator(r,Ee.anchoredLocator)}`);let w=[],D=!1;if(u?.includes(":")){for(let Ee of o.workspaces)if(Ee.manifest.scripts.has(u)&&(D=!D,D===!1))break}for(let Ee of h){if(u&&!Ee.manifest.scripts.has(u)&&!D&&!(await hn.getWorkspaceAccessibleBinaries(Ee)).has(u)){A(`Excluding ${Ee.relativeCwd} because it doesn't have a "${u}" script`);continue}if(!(u===r.env.npm_lifecycle_event&&Ee.cwd===a.cwd)){if(this.include.length>0&&!II.default.isMatch(G.stringifyIdent(Ee.anchoredLocator),this.include)&&!II.default.isMatch(Ee.relativeCwd,this.include)){A(`Excluding ${Ee.relativeCwd} because it doesn't match the --include filter`);continue}if(this.exclude.length>0&&(II.default.isMatch(G.stringifyIdent(Ee.anchoredLocator),this.exclude)||II.default.isMatch(Ee.relativeCwd,this.exclude))){A(`Excluding ${Ee.relativeCwd} because it matches the --exclude filter`);continue}if(this.publicOnly&&Ee.manifest.private===!0){A(`Excluding ${Ee.relativeCwd} because it's a private workspace and --no-private was set`);continue}w.push(Ee)}}if(this.dryRun)return 0;let b=this.verbose??(this.context.stdout.isTTY?1/0:0),C=b>0,T=b>1,N=this.parallel?this.jobs==="unlimited"?1/0:Number(this.jobs)||Math.ceil(Xi.availableParallelism()/2):1,U=N===1?!1:this.parallel,J=U?this.interlaced:!0,te=(0,bve.default)(N),le=new Map,ce=new Set,ue=0,Ie=null,he=!1,De=await Lt.start({configuration:r,stdout:this.context.stdout,includePrefix:!1},async Ee=>{let g=async(me,{commandIndex:Ce})=>{if(he)return-1;!U&&T&&Ce>1&&Ee.reportSeparator();let fe=RDt(me,{configuration:r,label:C,commandIndex:Ce}),[ie,Z]=xve(Ee,{prefix:fe,interlaced:J}),[Se,Re]=xve(Ee,{prefix:fe,interlaced:J});try{T&&Ee.reportInfo(null,`${fe?`${fe} `:""}Process started`);let ht=Date.now(),q=await this.cli.run([this.commandName,...this.args],{cwd:me.cwd,stdout:ie,stderr:Se})||0;ie.end(),Se.end(),await Z,await Re;let nt=Date.now();if(T){let Le=r.get("enableTimers")?`, completed in ${pe.pretty(r,nt-ht,pe.Type.DURATION)}`:"";Ee.reportInfo(null,`${fe?`${fe} `:""}Process exited (exit code ${q})${Le}`)}return q===130&&(he=!0,Ie=q),q}catch(ht){throw ie.end(),Se.end(),await Z,await Re,ht}};for(let me of w)le.set(me.anchoredLocator.locatorHash,me);for(;le.size>0&&!Ee.hasErrors();){let me=[];for(let[Z,Se]of le){if(ce.has(Se.anchoredDescriptor.descriptorHash))continue;let Re=!0;if(this.topological||this.topologicalDev){let ht=this.topologicalDev?new Map([...Se.manifest.dependencies,...Se.manifest.devDependencies]):Se.manifest.dependencies;for(let q of ht.values()){let nt=o.tryWorkspaceByDescriptor(q);if(Re=nt===null||!le.has(nt.anchoredLocator.locatorHash),!Re)break}}if(Re&&(ce.add(Se.anchoredDescriptor.descriptorHash),me.push(te(async()=>{let ht=await g(Se,{commandIndex:++ue});return le.delete(Z),ce.delete(Se.anchoredDescriptor.descriptorHash),{workspace:Se,exitCode:ht}})),!U))break}if(me.length===0){let Z=Array.from(le.values()).map(Se=>G.prettyLocator(r,Se.anchoredLocator)).join(", ");Ee.reportError(3,`Dependency cycle detected (${Z})`);return}let Ce=await Promise.all(me);Ce.forEach(({workspace:Z,exitCode:Se})=>{Se!==0&&Ee.reportError(0,`The command failed in workspace ${G.prettyLocator(r,Z.anchoredLocator)} with exit code ${Se}`)});let ie=Ce.map(Z=>Z.exitCode).find(Z=>Z!==0);(this.topological||this.topologicalDev)&&typeof ie<"u"&&Ee.reportError(0,"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph")}});return Ie!==null?Ie:De.exitCode()}};function xve(t,{prefix:e,interlaced:r}){let o=t.createStreamReporter(e),a=new qe.DefaultStream;a.pipe(o,{end:!1}),a.on("finish",()=>{o.end()});let n=new Promise(A=>{o.on("finish",()=>{A(a.active)})});if(r)return[a,n];let u=new qe.BufferStream;return u.pipe(a,{end:!1}),u.on("finish",()=>{a.end()}),[u,n]}function RDt(t,{configuration:e,commandIndex:r,label:o}){if(!o)return null;let n=`[${G.stringifyIdent(t.anchoredLocator)}]:`,u=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],A=u[r%u.length];return pe.pretty(e,n,A)}var TDt={commands:[CI,wI]},LDt=TDt;var lE=()=>({modules:new Map([["@yarnpkg/cli",P2],["@yarnpkg/core",S2],["@yarnpkg/fslib",Aw],["@yarnpkg/libzip",K1],["@yarnpkg/parsers",Ew],["@yarnpkg/shell",e2],["clipanion",Qw],["semver",NDt],["typanion",Yo],["@yarnpkg/plugin-essentials",MH],["@yarnpkg/plugin-compat",jH],["@yarnpkg/plugin-constraints",a6],["@yarnpkg/plugin-dlx",l6],["@yarnpkg/plugin-exec",A6],["@yarnpkg/plugin-file",p6],["@yarnpkg/plugin-git",OH],["@yarnpkg/plugin-github",d6],["@yarnpkg/plugin-http",m6],["@yarnpkg/plugin-init",y6],["@yarnpkg/plugin-interactive-tools",mj],["@yarnpkg/plugin-link",yj],["@yarnpkg/plugin-nm",tG],["@yarnpkg/plugin-npm",$G],["@yarnpkg/plugin-npm-cli",l5],["@yarnpkg/plugin-pack",KG],["@yarnpkg/plugin-patch",g5],["@yarnpkg/plugin-pnp",jj],["@yarnpkg/plugin-pnpm",y5],["@yarnpkg/plugin-stage",D5],["@yarnpkg/plugin-typescript",S5],["@yarnpkg/plugin-version",Q5],["@yarnpkg/plugin-workspace-tools",F5]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"])});function Fve({cwd:t,pluginConfiguration:e}){let r=new Ko({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:nn??""});return Object.assign(r,{defaultContext:{...Ko.defaultContext,cwd:t,plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr}})}function ODt(t){if(qe.parseOptionalBoolean(process.env.YARN_IGNORE_NODE))return!0;let r=process.versions.node,o=">=18.12.0";if(Ur.satisfiesWithPrereleases(r,o))return!0;let a=new it(`This tool requires a Node version compatible with ${o} (got ${r}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);return Ko.defaultContext.stdout.write(t.error(a)),!1}async function Rve({selfPath:t,pluginConfiguration:e}){return await ze.find(Ae.toPortablePath(process.cwd()),e,{strict:!1,usePathCheck:t})}function MDt(t,e,{yarnPath:r}){if(!ae.existsSync(r))return t.error(new Error(`The "yarn-path" option has been set, but the specified location doesn't exist (${r}).`)),1;process.on("SIGINT",()=>{});let o={stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1"}};try{(0,kve.execFileSync)(process.execPath,[Ae.fromPortablePath(r),...e],o)}catch(a){return a.status??1}return 0}function UDt(t,e){let r=null,o=e;return e.length>=2&&e[0]==="--cwd"?(r=Ae.toPortablePath(e[1]),o=e.slice(2)):e.length>=1&&e[0].startsWith("--cwd=")?(r=Ae.toPortablePath(e[0].slice(6)),o=e.slice(1)):e[0]==="add"&&e[e.length-2]==="--cwd"&&(r=Ae.toPortablePath(e[e.length-1]),o=e.slice(0,e.length-2)),t.defaultContext.cwd=r!==null?V.resolve(r):V.cwd(),o}function _Dt(t,{configuration:e}){if(!e.get("enableTelemetry")||Qve.isCI||!process.stdout.isTTY)return;ze.telemetry=new sE(e,"puba9cdc10ec5790a2cf4969dd413a47270");let o=/^@yarnpkg\/plugin-(.*)$/;for(let a of e.plugins.keys())oE.has(a.match(o)?.[1]??"")&&ze.telemetry?.reportPluginName(a);t.binaryVersion&&ze.telemetry.reportVersion(t.binaryVersion)}function Tve(t,{configuration:e}){for(let r of e.plugins.values())for(let o of r.commands||[])t.register(o)}async function HDt(t,e,{selfPath:r,pluginConfiguration:o}){if(!ODt(t))return 1;let a=await Rve({selfPath:r,pluginConfiguration:o}),n=a.get("yarnPath"),u=a.get("ignorePath");if(n&&!u)return MDt(t,e,{yarnPath:n});delete process.env.YARN_IGNORE_PATH;let A=UDt(t,e);_Dt(t,{configuration:a}),Tve(t,{configuration:a});let p=t.process(A,t.defaultContext);return p.help||ze.telemetry?.reportCommandName(p.path.join(" ")),await t.run(p,t.defaultContext)}async function qhe({cwd:t=V.cwd(),pluginConfiguration:e=lE()}={}){let r=Fve({cwd:t,pluginConfiguration:e}),o=await Rve({pluginConfiguration:e,selfPath:null});return Tve(r,{configuration:o}),r}async function Nk(t,{cwd:e=V.cwd(),selfPath:r,pluginConfiguration:o}){let a=Fve({cwd:e,pluginConfiguration:o});function n(){Ko.defaultContext.stdout.write(`ERROR: Yarn is terminating due to an unexpected empty event loop. -Please report this issue at https://github.com/yarnpkg/berry/issues.`)}process.once("beforeExit",n);try{process.exitCode=42,process.exitCode=await HDt(a,t,{selfPath:r,pluginConfiguration:o})}catch(u){Ko.defaultContext.stdout.write(a.error(u)),process.exitCode=1}finally{process.off("beforeExit",n),await ae.rmtempPromise()}}Nk(process.argv.slice(2),{cwd:V.cwd(),selfPath:Ae.toPortablePath(Ae.resolve(process.argv[1])),pluginConfiguration:lE()});})(); -/** - @license - Copyright (c) 2015, Rebecca Turner - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - */ -/** - @license - Copyright Node.js contributors. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. -*/ -/** - @license - The MIT License (MIT) - - Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ -/** - @license - Copyright Joyent, Inc. and other Node contributors. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to permit - persons to whom the Software is furnished to do so, subject to the - following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN - NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -/*! Bundled license information: - -is-number/index.js: - (*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - *) - -to-regex-range/index.js: - (*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - *) - -fill-range/index.js: - (*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - *) - -is-extglob/index.js: - (*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - *) - -is-glob/index.js: - (*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - *) - -queue-microtask/index.js: - (*! queue-microtask. MIT License. Feross Aboukhadijeh *) - -run-parallel/index.js: - (*! run-parallel. MIT License. Feross Aboukhadijeh *) - -git-url-parse/lib/index.js: - (*! - * buildToken - * Builds OAuth token prefix (helper function) - * - * @name buildToken - * @function - * @param {GitUrl} obj The parsed Git url object. - * @return {String} token prefix - *) - -object-assign/index.js: - (* - object-assign - (c) Sindre Sorhus - @license MIT - *) - -react/cjs/react.production.min.js: - (** @license React v17.0.2 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - *) - -scheduler/cjs/scheduler.production.min.js: - (** @license React v0.20.2 - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - *) - -react-reconciler/cjs/react-reconciler.production.min.js: - (** @license React v0.26.2 - * react-reconciler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - *) - -is-windows/index.js: - (*! - * is-windows - * - * Copyright © 2015-2018, Jon Schlinkert. - * Released under the MIT License. - *) -*/ diff --git a/.yarnrc.yml b/.yarnrc.yml deleted file mode 100644 index 5d3519659..000000000 --- a/.yarnrc.yml +++ /dev/null @@ -1,4 +0,0 @@ -enableGlobalCache: false -nodeLinker: node-modules -npmRegistryServer: "https://registry.npmjs.org" -yarnPath: .yarn/releases/yarn-4.7.0.cjs diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index 69e435ef4..000000000 --- a/AGENTS.md +++ /dev/null @@ -1,51 +0,0 @@ -# Agents - -See [CLAUDE.md](./CLAUDE.md) for project-wide conventions (code style, file naming, API route handlers, auth, PR workflow, etc.). Follow it as if it were part of this file. - -## Cursor Cloud specific instructions - -### Overview - -Sourcebot is a self-hosted code intelligence platform (code search, navigation, AI Q&A). It's a Yarn 4 monorepo with packages under `packages/` and a vendored Go-based search engine (Zoekt) under `vendor/zoekt`. - -### Prerequisites - -- **Node.js 24+** (required by the project) -- **Go** (for building Zoekt binaries from `vendor/zoekt`) -- **Docker** (for PostgreSQL 16 and Redis 7 via `docker-compose-dev.yml`) -- **universal-ctags** (used by Zoekt for symbol indexing; pre-installed as `ctags`) - -### Services and Ports - -| Service | Port | Notes | -|---------|------|-------| -| Web (Next.js) | 3000 | Redirects to `/onboard` on first run | -| Backend worker | 3060 | Express + BullMQ job processor | -| Zoekt WebServer | 6070 | Code search engine (Go binary) | -| PostgreSQL | 5432 | Via `docker-compose-dev.yml` | -| Redis | 6379 | Via `docker-compose-dev.yml` | - -### Key Commands - -Standard dev commands are documented in `CONTRIBUTING.md` and `package.json`. Key ones: - -- **Start all services:** `yarn dev` (runs zoekt, backend, web, mcp watcher, schemas watcher concurrently) -- **Lint:** `yarn workspace @sourcebot/web lint` -- **Test:** `yarn test` (runs all workspace tests) -- **Build deps only:** `yarn build:deps` (builds shared packages: schemas, db, shared, query-language) -- **DB migrations:** `yarn dev:prisma:migrate:dev` - -### Non-obvious Caveats - -- **Docker must be running** before `yarn dev`. Start it with `docker compose -f docker-compose-dev.yml up -d`. The backend will fail to connect to Redis/PostgreSQL otherwise. -- **Zoekt binaries** must be built before `yarn dev`. They live in `./bin/` and are built with `go build -C vendor/zoekt -o $(pwd)/bin ./cmd/...`. The `make zoekt` target does this. -- **Git submodules** must be initialized (`git submodule update --init --recursive`) before building Zoekt. -- **ctags compatibility:** The installed `ctags` may not support `--_interactive=default` (universal-ctags feature). Zoekt logs a warning but continues to index without symbol data. This does not block functionality. -- **First run onboarding:** On a fresh database, the web app redirects to `/onboard` where you create an owner account. Credentials login is enabled by default (`AUTH_CREDENTIALS_LOGIN_ENABLED` defaults to `true`). -- **Config file:** Create a `config.json` at the repo root (referenced by `CONFIG_PATH` in `.env.development`) to configure which repos to index. A minimal example is in `CONTRIBUTING.md`. -- **Environment variables:** `.env.development` has sensible defaults for local dev. Create `.env.development.local` for overrides (it's gitignored). -- The backend worker does not expose a health-check endpoint. Verify it's running by checking its logs or that BullMQ jobs are processing. - -### Pull Request Workflow - -- **CHANGELOG entry required:** Every PR must include a follow-up commit adding an entry to `CHANGELOG.md` under `[Unreleased]`. The entry must be a single sentence describing the change, followed by a link to the PR in the format `[#](https://github.com/sourcebot-dev/sourcebot/pull/)`. Place new entries at the bottom of the appropriate section (`Added`, `Changed`, `Fixed`, etc.). See `CLAUDE.md` and existing entries in `CHANGELOG.md` for the exact conventions. diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 9f2c8623a..000000000 --- a/CLAUDE.md +++ /dev/null @@ -1,472 +0,0 @@ -# Claude Code Guidelines - -## Database Migrations - -When creating Prisma database migrations, run from the repository root: - -```bash -yarn dev:prisma:migrate:dev --name -``` - -Do NOT use `npx prisma migrate dev` directly from packages/db. - -## Building Packages - -To build a specific package: - -```bash -yarn workspace @sourcebot/ build -``` - -## Backend Workloads - -Use the workload system in `packages/backend` for background work. Define the queue payload and default job behavior in the shared queue registry, implement a `Workload`, and register it with the `JobManager`. - -### Execution locks - -- Key an execution lock by the logical resource being mutated, not by the job ID. Workloads that mutate the same resource must use the exact same lock key. For example, repo indexing and repo cleanup share the per-repo filesystem and search-index lock, while repo permission syncing uses a separate per-repo permission lock. -- An execution lock serializes work but does not deduplicate it. Multiple jobs for one resource may still be queued and will execute one at a time. -- The lock lease is extended automatically while work is running. The workload's `AbortSignal` is aborted if extension fails or the worker shuts down. -- Abortion is cooperative. Call `signal.throwIfAborted()` before side effects and after long-running or external operations so work stops promptly after losing the lock. The signal cannot cancel an operation that has already been submitted. -- `onStarted` runs after the execution lock is acquired and immediately before `process`. `onCompleted` and `onTerminalFailure` are BullMQ event hooks and run after the processor has returned and released the lock. - -### Lifecycle state - -- BullMQ is the default source of truth for workload lifecycle state. Only persist a separate database job row when the product explicitly requires durable history beyond the queue's retention policy. -- If a parent resource tracks a `latest...JobId`, update that pointer when the job starts so consumers can resolve its state from BullMQ. -- For workloads that persist historical job rows, completion and terminal-failure hooks must always update their own row by job ID. Do not condition that update on the job still being latest. Every persisted job row should record its actual outcome. -- `onTerminalFailure` only runs after the job exhausts all retry attempts. Intermediate failures are retried without marking the lifecycle row as terminally failed. -- If a completion or failure hook publishes state onto the parent resource, use a conditional `updateMany` keyed by both the resource ID and its `latest...JobId`. This prevents an older hook from overwriting state belonging to a newer job after the execution lock has been released. -- Parent-resource state written inside `process` is already serialized by the execution lock. It does not need a latest-job conditional merely because the resource tracks the latest job ID. - -## File Naming - -Files should use camelCase starting with a lowercase letter: - -``` -// Correct -shareChatPopover.tsx -userAvatar.tsx -apiClient.ts - -// Incorrect -ShareChatPopover.tsx -UserAvatar.tsx -share-chat-popover.tsx -``` - -Exceptions: -- Special files like `README.md`, `CHANGELOG.md`, `LICENSE` -- Next.js conventions: `page.tsx`, `layout.tsx`, `loading.tsx`, etc. - -## Code Style - -Always use curly braces for `if` statements, with the body on a new line — even for single-line bodies: - -```ts -// Correct -if (!value) { - return; -} -if (condition) { - doSomething(); -} - -// Incorrect -if (!value) return; -if (!value) { return; } -if (condition) doSomething(); -``` - -## PostHog Event Naming - -- The `wa_` prefix is reserved for events that can ONLY be fired from the web app (e.g., `wa_login_with_github`, `wa_chat_feedback_submitted`). -- Events fired from multiple sources (web app, MCP server, API) must NOT use the `wa_` prefix (e.g., `ask_message_sent`, `tool_used`). -- Multi-source events should include a `source` property to identify the origin (e.g., `'sourcebot-web-client'`, `'sourcebot-mcp-server'`, `'sourcebot-ask-agent'`). - -## Conditional ClassNames - -Use `cn()` from `@/lib/utils` for conditional classNames instead of template literal interpolation: - -```tsx -// Correct -className={cn("border-b transition-colors", isActive ? "border-foreground" : "border-transparent")} - -// Incorrect -className={`border-b transition-colors ${isActive ? "border-foreground" : "border-transparent"}`} -``` - -## Tailwind CSS - -Use Tailwind color classes directly instead of CSS variable syntax: - -```tsx -// Correct -className="border-border bg-card text-foreground text-muted-foreground bg-muted bg-secondary" - -// Incorrect -className="border-[var(--border)] bg-[var(--card)] text-[var(--foreground)]" -``` - -## API Route Handlers - -When implementing a new API route, ask the user whether it should be part of the public API. If yes: - -1. Add the request/response Zod schemas to `packages/web/src/openapi/publicApiSchemas.ts`, calling `.openapi('SchemaName')` on each schema to register it with a name. -2. Register the route in `packages/web/src/openapi/publicApiDocument.ts` using `registry.registerPath(...)`, assigning it to the appropriate tag. -3. Add the endpoint to the relevant group in the `API Reference` tab of `docs/docs.json`. -4. Regenerate the OpenAPI spec by running `yarn workspace @sourcebot/web openapi:generate`. - -Route handlers should validate inputs using Zod schemas. Put coercion, defaults, minimums, maximums, and cross-field validation in the schema instead of scattering parsing logic through the handler. - -**Query parameters** (GET requests): - -```ts -import { queryParamsSchemaValidationError, serviceErrorResponse } from "@/lib/serviceError"; -import { z } from "zod"; - -const myQueryParamsSchema = z.object({ - repo: z.string(), - page: z.coerce.number().int().positive().default(1), - perPage: z.coerce.number().int().positive().max(100).default(50), -}); - -export const GET = apiHandler(async (request: NextRequest) => { - const rawParams = Object.fromEntries( - Object.keys(myQueryParamsSchema.shape).map(key => [ - key, - request.nextUrl.searchParams.get(key) ?? undefined - ]) - ); - const parsed = myQueryParamsSchema.safeParse(rawParams); - - if (!parsed.success) { - return serviceErrorResponse( - queryParamsSchemaValidationError(parsed.error) - ); - } - - const { page, perPage, ...searchParams } = parsed.data; - const skip = (page - 1) * perPage; - // ... rest of handler -}); -``` - -**Search query parameters**: - -```ts -import { queryParamsSchemaValidationError, serviceErrorResponse } from "@/lib/serviceError"; -import { z } from "zod"; - -const searchMembersQueryParamsSchema = z.object({ - query: z.string().default(''), -}); - -export const GET = apiHandler(async (request: NextRequest) => { - const rawParams = Object.fromEntries( - Object.keys(searchMembersQueryParamsSchema.shape).map(key => [ - key, - request.nextUrl.searchParams.get(key) ?? undefined - ]) - ); - const parsed = searchMembersQueryParamsSchema.safeParse(rawParams); - - if (!parsed.success) { - return serviceErrorResponse( - queryParamsSchemaValidationError(parsed.error) - ); - } - - const { query } = parsed.data; - // ... use query in the database/search call -}); -``` - -**Request body** (POST/PUT/PATCH requests): - -```ts -import { requestBodySchemaValidationError, serviceErrorResponse } from "@/lib/serviceError"; -import { z } from "zod"; - -const myRequestBodySchema = z.object({ - name: z.string(), - count: z.number().optional(), -}); - -export const POST = apiHandler(async (request: NextRequest) => { - const body = await request.json(); - const parsed = myRequestBodySchema.safeParse(body); - - if (!parsed.success) { - return serviceErrorResponse( - requestBodySchemaValidationError(parsed.error) - ); - } - - const { name, count } = parsed.data; - // ... rest of handler -}); -``` - -Use `safeParseAsync` when the schema has async refinements, as in search routes: - -```ts -const body = await request.json(); -const parsed = await searchRequestSchema.safeParseAsync(body); -``` - -## Data Fetching - -For GET requests, prefer using API routes with react-query over server actions. This provides caching benefits and better control over data refetching. - -```tsx -// Preferred: API route + react-query -import { useQuery } from "@tanstack/react-query"; - -const { data, isLoading } = useQuery({ - queryKey: ["items", id], - queryFn: () => fetch(`/api/items/${id}`).then(res => res.json()), -}); -``` - -Server actions should be used for mutations (POST/PUT/DELETE operations), not for data fetching. - -## Authentication - -Use `withAuth` or `withOptionalAuth` from `@/middleware/withAuth` to protect server actions and API routes. - -- **`withAuth`** - Requires authentication. Returns `notAuthenticated()` if user is not logged in. -- **`withOptionalAuth`** - Allows anonymous access if the org has anonymous access enabled. `user` may be `undefined`. -- **`withMinimumOrgRole`** - Wrap inside auth context to require a minimum role (e.g., `OrgRole.OWNER`). Import from `@/middleware/withMinimumOrgRole`. - -**Important:** Always use the `prisma` instance provided by the auth context. This instance has `userScopedPrismaClientExtension` applied, which enforces repository visibility rules (e.g., filtering repos based on user permissions). Do NOT import `prisma` directly from `@/prisma` in actions or routes that return data to the client. - -**Server actions** - Wrap with `sew()` for error handling: - -```ts -'use server'; - -import { sew } from "@/middleware/sew"; -import { withAuth } from "@/middleware/withAuth"; - -export const myProtectedAction = async ({ id }: { id: string }) => sew(() => - withAuth(async ({ org, user, prisma }) => { - // user is guaranteed to be defined - // prisma is scoped to the user - return { success: true }; - }) -); - -export const myPublicAction = async ({ id }: { id: string }) => sew(() => - withOptionalAuth(async ({ org, user, prisma }) => { - // user may be undefined for anonymous access - return { success: true }; - }) -); -``` - -**API routes** - Check `isServiceError` and return `serviceErrorResponse`: - -```ts -import { serviceErrorResponse } from "@/lib/serviceError"; -import { isServiceError } from "@/lib/utils"; -import { withAuth } from "@/middleware/withAuth"; - -export const GET = apiHandler(async (request: NextRequest) => { - const result = await withAuth(async ({ org, user, prisma }) => { - // ... your logic - return data; - }); - - if (isServiceError(result)) { - return serviceErrorResponse(result); - } - - return Response.json(result); -}); -``` - -## Membership States - -Organization membership state is derived from fields on `UserToOrg`: - -- **Active**: `suspendedAt` is `null` and `lastActiveAt` is not `null`. Active members can access the org and count as billable seats. -- **Pending**: `suspendedAt` is `null` and `lastActiveAt` is `null`. Pending users can access the org, but are not billable yet. -- **Suspended**: `suspendedAt` is not `null`. Suspended users cannot access the org and are not billable. - -When filtering memberships, use the helper predicates from `packages/web/src/features/membership/utils.ts` instead of writing these conditions inline. This keeps auth, billing, SCIM, and UI queries aligned as the state rules evolve. - -```ts -import { - activeMembershipWhere, - activeOrPendingMembershipWhere, - pendingMembershipWhere, - suspendedMembershipWhere, -} from "@/features/membership/utils"; - -// Billable seat count. -await prisma.userToOrg.count({ - where: { - orgId, - ...activeMembershipWhere(), - }, -}); - -// Users who should be able to access the org. -await prisma.userToOrg.findMany({ - where: { - orgId, - ...activeOrPendingMembershipWhere(), - }, -}); -``` - -## Next.js Router Navigation - -Do NOT call `router.refresh()` immediately after `router.push()`. In Next.js 16, the prefetch cache and navigation system was completely rewritten, and calling `router.refresh()` right after `router.push()` creates a race condition. The refresh invalidates the cache and can interrupt the in-flight navigation, leaving the page stuck or not loading. - -```ts -// Bad - router.refresh() races with router.push() in Next.js 16 -router.push(url); -router.refresh(); // ❌ can cancel the navigation - -// Good - if navigating to a new route, the page will fetch fresh data on load -router.push(url); // ✅ -``` - -If you need to refresh server component data after a mutation, use the server-side `refresh()` from `next/cache` in a Server Action instead of `router.refresh()` on the client. - -## Documentation Writing Style - -When writing or editing `.mdx` files in `docs/`: - -- Do NOT use em dashes (`—`). Use periods to break sentences, commas, or parentheses instead. -- Write in second person ("you") and present tense. -- Keep sentences short and direct. Lead with what the user needs to know. -- Use bold for UI elements and key terms (e.g., **Settings → API Keys**). -- Use inline code for technical values, flags, and identifiers (e.g., `REPO_READ`). -- Prefer short paragraphs (1-3 sentences). Use bullet lists to break up dense information. -- Use tables for parameter documentation. - -## Docs Images - -Images added to `.mdx` files in `docs/` should be wrapped in a `` component: - -```mdx - - Description - -``` - -## Fixing CVEs - -When fixing a CVE in a transitive dependency, prefer a real top-level upgrade over a forced `resolutions` override. - -1. **Trace the dependency chain to a package in your own `package.json`.** Run: - - ```bash - yarn why --recursive - ``` - - "Top-level" means a package **literally listed in this repo's root or workspace `package.json`** under `dependencies`, `devDependencies`, or `peerDependencies` — not just any ancestor in the chain. If the chain is `vulnerable-pkg → mid-pkg → top-pkg`, do not stop at `mid-pkg`; keep walking until you reach `top-pkg`. - -2. **Check whether the existing ranges already allow a patched version.** Often the lockfile is just stale: every `^x.y.z` range in the chain still admits the patched version, but `yarn.lock` was written before that version existed. In that case, refresh the lockfile entry — no `package.json` change, no `resolutions` override: - - ```bash - yarn up -R - ``` - - This is the lightest-weight fix: it doesn't force a version, it just bumps the lock to the latest version that satisfies the constraints already in the tree. Verify with `yarn why ` afterward — if every instance is now patched, you're done. - -3. **If a refresh isn't enough, bump the top-level dependency** to a version whose transitive tree no longer includes the vulnerable version. This is also a real, supported upgrade. Verify the upgrade actually removes the vulnerable version with `yarn why ` after running `yarn install`. - -4. **Fall back to a `resolutions` override** only if neither a refresh nor a top-level bump resolves it (no compatible version exists in the existing ranges, or a top-level upgrade would require a breaking major). Use the **qualified** form keyed to the existing source range (not a bare key, which overrides every requester unnecessarily), and pin with `^`, not `>=`: - - ```json - "resolutions": { - "@npm:": "^" - } - ``` - - The `` is whatever range is currently requesting the vulnerable version (find it in `yarn.lock`, e.g. `^2.8.3`). Avoid the bare-key form `"": "^x.y.z"`. - -### Branch naming for CVE fixes - -Use a **package-keyed** branch name, not a CVE-keyed one: - -``` -cursor/cve/ -``` - -Multiple CVEs against the same package commonly land in one upstream release, so package-keyed branches let sibling work join the same PR (see "Batching CVEs" below). Do not include the CVE ID or a Linear issue ID in the branch name. - -### Batching CVEs that share a package - -CVEs often arrive in clusters because one package release fixes several at once. Before opening a new PR, check whether a sibling PR is already addressing the same package. - -1. **Extract** `` and `` from the Linear issue (the Dependabot-sourced body lists both — affected package and fixed version). - -2. **Look for a sibling PR**: - - ```bash - gh pr list --state open --search ' in:title' --json number,title,headRefName - ``` - -3. **Decide based on the result**: - - - **Sibling PR exists and its branch already pins ≥ ``**: - - `gh pr checkout ` - - Leave the CHANGELOG line as-is — it does not enumerate CVEs, so no edit is needed. Do not add a new CHANGELOG line. - - `gh pr edit ` to append the CVE ID to the title and body, and add a `Fixes ` line to the PR body alongside any existing `Fixes` lines (this auto-links the Linear issue and Linear will mark it Done when the PR merges). - - Do not transition the Linear issue manually — leave it for the merge to close. - - **Do not open a new PR.** - - - **Sibling PR exists but its pin is too low to cover this CVE**: - - Check out the branch. - - Bump the resolution / package version higher to cover both. - - **Edit** the existing CHANGELOG line — update the version. Update the PR title and body, and add `Fixes ` to the PR body. - - Do not transition the Linear issue manually — leave it for the merge to close. - - - **No sibling PR exists**: - - Create a new `cursor/cve/` branch and open the PR as usual. - -4. **Post-flight (race-window backstop)**: After opening a new PR, re-run step 2. If a competing PR with a *lower* number appeared while you were working, close yours, push your CHANGELOG entry and Linear link onto the older PR. - -### CHANGELOG and PR conventions for CVE fixes - -- CHANGELOG entry (under `[Unreleased] → Fixed`): `Upgraded \`\` to \`^x.y.z\`. [#]`. Do NOT list CVE IDs in the CHANGELOG. -- **One CHANGELOG line per PR**, not per CVE. A batched PR addressing multiple CVEs still gets a single line that does not enumerate them. -- PR title format: `chore: upgrade to ^x.y.z to address CVE-A, CVE-B, ...` (list every CVE the PR resolves). -- Keep entries short. CVE IDs belong in the PR title and body, not the CHANGELOG. - -## Branches and Pull Requests - -When creating a branch or opening a PR, ask the user for: -1. The Linear issue ID (if available) -2. The GitHub issue number (if available) - -Branch naming convention: -- General: `/-` -- Bug fixes: `/fix-` -- If no Linear issue ID is available, omit it from the branch name - -PR title should follow conventional commit standards: -- `feat:` new feature or functionality -- `fix:` bug fix -- `docs:` documentation or README changes -- `chore:` maintenance tasks, dependency updates, etc. -- `refactor:` code refactoring without changing behavior -- `test:` adding or updating tests - -You can optionally include a scope to indicate which package is affected: -- `feat(web):` feature in the web package -- `fix(worker):` bug fix in the worker package (`backend/`) - -PR description: -- If a GitHub issue number was provided, include `Fixes #` in the PR description -- If a Linear issue ID was provided (e.g., SOU-123), include `Fixes SOU-123` at the top of the PR description to auto-link the PR to the Linear issue - -After the PR is created: -- Update CHANGELOG.md with an entry under `[Unreleased]` linking to the new PR. New entries should be placed at the bottom of their section. -- Do NOT add a CHANGELOG entry for documentation-only changes (e.g., changes only in `docs/`) -- Enterprise-only features (gated by an entitlement) should be prefixed with `[EE]` in the CHANGELOG entry (e.g., `- [EE] Added support for ...`) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index a881eee15..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,166 +0,0 @@ -# Contributing to Sourcebot - -So you're interested in contributing to Sourcebot. Great! If you have any questions, don't hesitate to reach out on our [Discord](https://discord.gg/HDScTs3ptP). - -## Understanding the Licenses - -First thing to know is that Sourcebot is not a side-project - it is a product of a company based in San Francisco who builds and maintains it professionally. For this reason, Sourcebot follows the [open core](https://en.wikipedia.org/wiki/Open-core_model) business model, which splits the codebase into two parts: **core** and **ee**, which each have their own license: - -- **core** code is licensed under the [Functional Source License](https://fsl.software/), a -mostly permissive non-compete license that converts to Apache 2.0 or MIT after two years. Code shipped in core (without ee) forms the [Sourcebot Community Edition (CE)](https://www.sourcebot.dev/pricing). -- **ee (enterprise)** code is licensed under the [Sourcebot Enterprise License](ee/license), a commercial license that covers our enterprise offering. Usage of ee code requires a valid license key. Code shipped in core **and** ee forms the [Sourcebot Enterprise Edition (EE)](https://www.sourcebot.dev/pricing). - -You can take a look at the root [LICENSE.md](LICENSE.md) for a breakdown of what code is core or ee. - -For contributing, the breakdown is as follows: - -- **core** : you're free to contribute, but you can't take this and use it to compete with us. You can, however, otherwise use it however you want. Your changes will convert to Apache 2.0 after two years. -- **ee** : you can also contribute, but Sourcebot retains all rights to your modifications and patches. Your contributions can only be used in production by those with a valid Enterprise license. - -## Contributor Policy - -We want to make it easy to contribute to Sourcebot. Here are the most common types of changes that get merged: -- Bug fixes -- Improvements to our code host integrations -- Additional LLM providers -- Documentation improvements - -However, any UI or core product feature must go through a design review with the core team before implementation. If you're unsure if your PR would be accepted, ask a maintainer. - -> [!NOTE] -> PRs that ignore these guardrails will likely be closed. - -Want to take on an issue? Leave a comment and a maintainer may assign it to you unless it is something we are already working on. - -## Developing Sourcebot - -1. Install go, docker, and NodeJS. Note that a NodeJS version of at least `24` is required. - -2. Install [universal-ctags](https://github.com/universal-ctags/ctags) v6.1.0 (required by zoekt). Version 6.1.0 is required — newer versions have a known incompatibility with zoekt. - - **macOS:** Run the provided install script: - ```sh - ./install-ctags-macos.sh - ``` - - **Linux and other platforms:** Build from source: - ```sh - curl https://codeload.github.com/universal-ctags/ctags/tar.gz/v6.1.0 | tar xz -C /tmp - cd /tmp/ctags-6.1.0 - ./autogen.sh - ./configure --program-prefix=universal- --enable-json - make -j$(nproc) - sudo make install - ``` - - After installing, set `CTAGS_COMMAND` in your `.env.development.local` to the path of the installed binary (e.g. `/usr/local/bin/universal-ctags`). - -3. Install and enable Corepack so the repository uses the Yarn version pinned in `package.json`: - ```sh - npm install -g corepack - corepack enable - yarn --version - ``` - -3. Clone the repository with submodules: - ```sh - git clone --recurse-submodules https://github.com/sourcebot-dev/sourcebot.git - ``` -4. Run `make` to build zoekt and install dependencies: - ```sh - cd sourcebot - make - ``` - - The zoekt binaries and web dependencies are placed into `bin` and `node_modules` respectively. - - **Note**: `make` should also be run whenever switching between branches to ensure all dependencies are upto date. - -5. Start the development Docker containers for PostgreSQL and Redis. - - ```sh - docker compose -f docker-compose-dev.yml up -d - ``` - -6. Generate the database schema. - ```sh - yarn dev:prisma:migrate:dev - ``` - -7. Create a copy of `.env.development` and name it `.env.development.local`. Update the required environment variables. - -8. If you're using a declarative configuration file, create a configuration file and update the `CONFIG_PATH` environment variable in your `.env.development.local` file. - -9. Start Sourcebot with the command: - ```sh - yarn dev - ``` - - A `.sourcebot` directory will be created and zoekt will begin to index the repositories found in the `config.json` file. - -10. Start searching at `http://localhost:3000`. - -## Debugging - -### React Scan - -[React Scan](https://react-scan.com) highlights components that are re-rendering, which is useful for diagnosing unnecessary renders and performance issues. It only runs in development mode. - -To enable it, set the following in your `.env.development.local`: - -```sh -DEBUG_ENABLE_REACT_SCAN=true -``` - -Then restart the dev server. Components that re-render will be highlighted in the browser. - -## Pull Request Expectations - -### Issue First Policy - -**All PRs must reference an existing issue.** Before opening a PR, open an issue describing the bug or feature. This helps maintainers triage and prevents duplicate work. PRs without a linked issue may be closed without review. - -- Use `Fixes #123` or `Closes #123` in your PR description to link the issue -- For small fixes, a brief issue is fine - just enough context for maintainers to understand the problem - -### General Requirements - -- Keep pull requests small and focused -- Explain the issue and why your change fixes it -- Before adding new functionality, ensure it doesn't already exist elsewhere in the codebase -- Update `CHANGELOG.md` with an entry under `[Unreleased]` linking to your PR. New entries should be placed at the bottom of their section. - -### UI Changes - -If your PR includes UI changes, please include screenshots or videos showing the before and after. This helps maintainers review faster and gives you quicker feedback. - -### Logic Changes - -For non-UI changes (bug fixes, new features, refactors), explain **how you verified it works**: - -- What did you test? -- How can a reviewer reproduce/confirm the fix? - -### No AI-Generated Walls of Text - -Long, AI-generated PR descriptions and issues are not acceptable and may be ignored. Respect the maintainers' time: - -- Write short, focused descriptions -- Explain what changed and why in your own words -- If you can't explain it briefly, your PR might be too large - -### PR Titles - -PR titles should follow conventional commit standards: - -- `feat:` new feature or functionality -- `fix:` bug fix -- `docs:` documentation or README changes -- `chore:` maintenance tasks, dependency updates, etc. -- `refactor:` code refactoring without changing behavior -- `test:` adding or updating tests - -You can optionally include a scope to indicate which package is affected: - -- `feat(web):` feature in the web package -- `fix(worker):` bug fix in the worker package (`backend/`) diff --git a/Coastfile b/Coastfile deleted file mode 100644 index 2af8d3056..000000000 --- a/Coastfile +++ /dev/null @@ -1,81 +0,0 @@ -[coast] -name = "sourcebot" -compose = "./docker-compose-dev.yml" -primary_port = "web" -private_paths = ["packages/web/.next"] -worktree_dir = [".worktrees", ".claude/worktrees", "~/.cursor/worktrees/sourcebot", "~/conductor/workspaces/sourcebot"] - -[coast.setup] -packages = ["nodejs", "npm", "go", "make", "git", "bash", "ca-certificates", "ctags"] -run = [ - "npm install -g corepack", - "corepack enable", -] - -# Zoekt code search server (Go binary built by `make`) -[services.zoekt] -install = "cd /workspace && (test -f bin/zoekt-webserver || make zoekt)" -command = "cd /workspace && ./bin/zoekt-webserver -index .sourcebot/index -rpc" -port = 6070 -restart = "on-failure" -cache = ["bin"] - -# Next.js frontend + API -[services.web] -install = ["cd /workspace && (test -f node_modules/.yarn-state.yml || DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/postgres make yarn)", "cd /workspace && test -f config.json || echo {} > config.json", "cd /workspace && DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/postgres yarn dev:prisma:migrate:dev"] -command = "cd /workspace && AUTH_URL=http://localhost:${WEB_DYNAMIC_PORT:-3000} DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/postgres REDIS_URL=redis://host.docker.internal:6379 yarn dev:web" -port = 3000 -restart = "on-failure" -cache = ["node_modules"] - -# Background worker -[services.backend] -install = "cd /workspace && (test -f node_modules/.yarn-state.yml || DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/postgres make yarn)" -command = "cd /workspace && DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/postgres REDIS_URL=redis://host.docker.internal:6379 yarn dev:backend" -restart = "on-failure" -cache = ["node_modules"] - -# Shared services — run on host Docker so all Coasts share one DB and cache -[shared_services.postgres] -image = "postgres:16-alpine" -ports = [5432] -volumes = ["sourcebot_postgres_data:/var/lib/postgresql/data"] -env = { POSTGRES_DB = "postgres", POSTGRES_USER = "postgres", POSTGRES_PASSWORD = "postgres" } - -[shared_services.redis] -image = "redis:7-alpine" -ports = [6379] -volumes = ["sourcebot_redis_data:/data"] - -# Override DATABASE_URL to reach shared postgres from bare services -[secrets.database_url] -extractor = "command" -run = "echo postgresql://postgres:postgres@host.docker.internal:5432/postgres" -inject = "env:DATABASE_URL" - -# Override REDIS_URL to reach shared redis from bare services -[secrets.redis_url] -extractor = "command" -run = "echo redis://host.docker.internal:6379" -inject = "env:REDIS_URL" - -[ports] -web = 3000 -postgres = 5432 -redis = 6379 -zoekt = 6070 - - -[assign] -default = "none" -exclude_paths = ["docs", "schemas", "scripts", "configs", ".github", "ee"] - -[assign.services] -web = "hot" -backend = "hot" -zoekt = "none" - -[assign.rebuild_triggers] -web = ["package.json", "yarn.lock", "packages/db/prisma/schema.prisma", "packages/db/prisma/migrations"] -backend = ["package.json", "yarn.lock", "packages/db/prisma/schema.prisma", "packages/db/prisma/migrations"] -zoekt = ["vendor/zoekt"] \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 17a85cb21..000000000 --- a/Dockerfile +++ /dev/null @@ -1,250 +0,0 @@ -# syntax=docker/dockerfile:1 -# ------ Global scope variables ------ - -# Set of global build arguments. -# These are considered "public" and will be baked into the image. -# The convention is to prefix these with `NEXT_PUBLIC_` so that -# they can be optionally be passed as client-side environment variables -# in the webapp. -# @see: https://docs.docker.com/build/building/variables/#scoping - -ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT -ARG NEXT_PUBLIC_SENTRY_WEBAPP_DSN -ARG NEXT_PUBLIC_SENTRY_BACKEND_DSN -ARG NEXT_PUBLIC_BUILD_COMMIT_SHA - -FROM node:24-alpine3.23 AS node-alpine -FROM golang:1.26-alpine AS go-alpine -# ---------------------------------- - -# ------ Build Zoekt ------ -FROM go-alpine AS zoekt-builder -RUN apk add --no-cache ca-certificates -WORKDIR /zoekt -COPY vendor/zoekt/go.mod vendor/zoekt/go.sum ./ -RUN go mod download -COPY vendor/zoekt ./ -RUN CGO_ENABLED=0 GOOS=linux go build -o /cmd/ ./cmd/... -# ------------------------- - -# ------ Build shared libraries ------ -FROM node-alpine AS shared-libs-builder -WORKDIR /app - -COPY package.json yarn.lock* .yarnrc.yml ./ -COPY .yarn ./.yarn -COPY ./packages/db ./packages/db -COPY ./packages/schemas ./packages/schemas -COPY ./packages/shared ./packages/shared -COPY ./packages/queryLanguage ./packages/queryLanguage - -RUN yarn workspace @sourcebot/db install -RUN yarn workspace @sourcebot/schemas install -RUN yarn workspace @sourcebot/shared install -RUN yarn workspace @sourcebot/query-language install -# ------------------------------------ - -# ------ Build Web ------ -FROM node-alpine AS web-builder -ENV SKIP_ENV_VALIDATION=1 -# ----------- -ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT -ENV NEXT_PUBLIC_SENTRY_ENVIRONMENT=$NEXT_PUBLIC_SENTRY_ENVIRONMENT -ARG NEXT_PUBLIC_SENTRY_WEBAPP_DSN -ENV NEXT_PUBLIC_SENTRY_WEBAPP_DSN=$NEXT_PUBLIC_SENTRY_WEBAPP_DSN -ARG NEXT_PUBLIC_BUILD_COMMIT_SHA -ENV NEXT_PUBLIC_BUILD_COMMIT_SHA=$NEXT_PUBLIC_BUILD_COMMIT_SHA - -ARG SENTRY_ORG -ENV SENTRY_ORG=$SENTRY_ORG -ARG SENTRY_WEBAPP_PROJECT -ENV SENTRY_WEBAPP_PROJECT=$SENTRY_WEBAPP_PROJECT -ARG SENTRY_RELEASE -ENV SENTRY_RELEASE=$SENTRY_RELEASE -# ----------- - -RUN apk add --no-cache libc6-compat -WORKDIR /app - -COPY package.json yarn.lock* .yarnrc.yml ./ -COPY .yarn ./.yarn -COPY ./packages/web ./packages/web -COPY --from=shared-libs-builder /app/node_modules ./node_modules -COPY --from=shared-libs-builder /app/packages/db ./packages/db -COPY --from=shared-libs-builder /app/packages/schemas ./packages/schemas -COPY --from=shared-libs-builder /app/packages/shared ./packages/shared -COPY --from=shared-libs-builder /app/packages/queryLanguage ./packages/queryLanguage - -# Fixes arm64 timeouts -RUN yarn workspace @sourcebot/web install - -ENV NEXT_TELEMETRY_DISABLED=1 - -RUN --mount=type=secret,id=sentry_auth_token,env=SENTRY_AUTH_TOKEN \ - yarn workspace @sourcebot/web build -ENV SKIP_ENV_VALIDATION=0 -# ------------------------------ - -# ------ Build Backend ------ -FROM node-alpine AS backend-builder -ENV SKIP_ENV_VALIDATION=1 -# ----------- - -ARG SENTRY_ORG -ENV SENTRY_ORG=$SENTRY_ORG -ARG SENTRY_BACKEND_PROJECT -ENV SENTRY_BACKEND_PROJECT=$SENTRY_BACKEND_PROJECT -ARG SENTRY_RELEASE -ENV SENTRY_RELEASE=$SENTRY_RELEASE -# ----------- - -WORKDIR /app - -COPY package.json yarn.lock* .yarnrc.yml ./ -COPY .yarn ./.yarn -COPY ./schemas ./schemas -COPY ./packages/backend ./packages/backend -COPY --from=shared-libs-builder /app/node_modules ./node_modules -COPY --from=shared-libs-builder /app/packages/db ./packages/db -COPY --from=shared-libs-builder /app/packages/schemas ./packages/schemas -COPY --from=shared-libs-builder /app/packages/shared ./packages/shared -COPY --from=shared-libs-builder /app/packages/queryLanguage ./packages/queryLanguage -RUN yarn workspace @sourcebot/backend install -RUN yarn workspace @sourcebot/backend build - -RUN --mount=type=secret,id=sentry_auth_token,env=SENTRY_AUTH_TOKEN \ - if [ -n "$SENTRY_AUTH_TOKEN" ] && [ -n "$SENTRY_ORG" ] && [ -n "$SENTRY_BACKEND_PROJECT" ] && [ -n "$SENTRY_RELEASE" ]; then \ - apk add --no-cache curl; \ - curl -sL https://sentry.io/get-cli/ | sh; \ - sentry-cli sourcemaps inject --org $SENTRY_ORG --project $SENTRY_BACKEND_PROJECT --release $SENTRY_RELEASE ./packages/backend/dist; \ - sentry-cli sourcemaps upload --org $SENTRY_ORG --project $SENTRY_BACKEND_PROJECT --release $SENTRY_RELEASE ./packages/backend/dist; \ -fi - -ENV SKIP_ENV_VALIDATION=0 -# ------------------------------ - -# ------ Runner ------ -FROM node-alpine AS runner -# ----------- -ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT -ENV NEXT_PUBLIC_SENTRY_ENVIRONMENT=$NEXT_PUBLIC_SENTRY_ENVIRONMENT -ARG NEXT_PUBLIC_SENTRY_WEBAPP_DSN -ENV NEXT_PUBLIC_SENTRY_WEBAPP_DSN=$NEXT_PUBLIC_SENTRY_WEBAPP_DSN -ARG NEXT_PUBLIC_SENTRY_BACKEND_DSN -ENV NEXT_PUBLIC_SENTRY_BACKEND_DSN=$NEXT_PUBLIC_SENTRY_BACKEND_DSN -ARG NEXT_PUBLIC_BUILD_COMMIT_SHA -ENV NEXT_PUBLIC_BUILD_COMMIT_SHA=$NEXT_PUBLIC_BUILD_COMMIT_SHA -# ----------- - -WORKDIR /app -ENV NODE_ENV=production -ENV NEXT_TELEMETRY_DISABLED=1 -ENV DATA_DIR=/data -ENV DATA_CACHE_DIR=$DATA_DIR/.sourcebot -ENV SOURCEBOT_PUBLIC_KEY_PATH=/app/public.pem -# PAPIK = Project API Key -# Note that this key does not need to be kept secret, so it's not -# necessary to use Docker build secrets here. -# @see: https://posthog.com/tutorials/api-capture-events#authenticating-with-the-project-api-key -# @note: this is also declared in the shared env.server.ts file. -ENV POSTHOG_PAPIK=phc_lLPuFFi5LH6c94eFJcqvYVFwiJffVcV6HD8U4a1OnRW - -# Valid values are: debug, info, warn, error -ENV SOURCEBOT_LOG_LEVEL=info - -# Sourcebot collects anonymous usage data using [PostHog](https://posthog.com/). Uncomment this line to disable. -# ENV SOURCEBOT_TELEMETRY_DISABLED=1 - -# Configure dependencies -RUN apk add --no-cache git ca-certificates bind-tools tini jansson wget supervisor uuidgen curl perl jq openssl util-linux unzip && \ - apk upgrade --no-cache - -# Remove npm (unused — we use Yarn). The Node.js base image bundles npm -# with its own transitive dependencies (minimatch, tar, picomatch, etc.) -# that Trivy flags as vulnerable. Since npm is never invoked at runtime, -# removing it eliminates these false positives and reduces image size. -RUN rm -rf /usr/local/lib/node_modules/npm && \ - rm -rf /usr/local/bin/npm && \ - rm -rf /usr/local/bin/npx && \ - rm -rf /root/.npm && \ - rm -rf /root/.node-gyp - -ARG UID=1500 -ARG GID=1500 - -# Always create the non-root user to support runtime user switching -# The container can be run as root (default) or as sourcebot user using docker run --user -RUN addgroup -g $GID sourcebot && \ - adduser -D -u $UID -h /app -S sourcebot && \ - chown -R sourcebot /app && \ - adduser sourcebot node && \ - mkdir /var/log/sourcebot && \ - chown sourcebot /var/log/sourcebot - -COPY package.json yarn.lock* .yarnrc.yml public.pem ./ -COPY .yarn ./.yarn - -# Configure zoekt -COPY vendor/zoekt/install-ctags-alpine.sh . -RUN ./install-ctags-alpine.sh && rm install-ctags-alpine.sh && \ - # Clean up ctags build artifacts - rm -rf /tmp/* -RUN mkdir -p ${DATA_CACHE_DIR} -COPY --from=zoekt-builder \ -/cmd/zoekt-git-index \ -/cmd/zoekt-indexserver \ -/cmd/zoekt-mirror-github \ -/cmd/zoekt-mirror-gitiles \ -/cmd/zoekt-mirror-bitbucket-server \ -/cmd/zoekt-mirror-gitlab \ -/cmd/zoekt-mirror-gerrit \ -/cmd/zoekt-webserver \ -/cmd/zoekt-index \ -/usr/local/bin/ - -RUN chown -R sourcebot:sourcebot /app - -# Copy zoekt proto files (needed for gRPC client at runtime) -COPY --chown=sourcebot:sourcebot vendor/zoekt/grpc/protos /app/vendor/zoekt/grpc/protos - -# Copy OpenAPI docs -COPY --chown=sourcebot:sourcebot docs/api-reference/sourcebot-public.openapi.json /app/docs/api-reference/sourcebot-public.openapi.json - -# Copy all of the things -COPY --chown=sourcebot:sourcebot --from=web-builder /app/packages/web/public ./packages/web/public -COPY --chown=sourcebot:sourcebot --from=web-builder /app/packages/web/.next/standalone ./ -COPY --chown=sourcebot:sourcebot --from=web-builder /app/packages/web/.next/static ./packages/web/.next/static - -COPY --chown=sourcebot:sourcebot --from=backend-builder /app/node_modules ./node_modules -COPY --chown=sourcebot:sourcebot --from=backend-builder /app/packages/backend ./packages/backend - -COPY --chown=sourcebot:sourcebot --from=shared-libs-builder /app/packages/db ./packages/db -COPY --chown=sourcebot:sourcebot --from=shared-libs-builder /app/packages/schemas ./packages/schemas -COPY --chown=sourcebot:sourcebot --from=shared-libs-builder /app/packages/shared ./packages/shared -COPY --chown=sourcebot:sourcebot --from=shared-libs-builder /app/packages/queryLanguage ./packages/queryLanguage - -# Fixes git "dubious ownership" issues when the volume is mounted with different permissions to the container. -RUN git config --system safe.directory "*" - -# Make app directory accessible to both root and sourcebot user -RUN chown -R sourcebot /app \ - && chgrp -R 0 /app \ - && chmod -R g=u /app -# Make data directory accessible to both root and sourcebot user -RUN chown -R sourcebot /data - -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf -COPY prefix-output.sh ./prefix-output.sh -RUN chmod +x ./prefix-output.sh -COPY entrypoint.sh ./entrypoint.sh -RUN chmod +x ./entrypoint.sh - -# Note: for back-compat cases, we do _not_ set the USER directive here. -# Instead, the user can be overridden at runtime with --user flag. -# USER sourcebot - -EXPOSE 3000 -ENV PORT=3000 -ENV HOSTNAME="0.0.0.0" -ENTRYPOINT ["/sbin/tini", "--", "./entrypoint.sh"] -# ------------------------------ \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md index 8d2d7b72a..c3594723e 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,115 +1,21 @@ -Copyright (c) 2026 Taqla Inc. - -Portions of this software are licensed as follows: - -- All content located within any folder or subfolder named “ee” in this repository is licensed under the terms specified in “ee/LICENSE”, -- All third party components incorporated into the Sourcebot Software are licensed under the original license provided by the owner of the applicable component. -- Content outside of the above mentioned directories or restrictions above is available under the "Functional Source License" as defined below. - ---- - -# Functional Source License, Version 1.1, ALv2 Future License - -## Abbreviation - -FSL-1.1-ALv2 - -## Notice - -Copyright 2026 Taqla Inc. - -## Terms and Conditions - -### Licensor ("We") - -The party offering the Software under these Terms and Conditions. - -### The Software - -The "Software" is each version of the software that we make available under -these Terms and Conditions, as indicated by our inclusion of these Terms and -Conditions with the Software. - -### License Grant - -Subject to your compliance with this License Grant and the Patents, -Redistribution and Trademark clauses below, we hereby grant you the right to -use, copy, modify, create derivative works, publicly perform, publicly display -and redistribute the Software for any Permitted Purpose identified below. - -### Permitted Purpose - -A Permitted Purpose is any purpose other than a Competing Use. A Competing Use -means making the Software available to others in a commercial product or -service that: - -1. substitutes for the Software; - -2. substitutes for any other product or service we offer using the Software - that exists as of the date we make the Software available; or - -3. offers the same or substantially similar functionality as the Software. - -Permitted Purposes specifically include using the Software: - -1. for your internal use and access; - -2. for non-commercial education; - -3. for non-commercial research; and - -4. in connection with professional services that you provide to a licensee - using the Software in accordance with these Terms and Conditions. - -### Patents - -To the extent your use for a Permitted Purpose would necessarily infringe our -patents, the license grant above includes a license under our patents. If you -make a claim against any party that the Software infringes or contributes to -the infringement of any patent, then your patent license to the Software ends -immediately. - -### Redistribution - -The Terms and Conditions apply to all copies, modifications and derivatives of -the Software. - -If you redistribute any copies, modifications or derivatives of the Software, -you must include a copy of or a link to these Terms and Conditions and not -remove any copyright notices provided in or with the Software. - -### Disclaimer - -THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR -PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT. - -IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE -SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, -EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE. - -### Trademarks - -Except for displaying the License Details and identifying us as the origin of -the Software, you have no right under these Terms and Conditions to use our -trademarks, trade names, service marks or product names. - -## Grant of Future License - -We hereby irrevocably grant you an additional license to use the Software under -the Apache License, Version 2.0 that is effective on the second anniversary of -the date we make the Software available. On or after that date, you may use the -Software under the Apache License, Version 2.0, in which case the following -will apply: - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. - -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. \ No newline at end of file +MIT License + +Copyright (c) 2026 Taqla, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index 0c58c00ac..000000000 --- a/Makefile +++ /dev/null @@ -1,56 +0,0 @@ - -CMDS := update_submodule zoekt yarn - -ALL: $(CMDS) - -yarn: - yarn install - yarn build:deps - -zoekt: - mkdir -p bin - go build -C vendor/zoekt -o $(CURDIR)/bin ./cmd/... - export PATH="$(CURDIR)/bin:$(PATH)" - export CTAGS_COMMANDS=ctags - -update_submodule: - git submodule update - -clean: - @if docker ps 2>/dev/null | grep -q sourcebot-redis; then \ - echo "Flushing Redis in Docker container..."; \ - docker exec sourcebot-redis redis-cli FLUSHALL; \ - else \ - echo "Flushing local Redis..."; \ - redis-cli FLUSHALL; \ - fi - yarn dev:prisma:migrate:reset - - rm -rf \ - bin \ - node_modules \ - packages/web/node_modules \ - packages/web/.next \ - packages/backend/dist \ - packages/backend/node_modules \ - packages/db/node_modules \ - packages/db/dist \ - packages/schemas/node_modules \ - packages/schemas/dist \ - packages/shared/node_modules \ - packages/shared/dist \ - .sourcebot - -soft-reset: - rm -rf .sourcebot - @if docker ps 2>/dev/null | grep -q sourcebot-redis; then \ - echo "Flushing Redis in Docker container..."; \ - docker exec sourcebot-redis redis-cli FLUSHALL; \ - else \ - echo "Flushing local Redis..."; \ - redis-cli FLUSHALL; \ - fi - yarn dev:prisma:migrate:reset - - -.PHONY: bin diff --git a/_typos.toml b/_typos.toml deleted file mode 100644 index fcf2868ba..000000000 --- a/_typos.toml +++ /dev/null @@ -1,6 +0,0 @@ -[default.extend-words] -# Don't correct the surname "Do Not Exists" -dne = "dne" - -[files] -extend-exclude = ["vendor/**/*", "CHANGELOG.md", "packages/web/src/lib/languageMetadata.ts"] diff --git a/configs/auth.json b/configs/auth.json deleted file mode 100644 index cb08e5831..000000000 --- a/configs/auth.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "../schemas/v3/index.json", - "connections": { - "example-1": { - "type": "github", - "token": { - "env": "GITHUB_TOKEN_ENV_VAR" - } - }, - "example-2": { - "type": "gitlab", - "token": { - "env": "GITLAB_TOKEN_ENV_VAR" - }, - "groups": [ - "my-group" - ] - }, - "example-3": { - "type": "gitea", - "token": { - "env": "GITEA_TOKEN_ENV_VAR" - }, - "orgs": [ - "my-org" - ] - } - } -} \ No newline at end of file diff --git a/configs/basic.json b/configs/basic.json deleted file mode 100644 index db23c4e0c..000000000 --- a/configs/basic.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "$schema": "../schemas/v3/index.json", - // Note: to include private repositories, you must provide an authentication token. - // See: configs/auth.json for a example. - "connections": { - // From GitHub, include: - // - all public repos owned by user `torvalds` - // - all public repos owned by organization `commai` - // - repo `sourcebot-dev/sourcebot` - "example-1": { - "type": "github", - "users": [ - "torvalds" - ], - "orgs": [ - "commaai" - ], - "repos": [ - "sourcebot-dev/sourcebot" - ] - }, - // From GitLab, include: - // - all public projects owned by user `brendan67` - // - all public projects in group `my-group` and sub-group `sub-group` - // - project `my-group/project1` - "example-2": { - "type": "gitlab", - "users": [ - "brendan67" - ], - "groups": [ - "my-group", - "my-other-group/sub-group" - ], - "projects": [ - "my-group/project1" - ] - }, - // From Gitea, include: - // - all public repos owned by user `my-user` - // - all public repos owned by organization `my-org` - // - repo `my-org/my-repo` - "example-3": { - "type": "gitea", - "users": [ - "my-user" - ], - "orgs": [ - "my-org" - ], - "repos": [ - "my-org/my-repo" - ] - } - } -} \ No newline at end of file diff --git a/configs/filter.json b/configs/filter.json deleted file mode 100644 index 5a1154fa1..000000000 --- a/configs/filter.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "$schema": "../schemas/v3/index.json", - "connections": { - // Include all repos in my-org, except: - // - repo1 & repo2 - // - repos that are archived or forks - "example-1": { - "type": "github", - "orgs": [ - "my-org" - ], - "exclude": { - "archived": true, - "forks": true, - "repos": [ - "my-org/repo1", - "my-org/repo2", - "my-org/sub-org-1/**", - "my-org/sub-org-*/**" - ] - } - }, - - // Include all projects in my-group, except: - // - project1 & project2 - // - projects that are archived or forks - "example-2": { - "type": "gitlab", - "groups": [ - "my-group" - ], - "exclude": { - "archived": true, - "forks": true, - "projects": [ - "my-group/project1", - "my-group/project2", - "my-org/sub-org-1/**", - "my-org/sub-org-*/**" - ] - } - }, - - // Include all repos in my-org, except: - // - repo1 & repo2 - // - repos that are archived or forks - "example-3": { - "type": "gitea", - "orgs": [ - "my-org" - ], - "exclude": { - "archived": true, - "forks": true, - "repos": [ - "my-org/repo1", - "my-org/repo2", - "my-org/sub-org-1/**", - "my-org/sub-org-*/**" - ] - } - }, - // Include all repos in my-org that have the topic - // "TypeScript" and do not have a topic that starts - // with "test-" - "example-4": { - "type": "github", - "orgs": [ - "my-org" - ], - "topics": [ - "TypeScript" - ], - "exclude": { - "topics": [ - "test-**" - ] - } - }, - // Include all repos in my-group that have the topic - // "TypeScript" and do not have a topic that starts - // with "test-" - "example-5": { - "type": "gitlab", - "groups": [ - "my-group" - ], - "topics": [ - "TypeScript" - ], - "exclude": { - "topics": [ - "test-**" - ] - } - } - } -} \ No newline at end of file diff --git a/configs/multi-branch.json b/configs/multi-branch.json deleted file mode 100644 index 16e67410d..000000000 --- a/configs/multi-branch.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "../schemas/v3/index.json", - "connections": { - "example-1": { - "type": "github", - "revisions": { - // Specify branches to index... - "branches": [ - "main", - "release/*" - ], - // ... or specify tags - "tags": [ - "v*.*.*" - ] - }, - // For each repo (repoa, repob), Sourcebot will index all branches and tags in the repo - // matching the `branches` and `tags` patterns above. Any branches or tags that don't - // match the patterns will be ignored and not indexed. - "repos": [ - "org/repoa", - "org/repob" - ] - } - } -} \ No newline at end of file diff --git a/configs/self-hosted.json b/configs/self-hosted.json deleted file mode 100644 index 3d0e78711..000000000 --- a/configs/self-hosted.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "../schemas/v3/index.json", - "connections": { - "example-1": { - "type": "github", - "url": "https://github.example.com", - "orgs": [ - "my-org-name" - ] - }, - "example-2": { - "type": "gitlab", - "url": "https://gitlab.example.com", - "groups": [ - "my-group" - ] - }, - "example-3": { - "type": "gitea", - "url": "https://gitea.example.com", - "orgs": [ - "my-org-name" - ] - } - } -} \ No newline at end of file diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml deleted file mode 100644 index 5e9aaa90a..000000000 --- a/docker-compose-dev.yml +++ /dev/null @@ -1,30 +0,0 @@ -# docker-compose-dev.yml -version: '3.8' - -services: - redis: - image: redis:7-alpine - container_name: sourcebot-redis - ports: - - "6379:6379" - volumes: - - redis_data:/data - restart: unless-stopped - - postgres: - image: postgres:16-alpine - container_name: sourcebot-postgres - ports: - - "5432:5432" - environment: - POSTGRES_DB: postgres - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - volumes: - - postgres_data:/var/lib/postgresql/data - restart: unless-stopped - -volumes: - redis_data: - postgres_data: - diff --git a/docs/.editorconfig b/docs/.editorconfig deleted file mode 100644 index 163988705..000000000 --- a/docs/.editorconfig +++ /dev/null @@ -1,59 +0,0 @@ -[*] -cpp_indent_braces=false -cpp_indent_multi_line_relative_to=innermost_parenthesis -cpp_indent_within_parentheses=indent -cpp_indent_preserve_within_parentheses=false -cpp_indent_case_labels=false -cpp_indent_case_contents=true -cpp_indent_case_contents_when_block=false -cpp_indent_lambda_braces_when_parameter=true -cpp_indent_goto_labels=one_left -cpp_indent_preprocessor=leftmost_column -cpp_indent_access_specifiers=false -cpp_indent_namespace_contents=true -cpp_indent_preserve_comments=false -cpp_new_line_before_open_brace_namespace=ignore -cpp_new_line_before_open_brace_type=ignore -cpp_new_line_before_open_brace_function=ignore -cpp_new_line_before_open_brace_block=ignore -cpp_new_line_before_open_brace_lambda=ignore -cpp_new_line_scope_braces_on_separate_lines=false -cpp_new_line_close_brace_same_line_empty_type=false -cpp_new_line_close_brace_same_line_empty_function=false -cpp_new_line_before_catch=true -cpp_new_line_before_else=true -cpp_new_line_before_while_in_do_while=false -cpp_space_before_function_open_parenthesis=remove -cpp_space_within_parameter_list_parentheses=false -cpp_space_between_empty_parameter_list_parentheses=false -cpp_space_after_keywords_in_control_flow_statements=true -cpp_space_within_control_flow_statement_parentheses=false -cpp_space_before_lambda_open_parenthesis=false -cpp_space_within_cast_parentheses=false -cpp_space_after_cast_close_parenthesis=false -cpp_space_within_expression_parentheses=false -cpp_space_before_block_open_brace=true -cpp_space_between_empty_braces=false -cpp_space_before_initializer_list_open_brace=false -cpp_space_within_initializer_list_braces=true -cpp_space_preserve_in_initializer_list=true -cpp_space_before_open_square_bracket=false -cpp_space_within_square_brackets=false -cpp_space_before_empty_square_brackets=false -cpp_space_between_empty_square_brackets=false -cpp_space_group_square_brackets=true -cpp_space_within_lambda_brackets=false -cpp_space_between_empty_lambda_brackets=false -cpp_space_before_comma=false -cpp_space_after_comma=true -cpp_space_remove_around_member_operators=true -cpp_space_before_inheritance_colon=true -cpp_space_before_constructor_colon=true -cpp_space_remove_before_semicolon=true -cpp_space_after_semicolon=false -cpp_space_remove_around_unary_operator=true -cpp_space_around_binary_operator=insert -cpp_space_around_assignment_operator=insert -cpp_space_pointer_reference_alignment=left -cpp_space_around_ternary_operator=insert -cpp_wrap_preserve_blocks=one_liners diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index a0e771697..000000000 --- a/docs/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Mintlify Starter Kit - -Click on `Use this template` to copy the Mintlify starter kit. The starter kit contains examples including - -- Guide pages -- Navigation -- Customizations -- API Reference pages -- Use of popular components - -### Development - -Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the documentation changes locally. To install, use the following command - -``` -npm i -g mintlify -``` - -Run the following command at the root of your documentation (where docs.json is) - -``` -mintlify dev -``` - -### Publishing Changes - -Install our Github App to auto propagate changes from your repo to your deployment. Changes will be deployed to production automatically after pushing to the default branch. Find the link to install on your dashboard. - -#### Troubleshooting - -- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies. -- Page loads as a 404 - Make sure you are running in a folder with `docs.json` diff --git a/docs/api-reference/sourcebot-public.openapi.json b/docs/api-reference/sourcebot-public.openapi.json deleted file mode 100644 index 75ac45ebc..000000000 --- a/docs/api-reference/sourcebot-public.openapi.json +++ /dev/null @@ -1,2894 +0,0 @@ -{ - "openapi": "3.0.3", - "info": { - "title": "Sourcebot Public API", - "version": "v5.1.16", - "description": "OpenAPI description for the public Sourcebot REST endpoints used for search, repository listing, and file browsing. Authentication is instance-dependent: API keys are the standard integration mechanism, OAuth bearer tokens are EE-only, and some instances may allow anonymous access." - }, - "tags": [ - { - "name": "Search & Navigation", - "description": "Code search and symbol navigation endpoints." - }, - { - "name": "Connections", - "description": "Code host connection metadata." - }, - { - "name": "Repositories", - "description": "Repository listing and metadata endpoints." - }, - { - "name": "Git", - "description": "Git history, diff, and file content endpoints." - }, - { - "name": "Scoped Access Tokens", - "description": "Mint and revoke short-lived credentials restricted to specific repositories." - }, - { - "name": "System", - "description": "System health and version endpoints." - }, - { - "name": "Enterprise (EE)", - "description": "Enterprise endpoints for user management and audit logging." - } - ], - "security": [ - { - "bearerToken": [] - }, - { - "apiKeyHeader": [] - }, - {} - ], - "components": { - "schemas": { - "PublicSearchResponse": { - "type": "object", - "properties": { - "stats": { - "type": "object", - "properties": { - "actualMatchCount": { - "type": "number" - }, - "totalMatchCount": { - "type": "number" - }, - "duration": { - "type": "number" - }, - "fileCount": { - "type": "number" - }, - "filesSkipped": { - "type": "number" - }, - "contentBytesLoaded": { - "type": "number" - }, - "indexBytesLoaded": { - "type": "number" - }, - "crashes": { - "type": "number" - }, - "shardFilesConsidered": { - "type": "number" - }, - "filesConsidered": { - "type": "number" - }, - "filesLoaded": { - "type": "number" - }, - "shardsScanned": { - "type": "number" - }, - "shardsSkipped": { - "type": "number" - }, - "shardsSkippedFilter": { - "type": "number" - }, - "ngramMatches": { - "type": "number" - }, - "ngramLookups": { - "type": "number" - }, - "wait": { - "type": "number" - }, - "matchTreeConstruction": { - "type": "number" - }, - "matchTreeSearch": { - "type": "number" - }, - "regexpsConsidered": { - "type": "number" - }, - "flushReason": { - "type": "string" - } - }, - "required": [ - "actualMatchCount", - "totalMatchCount", - "duration", - "fileCount", - "filesSkipped", - "contentBytesLoaded", - "indexBytesLoaded", - "crashes", - "shardFilesConsidered", - "filesConsidered", - "filesLoaded", - "shardsScanned", - "shardsSkipped", - "shardsSkippedFilter", - "ngramMatches", - "ngramLookups", - "wait", - "matchTreeConstruction", - "matchTreeSearch", - "regexpsConsidered", - "flushReason" - ] - }, - "files": { - "type": "array", - "items": { - "type": "object", - "properties": { - "fileName": { - "type": "object", - "properties": { - "text": { - "type": "string" - }, - "matchRanges": { - "type": "array", - "items": { - "type": "object", - "properties": { - "start": { - "type": "object", - "properties": { - "byteOffset": { - "type": "number" - }, - "lineNumber": { - "type": "number" - }, - "column": { - "type": "number" - } - }, - "required": [ - "byteOffset", - "lineNumber", - "column" - ] - }, - "end": { - "type": "object", - "properties": { - "byteOffset": { - "type": "number" - }, - "lineNumber": { - "type": "number" - }, - "column": { - "type": "number" - } - }, - "required": [ - "byteOffset", - "lineNumber", - "column" - ] - } - }, - "required": [ - "start", - "end" - ] - } - } - }, - "required": [ - "text", - "matchRanges" - ] - }, - "webUrl": { - "type": "string" - }, - "externalWebUrl": { - "type": "string" - }, - "repository": { - "type": "string" - }, - "repositoryId": { - "type": "number" - }, - "language": { - "type": "string" - }, - "chunks": { - "type": "array", - "items": { - "type": "object", - "properties": { - "content": { - "type": "string" - }, - "matchRanges": { - "type": "array", - "items": { - "type": "object", - "properties": { - "start": { - "type": "object", - "properties": { - "byteOffset": { - "type": "number" - }, - "lineNumber": { - "type": "number" - }, - "column": { - "type": "number" - } - }, - "required": [ - "byteOffset", - "lineNumber", - "column" - ] - }, - "end": { - "type": "object", - "properties": { - "byteOffset": { - "type": "number" - }, - "lineNumber": { - "type": "number" - }, - "column": { - "type": "number" - } - }, - "required": [ - "byteOffset", - "lineNumber", - "column" - ] - } - }, - "required": [ - "start", - "end" - ] - } - }, - "contentStart": { - "type": "object", - "properties": { - "byteOffset": { - "type": "number" - }, - "lineNumber": { - "type": "number" - }, - "column": { - "type": "number" - } - }, - "required": [ - "byteOffset", - "lineNumber", - "column" - ] - }, - "symbols": { - "type": "array", - "items": { - "type": "object", - "properties": { - "symbol": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "parent": { - "type": "object", - "properties": { - "symbol": { - "type": "string" - }, - "kind": { - "type": "string" - } - }, - "required": [ - "symbol", - "kind" - ] - } - }, - "required": [ - "symbol", - "kind" - ] - } - } - }, - "required": [ - "content", - "matchRanges", - "contentStart" - ] - } - }, - "branches": { - "type": "array", - "items": { - "type": "string" - } - }, - "content": { - "type": "string" - } - }, - "required": [ - "fileName", - "webUrl", - "repository", - "repositoryId", - "language", - "chunks" - ] - } - }, - "repositoryInfo": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "number" - }, - "codeHostType": { - "type": "string", - "enum": [ - "github", - "gitlab", - "gitea", - "gerrit", - "bitbucketServer", - "bitbucketCloud", - "genericGitHost", - "azuredevops" - ] - }, - "name": { - "type": "string" - }, - "displayName": { - "type": "string" - }, - "webUrl": { - "type": "string" - } - }, - "required": [ - "id", - "codeHostType", - "name" - ] - } - }, - "isSearchExhaustive": { - "type": "boolean" - } - }, - "required": [ - "stats", - "files", - "repositoryInfo", - "isSearchExhaustive" - ] - }, - "PublicApiServiceError": { - "type": "object", - "properties": { - "statusCode": { - "type": "number" - }, - "errorCode": { - "type": "string" - }, - "message": { - "type": "string" - } - }, - "required": [ - "statusCode", - "errorCode", - "message" - ], - "description": "Structured error response returned by Sourcebot public API endpoints." - }, - "PublicSearchRequest": { - "type": "object", - "properties": { - "query": { - "type": "string" - }, - "matches": { - "type": "number" - }, - "contextLines": { - "type": "number" - }, - "whole": { - "type": "boolean" - }, - "isRegexEnabled": { - "type": "boolean" - }, - "isCaseSensitivityEnabled": { - "type": "boolean" - } - }, - "required": [ - "query", - "matches" - ] - }, - "PublicListReposResponse": { - "type": "array", - "items": { - "type": "object", - "properties": { - "codeHostType": { - "type": "string", - "enum": [ - "github", - "gitlab", - "gitea", - "gerrit", - "bitbucketServer", - "bitbucketCloud", - "genericGitHost", - "azuredevops" - ] - }, - "repoId": { - "type": "number" - }, - "repoName": { - "type": "string" - }, - "webUrl": { - "type": "string" - }, - "repoDisplayName": { - "type": "string" - }, - "externalWebUrl": { - "type": "string" - }, - "imageUrl": { - "type": "string" - }, - "indexedAt": { - "type": "string", - "nullable": true - }, - "pushedAt": { - "type": "string", - "nullable": true - }, - "defaultBranch": { - "type": "string" - }, - "isFork": { - "type": "boolean" - }, - "isArchived": { - "type": "boolean" - } - }, - "required": [ - "codeHostType", - "repoId", - "repoName", - "webUrl", - "isFork", - "isArchived" - ] - } - }, - "PublicListConnectionsResponse": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "connectionType": { - "type": "string", - "enum": [ - "github", - "gitlab", - "gitea", - "gerrit", - "bitbucket", - "azuredevops", - "git" - ] - } - }, - "required": [ - "id", - "name", - "connectionType" - ] - } - }, - "PublicVersionResponse": { - "type": "object", - "properties": { - "version": { - "type": "string" - } - }, - "required": [ - "version" - ] - }, - "PublicHealthResponse": { - "type": "object", - "properties": { - "status": { - "type": "string", - "enum": [ - "ok" - ] - } - }, - "required": [ - "status" - ] - }, - "PublicFileSourceResponse": { - "type": "object", - "properties": { - "source": { - "type": "string" - }, - "language": { - "type": "string" - }, - "path": { - "type": "string" - }, - "repo": { - "type": "string" - }, - "repoCodeHostType": { - "type": "string", - "enum": [ - "github", - "gitlab", - "gitea", - "gerrit", - "bitbucketServer", - "bitbucketCloud", - "genericGitHost", - "azuredevops" - ] - }, - "repoDisplayName": { - "type": "string" - }, - "repoExternalWebUrl": { - "type": "string" - }, - "webUrl": { - "type": "string" - }, - "externalWebUrl": { - "type": "string" - }, - "blobSha": { - "type": "string" - } - }, - "required": [ - "source", - "language", - "path", - "repo", - "repoCodeHostType", - "webUrl" - ] - }, - "PublicFileBlameResponse": { - "type": "object", - "properties": { - "ranges": { - "type": "array", - "items": { - "type": "object", - "properties": { - "hash": { - "type": "string", - "description": "The hash of the commit that last modified the lines in this range." - }, - "path": { - "type": "string", - "description": "The file path as it existed at the attributing commit. May differ from the current path due to renames." - }, - "startLine": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "description": "The 1-based line number where the range begins (inclusive)." - }, - "lineCount": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "description": "The number of contiguous lines in this range." - } - }, - "required": [ - "hash", - "path", - "startLine", - "lineCount" - ] - }, - "description": "Contiguous, non-overlapping line ranges ordered by startLine. Each range is attributed to a single commit." - }, - "commits": { - "type": "object", - "additionalProperties": { - "type": "object", - "properties": { - "hash": { - "type": "string", - "description": "The full commit SHA." - }, - "date": { - "type": "string", - "description": "The commit date in ISO 8601 format." - }, - "message": { - "type": "string", - "description": "The commit subject line." - }, - "authorName": { - "type": "string" - }, - "authorEmail": { - "type": "string" - }, - "previous": { - "type": "object", - "properties": { - "hash": { - "type": "string", - "description": "The hash of the commit that previously affected these lines (i.e., the next step backwards in the blame walk)." - }, - "path": { - "type": "string", - "description": "The file path as it existed at the previous commit. May differ from the current path due to renames." - } - }, - "required": [ - "hash", - "path" - ], - "description": "Pointer to the previous commit that affected these lines, with the file path as it existed there. Absent when the commit introduced the lines (no earlier history to walk to)." - } - }, - "required": [ - "hash", - "date", - "message", - "authorName", - "authorEmail" - ] - }, - "description": "Commit metadata keyed by hash, deduplicated across ranges." - } - }, - "required": [ - "ranges", - "commits" - ] - }, - "PublicGetTreeRequest": { - "type": "object", - "properties": { - "repoName": { - "type": "string" - }, - "revisionName": { - "type": "string" - }, - "paths": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": [ - "repoName", - "revisionName", - "paths" - ] - }, - "PublicGetDiffResponse": { - "type": "object", - "properties": { - "files": { - "type": "array", - "items": { - "type": "object", - "properties": { - "oldPath": { - "type": "string", - "nullable": true, - "description": "The file path before the change. `null` for added files." - }, - "newPath": { - "type": "string", - "nullable": true, - "description": "The file path after the change. `null` for deleted files." - }, - "hunks": { - "type": "array", - "items": { - "type": "object", - "properties": { - "oldRange": { - "type": "object", - "properties": { - "start": { - "type": "integer", - "description": "The 1-based line number where the range starts." - }, - "lines": { - "type": "integer", - "description": "The number of lines the range spans." - } - }, - "required": [ - "start", - "lines" - ], - "description": "The line range in the old file." - }, - "newRange": { - "type": "object", - "properties": { - "start": { - "type": "integer", - "description": "The 1-based line number where the range starts." - }, - "lines": { - "type": "integer", - "description": "The number of lines the range spans." - } - }, - "required": [ - "start", - "lines" - ], - "description": "The line range in the new file." - }, - "heading": { - "type": "string", - "description": "Optional context heading extracted from the @@ line, typically the enclosing function or class name." - }, - "body": { - "type": "string", - "description": "The diff content, with each line prefixed by a space (context), + (addition), or - (deletion)." - } - }, - "required": [ - "oldRange", - "newRange", - "body" - ] - }, - "description": "The list of changed regions within the file." - } - }, - "required": [ - "oldPath", - "newPath", - "hunks" - ] - }, - "description": "The list of changed files." - } - }, - "required": [ - "files" - ] - }, - "PublicFindSymbolsResponse": { - "type": "object", - "properties": { - "stats": { - "type": "object", - "properties": { - "matchCount": { - "type": "number" - } - }, - "required": [ - "matchCount" - ] - }, - "files": { - "type": "array", - "items": { - "type": "object", - "properties": { - "fileName": { - "type": "string" - }, - "repository": { - "type": "string" - }, - "repositoryId": { - "type": "number" - }, - "webUrl": { - "type": "string" - }, - "language": { - "type": "string" - }, - "matches": { - "type": "array", - "items": { - "type": "object", - "properties": { - "lineContent": { - "type": "string" - }, - "range": { - "type": "object", - "properties": { - "start": { - "type": "object", - "properties": { - "byteOffset": { - "type": "number" - }, - "lineNumber": { - "type": "number" - }, - "column": { - "type": "number" - } - }, - "required": [ - "byteOffset", - "lineNumber", - "column" - ] - }, - "end": { - "type": "object", - "properties": { - "byteOffset": { - "type": "number" - }, - "lineNumber": { - "type": "number" - }, - "column": { - "type": "number" - } - }, - "required": [ - "byteOffset", - "lineNumber", - "column" - ] - } - }, - "required": [ - "start", - "end" - ] - } - }, - "required": [ - "lineContent", - "range" - ] - } - } - }, - "required": [ - "fileName", - "repository", - "repositoryId", - "webUrl", - "language", - "matches" - ] - } - }, - "repositoryInfo": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "number" - }, - "codeHostType": { - "type": "string", - "enum": [ - "github", - "gitlab", - "gitea", - "gerrit", - "bitbucketServer", - "bitbucketCloud", - "genericGitHost", - "azuredevops" - ] - }, - "name": { - "type": "string" - }, - "displayName": { - "type": "string" - }, - "webUrl": { - "type": "string" - } - }, - "required": [ - "id", - "codeHostType", - "name" - ] - } - } - }, - "required": [ - "stats", - "files", - "repositoryInfo" - ] - }, - "PublicFindSymbolsRequest": { - "type": "object", - "properties": { - "symbolName": { - "type": "string" - }, - "language": { - "type": "string" - }, - "revisionName": { - "type": "string" - }, - "repoName": { - "type": "string" - } - }, - "required": [ - "symbolName" - ] - }, - "PublicCommit": { - "type": "object", - "properties": { - "hash": { - "type": "string", - "description": "The full commit SHA." - }, - "date": { - "type": "string", - "description": "The commit date in ISO 8601 format." - }, - "message": { - "type": "string", - "description": "The commit subject line." - }, - "refs": { - "type": "string", - "description": "Refs pointing to this commit (e.g. branch or tag names)." - }, - "body": { - "type": "string", - "description": "The commit body (everything after the subject line)." - }, - "authorName": { - "type": "string" - }, - "authorEmail": { - "type": "string" - } - }, - "required": [ - "hash", - "date", - "message", - "refs", - "body", - "authorName", - "authorEmail" - ] - }, - "PublicListCommitsResponse": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PublicCommit" - } - }, - "PublicCommitDetail": { - "type": "object", - "properties": { - "hash": { - "type": "string", - "description": "The full commit SHA." - }, - "date": { - "type": "string", - "description": "The commit date in ISO 8601 format." - }, - "message": { - "type": "string", - "description": "The commit subject line." - }, - "refs": { - "type": "string", - "description": "Refs pointing to this commit (e.g. branch or tag names)." - }, - "body": { - "type": "string", - "description": "The commit body (everything after the subject line)." - }, - "authorName": { - "type": "string" - }, - "authorEmail": { - "type": "string" - }, - "parents": { - "type": "array", - "items": { - "type": "string" - }, - "description": "The parent commit SHAs." - } - }, - "required": [ - "hash", - "date", - "message", - "refs", - "body", - "authorName", - "authorEmail", - "parents" - ] - }, - "PublicCommitAuthor": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "email": { - "type": "string" - }, - "commitCount": { - "type": "integer", - "minimum": 0 - } - }, - "required": [ - "name", - "email", - "commitCount" - ] - }, - "PublicListCommitAuthorsResponse": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PublicCommitAuthor" - } - }, - "PublicCreateScopedAccessTokenResponse": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Identifier used to revoke the token." - }, - "token": { - "type": "string", - "pattern": "^sbst_", - "description": "Opaque bearer token. This value is returned only when the token is created." - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "expiresAt": { - "type": "string", - "format": "date-time" - }, - "repoIds": { - "type": "array", - "items": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "minItems": 1 - } - }, - "required": [ - "id", - "token", - "createdAt", - "expiresAt", - "repoIds" - ] - }, - "PublicCreateScopedAccessTokenRequest": { - "type": "object", - "properties": { - "repoIds": { - "type": "array", - "items": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true - }, - "minItems": 1, - "description": "Repository IDs to bind to the token. Every ID must identify a repository accessible to the API-key owner." - } - }, - "required": [ - "repoIds" - ], - "additionalProperties": false - }, - "PublicEeUser": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string", - "nullable": true - }, - "email": { - "type": "string" - }, - "role": { - "type": "string", - "enum": [ - "OWNER", - "MEMBER" - ] - }, - "suspendedAt": { - "type": "string", - "nullable": true, - "format": "date-time" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "lastActivityAt": { - "type": "string", - "nullable": true, - "format": "date-time" - } - }, - "required": [ - "id", - "name", - "email", - "role", - "suspendedAt", - "createdAt", - "updatedAt", - "lastActivityAt" - ] - }, - "PublicEeDeleteUserResponse": { - "type": "object", - "properties": { - "success": { - "type": "boolean" - }, - "message": { - "type": "string" - } - }, - "required": [ - "success", - "message" - ] - }, - "PublicEeUsersResponse": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PublicEeUser" - } - }, - "PublicEeAuditRecord": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "action": { - "type": "string", - "description": "The audited action (e.g. `user.read`, `user.delete`, `audit.fetch`)." - }, - "actorId": { - "type": "string" - }, - "actorType": { - "type": "string" - }, - "targetId": { - "type": "string" - }, - "targetType": { - "type": "string" - }, - "sourcebotVersion": { - "type": "string" - }, - "metadata": { - "type": "object", - "nullable": true, - "additionalProperties": { - "nullable": true - } - }, - "orgId": { - "type": "number" - } - }, - "required": [ - "id", - "timestamp", - "action", - "actorId", - "actorType", - "targetId", - "targetType", - "sourcebotVersion", - "metadata", - "orgId" - ] - }, - "PublicEeAuditResponse": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PublicEeAuditRecord" - } - }, - "PublicFileTreeNode": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "path": { - "type": "string" - }, - "name": { - "type": "string" - }, - "children": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PublicFileTreeNode" - } - } - }, - "required": [ - "type", - "path", - "name", - "children" - ], - "additionalProperties": false - } - }, - "parameters": {}, - "securitySchemes": { - "bearerToken": { - "type": "http", - "scheme": "bearer", - "description": "Bearer authentication header of the form `Bearer `. The token may be a Sourcebot API key, OAuth access token, or scoped access token, subject to endpoint requirements." - }, - "apiKeyHeader": { - "type": "apiKey", - "in": "header", - "name": "X-Sourcebot-Api-Key", - "description": "Header of the form `X-Sourcebot-Api-Key: `, where `` is your API key." - } - } - }, - "paths": { - "/api/search": { - "post": { - "operationId": "search", - "tags": [ - "Search & Navigation" - ], - "summary": "Search code", - "description": "Executes a blocking code search and returns all matching file chunks.", - "x-mint": { - "content": "## Usage\n\nThe `query` field supports literal, regexp, and symbol searches with filters for repository, file, language, branch, and more. See the [search syntax reference](https://docs.sourcebot.dev/docs/features/search/syntax-reference) for the full query language." - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicSearchRequest" - } - } - } - }, - "responses": { - "200": { - "description": "Search results.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicSearchResponse" - } - } - } - }, - "400": { - "description": "Invalid request body.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected search failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/repos": { - "get": { - "operationId": "listRepositories", - "tags": [ - "Repositories" - ], - "summary": "List repositories", - "description": "Returns a paginated list of repositories indexed by this Sourcebot instance.", - "parameters": [ - { - "schema": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "default": 1 - }, - "required": false, - "name": "page", - "in": "query" - }, - { - "schema": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "maximum": 100, - "default": 30 - }, - "required": false, - "name": "perPage", - "in": "query" - }, - { - "schema": { - "type": "string", - "enum": [ - "name", - "pushed" - ], - "default": "name" - }, - "required": false, - "name": "sort", - "in": "query" - }, - { - "schema": { - "type": "string", - "enum": [ - "asc", - "desc" - ], - "default": "asc" - }, - "required": false, - "name": "direction", - "in": "query" - }, - { - "schema": { - "type": "string" - }, - "required": false, - "name": "query", - "in": "query" - }, - { - "schema": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "description": "Filter repositories to those associated with this connection ID. IDs are returned by GET /api/connections." - }, - "required": false, - "description": "Filter repositories to those associated with this connection ID. IDs are returned by GET /api/connections.", - "name": "connectionId", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Paginated repository list.", - "headers": { - "X-Total-Count": { - "description": "Total number of repositories matching the query across all pages.", - "schema": { - "type": "integer", - "example": 137 - } - }, - "Link": { - "description": "Pagination links formatted per RFC 8288. Includes `rel=\"next\"`, `rel=\"prev\"`, `rel=\"first\"`, and `rel=\"last\"` when applicable.", - "schema": { - "type": "string", - "example": "; rel=\"next\", ; rel=\"last\"" - } - } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicListReposResponse" - } - } - } - }, - "400": { - "description": "Invalid query parameters.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected repository listing failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/connections": { - "get": { - "operationId": "listConnections", - "tags": [ - "Connections" - ], - "summary": "List connections", - "description": "Returns unique code host connections associated with at least one repository visible to the caller. Connection configuration and credentials are never included.", - "responses": { - "200": { - "description": "Connections associated with visible repositories.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicListConnectionsResponse" - } - } - } - }, - "401": { - "description": "Authentication is required when anonymous access is disabled.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected connection listing failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/version": { - "get": { - "operationId": "getVersion", - "tags": [ - "System" - ], - "summary": "Get Sourcebot version", - "description": "Returns the currently running Sourcebot version string.", - "responses": { - "200": { - "description": "Current Sourcebot version.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicVersionResponse" - } - } - } - } - } - } - }, - "/api/health": { - "get": { - "operationId": "getHealth", - "tags": [ - "System" - ], - "summary": "Health check", - "responses": { - "200": { - "description": "Service is healthy.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicHealthResponse" - } - } - } - } - } - } - }, - "/api/source": { - "get": { - "operationId": "getFileSource", - "tags": [ - "Git" - ], - "summary": "Get file contents", - "description": "Returns the raw source content of a file at a given repository path and optional git ref.", - "parameters": [ - { - "schema": { - "type": "string" - }, - "required": true, - "name": "path", - "in": "query" - }, - { - "schema": { - "type": "string" - }, - "required": true, - "name": "repo", - "in": "query" - }, - { - "schema": { - "type": "string" - }, - "required": false, - "name": "ref", - "in": "query" - } - ], - "responses": { - "200": { - "description": "File source and metadata.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicFileSourceResponse" - } - } - } - }, - "400": { - "description": "Invalid query parameters or git ref.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "404": { - "description": "Repository or file not found.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected file retrieval failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/blame": { - "get": { - "operationId": "getFileBlame", - "tags": [ - "Git" - ], - "summary": "Get file blame", - "description": "Returns blame information for a file at a given repository path and optional git ref.\n\nThe response is split into two parts:\n- `ranges`: contiguous, non-overlapping line ranges, each attributed to a single commit. Ordered by `startLine`.\n- `commits`: commit metadata (hash, date, message, author, optional `previous` pointer for walking back through history) keyed by hash, deduplicated across ranges.\n\nWhole-file renames are followed automatically. Cross-file line moves and copies are not.", - "parameters": [ - { - "schema": { - "type": "string", - "description": "The file path to blame, relative to the repository root." - }, - "required": true, - "description": "The file path to blame, relative to the repository root.", - "name": "path", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "The fully-qualified repository name." - }, - "required": true, - "description": "The fully-qualified repository name.", - "name": "repo", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "The git ref (branch, tag, or commit SHA) to blame at. Defaults to the repository's default branch." - }, - "required": false, - "description": "The git ref (branch, tag, or commit SHA) to blame at. Defaults to the repository's default branch.", - "name": "ref", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Blame ranges and deduplicated commit metadata.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicFileBlameResponse" - } - } - } - }, - "400": { - "description": "Invalid query parameters or git ref.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "404": { - "description": "Repository or file not found.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected blame retrieval failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/tree": { - "post": { - "operationId": "getFileTree", - "tags": [ - "Git" - ], - "summary": "Get a file tree", - "description": "Returns the file tree for a repository at a given revision.", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicGetTreeRequest" - } - } - } - }, - "responses": { - "200": { - "description": "File tree for the requested repository revision.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "tree": { - "$ref": "#/components/schemas/PublicFileTreeNode" - } - }, - "required": [ - "tree" - ], - "additionalProperties": false - } - } - } - }, - "400": { - "description": "Invalid request body or git ref.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "404": { - "description": "Repository or path not found.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected tree retrieval failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/diff": { - "get": { - "operationId": "getDiff", - "tags": [ - "Git" - ], - "summary": "Get diff between two commits", - "description": "Returns a structured diff between two git refs using a two-dot comparison. See [git-diff](https://git-scm.com/docs/git-diff) for details.", - "parameters": [ - { - "schema": { - "type": "string", - "description": "The fully-qualified repository name." - }, - "required": true, - "description": "The fully-qualified repository name.", - "name": "repo", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "The base git ref (branch, tag, or commit SHA) to diff from." - }, - "required": true, - "description": "The base git ref (branch, tag, or commit SHA) to diff from.", - "name": "base", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "The head git ref (branch, tag, or commit SHA) to diff to." - }, - "required": true, - "description": "The head git ref (branch, tag, or commit SHA) to diff to.", - "name": "head", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "Restrict the diff to changes touching this file path. Omit to diff all changes between the two refs." - }, - "required": false, - "description": "Restrict the diff to changes touching this file path. Omit to diff all changes between the two refs.", - "name": "path", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Structured diff between the two refs.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicGetDiffResponse" - } - } - } - }, - "400": { - "description": "Invalid query parameters or git ref.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "404": { - "description": "Repository not found.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected diff failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/find_definitions": { - "post": { - "operationId": "findDefinitions", - "tags": [ - "Search & Navigation" - ], - "summary": "Find symbol definitions", - "description": "Returns all locations in the codebase where the given symbol is defined.", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicFindSymbolsRequest" - } - } - } - }, - "responses": { - "200": { - "description": "Symbol definition locations.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicFindSymbolsResponse" - } - } - } - }, - "400": { - "description": "Invalid request body.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/find_references": { - "post": { - "operationId": "findReferences", - "tags": [ - "Search & Navigation" - ], - "summary": "Find symbol references", - "description": "Returns all locations in the codebase where the given symbol is referenced.", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicFindSymbolsRequest" - } - } - } - }, - "responses": { - "200": { - "description": "Symbol reference locations.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicFindSymbolsResponse" - } - } - } - }, - "400": { - "description": "Invalid request body.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/commits": { - "get": { - "operationId": "listCommits", - "tags": [ - "Git" - ], - "summary": "List commits", - "description": "Returns a paginated list of commits for a repository.", - "parameters": [ - { - "schema": { - "type": "string", - "description": "The fully-qualified repository name." - }, - "required": true, - "description": "The fully-qualified repository name.", - "name": "repo", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "Filter commits by message content (case-insensitive). Interpreted as a POSIX BRE regex — escape metacharacters for literal matching." - }, - "required": false, - "description": "Filter commits by message content (case-insensitive). Interpreted as a POSIX BRE regex — escape metacharacters for literal matching.", - "name": "query", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "Return commits after this date. Accepts ISO 8601 or relative formats (e.g. `30 days ago`)." - }, - "required": false, - "description": "Return commits after this date. Accepts ISO 8601 or relative formats (e.g. `30 days ago`).", - "name": "since", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "Return commits before this date. Accepts ISO 8601 or relative formats." - }, - "required": false, - "description": "Return commits before this date. Accepts ISO 8601 or relative formats.", - "name": "until", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "Filter commits by author name or email (case-insensitive). Interpreted as a POSIX BRE regex — escape metacharacters for literal matching." - }, - "required": false, - "description": "Filter commits by author name or email (case-insensitive). Interpreted as a POSIX BRE regex — escape metacharacters for literal matching.", - "name": "author", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "The git ref (branch, tag, or commit SHA) to list commits from. Defaults to `HEAD`." - }, - "required": false, - "description": "The git ref (branch, tag, or commit SHA) to list commits from. Defaults to `HEAD`.", - "name": "ref", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "Restrict commits to those that touch this file path." - }, - "required": false, - "description": "Restrict commits to those that touch this file path.", - "name": "path", - "in": "query" - }, - { - "schema": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "default": 1 - }, - "required": false, - "name": "page", - "in": "query" - }, - { - "schema": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "maximum": 100, - "default": 50 - }, - "required": false, - "name": "perPage", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Paginated commit list.", - "headers": { - "X-Total-Count": { - "description": "Total number of commits matching the query across all pages.", - "schema": { - "type": "integer" - } - }, - "Link": { - "description": "Pagination links formatted per RFC 8288.", - "schema": { - "type": "string" - } - } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicListCommitsResponse" - } - } - } - }, - "400": { - "description": "Invalid query parameters.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "404": { - "description": "Repository not found.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/commit": { - "get": { - "operationId": "getCommit", - "tags": [ - "Git" - ], - "summary": "Get commit details", - "description": "Returns details for a single commit, including parent commit SHAs.", - "parameters": [ - { - "schema": { - "type": "string", - "description": "The fully-qualified repository name." - }, - "required": true, - "description": "The fully-qualified repository name.", - "name": "repo", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "The git ref (commit SHA, branch, or tag)." - }, - "required": true, - "description": "The git ref (commit SHA, branch, or tag).", - "name": "ref", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Commit details.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicCommitDetail" - } - } - } - }, - "400": { - "description": "Invalid query parameters or git ref.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "404": { - "description": "Repository or revision not found.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/commits/authors": { - "get": { - "operationId": "listCommitAuthors", - "tags": [ - "Git" - ], - "summary": "List commit authors", - "description": "Returns a paginated list of unique authors who committed in a repository, sorted by commit count descending. Optionally scoped to a file path.", - "parameters": [ - { - "schema": { - "type": "string", - "description": "The fully-qualified repository name." - }, - "required": true, - "description": "The fully-qualified repository name.", - "name": "repo", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "The git ref (branch, tag, or commit SHA) to list authors from. Defaults to `HEAD`." - }, - "required": false, - "description": "The git ref (branch, tag, or commit SHA) to list authors from. Defaults to `HEAD`.", - "name": "ref", - "in": "query" - }, - { - "schema": { - "type": "string", - "description": "Restrict authors to those who touched this file path." - }, - "required": false, - "description": "Restrict authors to those who touched this file path.", - "name": "path", - "in": "query" - }, - { - "schema": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "default": 1 - }, - "required": false, - "name": "page", - "in": "query" - }, - { - "schema": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "maximum": 100, - "default": 50 - }, - "required": false, - "name": "perPage", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Paginated commit author list.", - "headers": { - "X-Total-Count": { - "description": "Total number of unique authors matching the query across all pages.", - "schema": { - "type": "integer" - } - }, - "Link": { - "description": "Pagination links formatted per RFC 8288.", - "schema": { - "type": "string" - } - } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicListCommitAuthorsResponse" - } - } - } - }, - "400": { - "description": "Invalid query parameters or git ref.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "404": { - "description": "Repository not found.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/ee/scoped_access_token": { - "post": { - "operationId": "createScopedAccessToken", - "tags": [ - "Scoped Access Tokens" - ], - "summary": "Create a scoped access token", - "description": "Creates an opaque bearer token that expires exactly one hour after issuance and is restricted to the requested repositories.", - "security": [ - { - "bearerToken": [] - }, - { - "apiKeyHeader": [] - } - ], - "x-mint": { - "content": "\nThe scoped access token APIs require a custom entitlement. To request access, contact [team@sourcebot.dev](mailto:team@sourcebot.dev).\n" - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicCreateScopedAccessTokenRequest" - } - } - } - }, - "responses": { - "201": { - "description": "Scoped access token created. The opaque token value is returned only in this response.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicCreateScopedAccessTokenResponse" - } - } - } - }, - "400": { - "description": "Invalid request body or repository scope.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "401": { - "description": "Missing or invalid authentication.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "403": { - "description": "The current authentication method is not an API key, or the API-key owner is not permitted to perform this operation.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected token creation failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/ee/scoped_access_token/{id}": { - "delete": { - "operationId": "revokeScopedAccessToken", - "tags": [ - "Scoped Access Tokens" - ], - "summary": "Revoke a scoped access token", - "description": "Immediately revokes a scoped access token created by the authenticated API-key owner.", - "security": [ - { - "bearerToken": [] - }, - { - "apiKeyHeader": [] - } - ], - "x-mint": { - "content": "\nThe scoped access token APIs require a custom entitlement. To request access, contact [team@sourcebot.dev](mailto:team@sourcebot.dev).\n" - }, - "parameters": [ - { - "schema": { - "type": "string", - "description": "Identifier returned when the scoped access token was created." - }, - "required": true, - "description": "Identifier returned when the scoped access token was created.", - "name": "id", - "in": "path" - } - ], - "responses": { - "204": { - "description": "Scoped access token revoked." - }, - "401": { - "description": "Missing or invalid authentication.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "403": { - "description": "The current authentication method is not an API key, or the API-key owner is not permitted to perform this operation.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "404": { - "description": "Scoped access token not found.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected token revocation failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/ee/user": { - "get": { - "operationId": "getUser", - "tags": [ - "Enterprise (EE)" - ], - "summary": "Get a user", - "description": "Fetches details for a single organization member by `userId`. Only organization owners can access this endpoint.", - "x-mint": { - "content": "\nThis API is only available with an active Sourcebot license. [More information](/docs/activating-a-subscription).\n" - }, - "parameters": [ - { - "schema": { - "type": "string", - "description": "The ID of the user to retrieve." - }, - "required": true, - "description": "The ID of the user to retrieve.", - "name": "userId", - "in": "query" - } - ], - "responses": { - "200": { - "description": "User details.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicEeUser" - } - } - } - }, - "400": { - "description": "Missing userId parameter.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "403": { - "description": "Insufficient permissions or entitlement not enabled.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "404": { - "description": "User is not a member of this organization.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - }, - "delete": { - "operationId": "deleteUser", - "tags": [ - "Enterprise (EE)" - ], - "summary": "Remove a user from the organization", - "description": "Removes a user from the organization, revoking their access and their sessions. Only organization owners can access this endpoint.", - "x-mint": { - "content": "\nThis API is only available with an active Sourcebot license. [More information](/docs/activating-a-subscription).\n" - }, - "parameters": [ - { - "schema": { - "type": "string", - "description": "The ID of the user to remove." - }, - "required": true, - "description": "The ID of the user to remove.", - "name": "userId", - "in": "query" - } - ], - "responses": { - "200": { - "description": "User removed successfully.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicEeDeleteUserResponse" - } - } - } - }, - "400": { - "description": "Missing userId parameter.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "403": { - "description": "Insufficient permissions, the last active owner cannot be removed, or SCIM provisioning is enabled (membership is managed through your identity provider).", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "404": { - "description": "User is not a member of this organization.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/ee/users": { - "get": { - "operationId": "listUsers", - "tags": [ - "Enterprise (EE)" - ], - "summary": "List users", - "description": "Returns all members of the organization. Only organization owners can access this endpoint.", - "x-mint": { - "content": "\nThis API is only available with an active Sourcebot license. [More information](/docs/activating-a-subscription).\n" - }, - "responses": { - "200": { - "description": "List of organization members.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicEeUsersResponse" - } - } - } - }, - "403": { - "description": "Insufficient permissions or entitlement not enabled.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - }, - "/api/ee/audit": { - "get": { - "operationId": "listAuditRecords", - "tags": [ - "Enterprise (EE)" - ], - "summary": "List audit records", - "description": "Returns a paginated list of audit log entries. Only organization owners can access this endpoint.", - "x-mint": { - "content": "\nThis API is only available with an active Sourcebot license. [More information](/docs/activating-a-subscription).\n" - }, - "parameters": [ - { - "schema": { - "type": "string", - "format": "date-time", - "description": "Return records at or after this timestamp (ISO 8601)." - }, - "required": false, - "description": "Return records at or after this timestamp (ISO 8601).", - "name": "since", - "in": "query" - }, - { - "schema": { - "type": "string", - "format": "date-time", - "description": "Return records at or before this timestamp (ISO 8601)." - }, - "required": false, - "description": "Return records at or before this timestamp (ISO 8601).", - "name": "until", - "in": "query" - }, - { - "schema": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "default": 1 - }, - "required": false, - "name": "page", - "in": "query" - }, - { - "schema": { - "type": "integer", - "minimum": 0, - "exclusiveMinimum": true, - "maximum": 100, - "default": 50 - }, - "required": false, - "name": "perPage", - "in": "query" - } - ], - "responses": { - "200": { - "description": "Paginated audit log.", - "headers": { - "X-Total-Count": { - "description": "Total number of audit records matching the query across all pages.", - "schema": { - "type": "integer" - } - }, - "Link": { - "description": "Pagination links formatted per RFC 8288.", - "schema": { - "type": "string" - } - } - }, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicEeAuditResponse" - } - } - } - }, - "400": { - "description": "Invalid query parameters.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "403": { - "description": "Insufficient permissions or entitlement not enabled.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - }, - "500": { - "description": "Unexpected failure.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PublicApiServiceError" - } - } - } - } - } - } - } - } -} diff --git a/docs/docs.json b/docs/docs.json deleted file mode 100644 index 456a42902..000000000 --- a/docs/docs.json +++ /dev/null @@ -1,304 +0,0 @@ -{ - "$schema": "https://mintlify.com/docs.json", - "theme": "aspen", - "name": "Sourcebot", - "colors": { - "primary": "#851EE7", - "light": "#FFFFFF", - "dark": "#851EE7" - }, - "favicon": "/fav.svg", - "styling": { - "eyebrows": "section" - }, - "navigation": { - "global": { - "anchors": [ - { - "anchor": "Changelog", - "href": "https://sourcebot.dev/changelog", - "icon": "list-check" - }, - { - "anchor": "Roadmap", - "href": "https://github.com/sourcebot-dev/sourcebot/issues/459", - "icon": "map" - }, - { - "anchor": "Support", - "href": "https://github.com/sourcebot-dev/sourcebot/issues/new?template=get_help.md", - "icon": "life-ring" - } - ] - }, - "tabs": [ - { - "tab": "Documentation", - "groups": [ - { - "group": "Getting Started", - "pages": [ - "docs/overview", - { - "group": "Deploy Sourcebot", - "root": "docs/deployment/deploy-sourcebot", - "pages": [ - "docs/deployment/docker-compose", - "docs/deployment/k8s" - ] - } - ] - }, - { - "group": "Features", - "pages": [ - { - "group": "Code Search", - "root": "docs/features/search/code-search", - "pages": [ - "docs/features/search/syntax-reference", - "docs/features/search/ai-search-assist", - "docs/features/search/multi-branch-indexing", - "docs/features/search/search-contexts" - ] - }, - { - "group": "Ask Sourcebot", - "root": "docs/features/ask/ask-sourcebot", - "pages": [ - "docs/features/ask/skills", - "docs/features/ask/connectors", - "docs/features/ask/chat-sharing", - "docs/features/ask/add-model-providers" - ] - }, - "docs/features/mcp-server", - "docs/features/code-navigation", - "docs/features/analytics", - "docs/features/permission-syncing", - { - "group": "Agents", - "tag": "experimental", - "root": "docs/features/agents/agents", - "pages": [ - "docs/features/agents/review-agent" - ] - } - ] - }, - { - "group": "Configuration", - "pages": [ - "docs/configuration/config-file", - "docs/configuration/environment-variables", - { - "group": "Indexing your code", - "root": "docs/connections/indexing-your-code", - "pages": [ - "docs/connections/github", - "docs/connections/gitlab", - "docs/connections/bitbucket-cloud", - "docs/connections/bitbucket-data-center", - "docs/connections/ado-cloud", - "docs/connections/ado-server", - "docs/connections/gitea", - "docs/connections/gerrit", - "docs/connections/generic-git-host", - "docs/connections/local-repos", - "docs/connections/request-new" - ] - }, - "docs/configuration/language-model-providers", - "docs/configuration/idp", - { - "group": "Authentication", - "root": "docs/configuration/auth/authentication", - "pages": [ - "docs/configuration/auth/providers", - "docs/configuration/auth/scim", - "docs/configuration/auth/access-settings", - "docs/configuration/auth/roles-and-permissions", - "docs/configuration/auth/faq" - ] - }, - "docs/configuration/transactional-emails", - "docs/configuration/structured-logging", - "docs/configuration/audit-logs" - ] - }, - { - "group": "Subscribe", - "pages": [ - "docs/activating-a-subscription", - "docs/seat-reconciliation", - "docs/free-trial" - ] - }, - { - "group": "Misc", - "pages": [ - "docs/misc/architecture", - "docs/misc/scalability", - "docs/misc/telemetry", - "docs/misc/service-ping", - "docs/deployment/sizing-guide", - { - "group": "Infrastructure", - "pages": [ - "docs/deployment/infrastructure/architecture", - "docs/deployment/infrastructure/redis" - ] - } - ] - }, - { - "group": "Upgrade", - "pages": [ - "docs/upgrade/v4-to-v5-guide", - "docs/upgrade/v3-to-v4-guide", - "docs/upgrade/v2-to-v3-guide" - ] - } - ] - }, - { - "tab": "API Reference", - "icon": "code", - "openapi": "api-reference/sourcebot-public.openapi.json", - "groups": [ - { - "group": "Overview", - "icon": "book-open", - "pages": [ - "docs/api-reference/authentication" - ] - }, - { - "group": "Search & Navigation", - "icon": "magnifying-glass", - "pages": [ - "POST /api/search", - "POST /api/find_definitions", - "POST /api/find_references" - ] - }, - { - "group": "Repositories", - "icon": "database", - "pages": [ - "GET /api/repos" - ] - }, - { - "group": "Connections", - "icon": "link", - "pages": [ - "GET /api/connections" - ] - }, - { - "group": "Scoped Access Tokens", - "icon": "key", - "pages": [ - "POST /api/ee/scoped_access_token", - "DELETE /api/ee/scoped_access_token/{id}" - ] - }, - { - "group": "Git", - "icon": "code-branch", - "pages": [ - "GET /api/commit", - "GET /api/diff", - "GET /api/commits", - "GET /api/commits/authors", - "GET /api/source", - "GET /api/blame", - "POST /api/tree" - ] - }, - { - "group": "Enterprise Management", - "icon": "building-columns", - "pages": [ - "GET /api/ee/user", - "DELETE /api/ee/user", - "GET /api/ee/users", - "GET /api/ee/audit" - ] - }, - { - "group": "System", - "icon": "server", - "pages": [ - "GET /api/version", - "GET /api/health" - ] - } - ] - } - ] - }, - "logo": { - "light": "/logo/light.png", - "dark": "/logo/dark.png" - }, - "navbar": { - "primary": { - "type": "button", - "label": "Book a Call", - "href": "https://calendly.com/michael-sourcebot/sourcebot-introduction?utm_source=docs" - } - }, - "footer": { - "socials": { - "github": "https://github.com/sourcebot-dev/sourcebot", - "twitter": "https://x.com/sourcebot_dev", - "discord": "https://discord.gg/HDScTs3ptP", - "linkedin": "https://www.linkedin.com/company/sourcebot" - } - }, - "integrations": { - "posthog": { - "apiKey": "phc_DBGufjG0rkj3OEhuTcZ04xfeZB6eDhO7dP8ZCnqH7K7" - } - }, - "appearance": { - "default": "dark", - "strict": false - }, - "redirects": [ - { - "source": "/docs/deployment/overview", - "destination": "/docs/deployment/deploy-sourcebot" - }, - { - "source": "/docs/features/search/overview", - "destination": "/docs/features/search/code-search" - }, - { - "source": "/docs/features/ask/overview", - "destination": "/docs/features/ask/ask-sourcebot" - }, - { - "source": "/docs/features/agents/overview", - "destination": "/docs/features/agents/agents" - }, - { - "source": "/docs/connections/overview", - "destination": "/docs/connections/indexing-your-code" - }, - { - "source": "/docs/configuration/auth/overview", - "destination": "/docs/configuration/auth/authentication" - }, - { - "source": "/docs/license-key", - "destination": "/docs/activating-a-subscription" - }, - { - "source": "/docs/billing", - "destination": "/docs/seat-reconciliation" - } - ] -} diff --git a/docs/docs/activating-a-subscription.mdx b/docs/docs/activating-a-subscription.mdx deleted file mode 100644 index 8494d5ed4..000000000 --- a/docs/docs/activating-a-subscription.mdx +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Activating a Subscription -sidebarTitle: Activating a subscription ---- - -You can activate a paid plan subscription by using either an Activation Code or a License Key. - -# Activation Code (Online Licensing) - -Your Sourcebot deployment must be able to send a [Service Ping](/docs/misc/service-ping) to validate your Activation Code. If your deployment is unable to send a service ping for 7 days it will downgrade to the free plan until a successul ping is sent. - -The default mechanism for activating a subscription is through an Activation Code. This activation mechanism allows your Sourcebot deployment to automatically manage its subscription by regularly -sychronizing with our license server. - -### What data does Sourcebot collect? - -To enable online licensing, your Sourcebot deployment must be able to communicate with our license server through our [Service Ping](/docs/misc/service-ping). The data that is transmitted is limited to information that is -required to administer your Sourcebot license and support dynamic seat increases. No sensitive data (source code, AI inputs/outputs, credentials, or user information) will ever be transmitted. For more information, please check out our [privacy policy](https://www.sourcebot.dev/privacy) - -# License Key (Offline Licensing) - -The default mechanism for activating a subscription is now through an [Activation Code](#activation-code-online-licensing). Offline licensing using a License Key may be requested by reaching out using our enterprise contact form on our [pricing page](https://www.sourcebot.dev/pricing) - -After purchasing a license key, you can activate it by setting the `SOURCEBOT_EE_LICENSE_KEY` environment variable. - -If you'd like to increase the number of seats on your Sourcebot deployment you must request a new license key, manually update this environment variable, and then restart your deployment. - -```bash -docker run \ - -e SOURCEBOT_EE_LICENSE_KEY= \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest -``` - -## FAQ - -#### What happens when my subscription expires? - -When a paid plan subscription expires, your deployment will automatically be downgraded to the free plan. You must upgrade your subscription in order to continue using the paid features. \ No newline at end of file diff --git a/docs/docs/api-reference/authentication.mdx b/docs/docs/api-reference/authentication.mdx deleted file mode 100644 index 300477e0f..000000000 --- a/docs/docs/api-reference/authentication.mdx +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: "Authentication" ---- - -To securely access and interact with Sourcebot’s API, authentication is required. Users must generate an API Key, which will be used to authenticate requests. - - -If [anonymous access](/docs/configuration/auth/access-settings#anonymous-access) is enabled, some endpoints will be accessible without a API key. - - -## Creating an API key - -Navigate to **Settings → API Keys** and click **Create API Key**. Copy the value - it is only shown once. - - - API Keys page in Sourcebot Settings - - -## Using an API key - -Pass your API key as a Bearer token in the `Authorization` header on every request. - -```bash -Authorization: Bearer -``` - -For example, to call the `/api/search` endpoint: - -```bash -curl -X POST https://your-sourcebot-instance.com/api/search \ - -H "Authorization: Bearer " \ - -H "Content-Type: application/json" \ - -d '{"query": "hello world", "matches": 10}' -``` - -## Using a scoped access token - - -The scoped access token APIs require a custom entitlement. To request access, contact [team@sourcebot.dev](mailto:team@sourcebot.dev). - - -Scoped access tokens are short-lived bearer credentials intended for clients that should only access a specific set of repositories. Call `GET /api/repos` to find the integer `id` for each repository you want to include. Then create a token with a Sourcebot API key by calling `POST /api/ee/scoped_access_token` with those IDs: - -```bash -curl -X POST https://your-sourcebot-instance.com/api/ee/scoped_access_token \ - -H "Authorization: Bearer " \ - -H "Content-Type: application/json" \ - -d '{"repoIds": [1, 2, 3]}' -``` - -The response includes the scoped access token and its ID: - -```json -{ - "id": "scoped-token-id", - "token": "sbst_...", - "createdAt": "2026-08-14T18:00:00.000Z", - "expiresAt": "2026-08-14T19:00:00.000Z", - "repoIds": [1, 2, 3] -} -``` - -The opaque token begins with `sbst_`. It expires exactly one hour after issuance, cannot be refreshed, and is returned only once. Use it as a Bearer token with public API endpoints or the Sourcebot MCP server: - -```bash -Authorization: Bearer -``` - -Save the `id` from the create response. Use it to revoke the token with your Sourcebot API key: - -```bash -curl -X DELETE https://your-sourcebot-instance.com/api/ee/scoped_access_token/ \ - -H "Authorization: Bearer " -``` - -Repository scope is bound internally to repository IDs and is also intersected with the creating user's current repository permissions. Creating and revoking scoped access tokens requires an API key; a scoped access token cannot mint or revoke tokens. diff --git a/docs/docs/configuration/audit-logs.mdx b/docs/docs/configuration/audit-logs.mdx deleted file mode 100644 index 1db8f6a66..000000000 --- a/docs/docs/configuration/audit-logs.mdx +++ /dev/null @@ -1,227 +0,0 @@ ---- -title: Audit Logs -sidebarTitle: Audit logs ---- - -import LicenseKeyRequired from '/snippets/license-key-required.mdx' - - - -Audit logs are a collection of notable events performed by users within a Sourcebot deployment. Each audit log records information on the action taken, the user who performed the -action, and when the action took place. - -This feature gives security and compliance teams the necessary information to ensure proper governance and administration of your Sourcebot deployment. - -## Enabling/Disabling Audit Logs -Audit logs are enabled by default and can be controlled with the `SOURCEBOT_EE_AUDIT_LOGGING_ENABLED` [environment variable](/docs/configuration/environment-variables). - -## Retention Policy -By default, audit logs older than 180 days are automatically pruned daily. You can configure the retention period using the `SOURCEBOT_EE_AUDIT_RETENTION_DAYS` [environment variable](/docs/configuration/environment-variables). Set it to `0` to disable automatic pruning and retain logs indefinitely. - -## Fetching Audit Logs -Audit logs are stored in the [postgres database](/docs/misc/architecture) connected to Sourcebot. To fetch all of the audit logs, you can use the following API: - -```bash icon="terminal" Fetch audit logs -curl --request GET '$SOURCEBOT_URL/api/ee/audit' \ - --header 'X-Org-Domain: ~' \ - --header 'X-Sourcebot-Api-Key: $SOURCEBOT_OWNER_API_KEY' -``` - -```json icon="brackets-curly" wrap expandable Fetch audit logs example response -[ - { - "id": "cmc146k7m0003xgo2tri5t4br", - "timestamp": "2025-06-17T22:48:08.914Z", - "action": "api_key.created", - "actorId": "cmc12tnje0000xgn58jj8655h", - "actorType": "user", - "targetId": "205d1da1c6c3772b81d4ad697f5851fa11195176c211055ff0c1509772645d6d", - "targetType": "api_key", - "sourcebotVersion": "unknown", - "orgId": 1 - }, - { - "id": "cmc146c8r0001xgo2xyu0p463", - "timestamp": "2025-06-17T22:47:58.587Z", - "action": "user.performed_code_search", - "actorId": "cmc12tnje0000xgn58jj8655h", - "actorType": "user", - "targetId": "1", - "targetType": "org", - "sourcebotVersion": "unknown", - "metadata": { - "message": "render branch:HEAD" - }, - "orgId": 1 - }, - { - "id": "cmc12vqgb0008xgn5nv5hl9y5", - "timestamp": "2025-06-17T22:11:44.171Z", - "action": "user.performed_code_search", - "actorId": "cmc12tnje0000xgn58jj8655h", - "actorType": "user", - "targetId": "1", - "targetType": "org", - "sourcebotVersion": "unknown", - "metadata": { - "message": "render branch:HEAD" - }, - "orgId": 1 - }, - { - "id": "cmc12txwn0006xgn51ow1odid", - "timestamp": "2025-06-17T22:10:20.519Z", - "action": "user.performed_code_search", - "actorId": "cmc12tnje0000xgn58jj8655h", - "actorType": "user", - "targetId": "1", - "targetType": "org", - "sourcebotVersion": "unknown", - "metadata": { - "message": "render branch:HEAD" - }, - "orgId": 1 - }, - { - "id": "cmc12tnjx0004xgn5qqeiv1ao", - "timestamp": "2025-06-17T22:10:07.101Z", - "action": "user.owner_created", - "actorId": "cmc12tnje0000xgn58jj8655h", - "actorType": "user", - "targetId": "1", - "targetType": "org", - "sourcebotVersion": "unknown", - "metadata": null, - "orgId": 1 - }, - { - "id": "cmc12tnjh0002xgn5h6vzu3rl", - "timestamp": "2025-06-17T22:10:07.086Z", - "action": "user.signed_in", - "actorId": "cmc12tnje0000xgn58jj8655h", - "actorType": "user", - "targetId": "cmc12tnje0000xgn58jj8655h", - "targetType": "user", - "sourcebotVersion": "unknown", - "metadata": null, - "orgId": 1 - } -] -``` - -## Audit action types - -| Action | Actor Type | Target Type | -| :------- | :------ | :------| -| `api_key.created` | `user` | `api_key` | -| `api_key.creation_failed` | `user` | `org` | -| `api_key.deleted` | `user` | `api_key` | -| `api_key.deletion_failed` | `user` | `org` | -| `audit.fetch` | `user` | `org` | -| `chat.deleted` | `user` | `chat` | -| `chat.shared_with_users` | `user` | `chat` | -| `chat.unshared_with_user` | `user` | `chat` | -| `chat.visibility_updated` | `user` | `chat` | -| `user.created_ask_chat` | `user` | `org` | -| `user.creation_failed` | `user` | `user` | -| `user.delete` | `user` | `user` | -| `user.fetched_file_blame` | `user` | `org` | -| `user.fetched_file_source` | `user` | `org` | -| `user.fetched_file_tree` | `user` | `org` | -| `user.invite_accept_failed` | `user` | `invite` | -| `user.invite_accepted` | `user` | `invite` | -| `user.invite_failed` | `user` | `org` | -| `user.invites_created` | `user` | `org` | -| `user.join_request_approve_failed` | `user` | `account_join_request` | -| `user.join_request_approved` | `user` | `account_join_request` | -| `user.list` | `user` | `org` | -| `user.listed_repos` | `user` | `org` | -| `user.owner_created` | `user` | `org` | -| `user.performed_code_search` | `user` | `org` | -| `user.performed_find_references` | `user` | `org` | -| `user.performed_goto_definition` | `user` | `org` | -| `user.read` | `user` | `user` | -| `user.signed_in` | `user` | `user` | -| `user.signed_out` | `user` | `user` | -| `org.member_promoted_to_owner` | `user` | `user` | -| `org.owner_demoted_to_member` | `user` | `user` | -| `org.member_added` | `user` | `user` | -| `org.member_removed` | `user` | `user` | -| `org.member_left` | `user` | `user` | - - -## Response schema - -```json icon="brackets-curly" expandable wrap Audit log fetch response schema -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "FetchAuditLogsResponse", - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "timestamp", - "action", - "actorId", - "actorType", - "targetId", - "targetType", - "sourcebotVersion", - "metadata", - "orgId" - ], - "properties": { - "id": { - "type": "string" - }, - "timestamp": { - "type": "string", - "format": "date-time" - }, - "action": { - "type": "string" - }, - "actorId": { - "type": "string" - }, - "actorType": { - "type": "string", - "enum": ["user", "api_key"] - }, - "targetId": { - "type": "string" - }, - "targetType": { - "type": "string", - "enum": ["user", "org", "file", "api_key", "account_join_request", "invite", "chat"] - }, - "sourcebotVersion": { - "type": "string" - }, - "metadata": { - "anyOf": [ - { - "type": "object", - "properties": { - "message": { "type": "string" }, - "api_key": { "type": "string" }, - "emails": { "type": "string" }, - "source": { "type": "string" } - }, - "additionalProperties": false - }, - { - "type": "null" - } - ] - }, - "orgId": { - "type": "integer" - } - }, - "additionalProperties": false - } -} - -``` \ No newline at end of file diff --git a/docs/docs/configuration/auth/access-settings.mdx b/docs/docs/configuration/auth/access-settings.mdx deleted file mode 100644 index 96ad0c5a7..000000000 --- a/docs/docs/configuration/auth/access-settings.mdx +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Access Settings -sidebarTitle: Access settings ---- - -There are various settings to control how users access your Sourcebot deployment. - -# Member Approval - -By default, Sourcebot requires new members to be approved by an owner of the deployment. This section explains how approvals work and how -to configure this behavior. - -### Configuration -Member approval can be configured by an owner of the deployment by navigating to **Settings -> Security**. - - - Require approval for new members toggle in Settings → Access - - -### Managing Requests - -If member approval is enabled, new members will be asked to submit a join request after signing up. They will not have access to the Sourcebot deployment -until this request is approved by an owner. - -Owners can see and manage all pending join requests by navigating to **Settings -> Members**. - -## Invite link - -If member approval is required, an owner of the deployment can enable an invite link. When enabled, users -can use this invite link to register and be automatically added to the organization without approval: - - - Enable invite links toggle in Settings → Access - - - -# Anonymous access - -Anonymous access is only available in the free plan. If you have any questions about this restriction [reach out to us](https://www.sourcebot.dev/contact). - -By default, your Sourcebot deployment is gated with a login page. If you'd like users to access the deployment anonymously, you can enable anonymous access. - -This can be enabled by navigating to **Settings -> Access**. - - - Enable anonymous access toggle in Settings → Access - - -When accessing Sourcebot anonymously, a user's permissions are limited to that of the [Guest](/docs/configuration/auth/roles-and-permissions) role. diff --git a/docs/docs/configuration/auth/authentication.mdx b/docs/docs/configuration/auth/authentication.mdx deleted file mode 100644 index a3f717d21..000000000 --- a/docs/docs/configuration/auth/authentication.mdx +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Authentication ---- - -If you're deploying Sourcebot behind a domain, you must set the [AUTH_URL](/docs/configuration/environment-variables) environment variable. - -Sourcebot's built-in authentication system gates your deployment, and allows administrators to manage users and their permissions. - - - - Configure additional authentication providers for your deployment. - - - Learn how to configure how members join your deployment. - - - Provision and deprovision organization members from your identity provider. - - - Learn more about the different roles and permissions in Sourcebot. - - - Have a question about Sourcebot's auth system? We might have the answers here. - - - - -# Session lifetime - -By default, session cookies remain valid for 30 days from the time they are issued, after which the user is signed out and must authenticate again. - -You can change this by setting the [`AUTH_SESSION_MAX_AGE_SECONDS`](/docs/configuration/environment-variables) environment variable to the desired lifetime in seconds. - -A session is guaranteed to remain valid for at least its configured lifetime. The JWT verifier applies a small clock-skew tolerance when checking expiry, so a session may continue to be accepted for a brief additional window past that point before it is rejected. - -# Troubleshooting - -- If you experience issues logging in, logging out, or accessing an organization you should have access to, try clearing your cookies & performing a full page refresh (`Cmd/Ctrl + Shift + R` on most browsers). -- Still not working? Reach out to us on our [discord](https://discord.gg/HDScTs3ptP) or [GitHub](https://github.com/sourcebot-dev/sourcebot/issues/new/choose) diff --git a/docs/docs/configuration/auth/faq.mdx b/docs/docs/configuration/auth/faq.mdx deleted file mode 100644 index 7cb5e9d9e..000000000 --- a/docs/docs/configuration/auth/faq.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: FAQ ---- - -This page covers a range of frequently asked questions about Sourcebot's built-in authentication system. - - - - No, at this time it's not possible to disable the authentication system. If this is preventing you from deploying Sourcebot - within your organization please [reach out](https://www.sourcebot.dev/contact) - - - - Every user must register an account within your Sourcebot deployment. However, this doesn't mean their access - is restricted. - - Unless member approval is required, anyone can sign up for an account on your deployment and immediately be granted access. - - - - **No data related to authentication (or your code) leaves your deployment**. Authentication is handled - purely by your deployment and the authentication providers you configure. - - This data does not leave your device and is stored within in the database managed by your deployment. If you're - using credential login, passwords are encrypted at rest and in transit. - - - - Please note that IAP bridges are an enterprise feature - Sourcebot supports connecting your identity proxy directly into the built-in auth system using an IAP bridge. This allows Sourcebot to - register and authenticate automatically on a successful identity proxy log in. - - Sourcebot currently supports [GCP IAP](/docs/configuration/idp). If you're using a different IAP - and require support, please [reach out](https://www.sourcebot.dev/contact) - - - - Sourcebot uses [Auth.js](https://authjs.dev/) as its underlying authentication framework. Auth.js provides authentication providers - (credentials, Google, GitHub, etc) and an interface to enable user registration and log in. Internally, Auth.js uses JWT to provide - Sourcebot secure and reliable information about user authentication. - - - -Have a question that's not answered here? Submit an issue on [GitHub](https://github.com/sourcebot-dev/sourcebot/issues/new/choose) and we'll get back to you as soon as we can. diff --git a/docs/docs/configuration/auth/providers.mdx b/docs/docs/configuration/auth/providers.mdx deleted file mode 100644 index b28f8c32c..000000000 --- a/docs/docs/configuration/auth/providers.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Providers ---- - -Sourcebot supports a wide range of different authentication providers through it's integration with [Auth.js](https://authjs.dev/). This page -highlights how to configure the various supported providers. - -If there's an authentication provider you'd like us to support, please [reach out](https://www.sourcebot.dev/contact). - -# Core Authentication Providers - -### Email / Password -Email / password authentication is enabled by default. You can toggle it from **Settings → Security** using the **Email login** setting. - - - Email & password login setting toggle in Settings → Security - - -### Email codes -Email codes are 6 digit codes sent to a provided email. Email codes are enabled when [transactional emails](/docs/configuration/transactional-emails) and the **Email code** setting is toggled from **Settings → Security**: - - - Email code login setting toggle in Settings → Security - - -# Enterprise Authentication Providers - -Sourcebot supports authentication using several different [external identity providers](/docs/configuration/idp) as well. These identity providers require an -[enterprise license](/docs/activating-a-subscription) \ No newline at end of file diff --git a/docs/docs/configuration/auth/roles-and-permissions.mdx b/docs/docs/configuration/auth/roles-and-permissions.mdx deleted file mode 100644 index d9a625000..000000000 --- a/docs/docs/configuration/auth/roles-and-permissions.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Members and roles -sidebarTitle: Members and roles ---- - -Sourcebot provides different role types to help you control access and permissions across your organization. - -| Role | Permission | -| :--- | :--------- | -| `Owner` | Owners have full administrative control over all organization-level settings, including user management, access control, billing, and audit logs, in addition to all permissions a member can perform. | -| `Member` | Members have access and to use all standard features, such as code search, ask, mcp, etc., as well as their account settings. Members **cannot access** organization-level administration pages. | -| `Guest` | Guests are users that access Sourcebot without a account when [anonymous access](/docs/configuration/auth/access-settings#anonymous-access) is enabled. Guests can use some features, such as code search and browsing files, with additional limitations like not having chat history. Guests **cannot access** organization-level administration pages. | - -Note that when [permission syncing](/docs/features/permission-syncing) is enabled, users will only be able to view repositories they have access to. This applies to all roles, **including Owners**. - - -On the free plan, all signed-in users are given the `Owner` role. - - -## Default role assignment - -When a user joins your organization, they are assigned a default role. This assignment, and the ability to [manage the user's role](#managing-member-roles) afterwards, depends on [your plan](/docs/activating-a-subscription): - -| Plan | Default role | Role management | -| :--- | :----------- | :-------------- | -| **Free** | `Owner` | Not available. A user's role cannot be changed. | -| **Paid** | `Member` | Available. Owners can [promote or demote](#managing-member-roles) members. | - -## Managing member roles - -import LicenseKeyRequired from '/snippets/license-key-required.mdx' - - - -Owners can change the role of any user in the organization from **Settings → Members**. This lets you control who has administrative access by promoting trusted members to `Owner`, and scoping access back down to `Member` when administrative responsibilities change. - - - Members settings page showing team members and their roles - - -### Promoting a member to owner - -To promote a member, click the action menu (three dots) next to their name in the members list and select **Promote to owner**. The member will immediately gain full administrative access. - - - Dropdown menu showing Promote to owner option for a member - - -### Demoting an owner to member - -To demote an owner, click the action menu next to their name and select **Demote to member**. Owners can also demote themselves to step down from the role. The last remaining owner of an organization cannot be demoted - at least one owner must exist at all times. - - - Dropdown menu showing Demote to member option for an owner - - -### Leaving an organization as an owner - -An owner can leave the organization as long as at least one other owner exists. If you are the last owner, you must promote another member to owner before leaving. - - - Dropdown menu showing Leave organization option for an owner - \ No newline at end of file diff --git a/docs/docs/configuration/auth/scim.mdx b/docs/docs/configuration/auth/scim.mdx deleted file mode 100644 index fd7b8d6af..000000000 --- a/docs/docs/configuration/auth/scim.mdx +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: SCIM -sidebarTitle: SCIM ---- - -import LicenseKeyRequired from '/snippets/license-key-required.mdx' - -SCIM, or _System for Cross-domain Identity Management_ allows for the automation of user provisioning for your Sourcebot organization. - - - SCIM provisioning settings in Sourcebot showing the enable toggle, connector base URL, and SCIM token list - - - - -## Overview - -SCIM provisioning lets your identity provider manage Sourcebot organization membership automatically. When enabled, your identity provider becomes the source of truth for who should have access to your Sourcebot organization. - -Sourcebot supports SCIM 2.0 user provisioning for identity providers such as Okta and Microsoft Entra ID. - -## Configure - -1. Navigate to **Settings -> Security**. -2. Under the "SCIM provisioning" section, toggle the option to enable SCIM. -3. You can now get your **SCIM connector base URL** and generate a **SCIM Bearer auth token**. These values will be needed to configure SCIM in your identity provider. - - -When SCIM provisioning is enabled, Admins will **not** be able to manage users from within Sourcebot as they will be kept up to date through your identity provider. Role assignments can still be managed within Sourcebot. - - -### IdP-specific configuration notes - - - - - Okta does not support SCIM in an OIDC app integration. To work around this, two apps need to be created: - 1. An OIDC app used for SSO. - 2. A SAML provisioning-only app. The SSO portion of the app should not need to be functional. - - [Learn more](https://support.okta.com/help/s/article/configure-scim-for-a-custom-oidc-app). - - - - Follow [these instructions](/docs/configuration/idp#okta) to setup a Okta OIDC app and configure it as a SSO provider in Sourcebot. - - In Okta admin pages, create a SAML 2.0 application. This app will be used for provisioning-only and will not be used for SSO. The sign-on URL and audience URI can be set to the base URL of your deployment. - - In the General tab, click Edit and choose SCIM in the Provisioning section and Save. - - In the Provisioning tab, enter the SCIM Base connector URL from Sourcebot. - - For the Unique identifier field for users section enter **userName** - - For Supported provisioning actions, enable "Push New Users" and "Push Profile Updates" - - For Authentication mode field, choose HTTP Header and enter your SCIM token generated in Sourcebot. You can now test the configuration and save - - Lastly, return to the Provisioning tab in Okta and edit your settings under “To App” to enable the SCIM functionality needed for your Sourcebot application (Create, Update and Deactivate users) - - - Okta provisioning To App settings showing Create Users, Update User Attributes, and Deactivate Users enabled - - - - -## User lifecycle - -Sourcebot represents organization users with three membership states: - -| Sourcebot state | Access | Billing | -| --- | --- | --- | -| Pending | Can access the organization after signing in | Not billed | -| Active | Can access the organization | Billed | -| Suspended | Cannot access the organization | Not billed | - -When a user is provisioned through SCIM, Sourcebot creates or restores their organization membership. New SCIM-provisioned users appear as **Pending** until they sign in and access the organization for the first time. - -When a pending user signs in, Sourcebot moves them to **Active** and they count toward billing. On deployments with a hard seat cap, the user can only become active if a seat is available. - -When your identity provider deactivates a user by sending `active: false`, Sourcebot marks the user as **Suspended**. Suspended users cannot access the organization, and Sourcebot revokes their active sessions, API keys, and OAuth tokens. - -If your identity provider reactivates the user by sending `active: true`, Sourcebot restores their membership as **Pending**. They become **Active** and billable again only after they sign in and access the organization. - - -## Roles - -SCIM does not assign Sourcebot [roles](/docs/configuration/auth/roles-and-permissions). Users created through SCIM are added with the **Member** role. - -Owners can promote active members to owner, or demote owners to member, from **Settings -> Members**. Sourcebot prevents changes that would leave the organization without an active owner. - -## Supported attributes - -Sourcebot stores this subset of SCIM user attributes: - -| SCIM attribute | Sourcebot behavior | -| --- | --- | -| `userName` | User email address | -| `emails` | User email address; the primary email is preferred | -| `name.formatted` | Display name | -| `displayName` | Display name fallback | -| `active` | Unsuspended or suspended membership state | -| `externalId` | Stored IdP external identifier | - -Additional attributes may be sent by your identity provider, but Sourcebot ignores attributes it does not use. - -## FAQ - - - - SCIM provisioning should work with most identity providers that support SCIM user provisioning, but it has only been tested with Okta. - - - Sourcebot supports SCIM 2.0. - - - SCIM-created or reactivated users become billable seats after they sign in and access the organization. Until then, they appear as pending and do not count toward billing. Suspended users also do not count toward billing. - - diff --git a/docs/docs/configuration/config-file.mdx b/docs/docs/configuration/config-file.mdx deleted file mode 100644 index 37b6b689b..000000000 --- a/docs/docs/configuration/config-file.mdx +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: Config File -sidebarTitle: Config file ---- - -import ConfigSchema from '/snippets/schemas/v3/index.schema.mdx' -import EnvironmentOverridesSchema from '/snippets/schemas/v3/environmentOverrides.schema.mdx' - -When self-hosting Sourcebot, you **must** provide it a config file. This is done by defining a config file in a volume that's mounted to Sourcebot, and providing the path to this -file in the `CONFIG_PATH` environment variable. For example: - -```bash icon="terminal" Passing in a CONFIG_PATH to Sourcebot -docker run \ - -v $(pwd)/config.json:/data/config.json \ - -e CONFIG_PATH=/data/config.json \ - ... \ # other options - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest -``` - -The config file tells Sourcebot which repos to index, what language models to use, and various other settings as defined in the [schema](#config-file-schema). - -# Config File Schema - -The config file you provide Sourcebot must follow the [schema](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/index.json). This schema consists of the following properties: - -- [Connections](/docs/connections/indexing-your-code) (`connections`): Defines a set of connections that tell Sourcebot which repos to index and from where -- [Language Models](/docs/configuration/language-model-providers) (`models`): Defines a set of language model providers for use with [Ask Sourcebot](/docs/features/ask) -- [Settings](#settings) (`settings`): Additional settings to tweak your Sourcebot deployment -- [Search Contexts](/docs/features/search/search-contexts) (`contexts`): Groupings of repos that you can search against - -# Config File Syncing - -Sourcebot syncs the config file on startup, and automatically whenever a change is detected. - -# Settings - -The following are settings that can be provided in your config file to modify Sourcebot's behavior - -| Setting | Type | Default | Minimum | Description / Notes | -|-------------------------------------------------|---------|------------|---------|----------------------------------------------------------------------------------------| -| `maxFileSize` | number | 2 MB | 1 | Maximum size (bytes) of a file to index. Files exceeding this are skipped. | -| `maxTrigramCount` | number | 20 000 | 1 | Maximum trigrams per document. Larger files are skipped. | -| `reindexIntervalMs` | number | 1 hour | 1 | Interval at which all repositories are re‑indexed. | -| `resyncConnectionIntervalMs` | number | 24 hours | 1 | Interval for checking connections that need re‑syncing. | -| `resyncConnectionPollingIntervalMs` | number | 1 second | 1 | DB polling rate for connections that need re‑syncing. | -| `reindexRepoPollingIntervalMs` | number | 1 second | 1 | DB polling rate for repos that should be re‑indexed. | -| `maxConnectionSyncJobConcurrency` | number | 8 | 1 | Concurrent connection‑sync jobs. | -| `maxRepoIndexingJobConcurrency` | number | 8 | 1 | Concurrent repo‑indexing jobs. | -| `maxRepoGarbageCollectionJobConcurrency` | number | 8 | 1 | Concurrent repo‑garbage‑collection jobs. | -| `repoGarbageCollectionGracePeriodMs` | number | 10 seconds | 1 | Grace period to avoid deleting shards while loading. | -| `repoIndexTimeoutMs` | number | 2 hours | 1 | Timeout for a single repo‑indexing run. | -| `repoDrivenPermissionSyncIntervalMs` | number | 24 hours | 1 | Interval at which the repo permission syncer should run. | -| `userDrivenPermissionSyncIntervalMs` | number | 24 hours | 1 | Interval at which the user permission syncer should run. | -| `experiment_repoDrivenPermissionSyncIntervalMs` **(deprecated)** | number | 24 hours | 1 | Use `repoDrivenPermissionSyncIntervalMs` instead. | -| `experiment_userDrivenPermissionSyncIntervalMs` **(deprecated)** | number | 24 hours | 1 | Use `userDrivenPermissionSyncIntervalMs` instead. | -| `maxAccountPermissionSyncJobConcurrency` | number | 8 | 1 | Concurrent account permission sync jobs. | -| `maxRepoPermissionSyncJobConcurrency` | number | 8 | 1 | Concurrent repo permission sync jobs. | - -# Tokens - -Tokens are used to securely pass secrets to Sourcebot in a config file. They are used in various places, including connections, language model providers, auth providers, etc. Tokens can be passed as either environment variables or Google Cloud secrets: - - - - ```json - { - "token": { - "env": "TOKEN_NAME" - } - } - ``` - - - ```json - { - "token": { - "googleCloudSecret": "projects//secrets//versions/" - } - } - ``` - - - -# Overriding environment variables from the config - -You can override / set environment variables from the config file by using the `environmentOverrides` property. Overrides can be of type `string`, `number`, `boolean`, or a [token](/docs/configuration/config-file#tokens). Tokens are useful when you want to configure a environment variable using a Google Cloud Secret or other supported secret management service. - - - - ```jsonc - { - "environmentOverrides": { - "DATABASE_URL": { - "type": "token", - "value": { - "googleCloudSecret": "projects//secrets/postgres-connection-string/versions/latest" - } - }, - "REDIS_URL": { - "type": "token", - "value": { - "googleCloudSecret": "projects//secrets/redis-connection-string/versions/latest" - } - } - }, - } - ``` - - - - ```jsonc - { - "environmentOverrides": { - "EMAIL_FROM_ADDRESS": { - "type": "string", - "value": "hello@sourcebot.dev" - } - } - } - ``` - - - - ```jsonc - { - "environmentOverrides": { - "SOURCEBOT_CHAT_MODEL_TEMPERATURE": { - "type": "number", - "value": 0.5 - } - } - } - ``` - - - - ```jsonc - { - "environmentOverrides": { - "SOURCEBOT_TELEMETRY_DISABLED": { - "type": "boolean", - "value": false - } - } - } - ``` - - - - -**Note:** Overrides are **not** set as system environment variables, and instead are resolved at runtime on startup and stored in memory. - - -[schemas/v3/environmentOverrides.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/environmentOverrides.json) - - - \ No newline at end of file diff --git a/docs/docs/configuration/declarative-config.mdx b/docs/docs/configuration/declarative-config.mdx deleted file mode 100644 index f998320b6..000000000 --- a/docs/docs/configuration/declarative-config.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Configuring Sourcebot from a file (declarative config) -sidebarTitle: Declarative config ---- - -import ConfigSchema from '/snippets/schemas/v3/index.schema.mdx' - -Some teams require Sourcebot to be configured via a file (where it can be stored in version control, run through CI/CD pipelines, etc.) instead of a web UI. For more information on configuring connections, see this [overview](/docs/connections/indexing-your-code). - - -| Variable | Description | -| :------- | :---------- | -| `CONFIG_PATH` | Path to declarative config. | - - -```json -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/refs/heads/main/schemas/v3/index.json", - "connections": { - "connection-1": { - "type": "github", - "repos": [ - "sourcebot-dev/sourcebot" - ] - } - } -} -``` - -## Schema reference - - -[schemas/v3/index.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/index.json) - - - - \ No newline at end of file diff --git a/docs/docs/configuration/environment-variables.mdx b/docs/docs/configuration/environment-variables.mdx deleted file mode 100644 index 6316d6c9f..000000000 --- a/docs/docs/configuration/environment-variables.mdx +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: Environment variables -sidebarTitle: Environment variables ---- - -This page provides a detailed reference of all environment variables supported by Sourcebot. If you're just looking to get up and running, we recommend starting with the [deployment guides](/docs/deployment/docker-compose) instead. - -### Core Environment Variables -The following environment variables allow you to configure your Sourcebot deployment. - -| Variable | Default | Description | -| :------- | :------ | :---------- | -| `AUTH_SECRET` **(required)** | - |

Used to validate login session cookies. Genearte one with `openssl rand -base64 33`.

| -| `AUTH_SESSION_MAX_AGE_SECONDS` | `2592000` (30 days) |

Relative time from now in seconds when to expire the session.

| -| `AUTH_SESSION_UPDATE_AGE_SECONDS` | `86400` (1 day) |

How often the session should be updated in seconds. If set to `0`, session is updated every time.

| -| `OAUTH_AUTHORIZATION_CODE_TTL_SECONDS` | `600` (10 minutes) |

Lifetime of an OAuth authorization code, in seconds.

| -| `OAUTH_ACCESS_TOKEN_TTL_SECONDS` | `3600` (1 hour) |

Lifetime of an OAuth access token, in seconds.

| -| `OAUTH_REFRESH_TOKEN_TTL_SECONDS` | `7776000` (90 days) |

Lifetime of an OAuth refresh token, in seconds.

| -| `AUTH_URL` | - |

URL of your Sourcebot deployment, e.g., `https://example.com` or `http://localhost:3000`.

| -| `CONFIG_PATH` | `-` |

The container relative path to the declarative configuration file. See [this doc](/docs/configuration/declarative-config) for more info.

| -| `DATA_CACHE_DIR` | `$DATA_DIR/.sourcebot` |

The root data directory in which all data written to disk by Sourcebot will be located.

| -| `DATA_DIR` | `/data` |

The directory within the container to store all persistent data. Typically, this directory will be volume mapped such that data is persisted across container restarts (e.g., `docker run -v $(pwd):/data`)

| -| `DATABASE_URL` **(required)** | - |

Connection string of your Postgres database, e.g. `postgresql://user:password@host:5432/sourcebot`.

If you'd like to use a non-default schema, you can provide it as a parameter in the database url.

You can also use `DATABASE_HOST`, `DATABASE_USERNAME`, `DATABASE_PASSWORD`, `DATABASE_NAME`, and `DATABASE_ARGS` to construct the database url.

| -| `EMAIL_FROM_ADDRESS` | `-` |

The email address that transactional emails will be sent from. See [this doc](/docs/configuration/transactional-emails) for more info.

| -| `REDIS_URL` **(required)** | - |

Connection string of your Redis instance, e.g. `redis://host:6379`.

To enable TLS, see [this doc](/docs/deployment/infrastructure/redis#tls).

| -| `REDIS_REMOVE_ON_COMPLETE` | `0` |

Controls how many completed jobs are allowed to remain in Redis queues

| -| `REDIS_REMOVE_ON_FAIL` | `100` |

Controls how many failed jobs are allowed to remain in Redis queues

| -| `REPO_SYNC_RETRY_BASE_SLEEP_SECONDS` | `60` |

The base sleep duration (in seconds) for exponential backoff when retrying repository sync operations that fail

| -| `GITLAB_CLIENT_QUERY_TIMEOUT_SECONDS` | `600` |

The timeout duration (in seconds) for GitLab client queries

| -| `SMTP_CONNECTION_URL` | `-` |

The url to the SMTP service used for sending transactional emails. See [this doc](/docs/configuration/transactional-emails) for more info.

You can also use `SMTP_HOST`, `SMTP_PORT`, `SMTP_USERNAME`, and `SMTP_PASSWORD` to construct the SMTP connection url.

| -| `SMTP_HOST` | `-` |

The hostname of the SMTP server. Used to construct `SMTP_CONNECTION_URL` when individual SMTP variables are provided.

| -| `SMTP_PORT` | `-` |

The port of the SMTP server.

| -| `SMTP_USERNAME` | `-` |

The username for SMTP authentication.

| -| `SMTP_PASSWORD` | `-` |

The password for SMTP authentication.

| -| `SOURCEBOT_ENCRYPTION_KEY` **(required)** | - |

Used to encrypt connection secrets and generate API keys. Generate one with `openssl rand -base64 24`.

| -| `SOURCEBOT_PUBLIC_KEY_PATH` | `/app/public.pem` |

Sourcebot's public key that's used to verify encrypted license key signatures.

| -| `SOURCEBOT_LOG_LEVEL` | `info` |

The Sourcebot logging level. Valid values are `debug`, `info`, `warn`, `error`, in order of severity.

| -| `SOURCEBOT_STRUCTURED_LOGGING_ENABLED` | `false` |

Enables/disable structured JSON logging. See [this doc](/docs/configuration/structured-logging) for more info.

| -| `SOURCEBOT_STRUCTURED_LOGGING_FILE` | - |

Optional file to log to if structured logging is enabled

| -| `SOURCEBOT_TELEMETRY_DISABLED` | `false` |

Enables/disables telemetry collection in Sourcebot. See [this doc](/docs/misc/telemetry) for more info.

| -| `DEFAULT_MAX_MATCH_COUNT` | `10000` |

The default maximum number of search results to return when using search in the web app.

| -| `DEFAULT_HOME_VIEW_PAGE` | `search` |

Sets the default home page when no user home page preference is set. Use `ask` to default to Ask Sourcebot or `search` to default to Code Search.

| -| `ALWAYS_INDEX_FILE_PATTERNS` | - |

A comma separated list of glob patterns matching file paths that should always be indexed, regardless of size or number of trigrams.

| -| `SOURCEBOT_CHAT_ATTACHMENT_MAX_IMAGE_BYTES` | `10485760` (10 MiB) |

Maximum size in bytes of a single image attachment uploaded to Ask Sourcebot. Enforced server-side at upload time.

| -| `SOURCEBOT_CHAT_ATTACHMENT_ORPHAN_TTL_HOURS` | `24` |

How long in hours an uploaded-but-unsent attachment is retained before being deleted by the orphan sweep. Set to `0` to disable the sweep.

| -| `SOURCEBOT_LLM_USER_EMAIL_HEADER_ENABLED` | `false` |

When enabled, Sourcebot sends the authenticated user's lower-cased email address to configured language model providers in the `X-Sourcebot-User-Email` request header. Anonymous requests omit the header.

| -| `NODE_USE_ENV_PROXY` | `0` |

Enables Node.js to automatically use `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables for network requests. Set to `1` to enable or `0` to disable. See [this doc](https://nodejs.org/en/learn/http/enterprise-network-configuration) for more info.

| -| `HTTP_PROXY` | - |

HTTP proxy URL for routing non-SSL requests through a proxy server (e.g., `http://proxy.company.com:8080`). Requires `NODE_USE_ENV_PROXY=1`.

| -| `HTTPS_PROXY` | - |

HTTPS proxy URL for routing SSL requests through a proxy server (e.g., `http://proxy.company.com:8080`). Requires `NODE_USE_ENV_PROXY=1`.

| -| `NO_PROXY` | - |

Comma-separated list of hostnames or domains that should bypass the proxy (e.g., `localhost,127.0.0.1,.internal.domain`). Requires `NODE_USE_ENV_PROXY=1`.

| -| `SOURCEBOT_EE_AUDIT_LOGGING_ENABLED` | `true` |

Enables/disables audit logging

| -| `SOURCEBOT_EE_AUDIT_RETENTION_DAYS` | `180` |

The number of days to retain audit logs. Audit log records older than this will be automatically pruned daily. Set to `0` to disable pruning and retain logs indefinitely.

| -| `AUTH_EE_GCP_IAP_ENABLED` | `false` |

When enabled, allows Sourcebot to automatically register/login from a successful GCP IAP redirect

| -| `AUTH_EE_GCP_IAP_AUDIENCE` | - |

The GCP IAP audience to use when verifying JWT tokens. Must be set to enable GCP IAP JIT provisioning

| -| `PERMISSION_SYNC_ENABLED` | `false` |

Enables [permission syncing](/docs/features/permission-syncing).

| -| `PERMISSION_SYNC_REPO_DRIVEN_ENABLED` | `true` |

Enables/disables [repo-driven permission syncing](/docs/features/permission-syncing#how-it-works). Only applies when `PERMISSION_SYNC_ENABLED` is `true`.

| -| `AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING` | `true` |

When enabled, different SSO accounts with the same email address will automatically be linked.

| -| `DISABLE_API_KEY_CREATION_FOR_NON_OWNER_USERS` | `false` |

When enabled, only organization owners can create API keys. Non-owner members will receive a `403` error if they attempt to create one.

| -| `DISABLE_API_KEY_USAGE_FOR_NON_OWNER_USERS` | `false` |

When enabled, only organization owners can create or use API keys. Non-owner members will receive a `403` error if they attempt to create or authenticate with an API key. If you only want to restrict creation (not usage), use `DISABLE_API_KEY_CREATION_FOR_NON_OWNER_USERS` instead.

| - - -### Review Agent Environment Variables -| Variable | Default | Description | -| :------- | :------ | :---------- | -| `GITHUB_REVIEW_AGENT_APP_ID` | `-` |

The GitHub App ID used for review agent authentication.

| -| `GITHUB_REVIEW_AGENT_APP_PRIVATE_KEY_PATH` | `-` |

The container relative path to the private key file for the GitHub App used by the review agent.

| -| `GITHUB_REVIEW_AGENT_APP_WEBHOOK_SECRET` | `-` |

The webhook secret for the GitHub App used by the review agent.

| -| `OPENAI_API_KEY` | `-` |

The OpenAI API key used by the review agent.

| -| `REVIEW_AGENT_API_KEY` | `-` |

The Sourcebot API key used by the review agent.

| -| `REVIEW_AGENT_AUTO_REVIEW_ENABLED` | `false` |

Enables/disables automatic code reviews by the review agent.

| -| `REVIEW_AGENT_LOGGING_ENABLED` | `true` |

Enables/disables logging for the review agent. Logs are saved in `DATA_CACHE_DIR/review-agent`

| -| `REVIEW_AGENT_REVIEW_COMMAND` | `review` |

The command used to trigger a code review by the review agent.

| - -### Overriding environment variables from the config - -You can override environment variables from the config file by using the `environmentOverrides` property. See [this doc](/docs/configuration/config-file#overriding-environment-variables-from-the-config) for more info. \ No newline at end of file diff --git a/docs/docs/configuration/idp.mdx b/docs/docs/configuration/idp.mdx deleted file mode 100644 index da56c15d1..000000000 --- a/docs/docs/configuration/idp.mdx +++ /dev/null @@ -1,741 +0,0 @@ ---- -title: External Identity Providers -sidebarTitle: External identity providers ---- - -import LicenseKeyRequired from '/snippets/license-key-required.mdx' - - - -You can connect Sourcebot to various **external identity providers** to associate a Sourcebot user with one or more external service accounts (ex. Google, GitHub, etc). - -External identity providers can be used for [authentication](/docs/configuration/auth) and/or [permission syncing](/docs/features/permission-syncing). They're defined in the -[config file](/docs/configuration/config-file) in the top-level `identityProviders` array: - -```json wrap icon="code" Example config with both google and github identity providers defined -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "github", - "purpose": "account_linking", - "accountLinkingRequired": true, - "clientId": { - "env": "GITHUB_IDENTITY_PROVIDER_CLIENT_ID" - }, - "clientSecret": { - "env": "GITHUB_IDENTITY_PROVIDER_CLIENT_SECRET" - } - }, - { - "provider": "google", - "clientId": { - "env": "GOOGLE_IDENTITY_PROVIDER_CLIENT_ID" - }, - "clientSecret": { - "env": "GOOGLE_IDENTITY_PROVIDER_CLIENT_SECRET" - } - } - ] -} -``` - -Secret values (such as `clientId` and `clientSecret`) can be provided as environment variables or Google Cloud secrets via [tokens](/docs/configuration/config-file#tokens). - -To configure **multiple providers of the same type**, see [Configuring multiple providers of the same type](#configuring-multiple-providers-of-the-same-type). - -# Supported External Identity Providers - -Sourcebot uses [Auth.js](https://authjs.dev/) to connect to external identity providers. If there's a provider supported by Auth.js that you don't see below, please submit a -[feature request](https://github.com/sourcebot-dev/sourcebot/issues) to have it added. - -### GitHub - -[Auth.js GitHub Provider Docs](https://authjs.dev/getting-started/providers/github) - -A GitHub connection can be used for [authentication](/docs/configuration/auth) and/or [permission syncing](/docs/features/permission-syncing). This is controlled using the `purpose` field -in the GitHub identity provider config. - - - - - To begin, you must register an Oauth client in GitHub to facilitate the identity provider connection. You can do this by creating a **GitHub App** or a **GitHub OAuth App**. Either - one works, but the **GitHub App** is the [recommended mechanism](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/differences-between-github-apps-and-oauth-apps). - - - The result of registering an OAuth client is a `CLIENT_ID` and `CLIENT_SECRET` which you'll provide to Sourcebot. - - - You don't need to install the app to use it as an external identity provider - Follow [this guide](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/registering-a-github-app) to register a new GitHub App. - - When asked to provide a callback url, provide `/api/auth/callback/github` (ex. https://sourcebot.coolcorp.com/api/auth/callback/github) - - - GitHub App callback URL configuration - - - Select "Request user authorization (OAuth) during installation" - - - GitHub App request user authorization during installation - - - Set the following fine-grained permissions in the GitHub App: - - `“Email addresses” account permissions (read)` - - - Email addresses account permission set to Read-only - - - `"Metadata" repository permissions (read)` (only needed if using [permission syncing](/docs/features/permission-syncing)) - - - Metadata repository permission set to Read-only - - - `"Contents" repository permissions (read)` (only needed if using the app to [authenticate a connection](/docs/connections/github#authenticating-with-github)) - - - Contents repository permission set to Read-only - - - - Follow [this guide](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/creating-an-oauth-app) by GitHub to create an OAuth App. - - When asked to provide a callback url, provide `/api/auth/callback/github` (ex. https://sourcebot.coolcorp.com/api/auth/callback/github) - - If [permission syncing](/docs/features/permission-syncing#github) is enabled, also enable the `repo` scope. - - - - - To provide Sourcebot the client id and secret for your OAuth client you must set them as environment variables. These can be named whatever you like - (ex. `GITHUB_IDENTITY_PROVIDER_CLIENT_ID` and `GITHUB_IDENTITY_PROVIDER_CLIENT_SECRET`) - - - Finally, pass the client id and secret to Sourcebot by defining a `identityProvider` object in the [config file](/docs/configuration/config-file): - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "github", - // "sso" for auth + perm sync, "account_linking" for only perm sync - "purpose": "account_linking", - // if purpose == "account_linking" this controls if a user must connect to the IdP - "accountLinkingRequired": true, - "clientId": { - "env": "YOUR_CLIENT_ID_ENV_VAR" - }, - "clientSecret": { - "env": "YOUR_CLIENT_SECRET_ENV_VAR" - }, - // Optional: for self-hosted GitHub Enterprise Server instances - "baseUrl": "https://github.example.com" - } - ] - } - ``` - - - - -### GitLab - -[Auth.js GitLab Provider Docs](https://authjs.dev/getting-started/providers/gitlab) - -A GitLab connection can be used for [authentication](/docs/configuration/auth) and/or [permission syncing](/docs/features/permission-syncing). This is controlled using the `purpose` field -in the GitLab identity provider config. - - - - - To begin, you must register an OAuth application in GitLab to facilitate the identity provider connection. - - Follow [this guide](https://docs.gitlab.com/integration/oauth_provider/) by GitLab to create an OAuth application. - - When configuring your application: - - Set the callback URL to `/api/auth/callback/gitlab` (ex. https://sourcebot.coolcorp.com/api/auth/callback/gitlab) - - Enable the `read_user` scope - - If [permission syncing](/docs/features/permission-syncing#gitlab) is enabled, also enable the `read_api` scope - - The result of registering an OAuth application is an `APPLICATION_ID` (`CLIENT_ID`) and `SECRET` (`CLIENT_SECRET`) which you'll provide to Sourcebot. - - - To provide Sourcebot the client id and secret for your OAuth application you must set them as environment variables. These can be named whatever you like - (ex. `GITLAB_IDENTITY_PROVIDER_CLIENT_ID` and `GITLAB_IDENTITY_PROVIDER_CLIENT_SECRET`) - - - Finally, pass the client id and secret to Sourcebot by defining a `identityProvider` object in the [config file](/docs/configuration/config-file): - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "gitlab", - // "sso" for auth + perm sync, "account_linking" for only perm sync - "purpose": "account_linking", - // if purpose == "account_linking" this controls if a user must connect to the IdP - "accountLinkingRequired": true, - "clientId": { - "env": "YOUR_CLIENT_ID_ENV_VAR" - }, - "clientSecret": { - "env": "YOUR_CLIENT_SECRET_ENV_VAR" - }, - // Optional: for self-hosted GitLab instances - "baseUrl": "https://gitlab.example.com" - } - ] - } - ``` - - - - -### Bitbucket Cloud - -[Auth.js Bitbucket Provider Docs](https://authjs.dev/getting-started/providers/bitbucket) - -A Bitbucket Cloud connection can be used for [authentication](/docs/configuration/auth) and/or [permission syncing](/docs/features/permission-syncing). This is controlled using the `purpose` field -in the Bitbucket Cloud identity provider config. - - - - - To begin, you must register an OAuth consumer in Bitbucket to facilitate the identity provider connection. - - Navigate to your Bitbucket workspace settings at `https://bitbucket.org//workspace/settings/api` and create a new **OAuth consumer** under the **OAuth consumers** section. - - When configuring your consumer: - - Set the callback URL to `/api/auth/callback/bitbucket-cloud` (ex. https://sourcebot.coolcorp.com/api/auth/callback/bitbucket-cloud) - - Enable **Account: Read** - - If [permission syncing](/docs/features/permission-syncing#bitbucket-cloud) is enabled, also enable **Repositories: Read** - - The result of creating an OAuth consumer is a `Key` (`CLIENT_ID`) and `Secret` (`CLIENT_SECRET`) which you'll provide to Sourcebot. - - - To provide Sourcebot the client id and secret for your OAuth consumer you must set them as environment variables. These can be named whatever you like - (ex. `BITBUCKET_CLOUD_IDENTITY_PROVIDER_CLIENT_ID` and `BITBUCKET_CLOUD_IDENTITY_PROVIDER_CLIENT_SECRET`) - - - Finally, pass the client id and secret to Sourcebot by defining a `identityProvider` object in the [config file](/docs/configuration/config-file): - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "bitbucket-cloud", - // "sso" for auth + perm sync, "account_linking" for only perm sync - "purpose": "account_linking", - // if purpose == "account_linking" this controls if a user must connect to the IdP - "accountLinkingRequired": true, - "clientId": { - "env": "YOUR_CLIENT_ID_ENV_VAR" - }, - "clientSecret": { - "env": "YOUR_CLIENT_SECRET_ENV_VAR" - } - } - ] - } - ``` - - - - - -### Bitbucket Server - -A Bitbucket Server (Data Center) connection can be used for [authentication](/docs/configuration/auth) and/or [permission syncing](/docs/features/permission-syncing). This is controlled using the `purpose` field -in the Bitbucket Server identity provider config. - - - - - To begin, you must register an OAuth 2.0 application in your Bitbucket Server instance to facilitate the identity provider connection. - - In your Bitbucket Server admin panel, navigate to **Administration → Application Links** and create a new incoming external application link. - - When configuring your application: - - Set the redirect URL to `/api/auth/callback/bitbucket-server` (ex. https://sourcebot.coolcorp.com/api/auth/callback/bitbucket-server) - - If [permission syncing](/docs/features/permission-syncing#bitbucket-data-center) is enabled, also enable the `REPO_READ` scope - - The result of creating the application is a `CLIENT_ID` and `CLIENT_SECRET` which you'll provide to Sourcebot. - - - To provide Sourcebot the client id and secret for your OAuth application you must set them as environment variables. These can be named whatever you like - (ex. `BITBUCKET_SERVER_IDENTITY_PROVIDER_CLIENT_ID` and `BITBUCKET_SERVER_IDENTITY_PROVIDER_CLIENT_SECRET`) - - - Finally, pass the client id, client secret, and your Bitbucket Server base URL to Sourcebot by defining a `identityProvider` object in the [config file](/docs/configuration/config-file): - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "bitbucket-server", - // "sso" for auth + perm sync, "account_linking" for only perm sync - "purpose": "account_linking", - // if purpose == "account_linking" this controls if a user must connect to the IdP - "accountLinkingRequired": true, - "baseUrl": "https://bitbucket.example.com", - "clientId": { - "env": "YOUR_CLIENT_ID_ENV_VAR" - }, - "clientSecret": { - "env": "YOUR_CLIENT_SECRET_ENV_VAR" - } - } - ] - } - ``` - - - - -### Google - -[Auth.js Google Provider Docs](https://authjs.dev/getting-started/providers/google) - -A Google connection can be used for [authentication](/docs/configuration/auth). - - - - - To begin, you must register an OAuth client in Google Cloud Console to facilitate the identity provider connection. - - Follow [this guide](https://support.google.com/cloud/answer/6158849) by Google to create OAuth 2.0 credentials. - - When configuring your OAuth client: - - Set the application type to "Web application" - - Add `/api/auth/callback/google` to the authorized redirect URIs (ex. https://sourcebot.coolcorp.com/api/auth/callback/google) - - The result of creating OAuth credentials is a `CLIENT_ID` and `CLIENT_SECRET` which you'll provide to Sourcebot. - - - To provide Sourcebot the client id and secret for your OAuth client you must set them as environment variables. These can be named whatever you like - (ex. `GOOGLE_IDENTITY_PROVIDER_CLIENT_ID` and `GOOGLE_IDENTITY_PROVIDER_CLIENT_SECRET`) - - - Finally, pass the client id and secret to Sourcebot by defining a `identityProvider` object in the [config file](/docs/configuration/config-file): - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "google", - "purpose": "sso", - "clientId": { - "env": "YOUR_CLIENT_ID_ENV_VAR" - }, - "clientSecret": { - "env": "YOUR_CLIENT_SECRET_ENV_VAR" - } - } - ] - } - ``` - - - - -### Okta - -[Auth.js Okta Provider Docs](https://authjs.dev/getting-started/providers/okta) - -An Okta connection can be used for [authentication](/docs/configuration/auth). - - - - - To begin, you must register an OAuth application in Okta to facilitate the identity provider connection. - - Follow [this guide](https://developer.okta.com/docs/guides/implement-oauth-for-okta/main/) by Okta to create an OAuth application. - - When configuring your application: - - Set the application type to "Web Application" - - Add `/api/auth/callback/okta` to the sign-in redirect URIs (ex. https://sourcebot.coolcorp.com/api/auth/callback/okta) - - The result of creating an OAuth application is a `CLIENT_ID`, `CLIENT_SECRET`, and `ISSUER` URL which you'll provide to Sourcebot. - - - To provide Sourcebot the client id, client secret, and issuer for your OAuth application you must set them as environment variables. These can be named whatever you like - (ex. `OKTA_IDENTITY_PROVIDER_CLIENT_ID`, `OKTA_IDENTITY_PROVIDER_CLIENT_SECRET`, and `OKTA_IDENTITY_PROVIDER_ISSUER`) - - - Finally, pass the client id, client secret, and issuer to Sourcebot by defining a `identityProvider` object in the [config file](/docs/configuration/config-file): - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "okta", - "purpose": "sso", - "clientId": { - "env": "YOUR_CLIENT_ID_ENV_VAR" - }, - "clientSecret": { - "env": "YOUR_CLIENT_SECRET_ENV_VAR" - }, - "issuer": { - "env": "YOUR_ISSUER_ENV_VAR" - } - } - ] - } - ``` - - - - -### Keycloak - -[Auth.js Keycloak Provider Docs](https://authjs.dev/getting-started/providers/keycloak) - -A Keycloak connection can be used for [authentication](/docs/configuration/auth). - - - - - To begin, you must register an OAuth client in Keycloak to facilitate the identity provider connection. - - Follow [this guide](https://www.keycloak.org/docs/latest/server_admin/#_oidc_clients) by Keycloak to create an OpenID Connect client. - - When configuring your client: - - Set the client protocol to "openid-connect" - - Set the access type to "confidential" - - Add `/api/auth/callback/keycloak` to the valid redirect URIs (ex. https://sourcebot.coolcorp.com/api/auth/callback/keycloak) - - The result of creating an OAuth client is a `CLIENT_ID`, `CLIENT_SECRET`, and an `ISSUER` URL (typically in the format `https:///realms/`) which you'll provide to Sourcebot. - - - To provide Sourcebot the client id, client secret, and issuer for your OAuth client you must set them as environment variables. These can be named whatever you like - (ex. `KEYCLOAK_IDENTITY_PROVIDER_CLIENT_ID`, `KEYCLOAK_IDENTITY_PROVIDER_CLIENT_SECRET`, and `KEYCLOAK_IDENTITY_PROVIDER_ISSUER`) - - - Finally, pass the client id, client secret, and issuer to Sourcebot by defining a `identityProvider` object in the [config file](/docs/configuration/config-file): - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "keycloak", - "purpose": "sso", - "clientId": { - "env": "YOUR_CLIENT_ID_ENV_VAR" - }, - "clientSecret": { - "env": "YOUR_CLIENT_SECRET_ENV_VAR" - }, - "issuer": { - "env": "YOUR_ISSUER_ENV_VAR" - } - } - ] - } - ``` - - - - -### Microsoft Entra ID (Azure AD) - -[Auth.js Microsoft Entra ID Provider Docs](https://authjs.dev/getting-started/providers/microsoft-entra-id) - -A Microsoft Entra ID connection can be used for [authentication](/docs/configuration/auth). - - -Microsoft renamed Azure Active Directory (Azure AD) to Microsoft Entra ID in 2023. If you have an existing Azure AD setup, these instructions will work for you. The underlying authentication infrastructure is the same. - - - - - - To begin, you must register an OAuth application in Microsoft Entra ID (formerly Azure Active Directory) to facilitate the identity provider connection. - - Follow [this guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app) by Microsoft to register an application. - - When configuring your application: - - Under "Authentication", add a platform and select "Web" - - Set the redirect URI to `/api/auth/callback/microsoft-entra-id` (ex. https://sourcebot.coolcorp.com/api/auth/callback/microsoft-entra-id) - - Under "Certificates & secrets", create a new client secret - - The result of registering an application is a `CLIENT_ID` (Application ID), `CLIENT_SECRET`, and `TENANT_ID` which you'll use to construct the issuer URL. - - - To provide Sourcebot the client id, client secret, and issuer for your OAuth application you must set them as environment variables. These can be named whatever you like - (ex. `MICROSOFT_ENTRA_ID_IDENTITY_PROVIDER_CLIENT_ID`, `MICROSOFT_ENTRA_ID_IDENTITY_PROVIDER_CLIENT_SECRET`, and `MICROSOFT_ENTRA_ID_IDENTITY_PROVIDER_ISSUER`) - - The issuer URL should be in the format: `https://login.microsoftonline.com//v2.0` - - - Finally, pass the client id, client secret, and issuer to Sourcebot by defining a `identityProvider` object in the [config file](/docs/configuration/config-file): - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "microsoft-entra-id", - "purpose": "sso", - "clientId": { - "env": "YOUR_CLIENT_ID_ENV_VAR" - }, - "clientSecret": { - "env": "YOUR_CLIENT_SECRET_ENV_VAR" - }, - "issuer": { - "env": "YOUR_ISSUER_ENV_VAR" - } - } - ] - } - ``` - - - - -### Authentik - -[Auth.js Authentik Provider Docs](https://authjs.dev/getting-started/providers/authentik) - -An Authentik connection can be used for [authentication](/docs/configuration/auth). - - - - - To begin, you must create a OAuth2/OpenID Connect application in Authentik. For more information, see the [Authentik documentation](https://docs.goauthentik.io/add-secure-apps/applications/manage_apps/#create-an-application-and-provider-pair). - - When configuring your application: - - Set the provider type to "OAuth2/OpenID Connect" - - Set the client type to "Confidential" - - Add `/api/auth/callback/authentik` to the redirect URIs (ex. https://sourcebot.coolcorp.com/api/auth/callback/authentik) - - After creating the application, open the application details to obtain the client id, client secret, and issuer URL (typically in the format `https:///application/o//`). - - - The client id, secret, and issuer URL are provided to Sourcebot via environment variables. These can be named whatever you like - (ex. `AUTHENTIK_IDENTITY_PROVIDER_CLIENT_ID`, `AUTHENTIK_IDENTITY_PROVIDER_CLIENT_SECRET`, and `AUTHENTIK_IDENTITY_PROVIDER_ISSUER`) - - - Create a `identityProvider` object in the [config file](/docs/configuration/config-file) with the following fields: - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "authentik", - "purpose": "sso", - "clientId": { - "env": "AUTHENTIK_IDENTITY_PROVIDER_CLIENT_ID" - }, - "clientSecret": { - "env": "AUTHENTIK_IDENTITY_PROVIDER_CLIENT_SECRET" - }, - "issuer": { - "env": "AUTHENTIK_IDENTITY_PROVIDER_ISSUER" - } - } - ] - } - ``` - - - - -### JumpCloud - -A JumpCloud connection can be used for [authentication](/docs/configuration/auth). JumpCloud supports OIDC (OpenID Connect), which Sourcebot uses to authenticate users. - - - - - To begin, you must create an SSO application in JumpCloud to facilitate the identity provider connection. For more information, see the [JumpCloud OIDC documentation](https://jumpcloud.com/support/sso-with-oidc). - - When configuring your application: - - Set the SSO type to "OIDC" - - Set the **Token Endpoint Authentication Method** to `client_secret_basic`. JumpCloud defaults to `client_secret_post`, but Sourcebot requires `client_secret_basic`. - - Add `/api/auth/callback/jumpcloud` to the redirect URIs (ex. https://sourcebot.coolcorp.com/api/auth/callback/jumpcloud) - - Set the login URL to `/login` - - After creating the application, note the `CLIENT_ID` and `CLIENT_SECRET`. The issuer URL is typically `https://oauth.id.jumpcloud.com`. - - - The client id, secret, and issuer URL are provided to Sourcebot via environment variables. These can be named whatever you like - (ex. `JUMPCLOUD_IDENTITY_PROVIDER_CLIENT_ID`, `JUMPCLOUD_IDENTITY_PROVIDER_CLIENT_SECRET`, and `JUMPCLOUD_IDENTITY_PROVIDER_ISSUER`) - - You must also set the `AUTH_SECRET` environment variable. Generate one with `openssl rand -base64 33` and pass it to your Sourcebot deployment. While `AUTH_SECRET` is auto-generated if not provided, it must be explicitly set for SSO to work reliably across restarts. - - - Create a `identityProvider` object in the [config file](/docs/configuration/config-file) with the following fields: - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "jumpcloud", - "purpose": "sso", - "clientId": { - "env": "JUMPCLOUD_IDENTITY_PROVIDER_CLIENT_ID" - }, - "clientSecret": { - "env": "JUMPCLOUD_IDENTITY_PROVIDER_CLIENT_SECRET" - }, - "issuer": { - "env": "JUMPCLOUD_IDENTITY_PROVIDER_ISSUER" - } - } - ] - } - ``` - - - - -### Idira - -[Idira custom OpenID Connect application documentation](https://docs.cyberark.com/manage/latest/en/content/identity/applications/appscustom/openidaddconfigapp.htm) - -An Idira connection can be used for [authentication](/docs/configuration/auth). Sourcebot uses Idira's OpenID Connect support to authenticate users. - - - - - In the Idira Admin Portal, go to **Manage > Identities > Web apps**, add the custom **OpenID Connect** application, and configure its Trust settings. - - When configuring the application: - - Add `/api/auth/callback/idira` to the **Authorized Redirect URIs** (ex. https://sourcebot.coolcorp.com/api/auth/callback/idira) - - Keep exact redirect URI matching enabled - - Grant the users, groups, or roles that should be able to sign in permission to run the application - - From the application's Trust page, note the `CLIENT_ID` and `ISSUER`. Generate a client secret and store it securely. Idira displays the secret only until you confirm that you have saved it. - - - Provide the client id, secret, and issuer URL to Sourcebot using environment variables. These variables can be named whatever you like - (ex. `IDIRA_IDENTITY_PROVIDER_CLIENT_ID`, `IDIRA_IDENTITY_PROVIDER_CLIENT_SECRET`, and `IDIRA_IDENTITY_PROVIDER_ISSUER`). - - - Add the Idira provider to the `identityProviders` object in the [config file](/docs/configuration/config-file): - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": { - "idira": { - "provider": "idira", - "purpose": "sso", - "clientId": { - "env": "IDIRA_IDENTITY_PROVIDER_CLIENT_ID" - }, - "clientSecret": { - "env": "IDIRA_IDENTITY_PROVIDER_CLIENT_SECRET" - }, - "issuer": { - "env": "IDIRA_IDENTITY_PROVIDER_ISSUER" - } - } - } - } - ``` - - If you use a custom identity provider id instead of `idira`, use that id in the callback URL as described in [multiple identity providers](#configuring-multiple-providers-of-the-same-type). - - - - -### Google Cloud IAP - -[Google Cloud IAP Documentation](https://cloud.google.com/iap/docs) - -Google Cloud Identity-Aware Proxy (IAP) can be used for [authentication](/docs/configuration/auth). IAP provides a layer of security for applications deployed on Google Cloud, allowing you to control access based on user identity and context. - - -GCP IAP works differently from other identity providers. Instead of redirecting users to an OAuth flow, IAP intercepts requests at the infrastructure level and adds a signed JWT header that Sourcebot validates. This means users are automatically authenticated when accessing Sourcebot through an IAP-protected endpoint. - - - - - - Your Sourcebot deployment must be behind Google Cloud IAP. Follow [this guide](https://cloud.google.com/iap/docs/enabling-on-premises-howto) by Google to enable IAP for your application. - - After enabling IAP, note the **Signed Header JWT Audience**. You can find this in the Google Cloud Console under **Security → Identity-Aware Proxy → (your application) → Edit OAuth Client → Application settings**. - - The audience will be in the format: `/projects//global/backendServices/` or `/projects//apps/`. - - - Set the IAP audience as an environment variable. This can be named whatever you like (ex. `GCP_IAP_AUDIENCE`). - - - Create a `identityProvider` object in the [config file](/docs/configuration/config-file) with the following fields: - - ```json wrap icon="code" - { - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "gcp-iap", - "purpose": "sso", - "audience": { - "env": "GCP_IAP_AUDIENCE" - } - } - ] - } - ``` - - - - -# Configuring multiple providers of the same type - -By default, each provider in the `identityProviders` array is identified by an **id** equal to its `provider` value. This id determines the provider's OAuth **callback URL** (sometimes called the redirect URL): - -``` -/api/auth/callback/ -``` - -This is why the examples above register callback URLs like `/api/auth/callback/github`. The array form supports only **one instance per provider type**. - -To configure **multiple instances of the same provider type** (for example, gitlab.com alongside a self-hosted GitLab instance), switch `identityProviders` to its object form, where you assign each provider a unique id: - -```json wrap icon="code" Two GitLab providers, one for gitlab.com and one for a self-hosted instance -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": { - "gitlab-cloud": { - "provider": "gitlab", - "purpose": "sso", - "displayName": "GitLab.com", - "clientId": { "env": "GITLAB_CLOUD_CLIENT_ID" }, - "clientSecret": { "env": "GITLAB_CLOUD_CLIENT_SECRET" } - }, - "gitlab-selfhosted": { - "provider": "gitlab", - "purpose": "sso", - "displayName": "Selfhosted GitLab", - "baseUrl": "https://gitlab.example.com", - "clientId": { "env": "GITLAB_SELFHOSTED_CLIENT_ID" }, - "clientSecret": { "env": "GITLAB_SELFHOSTED_CLIENT_SECRET" } - } - } -} -``` - -Each provider keeps the same fields documented above. The only differences are: - -- `identityProviders` is an **object** keyed by id instead of an array. -- The id you choose (`gitlab-cloud`, `gitlab-selfhosted`) sets the callback URL, so you register `/api/auth/callback/gitlab-cloud` and `/api/auth/callback/gitlab-selfhosted` with their respective OAuth clients. -- Set an optional `displayName` on each provider to give it a distinct label on the login screen. Without it, both instances fall back to the same provider-type name (for example, "GitLab"), making them hard to tell apart. - - -Each instance needs its own OAuth client (its own `clientId` and `clientSecret`) registered with the matching callback URL. - diff --git a/docs/docs/configuration/language-model-providers.mdx b/docs/docs/configuration/language-model-providers.mdx deleted file mode 100644 index 032e38e8c..000000000 --- a/docs/docs/configuration/language-model-providers.mdx +++ /dev/null @@ -1,400 +0,0 @@ ---- -title: Language Model Providers -sidebarTitle: Language model providers ---- - -import LanguageModelSchema from '/snippets/schemas/v3/languageModel.schema.mdx' - - -Looking to self-host your own model? Check out the [OpenAI Compatible](#openai-compatible) provider. - - -To use [Ask Sourcebot](/docs/features/ask) you must define at least one Language Model Provider. These providers are defined within the [config file](/docs/configuration/config-file) you -provide Sourcebot. - - -```json wrap icon="code" Example config with language model provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - // 1. Google Vertex config for Gemini 2.5 Pro - { - "provider": "google-vertex", - "model": "gemini-2.5-pro", - "displayName": "Gemini 2.5 Pro", - "project": "sourcebot", - "credentials": { - "env": "GOOGLE_APPLICATION_CREDENTIALS" - } - }, - // 2. OpenAI config for o3 - { - "provider": "openai", - "model": "o3", - "displayName": "o3", - "token": { - "env": "OPENAI_API_KEY" - } - } - ] -} -``` - -# Supported Providers - -Sourcebot uses the [Vercel AI SDK](https://ai-sdk.dev/docs/introduction), so it can integrate with any provider the SDK supports. If you don't see your provider below please submit -a [feature request](https://github.com/sourcebot-dev/sourcebot/issues/new?template=feature_request.md). - -For a detailed description of all the providers, please refer to the [schema](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/languageModel.json). - -Any parameter defined using `env` will read the value from the corresponding environment variable you provide Sourcebot - -### Amazon Bedrock - -[Vercel AI SDK Amazon Bedrock Docs](https://ai-sdk.dev/providers/ai-sdk-providers/amazon-bedrock) - -```json wrap icon="code" Example config with Amazon Bedrock provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "amazon-bedrock", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - "accessKeyId": { - "env": "AWS_ACCESS_KEY_ID" - }, - "accessKeySecret": { - "env": "AWS_SECRET_ACCESS_KEY" - }, - "sessionToken": { - "env": "AWS_SESSION_TOKEN" - }, - "region": "YOUR_REGION_HERE", // defaults to the AWS_REGION env var if not set - "baseUrl": "OPTIONAL_BASE_URL" - } - ] -} -``` - -### Anthropic - -[Vercel AI SDK Anthropic Docs](https://ai-sdk.dev/providers/ai-sdk-providers/anthropic) - -```json wrap icon="code" Example config with Anthropic provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "anthropic", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - // Auth can be provided via a API key that is sent using the `x-api-key` header... - "token": { - "env": "ANTHROPIC_API_KEY" - }, - // ...or via a auth token sent using the `Authorization: Bearer` header. - "authToken": { - "env": "ANTHROPIC_AUTH_TOKEN" - }, - "baseUrl": "OPTIONAL_BASE_URL" - } - ] -} -``` - -### Azure OpenAI - -[Vercel AI SDK Azure OpenAI Docs](https://ai-sdk.dev/providers/ai-sdk-providers/azure) - -The `model` field should be set to your Azure OpenAI deployment name. Either `resourceName` or `baseUrl` must be set. The `resourceName` is used to construct the URL `https://{resourceName}.openai.azure.com/openai/v1{path}`. If `baseUrl` is provided, `resourceName` is ignored. - -The `reasoningSummary` field controls whether the model returns its reasoning process. Set to `auto` for a condensed summary, `detailed` for more comprehensive reasoning, or `none` to disable. Defaults to `auto`. - -```json wrap icon="code" Example config with Azure AI provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "azure", - "model": "YOUR_DEPLOYMENT_NAME", - "displayName": "OPTIONAL_DISPLAY_NAME", - "resourceName": "YOUR_RESOURCE_NAME", // defaults to the AZURE_RESOURCE_NAME env var if not set - "apiVersion": "OPTIONAL_API_VERSION", - "token": { - "env": "AZURE_API_KEY" - }, - "baseUrl": "OPTIONAL_BASE_URL", // use instead of resourceName for custom endpoints - "reasoningEffort": "OPTIONAL_REASONING_EFFORT", // defaults to "medium" - "reasoningSummary": "auto" // "auto" | "detailed" | "none". Defaults to "auto" - } - ] -} -``` - -### Deepseek - -[Vercel AI SDK Deepseek Docs](https://ai-sdk.dev/providers/ai-sdk-providers/deepseek) - -```json wrap icon="code" Example config with Deepseek provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "deepseek", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - "token": { - "env": "DEEPSEEK_API_KEY" - }, - "baseUrl": "OPTIONAL_BASE_URL" - } - ] -} -``` - -### Google Generative AI - -[Vercel AI SDK Google Generative AI Docs](https://ai-sdk.dev/providers/ai-sdk-providers/google-generative-ai) - -The `thinkingLevel` field controls the depth of reasoning for Gemini 3 models. Valid values are `minimal`, `low`, `medium`, and `high`. See [thinking levels](https://ai.google.dev/gemini-api/docs/thinking#thinking-levels). - -The `thinkingBudget` field sets the number of thinking tokens for Gemini 2.5 models. Set to `-1` for dynamic thinking. See [thinking budget](https://ai.google.dev/gemini-api/docs/thinking#set-budget). - -```json wrap icon="code" Example config with Google Generative AI provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "google-generative-ai", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - "token": { - "env": "GOOGLE_GENERATIVE_AI_API_KEY" - }, - "baseUrl": "OPTIONAL_BASE_URL", - "thinkingLevel": "high", // "minimal" | "low" | "medium" | "high" (Gemini 3 models) - "thinkingBudget": -1 // number of thinking tokens, -1 for dynamic (Gemini 2.5 models) - } - ] -} -``` - -### Google Vertex - -If you're using an Anthropic model on Google Vertex, you must define a [Google Vertex Anthropic](#google-vertex-anthropic) provider instead -The `credentials` parameter here expects a **path** to a [credentials](https://console.cloud.google.com/apis/credentials) file. This file **must be in a volume mounted by Sourcebot** for it to be readable. - -[Vercel AI SDK Google Vertex AI Docs](https://ai-sdk.dev/providers/ai-sdk-providers/google-vertex) - -The `thinkingLevel` field controls the depth of reasoning for Gemini 3 models. Valid values are `minimal`, `low`, `medium`, and `high`. See [thinking levels](https://ai.google.dev/gemini-api/docs/thinking#thinking-levels). - -The `thinkingBudget` field sets the number of thinking tokens for Gemini 2.5 models. Set to `-1` for dynamic thinking. See [thinking budget](https://ai.google.dev/gemini-api/docs/thinking#set-budget). - -```json wrap icon="code" Example config with Google Vertex provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "google-vertex", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - "project": "YOUR_PROJECT_ID", // defaults to the GOOGLE_VERTEX_PROJECT env var if not set - "region": "YOUR_REGION_HERE", // defaults to the GOOGLE_VERTEX_REGION env var if not set - "credentials": { - "env": "GOOGLE_APPLICATION_CREDENTIALS" - }, - "baseUrl": "OPTIONAL_BASE_URL", - "thinkingLevel": "high", // "minimal" | "low" | "medium" | "high" (Gemini 3 models) - "thinkingBudget": -1 // number of thinking tokens, -1 for dynamic (Gemini 2.5 models) - } - ] -} -``` - -### Google Vertex Anthropic - -The `credentials` parameter here expects a **path** to a [credentials](https://console.cloud.google.com/apis/credentials) file. This file **must be in a volume mounted by Sourcebot** for it to be readable. - - -[Vercel AI SDK Google Vertex Anthropic Docs](https://ai-sdk.dev/providers/ai-sdk-providers/google-vertex#google-vertex-anthropic-provider-usage) - -```json wrap icon="code" Example config with Google Vertex Anthropic provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "google-vertex-anthropic", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - "project": "YOUR_PROJECT_ID", // defaults to the GOOGLE_VERTEX_PROJECT env var if not set - "region": "YOUR_REGION_HERE", // defaults to the GOOGLE_VERTEX_REGION env var if not set - "credentials": { - "env": "GOOGLE_APPLICATION_CREDENTIALS" - }, - "baseUrl": "OPTIONAL_BASE_URL" - } - ] -} -``` - -### Mistral - -[Vercel AI SDK Mistral Docs](https://ai-sdk.dev/providers/ai-sdk-providers/mistral) - -```json wrap icon="code" Example config with Mistral provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "mistral", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - "token": { - "env": "MISTRAL_API_KEY" - }, - "baseUrl": "OPTIONAL_BASE_URL" - } - ] -} -``` - -### OpenAI - -[Vercel AI SDK OpenAI Docs](https://ai-sdk.dev/providers/ai-sdk-providers/openai) - -The `reasoningSummary` field controls whether the model returns its reasoning process. Set to `auto` for a condensed summary, `detailed` for more comprehensive reasoning, or `none` to disable. Defaults to `auto`. - -```json wrap icon="code" Example config with OpenAI provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "openai", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - "token": { - "env": "OPENAI_API_KEY" - }, - "baseUrl": "OPTIONAL_BASE_URL", - "reasoningEffort": "OPTIONAL_REASONING_EFFORT", // defaults to "medium" - "reasoningSummary": "auto" // "auto" | "detailed" | "none". Defaults to "auto" - } - ] -} -``` - -### OpenAI Compatible - -[Vercel AI SDK OpenAI Compatible Docs](https://ai-sdk.dev/providers/openai-compatible-providers) - -The OpenAI compatible provider allows you to use any model that is compatible with the OpenAI [Chat Completions API](https://github.com/ollama/ollama/blob/main/docs/openai.md). This includes self-hosted tools like [Ollama](https://ollama.ai/) and [llama.cpp](https://github.com/ggerganov/llama.cpp). - -```json wrap icon="code" Example config with OpenAI Compatible provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "openai-compatible", - "baseUrl": "BASE_URL_HERE", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - "token": { - "env": "OPTIONAL_API_KEY" - }, - // Optional query parameters can be passed in the request url as: - "queryParams": { - // raw string values - "optional-query-param": "foo", - // or as environment variables - "optional-query-param-secret": { - "env": "MY_SECRET_ENV_VAR" - } - } - } - ] -} -``` - - -- When using [llama.cpp](https://github.com/ggml-org/llama.cpp), if you hit "Failed after 3 attempts. Last error: tools param requires --jinja flag", add the `--jinja` flag to your `llama-server` command. -- If you're seeing the LLM outputing reasoning tokens wrapped in XML tags (e.g., ``, ``, etc.), you can configure the `reasoningTag` parameter to the name of the tag (without angle brackets). This parameter defaults to `think`. - - -### OpenRouter - -[Vercel AI SDK OpenRouter Docs](https://ai-sdk.dev/providers/community-providers/openrouter) - -```json wrap icon="code" Example config with OpenRouter provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "openrouter", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - "token": { - "env": "OPENROUTER_API_KEY" - }, - "baseUrl": "OPTIONAL_BASE_URL" - } - ] -} -``` - -### xAI - -[Vercel AI SDK xAI Docs](https://ai-sdk.dev/providers/ai-sdk-providers/xai) - -```json wrap icon="code" Example config with xAI provider -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - "provider": "xai", - "model": "YOUR_MODEL_HERE", - "displayName": "OPTIONAL_DISPLAY_NAME", - "token": { - "env": "XAI_API_KEY" - }, - "baseUrl": "OPTIONAL_BASE_URL" - } - ] -} -``` - -# Custom headers - -You can pass custom headers to the language model provider by using the `headers` parameter. Header values can either be a string or a environment variable. Headers are supported for all providers. - -```json wrap icon="code" Example config with custom headers -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "models": [ - { - // ... provider, model, displayName, etc... - - // Key-value pairs of headers - "headers": { - // Header values can be passed as a environment variable... - "my-secret-header": { - "env": "MY_SECRET_HEADER_ENV_VAR" - }, - - // ... or directly as a string. - "my-non-secret-header": "plaintextvalue" - } - } - ] -} -``` - - -# Schema reference - - -[schemas/v3/languageModel.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/languageModel.json) - - - - \ No newline at end of file diff --git a/docs/docs/configuration/structured-logging.mdx b/docs/docs/configuration/structured-logging.mdx deleted file mode 100644 index 1bc0c9a0e..000000000 --- a/docs/docs/configuration/structured-logging.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Structured Logging -sidebarTitle: Structured logging ---- - -By default, Sourcebot will output logs to the console in a human readable format. If you'd like Sourcebot to output structured JSON logs, set the following env vars: - -- `SOURCEBOT_STRUCTURED_LOGGING_ENABLED` (default: `false`): Controls whether logs are in a structured JSON format -- `SOURCEBOT_STRUCTURED_LOGGING_FILE`: If structured logging is enabled and this env var is set, structured logs will be written to this file (ex. `/data/sourcebot.log`) - -### Structured log schema -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "SourcebotLog", - "properties": { - "level": { - "type": "string", - "description": "The log level (error, warning, info, debug)" - }, - "service": { - "type": "string", - "description": "The Sourcebot component that generated the log" - }, - "message": { - "type": "string", - "description": "The log message" - }, - "status": { - "type": "string", - "description": "The same value as the level field added for datadog support" - }, - "timestamp": { - "type": "string", - "description": "The timestamp of the log in ISO 8061 format" - } - } -} -``` \ No newline at end of file diff --git a/docs/docs/configuration/transactional-emails.mdx b/docs/docs/configuration/transactional-emails.mdx deleted file mode 100644 index 960ed27fa..000000000 --- a/docs/docs/configuration/transactional-emails.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Transactional Email -sidebarTitle: Transactional email ---- - -To enable transactional emails in your deployment, set the following environment variables. We recommend using [Resend](https://resend.com/), but you can use any provider. Setting this enables you to: - -- Send emails when new members are invited -- Send emails when organization join requests are created/accepted -- Log into the Sourcebot deployment using [email codes](/docs/configuration/auth/providers#email-codes) - -| Variable | Description | -| :------- | :---------- | -| `SMTP_CONNECTION_URL` | SMTP server connection (`smtp://[user[:password]@]host[:port]`)| -| `EMAIL_FROM_ADDRESS` | The sender's email address | - -You can also provide the SMTP connection details as individual environment variables instead of a full URL. - -| Variable | Description | -| :------- | :---------- | -| `SMTP_HOST` | The hostname of the SMTP server | -| `SMTP_PORT` | The port of the SMTP server | -| `SMTP_USERNAME` | The username for SMTP authentication | -| `SMTP_PASSWORD` | The password for SMTP authentication | -| `EMAIL_FROM_ADDRESS` | The sender's email address | - -If `SMTP_CONNECTION_URL` is set, it takes precedence over the individual variables. \ No newline at end of file diff --git a/docs/docs/connections/ado-cloud.mdx b/docs/docs/connections/ado-cloud.mdx deleted file mode 100644 index 2b94a349b..000000000 --- a/docs/docs/connections/ado-cloud.mdx +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: Linking code from Azure Devops Cloud -sidebarTitle: Azure Devops Cloud -icon: https://www.svgrepo.com/show/448307/azure-devops.svg ---- - -import AzureDevopsSchema from '/snippets/schemas/v3/azuredevops.schema.mdx' - -If you're not familiar with Sourcebot [connections](/docs/connections/indexing-your-code), please read that overview first. - -## Examples - - - - ```json - { - "type": "azuredevops", - "deploymentType": "cloud", - "repos": [ - "organizationName/projectName/repoName", - "organizationName/projectName/repoName2 - ] - } - ``` - - - ```json - { - "type": "azuredevops", - "deploymentType": "cloud", - "orgs": [ - "organizationName", - "organizationName2 - ] - } - ``` - - - ```json - { - "type": "azuredevops", - "deploymentType": "cloud", - "projects": [ - "organizationName/projectName", - "organizationName/projectName2" - ] - } - ``` - - - ```json - { - "type": "azuredevops", - "deploymentType": "cloud", - // Include all repos in my-org... - "orgs": [ - "my-org" - ], - // ...except: - "exclude": { - // repos that are disabled - "disabled": true, - // repos that match these glob patterns - "repos": [ - "reposToExclude*" - ], - // projects that match these glob patterns - "projects": [ - "projectstoExclude*" - ] - // repos less than the defined min OR larger than the defined max - "size": { - // repos that are less than 1MB (in bytes)... - "min": 1048576, - // or repos greater than 100MB (in bytes) - "max": 104857600 - } - } - } - ``` - - - -## Authenticating with Azure Devops Cloud - -Azure Devops Cloud requires you to provide a PAT in order to index your repositories. To learn how to create PAT, check out the [Azure Devops docs](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows). -Sourcebot needs the `Read` access for the `Code` scope in order to find and clone your repos. - -Next, provide the access [token](/docs/configuration/config-file#tokens) via an environment variable which is referenced in the `token` property: - - - - - 1. Add the `token` property to your connection config: - ```json - { - "type": "azuredevops", - "deploymentType": "cloud", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `ADO_TOKEN`. - "env": "ADO_TOKEN" - }, - // At least one of the following is required to specify which repos to sync: - "repos": ["organizationName/projectName/repoName"], - // "orgs": ["organizationName"], - // "projects": ["organizationName/projectName"] - } - ``` - - 2. Pass this environment variable each time you run Sourcebot: - ```bash - docker run \ - -e ADO_TOKEN= \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - ``` - - - -## Schema reference - - -[schemas/v3/azuredevops.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/azuredevops.json) - - - - \ No newline at end of file diff --git a/docs/docs/connections/ado-server.mdx b/docs/docs/connections/ado-server.mdx deleted file mode 100644 index 2aeff1284..000000000 --- a/docs/docs/connections/ado-server.mdx +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Linking code from Azure Devops Server -sidebarTitle: Azure Devops Server -icon: https://www.svgrepo.com/show/448307/azure-devops.svg ---- - -import AzureDevopsSchema from '/snippets/schemas/v3/azuredevops.schema.mdx' - -If you're not familiar with Sourcebot [connections](/docs/connections/indexing-your-code), please read that overview first. - -## Examples - - - - This is required if you're using an older version of ADO Server which has `/tfs` in the repo paths. - ```json - { - "type": "azuredevops", - "deploymentType": "server", - "useTfsPath": true, - "repos": [ - "organizationName/projectName/repoName", - "organizationName/projectName/repoName2 - ] - } - ``` - - - ```json - { - "type": "azuredevops", - "deploymentType": "server", - "repos": [ - "organizationName/projectName/repoName", - "organizationName/projectName/repoName2 - ] - } - ``` - - - ```json - { - "type": "azuredevops", - "deploymentType": "server", - "orgs": [ - "collectionName", - "collectionName2" - ] - } - ``` - - - ```json - { - "type": "azuredevops", - "deploymentType": "server", - "projects": [ - "collectionName/projectName", - "collectionName/projectName2" - ] - } - ``` - - - ```json - { - "type": "azuredevops", - "deploymentType": "server", - // Include all repos in my-org... - "orgs": [ - "my-org" - ], - // ...except: - "exclude": { - // repos that are disabled - "disabled": true, - // repos that match these glob patterns - "repos": [ - "reposToExclude*" - ], - // projects that match these glob patterns - "projects": [ - "projectstoExclude*" - ] - // repos less than the defined min OR larger than the defined max - "size": { - // repos that are less than 1MB (in bytes)... - "min": 1048576, - // or repos greater than 100MB (in bytes) - "max": 104857600 - } - } - } - ``` - - - -## Authenticating with Azure Devops Server - -Azure Devops Server requires you to provide a PAT in order to index your repositories. To learn how to create PAT, check out the [Azure Devops docs](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows). -Sourcebot needs the `Read` access for the `Code` scope in order to find and clone your repos. - -Next, provide the access [token](/docs/configuration/config-file#tokens) via an environment variable which is referenced in the `token` property: - - - - - 1. Add the `token` property to your connection config: - ```json - { - "type": "azuredevops", - "deploymentType": "server", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `ADO_TOKEN`. - "env": "ADO_TOKEN" - }, - // At least one of the following is required to specify which repos to sync: - "repos": ["collectionName/projectName/repoName"], - // "orgs": ["collectionName"], - // "projects": ["collectionName/projectName"] - } - ``` - - 2. Pass this environment variable each time you run Sourcebot: - ```bash - docker run \ - -e ADO_TOKEN= \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - ``` - - - -## Schema reference - - -[schemas/v3/azuredevops.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/azuredevops.json) - - - - \ No newline at end of file diff --git a/docs/docs/connections/bitbucket-cloud.mdx b/docs/docs/connections/bitbucket-cloud.mdx deleted file mode 100644 index 1aa1ca8a0..000000000 --- a/docs/docs/connections/bitbucket-cloud.mdx +++ /dev/null @@ -1,200 +0,0 @@ ---- -title: Linking code from Bitbucket Cloud -sidebarTitle: Bitbucket Cloud -icon: Bitbucket ---- - -import BitbucketSchema from '/snippets/schemas/v3/bitbucket.schema.mdx' - - -Looking for docs on Bitbucket Data Center? See [this doc](/docs/connections/bitbucket-data-center). - - -If you're not familiar with Sourcebot [connections](/docs/connections/indexing-your-code), please read that overview first. - -## Examples - - - - ```json - { - "type": "bitbucket", - "deploymentType": "cloud", - "repos": [ - "myWorkspace/myRepo" - ] - } - ``` - - - ```json - { - "type": "bitbucket", - "deploymentType": "cloud", - "workspaces": [ - "myWorkspace" - ] - } - ``` - - - ```json - { - "type": "bitbucket", - "deploymentType": "cloud", - "projects": [ - "myProject" - ] - } - ``` - - - ```json - { - "type": "bitbucket", - "deploymentType": "cloud", - // Include all repos in my-workspace... - "workspaces": [ - "myWorkspace" - ], - // ...except: - "exclude": { - // repos that are archived - "archived": true, - // repos that are forks - "forks": true, - // repos that match these glob patterns - "repos": [ - "myWorkspace/repo1", - "myWorkspace2/*" - ] - } - } - ``` - - - -## Authenticating with Bitbucket Cloud - -In order to index private repositories, you'll need to provide authentication credentials via a [token](/docs/configuration/config-file#tokens). You can do this using an `API Token`, `Access Token`, or `App Password`. - - - - 1. Navigate to [Personal Settings → API tokens](https://id.atlassian.com/manage-profile/security/api-tokens) and click **Create API token with scopes**. Give the token a name and set an expiry date. - - 2. Select **Bitbucket** as the app. - - 3. Select the following scopes: - - `read:repository:bitbucket` — View your repositories - - `read:workspace:bitbucket` — View your workspaces - - 4. Click **Create token** and copy the token value. - - 5. Add the `user` (your account email), `gitUser` (your Bitbucket username), and `token` to your connection config. [Learn why both are needed](https://support.atlassian.com/bitbucket-cloud/docs/using-api-tokens/) - - ```json - { - "type": "bitbucket", - "deploymentType": "cloud", - "user": "you@example.com", - "gitUser": "myusername", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `BITBUCKET_TOKEN`. - "env": "BITBUCKET_TOKEN" - }, - // At least one of the following is required to specify which repos to sync: - "repos": ["myWorkspace/myRepo"], - // "workspaces": ["myWorkspace"], - // "projects": ["myProject"] - } - ``` - - 6. Pass this environment variable each time you run Sourcebot: - - ```bash - docker run \ - -e BITBUCKET_TOKEN= \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - ``` - - - Create an access token for the desired scope (repo, project, or workspace). Visit the official [Bitbucket Cloud docs](https://support.atlassian.com/bitbucket-cloud/docs/access-tokens/) - for more info. - - 1. Add the `token` property to your connection config: - - ```json - { - "type": "bitbucket", - "deploymentType": "cloud", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `BITBUCKET_TOKEN`. - "env": "BITBUCKET_TOKEN" - }, - // At least one of the following is required to specify which repos to sync: - "repos": ["myWorkspace/myRepo"], - // "workspaces": ["myWorkspace"], - // "projects": ["myProject"] - } - ``` - - 2. Pass this environment variable each time you run Sourcebot: - - ```bash - docker run \ - -e BITBUCKET_TOKEN= \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - ``` - - - - App Passwords are deprecated. Atlassian recommends migrating to API tokens. [Learn more](https://www.atlassian.com/blog/bitbucket/bitbucket-cloud-transitions-to-api-tokens-enhancing-security-with-app-password-deprecation) - - - Navigate to the [app password creation page](https://bitbucket.org/account/settings/app-passwords/) and create an app password. Ensure that it has the proper permissions for the scope - of info you want to fetch (i.e. workspace, project, and/or repo level) - ![Bitbucket App Password Permissions](/images/bitbucket_app_password_perms.png) - - 1. Add the `user` (your Bitbucket username) and `token` properties to your connection config: - - ```json - { - "type": "bitbucket", - "deploymentType": "cloud", - "user": "myusername", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `BITBUCKET_TOKEN`. - "env": "BITBUCKET_TOKEN" - }, - // At least one of the following is required to specify which repos to sync: - "repos": ["myWorkspace/myRepo"], - // "workspaces": ["myWorkspace"], - // "projects": ["myProject"] - } - ``` - - 2. Pass this environment variable each time you run Sourcebot: - - ```bash - docker run \ - -e BITBUCKET_TOKEN= \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - ``` - - - - -## Schema reference - - -[schemas/v3/bitbucket.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/bitbucket.json) - - - - \ No newline at end of file diff --git a/docs/docs/connections/bitbucket-data-center.mdx b/docs/docs/connections/bitbucket-data-center.mdx deleted file mode 100644 index 3ebe4c1ae..000000000 --- a/docs/docs/connections/bitbucket-data-center.mdx +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: Linking code from Bitbucket Data Center -sidebarTitle: Bitbucket Data Center -icon: Bitbucket ---- - -import BitbucketSchema from '/snippets/schemas/v3/bitbucket.schema.mdx' - - -Looking for docs on Bitbucket Cloud? See [this doc](/docs/connections/bitbucket-cloud). - - -If you're not familiar with Sourcebot [connections](/docs/connections/indexing-your-code), please read that overview first. - -## Examples - - - - ```json - { - "type": "bitbucket", - "deploymentType": "server", - "url": "https://mybitbucketdeployment.com", - "repos": [ - "myProject/myRepo" - ] - } - ``` - - - ```json - { - "type": "bitbucket", - "deploymentType": "server", - "url": "https://mybitbucketdeployment.com", - "projects": [ - "myProject" - ] - } - ``` - - - Requires a `token` to be set in order to access private repositories. - ```json - { - "type": "bitbucket", - "deploymentType": "server", - "url": "https://mybitbucketdeployment.com", - // Index all repos visible to the provided token - "all": true - } - ``` - - - ```json - { - "type": "bitbucket", - "deploymentType": "server", - "url": "https://mybitbucketdeployment.com", - // Include all repos in myProject... - "projects": [ - "myProject" - ], - // ...except: - "exclude": { - // repos that are archived - "archived": true, - // repos that are forks - "forks": true, - // repos that match these glob patterns - "repos": [ - "myProject/repo1", - "myProject2/*" - ] - } - } - ``` - - - -## Authenticating with Bitbucket Data Center - -In order to index private repositories, you'll need to provide a [HTTP Access Token](https://confluence.atlassian.com/bitbucketserver/http-access-tokens-939515499.html). Tokens can be scoped to a user account, a project, or an individual repository. Only repositories visible to the token will be able to be indexed by Sourcebot. - - - If [permission syncing](/docs/features/permission-syncing#bitbucket-data-center) is enabled, the token must have **Repository Admin** permissions so Sourcebot can read repository-level user permissions. - - - - - User account tokens grant access to all repositories the user can access. Because these are tied to a specific user account, you must also set the `user` field to that user's username. - - 1. In Bitbucket Data Center, navigate to your profile → **Manage account** → **HTTP access tokens** and click **Create token**. Give it a name and grant it **Project read** and **Repository read** permissions. - - 2. Add the `user` (your Bitbucket username) and `token` properties to your connection config: - - ```json - { - "type": "bitbucket", - "deploymentType": "server", - "url": "https://mybitbucketdeployment.com", - "user": "myusername", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `BITBUCKET_TOKEN`. - "env": "BITBUCKET_TOKEN" - }, - // At least one of the following is required to specify which repos to sync: - "repos": ["myProject/myRepo"], - // "projects": ["myProject"], - // "all": true - } - ``` - - 3. Pass this environment variable each time you run Sourcebot: - - ```bash - docker run \ - -e BITBUCKET_TOKEN= \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - ``` - - - Project and repository tokens are scoped to a specific project or repository. - - 1. In Bitbucket Data Center, navigate to the project or repository → **Settings** → **HTTP access tokens** and click **Create token**. Give it a name and grant it **Repository read** and **Project read** permissions. - - 2. Add the `token` property to your connection config: - - ```json - { - "type": "bitbucket", - "deploymentType": "server", - "url": "https://mybitbucketdeployment.com", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `BITBUCKET_TOKEN`. - "env": "BITBUCKET_TOKEN" - }, - // At least one of the following is required to specify which repos to sync: - "repos": ["myProject/myRepo"], - // "projects": ["myProject"], - // "all": true - } - ``` - - 3. Pass this environment variable each time you run Sourcebot: - - ```bash - docker run \ - -e BITBUCKET_TOKEN= \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - ``` - - - -## Rate limiting - -Bitbucket Data Center supports [rate limiting](https://confluence.atlassian.com/bitbucketserver094/improving-instance-stability-with-rate-limiting-1489803023.html) to protect instance stability. Rate limiting applies to HTTP requests with basic or bearer authentication, which includes the REST API calls Sourcebot makes to sync repositories. - -If rate limiting is enabled on your instance, Sourcebot may receive `HTTP 429 (Too Many Requests)` errors during sync. To prevent this, add a rate limiting exemption for the user (service account) whose token is used in your connection config. - -To add an exemption: - -1. In Bitbucket Data Center, go to **Administration** → **Rate limiting** → **Exemptions** tab. -2. Click **Add exemption** and find the service account user. -3. Select **Allow unlimited requests** (recommended) or set a custom token bucket size and refill rate appropriate for your sync volume. -4. Click **Save**. - - - Bitbucket Data Center rate limiting exemptions tab showing a user with unlimited requests - - -## Troubleshooting -If you're seeing errors like `TypeError: fetch failed` when fetching repo info, it may be that Sourcebot is refusing to connect to your self-hosted Bitbucket instance due to unrecognized SSL certs. Try setting the `NODE_TLS_REJECT_UNAUTHORIZED=0` environment variable or providing Sourcebot your certs through the `NODE_EXTRA_CA_CERTS` environment variable. - - - -## Schema reference - - -[schemas/v3/bitbucket.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/bitbucket.json) - - - - \ No newline at end of file diff --git a/docs/docs/connections/generic-git-host.mdx b/docs/docs/connections/generic-git-host.mdx deleted file mode 100644 index 585bf0eb3..000000000 --- a/docs/docs/connections/generic-git-host.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Other Git hosts -icon: git-alt ---- - -import GenericGitHost from '/snippets/schemas/v3/genericGitHost.schema.mdx' - -Sourcebot can sync code from any Git host (by clone url). This is helpful when you want to search code that not in a [supported code host](/docs/connections/indexing-your-code#platform-connection-guides). - -If you're not familiar with Sourcebot [connections](/docs/connections/indexing-your-code), please read that overview first. - -## Getting Started - -To connect to a Git host, create a new [connection](/docs/connections/indexing-your-code) with type `git` and specify the clone url in the `url` property. For example: - -```json -{ - "type": "git", - "url": "https://github.com/sourcebot-dev/sourcebot" -} -``` - -Note that only `http` & `https` URLs are supported at this time. - -## Schema reference - - -[schemas/v3/genericGitHost.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/genericGitHost.json) - - - - \ No newline at end of file diff --git a/docs/docs/connections/gerrit.mdx b/docs/docs/connections/gerrit.mdx deleted file mode 100644 index 0db4dace3..000000000 --- a/docs/docs/connections/gerrit.mdx +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Linking code from Gerrit -sidebarTitle: Gerrit -icon: crow ---- - -import GerritSchema from '/snippets/schemas/v3/gerrit.schema.mdx' - -Authenticating with Gerrit is currently not supported. If you need this capability, please raise a [feature request](https://github.com/sourcebot-dev/sourcebot/issues/new?template=feature_request.md). - -Sourcebot can sync code from self-hosted gerrit instances. - -If you're not familiar with Sourcebot [connections](/docs/connections/indexing-your-code), please read that overview first. - -## Connecting to a Gerrit instance - -To connect to a gerrit instance, provide the `url` property to your config: - -```json -{ - "type": "gerrit", - "url": "https://gerrit.example.com", - // Specify which projects to sync using glob patterns: - "projects": ["project1/**"] -} -``` - -## Examples - - - - ```json - { - "type": "gerrit", - "url": "https://gerrit.example.com", - // Sync all repos under project1 and project2/sub-project - "projects": [ - "project1/**", - "project2/sub-project/**" - ] - } - ``` - - - ```json - { - "type": "gerrit", - "url": "https://gerrit.example.com", - // Sync all repos under project1 and project2/sub-project... - "projects": [ - "project1/**", - "project2/sub-project/**" - ], - // ...except: - "exclude": { - // any project that matches these glob patterns - "projects": [ - "project1/foo-project", - "project2/sub-project/some-sub-folder/**" - ], - - // projects that have state READ_ONLY - "readOnly": true, - - // projects that have state HIDDEN - "hidden": true - } - } - ``` - - - -## Schema reference - - -[schemas/v3/gerrit.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/gerrit.json) - - - - \ No newline at end of file diff --git a/docs/docs/connections/gitea.mdx b/docs/docs/connections/gitea.mdx deleted file mode 100644 index 5587e5113..000000000 --- a/docs/docs/connections/gitea.mdx +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Linking code from Gitea -sidebarTitle: Gitea -icon: mug-tea ---- - -import GiteaSchema from '/snippets/schemas/v3/gitea.schema.mdx' - -Sourcebot can sync code from Gitea Cloud, and self-hosted. - -If you're not familiar with Sourcebot [connections](/docs/connections/indexing-your-code), please read that overview first. - -## Examples - - - - ```json - { - "type": "gitea", - "repos": [ - "sourcebot-dev/sourcebot", - "getsentry/sentry", - "torvalds/linux" - ] - } - ``` - - - ```json - { - "type": "gitea", - "orgs": [ - "sourcebot-dev", - "getsentry", - "vercel" - ] - } - ``` - - - ```json - { - "type": "gitea", - "users": [ - "torvalds", - "ggerganov" - ] - } - ``` - - - ```json - { - "type": "gitea", - // Include all repos in my-org... - "orgs": [ - "my-org" - ], - // ...except: - "exclude": { - // repos that are archived - "archived": true, - // repos that are forks - "forks": true, - // repos that match these glob patterns - "repos": [ - "my-org/repo1", - "my-org/repo2", - "my-org/sub-org-1/**", - "my-org/sub-org-*/**" - ] - } - } - ``` - - - -## Authenticating with Gitea - -In order to index private repositories, you'll need to generate a Gitea access token. Generate a Gitea access token [here](http://gitea.com/user/settings/applications). At minimum, you'll need to select the `read:repository` scope. `read:user` and `read:organization` are required for the `user` and `org` fields of your config file: - -![Gitea Access token creation](/images/gitea_pat_creation.png) - -Next, provide the access token via an environment variable [token](/docs/configuration/config-file#tokens) which is referenced in the `token` property: - - - - - 1. Add the `token` property to your connection config: - ```json - { - "type": "gitea", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `GITEA_TOKEN`. - "env": "GITEA_TOKEN" - }, - // At least one of the following is required to specify which repos to sync: - "repos": ["my-org/myRepo"], - // "orgs": ["my-org"], - // "users": ["my-user"] - } - ``` - - 2. Pass this environment variable each time you run Sourcebot: - ```bash - docker run \ - -e GITEA_TOKEN= \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - ``` - - - -## Connecting to a custom Gitea - -To connect to a custom Gitea deployment, provide the `url` property to your config: - -```json -{ - "type": "gitea", - "url": "https://gitea.example.com", - // At least one of the following is required to specify which repos to sync: - "repos": ["my-org/myRepo"], - // "orgs": ["my-org"], - // "users": ["my-user"] -} -``` - -## Schema reference - - -[schemas/v3/gitea.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/gitea.json) - - - - \ No newline at end of file diff --git a/docs/docs/connections/github.mdx b/docs/docs/connections/github.mdx deleted file mode 100644 index fd5fbbb42..000000000 --- a/docs/docs/connections/github.mdx +++ /dev/null @@ -1,250 +0,0 @@ ---- -title: Linking code from GitHub -sidebarTitle: GitHub -icon: GitHub ---- - -import GitHubSchema from '/snippets/schemas/v3/github.schema.mdx' -import LicenseKeyRequired from '/snippets/license-key-required.mdx' - -Sourcebot can sync code from GitHub.com, GitHub Enterprise Server, and GitHub Enterprise Cloud. - -If you're not familiar with Sourcebot [connections](/docs/connections/indexing-your-code), please read that overview first. - -## Examples - - - - ```json - { - "type": "github", - "repos": [ - "sourcebot-dev/sourcebot", - "getsentry/sentry", - "torvalds/linux" - ] - } - ``` - - - ```json - { - "type": "github", - "orgs": [ - "sourcebot-dev", - "getsentry", - "vercel" - ] - } - ``` - - - ```json - { - "type": "github", - "users": [ - "torvalds", - "ggerganov" - ] - } - ``` - - - ```json - { - "type": "github", - // Sync all repos in `my-org` that have a topic that... - "orgs": [ - "my-org" - ], - // ...match one of these glob patterns. - "topics": [ - "test-*", - "ci-*", - "k8s" - ] - } - - ``` - - - ```json - { - "type": "github", - // Include all repos in my-org... - "orgs": [ - "my-org" - ], - // ...except: - "exclude": { - // repos that are archived - "archived": true, - // repos that are forks - "forks": true, - // repos that match these glob patterns - "repos": [ - "my-org/repo1", - "my-org/repo2", - "my-org/sub-org-1/**", - "my-org/sub-org-*/**" - ], - "size": { - // repos that are less than 1MB (in bytes)... - "min": 1048576, - // or repos greater than 100MB (in bytes) - "max": 104857600 - }, - // repos with topics that match these glob patterns - "topics": [ - "test-*", - "ci" - ] - } - } - ``` - - - -## Authenticating with GitHub - -In order to index private repositories, you'll need to authenticate with GitHub. Sourcebot supports the following mechanisms of authenticating a GitHub connection: - - - - - - - - Register a new [GitHub App](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/registering-a-github-app#registering-a-github-app) and provide it with the following permissions: - - “Contents” repository permissions (read) - - “Metadata” repository permissions (read) - - “Members” organization permissions (read) - - “Email addresses” account permissions (read) - - This can be the same GitHub App you've registered and configured as an [external identity provider](/docs/configuration/idp#github) - - - Install the GitHub App into the GitHub orgs that you want Sourcebot to be aware of. **Sourcebot will only be able to index repos from orgs with the GitHub App installed.** - - - Create a [private key](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/managing-private-keys-for-github-apps) for the GitHub App. - - - Create a new `apps` object in the Sourcebot [config file](/docs/configuration/config-file). The private key you created in the previous - step must be passed in as a [token](/docs/configuration/config-file#tokens). - ```json wrap icon="code" - "apps": [ - { - "type": "github", // must be github - "id": "1234567", // Your GitHub App ID - "privateKey": { - "env": "GITHUB_APP_PRIVATE_KEY" // Token which contains your Github App private key - } - } - ] - ``` - - - That's it! Sourcebot will now use this GitHub App to authenticate when pulling repos for this connection. - - - - - - - Create a new fine-grained PAT [here](https://github.com/settings/personal-access-tokens/new). Select the resource owner and the repositories that you want Sourcebot to have access to. - - Next, under "Repository permissions", select permissions `Contents` and `Metadata` with access `Read-only`. The permissions should look like the following: - - ![GitHub PAT Scope](/images/github_pat_scopes_fine_grained.png) - - [GitHub docs](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#fine-grained-personal-access-tokens) - - - Next, provide the PAT via a [token](/docs/configuration/config-file#tokens) which is referenced in the `token` field in the [connection](/docs/connections/indexing-your-code) config object. - - The most common mechanism of doing this is defining an environment variable that holds the PAT: - - ```json - { - "type": "github", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `GITHUB_TOKEN`. - "env": "GITHUB_TOKEN" - }, - // At least one of the following is required to specify which repos to sync: - "repos": ["my-org/myRepo"], - // "orgs": ["my-org"], - // "users": ["my-user"] - } - ``` - - - That's it! Sourcebot will now use this PAT to authenticate when pulling repos for this connection. - - - - - - - Create a new PAT [here](https://github.com/settings/tokens/new) and make sure you select the `repo` scope: - - ![GitHub PAT Scope](/images/github_pat_scopes.png) - - [GitHub docs](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#personal-access-tokens-classic) - - - Next, provide the PAT via a [token](/docs/configuration/config-file#tokens) which is referenced in the `token` field in the [connection](/docs/connections/indexing-your-code) config object. - - The most common mechanism of doing this is defining an environment variable that holds the PAT: - - ```json - { - "type": "github", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `GITHUB_TOKEN`. - "env": "GITHUB_TOKEN" - }, - // At least one of the following is required to specify which repos to sync: - "repos": ["my-org/myRepo"], - // "orgs": ["my-org"], - // "users": ["my-user"] - } - ``` - - - That's it! Sourcebot will now use this PAT to authenticate when pulling repos for this connection. - - - - - -## Connecting to a custom GitHub host - -To connect to a GitHub host other than `github.com`, provide the `url` property to your config: - -```json -{ - "type": "github", - "url": "https://github.example.com", - // At least one of the following is required to specify which repos to sync: - "repos": ["my-org/myRepo"], - // "orgs": ["my-org"], - // "users": ["my-user"] -} -``` - -## Schema reference - - -[schemas/v3/github.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/github.json) - - - - - -## See also - -- [Syncing GitHub Access permissions to Sourcebot](/docs/features/permission-syncing#github) diff --git a/docs/docs/connections/gitlab.mdx b/docs/docs/connections/gitlab.mdx deleted file mode 100644 index a824e683a..000000000 --- a/docs/docs/connections/gitlab.mdx +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: Linking code from GitLab -sidebarTitle: GitLab -icon: GitLab ---- - -import GitLabSchema from '/snippets/schemas/v3/gitlab.schema.mdx' - -Sourcebot can sync code from GitLab.com, Self Managed (CE & EE), and Dedicated. - -If you're not familiar with Sourcebot [connections](/docs/connections/indexing-your-code), please read that overview first. - -## Examples - - - - ```json - { - "type": "gitlab", - "projects": [ - "my-group/foo", - "my-group/subgroup/bar" - ] - } - ``` - - - ```json - { - "type": "gitlab", - "groups": [ - "my-group", - "my-other-group/sub-group" - ] - } - ``` - - - This option is ignored if `url` is unset. See [connecting to a custom gitlab host](/docs/connections/gitlab#connecting-to-a-custom-gitlab-host). - ```json - { - "type": "gitlab", - "url": "https://gitlab.example.com", - // Index all projects in this self-managed instance - "all": true - } - ``` - - - ```json - { - "type": "gitlab", - "users": [ - "user-1", - "user-2" - ] - } - ``` - - - ```json - { - "type": "gitlab", - // Sync all projects in `my-group` that have a topic that... - "groups": [ - "my-group" - ], - // ...match one of these glob patterns. - "topics": [ - "test-*", - "ci-*", - "k8s" - ] - } - - ``` - - - ```json - { - "type": "gitlab", - // Include all projects in these groups... - "groups": [ - "my-group", - "my-other-group/sub-group" - ] - // ...except: - "exclude": { - // projects that are archived - "archived": true, - // projects that are forks - "forks": true, - // projects that are owned by users (not groups) - "userOwnedProjects": true, - // projects that match these glob patterns - "projects": [ - "my-group/foo/**", - "my-group/bar/**", - "my-other-group/sub-group/specific-project" - ], - // repos with topics that match these glob patterns - "topics": [ - "test-*", - "ci" - ] - } - } - ``` - - - - -## Authenticating with GitLab - -In order to index private projects, you'll need to generate a GitLab Personal Access Token (PAT). Create a new PAT [here](https://gitlab.com/-/user_settings/personal_access_tokens) and make sure you select the `read_api` scope: - -![GitLab PAT Scope](/images/gitlab_pat_scopes.png) - -Next, provide the PAT via an environment variable [token](/docs/configuration/config-file#tokens) which is referenced in the `token` property: - - - - - 1. Add the `token` property to your connection config: - ```json - { - "type": "gitlab", - "token": { - // note: this env var can be named anything. It - // doesn't need to be `GITLAB_TOKEN`. - "env": "GITLAB_TOKEN" - }, - // At least one of the following is required to specify which projects to sync: - "projects": ["my-group/myProject"], - // "groups": ["my-group"], - // "users": ["my-user"], - // "all": true (self-managed only) - } - ``` - - 2. Pass this environment variable each time you run Sourcebot: - ```bash - docker run \ - -e GITLAB_TOKEN= \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - ``` - - - -## Connecting to a custom GitLab host - -To connect to a GitLab host other than `gitlab.com`, provide the `url` property to your config: - -```json -{ - "type": "gitlab", - "url": "https://gitlab.example.com", - // At least one of the following is required to specify which projects to sync: - "projects": ["my-group/myProject"], - // "groups": ["my-group"], - // "users": ["my-user"], - // "all": true -} -``` - -## Troubleshooting - -- If you're seeing errors like `GitbeakerTimeoutError: Query timeout was reached` when syncing a large number of projects, you can increase the client's timeout by setting the `GITLAB_CLIENT_QUERY_TIMEOUT_SECONDS` environment variable. [#162](https://github.com/sourcebot-dev/sourcebot/issues/162) -- If you're seeing errors like `TypeError: fetch failed` when fetching user/project info, it may be that Sourcebot is refusing to connect to your self-hosted GitLab instance due to unrecognized SSL certs. Try setting the `NODE_TLS_REJECT_UNAUTHORIZED=0` environment variable or providing Sourcebot your certs through the `NODE_EXTRA_CA_CERTS` environment variable. - -## Schema reference - - -[schemas/v3/gitlab.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/gitlab.json) - - - - \ No newline at end of file diff --git a/docs/docs/connections/indexing-your-code.mdx b/docs/docs/connections/indexing-your-code.mdx deleted file mode 100644 index d9f851cf7..000000000 --- a/docs/docs/connections/indexing-your-code.mdx +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Indexing your code ---- - -import SupportedPlatforms from '/snippets/platform-support.mdx' -import ConfigSchema from '/snippets/schemas/v3/index.schema.mdx' - -A **connection** represents Sourcebot's link to a code host platform (GitHub, GitLab, etc). Connections are defined within the [config file](/docs/configuration/config-file) you provide Sourcebot. - -Each connection defines how Sourcebot should authenticate and interact with a particular host, and which repositories to sync and index from that host. Connections are uniquely identified by their name. - -```json wrap icon="code" Example config with two connections -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "connections": { - // 1. A connection to GitHub.com - "github-connection": { - "type": "github", - "repos": [ - "sourcebot-dev/sourcebot" - ], - "token": { - "env": "GITHUB_TOKEN" - } - }, - // 2. A connection to a self-hosted GitLab instance - "gitlab-connection": { - "type": "gitlab", - "url": "https://gitlab.example.com", - "groups": [ - "my-group", - "my-other-group/sub-group" - ], - "token": { - "env": "GITLAB_TOKEN" - } - } - } -} -``` - -Configuration files must conform to the [JSON schema](#schema-reference). - -## Connection Syncing - -When a connection is first discovered, or the `resyncConnectionIntervalMs` [setting](/docs/configuration/config-file#settings) has exceeded, the connection will be synced. This consists of: -1. Fetching the latest changes from `HEAD` (and any [additional branches](/docs/features/search/multi-branch-indexing)) from the code host. -2. Re-indexing the repository. - -This is processed in a [job queue](/docs/misc/architecture), and is parallelized across multiple worker processes. Jobs will take longer to complete the first time a repository is synced, or when a diff is large. - -On the home page, you can view the sync status of ongoing jobs: - - - -## Platform Connection Guides - -To learn more about how to create a connection for a specific code host, check out the guides below. - - - -Missing your code host? [Submit a feature request on GitHub](https://github.com/sourcebot-dev/sourcebot/issues/new?template=feature_request.md). - -## Indexing Large Files - -By default, Sourcebot will skip indexing files that are larger than 2MB or have more than 20,000 trigrams. You can configure this by setting the `maxFileSize` and `maxTrigramCount` [settings](/docs/configuration/config-file#settings). - -These limits can be ignored for specific files by passing in a comma separated list of glob patterns matching file paths to the `ALWAYS_INDEX_FILE_PATTERNS` environment variable. For example: - -```bash -# Always index all .sum and .lock files -ALWAYS_INDEX_FILE_PATTERNS=**/*.sum,**/*.lock -``` - -Files that have been skipped are assigned the `skipped` language. You can view a list of all skipped files by using the following query: -``` -lang:skipped -``` - -## Indexing Binary Files - -Binary files cannot be indexed by Sourcebot. See [#575](https://github.com/sourcebot-dev/sourcebot/issues/575) for more information. - - -## Schema reference ---- - - -[schemas/v3/index.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/index.json) - - - - diff --git a/docs/docs/connections/local-repos.mdx b/docs/docs/connections/local-repos.mdx deleted file mode 100644 index bc18b59d1..000000000 --- a/docs/docs/connections/local-repos.mdx +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: Local Git repositories -icon: folder ---- - -import GenericGitHost from '/snippets/schemas/v3/genericGitHost.schema.mdx' - -Sourcebot can sync code from generic git repositories stored in a local directory. This can be helpful in scenarios where you already have a large number of repos already checked out. Local repositories are treated as **read-only**, meaning Sourcebot will **not** `git fetch` new revisions. - -If you're not familiar with Sourcebot [connections](/docs/connections/indexing-your-code), please read that overview first. - -## Getting Started - - -Only folders containing git repositories at their root **and** have a `remote.origin.url` set in their git config are supported at this time. All other folders will be skipped. - - -Let's assume we have a `repos` directory located at `$(PWD)` with a collection of git repositories: - -```sh -repos/ -├─ repo_1/ -├─ repo_2/ -├─ repo_3/ -├─ ... -``` - -To get Sourcebot to index these repositories: - - - - We need to mount a docker volume to the `repos` directory so Sourcebot can read it's contents. Sourcebot will **not** write to local repositories, so we can mount a separate **read-only** volume: - - ``` bash - docker run \ - -v $(pwd)/repos:/repos:ro \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - ``` - - - - We can now create a new git [connection](/docs/connections/indexing-your-code), specifying local paths with the `file://` prefix. Glob patterns are supported. For example: - - ```json - { - "type": "git", - "url": "file:///repos/*" - } - ``` - - Sourcebot will expand this glob pattern into paths `/repos/repo_1`, `/repos/repo_2`, etc. and index all valid git repositories. - - - -## Examples - - - - ```json - { - "type": "git", - "url": "file:///path/to/git_repo" - } - ``` - - - ```json - // Attempt to sync directories contained in `repos/` (non-recursive) - { - "type": "git", - "url": "file:///repos/*" - } - ``` - - - -## Optimizing git operations - -Sourcebot performs a number of operations that require traversing a repository's entire commit history (e.g., `git rev-list --count HEAD`). These operations can be slow in repositories with a large number of commits. - -Typically, a [commit graph](https://git-scm.com/docs/commit-graph) is generated to speed up these operations (see [#791](https://github.com/sourcebot-dev/sourcebot/pull/791)). However, since local repositories are treated as read-only, Sourcebot **will not** generate a commit graph for them. - -A commit graph can be manually generated by running the following command in the repository's root directory: -```sh -git commit-graph write --reachable -``` - -The commit graph can be updated when fetching with `--write-commit-graph`: -```sh -git fetch --write-commit-graph -``` - -## Schema reference - - -[schemas/v3/genericGitHost.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/genericGitHost.json) - - - - \ No newline at end of file diff --git a/docs/docs/connections/request-new.mdx b/docs/docs/connections/request-new.mdx deleted file mode 100644 index 774e6be77..000000000 --- a/docs/docs/connections/request-new.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -sidebarTitle: Request another host -url: https://github.com/sourcebot-dev/sourcebot/issues/new?template=feature_request.md -title: Request another code host -icon: plus ---- - -Is your code host not supported? Please open a [feature request](https://github.com/sourcebot-dev/sourcebot/issues/new?template=feature_request.md). \ No newline at end of file diff --git a/docs/docs/deployment/deploy-sourcebot.mdx b/docs/docs/deployment/deploy-sourcebot.mdx deleted file mode 100644 index a07621d03..000000000 --- a/docs/docs/deployment/deploy-sourcebot.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Deploy Sourcebot" ---- - -Sourcebot runs entirely in your infrastructure. Your code, AI inputs/outputs, personal data, and all other sensitive data never leave your environment. - - - - The fastest way to get started. Deploy Sourcebot with a single command. - - - Deploy Sourcebot into your Kubernetes cluster using the official Helm chart. - - - -Not sure how much to provision? See the [sizing guide](/docs/deployment/sizing-guide) for resource recommendations. diff --git a/docs/docs/deployment/docker-compose.mdx b/docs/docs/deployment/docker-compose.mdx deleted file mode 100644 index 7899055a7..000000000 --- a/docs/docs/deployment/docker-compose.mdx +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: "Docker Compose" ---- - -This guide will teach you how to deploy Sourcebot using [Docker Compose](https://github.com/sourcebot-dev/sourcebot/blob/main/docker-compose.yml). This is the simplest way to get started with Sourcebot, and should only take a couple minutes. - -If you are looking to deploy onto Kubernetes, see the [Kubernetes (Helm)](/docs/deployment/k8s) guide. - -## System requirements -- RAM: Ensure your environment has at least 4GB of RAM. Insufficient memory may cause your Sourcebot deployment to be unstable. -- Docker & Docker Compose: Make sure both are installed and up-to-date. -- Node.js 18+: Required for the setup CLI - -For a more detailed requirements breakdown, please check out our [sizing guide](/docs/deployment/sizing-guide). - -## Option 1: Setup CLI - -The setup CLI will guide you through deploying Sourcebot and connecting it to your code hosts and LLM providers. This will create a new directory and generate a [configuration file](/docs/configuration/config-file) -and Docker Compose file for you. - -Run the following command to get started: - -``` -npx setup-sourcebot -``` - - - npx setup-sourcebot - - -## Option 2: Manual steps - -### Obtain the Docker Compose file - -Download the [docker-compose.yml](https://github.com/sourcebot-dev/sourcebot/blob/main/docker-compose.yml) file from the Sourcebot repository. - -```bash wrap icon="terminal" -curl -o docker-compose.yml https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/docker-compose.yml -``` - -### Create a config.json - -In the same directory as the `docker-compose.yml` file, create a [configuration file](/docs/configuration/config-file). The configuration file is a JSON file that configures Sourcebot's behaviour, including which repos to index, what language models to use, and more. - -```bash wrap icon="terminal" Create example config -touch config.json -echo '{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - // Comments are supported. - // This config creates a single connection to GitHub.com that - // indexes the Sourcebot repository - "connections": { - "starter-connection": { - "type": "github", - "repos": [ - "sourcebot-dev/sourcebot" - ] - } - } -}' > config.json -``` - -### Launch your instance - -Update the secrets in the `docker-compose.yml` and then run Sourcebot using: - -```bash wrap icon="terminal" -docker compose up -``` - -Navigate to [http://localhost:3000](http://localhost:3000) to access your Sourcebot instance. - -## Next steps - -Congrats, you've deployed Sourcebot! Check out the following guides to learn more. - -#### Configuration - - - - Connect Sourcebot to your code hosts and configure which repos to index. - - - Configure the LLM providers that power Ask Sourcebot. - - - Set up SSO and configure how users sign in to your instance. - - - Right-size your deployment based on the number of repos you're indexing. - - - -#### Features - - - - Search and navigate across all your repos and branches. - - - Ask questions across all your repos and branches. - - - Code context layer for all your agents. - - diff --git a/docs/docs/deployment/infrastructure/architecture.mdx b/docs/docs/deployment/infrastructure/architecture.mdx deleted file mode 100644 index ba58e0960..000000000 --- a/docs/docs/deployment/infrastructure/architecture.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Architecture Overview -url: /docs/misc/architecture -sidebarTitle: Architecture Overview ---- diff --git a/docs/docs/deployment/infrastructure/redis.mdx b/docs/docs/deployment/infrastructure/redis.mdx deleted file mode 100644 index f5627a585..000000000 --- a/docs/docs/deployment/infrastructure/redis.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Redis -sidebarTitle: Redis ---- - -Sourcebot uses Redis as a job queue for background indexing work. - -## TLS - -To enable TLS for your Redis connection, set `REDIS_TLS_ENABLED=true`. You can also enable TLS implicitly by using a `rediss://` connection string in `REDIS_URL`. - -| Variable | Default | Description | -| :------- | :------ | :---------- | -| `REDIS_TLS_ENABLED` | `false` | Enable TLS for the Redis connection. Alternatively, enable tls via `rediss://` connection string. | -| `REDIS_TLS_CA_PATH` | - | Path to the CA certificate for the Redis connection. | -| `REDIS_TLS_CERT_PATH` | - | Path to the certificate for the Redis connection. | -| `REDIS_TLS_KEY_PATH` | - | Path to the private key for the Redis connection. | -| `REDIS_TLS_KEY_PASSPHRASE` | - | Passphrase for encrypted private keys. Required if your TLS private key is password-protected. | -| `REDIS_TLS_SERVERNAME` | - | Server name for SNI (Server Name Indication). Useful when connecting to Redis through a proxy or with custom certificates. | -| `REDIS_TLS_REJECT_UNAUTHORIZED` | `true` | Set to `false` to disable certificate validation. Not recommended for production. When not set, defaults to Node.js secure behavior. | -| `REDIS_TLS_CHECK_SERVER_IDENTITY` | - | Set to `false` to bypass server identity checking. Use with caution in enterprise environments with custom certificate setups. | -| `REDIS_TLS_SECURE_PROTOCOL` | - | TLS protocol version (e.g., `TLSv1_2_method`, `TLSv1_3_method`). Uses Node.js defaults when not set. | -| `REDIS_TLS_CIPHERS` | - | Custom cipher suite configuration. Allows specification of allowed TLS ciphers for enhanced security requirements. | -| `REDIS_TLS_HONOR_CIPHER_ORDER` | - | Set to `true` to use server’s cipher order preference instead of client’s. Useful for enforcing security policies. | diff --git a/docs/docs/deployment/k8s.mdx b/docs/docs/deployment/k8s.mdx deleted file mode 100644 index e943c0223..000000000 --- a/docs/docs/deployment/k8s.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: "Kubernetes (Helm)" -url: https://github.com/sourcebot-dev/sourcebot-helm-chart ---- \ No newline at end of file diff --git a/docs/docs/deployment/sizing-guide.mdx b/docs/docs/deployment/sizing-guide.mdx deleted file mode 100644 index ebe772ad3..000000000 --- a/docs/docs/deployment/sizing-guide.mdx +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: "Sizing Guide" ---- - -Sourcebot runs as a single container (vertical scaling). This guide helps you choose the right CPU, memory, and disk allocation based on the number of repositories you plan to index. - - -These recommendations are based on real-world deployments. Your results may vary depending on repository sizes, search patterns, and whether you use features like [multi-branch indexing](/docs/features/search/multi-branch-indexing) or [Ask Sourcebot](/docs/features/ask/ask-sourcebot). - - -## Recommendations - -| | Small | Medium | Large | Extra Large | -|---|---|---|---|---| -| **Repos** | Up to 100 | 100 – 500 | 500 – 2,000 | 2,000+ | -| **CPU** | 2 cores | 4 cores | 8 cores | 16+ cores | -| **Memory** | 4 GB | 8 GB | 32 GB | 64+ GB | -| **Disk** | 50 GB | 100 GB | 250 GB | 500+ GB | - -We recommend using external managed Postgres and Redis instances rather than the ones embedded in the Sourcebot container, as this adds stability to your deployment. You can configure these with the `DATABASE_URL` and `REDIS_URL` [environment variables](/docs/configuration/environment-variables). - -Of all resources, **memory has the most direct impact on search performance**. Sourcebot uses [Zoekt](https://github.com/sourcegraph/zoekt) for search indexing, and the OS page cache keeps frequently accessed index data in memory. More memory means more of the index stays cached, which translates directly to faster searches and less disk I/O. - -## Disk usage - -Disk is consumed by two things: - -1. **Cloned repositories** stored in the `.sourcebot/` cache directory -2. **Zoekt search indexes** built from those repositories - -As a rule of thumb, plan for **2 – 3x the total size of the source code** you intend to index. For example, if your repositories total 50 GB, allocate at least 100 – 150 GB of disk. - - -[Multi-branch indexing](/docs/features/search/multi-branch-indexing) significantly increases disk usage since each indexed branch produces its own search index. In testing, enabling branch indexing across all branches can **triple** storage requirements. Start with a subset of branches (e.g., release branches) and monitor disk usage before expanding. - - -## Tuning concurrency - -If your instance is resource-constrained, you can reduce the concurrency of background jobs to lower CPU and memory pressure during indexing. These are configured in your [config file](/docs/configuration/config-file#settings): - -| Setting | Default | Description | -|---|---|---| -| `maxRepoIndexingJobConcurrency` | 8 | Number of repos indexed in parallel | -| `maxConnectionSyncJobConcurrency` | 8 | Number of connections synced in parallel | - -Lowering these values reduces peak resource usage at the cost of slower initial indexing. - -## Audit log storage - - -Audit logging is an enterprise feature and is only available with an [enterprise license](/docs/activating-a-subscription). If you are not on an enterprise plan, audit logs are not stored and this section does not apply. - - -[Audit logs](/docs/configuration/audit-logs) are stored in the Postgres database connected to your Sourcebot deployment. Each audit record captures the action performed, the actor, the target, a timestamp, and optional metadata (e.g., request source). There are three database indexes on the audit table to support analytics and lookup queries. - -**Estimated storage per audit event: ~350 bytes** (including row data and indexes). - - -The table below assumes 50 events per user per day. The actual number depends on usage patterns — each user action (code search, file view, navigation, Ask chat, etc.) creates one audit event. Users who interact via [MCP](/docs/features/mcp-server) or the API tend to generate significantly more events than web-only users, so your real usage may vary. - - -| Team size | Avg events / user / day | Daily events | Monthly storage | 6-month storage | -|---|---|---|---|---| -| 10 users | 50 | 500 | ~5 MB | ~30 MB | -| 50 users | 50 | 2,500 | ~25 MB | ~150 MB | -| 100 users | 50 | 5,000 | ~50 MB | ~300 MB | -| 500 users | 50 | 25,000 | ~250 MB | ~1.5 GB | -| 1,000 users | 50 | 50,000 | ~500 MB | ~3 GB | - -### Retention policy - -By default, audit logs older than **180 days** are automatically pruned daily by a background job. You can adjust this with the `SOURCEBOT_EE_AUDIT_RETENTION_DAYS` [environment variable](/docs/configuration/environment-variables). Set it to `0` to disable pruning and retain logs indefinitely. - -For most deployments, the default 180-day retention keeps database size manageable. If you have a large team with heavy MCP/API usage and need longer retention, plan your Postgres disk allocation accordingly using the estimates above. - -## Monitoring - -We recommend monitoring the following metrics after deployment to validate your sizing: - -- **Memory utilization**: sustained usage near the limit suggests you should scale up memory. High memory usage is expected and healthy since the OS page cache will use available memory. -- **CPU utilization**: sustained high CPU during searches (not just during indexing) indicates you may need more cores. -- **Disk usage**: monitor disk consumption as you add repositories. Running out of disk will cause indexing failures. -- **Search response times**: if searches are consistently slow, try increasing memory first, then CPU. diff --git a/docs/docs/features/agents/agents.mdx b/docs/docs/features/agents/agents.mdx deleted file mode 100644 index c14877e09..000000000 --- a/docs/docs/features/agents/agents.mdx +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: "Agents" ---- - -import ExperimentalFeatureWarning from '/snippets/experimental-feature-warning.mdx' - - - -Agents are automations that leverage the code indexed on Sourcebot to perform a specific task. Once you've setup Sourcebot, check out the -guides below to configure additional agents. - - - - An AI agent that reviews your PRs to identify issues - - \ No newline at end of file diff --git a/docs/docs/features/agents/review-agent.mdx b/docs/docs/features/agents/review-agent.mdx deleted file mode 100644 index c5aaa7f17..000000000 --- a/docs/docs/features/agents/review-agent.mdx +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: AI Code Review Agent -sidebarTitle: AI code review agent ---- - -This agent provides codebase-aware reviews for your GitHub PRs and GitLab MRs. For each diff, the agent fetches relevant context from your indexed codebase and feeds it into a configured language model for a detailed review. - -The AI Code Review Agent is [fair source](https://github.com/sourcebot-dev/sourcebot/tree/main/packages/web/src/features/agents/review-agent) and packaged in [Sourcebot](https://github.com/sourcebot-dev/sourcebot). To get started, [deploy Sourcebot](/docs/deployment/docker-compose) and follow the configuration instructions below. - -![AI Code Review Agent Example](/images/review_agent_example.png) - -# Language model - -The review agent uses whichever language model you have configured in your `config.json`. All providers supported by Sourcebot (OpenAI, Anthropic, AWS Bedrock, Azure OpenAI, and others) work out of the box. - -If you have multiple models configured, set `REVIEW_AGENT_MODEL` to the `displayName` of the model you want the agent to use. If this variable is unset, the agent uses the first configured model. - -# GitHub - - - - Follow the official GitHub guide for [registering a GitHub app](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/registering-a-github-app). - - - **GitHub App name**: Any name you choose (e.g. Sourcebot Review Agent) - - **Homepage URL**: Any URL you choose (e.g. `https://www.sourcebot.dev/`) - - **Webhook URL** (required): Your Sourcebot deployment URL at `/api/webhook` (e.g. `https://sourcebot.example.com/api/webhook`). Your deployment must be reachable from GitHub. If you are running Sourcebot locally, use [smee](https://docs.github.com/en/apps/creating-github-apps/writing-code-for-a-github-app/quickstart#step-2-get-a-webhook-proxy-url) to [forward webhooks](https://docs.github.com/en/apps/creating-github-apps/writing-code-for-a-github-app/quickstart#step-6-start-your-server) to your local deployment. - - **Webhook Secret**: Any string (e.g. generate one with `python -c "import secrets; print(secrets.token_hex(10))"`) - - **Permissions** - - Pull requests: Read & Write - - Issues: Read & Write - - Contents: Read - - **Events** - - Pull request - - Issue comment - - - Navigate to your new [GitHub app's page](https://docs.github.com/en/apps/creating-github-apps/writing-code-for-a-github-app/quickstart#navigate-to-your-app-settings) and press **Install**. - - - Set the following environment variables in your Sourcebot deployment: - - | Variable | Description | - |---|---| - | `GITHUB_REVIEW_AGENT_APP_ID` | The client ID of your GitHub app, found in your [app settings](https://docs.github.com/en/apps/creating-github-apps/writing-code-for-a-github-app/quickstart#navigate-to-your-app-settings) | - | `GITHUB_REVIEW_AGENT_APP_WEBHOOK_SECRET` | The webhook secret you set when registering the app | - | `GITHUB_REVIEW_AGENT_APP_PRIVATE_KEY_PATH` | Path to your app's private key file inside the container (e.g. `/data/review-agent-key.pem`). Copy the key file into the directory you mount to Sourcebot. | - - You can generate a private key in your [app settings](https://docs.github.com/en/apps/creating-github-apps/writing-code-for-a-github-app/quickstart#navigate-to-your-app-settings). - - - GitHub App Private Key - - - Example `docker-compose.yml`: - - ```yaml - services: - sourcebot: - image: docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - pull_policy: always - container_name: sourcebot - ports: - - "3000:3000" - volumes: - - "/home/user/sourcebot_workspace:/data" - environment: - CONFIG_PATH: "/data/config.json" - GITHUB_REVIEW_AGENT_APP_ID: "my-github-app-id" - GITHUB_REVIEW_AGENT_APP_WEBHOOK_SECRET: "my-webhook-secret" - GITHUB_REVIEW_AGENT_APP_PRIVATE_KEY_PATH: "/data/review-agent-key.pem" - ``` - - - Navigate to **Agents** in the Sourcebot nav menu. If your environment variables are set correctly, the GitHub Review Agent card shows a confirmation that the agent is configured and accepting requests. - - - Review Agent Configured - - - - -# GitLab - - - - Create a [personal access token](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html) or [project access token](https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html) with the following scope: - - - `api` - - Keep a note of the token value — you will need it in the next step. - - - In your GitLab project, go to **Settings → Webhooks** and add a new webhook: - - - **URL**: Your Sourcebot deployment URL at `/api/webhook` (e.g. `https://sourcebot.example.com/api/webhook`) - - **Secret token**: Any string (e.g. generate one with `python -c "import secrets; print(secrets.token_hex(10))"`) - - **Trigger events**: Merge request events, Comments - - Save the webhook. - - - Set the following environment variables in your Sourcebot deployment: - - | Variable | Description | - |---|---| - | `GITLAB_REVIEW_AGENT_WEBHOOK_SECRET` | The secret token you set on the GitLab webhook | - | `GITLAB_REVIEW_AGENT_TOKEN` | The GitLab personal or project access token | - | `GITLAB_REVIEW_AGENT_HOST` | Your GitLab hostname. Defaults to `gitlab.com`. Set this for self-hosted GitLab instances (e.g. `gitlab.example.com`). | - - Example `docker-compose.yml`: - - ```yaml - services: - sourcebot: - image: docker.sourcebot.dev/sourcebot-dev/sourcebot:latest - pull_policy: always - container_name: sourcebot - ports: - - "3000:3000" - volumes: - - "/home/user/sourcebot_workspace:/data" - environment: - CONFIG_PATH: "/data/config.json" - GITLAB_REVIEW_AGENT_WEBHOOK_SECRET: "my-webhook-secret" - GITLAB_REVIEW_AGENT_TOKEN: "glpat-my-token" - GITLAB_REVIEW_AGENT_HOST: "gitlab.example.com" - ``` - - - Navigate to **Agents** in the Sourcebot nav menu. If your environment variables are set correctly, the GitLab Review Agent card shows a confirmation that the agent is configured and accepting requests. - - - -# Using the agent - -By default, the agent does not review PRs and MRs automatically. To enable automatic reviews on every new or updated PR/MR, set `REVIEW_AGENT_AUTO_REVIEW_ENABLED` to `true`. - -You can also trigger a review manually by commenting `/review` on any PR or MR. To use a different command, set `REVIEW_AGENT_REVIEW_COMMAND` to your preferred value (without the leading slash). - -# Environment variable reference - -| Variable | Default | Description | -|---|---|---| -| `REVIEW_AGENT_AUTO_REVIEW_ENABLED` | `false` | Automatically review new and updated PRs/MRs | -| `REVIEW_AGENT_REVIEW_COMMAND` | `review` | Comment command that triggers a manual review (without the `/`) | -| `REVIEW_AGENT_MODEL` | first configured model | `displayName` of the language model to use for reviews | -| `REVIEW_AGENT_LOGGING_ENABLED` | unset | Write prompt and response logs to disk for debugging | diff --git a/docs/docs/features/analytics.mdx b/docs/docs/features/analytics.mdx deleted file mode 100644 index 693ecd07f..000000000 --- a/docs/docs/features/analytics.mdx +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: Analytics -sidebarTitle: Analytics ---- - -import LicenseKeyRequired from '/snippets/license-key-required.mdx' -import { Callout } from 'nextra/components' - - - - -## Overview - -Analytics provides comprehensive insights into your organization's usage of Sourcebot, helping you understand adoption patterns and -quantify the value of time saved. - -This dashboard is backed by [audit log](/docs/configuration/audit-logs) events. Please ensure you have audit logging enabled in order to see these insights. Analytics data is subject to the audit log [retention policy](/docs/configuration/audit-logs#retention-policy). By default, data older than 180 days is automatically pruned. - - - -The analytics dashboard segments usage by source so you can understand how your team interacts with Sourcebot across different interfaces. Each chart supports daily, weekly, and monthly time periods. - -## Global - -### Active Users -Tracks the number of unique users who performed any tracked action across all sources (web app, MCP, and API). This includes code searches, navigations, Ask chats, file views, and tree browsing. Web repo listings are excluded to reduce noise from passive page loads. - -## Web App - -Metrics from the Sourcebot web interface. - -### Web Active Users -Shows unique users who interacted with the web interface, broken down by activity type: -- **All**: Users who performed any web action (code searches, navigations, Ask chats, or file views), excluding repo listings. -- **Search**: The subset of users who performed code searches. -- **Ask**: The subset of users who created Ask chat sessions. - -### Web Activity -Total event counts for web interface activity: -- **Code Searches**: Searches performed in the web search bar. -- **Ask Chats**: Conversations created through the web interface. -- **Navigations**: "Go to Definition" and "Find All References" actions in the code viewer. - -## API - -Metrics from MCP integrations and direct API access. - -### API Active Users -Shows unique users who interacted via non-web sources: -- **Any**: Users who used either MCP or the API. -- **MCP**: Users from IDE extensions and other MCP clients. -- **API**: Users from direct HTTP API access (e.g., via API keys), excluding web app and MCP traffic. - -### API Requests -Total request counts: -- **MCP**: Code searches, file reads, tree listings, repo listings, and Ask chats from MCP clients. -- **API**: Direct HTTP API requests, excluding web app and MCP traffic. \ No newline at end of file diff --git a/docs/docs/features/ask/add-model-providers.mdx b/docs/docs/features/ask/add-model-providers.mdx deleted file mode 100644 index 19f03adde..000000000 --- a/docs/docs/features/ask/add-model-providers.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -sidebarTitle: Configure language models -url: /docs/configuration/language-model-providers -title: Configure Language Models ---- \ No newline at end of file diff --git a/docs/docs/features/ask/ask-sourcebot.mdx b/docs/docs/features/ask/ask-sourcebot.mdx deleted file mode 100644 index 8aa69de79..000000000 --- a/docs/docs/features/ask/ask-sourcebot.mdx +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Ask Sourcebot ---- - -Ask Sourcebot gives you the ability to ask complex questions about your entire codebase in natural language. - -It uses Sourcebot’s existing [code search](/docs/features/search/code-search) and [navigation](/docs/features/code-navigation) tools to allow reasoning models to search your code, -follow code nav references, and provide an answer that’s rich with inline citations, diagrams, and navigable code snippets. - -Ask Sourcebot **uses an LLM provider you configure with Sourcebot**, ensuring you have full control over where your data is sent. - - - - Learn how to self-host Sourcebot in a few simple steps. - - - Try it out for free in our public demo. - - - Learn how to connect your language model to Sourcebot - - - Learn how to index your repos so you can ask questions about them - - - -# Why do we need another AI dev tool? - -Existing AI dev tools (Cursor, Claude Code, Copilot) are great at generating code. However, we believe one of the hardest parts of being -a software engineer is **understanding code**. - -In this domain, these tools fall short: -- You can only ask questions about the code you have checked out locally -- You get a wall of text that's difficult to parse, requiring you to go back and forth through different code snippets in the response -- The richness of the explanation is limited by the fact that you're in your IDE - -We built Ask Sourcebot to address these problems. With Ask Sourcebot, you can: -- Ask questions about your teams entire codebase (even on repos you don't have locally) -- Easily parse the response with side-by-side citations and code navigation -- Visualize architecture and flows with diagrams the model generates inline -- Share answers with your team to spread the knowledge - -Being a web app is less convenient than being in your IDE, but it allows Sourcebot to provide responses in a richer UI that isn't constrained by the IDE. - -We believe this experience of understanding your codebase is superior, and we hope you find it useful. We'd love to know what you think! Feel free to join the discussion on our -[GitHub](https://github.com/sourcebot-dev/sourcebot/discussions). - -# Troubleshooting - -- **Network timeouts**: If you are hitting generic "network error" message while the answer is streaming when Sourcebot is deployed in a production environment, it may be due to your load balancer or proxy not being configured to handle long-lived connections. The timeout should be configured to a sufficiently large value (e.g., 5 minutes). \ No newline at end of file diff --git a/docs/docs/features/ask/chat-sharing.mdx b/docs/docs/features/ask/chat-sharing.mdx deleted file mode 100644 index e99f2a018..000000000 --- a/docs/docs/features/ask/chat-sharing.mdx +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Chat Sharing ---- - -Chat sharing allows you to share Ask Sourcebot conversations with others. Whether you want to share insights with your team or make a conversation publicly accessible, Sourcebot provides flexible sharing options. - - - Chat sharing dialog - - -## Visibility Options - -Every chat has a visibility setting that controls who can access it: - - - Chat visibility dropdown - - -### Private (Default) -- Only the chat owner can view the conversation -- Other users cannot access the chat, even with the link -- You can explicitly invite specific org members to view the chat (requires [Enterprise license](/docs/activating-a-subscription)) - -### Public -- Anyone with the link can view the conversation -- If [anonymous access](/docs/configuration/auth/access-settings) is enabled, no authentication is required to view -- Useful for sharing insights with your team or creating reference documentation -- Public chats can be duplicated by others - -## Sharing with Specific Users - -Sharing with specific users requires an [Enterprise License](/docs/activating-a-subscription). - - - Invite users dialog - - -Chat owners can invite specific organization members to view their private chats: - -1. Open the chat you want to share -2. Click the **Share** button in the top-right corner -3. Search for users by name or email -4. Select the users you want to invite -5. Click **Invite** to grant them access - -Invited users will be able to: -- View the full conversation -- See all messages and code citations -- Navigate through referenced code snippets - -Invited users **cannot**: -- Edit or delete the chat -- Send new messages -- Invite other users - -### Removing Access - - - Remove user from chat - - -To remove a user's access to your chat: - -1. Open the Share dialog -2. Find the user in the "People with access" list -3. Click the **X** button next to their name diff --git a/docs/docs/features/ask/connectors.mdx b/docs/docs/features/ask/connectors.mdx deleted file mode 100644 index bf472beb6..000000000 --- a/docs/docs/features/ask/connectors.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Connectors ---- - -Connectors let Ask Sourcebot access your apps and services so it can answer questions and take action on your behalf. - -They communicate over MCP and use the same permission boundaries as the connected user. This means a connector can only retrieve data that the user is authorized to access. - -Once [configured](#configuration), connectors make Ask Sourcebot more useful across your workflow. For example, Ask Sourcebot can help identify the root cause of a bug in your codebase, then create a Linear or Jira -issue with the findings and a link to the chat so teammates can pick up where you left off. - -## Usage - -From the Ask page, you can choose which connectors are available for each chat. - -Turn off a connector to prevent Ask Sourcebot from using it in that chat. - - - Toggle off connector - - -During a chat, Ask Sourcebot shows each connector tool it uses. - -If Ask Sourcebot needs to use a tool that requires approval, it pauses and asks for your permission before continuing. - - - Request tool permission - - -## Configuration - -An owner must add a connector before organization members can use it. - -To add a connector: -1. **Settings → Workspace → Ask Sourcebot** -2. Click **Add connector**. -3. Enter the MCP server URL and the name the organization will see for this server. - -Most MCP servers support dynamic client registration. When this is available, Sourcebot registers with the server automatically. - -Some MCP servers require a pre-registered OAuth app instead. In that case, an owner must register Sourcebot with the connector platform first, -then enter the OAuth client ID and client secret in Sourcebot. - -
- - OAuth client credentials dialog for a Slack connector - -
- -## OAuth Scopes - -Owners can configure which OAuth scopes users authorize when connecting to a connector. - -Sourcebot checks the connector for discoverable scopes and shows them as options. You can also add custom scopes. - -When you select scopes, most providers grant only what you request, so include the resource scopes the connector's tools need. - -
- - OAuth scopes discovery - -
- -Owners can change connector scopes at any time from **Settings → Workspace → Ask Sourcebot** and select **Edit OAuth scopes**. - -
- - OAuth scopes editing - -
- - -Changing connector scopes requires all users to re-authenticate with that connector. - - - -`offline_access` is pre-selected when you add a connector that offers it because token refresh requires it. You can deselect it to opt out of refresh tokens, but users will need to re-authenticate every time their access token expires. Some connectors, such as Atlassian, reject authorization entirely without it. -For more information, see the [OpenID Connect `offline_access` documentation](https://openid.net/specs/openid-connect-core-1_0.html#OfflineAccess). - - -## Tool Permissions - -Owners can configure how Ask Sourcebot may use each tool exposed by a connector. Changes take effect immediately and do not require users to re-authenticate. - -To edit tool permissions, open the connector menu from **Settings → Workspace → Ask Sourcebot** and select **Edit tool permissions**. - -
- - Tools editing - -
- -Each tool can be **Allowed**, require **Needs Approval**, or be **Blocked**. Allowed tools can run without pausing the chat, tools that need approval ask the user before running, and blocked tools are not available to Ask Sourcebot. - -Sourcebot groups tools by the hints reported by the connector. Tools with a read-only hint are grouped separately and tools without that hint are treated as write/delete tools. - -
- - Tool permissions view - -
- - -## Connecting - -After an owner adds connectors for your organization, go to **Settings → Account → Ask Sourcebot** to connect them. - -You can see all available connectors on this page. After you connect one, you can inspect the tools it provides and what each tool does. - -
- - Account connectors page - -
- diff --git a/docs/docs/features/ask/skills.mdx b/docs/docs/features/ask/skills.mdx deleted file mode 100644 index e974b3e8d..000000000 --- a/docs/docs/features/ask/skills.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Skills ---- - -Skills are reusable context for [Ask Sourcebot](/docs/features/ask/ask-sourcebot). -They can capture organizational knowledge, define a workflow, or give Ask Sourcebot extra context for a class of questions. - - - Skills page overview - - -## Creating a skill - -Go to **Settings -> Skills** and click **Add skill**. - -You can create a skill in three ways: - -- **New skill**: Create a skill directly in Sourcebot. -- **Import from file**: Upload a local `.md` or `.markdown` file and review it before saving. -- **Import from repository**: Choose a markdown file from an indexed repository and keep the skill synced to that file. - -Each skill has four fields: - -- **Name**: A recognizable name for the skill. -- **Command**: The slash command users type to run the skill, such as `/deep-research`. -- **Description**: A short summary of when Ask Sourcebot should use the skill. -- **Instructions**: The markdown context or guidance Ask Sourcebot uses when the skill runs. - - - Create a skill - - -## Writing instructions - -Keep the description specific. Ask Sourcebot uses it to decide when a skill is relevant, and users see it when browsing slash commands. - -Put the useful context or guidance in the instructions. - - - Skill editor - - -## Using skills in chat - -Type `/` at the start of an Ask Sourcebot prompt to browse available skill commands. - -When you select a skill, Ask Sourcebot expands the command into that skill's instructions before answering. If the instructions include file mentions, those files are added to the chat context automatically. - -Ask Sourcebot may also load a matching skill automatically. When this happens, the chat details show the loaded skill name and command. - - - Skill slash command suggestions - - -## Personal and shared skills - -Skills can be personal or shared: - -- **Personal skills** are private to you in the current workspace. -- **Shared skills** are published to the workspace skill catalog. - -You can add or remove shared skills from your own Ask commands from **Settings -> Skills**. Skill authors and organization owners can edit or delete shared skills. - -Organization owners can manage shared skills from **Settings -> Workspace -> Ask Sourcebot**. Owners can also enable **Auto** for a shared skill, which adds it to members' Ask commands by default. - - - Workspace shared skills manager - - -## Importing skills - -### Import from file - -File imports support `.md` and `.markdown` files. If the file has front matter, Sourcebot uses it to prefill the skill name, command, and description. - -Supported front matter fields: - -```md ---- -name: Debug Build Failure -slug: debug-build -description: Investigate a failing CI or build error. ---- -``` - -You can also use `title` instead of `name`, and `command` instead of `slug`. - -After importing a local file, the skill is editable in Sourcebot. - -### Import from repository - -Repository imports let you choose a markdown file from an indexed repository. Sourcebot prefills the create form from the file so you can review it, add a missing description, and save. The resulting skill stays synced to that file. - -Synced skills behave like manually-created skills, with a link back to their source file: - -- Every field stays editable. Local edits are kept until you sync. -- Sourcebot checks whether the indexed source file has changed. -- When an update is available, use **Update from source** to replace the skill's content with the file's. -- When the skill is already up to date, use **Force sync** to restore the content from the source file. -- Either action warns you first if it would overwrite local edits. -- Fields the source file does not provide (for example, a missing `description`) keep their local values when you sync. - - - Synced repository skill - - -## Permissions and synced skills - -Synced skills mirror content from a repository file, so Sourcebot only shows them to users who can access the source repository. - -If repository permission syncing is enabled, sharing a synced skill shows a warning before publishing it to the workspace. Members without access to the source repository will not see the skill. - -Organization owners can still see and manage shared synced skills from workspace settings, even if they do not have access to the source repository. - -## Managing skills - -From **Settings -> Skills**, you can: - -- Search personal and shared skills. -- Create, edit, delete, or share skills. -- Add or remove shared skills from your commands. -- Make a shared skill personal if you manage it. -- Update synced skills from their source file. - -Synced skills show their source repository and file path, plus one of these statuses: - -- **Up to date**: The skill matches the indexed source file. -- **Update available**: The indexed source file has changed. -- **Source file not found**: The file was renamed, deleted, or no longer resolves at the imported revision. -- **Source repo unavailable**: The repository is no longer available or visible. diff --git a/docs/docs/features/code-navigation.mdx b/docs/docs/features/code-navigation.mdx deleted file mode 100644 index f4e5fcac6..000000000 --- a/docs/docs/features/code-navigation.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Code navigation -sidebarTitle: Code navigation ---- - -import SearchContextSchema from '/snippets/schemas/v3/searchContext.schema.mdx' -import LicenseKeyRequired from '/snippets/license-key-required.mdx' - - - -**Code navigation** allows you to jump between symbol definition and references when viewing source files in Sourcebot. This feature is enabled **automatically** when a valid license key is present and works with all popular programming languages. - - - - -## Features - -| Feature | Description | -|:--------|:------------| -| **Hover popover** | Hovering over a symbol reveals the symbol's definition signature as a inline preview. | -| **Go to definition** | Clicking the "go to definition" button in the popover or clicking the symbol name navigates to the symbol's definition. | -| **Find references** | Clicking the "find all references" button in the popover lists all references in the explore panel. | -| **Explore panel** | Lists all references and definitions for the symbol selected in the popover. | -| **Cross-repository navigation** | You can search across all repositories by clicking the globe icon in the explore panel. By default, references and definitions are scoped to the repository where the symbol is being resolved. | - -## How does it work? - -Code navigation is **search-based**, meaning it uses the same code search engine and [query language](/docs/features/search/syntax-reference) to estimate a symbol's references and definitions. We refer to these estimations as "search heuristics". We have two search heuristics to enable the following operations: - -### Find references -Given a `symbolName`, along with information about the file the symbol is contained within (`git_revision`, and `language`), runs the following search: - -```bash -\\b{symbolName}\\b rev:{git_revision} lang:{language} case:yes -``` - -### Find definitions -Given a `symbolName`, along with information about the file the symbol is contained within (`git_revision`, and `language`), runs the following search: - -```bash -sym:\\b{symbolName}\\b rev:{git_revision} lang:{language} -``` - -Note that the `sym:` prefix is used to filter the search by symbol definitions. These are created at index time by [universal ctags](https://ctags.io/). diff --git a/docs/docs/features/mcp-server.mdx b/docs/docs/features/mcp-server.mdx deleted file mode 100644 index 85fd16721..000000000 --- a/docs/docs/features/mcp-server.mdx +++ /dev/null @@ -1,496 +0,0 @@ ---- -title: Sourcebot MCP server -sidebarTitle: Sourcebot MCP ---- - -import LicenseKeyRequired from '/snippets/license-key-required.mdx' - -The Sourcebot MCP Server connects AI tools to your [Sourcebot deployment](/docs/deployment/docker-compose). This gives your agents the ability to search, read files, resolve references & definitions, and more across all of your code hosted on Sourcebot. - - - -## Use cases - -- **Context for local agents:** Plug the MCP into coding agents like Cursor, Claude Code, or Copilot to give them context across your entire codebase, not just the open workspace. -- **Building autonomous AI agents:** Use Sourcebot as a code context layer for multi-agent systems that review PRs, auto-fix bugs, and answer questions across the company. - -## Getting Started - -Sourcebot MCP uses a [Streamable HTTP](https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#streamable-http) transport hosted at the `/api/mcp` route. Two authorization mechanisms are supported: - -- **OAuth (preferred)**: MCP clients that support OAuth 2.0 will automatically handle the authorization flow and issue a short lived access token. No API key or manual token management required. Only available with a paid [subscription](/docs/activating-a-subscription). -- **API key**: Any MCP client can authorize using a Sourcebot API key passed as a `Authorization: Bearer ` header. Create one in **Settings → API Keys**. - -You can read more about the options in the [authorization](#authorization) section. - - - **Fastest setup:** Open **Settings → MCP** in your Sourcebot deployment to copy the Server URL and use one-click install cards for supported clients. - - - - Note the following about these examples: - - The examples add the MCP server and connect it to Sourcebot's public deployment at [app.sourcebot.dev](https://app.sourcebot.dev). Replace the URL with your own Sourcebot deployment as needed. - - If [anonymous access](/docs/configuration/auth/access-settings#anonymous-access) is enabled on your Sourcebot instance, no OAuth token or API key is required. You can connect directly to the MCP endpoint without any authorization. - - - - - [Claude Code MCP docs](https://code.claude.com/docs/en/mcp#connect-claude-code-to-tools-via-mcp) - - Run the following command: - - - - - - ```sh - claude mcp add --transport http sourcebot https://app.sourcebot.dev/api/mcp - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted. Claude Code will automatically handle the OAuth 2.0 authorization flow the first time you connect. - - - ```sh - claude mcp add --transport http sourcebot https://app.sourcebot.dev/api/mcp \ - --header "Authorization: Bearer " - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted, and `` with an API key generated in **Settings → API Keys**. - - - - - - [Cursor MCP docs](https://cursor.com/docs/context/mcp) - - Go to: `Settings` -> `Cursor Settings` -> `Tools & MCP` -> `New MCP Server` - - Paste the following into your `~/.cursor/mcp.json` file: - - - - - - ```json - { - "mcpServers": { - "sourcebot": { - "type": "http", - "url": "https://app.sourcebot.dev/api/mcp" - } - } - } - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted. Cursor will automatically handle the OAuth 2.0 authorization flow the first time you connect. - - - ```json - { - "mcpServers": { - "sourcebot": { - "type": "http", - "url": "https://app.sourcebot.dev/api/mcp", - "headers": { - "Authorization": "Bearer " - } - } - } - } - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted, and `` with an API key generated in **Settings → API Keys**. - - - - - - [VS Code MCP docs](https://code.visualstudio.com/docs/copilot/customization/mcp-servers) - - Add the following to your [.vscode/mcp.json](https://code.visualstudio.com/docs/copilot/customization/mcp-servers#_add-an-mcp-server-to-your-workspace) file: - - - - - - ```json - { - "servers": { - "sourcebot": { - "type": "http", - "url": "https://app.sourcebot.dev/api/mcp" - } - } - } - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted. VS Code will automatically handle the OAuth 2.0 authorization flow the first time you connect. - - - ```json - { - "servers": { - "sourcebot": { - "type": "http", - "url": "https://app.sourcebot.dev/api/mcp", - "headers": { - "Authorization": "Bearer " - } - } - } - } - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted, and `` with an API key generated in **Settings → API Keys**. - - - - - - [Codex MCP docs](https://learn.chatgpt.com/docs/extend/mcp) - - - - - - Run the following command: - - ```sh - codex mcp add sourcebot --url https://app.sourcebot.dev/api/mcp - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted. Codex will automatically detect OAuth support and prompt you to authorize in your browser when you first connect. - - - Open **Settings → MCP** in your Sourcebot deployment and click **Copy command** on the Codex card for a ready-to-run command with the correct Server URL. - - - - Run the following command: - - ```sh - codex mcp add sourcebot --url https://app.sourcebot.dev/api/mcp --bearer-token-env-var SOURCEBOT_API_KEY - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted, then set your API key as an environment variable: - - ```sh - export SOURCEBOT_API_KEY= - ``` - - Generate an API key in **Settings → API Keys**. - - - - - - [OpenCode MCP docs](https://opencode.ai/docs/mcp-servers) - - Add the following to your `opencode.jsonc` file: - - - - - - ```json - { - "$schema": "https://opencode.ai/config.json", - "mcp": { - "sourcebot": { - "type": "remote", - "url": "https://app.sourcebot.dev/api/mcp" - } - } - } - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted. OpenCode will automatically handle the OAuth 2.0 authorization flow the first time you connect. You can also manually trigger it with: - - ```sh - opencode mcp auth sourcebot - ``` - - - ```json - { - "$schema": "https://opencode.ai/config.json", - "mcp": { - "sourcebot": { - "type": "remote", - "url": "https://app.sourcebot.dev/api/mcp", - "oauth": false, - "headers": { - "Authorization": "Bearer " - } - } - } - } - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted, and `` with an API key generated in **Settings → API Keys**. - - - - - - [Windsurf MCP docs](https://docs.windsurf.com/windsurf/cascade/mcp) - - Go to: `Windsurf Settings` -> `Cascade` -> `Add Server` -> `Add Custom Server` - - Paste the following into your `~/.codeium/windsurf/mcp_config.json` file: - - - - - - ```json - { - "mcpServers": { - "sourcebot": { - "serverUrl": "https://app.sourcebot.dev/api/mcp" - } - } - } - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted. Windsurf will automatically handle the OAuth 2.0 authorization flow the first time you connect. - - - ```json - { - "mcpServers": { - "sourcebot": { - "serverUrl": "https://app.sourcebot.dev/api/mcp", - "headers": { - "Authorization": "Bearer " - } - } - } - } - ``` - - Replace `https://app.sourcebot.dev` with wherever your Sourcebot instance is hosted, and `` with an API key generated in **Settings → API Keys**. - - - - - -## Authorization - -The Sourcebot MCP server supports two authorization methods: OAuth and API keys. If [anonymous access](/docs/configuration/auth/access-settings#anonymous-access) is enabled on your instance, no authorization is required. - -Regardless of which method you use, all MCP requests are scoped to the associated Sourcebot user and inherit the [user's role and permissions](/docs/configuration/auth/roles-and-permissions). When [permission syncing](/docs/features/permission-syncing) is configured, this includes repository permissions - the MCP server will only surface results from repositories the user has access to. - -### OAuth 2.0 - - - -Sourcebot implements an OAuth 2.0 authorization server with support for dynamic client registration (RFC 7591). This means MCP clients can register themselves automatically without any manual setup. Just point your client at the MCP endpoint and it will handle the full authorization flow, prompting you to log in and approve access in your browser the first time you connect. No API key or manual token management is required. - -Once authorized, Sourcebot issues a short-lived access token (valid for 1 hour) and a refresh token (valid for 90 days). The MCP client handles token refresh automatically, so you stay connected without needing to re-authorize. - - - OAuth authorization prompt showing Cursor requesting access to a Sourcebot account - - -### API Key (Bearer token) - -API keys provide a simpler alternative to OAuth that works with any MCP client. Each key is scoped to the user who created it and inherits their permissions. To create one, navigate to **Settings → API Keys** and click **Create API Key**. - -Pass the key as an `Authorization: Bearer ` header when connecting to the MCP server. - - - API Keys page in Sourcebot Settings - - -## Available Tools - -### `grep` - -Searches for code matching a regular expression pattern across repositories, similar to `grep`/`ripgrep`. Always case-sensitive. Results are grouped by file and include line numbers. - -Parameters: -| Name | Required | Description | -|:----------|:---------|:--------------------------------------------------------------------------------------------------------------| -| `pattern` | yes | The regex pattern to search for in file contents. | -| `path` | no | Directory path to scope the search to. Defaults to the repository root. | -| `include` | no | File glob pattern to include in the search (e.g. `*.ts`, `*.{ts,tsx}`). | -| `repo` | no | Repository name to search in. If not provided, searches all repositories. Use the full name including host (e.g. `github.com/org/repo`). | -| `ref` | no | Commit SHA, branch or tag name to search on. If not provided, defaults to the default branch. | -| `limit` | no | Maximum number of matching files to return (default: 100). | - -### `list_repos` - -Lists repositories indexed by Sourcebot with optional filtering and pagination. - -Parameters: -| Name | Required | Description | -|:------------|:---------|:--------------------------------------------------------------------------------| -| `query` | no | Filter repositories by name (case-insensitive). | -| `page` | no | Page number for pagination (min 1, default: 1). | -| `perPage` | no | Results per page for pagination (min 1, max 100, default: 30). | -| `sort` | no | Sort repositories by 'name' or 'pushed' (most recent commit). Default: 'name'. | -| `direction` | no | Sort direction: 'asc' or 'desc' (default: 'asc'). | - -### `read_file` - -Reads the source code for a given file, with optional line range control for large files. - -Parameters: -| Name | Required | Description | -|:---------|:---------|:-------------------------------------------------------------------------------------------------------| -| `repo` | yes | The repository name. | -| `path` | yes | The path to the file. | -| `ref` | no | Commit SHA, branch or tag name to fetch the source code for. If not provided, uses the default branch. | -| `offset` | no | Line number to start reading from (1-indexed). Omit to start from the beginning. | -| `limit` | no | Maximum number of lines to read (max: 500). Omit to read up to 500 lines. | - -### `list_tree` - -Lists files and directories from a repository path. Directories are shown before files at each level. - -Parameters: -| Name | Required | Description | -|:---------------------|:---------|:--------------------------------------------------------------------------------------------------------------| -| `repo` | yes | The name of the repository to list files from. | -| `path` | no | Directory path (relative to repo root). If omitted, the repo root is used. | -| `ref` | no | Commit SHA, branch or tag name to list files from. If not provided, uses the default branch. | -| `depth` | no | Number of directory levels to traverse below `path` (min 1, max 10, default: 1). | -| `includeFiles` | no | Whether to include file entries in the output (default: true). | -| `includeDirectories` | no | Whether to include directory entries in the output (default: true). | -| `maxEntries` | no | Maximum number of entries to return before truncating (min 1, max 10000, default: 1000). | - -### `list_commits` - -Get a list of commits for a given repository. - -Parameters: -| Name | Required | Description | -|:----------|:---------|:-----------------------------------------------------------------------------------------------------------------------| -| `repo` | yes | The name of the repository to list commits for. | -| `query` | no | Search query to filter commits by message content (case-insensitive). | -| `since` | no | Show commits more recent than this date. Supports ISO 8601 (e.g., '2024-01-01') or relative formats (e.g., '30 days ago'). | -| `until` | no | Show commits older than this date. Supports ISO 8601 (e.g., '2024-12-31') or relative formats (e.g., 'yesterday'). | -| `author` | no | Filter commits by author name or email (case-insensitive). | -| `ref` | no | Commit SHA, branch or tag name to list commits of. If not provided, uses the default branch. | -| `page` | no | Page number for pagination (min 1, default: 1). | -| `perPage` | no | Results per page for pagination (min 1, max 100, default: 50). | - -### `list_branches` - -You can list a repository's branches, sorted by latest commit date (newest first). Results come from Sourcebot's local snapshot, not live from the code host. You see branches created or deleted on the code host only after Sourcebot next syncs the repository. - -For each branch, you get its name, head commit SHA, latest commit time, `isDefault` (whether it is the repository's default branch), and `isIndexed` (whether code search can search that branch). - -Parameters: -| Name | Required | Description | -|:----------|:---------|:------------------------------------------------------------------------------| -| `repo` | yes | The name of the repository to list branches for. | -| `query` | no | Filter branches by name (case-insensitive). | -| `page` | no | Page number for pagination (min 1, default: 1). | -| `perPage` | no | Results per page for pagination (min 1, max 100, default: 50). | - -### `glob` - -Finds files whose paths match a glob pattern across repositories (e.g. `**/*.ts`, `src/**/*.test.{ts,tsx}`). Results are grouped by repository. - -Parameters: -| Name | Required | Description | -|:----------|:---------|:------------| -| `pattern` | yes | Glob pattern to match file paths against (e.g. `**/*.ts`, `src/**/*.test.{ts,tsx}`). | -| `path` | no | Restrict results to files under this subdirectory. | -| `repo` | no | Repository name to search in. If not provided, searches all repositories. Use the full name including host (e.g. `github.com/org/repo`). | -| `ref` | no | Commit SHA, branch or tag name to search on. If not provided, defaults to the default branch. | -| `limit` | no | Maximum number of files to return (default: 100). | - -### `get_diff` - -Returns a structured diff between two refs in a repository using a two-dot comparison. - -Parameters: -| Name | Required | Description | -|:----------|:---------|:--------------------------------------------------------------------------------------------------------------| -| `repo` | yes | The fully-qualified repository name. | -| `base` | yes | The base git ref (branch, tag, or commit SHA) to diff from. | -| `head` | yes | The head git ref (branch, tag, or commit SHA) to diff to. | - -### `find_symbol_definitions` - -Finds where a symbol (function, class, variable, etc.) is defined in a repository. - -Parameters: -| Name | Required | Description | -|:---------|:---------|:------------| -| `symbol` | yes | The symbol name to find definitions of. | -| `repo` | yes | Repository name to scope the search to. Use the full name including host (e.g. `github.com/org/repo`). | - -### `find_symbol_references` - -Finds all usages of a symbol (function, class, variable, etc.) across a repository. - -Parameters: -| Name | Required | Description | -|:---------|:---------|:------------| -| `symbol` | yes | The symbol name to find references to. | -| `repo` | yes | Repository name to scope the search to. Use the full name including host (e.g. `github.com/org/repo`). | - -### `list_language_models` - -Lists the available language models configured on the Sourcebot instance. Use this to discover which models can be specified when calling `ask_codebase`. - -Parameters: - -This tool takes no parameters. - -### `ask_codebase` - -Ask a natural language question about the codebase. This tool uses an AI agent to autonomously search code, read files, and find symbol references/definitions to answer your question. Returns a detailed answer in markdown format with code references, plus a link to view the full research session in the Sourcebot web UI. - -Parameters: -| Name | Required | Description | -|:----------------|:---------|:-----------------------------------------------------------------------------------------------------------------------------------------------| -| `query` | yes | The query to ask about the codebase. | -| `repos` | no | The repositories that are accessible to the agent during the chat. If not provided, all repositories are accessible. | -| `languageModel` | no | The language model to use for answering the question. Object with `provider` and `model`. If not provided, defaults to the first model in the config. Use `list_language_models` to see available options. | -| `visibility` | no | The visibility of the chat session (`'PRIVATE'` or `'PUBLIC'`). Defaults to `PRIVATE` for authenticated users and `PUBLIC` for anonymous users. Set to `PUBLIC` to make the chat viewable by anyone with the link (useful in shared environments like Slack). | - -### `create_skill` - -You can create an agent skill: a reusable set of instructions you invoke in Ask Sourcebot as a `/` slash command, or that the agent loads automatically when your request matches its description. The skill is personal to you and enabled immediately. The result includes a link to the skill in **Settings → Skills**. - -You need an authenticated user (API key or OAuth) and the Ask Sourcebot feature. Anonymous sessions and repository-scoped access tokens cannot use this tool. - -Parameters: -| Name | Required | Description | -|:---------------|:---------|:------------| -| `name` | yes | Display name for the skill (1-80 characters). | -| `slug` | yes | Slash command for the skill, without the leading `/`. Lowercase letters, numbers, and hyphens; at most 64 characters. Must be unique among the user's skills. | -| `description` | yes | When to use the skill (1-500 characters). Used by the agent to auto-load the skill. | -| `instructions` | yes | Markdown instructions the agent follows when the skill is invoked (1-20,000 characters). | - -### `update_skill` - -You can edit an existing skill in place. Fields you omit keep their current values. You can edit your personal skills, and shared skills only if you created them and they are enabled. Skills synced from a repository file are rejected; edit those in **Settings → Skills**. This tool never enables or disables a skill, and never moves it between the personal and shared catalogs. - -You need an authenticated user (API key or OAuth) and the Ask Sourcebot feature. Anonymous sessions and repository-scoped access tokens cannot use this tool. - -Parameters: -| Name | Required | Description | -|:---------------|:---------|:------------| -| `slug` | yes | Current slash command of the skill to update, without the leading `/`. | -| `scope` | yes | Which catalog the skill lives in: `personal` or `shared`. | -| `name` | no | New display name (1-80 characters). | -| `newSlug` | no | New slash command, without the leading `/`. Lowercase letters, numbers, and hyphens; at most 64 characters. | -| `description` | no | New description of when to use the skill (1-500 characters). | -| `instructions` | no | New markdown instructions (1-20,000 characters). | - -### `list_skills` - -You can list the skills visible to you: your personal skills plus your organization's shared catalog. Each row includes `slug` and `scope` (the pair `update_skill` needs), `enabled`, `isSynced` (linked to a repository file), `canEdit` (whether `update_skill` can edit it), and, on shared rows, `adopted`. Skill instructions are never included. - -You need an authenticated user (API key or OAuth) and the Ask Sourcebot feature. Anonymous sessions and repository-scoped access tokens cannot use this tool. - -Parameters: -| Name | Required | Description | -|:--------|:---------|:------------| -| `scope` | no | Filter to one catalog: `personal` or `shared`. Omit to list both. | diff --git a/docs/docs/features/permission-syncing.mdx b/docs/docs/features/permission-syncing.mdx deleted file mode 100644 index f867f60ed..000000000 --- a/docs/docs/features/permission-syncing.mdx +++ /dev/null @@ -1,220 +0,0 @@ ---- -title: "Permission syncing" -sidebarTitle: "Permission syncing" ---- - -import LicenseKeyRequired from '/snippets/license-key-required.mdx' - - - -# Overview - -Permission syncing allows you to sync Access Permission Lists (ACLs) from a code host to Sourcebot. When configured, users signed into Sourcebot will only be able to access repositories -that they have access to on the code host. Practically, this means: - -- Code Search results will only include repositories that the user has access to. -- Code navigation results will only include repositories that the user has access to. -- MCP results will only include results from repositories the user has access to. -- Ask Sourcebot (and the underlying LLM) will only have access to repositories that the user has access to. -- File browsing is scoped to the repositories that the user has access to. - -Permission syncing can be enabled by setting the `PERMISSION_SYNC_ENABLED` environment variable to `true`. - -```bash -docker run \ - -e PERMISSION_SYNC_ENABLED=true \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest -``` - - -Enabling permission syncing on an **existing** deployment may result in errors that look like **"User does not have an OAuth access token..."**. This is because the OAuth access token associated with the user's existing account does not have the correct scopes necessary for permission syncing. To fix, have the user re-authenticate to refresh their access token by either logging out of Sourcebot and logging in again or unlinking and re-linking their account. - - -## Platform support - -We are actively working on supporting more code hosts. If you'd like to see a specific code host supported, please [reach out](https://www.sourcebot.dev/contact). - -| Platform | Permission syncing | -|:----------|------------------------------| -| [GitHub (GHEC & GHEC Server)](/docs/features/permission-syncing#github) | ✅ | -| [GitLab (Self-managed & Cloud)](/docs/features/permission-syncing#gitlab) | ✅ | -| [Bitbucket Cloud](/docs/features/permission-syncing#bitbucket-cloud) | 🟠 Partial | -| [Bitbucket Data Center](/docs/features/permission-syncing#bitbucket-data-center) | 🟠 Partial | -| Azure DevOps Cloud | 🛑 | -| Azure DevOps Server | 🛑 | -| Gitea | 🛑 | -| Gerrit | 🛑 | -| Generic git host | 🛑 | - -# Getting started - -### GitHub - -Prerequisites: -- Configure a [GitHub connection](/docs/connections/github). -- Configure GitHub as an [external identity provider](/docs/configuration/idp#github). -- **If you are using a self-hosted GitHub instance**, you must also set the `baseUrl` property of the `github` identity provider in the [config file](/docs/configuration/config-file) to the base URL of your GitHub instance (e.g. `https://github.example.com`). - -Permission syncing works with **GitHub.com**, **GitHub Enterprise Cloud**, and **GitHub Enterprise Server**. For organization-owned repositories, users that have **read-only** access (or above) via the following methods will have their access synced to Sourcebot: -- Outside collaborators -- Organization members that are direct collaborators -- Organization members with access through team memberships -- Organization members with access through default organization permissions -- Organization owners. - -**Notes:** -- A GitHub [external identity provider](/docs/configuration/idp#github) must be configured to (1) correlate a Sourcebot user with a GitHub user, and (2) to list repositories that the user has access to for [User driven syncing](/docs/features/permission-syncing#how-it-works). -- OAuth tokens must assume the `repo` scope in order to use the [List repositories for the authenticated user API](https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#list-repositories-for-the-authenticated-user) during [User driven syncing](/docs/features/permission-syncing#how-it-works). Sourcebot **will only** use this token for **reads**. - -### GitLab - -Prerequisites: -- Configure a [GitLab connection](/docs/connections/gitlab). -- Configure GitLab as an [external identity provider](/docs/configuration/idp#gitlab). -- **If you are using a self-hosted GitLab instance**, you must also set the `baseUrl` property of the `gitlab` identity provider in the [config file](/docs/configuration/config-file) to the base URL of your GitLab instance (e.g. `https://gitlab.example.com`). - -Permission syncing works with **GitLab Self-managed** and **GitLab Cloud**. Users with **Guest** role or above with membership to a group or project will have their access synced to Sourcebot. Both direct and indirect membership to a group or project will be synced with Sourcebot. For more details, see the [GitLab docs](https://docs.gitlab.com/user/project/members/#membership-types). - - -**Notes:** -- A GitLab [external identity provider](/docs/configuration/idp#gitlab) must be configured to (1) correlate a Sourcebot user with a GitLab user, and (2) to list repositories that the user has access to for [User driven syncing](/docs/features/permission-syncing#how-it-works). -- OAuth tokens require the `read_api` scope in order to use the [List projects for the authenticated user API](https://docs.gitlab.com/ee/api/projects.html#list-all-projects) during [User driven syncing](/docs/features/permission-syncing#how-it-works). -- [Internal GitLab projects](https://docs.gitlab.com/user/public_access/#internal-projects-and-groups) are **not** enforced by permission syncing and therefore are visible to all users. Only [private projects](https://docs.gitlab.com/user/public_access/#private-projects-and-groups) are enforced. - -### Bitbucket Cloud - -Prerequisites: -- Configure a [Bitbucket Cloud connection](/docs/connections/bitbucket-cloud). -- Configure Bitbucket Cloud as an [external identity provider](/docs/configuration/idp#bitbucket-cloud). - -Permission syncing works with **Bitbucket Cloud**. OAuth tokens must assume the `account` and `repository` scopes. - - -**Partial coverage for repo-driven syncing.** Bitbucket Cloud's [repository user permissions API](https://developer.atlassian.com/cloud/bitbucket/rest/api-group-repositories/#api-repositories-workspace-repo-slug-permissions-config-users-get) only returns users who have been **directly and explicitly** granted access to a repository. Users who have access via any of the following are **not** captured by repo-driven syncing: - -- Membership in a [group that is added to the repository](https://support.atlassian.com/bitbucket-cloud/docs/grant-repository-access-to-users-and-groups/) -- Membership in the [project that contains the repository](https://support.atlassian.com/bitbucket-cloud/docs/configure-project-permissions-for-users-and-groups/) -- Membership in a group that is part of a project containing the repository - -These users **will** still gain access via [user-driven syncing](/docs/features/permission-syncing#how-it-works), which fetches all private repositories accessible to each authenticated user. However, there may be a delay between when a repository is added and when affected users gain access in Sourcebot (up to the `userDrivenPermissionSyncIntervalMs` interval, which defaults to 24 hours). - -If your workspace relies heavily on group or project-level permissions rather than direct user grants, we recommend reducing the `userDrivenPermissionSyncIntervalMs` interval to limit the window of delay. - - -When a Bitbucket Cloud account is closed by its owner, Atlassian applies an account-deletion grace period (currently 14 days for consumer accounts) before the account is fully purged. During this window, Bitbucket's permission APIs may continue to return the closed user in repository permission lists. Sourcebot revokes that user's access once the next permission sync receives an authentication error from Bitbucket, or once Atlassian fully purges the account. - -**Notes:** -- A Bitbucket Cloud [external identity provider](/docs/configuration/idp#bitbucket-cloud) must be configured to (1) correlate a Sourcebot user with a Bitbucket Cloud user, and (2) to list repositories that the user has access to for [User driven syncing](/docs/features/permission-syncing#how-it-works). -- OAuth tokens require the `account` and `repository` scopes. The `repository` scope is required to list private repositories during [User driven syncing](/docs/features/permission-syncing#how-it-works). - -### Bitbucket Data Center - -Prerequisites: -- Configure a [Bitbucket Data Center connection](/docs/connections/bitbucket-data-center). -- Configure Bitbucket Data Center as an [external identity provider](/docs/configuration/idp#bitbucket-server). - -Permission syncing works with **Bitbucket Data Center**. OAuth tokens must assume the `PUBLIC_REPOS` and `REPO_READ` scopes. - - -**Partial coverage for repo-driven syncing.** Repo-driven syncing only captures users who have been **directly and explicitly** granted access to the repository. Users who have access via any of the following are **not** captured by repo-driven syncing: - -- Project-level permissions (inherited by all repos in the project) -- Group membership - -These users **will** still gain access via [user-driven syncing](/docs/features/permission-syncing#how-it-works), which fetches all repositories accessible to each authenticated user using the `REPO_READ` scope. However, there may be a delay between when access is granted and when affected users see the repository in Sourcebot (up to the `userDrivenPermissionSyncIntervalMs` interval, which defaults to 24 hours). - -If your instance relies heavily on project or group-level permissions, we recommend reducing the `userDrivenPermissionSyncIntervalMs` interval to limit the window of delay. - - -**Notes:** -- A Bitbucket Data Center [external identity provider](/docs/configuration/idp#bitbucket-server) must be configured to (1) correlate a Sourcebot user with a Bitbucket Data Center user, and (2) to list repositories that the user has access to for [User driven syncing](/docs/features/permission-syncing#how-it-works). -- The connection token must have **Repository Read** permissions so Sourcebot can read repository-level user permissions for [Repo driven syncing](/docs/features/permission-syncing#how-it-works). -- OAuth tokens require the `REPO_READ` scope to list accessible repositories during [User driven syncing](/docs/features/permission-syncing#how-it-works). - -# Manually refreshing permissions - -If a user's permissions have changed and they need access updated immediately (without waiting for the next scheduled sync), they can trigger a manual refresh from the **Linked Accounts** page: - -1. Navigate to **Settings → Linked Accounts**. -2. Click the **Connected** button next to the relevant code host account. -3. Select **Refresh Permissions** from the dropdown. - - - Linked Accounts - Refresh Permissions - - -The button will show a spinner while the sync is in progress and display a confirmation once it completes. - - -# Overriding enforcement per connection - -Each [connection](/docs/connections/indexing-your-code) supports two flags that control permission enforcement for that connection's repositories: - -- **`enforcePermissions`**: Controls whether repository permissions are enforced for the connection. When `PERMISSION_SYNC_ENABLED` is false, this setting has no effect. Defaults to the value of `PERMISSION_SYNC_ENABLED`. -- **`enforcePermissionsForPublicRepos`**: Controls whether repository permissions are enforced for public repositories in the connection. When true, public repositories are only visible to users with a linked account for the connection's code host. When false, public repositories are visible to all users. Has no effect when `enforcePermissions` is false. Defaults to false. - - -These flags are useful when you want different enforcement behavior across connections. For example, you may want to enforce permissions on an internal GitHub Enterprise connection while leaving a public-facing Gerrit mirror open to all users. Or, you can use `enforcePermissionsForPublicRepos` to restrict public repositories on a Bitbucket connection so that only users who have authenticated with that host can browse them. - -```json -{ - "connections": { - "my-github": { - "type": "github", - "enforcePermissions": true - }, - "my-bitbucket": { - "type": "bitbucket", - "enforcePermissions": true, - "enforcePermissionsForPublicRepos": true - }, - "my-gerrit": { - "type": "gerrit", - "url": "https://gerrit.example.com", - "enforcePermissions": false - } - } -} -``` - -The table below shows when permissions are enforced based on the combination of `PERMISSION_SYNC_ENABLED`, `enforcePermissions`, and `enforcePermissionsForPublicRepos`: - -| `PERMISSION_SYNC_ENABLED` | `enforcePermissions` | `enforcePermissionsForPublicRepos` | Private repos enforced? | Public repos enforced? | -|--------------------------|---------------------|------------------------------------|------------------------|------------------------| -| `true` | `true` | `false` | Yes | No | -| `true` | `true` | `true` | Yes | Yes | -| `true` | `false` | any | No | No | -| `false` | any | any | No | No | - -# How it works - -Permission syncing works by periodically syncing ACLs from the code host(s) to Sourcebot to build an internal mapping between Users and Repositories. This mapping is hydrated in two directions: -- **User driven** : fetches the list of all repositories that a given user has access to. -- **Repo driven** : fetches the list of all users that have access to a given repository. - -User driven and repo driven syncing occurs every 24 hours by default. Repo-driven syncing can be disabled independently using the following environment variable: - -| Environment variable | Default | Description | -|---|---|---| -| `PERMISSION_SYNC_REPO_DRIVEN_ENABLED` | `true` | Enables/disables repo-driven syncing. | - -The sync intervals can be configured using the following settings in the [config file](/docs/configuration/config-file): - -| Setting | Type | Default | Minimum | -|-------------------------------------------------|---------|------------|---------| -| `repoDrivenPermissionSyncIntervalMs` | number | 24 hours | 1 | -| `userDrivenPermissionSyncIntervalMs` | number | 24 hours | 1 | - -# FAQ - -### What happens if there are transient errors with the code host? - -It depends on the type of error: - -- **Authentication errors** (such as `401`, `403`, `410`, or a token refresh failure): Sourcebot immediately revokes the affected user's access to repositories on that code host. -- **Rate limits or `5xx` responses**: Sourcebot keeps the user's existing access. - -### When is a visibility change of a repo (switching from public to private) reflected within Sourcebot? - -The visibility state of a repository is updated when the [connection](/docs/connections/overview#connection-syncing) belonging to that repository is synced, not when the repository's permissions are synced. Until the next connection sync runs, Sourcebot continues to apply the repository's previous public/private classification. The connection sync interval is configurable via the `resyncConnectionIntervalMs` setting in the [config file](/docs/configuration/config-file) and defaults to 24 hours. Lower this value if you require faster propagation of visibility changes. diff --git a/docs/docs/features/search/ai-search-assist.mdx b/docs/docs/features/search/ai-search-assist.mdx deleted file mode 100644 index 63ed88169..000000000 --- a/docs/docs/features/search/ai-search-assist.mdx +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: AI Search Assist ---- - -AI Search Assist lets you describe what you're looking for in natural language and automatically generates a search query for you. - - - - -## How it works - -1. Click the wand icon () in the search bar to open the AI Search Assist panel. -2. Describe what you're looking for in natural language. -3. Click **Generate** or press ↵ to generate the query. -4. The generated query is inserted into the search bar. - -## Requirements - -AI Search Assist requires a language model to be configured. See [Configure Language Models](/docs/configuration/language-model-providers) for setup instructions. diff --git a/docs/docs/features/search/code-search.mdx b/docs/docs/features/search/code-search.mdx deleted file mode 100644 index 9a1437dce..000000000 --- a/docs/docs/features/search/code-search.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Code Search ---- - -Search across all your repos/branches across any code host platform. Blazingly fast, and supports regular expressions, repo/language search filters, boolean logic, and more. - - -- **Regex support:** Use regular expressions to find code with precision. -- **Query language:** Scope searches to specific files, repos, languages, symbol definitions and more using a rich [query language](/docs/features/search/syntax-reference). -- **Branch search:** Specify a list of branches to search across ([docs](/docs/features/search/multi-branch-indexing)). -- **Fast & scalable:** Sourcebot uses [trigram indexing](https://en.wikipedia.org/wiki/Trigram_search), allowing it to scale to massive codebases. -- **Syntax highlighting:** Syntax highlighting support for over [100+ languages](https://github.com/sourcebot-dev/sourcebot/blob/57724689303f351c279d37f45b6406f1d5d5d5ab/packages/web/src/lib/codemirrorLanguage.ts#L125). -- **Multi-repository:** Search across all of your repositories in a single search. -- **Search suggestions:** Get search suggestions as you craft your query. -- **Filter panel:** Filter results by repository or by language. - - - - Learn how to self-host Sourcebot in a few simple steps. - - - - Learn how to index your repos so you can ask questions about them - - - Learn how to index and search through your branches - - - - \ No newline at end of file diff --git a/docs/docs/features/search/multi-branch-indexing.mdx b/docs/docs/features/search/multi-branch-indexing.mdx deleted file mode 100644 index 9857ed3c0..000000000 --- a/docs/docs/features/search/multi-branch-indexing.mdx +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Searching multiple branches and tags -sidebarTitle: Searching multiple branches ---- - -By default, only the default branch of a repository is indexed and can be searched. Sourcebot can be configured to index additional branches (or tags) enabling multi-branch search. This is useful for scenarios such as: - -- Searching across different releases -- Searching through feature branches during development -- Tracking changes across multiple maintenance branches simultaneously - -## Configuration - - -Multi-branch indexing is currently limited to 64 branches and tags. Please see [this issue](https://github.com/sourcebot-dev/sourcebot/issues/461) for more details. - - -Multi-branch indexing is configured in the [connection](/docs/connections/indexing-your-code) using the `revisions.branches` and `revisions.tags` arrays. Glob patterns are supported. For example: - -```json -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "connections": { - "my-connection": { - "type": "github", - // For each of the repositories defined in this connection... - "repos": [ - "org/repo1", - "org/repo2" - ], - // ... index the default branch, as well as... - "revisions": { - // These branches (if they exist): - "branches": [ - // Exact matches - "dev", - "staging", - - // Glob patterns - "feature/*" // Matches: feature/auth, feature/ui, etc. - ], - - // These tags (if they exist): - "tags": [ - // Exact matches - "v4.0.0-dev", - - // Glob patterns - "v3.*.*", // Matches: v3.0.0, v3.0.1, etc. - "rc-*" // Matches: rc-1, rc-2, etc. - ] - } - } - } -} -``` - -For each repo defined in the connection, any branches or tags matching the patterns in `branches` and `tags` array will be indexed. - -## Search syntax - -To search branches other than the default, the `rev:` prefix can be used followed by the branch (or tag) name: - -| Example | Explanation | -| :--- | :--- | -| `rev:feature/foo repo:A useEffect` | Search for `/useEffect/` on branch `feature/foo` in repo `A` | -| `rev:feature/foo useEffect ` | Search for `/useEffect/` on branch `feature/foo` across all repos | -| `rev:feature/ useEffect` | Search for `/useEffect/` on branches that contain `feature/` across all repos | -| `rev:feature/a rev:feature/b foo` | Search for `/foo/` on branches `feature/a` and `feature/b` | -| `rev:feature/ -rev:feature/a foo` | Search for `/foo/` on branches that contain `feature/` _except_ for `feature/a` across all repos | - -To search across **all** branches, `rev:*`: -| Example | Explanation | -| :--- | :--- | -| `rev:* repo:A "error message"` | Search for `/error message/` across **all** branches in repo `A` | -| `rev:* "error message"` | Search for `/error message/` across **all** branches and **all** repos | - -Additional info: -- `refs/heads/` or `refs/tags/` can be included to fully qualify a branch or a tag, respectively. E.g., `rev:refs/heads/foo` will search the branch `foo`, while `rev:refs/tags/foo` will search the tag `foo`. -- `rev:` does **not** support regular expressions or glob patterns. It uses a simple `contains` call between the branch name and the pattern. See [here](https://github.com/sourcebot-dev/zoekt/blob/7d1896215eea6f97af66c9549c9ec70436356b51/matchtree.go#L1067). - - -## Platform support - -| Platform | Multi-branch indexing support | -|:----------|------------------------------| -| GitHub | ✅ | -| GitLab | ✅ | -| Bitbucket Cloud | ✅ | -| Bitbucket Data Center | ✅ | -| Gitea | ✅ | -| Gerrit | ✅ | -| Generic git host | ✅ | - diff --git a/docs/docs/features/search/search-contexts.mdx b/docs/docs/features/search/search-contexts.mdx deleted file mode 100644 index 60aed4070..000000000 --- a/docs/docs/features/search/search-contexts.mdx +++ /dev/null @@ -1,149 +0,0 @@ ---- -title: Search contexts -sidebarTitle: Search contexts ---- - -import SearchContextSchema from '/snippets/schemas/v3/searchContext.schema.mdx' -import LicenseKeyRequired from '/snippets/license-key-required.mdx' - - - -A **search context** is a user-defined grouping of repositories that helps focus searches on specific areas of your codebase, like frontend, backend, or infrastructure code. Some example queries using search contexts: - -- `context:data_engineering userId` - search for `userId` across all repos related to Data Engineering. -- `context:k8s ingress` - search for anything related to ingresses in your k8's configs. -- `( context:project1 or context:project2 ) logger\.debug` - search for debug log calls in project1 and project2 - - -Search contexts are defined in the `context` object inside of a [declarative config](/docs/configuration/declarative-config). Repositories can be included / excluded from a search context by specifying the repo's URL in either the `include` array or `exclude` array. Glob patterns are supported. - -## Example - -Let's assume we have a GitLab instance hosted at `https://gitlab.example.com` with three top-level groups, `web`, `backend`, and `shared`: - -```sh -web/ -├─ admin_panel/ -├─ customer_portal/ -├─ pipelines/ -├─ ... -backend/ -├─ billing_server/ -├─ auth_server/ -├─ db_migrations/ -├─ pipelines/ -├─ ... -shared/ -├─ protobufs/ -├─ react/ -├─ pipelines/ -├─ ... -``` - -To make searching easier, we can create three search contexts in our [config.json](/docs/configuration/declarative-config): -- `web`: For all frontend-related code -- `backend`: For backend services and shared APIs -- `pipelines`: For all CI/CD configurations - - -```json -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "contexts": { - "web": { - // To include repositories in a search context, - // you can reference them... - "include": [ - // ... individually by specifying the repo URL. - "gitlab.example.com/web/admin_panel/core", - - - // ... or as groups using glob patterns. This is - // particularly useful for including entire "sub-folders" - // of repositories in one go. - "gitlab.example.com/web/customer_portal/**", - "gitlab.example.com/shared/react/**", - "gitlab.example.com/shared/protobufs/**" - ], - - // Same with excluding repositories. - "exclude": [ - "gitlab.example.com/web/customer_portal/pipelines", - "gitlab.example.com/shared/react/hooks/**", - ], - - // Optional description of the search context - // that surfaces in the UI. - "description": "Web related repos." - }, - "backend": { /* ... specifies backend replated repos ... */}, - "pipelines": { /* ... specifies pipeline related repos ... */ } - }, - "connections": { - /* ...connection definitions... */ - } -} -``` - - - Repo URLs are expected to be formatted without the leading http(s):// prefix. For example: - - `github.com/sourcebot-dev/sourcebot` ([link](https://github.com/sourcebot-dev/sourcebot)) - - `gitlab.com/gitlab-org/gitlab` ([link](https://gitlab.com/gitlab-org/gitlab)) - - `chromium.googlesource.com/chromium` ([link](https://chromium-review.googlesource.com/admin/repos/chromium,general)) - - - -Once configured, you can use these contexts in the search bar by prefixing your query with the context name. For example: -- `context:web login form` searches for login form code in frontend repositories -- `context:backend auth` searches for authentication code in backend services -- `context:pipelines deploy` searches for deployment configurations - -![Example](/images/search_contexts_example.png) - -Like other prefixes, contexts can be negated using `-` or combined using `or`: -- `-context:web` excludes frontend repositories from results -- `( context:web or context:backend )` searches across both frontend and backend code - -See [this doc](/docs/features/search/syntax-reference) for more details on the search query syntax. - -## Filtering by topic - -If your repositories are tagged with topics on [GitHub](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/classifying-your-repository-with-topics) or [GitLab](https://docs.gitlab.com/ee/user/project/topics.html), you can use `includeTopics` and `excludeTopics` to filter repositories by topic instead of (or in addition to) specifying individual repo URLs. Glob patterns are supported. - -```json -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "contexts": { - "backend": { - "includeTopics": ["backend", "core-*"], - "excludeTopics": ["deprecated", "archived-*"], - "description": "Active backend services." - } - }, - "connections": { - /* ...connection definitions... */ - } -} -``` - -`includeTopics` and `excludeTopics` follow the same additive semantics as `include` and `exclude`: - -- `includeTopics` adds all repos tagged with a matching topic to the context. -- `excludeTopics` removes repos tagged with a matching topic from the context. -- Both can be freely combined with `include`, `includeConnections`, `exclude`, and `excludeConnections`. - -Topic matching is case-insensitive, so `"Backend"` matches the pattern `"backend"`. - - -Topics are populated when a connection syncs. If you add topics to your repositories after the last sync, trigger a re-sync for the new topics to take effect. - - -## Schema reference - - - -[schemas/v3/searchContext.json](https://github.com/sourcebot-dev/sourcebot/blob/main/schemas/v3/searchContext.json) - - - - diff --git a/docs/docs/features/search/syntax-reference.mdx b/docs/docs/features/search/syntax-reference.mdx deleted file mode 100644 index f57600024..000000000 --- a/docs/docs/features/search/syntax-reference.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Writing search queries ---- - -Sourcebot uses a powerful regex-based query language that enabled precise code search within large codebases. - -## Syntax reference guide - -Queries consist of space-separated search patterns that are matched against file contents. A file must have at least one match for each expression to be included. Queries can optionally contain search filters to further refine the search results. - -## Keyword search (default) - -Keyword search matches search patterns exactly in file contents. Wrapping search patterns in `""` combines them as a single expression. - -| Example | Explanation | -| :--- | :--- | -| `foo` | Match files containing the keyword `foo` | -| `foo bar` | Match files containing both `foo` **and** `bar` | -| `"foo bar"` | Match files containing the phrase `foo bar` | -| `"foo \"bar\""` | Match files containing `foo "bar"` exactly (escaped quotes) | - -## Regex search - -Toggle the regex button (`.*`) in the search bar to interpret search patterns as regular expressions. - -| Example | Explanation | -| :--- | :--- | -| `foo` | Match files with regex `/foo/` | -| `foo.*bar` | Match files with regex `/foo.*bar/` (foo followed by any characters, then bar) | -| `^function\s+\w+` | Match files with regex `/^function\s+\w+/` (function at start of line, followed by whitespace and word characters) | -| `"foo bar"` | Match files with regex `/foo bar/`. Quotes are not matched. | - -## Search filters - -Search queries (keyword or regex) can include multiple search filters to further refine the search results. Some filters can be negated using the `-` prefix. - -| Prefix | Description | Example | -| :--- | :--- | :--- | -| `file:` | Filter results from filepaths that match the regex. By default all files are searched. | `file:README` - Filter results to filepaths that match regex `/README/`
`file:"my file"` - Filter results to filepaths that match regex `/my file/`
`-file:test\.ts$` - Ignore results from filepaths match regex `/test\.ts$/` | -| `repo:` | Filter results from repos that match the regex. By default all repos are searched. | `repo:linux` - Filter results to repos that match regex `/linux/`
`-repo:^web/.*` - Ignore results from repos that match regex `/^web\/.*/` | -| `rev:` | Filter results from a specific branch or tag. By default **only** the default branch is searched. | `rev:beta` - Filter results to branches that match regex `/beta/` | -| `lang:` | Filter results by language (as defined by [linguist](https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml)). By default all languages are searched. | `lang:TypeScript` - Filter results to TypeScript files
`-lang:YAML` - Ignore results from YAML files | -| `sym:` | Match symbol definitions created by [universal ctags](https://ctags.io/) at index time. | `sym:\bmain\b` - Filter results to symbols that match regex `/\bmain\b/` | -| `context:` | Filter results to a predefined [search context](/docs/features/search/search-contexts). | `context:web` - Filter results to the web context
`-context:pipelines` - Ignore results from the pipelines context | - -## Boolean operators & grouping - -By default, space-separated expressions are and'd together. Using the `or` keyword as well as parentheses `()` can be used to create more complex boolean logic. Parentheses can be negated using the `-` prefix. - -| Example | Explanation | -| :--- | :--- | -| `foo or bar` | Match files containing `foo` **or** `bar` | -| `foo (bar or baz)` | Match files containing `foo` **and** either `bar` **or** `baz`. | -| `-(foo) bar` | Match files containing `bar` **and not** `foo`. | diff --git a/docs/docs/free-trial.mdx b/docs/docs/free-trial.mdx deleted file mode 100644 index ddf54b6a6..000000000 --- a/docs/docs/free-trial.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Free Trial -sidebarTitle: Free trial ---- - -Sourcebot offers a **14-day free trial** of the paid plan with no credit card required. The trial is started from inside your Sourcebot deployment, so you need to deploy Sourcebot first. - - - If your organization requires a license before deploying any software, reach out through the enterprise contact form on our [pricing page](https://www.sourcebot.dev/pricing). - - -# Deploy Sourcebot for free - -Sourcebot has a **free plan** that doesn't require any registration. You can self-host Sourcebot in your own infrastructure in under a minute: - - - - The fastest way to get Sourcebot running locally or on a server. - - - Deploy Sourcebot to a Kubernetes cluster with Helm. - - - -# Start your trial - -Your Sourcebot deployment must be able to send a [Service Ping](/docs/misc/service-ping) to activate and maintain your trial. If your deployment is unable to send a service ping for 7 days it will downgrade to the free plan until a successful ping is sent. - -Once your deployment is running, sign in and follow the onboarding flow. You'll see a **Start 14-day free trial** option for Sourcebot Pro. Confirm your email on the checkout page and submit. No credit card is required. - -If you skip the trial during onboarding, you can start it later from **Settings → License**. - -Each Sourcebot deployment is eligible for one free trial. - -# After the trial ends - -- If you add a payment method during the trial, your subscription continues automatically when the 14 days are up. -- If you don't add a payment method, your deployment downgrades to the free plan. Your data is preserved and free features remain available. - -You can add a payment method anytime during the trial from **Settings → License**. For details on how the paid plan is activated and validated, see [Activating a Subscription](/docs/activating-a-subscription). diff --git a/docs/docs/misc/architecture.mdx b/docs/docs/misc/architecture.mdx deleted file mode 100644 index ad496f6ae..000000000 --- a/docs/docs/misc/architecture.mdx +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Architecture" ---- - -Sourcebot is shipped as a single docker container that runs a collection of services using [supervisord](https://supervisord.org/): - -![architecture diagram](/images/architecture_diagram.png) - -{/*TODO: outline the different services, how Sourcebot communicates with code hosts, and the different*/} - -Sourcebot consists of the following components: -- **Web Server** : main Next.js web application serving the Sourcebot UI. -- **Backend Worker** : Node.js process that incrementally syncs with code hosts (e.g., GitHub, GitLab etc.) and asynchronously indexes configured repositories. -- **Zoekt** : the [open-source](https://github.com/sourcegraph/zoekt), trigram indexing code search engine that powers Sourcebot under the hood. -- **Postgres** : transactional database for storing business-logic data. -- **Redis Job Queue** : fast in-memory store. Used with [BullMQ](https://docs.bullmq.io/) for queuing asynchronous work. -- **`.sourcebot/` cache** : file-system cache where persistent data is written. - -You can use managed Redis / Postgres services that run outside of the Sourcebot container by providing the `REDIS_URL` and `DATABASE_URL` environment variables, respectively. See the [environment variables](/docs/configuration/environment-variables) doc for more configuration options. diff --git a/docs/docs/misc/scalability.mdx b/docs/docs/misc/scalability.mdx deleted file mode 100644 index dcc001250..000000000 --- a/docs/docs/misc/scalability.mdx +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Scalability" ---- - -One of our design philosophies for Sourcebot is to keep our infrastructure [radically simple](https://www.radicalsimpli.city/) while balancing scalability concerns. Depending on the number of repositories you have indexed and the instance you are running Sourcebot on, you may experience slow search times or other performance degradations. Our recommendation is to vertically scale your instance by increasing the number of CPU cores and memory. See the [sizing guide](/docs/deployment/sizing-guide) for detailed recommendations. - -Sourcebot does not support horizontal scaling at this time, but it is on our roadmap. If this is something your team would be interested in, please contact us at [team@sourcebot.dev](mailto:team@sourcebot.dev). diff --git a/docs/docs/misc/service-ping.mdx b/docs/docs/misc/service-ping.mdx deleted file mode 100644 index 3b6142e5d..000000000 --- a/docs/docs/misc/service-ping.mdx +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: "Service Ping" -api: "GET https://deployments.sourcebot.dev/schema" ---- - - - No sensitive data (source code, AI inputs/outputs, credentials, user information, etc) is ever transmitted. - - -By default, all Sourcebot deployments will send a Service Ping, which is an HTTPS encrypted ping to `https://deployments.sourcebot.dev/ping` at port 443, every 24 hours. - -The data contained within the Service Ping is limited to: - -| Field | Type | Description | -| --- | --- | --- | -| `installId` | `string` | Random UUID generated for your deployment. | -| `hostname` | `string` | Hostname of your Sourcebot deployment. | -| `version` | `string` | Sourcebot version (e.g. `v5.3.0`). | -| `userCount` | `integer` | Total registered users. | -| `repoCount` | `integer` | Total indexed repositories. | -| `dauCount` | `integer` | Daily active users. | -| `wauCount` | `integer` | Weekly active users. | -| `mauCount` | `integer` | Monthly active users. | -| `deploymentType` | `string` | Deployment flavor (e.g. `docker`, `helm`). | -| `isTelemetryEnabled` | `boolean` | Whether anonymous product telemetry is enabled. | -| `isLanguageModelConfigured` | `boolean` | Whether at least one language model is configured. | -| `activationCode` | `string` | Activation code, if your instance has one bound. | -| `systemInfo` | `object` | Resource facts about the deployment (CPU, memory, disk). See below. | - -The `systemInfo` object contains a best-effort snapshot of the resources the deployment is running with. It is used to diagnose resource issues (e.g. insufficient RAM). Any field that cannot be read is reported as `null`. - -| Field | Type | Description | -| --- | --- | --- | -| `platform` | `string` | Operating system platform (e.g. `linux`). | -| `arch` | `string` | CPU architecture (e.g. `x64`, `arm64`). | -| `cpuQuota` | `number \| null` | Effective cgroup CPU limit in cores, or `null` if unlimited. | -| `memoryLimitMiB` | `number \| null` | cgroup memory limit in MiB, or `null` if unlimited. | -| `memoryUsedMiB` | `number \| null` | Current cgroup memory usage, in MiB. | -| `diskTotalMiB` | `number \| null` | Total disk space for the data volume, in MiB. | -| `diskFreeMiB` | `number \| null` | Free disk space for the data volume, in MiB. | - - -You can fetch the schema for the Service Ping by submitting a GET request to `https://deployments.sourcebot.dev/schema` - - -```json wrap icon="wifi" Example Service Ping -{ - "method": "POST", - "url": "http://localhost:3003/ping", - "path": "/ping", - "headers": { - "accept": "*/*", - "accept-encoding": "gzip, deflate", - "accept-language": "*", - "connection": "keep-alive", - "content-length": "253", - "content-type": "application/json", - "host": "localhost:3003", - "sec-fetch-mode": "cors", - "user-agent": "node" - }, - "query": {} -} -body: { - "installId": "524a8f59-90aa-480d-a571-92dd8bzzzzze", - "version": "v4.17.2", - "userCount": 1, - "repoCount": 3, - "dauCount": 1, - "wauCount": 1, - "mauCount": 1, - "deploymentType": "other", - "isTelemetryEnabled": true, - "isLanguageModelConfigured": true, - "systemInfo": { - "platform": "linux", - "arch": "x64", - "cpuQuota": 4, - "memoryLimitMiB": 8192, - "memoryUsedMiB": 3072, - "diskTotalMiB": 102400, - "diskFreeMiB": 54968 - }, - "activationCode": "sb_act_3a925f51...." -} -``` \ No newline at end of file diff --git a/docs/docs/misc/telemetry.mdx b/docs/docs/misc/telemetry.mdx deleted file mode 100644 index 4a77674dd..000000000 --- a/docs/docs/misc/telemetry.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "Telemetry" ---- - -By default, Sourcebot collects anonymized usage data through [PostHog](https://posthog.com/) to help us improve the performance and reliability of our tool. We don't collect or transmit any information related to your codebase. In addition, all events are [sanitized](https://github.com/sourcebot-dev/sourcebot/blob/HEAD/packages/web/src/app/posthogProvider.tsx) to ensure that no sensitive details (ex. ip address, query info) leave your machine. - -The data we collect includes general usage statistics and metadata such as query performance (e.g., search duration, error rates) to monitor the application's health and functionality. This information helps us better understand how Sourcebot is used and where improvements can be made. - -If you'd like to disable all telemetry, you can do so by setting the environment variable `SOURCEBOT_TELEMETRY_DISABLED` to `true`: - -```bash -docker run \ - -e SOURCEBOT_TELEMETRY_DISABLED=true \ - /* additional args */ \ - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest -``` - -If you disabled telemetry correctly, you'll see the following log when starting Sourcebot: - -```sh -Disabling telemetry since SOURCEBOT_TELEMETRY_DISABLED was set. -``` diff --git a/docs/docs/overview.mdx b/docs/docs/overview.mdx deleted file mode 100644 index 8a770823d..000000000 --- a/docs/docs/overview.mdx +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: "Overview" ---- - -Sourcebot is an [open source](https://github.com/sourcebot-dev/sourcebot) tool that helps humans and agents understand massive codebases. - - - - Search and navigate across all your repos and branches. - - - Ask questions across all your repos and branches. - - - Code context layer for all your agents. - - - -Sourcebot is self-hosted within your infrastructure, and connects to any [code-host platform](/docs/connections/indexing-your-code) or [LLM provider](/docs/configuration/language-model-providers). Sensitive data never leaves your infrastructure. - - - - Deploy Sourcebot in your own infrastructure. - - - Try Sourcebot for free on our hosted version. - - \ No newline at end of file diff --git a/docs/docs/seat-reconciliation.mdx b/docs/docs/seat-reconciliation.mdx deleted file mode 100644 index 7e4c6b860..000000000 --- a/docs/docs/seat-reconciliation.mdx +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Seat Reconciliation -sidebarTitle: Seat Reconciliation ---- - -When using an [Activation Code](/docs/activating-a-subscription#activation-code-online-licensing), your Sourcebot deployment is permitted to exceed the number of seats you've purchsed. Seat reconciliation refers -to how these excess seats are billed, and it depends on your billing period. - -Seat reconciliation doesn't apply if you're using a [License Key](/docs/activating-a-subscription#license-key-offline-licensing) since the key sets a hard cap on seats. If you're using a license key and would like more seats, please reach out to us to purchase a new license key. - -For a more detailed breakdown, please refer to our [Software License Agreeement](https://www.sourcebot.dev/terms) which is the source of truth on how seats are handled and billed. - -# Monthly Billing - -Sourcebot supports monthly with standard proration behavior. Users added during the month are prorated across the remaining days and appear on your next invoice. Users removed during the month take effect at the next cycle, and are not refunded for the current cycle. - -# Yearly Billing - -## Quarterly Reconciliation -The standard mechanism for seat reconciliation in yearly plans is through quarterly reconciliation. You are billed per quarter on a prorated basis for the remaining portion of your subscription term for any additional seats you activate. - -To prevent overages, you can restrict you may register on your Sourcebot deployment through our [access controls](/docs/configuration/auth/access-settings). - - - -### Example - -Suppose you start a yearly plan in January with 100 seats. - -- In Q1, your user count grows to 110. At the end of Q1, you're invoiced for 10 seats prorated across the 3 remaining quarters. -- In Q2, your user count stays at 110. No reconciliation invoice is generated. -- In Q3, your user count grows to 120. At the end of Q3, you're invoiced for 10 seats prorated across the 1 remaining quarter. -- In Q4, reconciliation does not generate a charge (there are no remaining quarters to prorate across). -- At renewal in January, you're invoiced at 120 seats for the next year. 120 becomes the new committed baseline. - -## Cancellation - -Cancelling a subscription takes effect at the end of the current billing cycle (monthly) or term (yearly). You retain access to Sourcebot Enterprise features until that point. - -## Questions? - -For billing questions, [contact us](mailto:support@sourcebot.dev). diff --git a/docs/docs/upgrade/v2-to-v3-guide.mdx b/docs/docs/upgrade/v2-to-v3-guide.mdx deleted file mode 100644 index 3d8828e9b..000000000 --- a/docs/docs/upgrade/v2-to-v3-guide.mdx +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: V2 to V3 Guide -sidebarTitle: V2 to V3 guide ---- - -This guide will walk you through upgrading your Sourcebot deployment from v2 to v3. - - -Please note that the following features are no longer supported in v3: -- Local file indexing -- Raw remote `.git` repo indexing (i.e. not through a supported code host) - -If your deployment is dependent on these features, please [reach out](https://github.com/sourcebot-dev/sourcebot/discussions). - - -This migration will require you to reindex all your repos - - - - - - - - The main change between the v3 and v2 schemas is how the data is structured. In v2, you defined a `repos` array which contained unnamed config objects: - - ```json - { - "$schema": "./schemas/v2/index.json", - "repos": [ - { - "type": "github", - "repos": [ - "sourcebot-dev/sourcebot" - ] - }, - { - "type": "gitlab": - "groups": [ - "wireshark" - ] - } - ] - } - ``` - - In v3, you define a `connections` map which contains named `connection` objects: - ```json - { - "$schema": "./schemas/v3/index.json", - "connections": { - "sourcebot-connection": { - "type": "github", - "repos": [ - "sourcebot-dev/sourcebot" - ] - }, - "wireshark-connection": { - "type": "gitlab": - "groups": [ - "wireshark - ] - } - } - } - ``` - - The schema of the connections defined here is the same as the "repos" you defined in the v2 schema. Some helpful notes: - - - The name of the connection (`sourcebot-connection` and `wireshark-connection` above) is only used to identify the connection in Sourcebot. It can be any string that contains letters, digits, hyphens, or underscores - - A connection is associated with one and only one code host platform, and this must be specified in the connections `type` field - - Make sure you update the `$schema` field to point to the v3 schema - - The `settings` object doesn't need to be changed. We've added new settings params (check out the v3 schema for more details) - - - When you start up your Sourcebot deployment, it will create a fresh cache and begin indexing against your new v3 configuration file. - - If there are issues with your configuration file it will provide an error in the console. - After updating your configuration file, restart your Sourcebot deployment to pick up the new changes. - - - Congrats, you've successfully migrated to v3! Please let us know what you think of the new features by reaching out on our [discord](https://discord.gg/HDScTs3ptP) or on [GitHub](https://github.com/sourcebot-dev/sourcebot/issues/new/choose). - - - -## Troubleshooting - -Some things to check: - -- Make sure you update the `$schema` field in the configuration file to point to the v3 schema -- Make sure you have a name for each `connection`, and that the name only contains letters, digits, hyphens, or underscores -- Make sure each `connection` has a `type` field with a valid value (`gitlab`, `github`, `gitea`, `gerrit`) - -Having troubles migrating from v2 to v3? Reach out to us on [discord](https://discord.gg/HDScTs3ptP) or [GitHub](https://github.com/sourcebot-dev/sourcebot/issues/new/choose) and we'll try our best to help \ No newline at end of file diff --git a/docs/docs/upgrade/v3-to-v4-guide.mdx b/docs/docs/upgrade/v3-to-v4-guide.mdx deleted file mode 100644 index 304306520..000000000 --- a/docs/docs/upgrade/v3-to-v4-guide.mdx +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: V3 to V4 Guide -sidebarTitle: V3 to V4 guide ---- - -This guide will walk you through upgrading your Sourcebot deployment from v3 to v4. - - -Please note that the following features are no longer supported in v4: -- Multi-tenancy mode -- Unauthenticated access to a Sourcebot deployment - authentication is now built in by default. Unauthenticated access to a organization can be enabled with an unlimited seat [enterprise license](/docs/activating-a-subscription) - - -### If your deployment doesn't have authentication enabled - - - - - If your Sourcebot instance is deployed behind a domain (ex. `https://sourcebot.yourcompany.com`) you **must** set the `AUTH_URL` environment variable to your deployment domain. - - - When you visit your new deployment you'll be presented with a sign-in page. Sourcebot now requires authentication, and all users must register and sign-in to the deployment. - - The first account that's registered will be made the owner. By default, you can register using basic credentials which will be stored encrypted within the postgres DB connected to Sourcebot. Check out - the [auth docs](/docs/configuration/auth/authentication) to setup additional auth providers. - - - - - Emails can be sent on organization join request/approval by configuring [transactional emails](/docs/configuration/transactional-emails) - - - - - After the first account is created, all new account registrations must be approved by the owner. When new users register onto the deployment they'll be presented with the following request approval page: - - ![Pending Approval Page](/images/pending_approval.png) - - The owner can view and approve join requests by navigating to **Settings -> Members**. Automatic provisioning of accounts is supported when using SSO/Oauth providers, check out the [auth docs](/docs/configuration/auth/providers#enterprise-authentication-providers) for more info - - - - Congrats, you've successfully migrated to v4! Please let us know what you think of the new features by reaching out on our [discord](https://discord.gg/HDScTs3ptP) or [GitHub](https://github.com/sourcebot-dev/sourcebot/issues/new/choose) - - - -### If your deployment has authentication enabled - -The only change that's required if your deployment has authentication enabled is to unset the `SOURCEBOT_AUTH_ENABLED` environment variable. New user registrations will now submit a request to join the organization which can be approved by the owner by -navigating to **Settings -> Members**. Emails can be sent on organization join request/approval by configuring [transactional emails](/docs/configuration/transactional-emails) - -### If your deployment uses multi-tenancy mode - -Unfortunately, multi-tenancy mode is no longer officially supported in v4. To upgrade to v4, you'll need to unset the `SOURCEBOT_TENANCY_MODE` environment variable and wipe your Sourcebot cache. You can then follow the [instructions above](/docs/upgrade/v3-to-v4-guide#if-your-deployment-doesnt-have-authentication-enabled) -to finish upgrading to v4 in single-tenant mode. - -## Troubleshooting -- If you're hitting issues with signing into your Sourcebot instance, make sure you're setting `AUTH_URL` correctly to your deployment domain (ex. `https://sourcebot.yourcompany.com`) - - -Having troubles migrating from v3 to v4? Reach out to us on [discord](https://discord.gg/HDScTs3ptP) or [GitHub](https://github.com/sourcebot-dev/sourcebot/issues/new/choose) and we'll try our best to help \ No newline at end of file diff --git a/docs/docs/upgrade/v4-to-v5-guide.mdx b/docs/docs/upgrade/v4-to-v5-guide.mdx deleted file mode 100644 index 1a2acd350..000000000 --- a/docs/docs/upgrade/v4-to-v5-guide.mdx +++ /dev/null @@ -1,287 +0,0 @@ ---- -title: V4 to V5 Guide -sidebarTitle: V4 to V5 guide ---- - -This guide will walk you through upgrading your Sourcebot deployment from v4 to [v5](https://www.sourcebot.dev/changelog/v5). - -## Breaking Changes - -### Ask Sourcebot & MCP Server relicensing - -**Who's affected:** Users on the [free plan](/docs/activating-a-subscription). - - -#### Description -Starting in v5, the following features have been relicensed from FSL to our [commercial license](https://github.com/sourcebot-dev/sourcebot/blob/main/ee/LICENSE), requiring a paid plan to use: -- [Ask Sourcebot](/docs/features/ask/ask-sourcebot) -- [MCP server](/docs/features/mcp-server) -- [User role management](/docs/configuration/auth/roles-and-permissions#managing-member-roles) ([details](#user-role-management-relicensing)) - -If your deployment uses these features and you upgrade to v5, you'll need to activate a paid plan to keep using them. - -#### Action Items - -You can [start a 14-day free trial](/docs/free-trial) of the paid plan directly from your deployment. No credit card is required. See the [pricing page](https://sourcebot.dev/pricing) for more details. - -Alternatively, you can choose to [stay on v4](#staying-on-v4). - - -### User role management relicensing - -**Who's affected:** Users on the [free plan](/docs/activating-a-subscription). - - -#### Description - -[Managing user roles](/docs/configuration/auth/roles-and-permissions) now requires a paid plan. On the free plan, the default role assigned to new members joining an organization is now **Owner** (previously this was **Member**). - -The role assignment behaviour for users joining the organization, and the ability to [manage the user's role](/docs/configuration/auth/roles-and-permissions#managing-member-roles) afterwards, is now the following: - -| Plan | Default role | Role management | -| :--- | :----------- | :-------------- | -| **Free** | `Owner` | Not available. A user's role cannot be changed. | -| **Paid** | `Member` | Available. Owners can [promote or demote](#managing-member-roles) members. | - -This **does not** affect existing users in the organization. Users with the **Member** role will continue to have this role. This change only affects **new members** added to the organization. - -#### Action Items - -You can [start a 14-day free trial](/docs/free-trial) of the paid plan directly from your deployment. No credit card is required. See the [pricing page](https://sourcebot.dev/pricing) for more details. - -Alternatively, you can choose to [stay on v4](#staying-on-v4). - -### External Postgres and Redis instances are now required - -**Who's affected:** Deployments that relied on the embedded Postgres and Redis packaged in the Docker container. [Docker Compose](/docs/deployment/docker-compose) and [Helm chart](https://github.com/sourcebot-dev/sourcebot-helm-chart) deployments are not affected, since both already provide their own Postgres and Redis. - - -#### Description - -In v4 and earlier, the Sourcebot image shipped with a built-in Postgres database and Redis instance that started automatically when `DATABASE_URL` and `REDIS_URL` were not set. Starting in v5, these embedded services have been removed. You must now provide your own Postgres and Redis instances and point Sourcebot at them using the `DATABASE_URL` and `REDIS_URL` environment variables. If either variable is missing, the container exits at startup with an error. - -You need to stand up your own Postgres and Redis instances and set both variables. The simplest path is to switch to the [Docker Compose](/docs/deployment/docker-compose) or [Helm chart](https://github.com/sourcebot-dev/sourcebot-helm-chart) deployment, both of which wire these up for you. - -#### Action Items - - -
- -The embedded Postgres stored its data under `$DATA_CACHE_DIR/db` inside the container volume. This data is **not** migrated automatically. You need to dump it and restore it into your external Postgres instance. - - -Do the dump **before** upgrading to v5. The v5 image no longer bundles `pg_dump`, so you must run it while your v4 container (which still has the embedded Postgres) is running. - - -1. With your **v4** deployment still running, dump the embedded `sourcebot` database from inside the container and copy it out. Replace `sourcebot` with your container name if it differs: - -```bash wrap icon="terminal" -docker exec -t sourcebot pg_dump -U postgres -d sourcebot -Fc -f /tmp/sourcebot.dump -docker cp sourcebot:/tmp/sourcebot.dump ./sourcebot.dump -``` - -2. Set up an external Postgres instance for Sourcebot to use. This can be a managed Postgres service, a standalone Postgres container, the `postgres` service from the official [docker-compose.yml](https://github.com/sourcebot-dev/sourcebot/blob/main/docker-compose.yml), or the one provided by the [Helm chart](https://github.com/sourcebot-dev/sourcebot-helm-chart). Make sure it's reachable from where Sourcebot runs. - -3. **(Optional)** When using a database other than `postgres`, you need to create it: - - -```bash wrap icon="terminal" -createdb -U postgres my-database -``` - - - -The following steps assume the database name `postgres`. Adjust the `DATABASE_URL` and `-d` pg_restore parameter when using a different database name. - - -4. Restore the dump into the database: - -```bash wrap icon="terminal" -pg_restore -U postgres -d postgres --no-owner ./sourcebot.dump -``` - -5. Set `DATABASE_URL` to point at the external database and start Sourcebot on v5. Sourcebot runs any outstanding schema migrations automatically at startup. - -```bash wrap icon="terminal" -docker run \ - -e DATABASE_URL='postgresql://your-user:your-password@your-postgres-host:5432/postgres' \ - # ... your other flags - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest -``` -
- - -
- -Redis only holds transient job-queue data, so there is nothing to migrate. You just need to provide an external Redis instance and point Sourcebot at it. - -1. Set up an external Redis instance for Sourcebot to use. This can be a managed Redis service, a standalone Redis container, the `redis` service from the official [docker-compose.yml](https://github.com/sourcebot-dev/sourcebot/blob/main/docker-compose.yml), or the one provided by the [Helm chart](https://github.com/sourcebot-dev/sourcebot-helm-chart). Make sure it's reachable from where Sourcebot runs. - -2. Set `REDIS_URL` to point at it when you start Sourcebot on v5: - -```bash wrap icon="terminal" -docker run \ - -e REDIS_URL='redis://your-redis-host:6379' \ - # ... your other flags - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest -``` -
- -### AUTH_SECRET and SOURCEBOT_ENCRYPTION_KEY must be set explicitly - -**Who's affected:** Deployments that relied on Sourcebot auto-generating these secrets (i.e. those that never set `AUTH_SECRET` or `SOURCEBOT_ENCRYPTION_KEY`). [Docker Compose](/docs/deployment/docker-compose) and [Helm chart](https://github.com/sourcebot-dev/sourcebot-helm-chart) deployments that already set both are not affected. - - -#### Description - -In v4 and earlier, when `AUTH_SECRET` or `SOURCEBOT_ENCRYPTION_KEY` was not set, Sourcebot generated one at startup and persisted it in plain text under `$DATA_CACHE_DIR` (`.authjs-secret` and `.secret`). Starting in v5, these secrets must be provided explicitly as environment variables. Sourcebot no longer generates them, and no longer reads the plaintext files. If either is missing, the container exits at startup with an error. - - -Set `SOURCEBOT_ENCRYPTION_KEY` to the **same** value your deployment was using. It encrypts sensitive data at rest, so a different key leaves that data undecryptable and breaks the features that depend on it. A changed `AUTH_SECRET` is less severe: it only signs out existing sessions. - - -#### Action Items - - - -
- -Recover the existing values from the data volume, set them as environment variables, then delete the plaintext files. `$DATA_CACHE_DIR` defaults to `/data/.sourcebot`. - -1. With your **v4** deployment still running, print the stored values. Replace `sourcebot` with your container name if it differs: - -```bash wrap icon="terminal" -docker exec sourcebot cat /data/.sourcebot/.secret -docker exec sourcebot cat /data/.sourcebot/.authjs-secret -``` - -Each file contains a single line, e.g. `SOURCEBOT_ENCRYPTION_KEY="..."`. Copy the value between the quotes. - -2. Set both as environment variables on your v5 deployment: - -```bash wrap icon="terminal" -docker run \ - -e SOURCEBOT_ENCRYPTION_KEY='' \ - -e AUTH_SECRET='' \ - # ... your other flags - docker.sourcebot.dev/sourcebot-dev/sourcebot:latest -``` - -3. Delete the plaintext files from the data volume so the secrets are no longer stored on disk: - -```bash wrap icon="terminal" -docker exec sourcebot rm /data/.sourcebot/.secret /data/.sourcebot/.authjs-secret -``` - -Sourcebot warns at startup if either file is still present. -
- -### Identity providers must be configured via the config file - -**Who's affected:** Deployments that configure GitHub, GitLab, Google, Okta, Keycloak, or Microsoft Entra ID single sign-on through the deprecated `AUTH_EE_*` environment variables. Deployments that already define these providers in the [`identityProviders`](/docs/configuration/idp) config file section are not affected. - - -#### Description - -In v4, you could configure these identity providers using `AUTH_EE_*` environment variables (for example `AUTH_EE_GITHUB_CLIENT_ID`). Those variables were deprecated in favor of the [`identityProviders`](/docs/configuration/idp) section of the config file. Starting in v5.0.2, the environment variable path has been removed. Sourcebot no longer reads these variables, and any provider configured only through them will stop appearing on the login screen. This also applies if you are upgrading from an earlier v5 release (v5.0.0 or v5.0.1), where these variables were still supported. - -The following environment variables are no longer read: - -| Provider | Removed environment variables | -| :------- | :---------------------------- | -| GitHub | `AUTH_EE_GITHUB_CLIENT_ID`, `AUTH_EE_GITHUB_CLIENT_SECRET`, `AUTH_EE_GITHUB_BASE_URL` | -| GitLab | `AUTH_EE_GITLAB_CLIENT_ID`, `AUTH_EE_GITLAB_CLIENT_SECRET`, `AUTH_EE_GITLAB_BASE_URL` | -| Google | `AUTH_EE_GOOGLE_CLIENT_ID`, `AUTH_EE_GOOGLE_CLIENT_SECRET` | -| Okta | `AUTH_EE_OKTA_CLIENT_ID`, `AUTH_EE_OKTA_CLIENT_SECRET`, `AUTH_EE_OKTA_ISSUER` | -| Keycloak | `AUTH_EE_KEYCLOAK_CLIENT_ID`, `AUTH_EE_KEYCLOAK_CLIENT_SECRET`, `AUTH_EE_KEYCLOAK_ISSUER` | -| Microsoft Entra ID | `AUTH_EE_MICROSOFT_ENTRA_ID_CLIENT_ID`, `AUTH_EE_MICROSOFT_ENTRA_ID_CLIENT_SECRET`, `AUTH_EE_MICROSOFT_ENTRA_ID_ISSUER` | - -#### Action Items - - -
- -Move each affected provider into the `identityProviders` array in your [config file](/docs/configuration/config-file). You don't need to rotate any secrets. Reference your existing environment variable values from the config using [tokens](/docs/configuration/config-file#tokens), keeping the same variable names if you like. - -For example, a GitHub provider previously configured with environment variables: - -```bash wrap icon="terminal" -AUTH_EE_GITHUB_CLIENT_ID='your-client-id' -AUTH_EE_GITHUB_CLIENT_SECRET='your-client-secret' -``` - -becomes the following in the config file: - -```json wrap icon="code" -{ - "$schema": "https://raw.githubusercontent.com/sourcebot-dev/sourcebot/main/schemas/v3/index.json", - "identityProviders": [ - { - "provider": "github", - "purpose": "sso", - "clientId": { - "env": "AUTH_EE_GITHUB_CLIENT_ID" - }, - "clientSecret": { - "env": "AUTH_EE_GITHUB_CLIENT_SECRET" - } - } - ] -} -``` - - -Set `purpose` to `sso` to keep the provider usable for login. For providers that take an issuer (Okta, Keycloak, Microsoft Entra ID), add an `issuer` token. For self-hosted GitHub or GitLab, add a `baseUrl` string (this replaces `AUTH_EE_GITHUB_BASE_URL` and `AUTH_EE_GITLAB_BASE_URL`). - - -See the [external identity providers](/docs/configuration/idp) docs for the full per-provider config reference. -
- - -## Upgrading - - -Before upgrading, review the [Breaking Changes](#breaking-changes) section and complete any actions that apply to your deployment. - - -### Docker Compose - -1. Pull the latest image - -```bash wrap icon="terminal" -docker compose pull -``` - -2. Restart your deployment - -```bash wrap icon="terminal" -docker compose up -d -``` - -### Helm chart - -1. Refresh the chart repository - -```bash wrap icon="terminal" -helm repo update -``` - -2. Upgrade the release - -```bash wrap icon="terminal" -helm upgrade sourcebot sourcebot/sourcebot \ - -f values.yaml \ - --set-json "sourcebot.config=$(cat config.json)" -``` - -## Staying on v4 - -If you'd rather not upgrade to v5, you can keep using v4 indefinitely by pinning your deployment to the final v4 release: - -```bash -docker.sourcebot.dev/sourcebot-dev/sourcebot:v4.17.4 -``` - -## Troubleshooting - -Having troubles migrating from v4 to v5? Reach out to us on [GitHub](https://github.com/sourcebot-dev/sourcebot/issues/new/choose) and we'll try our best to help. diff --git a/docs/fav.svg b/docs/fav.svg deleted file mode 100644 index aead6f5cd..000000000 --- a/docs/fav.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/docs/images/ado.svg b/docs/images/ado.svg deleted file mode 100644 index e5668e9b7..000000000 --- a/docs/images/ado.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/images/analytics_demo.mp4 b/docs/images/analytics_demo.mp4 deleted file mode 100644 index 4038cdaa3..000000000 Binary files a/docs/images/analytics_demo.mp4 and /dev/null differ diff --git a/docs/images/anonymous_access_toggle.png b/docs/images/anonymous_access_toggle.png deleted file mode 100644 index bc86be974..000000000 Binary files a/docs/images/anonymous_access_toggle.png and /dev/null differ diff --git a/docs/images/api_key.png b/docs/images/api_key.png deleted file mode 100644 index 64e94e6e5..000000000 Binary files a/docs/images/api_key.png and /dev/null differ diff --git a/docs/images/architecture_diagram.png b/docs/images/architecture_diagram.png deleted file mode 100644 index a115568cc..000000000 Binary files a/docs/images/architecture_diagram.png and /dev/null differ diff --git a/docs/images/ask_sourcebot_low_res.mp4 b/docs/images/ask_sourcebot_low_res.mp4 deleted file mode 100644 index 254955680..000000000 Binary files a/docs/images/ask_sourcebot_low_res.mp4 and /dev/null differ diff --git a/docs/images/bitbucket.png b/docs/images/bitbucket.png deleted file mode 100644 index 259e5d1ed..000000000 Binary files a/docs/images/bitbucket.png and /dev/null differ diff --git a/docs/images/bitbucket_app_password_perms.png b/docs/images/bitbucket_app_password_perms.png deleted file mode 100644 index 1fc619550..000000000 Binary files a/docs/images/bitbucket_app_password_perms.png and /dev/null differ diff --git a/docs/images/bitbucket_rate_limit.png b/docs/images/bitbucket_rate_limit.png deleted file mode 100644 index 4c819af3e..000000000 Binary files a/docs/images/bitbucket_rate_limit.png and /dev/null differ diff --git a/docs/images/chat-invite-users.png b/docs/images/chat-invite-users.png deleted file mode 100644 index 4da95596c..000000000 Binary files a/docs/images/chat-invite-users.png and /dev/null differ diff --git a/docs/images/chat-remove-user.png b/docs/images/chat-remove-user.png deleted file mode 100644 index cc115aab8..000000000 Binary files a/docs/images/chat-remove-user.png and /dev/null differ diff --git a/docs/images/chat-sharing-dialog.png b/docs/images/chat-sharing-dialog.png deleted file mode 100644 index 626c808cc..000000000 Binary files a/docs/images/chat-sharing-dialog.png and /dev/null differ diff --git a/docs/images/chat-visibility-dropdown.png b/docs/images/chat-visibility-dropdown.png deleted file mode 100644 index 187007316..000000000 Binary files a/docs/images/chat-visibility-dropdown.png and /dev/null differ diff --git a/docs/images/code_nav.mp4 b/docs/images/code_nav.mp4 deleted file mode 100644 index 754b79ff6..000000000 Binary files a/docs/images/code_nav.mp4 and /dev/null differ diff --git a/docs/images/connect_code_host.png b/docs/images/connect_code_host.png deleted file mode 100644 index 388d3f1d6..000000000 Binary files a/docs/images/connect_code_host.png and /dev/null differ diff --git a/docs/images/connection_create_secret.png b/docs/images/connection_create_secret.png deleted file mode 100644 index 1035fe760..000000000 Binary files a/docs/images/connection_create_secret.png and /dev/null differ diff --git a/docs/images/connection_nav.png b/docs/images/connection_nav.png deleted file mode 100644 index 4e3f7eefc..000000000 Binary files a/docs/images/connection_nav.png and /dev/null differ diff --git a/docs/images/connection_page.png b/docs/images/connection_page.png deleted file mode 100644 index 9dca5cc4b..000000000 Binary files a/docs/images/connection_page.png and /dev/null differ diff --git a/docs/images/connectors_account_page.png b/docs/images/connectors_account_page.png deleted file mode 100644 index df06cab0d..000000000 Binary files a/docs/images/connectors_account_page.png and /dev/null differ diff --git a/docs/images/connectors_edit_scopes.png b/docs/images/connectors_edit_scopes.png deleted file mode 100644 index 7b2837892..000000000 Binary files a/docs/images/connectors_edit_scopes.png and /dev/null differ diff --git a/docs/images/connectors_edit_tool_permissions.png b/docs/images/connectors_edit_tool_permissions.png deleted file mode 100644 index f04b80629..000000000 Binary files a/docs/images/connectors_edit_tool_permissions.png and /dev/null differ diff --git a/docs/images/connectors_oauth_scopes.png b/docs/images/connectors_oauth_scopes.png deleted file mode 100644 index 1fa337aa8..000000000 Binary files a/docs/images/connectors_oauth_scopes.png and /dev/null differ diff --git a/docs/images/connectors_permission_request.png b/docs/images/connectors_permission_request.png deleted file mode 100644 index b63081f60..000000000 Binary files a/docs/images/connectors_permission_request.png and /dev/null differ diff --git a/docs/images/connectors_static_registration.png b/docs/images/connectors_static_registration.png deleted file mode 100644 index 6b4bd12d4..000000000 Binary files a/docs/images/connectors_static_registration.png and /dev/null differ diff --git a/docs/images/connectors_toggle_off.png b/docs/images/connectors_toggle_off.png deleted file mode 100644 index a41b86030..000000000 Binary files a/docs/images/connectors_toggle_off.png and /dev/null differ diff --git a/docs/images/connectors_tool_permissions.png b/docs/images/connectors_tool_permissions.png deleted file mode 100644 index e8b70456a..000000000 Binary files a/docs/images/connectors_tool_permissions.png and /dev/null differ diff --git a/docs/images/cost_savings_chart.png b/docs/images/cost_savings_chart.png deleted file mode 100644 index 42238a4b7..000000000 Binary files a/docs/images/cost_savings_chart.png and /dev/null differ diff --git a/docs/images/create_connection_example.png b/docs/images/create_connection_example.png deleted file mode 100644 index 73515ca30..000000000 Binary files a/docs/images/create_connection_example.png and /dev/null differ diff --git a/docs/images/demote_to_member.png b/docs/images/demote_to_member.png deleted file mode 100644 index 775e79546..000000000 Binary files a/docs/images/demote_to_member.png and /dev/null differ diff --git a/docs/images/email_code_login_setting.png b/docs/images/email_code_login_setting.png deleted file mode 100644 index 870e6f40e..000000000 Binary files a/docs/images/email_code_login_setting.png and /dev/null differ diff --git a/docs/images/email_password_login_setting.png b/docs/images/email_password_login_setting.png deleted file mode 100644 index def59a00e..000000000 Binary files a/docs/images/email_password_login_setting.png and /dev/null differ diff --git a/docs/images/gerrit.png b/docs/images/gerrit.png deleted file mode 100644 index 7e27d8400..000000000 Binary files a/docs/images/gerrit.png and /dev/null differ diff --git a/docs/images/git.png b/docs/images/git.png deleted file mode 100644 index f4e98b228..000000000 Binary files a/docs/images/git.png and /dev/null differ diff --git a/docs/images/gitea.png b/docs/images/gitea.png deleted file mode 100644 index 77e228cbb..000000000 Binary files a/docs/images/gitea.png and /dev/null differ diff --git a/docs/images/gitea_pat_creation.png b/docs/images/gitea_pat_creation.png deleted file mode 100644 index 00d6ab949..000000000 Binary files a/docs/images/gitea_pat_creation.png and /dev/null differ diff --git a/docs/images/github.png b/docs/images/github.png deleted file mode 100644 index 21e5d9536..000000000 Binary files a/docs/images/github.png and /dev/null differ diff --git a/docs/images/github_app_callback_url.png b/docs/images/github_app_callback_url.png deleted file mode 100644 index f378198ea..000000000 Binary files a/docs/images/github_app_callback_url.png and /dev/null differ diff --git a/docs/images/github_app_perm_contents.png b/docs/images/github_app_perm_contents.png deleted file mode 100644 index 079b7e8b8..000000000 Binary files a/docs/images/github_app_perm_contents.png and /dev/null differ diff --git a/docs/images/github_app_perm_email.png b/docs/images/github_app_perm_email.png deleted file mode 100644 index 8c28ae8c9..000000000 Binary files a/docs/images/github_app_perm_email.png and /dev/null differ diff --git a/docs/images/github_app_perm_metadata.png b/docs/images/github_app_perm_metadata.png deleted file mode 100644 index 6f5f25c3d..000000000 Binary files a/docs/images/github_app_perm_metadata.png and /dev/null differ diff --git a/docs/images/github_app_private_key.png b/docs/images/github_app_private_key.png deleted file mode 100644 index 819fae231..000000000 Binary files a/docs/images/github_app_private_key.png and /dev/null differ diff --git a/docs/images/github_app_request_user_auth.png b/docs/images/github_app_request_user_auth.png deleted file mode 100644 index 7debad221..000000000 Binary files a/docs/images/github_app_request_user_auth.png and /dev/null differ diff --git a/docs/images/github_connection.png b/docs/images/github_connection.png deleted file mode 100644 index 12e073573..000000000 Binary files a/docs/images/github_connection.png and /dev/null differ diff --git a/docs/images/github_pat_scopes.png b/docs/images/github_pat_scopes.png deleted file mode 100644 index 3645c260e..000000000 Binary files a/docs/images/github_pat_scopes.png and /dev/null differ diff --git a/docs/images/github_pat_scopes_fine_grained.png b/docs/images/github_pat_scopes_fine_grained.png deleted file mode 100644 index 66342a728..000000000 Binary files a/docs/images/github_pat_scopes_fine_grained.png and /dev/null differ diff --git a/docs/images/gitlab.png b/docs/images/gitlab.png deleted file mode 100644 index 5bf7e3cb9..000000000 Binary files a/docs/images/gitlab.png and /dev/null differ diff --git a/docs/images/gitlab_connection.png b/docs/images/gitlab_connection.png deleted file mode 100644 index c0eeaaa33..000000000 Binary files a/docs/images/gitlab_connection.png and /dev/null differ diff --git a/docs/images/gitlab_pat_scopes.png b/docs/images/gitlab_pat_scopes.png deleted file mode 100644 index 71a616544..000000000 Binary files a/docs/images/gitlab_pat_scopes.png and /dev/null differ diff --git a/docs/images/invite_link_toggle.png b/docs/images/invite_link_toggle.png deleted file mode 100644 index 78391408a..000000000 Binary files a/docs/images/invite_link_toggle.png and /dev/null differ diff --git a/docs/images/join_request_email.png b/docs/images/join_request_email.png deleted file mode 100644 index 3c076c5d8..000000000 Binary files a/docs/images/join_request_email.png and /dev/null differ diff --git a/docs/images/linked_accounts_refresh_permissions.png b/docs/images/linked_accounts_refresh_permissions.png deleted file mode 100644 index 7d8a0ddef..000000000 Binary files a/docs/images/linked_accounts_refresh_permissions.png and /dev/null differ diff --git a/docs/images/local.png b/docs/images/local.png deleted file mode 100644 index 2c04c81a4..000000000 Binary files a/docs/images/local.png and /dev/null differ diff --git a/docs/images/login.png b/docs/images/login.png deleted file mode 100644 index 93ac56d0c..000000000 Binary files a/docs/images/login.png and /dev/null differ diff --git a/docs/images/login_basic.png b/docs/images/login_basic.png deleted file mode 100644 index 0aff946bb..000000000 Binary files a/docs/images/login_basic.png and /dev/null differ diff --git a/docs/images/login_redeem_code.png b/docs/images/login_redeem_code.png deleted file mode 100644 index c88b195ca..000000000 Binary files a/docs/images/login_redeem_code.png and /dev/null differ diff --git a/docs/images/managing_owners.png b/docs/images/managing_owners.png deleted file mode 100644 index c3afa0124..000000000 Binary files a/docs/images/managing_owners.png and /dev/null differ diff --git a/docs/images/mcp_api_key_settings.png b/docs/images/mcp_api_key_settings.png deleted file mode 100644 index 522243512..000000000 Binary files a/docs/images/mcp_api_key_settings.png and /dev/null differ diff --git a/docs/images/mcp_oauth_authorize.png b/docs/images/mcp_oauth_authorize.png deleted file mode 100644 index 6d07a3591..000000000 Binary files a/docs/images/mcp_oauth_authorize.png and /dev/null differ diff --git a/docs/images/member_approval_toggle.png b/docs/images/member_approval_toggle.png deleted file mode 100644 index 1de0666a5..000000000 Binary files a/docs/images/member_approval_toggle.png and /dev/null differ diff --git a/docs/images/okta_scim_to_app_provisioning.png b/docs/images/okta_scim_to_app_provisioning.png deleted file mode 100644 index 5b5d0f73f..000000000 Binary files a/docs/images/okta_scim_to_app_provisioning.png and /dev/null differ diff --git a/docs/images/onboard_complete.png b/docs/images/onboard_complete.png deleted file mode 100644 index 2356258e6..000000000 Binary files a/docs/images/onboard_complete.png and /dev/null differ diff --git a/docs/images/onboard_invite.png b/docs/images/onboard_invite.png deleted file mode 100644 index 32be0aaac..000000000 Binary files a/docs/images/onboard_invite.png and /dev/null differ diff --git a/docs/images/org_create.png b/docs/images/org_create.png deleted file mode 100644 index 2e55d069b..000000000 Binary files a/docs/images/org_create.png and /dev/null differ diff --git a/docs/images/org_switch.png b/docs/images/org_switch.png deleted file mode 100644 index ea863d2ae..000000000 Binary files a/docs/images/org_switch.png and /dev/null differ diff --git a/docs/images/owner_leave_org.png b/docs/images/owner_leave_org.png deleted file mode 100644 index 581a0eb2a..000000000 Binary files a/docs/images/owner_leave_org.png and /dev/null differ diff --git a/docs/images/pending_approval.png b/docs/images/pending_approval.png deleted file mode 100644 index b242a570e..000000000 Binary files a/docs/images/pending_approval.png and /dev/null differ diff --git a/docs/images/promote_to_owner.png b/docs/images/promote_to_owner.png deleted file mode 100644 index a1c9b85de..000000000 Binary files a/docs/images/promote_to_owner.png and /dev/null differ diff --git a/docs/images/review_agent_configured.png b/docs/images/review_agent_configured.png deleted file mode 100644 index 6e8245661..000000000 Binary files a/docs/images/review_agent_configured.png and /dev/null differ diff --git a/docs/images/review_agent_example.png b/docs/images/review_agent_example.png deleted file mode 100644 index d933a199e..000000000 Binary files a/docs/images/review_agent_example.png and /dev/null differ diff --git a/docs/images/sb_interface.png b/docs/images/sb_interface.png deleted file mode 100644 index c61692492..000000000 Binary files a/docs/images/sb_interface.png and /dev/null differ diff --git a/docs/images/scim_provisioning_settings.png b/docs/images/scim_provisioning_settings.png deleted file mode 100644 index b656812d5..000000000 Binary files a/docs/images/scim_provisioning_settings.png and /dev/null differ diff --git a/docs/images/search-assist.mp4 b/docs/images/search-assist.mp4 deleted file mode 100644 index ea371460e..000000000 Binary files a/docs/images/search-assist.mp4 and /dev/null differ diff --git a/docs/images/search_contexts_example.png b/docs/images/search_contexts_example.png deleted file mode 100644 index f63eae827..000000000 Binary files a/docs/images/search_contexts_example.png and /dev/null differ diff --git a/docs/images/secret_dropdown.png b/docs/images/secret_dropdown.png deleted file mode 100644 index 0a9a92c59..000000000 Binary files a/docs/images/secret_dropdown.png and /dev/null differ diff --git a/docs/images/secrets_list.png b/docs/images/secrets_list.png deleted file mode 100644 index e272688d4..000000000 Binary files a/docs/images/secrets_list.png and /dev/null differ diff --git a/docs/images/secrets_page.png b/docs/images/secrets_page.png deleted file mode 100644 index 78541f76e..000000000 Binary files a/docs/images/secrets_page.png and /dev/null differ diff --git a/docs/images/settings_nav.png b/docs/images/settings_nav.png deleted file mode 100644 index eb568dafe..000000000 Binary files a/docs/images/settings_nav.png and /dev/null differ diff --git a/docs/images/setup_sourcebot_splash.png b/docs/images/setup_sourcebot_splash.png deleted file mode 100644 index fadd9cc5b..000000000 Binary files a/docs/images/setup_sourcebot_splash.png and /dev/null differ diff --git a/docs/images/skills_create.png b/docs/images/skills_create.png deleted file mode 100644 index b1ebe7765..000000000 Binary files a/docs/images/skills_create.png and /dev/null differ diff --git a/docs/images/skills_editor.png b/docs/images/skills_editor.png deleted file mode 100644 index c04776579..000000000 Binary files a/docs/images/skills_editor.png and /dev/null differ diff --git a/docs/images/skills_page.png b/docs/images/skills_page.png deleted file mode 100644 index 5b875dfad..000000000 Binary files a/docs/images/skills_page.png and /dev/null differ diff --git a/docs/images/skills_slash_command.png b/docs/images/skills_slash_command.png deleted file mode 100644 index d8a4cfe0d..000000000 Binary files a/docs/images/skills_slash_command.png and /dev/null differ diff --git a/docs/images/skills_synced_from_repo.png b/docs/images/skills_synced_from_repo.png deleted file mode 100644 index 23e71a412..000000000 Binary files a/docs/images/skills_synced_from_repo.png and /dev/null differ diff --git a/docs/images/skills_workspace_manager.png b/docs/images/skills_workspace_manager.png deleted file mode 100644 index 2d3017450..000000000 Binary files a/docs/images/skills_workspace_manager.png and /dev/null differ diff --git a/docs/logo/dark.png b/docs/logo/dark.png deleted file mode 100644 index 42441895e..000000000 Binary files a/docs/logo/dark.png and /dev/null differ diff --git a/docs/logo/dark.svg b/docs/logo/dark.svg deleted file mode 100644 index 8b343cd6f..000000000 --- a/docs/logo/dark.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/logo/light.png b/docs/logo/light.png deleted file mode 100644 index fc727de14..000000000 Binary files a/docs/logo/light.png and /dev/null differ diff --git a/docs/logo/light.svg b/docs/logo/light.svg deleted file mode 100644 index 03e62bf1d..000000000 --- a/docs/logo/light.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/reo.js b/docs/reo.js deleted file mode 100644 index 848a64ecc..000000000 --- a/docs/reo.js +++ /dev/null @@ -1,3 +0,0 @@ -// Reo.dev analytics. Mintlify automatically includes any .js file in the docs -// content directory as a global issues\nquickly', - annotations: { - readOnlyHint: true, - destructiveHint: false, - idempotentHint: true, - unknownHint: true, - }, - inputSchema: { type: 'object' }, - }, - ], - }), - close: vi.fn().mockResolvedValue(undefined), - }; - getConnectedMcpClients.mockResolvedValue([connectedClient]); - createMCPClient.mockResolvedValue(mcpClient); - - const result = await getMcpToolMetadata({} as PrismaClient, 'user-1', 1); - - expect(result).toEqual([ - { - status: 'available', - serverId: 'server-1', - tools: [ - { - name: 'lookup', - title: 'Lookup', - description: 'Find alert(1) issues quickly', - permission: McpServerToolPermission.ALLOWED, - annotations: { - readOnlyHint: true, - destructiveHint: false, - idempotentHint: true, - }, - }, - ], - }, - ]); - expect(mcpClient.close).toHaveBeenCalledTimes(1); - expect(connectedClient.transport.close).toHaveBeenCalledTimes(1); - expect(mcpServerToolCreateMany).toHaveBeenCalledWith({ - data: [ - { - mcpServerId: 'server-1', - toolName: 'lookup', - permission: McpServerToolPermission.ALLOWED, - }, - ], - skipDuplicates: true, - }); - }); - - test('truncates very large tool lists', async () => { - const connectedClient = makeConnectedClient(); - const tools = Array.from({ length: 201 }, (_, index) => ({ - name: `tool-${index}`, - description: 'x'.repeat(600), - inputSchema: { type: 'object' }, - })); - const mcpClient = { - listTools: vi.fn().mockResolvedValue({ tools }), - close: vi.fn().mockResolvedValue(undefined), - }; - getConnectedMcpClients.mockResolvedValue([connectedClient]); - createMCPClient.mockResolvedValue(mcpClient); - - const result = await getMcpToolMetadata({} as PrismaClient, 'user-1', 1); - const entry = result[0]; - - expect(entry.status).toBe('available'); - if (entry.status === 'available') { - expect(entry.tools).toHaveLength(200); - expect(entry.truncated).toBe(true); - expect(entry.tools[0].description).toHaveLength(500); - } - }); - - test('does not mark the list truncated when only text fields are shortened', async () => { - const connectedClient = makeConnectedClient(); - const mcpClient = { - listTools: vi.fn().mockResolvedValue({ - tools: [ - { - name: 'tool', - description: 'x'.repeat(600), - inputSchema: { type: 'object' }, - }, - ], - }), - close: vi.fn().mockResolvedValue(undefined), - }; - getConnectedMcpClients.mockResolvedValue([connectedClient]); - createMCPClient.mockResolvedValue(mcpClient); - - const result = await getMcpToolMetadata({} as PrismaClient, 'user-1', 1); - const entry = result[0]; - - expect(entry.status).toBe('available'); - if (entry.status === 'available') { - expect(entry.truncated).toBeUndefined(); - expect(entry.tools[0].description).toHaveLength(500); - } - }); - - test('maps safe auth failures without throwing the whole response', async () => { - const connectedClient = makeConnectedClient(); - getConnectedMcpClients.mockResolvedValue([connectedClient]); - createMCPClient.mockRejectedValue(Object.assign(new Error('unauthorized'), { statusCode: 401 })); - - const result = await getMcpToolMetadata({} as PrismaClient, 'user-1', 1); - - expect(result).toEqual([ - { - status: 'error', - serverId: 'server-1', - reason: 'auth_failed', - }, - ]); - expect(connectedClient.transport.close).toHaveBeenCalledTimes(1); - expect(loggerWarn).toHaveBeenCalled(); - }); - - test('filters disabled tools from member-visible metadata', async () => { - const connectedClient = makeConnectedClient(); - const mcpClient = { - listTools: vi.fn().mockResolvedValue({ - tools: [ - { - name: 'list_issues', - description: 'List issues', - inputSchema: { type: 'object' }, - }, - { - name: 'delete_issue', - description: 'Delete issue', - inputSchema: { type: 'object' }, - }, - ], - }), - close: vi.fn().mockResolvedValue(undefined), - }; - getConnectedMcpClients.mockResolvedValue([connectedClient]); - createMCPClient.mockResolvedValue(mcpClient); - mcpServerToolFindMany.mockResolvedValue([ - { - mcpServerId: 'server-1', - toolName: 'delete_issue', - permission: McpServerToolPermission.DISABLED, - }, - ]); - - const result = await getMcpToolMetadata({} as PrismaClient, 'user-1', 1); - - expect(result).toEqual([ - { - status: 'available', - serverId: 'server-1', - tools: [ - { - name: 'list_issues', - description: 'List issues', - permission: McpServerToolPermission.NEEDS_APPROVAL, - }, - ], - }, - ]); - }); -}); diff --git a/packages/web/src/ee/features/chat/mcp/mcpToolMetadata.ts b/packages/web/src/ee/features/chat/mcp/mcpToolMetadata.ts deleted file mode 100644 index d6a81db81..000000000 --- a/packages/web/src/ee/features/chat/mcp/mcpToolMetadata.ts +++ /dev/null @@ -1,364 +0,0 @@ -import { createMCPClient, type MCPClient } from '@ai-sdk/mcp'; -import { createLogger, env } from '@sourcebot/shared'; -import type { PrismaClient } from '@sourcebot/db'; -import { getConnectedMcpClients, type McpToolSet } from './mcpClientFactory'; -import { getExternalMcpErrorLogFields } from './externalMcpError'; -import { - createMissingMcpServerToolRows, - getMcpServerToolPermission, - getMcpServerToolPermissionsByServerId, -} from './mcpToolPermissions'; -import { McpServerToolPermission } from '@sourcebot/db'; -import type { - GetMcpToolsResponse, - ServerToolsEntry, - ToolMetadataErrorReason, - ToolSummary, -} from './types'; - -const logger = createLogger('mcp-tool-metadata'); - -const MCP_TOOL_METADATA_FETCH_CONCURRENCY = 4; -const MCP_TOOL_METADATA_TIMEOUT_MS = Math.min(env.SOURCEBOT_MCP_TOOL_CALL_TIMEOUT_MS, 10000); -const MCP_TOOL_METADATA_MAX_TOOLS = 200; -const MCP_TOOL_METADATA_MAX_NAME_LENGTH = 128; -const MCP_TOOL_METADATA_MAX_TITLE_LENGTH = 160; -const MCP_TOOL_METADATA_MAX_DESCRIPTION_LENGTH = 500; - -class ToolMetadataTimeoutError extends Error { - constructor() { - super(`MCP tool metadata fetch timed out after ${MCP_TOOL_METADATA_TIMEOUT_MS}ms`); - this.name = 'ToolMetadataTimeoutError'; - } -} - -type ListToolsResult = Awaited>; -type ToolDefinition = ListToolsResult['tools'][number]; - -function removeControlCharacters(value: string): string { - return value.replace(/[\u0000-\u001F\u007F-\u009F]/g, ' '); -} - -function removeHtmlTags(value: string): string { - // Strip repeatedly until stable: a single pass can reintroduce a tag - // sequence (e.g. "ipt>" collapses to "', - 'vbscript:MsgBox("xss")', - ])('blocks full URL string: %s', (url) => { - expect(UNPERMITTED_SCHEMES.test(url)).toBe(true); - }); - - // Permitted schemes that must not be blocked - test.each([ - 'http:', - 'https:', - 'vscode:', - 'cursor:', - 'claude:', - 'vscode://callback', - 'cursor://callback?code=abc', - 'http://localhost:8080/callback', - 'https://example.com/callback', - ])('permits %s', (url) => { - expect(UNPERMITTED_SCHEMES.test(url)).toBe(false); - }); -}); - -describe('isPermittedRedirectUrl', () => { - // --- Permitted URLs --- - - test('permits https URLs', () => { - expect(isPermittedRedirectUrl('https://example.com/callback')).toBe(true); - }); - - test('permits http URLs', () => { - expect(isPermittedRedirectUrl('http://localhost:8080/callback')).toBe(true); - }); - - test('permits /oauth/complete relative paths', () => { - expect(isPermittedRedirectUrl('/oauth/complete?url=vscode%3A%2F%2Fcallback')).toBe(true); - }); - - test('permits /oauth/complete with encoded custom scheme', () => { - expect(isPermittedRedirectUrl('/oauth/complete?url=cursor%3A%2F%2Fcallback%3Fcode%3Dabc')).toBe(true); - }); - - test('permits https URL with query params and fragment', () => { - expect(isPermittedRedirectUrl('https://example.com/callback?code=abc&state=xyz#fragment')).toBe(true); - }); - - // --- Blocked URLs --- - - test('blocks javascript: URLs', () => { - expect(isPermittedRedirectUrl('javascript:alert(1)')).toBe(false); - }); - - test('blocks data: URLs', () => { - expect(isPermittedRedirectUrl('data:text/html,')).toBe(false); - }); - - test('blocks vbscript: URLs', () => { - expect(isPermittedRedirectUrl('vbscript:MsgBox("xss")')).toBe(false); - }); - - test('blocks javascript: with mixed case', () => { - expect(isPermittedRedirectUrl('JavaScript:alert(1)')).toBe(false); - }); - - test('blocks custom scheme URLs not wrapped in /oauth/complete', () => { - expect(isPermittedRedirectUrl('vscode://callback?code=abc')).toBe(false); - }); - - test('blocks malformed URLs', () => { - expect(isPermittedRedirectUrl('not a url at all')).toBe(false); - }); - - test('blocks empty string', () => { - expect(isPermittedRedirectUrl('')).toBe(false); - }); - - test('blocks relative paths that do not start with /oauth/complete', () => { - expect(isPermittedRedirectUrl('/some/other/path')).toBe(false); - }); -}); diff --git a/packages/web/src/ee/features/oauth/utils.ts b/packages/web/src/ee/features/oauth/utils.ts deleted file mode 100644 index a152e94ef..000000000 --- a/packages/web/src/ee/features/oauth/utils.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { - SOURCEBOT_OAUTH_SCOPES, -} from './constants'; - -const OAUTH_SCOPE_TOKEN_REGEX = /^[\x21\x23-\x5B\x5D-\x7E]+$/; - -export function getOAuthAuthorizeUrl(params: Record): string { - const searchParams = new URLSearchParams(); - for (const [key, value] of Object.entries(params)) { - if (value === undefined) { - continue; - } - for (const entry of Array.isArray(value) ? value : [value]) { - searchParams.append(key, entry); - } - } - return `/oauth/authorize?${searchParams.toString()}`; -} - -export function parseOAuthScopeString(scope: string | null | undefined): string[] { - if (!scope) { - return []; - } - - return [...new Set(scope.split(/\s+/).map((token) => token.trim()).filter(Boolean))]; -} - -export function formatOAuthScopeString(scopes: readonly string[]): string { - return scopes.join(' '); -} - -export function hasRequiredOAuthScopes(tokenScopes: readonly string[], requiredScopes: readonly string[]): boolean { - const tokenScopeSet = new Set(tokenScopes); - return requiredScopes.every((scope) => tokenScopeSet.has(scope)); -} - -export function resolveGrantedOAuthScopes(requestedScope: string | null | undefined): { scopes: string[] } | { error: 'invalid_scope'; errorDescription: string } { - const requestedScopes = parseOAuthScopeString(requestedScope); - - for (const scope of requestedScopes) { - if (!OAUTH_SCOPE_TOKEN_REGEX.test(scope)) { - return { - error: 'invalid_scope', - errorDescription: `Invalid OAuth scope token: ${scope}.`, - }; - } - } - - const supportedScopeSet = new Set([...SOURCEBOT_OAUTH_SCOPES]); - for (const scope of requestedScopes) { - if (!supportedScopeSet.has(scope)) { - return { - error: 'invalid_scope', - errorDescription: `Unsupported OAuth scope: ${scope}.`, - }; - } - } - - return { - scopes: requestedScopes, - }; -} - -/** - * Returns true if the URL is permitted for use as a redirect target. - * Allows relative paths starting with /oauth/complete and http(s) URLs. - * Returns false for dangerous schemes like javascript:, data:, vbscript:. - */ -export function isPermittedRedirectUrl(url: string): boolean { - if (url.startsWith('/oauth/complete')) { - return true; - } - - try { - const parsed = new URL(url); - return parsed.protocol === 'http:' || parsed.protocol === 'https:'; - } catch { - return false; - } -} diff --git a/packages/web/src/ee/features/permissionSync/accountPermissionSyncQueue.server.test.ts b/packages/web/src/ee/features/permissionSync/accountPermissionSyncQueue.server.test.ts deleted file mode 100644 index 593b5d3b2..000000000 --- a/packages/web/src/ee/features/permissionSync/accountPermissionSyncQueue.server.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - enqueue: vi.fn(), - getConfigSettings: vi.fn(), - removeJobScheduler: vi.fn(), - upsertJobScheduler: vi.fn(), -})); - -const accountPermissionSyncQueue = { - name: 'account-permission-sync', -}; - -vi.mock('server-only', () => ({})); -vi.mock('@/lib/bullmqClient', () => ({ - getBullMQClient: () => ({ - enqueue: mocks.enqueue, - removeJobScheduler: mocks.removeJobScheduler, - upsertJobScheduler: mocks.upsertJobScheduler, - }), -})); -vi.mock('@sourcebot/shared', () => ({ - ACCOUNT_PERMISSION_SYNC_QUEUE: accountPermissionSyncQueue, - env: { CONFIG_PATH: '/config.json' }, - getAccountPermissionSyncSchedulerId: (accountId: string) => - `account-permission-sync-v1-${accountId}`, - getConfigSettings: mocks.getConfigSettings, - JOB_PRIORITIES: { - INTERACTIVE: 1, - SCHEDULED: 10, - }, -})); - -const { - removeAccountPermissionSyncScheduler, - scheduleAndTriggerAccountPermissionSync, -} = await import('./accountPermissionSyncQueue.server'); - -beforeEach(() => { - vi.clearAllMocks(); - mocks.getConfigSettings.mockResolvedValue({ - userDrivenPermissionSyncIntervalMs: 86_400_000, - }); - mocks.upsertJobScheduler.mockResolvedValue('scheduled-job'); - mocks.enqueue.mockResolvedValue('job-1'); - mocks.removeJobScheduler.mockResolvedValue(true); -}); - -describe('scheduleAndTriggerAccountPermissionSync', () => { - test('upserts the account scheduler before enqueueing an immediate sync', async () => { - await expect( - scheduleAndTriggerAccountPermissionSync('account-1'), - ).resolves.toEqual({ jobId: 'job-1' }); - - expect(mocks.getConfigSettings).toHaveBeenCalledWith('/config.json'); - expect(mocks.upsertJobScheduler).toHaveBeenCalledWith( - accountPermissionSyncQueue, - 'account-permission-sync-v1-account-1', - 86_400_000, - { accountId: 'account-1' }, - { priority: 10 }, - ); - expect(mocks.enqueue).toHaveBeenCalledWith( - accountPermissionSyncQueue, - { accountId: 'account-1' }, - { priority: 1 }, - ); - expect( - mocks.upsertJobScheduler.mock.invocationCallOrder[0], - ).toBeLessThan(mocks.enqueue.mock.invocationCallOrder[0]); - }); -}); - -describe('removeAccountPermissionSyncScheduler', () => { - test('removes the scheduler using the account scheduler ID', async () => { - await expect( - removeAccountPermissionSyncScheduler('account-1'), - ).resolves.toBe(true); - - expect(mocks.removeJobScheduler).toHaveBeenCalledWith( - accountPermissionSyncQueue, - 'account-permission-sync-v1-account-1', - ); - }); -}); diff --git a/packages/web/src/ee/features/permissionSync/accountPermissionSyncQueue.server.ts b/packages/web/src/ee/features/permissionSync/accountPermissionSyncQueue.server.ts deleted file mode 100644 index 94054fffe..000000000 --- a/packages/web/src/ee/features/permissionSync/accountPermissionSyncQueue.server.ts +++ /dev/null @@ -1,41 +0,0 @@ -import 'server-only'; - -import { getBullMQClient } from '@/lib/bullmqClient'; -import { - ACCOUNT_PERMISSION_SYNC_QUEUE, - env, - getAccountPermissionSyncSchedulerId, - getConfigSettings, - JOB_PRIORITIES, -} from '@sourcebot/shared'; - -export const scheduleAndTriggerAccountPermissionSync = async ( - accountId: string, -): Promise<{ jobId: string }> => { - const settings = await getConfigSettings(env.CONFIG_PATH); - const client = getBullMQClient(); - const data = { accountId }; - - await client.upsertJobScheduler( - ACCOUNT_PERMISSION_SYNC_QUEUE, - getAccountPermissionSyncSchedulerId(accountId), - settings.userDrivenPermissionSyncIntervalMs, - data, - { priority: JOB_PRIORITIES.SCHEDULED }, - ); - const jobId = await client.enqueue( - ACCOUNT_PERMISSION_SYNC_QUEUE, - data, - { priority: JOB_PRIORITIES.INTERACTIVE }, - ); - - return { jobId }; -}; - -export const removeAccountPermissionSyncScheduler = ( - accountId: string, -): Promise => - getBullMQClient().removeJobScheduler( - ACCOUNT_PERMISSION_SYNC_QUEUE, - getAccountPermissionSyncSchedulerId(accountId), - ); diff --git a/packages/web/src/ee/features/scim/actions.ts b/packages/web/src/ee/features/scim/actions.ts deleted file mode 100644 index 6b5595f99..000000000 --- a/packages/web/src/ee/features/scim/actions.ts +++ /dev/null @@ -1,143 +0,0 @@ -'use server'; - -import { createAudit } from "@/ee/features/audit/audit"; -import { ErrorCode } from "@/lib/errorCodes"; -import { hasEntitlement } from "@/lib/entitlements"; -import { ServiceError } from "@/lib/serviceError"; -import { sew } from "@/middleware/sew"; -import { withAuth } from "@/middleware/withAuth"; -import { withMinimumOrgRole } from "@/middleware/withMinimumOrgRole"; -import { OrgRole } from "@sourcebot/db"; -import { generateScimToken as generateScimTokenSecret } from "@sourcebot/shared"; -import { StatusCodes } from "http-status-codes"; - -const scimNotAvailable = (): ServiceError => ({ - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS, - message: "SCIM provisioning is not available in your current plan", -}); - -/** - * Enables or disables SCIM provisioning for the org. Disabling is a kill switch: - * existing tokens stop authenticating and JIT suppression lifts, but tokens are - * preserved so provisioning can be resumed by toggling back on. - */ -export const setScimEnabled = async (enabled: boolean): Promise<{ success: boolean } | ServiceError> => sew(() => - withAuth(async ({ org, user, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - if (!await hasEntitlement('scim')) { - return scimNotAvailable(); - } - - await prisma.org.update({ - where: { id: org.id }, - data: { isScimEnabled: enabled }, - }); - - await createAudit({ - action: enabled ? "scim.enabled" : "scim.disabled", - actor: { id: user.id, type: "user" }, - target: { id: org.id.toString(), type: "org" }, - orgId: org.id, - }); - - return { success: true }; - }))); - -export const generateScimToken = async (name: string): Promise<{ token: string } | ServiceError> => sew(() => - withAuth(async ({ org, user, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - if (!await hasEntitlement('scim')) { - return scimNotAvailable(); - } - - const existing = await prisma.scimToken.findFirst({ - where: { - orgId: org.id, - name, - }, - }); - - if (existing) { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.API_KEY_ALREADY_EXISTS, - message: `A SCIM token named "${name}" already exists`, - } satisfies ServiceError; - } - - const { token, hash } = generateScimTokenSecret(); - const scimToken = await prisma.scimToken.create({ - data: { - name, - hash, - orgId: org.id, - }, - }); - - await createAudit({ - action: "scim_token.created", - actor: { id: user.id, type: "user" }, - target: { id: scimToken.hash, type: "scim_token" }, - orgId: org.id, - metadata: { scim_token: name }, - }); - - return { token }; - }))); - -export const revokeScimToken = async (name: string): Promise<{ success: boolean } | ServiceError> => sew(() => - withAuth(async ({ org, user, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - if (!await hasEntitlement('scim')) { - return scimNotAvailable(); - } - - const scimToken = await prisma.scimToken.findFirst({ - where: { - orgId: org.id, - name, - }, - }); - - if (!scimToken) { - return { - statusCode: StatusCodes.NOT_FOUND, - errorCode: ErrorCode.API_KEY_NOT_FOUND, - message: `SCIM token "${name}" not found`, - } satisfies ServiceError; - } - - await prisma.scimToken.delete({ - where: { hash: scimToken.hash }, - }); - - await createAudit({ - action: "scim_token.deleted", - actor: { id: user.id, type: "user" }, - target: { id: scimToken.hash, type: "scim_token" }, - orgId: org.id, - metadata: { scim_token: name }, - }); - - return { success: true }; - }))); - -export const getScimTokens = async (): Promise<{ name: string; createdAt: Date; lastUsedAt: Date | null }[] | ServiceError> => sew(() => - withAuth(async ({ org, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - if (!await hasEntitlement('scim')) { - return scimNotAvailable(); - } - - const tokens = await prisma.scimToken.findMany({ - where: { orgId: org.id }, - orderBy: { createdAt: 'desc' }, - }); - - return tokens.map((token) => ({ - name: token.name, - createdAt: token.createdAt, - lastUsedAt: token.lastUsedAt, - })); - }))); diff --git a/packages/web/src/ee/features/scim/constants.ts b/packages/web/src/ee/features/scim/constants.ts deleted file mode 100644 index dae10ec9a..000000000 --- a/packages/web/src/ee/features/scim/constants.ts +++ /dev/null @@ -1,14 +0,0 @@ -// SCIM 2.0 schema URNs (RFC 7643 / 7644). -export const SCIM_USER_SCHEMA = "urn:ietf:params:scim:schemas:core:2.0:User"; -export const SCIM_LIST_RESPONSE_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:ListResponse"; -export const SCIM_PATCH_OP_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:PatchOp"; -export const SCIM_ERROR_SCHEMA = "urn:ietf:params:scim:api:messages:2.0:Error"; -export const SCIM_SERVICE_PROVIDER_CONFIG_SCHEMA = "urn:ietf:params:scim:schemas:core:2.0:ServiceProviderConfig"; -export const SCIM_RESOURCE_TYPE_SCHEMA = "urn:ietf:params:scim:schemas:core:2.0:ResourceType"; -export const SCIM_SCHEMA_SCHEMA = "urn:ietf:params:scim:schemas:core:2.0:Schema"; - -export const SCIM_CONTENT_TYPE = "application/scim+json"; - -// Default and max page sizes for list responses. -export const SCIM_DEFAULT_COUNT = 100; -export const SCIM_MAX_COUNT = 200; diff --git a/packages/web/src/ee/features/scim/mapper.ts b/packages/web/src/ee/features/scim/mapper.ts deleted file mode 100644 index 0db3db5a0..000000000 --- a/packages/web/src/ee/features/scim/mapper.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Prisma } from "@sourcebot/db"; -import { env } from "@sourcebot/shared"; -import { - SCIM_CONTENT_TYPE, - SCIM_ERROR_SCHEMA, - SCIM_LIST_RESPONSE_SCHEMA, - SCIM_USER_SCHEMA, -} from "./constants"; - -// A membership row with its linked user, as returned by the SCIM endpoints. -export type ScimMembership = Prisma.UserToOrgGetPayload<{ include: { user: true } }>; - -const scimUserLocation = (userId: string): string => - `${env.AUTH_URL.replace(/\/$/, '')}/scim/v2/Users/${userId}`; - -/** - * Maps a Sourcebot membership + user into a SCIM 2.0 User resource. The SCIM - * `id` is the stable `User.id`; `userName` and the primary email are the - * user's email; `active` reflects whether the membership is unsuspended. - */ -export const toScimUser = (membership: ScimMembership) => { - const { user } = membership; - const [givenName, ...rest] = (user.name ?? "").split(" "); - const familyName = rest.join(" "); - - return { - schemas: [SCIM_USER_SCHEMA], - id: user.id, - ...(membership.scimExternalId ? { externalId: membership.scimExternalId } : {}), - userName: user.email ?? undefined, - name: user.name ? { - formatted: user.name, - givenName: givenName || undefined, - familyName: familyName || undefined, - } : undefined, - emails: user.email ? [{ value: user.email, primary: true }] : [], - active: membership.suspendedAt == null, - meta: { - resourceType: "User", - created: membership.joinedAt.toISOString(), - lastModified: membership.joinedAt.toISOString(), - location: scimUserLocation(user.id), - }, - }; -}; - -/** Wraps a list of SCIM resources in a SCIM ListResponse envelope. */ -export const toScimListResponse = ( - resources: unknown[], - totalResults: number, - startIndex: number, -) => ({ - schemas: [SCIM_LIST_RESPONSE_SCHEMA], - totalResults, - startIndex, - itemsPerPage: resources.length, - Resources: resources, -}); - -/** Builds a `Response` with the SCIM content type. */ -export const scimJson = (body: unknown, status: number, headers?: Record): Response => - new Response(JSON.stringify(body), { - status, - headers: { - "Content-Type": SCIM_CONTENT_TYPE, - ...headers, - }, - }); - -/** - * Builds a SCIM error `Response`. Per RFC 7644 the `status` in the body is a - * string and must match the HTTP status. - */ -export const scimError = (status: number, detail: string, scimType?: string): Response => - scimJson({ - schemas: [SCIM_ERROR_SCHEMA], - status: status.toString(), - ...(scimType ? { scimType } : {}), - detail, - }, status); diff --git a/packages/web/src/ee/features/scim/schemas.test.ts b/packages/web/src/ee/features/scim/schemas.test.ts deleted file mode 100644 index aa36271ac..000000000 --- a/packages/web/src/ee/features/scim/schemas.test.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { describe, expect, test } from 'vitest'; -import { parseScimPatchOperations, scimPatchOpSchema } from './schemas'; - -// Builds a typed Operations array via the schema, mirroring what the route -// passes into parseScimPatchOperations after validation. -const ops = (operations: unknown[]): ReturnType['Operations'] => - scimPatchOpSchema.parse({ Operations: operations }).Operations; - -describe('parseScimPatchOperations', () => { - test('extracts active from a path-based replace (boolean)', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', path: 'active', value: false }, - ]))).toEqual({ active: false }); - }); - - test('coerces a stringified active value', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', path: 'active', value: 'false' }, - ]))).toEqual({ active: false }); - }); - - test('extracts active from the no-path bulk form', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', value: { active: false } }, - ]))).toEqual({ active: false }); - }); - - test('extracts a name change from displayName', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', path: 'displayName', value: 'Jane Doe' }, - ]))).toEqual({ name: 'Jane Doe' }); - }); - - test('extracts a name change from name.formatted', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', path: 'name.formatted', value: 'Jane Doe' }, - ]))).toEqual({ name: 'Jane Doe' }); - }); - - test('extracts an email change from userName (lowercased)', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', path: 'userName', value: 'Jane.New@Corp.COM' }, - ]))).toEqual({ email: 'jane.new@corp.com' }); - }); - - test('extracts an email change from a filtered emails path', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', path: 'emails[type eq "work"].value', value: 'jane@corp.com' }, - ]))).toEqual({ email: 'jane@corp.com' }); - }); - - test('matches op and path case-insensitively', () => { - expect(parseScimPatchOperations(ops([ - { op: 'REPLACE', path: 'Active', value: true }, - ]))).toEqual({ active: true }); - }); - - test('honors `add` operations as well as `replace`', () => { - expect(parseScimPatchOperations(ops([ - { op: 'add', path: 'displayName', value: 'New Name' }, - ]))).toEqual({ name: 'New Name' }); - }); - - test('ignores unrecognized operations (e.g. remove)', () => { - expect(parseScimPatchOperations(ops([ - { op: 'remove', path: 'name.givenName' }, - ]))).toEqual({}); - }); - - test('ignores unrecognized paths', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', path: 'title', value: 'Engineer' }, - ]))).toEqual({}); - }); - - test('combines name, email, and active across multiple operations', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', path: 'name.formatted', value: 'Jane Doe' }, - { op: 'replace', path: 'userName', value: 'jane@corp.com' }, - { op: 'replace', path: 'active', value: false }, - ]))).toEqual({ name: 'Jane Doe', email: 'jane@corp.com', active: false }); - }); - - test('handles a no-path bulk object with multiple attributes', () => { - expect(parseScimPatchOperations(ops([ - { - op: 'replace', - value: { - active: true, - userName: 'jane@corp.com', - name: { formatted: 'Jane Doe' }, - }, - }, - ]))).toEqual({ name: 'Jane Doe', email: 'jane@corp.com', active: true }); - }); - - test('prefers the primary email from a bulk emails array', () => { - expect(parseScimPatchOperations(ops([ - { - op: 'replace', - value: { - emails: [ - { value: 'secondary@corp.com', primary: false }, - { value: 'primary@corp.com', primary: true }, - ], - }, - }, - ]))).toEqual({ email: 'primary@corp.com' }); - }); - - test('later operations override earlier ones', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', path: 'active', value: true }, - { op: 'replace', path: 'active', value: false }, - ]))).toEqual({ active: false }); - }); - - test('returns an empty object when no relevant operations are present', () => { - expect(parseScimPatchOperations(ops([ - { op: 'replace', path: 'locale', value: 'en-US' }, - { op: 'remove', path: 'title' }, - ]))).toEqual({}); - }); -}); diff --git a/packages/web/src/ee/features/scim/schemas.ts b/packages/web/src/ee/features/scim/schemas.ts deleted file mode 100644 index 70ba4d6ba..000000000 --- a/packages/web/src/ee/features/scim/schemas.ts +++ /dev/null @@ -1,257 +0,0 @@ -import { z } from "zod"; -import { - SCIM_DEFAULT_COUNT, - SCIM_MAX_COUNT, - SCIM_RESOURCE_TYPE_SCHEMA, - SCIM_SERVICE_PROVIDER_CONFIG_SCHEMA, - SCIM_USER_SCHEMA, -} from "./constants"; - -// ----- Request body schemas (lenient: IdPs send extra attributes) ----- - -const scimEmailSchema = z.object({ - value: z.string(), - primary: z.boolean().optional(), - type: z.string().optional(), -}).passthrough(); - -const scimNameSchema = z.object({ - formatted: z.string().optional(), - givenName: z.string().optional(), - familyName: z.string().optional(), -}).passthrough(); - -export const scimUserCreateSchema = z.object({ - userName: z.string(), - externalId: z.string().optional(), - name: scimNameSchema.optional(), - emails: z.array(scimEmailSchema).optional(), - // `active` may arrive as a boolean or a string ("true"/"false"). - active: z.union([z.boolean(), z.string()]).optional(), - displayName: z.string().optional(), -}).passthrough(); -export type ScimUserCreate = z.infer; - -export const scimUserReplaceSchema = scimUserCreateSchema; -export type ScimUserReplace = z.infer; - -export const scimPatchOpSchema = z.object({ - schemas: z.array(z.string()).optional(), - Operations: z.array(z.object({ - op: z.string(), - path: z.string().optional(), - value: z.unknown().optional(), - }).passthrough()), -}).passthrough(); -export type ScimPatchOp = z.infer; - -export const scimListUsersQueryParamsSchema = z.object({ - filter: z.string().optional(), - startIndex: z.coerce.number().int().positive().default(1), - count: z.coerce.number().int().nonnegative().max(SCIM_MAX_COUNT).default(SCIM_DEFAULT_COUNT), -}); - -/** Coerces a SCIM `active` value (boolean | "true"/"false" | undefined). */ -export const coerceActive = (value: unknown): boolean | undefined => { - if (typeof value === "boolean") { - return value; - } - if (typeof value === "string") { - if (value.toLowerCase() === "true") { - return true; - } - if (value.toLowerCase() === "false") { - return false; - } - } - return undefined; -}; - -/** Resolves the primary email from a SCIM user payload. */ -export const resolveEmail = (payload: ScimUserCreate): string => { - const primary = payload.emails?.find((e) => e.primary)?.value; - return (primary ?? payload.emails?.[0]?.value ?? payload.userName).toLowerCase(); -}; - -/** The subset of attributes Sourcebot persists from a SCIM PatchOp. */ -export interface ScimPatchChanges { - name?: string; - email?: string; - active?: boolean; -} - -// Resolves a display name from a SCIM `name` complex value / `displayName`, -// mirroring the precedence used elsewhere (formatted, then displayName). -const resolveNameFromValue = (value: Record): string | undefined => { - const name = value.name; - const formatted = (name && typeof name === "object" && !Array.isArray(name)) - ? (name as Record).formatted - : undefined; - if (typeof formatted === "string") { - return formatted; - } - if (typeof value.displayName === "string") { - return value.displayName; - } - return undefined; -}; - -// Resolves the primary email from a SCIM `emails` array / `userName` value. -const resolveEmailFromValue = (value: Record): string | undefined => { - const emails = value.emails; - if (Array.isArray(emails)) { - const primary = emails.find((e) => e && typeof e === "object" && (e as Record).primary) - ?? emails[0]; - const email = (primary && typeof primary === "object") ? (primary as Record).value : undefined; - if (typeof email === "string") { - return email.toLowerCase(); - } - } - if (typeof value.userName === "string") { - return value.userName.toLowerCase(); - } - return undefined; -}; - -/** - * Reduces a SCIM PatchOp's operations into the subset of changes Sourcebot - * persists: display name, email, and active state. Handles both path-based ops - * (`{op,path,value}`, e.g. `name.formatted`, `userName`, `active`) and the - * no-path bulk form (`{op,value:{...}}`). Operator and attribute names are - * matched case-insensitively. Later operations override earlier ones, and any - * unrecognized op/path is ignored (lenient, never an error). - */ -export const parseScimPatchOperations = (operations: ScimPatchOp["Operations"]): ScimPatchChanges => { - const changes: ScimPatchChanges = {}; - - for (const operation of operations) { - const op = operation.op.toLowerCase(); - if (op !== "replace" && op !== "add") { - continue; - } - - const value = operation.value; - const path = operation.path?.toLowerCase(); - - // No-path bulk form: `value` is an object of attributes to replace. - if (path === undefined) { - if (value && typeof value === "object" && !Array.isArray(value)) { - const record = value as Record; - const active = coerceActive(record.active); - if (active !== undefined) { - changes.active = active; - } - const name = resolveNameFromValue(record); - if (name !== undefined) { - changes.name = name; - } - const email = resolveEmailFromValue(record); - if (email !== undefined) { - changes.email = email; - } - } - continue; - } - - if (path === "active") { - const active = coerceActive(value); - if (active !== undefined) { - changes.active = active; - } - } else if (path === "username") { - if (typeof value === "string") { - changes.email = value.toLowerCase(); - } - } else if (path === "displayname" || path === "name.formatted") { - if (typeof value === "string") { - changes.name = value; - } - } else if (path.startsWith("emails")) { - // e.g. `emails[type eq "work"].value` → maps to the primary email. - if (typeof value === "string") { - changes.email = value.toLowerCase(); - } - } - } - - return changes; -}; - -// ----- Filter parsing ----- - -export type ScimFilter = - | { attribute: "userName" | "externalId"; value: string } - | null; - -/** - * Parses the narrow set of SCIM filters IdPs actually send: - * `userName eq "value"` and `externalId eq "value"`. Operator and attribute - * are matched case-insensitively. Anything else returns `null`, which callers - * treat as "no matching results" rather than an error. - */ -export const parseScimFilter = (filter: string | null): ScimFilter => { - if (!filter) { - return null; - } - const match = filter.match(/^\s*(userName|externalId)\s+eq\s+"([^"]*)"\s*$/i); - if (!match) { - return null; - } - const attribute = match[1].toLowerCase() === "username" ? "userName" : "externalId"; - return { attribute, value: match[2] }; -}; - -// ----- Static discovery documents ----- - -export const serviceProviderConfig = { - schemas: [SCIM_SERVICE_PROVIDER_CONFIG_SCHEMA], - patch: { supported: true }, - bulk: { supported: false, maxOperations: 0, maxPayloadSize: 0 }, - filter: { supported: true, maxResults: 200 }, - changePassword: { supported: false }, - sort: { supported: false }, - etag: { supported: false }, - authenticationSchemes: [{ - type: "oauthbearertoken", - name: "OAuth Bearer Token", - description: "Authentication via the SCIM bearer token generated in Sourcebot settings.", - primary: true, - }], - meta: { resourceType: "ServiceProviderConfig" }, -}; - -export const userResourceType = { - schemas: [SCIM_RESOURCE_TYPE_SCHEMA], - id: "User", - name: "User", - endpoint: "/Users", - description: "User Account", - schema: SCIM_USER_SCHEMA, - meta: { resourceType: "ResourceType" }, -}; - -export const userSchemaDefinition = { - id: SCIM_USER_SCHEMA, - name: "User", - description: "User Account", - attributes: [ - { name: "userName", type: "string", multiValued: false, required: true, caseExact: false, mutability: "readWrite", returned: "default", uniqueness: "server" }, - { name: "active", type: "boolean", multiValued: false, required: false, mutability: "readWrite", returned: "default" }, - { - name: "name", type: "complex", multiValued: false, required: false, mutability: "readWrite", returned: "default", - subAttributes: [ - { name: "formatted", type: "string", multiValued: false, required: false }, - { name: "givenName", type: "string", multiValued: false, required: false }, - { name: "familyName", type: "string", multiValued: false, required: false }, - ], - }, - { - name: "emails", type: "complex", multiValued: true, required: false, mutability: "readWrite", returned: "default", - subAttributes: [ - { name: "value", type: "string", multiValued: false, required: false }, - { name: "primary", type: "boolean", multiValued: false, required: false }, - ], - }, - ], - meta: { resourceType: "Schema" }, -}; diff --git a/packages/web/src/ee/features/scim/withScimAuth.ts b/packages/web/src/ee/features/scim/withScimAuth.ts deleted file mode 100644 index c10d5b13d..000000000 --- a/packages/web/src/ee/features/scim/withScimAuth.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { __unsafePrisma } from "@/prisma"; -import { hasEntitlement } from "@/lib/entitlements"; -import { hashSecret, SCIM_TOKEN_PREFIX, createLogger } from "@sourcebot/shared"; -import { Org, PrismaClient } from "@sourcebot/db"; -import { NextRequest } from "next/server"; -import { scimError } from "./mapper"; - -const logger = createLogger('scim-auth'); - -export type ScimAuthContext = { - org: Org; - prisma: PrismaClient; -}; - -/** - * Authenticates a SCIM request via its `Authorization: Bearer sbscim_…` token - * and runs `fn` with an org-scoped (userless) context. Unlike `withAuth`, this - * does NOT resolve a user/role or apply the user-scoped Prisma extension: the - * caller is the IdP provisioning integration, acting org-wide. All responses - * (including errors) use the SCIM content type and error envelope. - */ -export const withScimAuth = async ( - request: NextRequest, - fn: (ctx: ScimAuthContext) => Promise, -): Promise => { - const authorization = request.headers.get("Authorization") ?? undefined; - if (!authorization?.startsWith("Bearer ")) { - return scimError(401, "Missing or malformed Authorization header"); - } - - const bearer = authorization.slice("Bearer ".length); - if (!bearer.startsWith(SCIM_TOKEN_PREFIX)) { - return scimError(401, "Invalid SCIM token"); - } - - const secret = bearer.slice(SCIM_TOKEN_PREFIX.length); - if (!secret) { - return scimError(401, "Invalid SCIM token"); - } - - const scimToken = await __unsafePrisma.scimToken.findUnique({ - where: { hash: hashSecret(secret) }, - include: { org: true }, - }); - if (!scimToken) { - return scimError(401, "Invalid SCIM token"); - } - - // Enforce the entitlement per-request so a license downgrade disables SCIM - // immediately, even with valid tokens still configured in the IdP. - if (!await hasEntitlement('scim')) { - return scimError(403, "SCIM provisioning is not available in your current plan"); - } - - // SCIM is an explicit opt-in: a valid token is rejected unless an owner has - // toggled provisioning on. Disabling acts as a kill switch that pauses all - // provisioning without requiring tokens to be revoked. - if (!scimToken.org.isScimEnabled) { - return scimError(403, "SCIM provisioning is disabled for this organization"); - } - - // Best-effort usage tracking; never block the request on it. - __unsafePrisma.scimToken.update({ - where: { hash: scimToken.hash }, - data: { lastUsedAt: new Date() }, - }).catch(() => { /* ignore */ }); - - try { - return await fn({ - org: scimToken.org, - prisma: __unsafePrisma - }); - } catch (error) { - logger.error(`Unhandled SCIM error: ${error instanceof Error ? error.message : String(error)}`); - return scimError(500, "Internal server error"); - } -}; diff --git a/packages/web/src/ee/features/scopedAccessTokens/api.test.ts b/packages/web/src/ee/features/scopedAccessTokens/api.test.ts deleted file mode 100644 index 71cd019fc..000000000 --- a/packages/web/src/ee/features/scopedAccessTokens/api.test.ts +++ /dev/null @@ -1,258 +0,0 @@ -import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - authContext: undefined as unknown, - generateScopedAccessToken: vi.fn(), - hasEntitlement: vi.fn(), -})); - -vi.mock('@/middleware/sew', () => ({ - sew: (callback: () => unknown) => callback(), -})); - -vi.mock('@/middleware/withAuth', () => ({ - withAuth: vi.fn((callback: (context: unknown) => unknown) => callback(mocks.authContext)), -})); - -vi.mock('@/lib/entitlements', () => ({ - hasEntitlement: mocks.hasEntitlement, -})); - -vi.mock('@sourcebot/shared', () => ({ - generateScopedAccessToken: mocks.generateScopedAccessToken, -})); - -const { - createScopedAccessToken, - createScopedAccessTokenRequestSchema, - revokeScopedAccessToken, -} = await import('./api'); -const { withAuth } = await import('@/middleware/withAuth'); - -const NOW = new Date('2026-08-06T04:00:00.000Z'); -const REPO_A_ID = 11; -const REPO_B_ID = 22; - -function createPrismaMock( - repositories: Array<{ id: number }>, - deletedTokenCount = 1, -) { - const scopedAccessTokenCreate = vi.fn().mockImplementation(async ({ - data, - }: { - data: { createdAt: Date; expiresAt: Date }; - }) => ({ - id: 'token-id', - createdAt: data.createdAt, - expiresAt: data.expiresAt, - })); - - return { - repo: { - findMany: vi.fn().mockResolvedValue(repositories), - }, - scopedAccessToken: { - create: scopedAccessTokenCreate, - deleteMany: vi.fn().mockResolvedValue({ count: deletedTokenCount }), - }, - }; -} - -beforeEach(() => { - vi.clearAllMocks(); - vi.useFakeTimers(); - vi.setSystemTime(NOW); - mocks.generateScopedAccessToken.mockReturnValue({ - token: 'sbst_secret', - hash: 'token-hash', - }); - mocks.hasEntitlement.mockReturnValue(true); -}); - -afterEach(() => { - vi.useRealTimers(); -}); - -describe('createScopedAccessTokenRequestSchema', () => { - test('accepts only a non-empty repoIds array of positive integers', () => { - expect(createScopedAccessTokenRequestSchema.safeParse({ repoIds: [REPO_A_ID] }).success).toBe(true); - expect(createScopedAccessTokenRequestSchema.safeParse({ repoIds: [] }).success).toBe(false); - expect(createScopedAccessTokenRequestSchema.safeParse({ repos: [REPO_A_ID] }).success).toBe(false); - expect(createScopedAccessTokenRequestSchema.safeParse({ repoIds: ['11'] }).success).toBe(false); - expect(createScopedAccessTokenRequestSchema.safeParse({ repoIds: [0] }).success).toBe(false); - expect(createScopedAccessTokenRequestSchema.safeParse({ - repoIds: [REPO_A_ID], - expiresAt: '2026-08-06T05:00:00.000Z', - }).success).toBe(false); - }); -}); - -describe('createScopedAccessToken', () => { - test('rejects minting before repository lookup when the entitlement is unavailable', async () => { - const prisma = createPrismaMock([{ id: REPO_A_ID }]); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - prisma, - }; - mocks.hasEntitlement.mockReturnValue(false); - - await expect(createScopedAccessToken({ repoIds: [REPO_A_ID] })).resolves.toEqual({ - statusCode: 403, - errorCode: 'INSUFFICIENT_PERMISSIONS', - message: 'Scoped access tokens are not available in your current plan.', - }); - expect(mocks.hasEntitlement).toHaveBeenCalledWith('scoped-access-tokens'); - expect(prisma.repo.findMany).not.toHaveBeenCalled(); - expect(mocks.generateScopedAccessToken).not.toHaveBeenCalled(); - expect(prisma.scopedAccessToken.create).not.toHaveBeenCalled(); - }); - - test('creates an API-key-authenticated token with an exact one-hour lifetime', async () => { - const prisma = createPrismaMock([ - { id: REPO_B_ID }, - { id: REPO_A_ID }, - ]); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - prisma, - }; - - await expect(createScopedAccessToken({ repoIds: [REPO_A_ID, REPO_B_ID] })).resolves.toEqual({ - id: 'token-id', - token: 'sbst_secret', - createdAt: '2026-08-06T04:00:00.000Z', - expiresAt: '2026-08-06T05:00:00.000Z', - repoIds: [REPO_A_ID, REPO_B_ID], - }); - expect(withAuth).toHaveBeenCalledWith(expect.any(Function), { - requiredAuthSource: 'api_key', - }); - expect(prisma.repo.findMany).toHaveBeenCalledWith({ - where: { - orgId: 1, - id: { in: [REPO_A_ID, REPO_B_ID] }, - }, - select: { - id: true, - }, - }); - expect(prisma.scopedAccessToken.create).toHaveBeenCalledWith({ - data: { - hash: 'token-hash', - createdAt: NOW, - expiresAt: new Date('2026-08-06T05:00:00.000Z'), - createdById: 'user-id', - orgId: 1, - repos: { - create: [{ repoId: 11 }, { repoId: 22 }], - }, - }, - select: { - id: true, - createdAt: true, - expiresAt: true, - }, - }); - }); - - test('rejects the entire request before generating a token when a repo is inaccessible or missing', async () => { - const prisma = createPrismaMock([{ id: REPO_A_ID }]); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - prisma, - }; - - await expect(createScopedAccessToken({ repoIds: [REPO_A_ID, REPO_B_ID] })).resolves.toEqual({ - statusCode: 400, - errorCode: 'INVALID_REPOSITORY_SCOPE', - message: 'Each repository ID must identify an accessible repository.', - }); - expect(mocks.generateScopedAccessToken).not.toHaveBeenCalled(); - expect(prisma.scopedAccessToken.create).not.toHaveBeenCalled(); - }); - - test('normalizes duplicate repository IDs before lookup and persistence', async () => { - const prisma = createPrismaMock([{ id: REPO_A_ID }]); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - prisma, - }; - - await expect(createScopedAccessToken({ repoIds: [REPO_A_ID, REPO_A_ID] })).resolves.toMatchObject({ - repoIds: [REPO_A_ID], - }); - expect(prisma.repo.findMany).toHaveBeenCalledWith(expect.objectContaining({ - where: { - orgId: 1, - id: { in: [REPO_A_ID] }, - }, - })); - expect(prisma.scopedAccessToken.create).toHaveBeenCalledWith(expect.objectContaining({ - data: expect.objectContaining({ - repos: { - create: [{ repoId: REPO_A_ID }], - }, - }), - })); - }); -}); - -describe('revokeScopedAccessToken', () => { - test('rejects revocation before deletion when the entitlement is unavailable', async () => { - const prisma = createPrismaMock([]); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - prisma, - }; - mocks.hasEntitlement.mockReturnValue(false); - - await expect(revokeScopedAccessToken('token-id')).resolves.toEqual({ - statusCode: 403, - errorCode: 'INSUFFICIENT_PERMISSIONS', - message: 'Scoped access tokens are not available in your current plan.', - }); - expect(mocks.hasEntitlement).toHaveBeenCalledWith('scoped-access-tokens'); - expect(prisma.scopedAccessToken.deleteMany).not.toHaveBeenCalled(); - }); - - test('deletes only a token owned by the API-key user in the current org', async () => { - const prisma = createPrismaMock([]); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - prisma, - }; - - await expect(revokeScopedAccessToken('token-id')).resolves.toEqual({ success: true }); - expect(withAuth).toHaveBeenCalledWith(expect.any(Function), { - requiredAuthSource: 'api_key', - }); - expect(prisma.scopedAccessToken.deleteMany).toHaveBeenCalledWith({ - where: { - id: 'token-id', - createdById: 'user-id', - orgId: 1, - }, - }); - }); - - test('returns the same not-found response when no owned token is deleted', async () => { - const prisma = createPrismaMock([], 0); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - prisma, - }; - - await expect(revokeScopedAccessToken('unknown-or-unowned')).resolves.toEqual({ - statusCode: 404, - errorCode: 'SCOPED_ACCESS_TOKEN_NOT_FOUND', - message: 'Scoped access token not found.', - }); - }); -}); diff --git a/packages/web/src/ee/features/scopedAccessTokens/api.ts b/packages/web/src/ee/features/scopedAccessTokens/api.ts deleted file mode 100644 index 08e125612..000000000 --- a/packages/web/src/ee/features/scopedAccessTokens/api.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { ErrorCode } from '@/lib/errorCodes'; -import { hasEntitlement } from '@/lib/entitlements'; -import type { ServiceError } from '@/lib/serviceError'; -import { sew } from '@/middleware/sew'; -import { withAuth } from '@/middleware/withAuth'; -import { generateScopedAccessToken } from '@sourcebot/shared'; -import { StatusCodes } from 'http-status-codes'; -import { z } from 'zod'; - -const SCOPED_ACCESS_TOKEN_TTL_MS = 60 * 60 * 1000; - -export const createScopedAccessTokenRequestSchema = z.object({ - repoIds: z.array(z.number().int().positive()).min(1), -}).strict(); - -export type CreateScopedAccessTokenRequest = z.infer; - -export interface CreateScopedAccessTokenResponse { - id: string; - token: string; - createdAt: string; - expiresAt: string; - repoIds: number[]; -} - -export interface RevokeScopedAccessTokenResponse { - success: true; -} - -const checkScopedAccessTokenEntitlement = async (): Promise => { - if (await hasEntitlement('scoped-access-tokens')) { - return null; - } - - return { - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS, - message: 'Scoped access tokens are not available in your current plan.', - } satisfies ServiceError; -}; - -export const createScopedAccessToken = async ( - request: CreateScopedAccessTokenRequest, -): Promise => sew(() => - withAuth(async ({ org, user, prisma }) => { - const entitlementError = await checkScopedAccessTokenEntitlement(); - if (entitlementError) { - return entitlementError; - } - - // Treat duplicate IDs as one scope entry while preserving request order. - const repositoryIds = [...new Set(request.repoIds)]; - const repositories = await prisma.repo.findMany({ - where: { - orgId: org.id, - id: { in: repositoryIds }, - }, - select: { - id: true, - }, - }); - - if (repositories.length !== repositoryIds.length) { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_REPOSITORY_SCOPE, - message: 'Each repository ID must identify an accessible repository.', - } satisfies ServiceError; - } - - const now = new Date(); - const expiresAt = new Date(now.getTime() + SCOPED_ACCESS_TOKEN_TTL_MS); - const { token, hash } = generateScopedAccessToken(); - const createdToken = await prisma.scopedAccessToken.create({ - data: { - hash, - createdAt: now, - expiresAt, - createdById: user.id, - orgId: org.id, - repos: { - create: repositoryIds.map((repoId) => ({ repoId })), - }, - }, - select: { - id: true, - createdAt: true, - expiresAt: true, - }, - }); - - return { - id: createdToken.id, - token, - createdAt: createdToken.createdAt.toISOString(), - expiresAt: createdToken.expiresAt.toISOString(), - repoIds: repositoryIds, - } satisfies CreateScopedAccessTokenResponse; - }, { requiredAuthSource: 'api_key' }) -); - -export const revokeScopedAccessToken = async ( - id: string, -): Promise => sew(() => - withAuth(async ({ org, user, prisma }) => { - const entitlementError = await checkScopedAccessTokenEntitlement(); - if (entitlementError) { - return entitlementError; - } - - const { count } = await prisma.scopedAccessToken.deleteMany({ - where: { - id, - createdById: user.id, - orgId: org.id, - }, - }); - - if (count === 0) { - return { - statusCode: StatusCodes.NOT_FOUND, - errorCode: ErrorCode.SCOPED_ACCESS_TOKEN_NOT_FOUND, - message: 'Scoped access token not found.', - } satisfies ServiceError; - } - - return { success: true } satisfies RevokeScopedAccessTokenResponse; - }, { requiredAuthSource: 'api_key' }) -); diff --git a/packages/web/src/ee/features/sso/actions.test.ts b/packages/web/src/ee/features/sso/actions.test.ts deleted file mode 100644 index ad2b07cef..000000000 --- a/packages/web/src/ee/features/sso/actions.test.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { OPTIONAL_PROVIDERS_LINK_SKIPPED_COOKIE_NAME } from '@/lib/constants'; - -const mocks = vi.hoisted(() => ({ - authContext: undefined as unknown, - hasEntitlement: vi.fn(), - removeAccountPermissionSyncScheduler: vi.fn(), - scheduleAndTriggerAccountPermissionSync: vi.fn(), - cookieGet: vi.fn(), - cookieSet: vi.fn(), -})); - -vi.mock('@/middleware/sew', () => ({ - sew: (callback: () => unknown) => callback(), -})); -vi.mock('@/middleware/withAuth', () => ({ - withAuth: (callback: (context: unknown) => unknown) => - callback(mocks.authContext), -})); -vi.mock('@/middleware/withMinimumOrgRole', () => ({ - withMinimumOrgRole: ( - _role: unknown, - _minimumRole: unknown, - callback: () => unknown, - ) => callback(), -})); -vi.mock('@/ee/features/permissionSync/accountPermissionSyncQueue.server', () => ({ - removeAccountPermissionSyncScheduler: - mocks.removeAccountPermissionSyncScheduler, - scheduleAndTriggerAccountPermissionSync: - mocks.scheduleAndTriggerAccountPermissionSync, -})); -vi.mock('@/lib/entitlements', () => ({ - hasEntitlement: mocks.hasEntitlement, -})); -vi.mock('@/lib/serviceError', () => ({ - unexpectedError: (message: string) => ({ error: message }), -})); -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => ({ info: vi.fn() }), - doesIdpSupportPermissionSyncing: () => true, - env: { PERMISSION_SYNC_ENABLED: 'true' }, - getIdentityProviderConfig: vi.fn(), - getIdentityProviderConfigs: vi.fn(), -})); -vi.mock('next/headers', () => ({ - cookies: async () => ({ get: mocks.cookieGet, set: mocks.cookieSet }), -})); - -const { - skipOptionalProvidersLink, - triggerAccountPermissionSync, - unlinkLinkedAccountProvider, -} = await import('./actions'); - -beforeEach(() => { - vi.clearAllMocks(); - mocks.cookieGet.mockReturnValue(undefined); - mocks.hasEntitlement.mockResolvedValue(true); - mocks.removeAccountPermissionSyncScheduler.mockResolvedValue(true); - mocks.scheduleAndTriggerAccountPermissionSync.mockResolvedValue({ - jobId: 'job-1', - }); -}); - -describe('skipOptionalProvidersLink', () => { - test('stores the offered provider IDs and retains previous dismissals without duplicates', async () => { - mocks.cookieGet.mockReturnValue({ value: JSON.stringify(['github-personal']) }); - await expect(skipOptionalProvidersLink(['github-personal', 'github-work'])).resolves.toBe(true); - expect(mocks.cookieSet).toHaveBeenCalledWith( - OPTIONAL_PROVIDERS_LINK_SKIPPED_COOKIE_NAME, - JSON.stringify(['github-personal', 'github-work']), - expect.objectContaining({ path: '/', maxAge: 365 * 24 * 60 * 60 }), - ); - }); - - test('replaces the legacy blanket dismissal with just the offered IDs', async () => { - mocks.cookieGet.mockReturnValue({ value: 'true' }); - await skipOptionalProvidersLink(['github-personal']); - expect(mocks.cookieSet).toHaveBeenCalledWith( - OPTIONAL_PROVIDERS_LINK_SKIPPED_COOKIE_NAME, - JSON.stringify(['github-personal']), - expect.any(Object), - ); - }); -}); - -describe('triggerAccountPermissionSync', () => { - test('enqueues a sync for an eligible account owned by the user', async () => { - const findFirst = vi.fn().mockResolvedValue({ providerType: 'github' }); - mocks.authContext = { - prisma: { account: { findFirst } }, - role: 'MEMBER', - user: { id: 'user-1' }, - }; - - await expect( - triggerAccountPermissionSync('account-1'), - ).resolves.toEqual({ jobId: 'job-1' }); - - expect(findFirst).toHaveBeenCalledWith({ - where: { - id: 'account-1', - userId: 'user-1', - }, - select: { - providerType: true, - }, - }); - expect( - mocks.scheduleAndTriggerAccountPermissionSync, - ).toHaveBeenCalledWith('account-1'); - }); - - test('does not enqueue a sync for an account the user does not own', async () => { - mocks.authContext = { - prisma: { - account: { findFirst: vi.fn().mockResolvedValue(null) }, - }, - role: 'MEMBER', - user: { id: 'user-1' }, - }; - - await expect( - triggerAccountPermissionSync('account-2'), - ).resolves.toEqual({ - error: 'Account does not support permission syncing', - }); - expect( - mocks.scheduleAndTriggerAccountPermissionSync, - ).not.toHaveBeenCalled(); - }); -}); - -describe('unlinkLinkedAccountProvider', () => { - test('removes account schedulers before deleting the accounts', async () => { - const findMany = vi.fn().mockResolvedValue([ - { id: 'account-1' }, - { id: 'account-2' }, - ]); - const deleteMany = vi.fn().mockResolvedValue({ count: 2 }); - mocks.authContext = { - prisma: { account: { deleteMany, findMany } }, - role: 'MEMBER', - user: { id: 'user-1' }, - }; - - await expect( - unlinkLinkedAccountProvider('github'), - ).resolves.toEqual({ success: true, count: 2 }); - - const where = { providerId: 'github', userId: 'user-1' }; - expect(findMany).toHaveBeenCalledWith({ - where, - select: { id: true }, - }); - expect(mocks.removeAccountPermissionSyncScheduler).toHaveBeenCalledTimes(2); - expect(mocks.removeAccountPermissionSyncScheduler).toHaveBeenCalledWith('account-1'); - expect(mocks.removeAccountPermissionSyncScheduler).toHaveBeenCalledWith('account-2'); - expect(deleteMany).toHaveBeenCalledWith({ where }); - expect( - mocks.removeAccountPermissionSyncScheduler.mock.invocationCallOrder[1], - ).toBeLessThan(deleteMany.mock.invocationCallOrder[0]); - }); - - test('does not delete accounts when scheduler removal fails', async () => { - const findMany = vi.fn().mockResolvedValue([{ id: 'account-1' }]); - const deleteMany = vi.fn(); - mocks.authContext = { - prisma: { account: { deleteMany, findMany } }, - role: 'MEMBER', - user: { id: 'user-1' }, - }; - mocks.removeAccountPermissionSyncScheduler.mockRejectedValue( - new Error('Redis unavailable'), - ); - - await expect( - unlinkLinkedAccountProvider('github'), - ).rejects.toThrow('Redis unavailable'); - expect(deleteMany).not.toHaveBeenCalled(); - }); -}); diff --git a/packages/web/src/ee/features/sso/actions.ts b/packages/web/src/ee/features/sso/actions.ts deleted file mode 100644 index a48f8c2d6..000000000 --- a/packages/web/src/ee/features/sso/actions.ts +++ /dev/null @@ -1,158 +0,0 @@ -'use server'; - -import { sew } from "@/middleware/sew"; -import { OPTIONAL_PROVIDERS_LINK_SKIPPED_COOKIE_NAME } from "@/lib/constants"; -import { withAuth } from "@/middleware/withAuth"; -import { withMinimumOrgRole } from "@/middleware/withMinimumOrgRole"; -import { OrgRole } from "@sourcebot/db"; -import { hasEntitlement } from "@/lib/entitlements"; -import { createLogger, doesIdpSupportPermissionSyncing, env, getIdentityProviderConfig, getIdentityProviderConfigs } from "@sourcebot/shared"; -import { cookies } from "next/headers"; -import { removeAccountPermissionSyncScheduler, scheduleAndTriggerAccountPermissionSync } from "@/ee/features/permissionSync/accountPermissionSyncQueue.server"; -import type { LinkedAccount } from "./types"; -import { parseSkippedOptionalProviderIds } from "./utils"; -import { z } from "zod"; -import { unexpectedError } from "@/lib/serviceError"; - -const logger = createLogger('web-ee-sso-actions'); - -export const getLinkedAccounts = async () => sew(() => - withAuth(async ({ prisma, role, user }) => - withMinimumOrgRole(role, OrgRole.MEMBER, async () => { - const accounts = await prisma.account.findMany({ - where: { userId: user.id }, - select: { - id: true, - providerType: true, - providerId: true, - providerAccountId: true, - permissionSyncIssue: true, - }, - }); - - const permissionSyncEnabled = - env.PERMISSION_SYNC_ENABLED === 'true' && - await hasEntitlement('permission-syncing'); - - const result: LinkedAccount[] = []; - - // All connected accounts (from DB), enriched with config data where available - for (const account of accounts) { - const providerConfig = await getIdentityProviderConfig(account.providerId); - const isAccountLinking = providerConfig?.purpose === 'account_linking'; - - result.push({ - providerId: account.providerId, - providerType: account.providerType, - displayName: providerConfig?.displayName, - isLinked: true, - accountId: account.id, - providerAccountId: account.providerAccountId, - permissionSyncIssue: account.permissionSyncIssue ?? undefined, - isAccountLinkingProvider: isAccountLinking, - required: isAccountLinking ? (providerConfig?.accountLinkingRequired ?? false) : false, - supportsPermissionSync: permissionSyncEnabled && doesIdpSupportPermissionSyncing(account.providerType), - }); - } - - // Configured providers that the user has not linked yet. - const identityProviders = await getIdentityProviderConfigs(); - for (const [id, providerConfig] of Object.entries(identityProviders)) { - const account = accounts.find((account) => account.providerId === id); - if (!account) { - result.push({ - providerId: id, - providerType: providerConfig.provider, - displayName: providerConfig.displayName, - isLinked: false, - isAccountLinkingProvider: providerConfig.purpose === 'account_linking', - required: providerConfig.purpose === 'account_linking' ? (providerConfig.accountLinkingRequired ?? false) : false, - supportsPermissionSync: permissionSyncEnabled && doesIdpSupportPermissionSyncing(providerConfig.provider), - }); - } - } - - return result; - }) - ) -); - -export const triggerAccountPermissionSync = async (accountId: string) => sew(() => - withAuth(({ prisma, role, user }) => - withMinimumOrgRole(role, OrgRole.MEMBER, async () => { - try { - if ( - env.PERMISSION_SYNC_ENABLED !== 'true' || - !await hasEntitlement('permission-syncing') - ) { - return unexpectedError('Permission syncing is not enabled'); - } - - const account = await prisma.account.findFirst({ - where: { - id: accountId, - userId: user.id, - }, - select: { - providerType: true, - }, - }); - if ( - !account || - !doesIdpSupportPermissionSyncing(account.providerType) - ) { - return unexpectedError('Account does not support permission syncing'); - } - - return await scheduleAndTriggerAccountPermissionSync(accountId); - } catch { - return unexpectedError('Failed to trigger account permission sync'); - } - }) - ) -); - -export const unlinkLinkedAccountProvider = async (providerId: string) => sew(() => - withAuth(async ({ prisma, role, user }) => - withMinimumOrgRole(role, OrgRole.MEMBER, async () => { - const where = { - providerId, - userId: user.id, - }; - const accounts = await prisma.account.findMany({ - where, - select: { - id: true, - }, - }); - - await Promise.all( - accounts.map(({ id }) => - removeAccountPermissionSyncScheduler(id), - ), - ); - - const result = await prisma.account.deleteMany({ - where, - }); - - logger.info(`Unlinked account provider ${providerId} for user ${user.id}. Deleted ${result.count} account(s).`); - - return { success: true, count: result.count }; - }) - ) -); - -// eslint-disable-next-line authz/require-auth-wrapper -- UI-only preference cookie, no DB access -export const skipOptionalProvidersLink = async (providerIds: string[]) => sew(async () => { - const ids = z.array(z.string()).parse(providerIds); - const cookieStore = await cookies(); - const previouslySkipped = parseSkippedOptionalProviderIds(cookieStore.get(OPTIONAL_PROVIDERS_LINK_SKIPPED_COOKIE_NAME)?.value); - const skippedProviderIds = [...new Set([...previouslySkipped, ...ids])]; - cookieStore.set(OPTIONAL_PROVIDERS_LINK_SKIPPED_COOKIE_NAME, JSON.stringify(skippedProviderIds), { - httpOnly: false, // Allow client-side access - maxAge: 365 * 24 * 60 * 60, // 1 year in seconds - path: '/', - }); - return true; -}); diff --git a/packages/web/src/ee/features/sso/components/accountLinkingGuard.test.tsx b/packages/web/src/ee/features/sso/components/accountLinkingGuard.test.tsx deleted file mode 100644 index c7231be00..000000000 --- a/packages/web/src/ee/features/sso/components/accountLinkingGuard.test.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { beforeEach, expect, test, vi } from 'vitest'; -import { ServiceErrorException } from '@/lib/serviceError'; -import type { LinkedAccount } from '../types'; - -const mocks = vi.hoisted(() => ({ - auth: vi.fn(), hasEntitlement: vi.fn(), getLinkedAccounts: vi.fn(), cookieGet: vi.fn(), -})); -vi.mock('server-only', () => ({})); -vi.mock('@/auth', () => ({ auth: mocks.auth })); -vi.mock('@/lib/entitlements', () => ({ hasEntitlement: mocks.hasEntitlement })); -vi.mock('@/ee/features/sso/actions', () => ({ getLinkedAccounts: mocks.getLinkedAccounts })); -vi.mock('next/headers', () => ({ cookies: async () => ({ get: mocks.cookieGet }) })); -vi.mock('@/lib/utils', () => ({ - isServiceError: (value: unknown) => !!value && typeof value === 'object' && 'errorCode' in value, -})); -vi.mock('@/app/components/logoutEscapeHatch', () => ({ LogoutEscapeHatch: () => null })); -vi.mock('./connectAccountsCard', () => ({ ConnectAccountsCard: () => null })); - -const { AccountLinkingGuard } = await import('./accountLinkingGuard'); -const children =
App content
; -const props = { children, callbackUrl: '/' }; -const optionalAccount: LinkedAccount = { - providerId: 'github-personal', - providerType: 'github', - isLinked: false, - isAccountLinkingProvider: true, - required: false, - supportsPermissionSync: true, -}; - -beforeEach(() => { - vi.resetAllMocks(); - mocks.auth.mockResolvedValue({ user: { id: 'user-1' } }); - mocks.hasEntitlement.mockResolvedValue(true); - mocks.getLinkedAccounts.mockResolvedValue([]); -}); - -test('passes anonymous app content through without an authenticated lookup', async () => { - mocks.auth.mockResolvedValue(null); - expect(await AccountLinkingGuard(props)).toBe(children); - expect(mocks.getLinkedAccounts).not.toHaveBeenCalled(); -}); - -test('passes the original children through when no linking is needed', async () => { - expect(await AccountLinkingGuard(props)).toBe(children); - expect(mocks.cookieGet).not.toHaveBeenCalled(); -}); - -test('propagates lookup errors to the app error boundary by default', async () => { - const error = { statusCode: 500, errorCode: 'UNEXPECTED_ERROR', message: 'Lookup failed' }; - mocks.getLinkedAccounts.mockResolvedValue(error); - await expect(AccountLinkingGuard(props)).rejects.toEqual(new ServiceErrorException(error)); -}); - -test('shows the prompt again when a new optional provider is added, even of the same type', async () => { - mocks.cookieGet.mockReturnValue({ value: JSON.stringify(['github-personal']) }); - mocks.getLinkedAccounts.mockResolvedValue([optionalAccount]); - expect(await AccountLinkingGuard(props)).toBe(children); - - mocks.getLinkedAccounts.mockResolvedValue([ - optionalAccount, - { ...optionalAccount, providerId: 'github-work' }, - ]); - expect(await AccountLinkingGuard(props)).not.toBe(children); - - mocks.cookieGet.mockReturnValue({ value: JSON.stringify(['github-personal', 'github-work']) }); - expect(await AccountLinkingGuard(props)).toBe(children); -}); - -test('renaming a skipped optional provider does not show it again', async () => { - mocks.cookieGet.mockReturnValue({ value: JSON.stringify(['github-personal']) }); - mocks.getLinkedAccounts.mockResolvedValue([{ ...optionalAccount, displayName: 'New name' }]); - expect(await AccountLinkingGuard(props)).toBe(children); -}); - -test('a skipped optional provider becoming required shows the prompt again', async () => { - mocks.cookieGet.mockReturnValue({ value: JSON.stringify(['github-personal']) }); - mocks.getLinkedAccounts.mockResolvedValue([{ ...optionalAccount, required: true }]); - expect(await AccountLinkingGuard(props)).not.toBe(children); -}); - -test.each(['true', 'false', '{broken', '{}', '["github-personal", 1]'])('treats legacy or invalid cookie %s as no providers skipped', async (value) => { - mocks.cookieGet.mockReturnValue({ value }); - mocks.getLinkedAccounts.mockResolvedValue([optionalAccount]); - expect(await AccountLinkingGuard(props)).not.toBe(children); -}); - -test('new SSO providers and already-linked optional providers do not trigger the prompt', async () => { - mocks.cookieGet.mockReturnValue({ value: JSON.stringify(['github-personal']) }); - mocks.getLinkedAccounts.mockResolvedValue([ - optionalAccount, - { ...optionalAccount, providerId: 'github-sso', isAccountLinkingProvider: false }, - { ...optionalAccount, providerId: 'github-linked', isLinked: true }, - ]); - expect(await AccountLinkingGuard(props)).toBe(children); -}); diff --git a/packages/web/src/ee/features/sso/components/accountLinkingGuard.tsx b/packages/web/src/ee/features/sso/components/accountLinkingGuard.tsx deleted file mode 100644 index 5b901fb78..000000000 --- a/packages/web/src/ee/features/sso/components/accountLinkingGuard.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import 'server-only'; - -import type { ReactNode } from 'react'; -import { cookies } from 'next/headers'; -import { auth } from '@/auth'; -import { LogoutEscapeHatch } from '@/app/components/logoutEscapeHatch'; -import { OPTIONAL_PROVIDERS_LINK_SKIPPED_COOKIE_NAME } from '@/lib/constants'; -import { hasEntitlement } from '@/lib/entitlements'; -import { ServiceErrorException } from '@/lib/serviceError'; -import { isServiceError } from '@/lib/utils'; -import { getLinkedAccounts } from '../actions'; -import { hasRequiredUnlinkedProviders, hasUnlinkedProviders, hasUnskippedOptionalProviders, parseSkippedOptionalProviderIds } from '../utils'; -import { ConnectAccountsCard } from './connectAccountsCard'; - -interface AccountLinkingGuardProps { - children: ReactNode; - callbackUrl: string; -} - -// Controls the account-linking prompt before rendering the app or OAuth consent. -export async function AccountLinkingGuard({ children, callbackUrl }: AccountLinkingGuardProps) { - if (!await auth() || !await hasEntitlement('sso')) { - return children; - } - - const linkedAccounts = await getLinkedAccounts(); - if (isServiceError(linkedAccounts)) { - throw new ServiceErrorException(linkedAccounts); - } - - if (!hasUnlinkedProviders(linkedAccounts)) { - return children; - } - - const cookieStore = await cookies(); - const skippedProviderIds = parseSkippedOptionalProviderIds(cookieStore.get(OPTIONAL_PROVIDERS_LINK_SKIPPED_COOKIE_NAME)?.value); - if (!hasRequiredUnlinkedProviders(linkedAccounts) && !hasUnskippedOptionalProviders(linkedAccounts, skippedProviderIds)) { - return children; - } - - return ( -
- - -
- ); -} diff --git a/packages/web/src/ee/features/sso/components/connectAccountsCard.test.tsx b/packages/web/src/ee/features/sso/components/connectAccountsCard.test.tsx deleted file mode 100644 index 439c33e74..000000000 --- a/packages/web/src/ee/features/sso/components/connectAccountsCard.test.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'; -import { afterEach, beforeEach, expect, test, vi } from 'vitest'; -import type { LinkedAccount } from '../types'; - -const mocks = vi.hoisted(() => ({ skip: vi.fn(), refresh: vi.fn() })); -vi.mock('@/ee/features/sso/actions', () => ({ skipOptionalProvidersLink: mocks.skip })); -vi.mock('next/navigation', () => ({ useRouter: () => ({ refresh: mocks.refresh }) })); -vi.mock('./linkedAccountProviderCard', () => ({ LinkedAccountProviderCard: () => null })); -vi.mock('@/lib/utils', () => ({ - cn: (...classes: unknown[]) => classes.filter(Boolean).join(' '), - isServiceError: (value: unknown) => !!value && typeof value === 'object' && 'errorCode' in value, -})); -const { ConnectAccountsCard } = await import('./connectAccountsCard'); -const optionalAccount: LinkedAccount = { - providerId: 'github-personal', providerType: 'github', isLinked: false, - isAccountLinkingProvider: true, required: false, supportsPermissionSync: true, -}; - -beforeEach(() => { - vi.resetAllMocks(); - mocks.skip.mockResolvedValue(true); -}); -afterEach(() => { - cleanup(); - vi.restoreAllMocks(); -}); - -test('skips only the unlinked optional account-linking providers offered by this screen', async () => { - render(); - fireEvent.click(screen.getByRole('button', { name: 'Skip for now' })); - await waitFor(() => expect(mocks.refresh).toHaveBeenCalledOnce()); - expect(mocks.skip).toHaveBeenCalledWith(['github-personal', 'github-work']); -}); - -test('does not offer skipping while a required provider is unlinked', () => { - render(); - expect(screen.queryByRole('button', { name: 'Skip for now' })).toBeNull(); -}); - -test('allows retrying when saving the skip preference fails', async () => { - vi.spyOn(console, 'error').mockImplementation(() => {}); - mocks.skip.mockResolvedValue({ statusCode: 500, errorCode: 'UNEXPECTED_ERROR', message: 'Failed to save' }); - render(); - fireEvent.click(screen.getByRole('button', { name: 'Skip for now' })); - await waitFor(() => expect(console.error).toHaveBeenCalled()); - expect(mocks.refresh).not.toHaveBeenCalled(); - - mocks.skip.mockResolvedValue(true); - fireEvent.click(screen.getByRole('button', { name: 'Skip for now' })); - await waitFor(() => expect(mocks.refresh).toHaveBeenCalledOnce()); -}); diff --git a/packages/web/src/ee/features/sso/components/connectAccountsCard.tsx b/packages/web/src/ee/features/sso/components/connectAccountsCard.tsx deleted file mode 100644 index debf1d600..000000000 --- a/packages/web/src/ee/features/sso/components/connectAccountsCard.tsx +++ /dev/null @@ -1,78 +0,0 @@ -'use client'; - -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; -import { LoadingButton } from "@/components/ui/loading-button"; -import { skipOptionalProvidersLink } from "@/ee/features/sso/actions"; -import { useRouter } from "next/navigation"; -import { useState } from "react"; -import { LinkedAccountProviderCard } from "./linkedAccountProviderCard"; -import { hasRequiredUnlinkedProviders } from "@/ee/features/sso/utils"; -import type { LinkedAccount } from "@/ee/features/sso/types"; -import { isServiceError } from "@/lib/utils"; - -interface ConnectAccountsCardProps { - linkedAccounts: LinkedAccount[] - callbackUrl?: string; -} - -export const ConnectAccountsCard = ({ linkedAccounts, callbackUrl }: ConnectAccountsCardProps) => { - const router = useRouter(); - const [isSkipping, setIsSkipping] = useState(false); - - const handleSkip = async () => { - setIsSkipping(true); - try { - const providerIds = accountLinkingProviders - .filter(account => !account.required && !account.isLinked) - .map(account => account.providerId); - const result = await skipOptionalProvidersLink(providerIds); - if (isServiceError(result)) { - throw new Error(result.message); - } - router.refresh(); - } catch (error) { - console.error("Failed to skip optional providers:", error); - setIsSkipping(false); - } - }; - - // Only show account_linking providers in this flow - const accountLinkingProviders = linkedAccounts.filter(a => a.isAccountLinkingProvider); - const canSkip = !hasRequiredUnlinkedProviders(accountLinkingProviders); - - return ( - - - Connect Your Accounts - - Link the following accounts to enable permission syncing and access all features. -
- You can manage your linked accounts later in Settings → Linked Accounts. -
-
- -
- {accountLinkingProviders - .sort((a, b) => (b.required ? 1 : 0) - (a.required ? 1 : 0)) - .map(account => ( - - ))} -
- {canSkip && ( - - Skip for now - - )} -
-
- ); -}; diff --git a/packages/web/src/ee/features/sso/components/linkedAccountProviderCard.test.tsx b/packages/web/src/ee/features/sso/components/linkedAccountProviderCard.test.tsx deleted file mode 100644 index a733afdde..000000000 --- a/packages/web/src/ee/features/sso/components/linkedAccountProviderCard.test.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react'; -import type { ReactNode } from 'react'; -import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; -import type { LinkedAccount } from '@/ee/features/sso/types'; - -const mocks = vi.hoisted(() => ({ - getAccountSyncStatus: vi.fn(), - refresh: vi.fn(), - toast: vi.fn(), - triggerAccountPermissionSync: vi.fn(), -})); - -vi.mock('next/navigation', () => ({ - useRouter: () => ({ refresh: mocks.refresh }), -})); - -vi.mock('next-auth/react', () => ({ - signIn: vi.fn(), -})); - -vi.mock('@/components/hooks/use-toast', () => ({ - useToast: () => ({ toast: mocks.toast }), -})); - -vi.mock('@/ee/features/sso/actions', () => ({ - triggerAccountPermissionSync: mocks.triggerAccountPermissionSync, - unlinkLinkedAccountProvider: vi.fn(), -})); - -vi.mock('@/app/api/(client)/client', () => ({ - getAccountSyncStatus: mocks.getAccountSyncStatus, -})); - -vi.mock('@/components/ui/dropdown-menu', () => ({ - DropdownMenu: ({ children }: { children: ReactNode }) =>
{children}
, - DropdownMenuTrigger: ({ children }: { children: ReactNode }) => <>{children}, - DropdownMenuContent: ({ children }: { children: ReactNode }) =>
{children}
, - DropdownMenuItem: ({ children, onClick }: { children: ReactNode; onClick?: () => void }) => ( - - ), -})); - -vi.mock('@/lib/utils', () => ({ - cn: (...classes: Array) => classes.filter(Boolean).join(' '), - getAuthProviderInfo: () => ({ displayName: 'Bitbucket Server', icon: null }), - isServiceError: () => false, - unwrapServiceError: (value: unknown) => value, -})); - -vi.mock('./providerIcon', () => ({ - ProviderIcon: () =>
, -})); - -const { LinkedAccountProviderCard } = await import('./linkedAccountProviderCard'); - -const linkedAccount: LinkedAccount = { - providerId: 'bitbucket-server-corp', - providerType: 'bitbucket-server', - isLinked: true, - accountId: 'account_1', - providerAccountId: 'user_1', - isAccountLinkingProvider: true, - required: false, - supportsPermissionSync: true, -}; - -const renderCard = (account: LinkedAccount) => { - const queryClient = new QueryClient({ - defaultOptions: { queries: { retry: false } }, - }); - return render( - - - , - ); -}; - -afterEach(() => { - cleanup(); -}); - -beforeEach(() => { - vi.clearAllMocks(); -}); - -describe('LinkedAccountProviderCard permission sync health', () => { - test('shows a healthy linked account as connected', () => { - renderCard(linkedAccount); - - expect(screen.getByText('Connected')).toBeTruthy(); - expect(screen.queryByText('Needs attention')).toBeNull(); - }); - - test('shows reconnect guidance instead of permission refresh when repository permissions were cleared', () => { - renderCard({ - ...linkedAccount, - permissionSyncIssue: 'REAUTHENTICATION_REQUIRED', - }); - - expect(screen.getByText('Needs attention')).toBeTruthy(); - expect(screen.getByText('Reconnect this account to restore repository access.')).toBeTruthy(); - expect(screen.queryByText('Connected')).toBeNull(); - expect(screen.getByText('Reconnect Account')).toBeTruthy(); - expect(screen.queryByText('Refresh Permissions')).toBeNull(); - }); - - test('shows scope-specific guidance when the OAuth grant is insufficient', () => { - renderCard({ - ...linkedAccount, - permissionSyncIssue: 'INSUFFICIENT_SCOPE', - }); - - expect(screen.getByText('Additional permissions are required to restore repository access.')).toBeTruthy(); - }); - - test('shows a success toast only when permission sync completes', async () => { - mocks.triggerAccountPermissionSync.mockResolvedValue({ jobId: 'job_1' }); - mocks.getAccountSyncStatus.mockResolvedValue({ status: 'COMPLETED' }); - renderCard(linkedAccount); - - fireEvent.click(screen.getByRole('button', { name: /Refresh Permissions/ })); - - await waitFor(() => { - expect(mocks.toast).toHaveBeenCalledWith({ - description: '✅ Permissions refreshed for Bitbucket Server.', - }); - }); - expect(mocks.refresh).toHaveBeenCalledOnce(); - }); - - test('shows an error toast when permission sync fails', async () => { - mocks.triggerAccountPermissionSync.mockResolvedValue({ jobId: 'job_1' }); - mocks.getAccountSyncStatus.mockResolvedValue({ status: 'FAILED' }); - renderCard(linkedAccount); - - fireEvent.click(screen.getByRole('button', { name: /Refresh Permissions/ })); - - await waitFor(() => { - expect(mocks.toast).toHaveBeenCalledWith({ - description: '❌ Failed to refresh permissions for Bitbucket Server. Please try again.', - variant: 'destructive', - }); - }); - expect(mocks.toast).not.toHaveBeenCalledWith(expect.objectContaining({ - description: expect.stringContaining('✅'), - })); - expect(mocks.refresh).toHaveBeenCalledOnce(); - }); -}); diff --git a/packages/web/src/ee/features/sso/components/linkedAccountProviderCard.tsx b/packages/web/src/ee/features/sso/components/linkedAccountProviderCard.tsx deleted file mode 100644 index 358cd62ec..000000000 --- a/packages/web/src/ee/features/sso/components/linkedAccountProviderCard.tsx +++ /dev/null @@ -1,223 +0,0 @@ -'use client'; - -import { useEffect, useState } from "react"; -import { cn, getAuthProviderInfo, unwrapServiceError } from "@/lib/utils"; -import { AlertCircle, ArrowUpRight, ChevronDown, RefreshCw, Unlink } from "lucide-react"; -import { ProviderIcon } from "./providerIcon"; -import { triggerAccountPermissionSync, unlinkLinkedAccountProvider } from "@/ee/features/sso/actions"; -import type { LinkedAccount } from "@/ee/features/sso/types"; - -import { LoadingButton } from "@/components/ui/loading-button"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { isServiceError } from "@/lib/utils"; -import { useRouter } from "next/navigation"; -import { useToast } from "@/components/hooks/use-toast"; -import { signIn } from "next-auth/react"; -import { Badge } from "@/components/ui/badge"; -import { useQuery } from "@tanstack/react-query"; -import { getAccountSyncStatus } from "@/app/api/(client)/client"; -import { SettingsCard } from "@/app/(app)/settings/components/settingsCard"; - -interface LinkedAccountProviderCardProps { - linkedAccount: LinkedAccount; - callbackUrl?: string; -} - -export function LinkedAccountProviderCard({ - linkedAccount, - callbackUrl, -}: LinkedAccountProviderCardProps) { - const [isDisconnecting, setIsDisconnecting] = useState(false); - const [syncJobId, setSyncJobId] = useState(null); - const router = useRouter(); - const { toast } = useToast(); - - const providerInfo = getAuthProviderInfo(linkedAccount.providerType); - const displayName = linkedAccount.displayName ?? providerInfo.displayName; - const needsAttention = linkedAccount.permissionSyncIssue !== undefined; - const issueDescription = linkedAccount.permissionSyncIssue === 'INSUFFICIENT_SCOPE' - ? 'Additional permissions are required to restore repository access.' - : 'Reconnect this account to restore repository access.'; - const reconnectLabel = linkedAccount.permissionSyncIssue === 'INSUFFICIENT_SCOPE' - ? 'Reauthorize Account' - : 'Reconnect Account'; - - const { data: syncStatusData } = useQuery({ - queryKey: ["accountSyncStatus", syncJobId], - queryFn: () => unwrapServiceError(getAccountSyncStatus(syncJobId!)), - enabled: !!syncJobId, - refetchInterval: (query) => { - const status = query.state.data?.status; - return status === 'PENDING' || status === 'IN_PROGRESS' ? 1000 : false; - }, - }); - - const syncJobStatus = syncStatusData?.status; - const isSyncing = !!syncJobId && ( - syncJobStatus === undefined || - syncJobStatus === 'PENDING' || - syncJobStatus === 'IN_PROGRESS' - ); - - useEffect(() => { - if (!syncJobId || syncJobStatus === undefined) { - return; - } - - if (syncJobStatus === 'COMPLETED') { - setSyncJobId(null); - toast({ description: `✅ Permissions refreshed for ${displayName}.` }); - router.refresh(); - } else if (syncJobStatus === 'FAILED') { - setSyncJobId(null); - toast({ - description: `❌ Failed to refresh permissions for ${displayName}. Please try again.`, - variant: "destructive", - }); - router.refresh(); - } - }, [syncJobId, syncJobStatus, displayName, toast, router]); - - const handleConnect = () => { - signIn(linkedAccount.providerId, { redirectTo: callbackUrl ?? window.location.href }); - }; - - const handleDisconnect = async () => { - setIsDisconnecting(true); - try { - const result = await unlinkLinkedAccountProvider(linkedAccount.providerId); - if (isServiceError(result)) { - toast({ - description: `❌ Failed to disconnect ${displayName}. ${result.message}`, - variant: "destructive", - }); - return; - } - toast({ description: `✅ ${displayName} disconnected.` }); - router.refresh(); - } catch (error) { - toast({ - description: `❌ Failed to disconnect. ${error instanceof Error ? error.message : "Unknown error"}`, - variant: "destructive", - }); - } finally { - setIsDisconnecting(false); - } - }; - - const handleRefreshPermissions = async () => { - if (!linkedAccount.accountId) { - return; - } - try { - const result = await triggerAccountPermissionSync(linkedAccount.accountId); - if (isServiceError(result)) { - toast({ - description: `❌ Failed to refresh permissions. ${result.message}`, - variant: "destructive", - }); - return; - } - setSyncJobId(result.jobId); - } catch (error) { - toast({ - description: `❌ Failed to refresh permissions. ${error instanceof Error ? error.message : "Unknown error"}`, - variant: "destructive", - }); - } - }; - - const isBusy = isDisconnecting || isSyncing; - - return ( - -
-
- -
-
- {displayName} - {linkedAccount.required && ( - Required - )} -
- {linkedAccount.isLinked && linkedAccount.providerAccountId && ( - - {linkedAccount.providerAccountId} - - )} - {needsAttention && ( - - - {issueDescription} - - )} -
-
- -
- {linkedAccount.isLinked ? ( - - - - {!isBusy && ( - - )} - {isDisconnecting - ? "Disconnecting..." - : isSyncing - ? "Syncing..." - : needsAttention - ? "Needs attention" - : "Connected"} - - - - - {needsAttention && ( - - - {reconnectLabel} - - )} - {!needsAttention && - linkedAccount.supportsPermissionSync && - linkedAccount.accountId && ( - - - Refresh Permissions - - )} - - - Disconnect... - - - - - ) : ( - - Connect - - - )} -
-
-
- ); -} diff --git a/packages/web/src/ee/features/sso/components/providerIcon.tsx b/packages/web/src/ee/features/sso/components/providerIcon.tsx deleted file mode 100644 index fa4394738..000000000 --- a/packages/web/src/ee/features/sso/components/providerIcon.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import Image from "next/image"; -import { ShieldCheck } from "lucide-react"; - -interface ProviderIconProps { - icon?: { - src: string; - className?: string; - } | null; - displayName: string; - size?: "sm" | "md" | "lg"; -} - -const sizeClasses = { - sm: { - container: "h-8 w-8", - icon: "h-4 w-4" - }, - md: { - container: "h-10 w-10", - icon: "h-5 w-5" - }, - lg: { - container: "h-12 w-12", - icon: "h-6 w-6" - } -}; - -const sizeDimensions = { - sm: { width: 16, height: 16 }, - md: { width: 20, height: 20 }, - lg: { width: 24, height: 24 } -}; - -export function ProviderIcon({ icon, displayName, size = "md" }: ProviderIconProps) { - const sizes = sizeClasses[size]; - const dimensions = sizeDimensions[size]; - - if (icon) { - return ( -
- {displayName} -
- ); - } - - return ( -
- -
- ); -} diff --git a/packages/web/src/ee/features/sso/sso.test.ts b/packages/web/src/ee/features/sso/sso.test.ts deleted file mode 100644 index 81fc958e7..000000000 --- a/packages/web/src/ee/features/sso/sso.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - getIdentityProviderConfigs: vi.fn(), - getTokenFromConfig: vi.fn(), -})); - -vi.mock('@/prisma', () => ({ - __unsafePrisma: {}, -})); -vi.mock('@/lib/entitlements', () => ({ - hasEntitlement: vi.fn(), -})); -vi.mock('@/features/membership/onCreateUser', () => ({ - onCreateUser: vi.fn(), -})); -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => ({ warn: vi.fn() }), - env: { AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING: 'false' }, - getIdentityProviderConfigs: mocks.getIdentityProviderConfigs, - getTokenFromConfig: mocks.getTokenFromConfig, -})); - -const { getEEIdentityProviders } = await import('./sso'); - -beforeEach(() => { - vi.clearAllMocks(); -}); - -describe('getEEIdentityProviders', () => { - test('preserves the configured Idira issuer trailing slash', async () => { - const clientId = { env: 'IDIRA_CLIENT_ID' }; - const clientSecret = { env: 'IDIRA_CLIENT_SECRET' }; - const issuerConfig = { env: 'IDIRA_ISSUER' }; - const issuer = 'https://example.id.cyberark.cloud/sourcebot/'; - - mocks.getIdentityProviderConfigs.mockResolvedValue({ - idira: { - provider: 'idira', - purpose: 'sso', - clientId, - clientSecret, - issuer: issuerConfig, - }, - }); - mocks.getTokenFromConfig.mockImplementation(async (token) => { - if (token === clientId) { - return 'client-id'; - } - if (token === clientSecret) { - return 'client-secret'; - } - if (token === issuerConfig) { - return issuer; - } - throw new Error('Unexpected token config'); - }); - - const providers = await getEEIdentityProviders(); - - expect(providers).toHaveLength(1); - expect(providers[0].issuerUrl).toBe(issuer); - expect(providers[0].__provider).toMatchObject({ issuer }); - }); -}); diff --git a/packages/web/src/ee/features/sso/sso.ts b/packages/web/src/ee/features/sso/sso.ts deleted file mode 100644 index 412fe0f28..000000000 --- a/packages/web/src/ee/features/sso/sso.ts +++ /dev/null @@ -1,530 +0,0 @@ -import type { IdentityProvider } from "@/auth"; -import { __unsafePrisma } from "@/prisma"; -import { hasEntitlement } from "@/lib/entitlements"; -import { createLogger, env, getIdentityProviderConfigs, getTokenFromConfig } from "@sourcebot/shared"; -import { OAuth2Client } from "google-auth-library"; -import type { User as AuthJsUser } from "next-auth"; -import type { Provider } from "next-auth/providers"; -import type { TokenSet } from "@auth/core/types"; -import Authentik from "next-auth/providers/authentik"; -import Bitbucket from "next-auth/providers/bitbucket"; -import Credentials from "next-auth/providers/credentials"; -import GitHub from "next-auth/providers/github"; -import Gitlab from "next-auth/providers/gitlab"; -import Google from "next-auth/providers/google"; -import Keycloak from "next-auth/providers/keycloak"; -import MicrosoftEntraID from "next-auth/providers/microsoft-entra-id"; -import Okta from "next-auth/providers/okta"; -import { onCreateUser } from "@/features/membership/onCreateUser"; - -const logger = createLogger('web-sso'); - -export const getEEIdentityProviders = async (): Promise => { - const providers: IdentityProvider[] = []; - - const identityProviders = await getIdentityProviderConfigs(); - - for (const [id, idpConfig] of Object.entries(identityProviders)) { - if (idpConfig.provider === "github") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - const baseUrl = (idpConfig.baseUrl ?? 'https://github.com').replace(/\/+$/, ''); - providers.push({ - __provider: await createGitHubProvider(id, clientId, clientSecret, baseUrl), - type: idpConfig.provider, - id, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - required: idpConfig.accountLinkingRequired ?? false, - issuerUrl: baseUrl, - }); - } - - if (idpConfig.provider === "gitlab") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - const baseUrl = (idpConfig.baseUrl ?? 'https://gitlab.com').replace(/\/+$/, ''); - providers.push({ - __provider: await createGitLabProvider(id, clientId, clientSecret, baseUrl), - id, - type: idpConfig.provider, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - required: idpConfig.accountLinkingRequired ?? false, - issuerUrl: baseUrl, - }); - } - - if (idpConfig.provider === "google") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - providers.push({ - __provider: createGoogleProvider(id, clientId, clientSecret), - id, - type: idpConfig.provider, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - issuerUrl: 'https://accounts.google.com' - }); - } - - if (idpConfig.provider === "okta") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - const issuer = (await getTokenFromConfig(idpConfig.issuer)).replace(/\/+$/, ''); - providers.push({ - __provider: createOktaProvider(id, clientId, clientSecret, issuer), - id, - type: idpConfig.provider, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - issuerUrl: issuer - }); - } - - if (idpConfig.provider === "keycloak") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - const issuer = (await getTokenFromConfig(idpConfig.issuer)).replace(/\/+$/, ''); - providers.push({ - __provider: createKeycloakProvider(id, clientId, clientSecret, issuer), - id, - type: idpConfig.provider, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - issuerUrl: issuer - }); - } - - if (idpConfig.provider === "microsoft-entra-id") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - const issuer = (await getTokenFromConfig(idpConfig.issuer)).replace(/\/+$/, ''); - providers.push({ - __provider: createMicrosoftEntraIDProvider(id, clientId, clientSecret, issuer), - id, - type: idpConfig.provider, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - issuerUrl: issuer - }); - } - - if (idpConfig.provider === "gcp-iap") { - const audience = await getTokenFromConfig(idpConfig.audience); - providers.push({ - __provider: createGCPIAPProvider(id, audience), - id, - type: idpConfig.provider, - purpose: idpConfig.purpose - }); - } - - if (idpConfig.provider === "bitbucket-cloud") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - providers.push({ - __provider: await createBitbucketCloudProvider(id, clientId, clientSecret), - id, - type: idpConfig.provider, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - required: idpConfig.accountLinkingRequired ?? false, - issuerUrl: 'https://bitbucket.org' - }); - } - - if (idpConfig.provider === "authentik") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - const issuer = (await getTokenFromConfig(idpConfig.issuer)).replace(/\/+$/, ''); - providers.push({ - __provider: createAuthentikProvider(id, clientId, clientSecret, issuer), - id, - type: idpConfig.provider, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - issuerUrl: issuer - }); - } - - if (idpConfig.provider === "jumpcloud") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - const issuer = (await getTokenFromConfig(idpConfig.issuer)).replace(/\/+$/, ''); - providers.push({ - __provider: createJumpCloudProvider(id, clientId, clientSecret, issuer), - id, - type: idpConfig.provider, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - issuerUrl: issuer - }); - } - - if (idpConfig.provider === "idira") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - const issuer = await getTokenFromConfig(idpConfig.issuer); - providers.push({ - __provider: createIdiraProvider({ - id, - clientId, - clientSecret, - issuer, - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - }), - id, - type: idpConfig.provider, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - issuerUrl: issuer, - }); - } - - if (idpConfig.provider === "bitbucket-server") { - const clientId = await getTokenFromConfig(idpConfig.clientId); - const clientSecret = await getTokenFromConfig(idpConfig.clientSecret); - const baseUrl = idpConfig.baseUrl.replace(/\/+$/, ''); - providers.push({ - __provider: await createBitbucketServerProvider(id, clientId, clientSecret, baseUrl), - id, - type: idpConfig.provider, - displayName: idpConfig.displayName, - purpose: idpConfig.purpose, - required: idpConfig.accountLinkingRequired ?? false, - issuerUrl: baseUrl - }); - } - } - - if (Object.keys(identityProviders).length === 0) { - if (env.AUTH_EE_GCP_IAP_ENABLED && env.AUTH_EE_GCP_IAP_AUDIENCE) { - providers.push({ - __provider: createGCPIAPProvider('gcp-iap', env.AUTH_EE_GCP_IAP_AUDIENCE), - type: "gcp-iap", - id: "gcp-iap", - purpose: "sso" - }); - } - } - - return providers; -} - -const createGitHubProvider = async (id: string, clientId: string, clientSecret: string, baseUrl: string) => { - return GitHub({ - id, - clientId: clientId, - clientSecret: clientSecret, - // if this is set the provider expects GHE so we need this check - ...(baseUrl !== 'https://github.com' ? { - enterprise: { baseUrl: baseUrl } - } : {}), - authorization: { - params: { - scope: [ - 'read:user', - 'user:email', - // Permission syncing requires the `repo` scope in order to fetch repositories - // for the authenticated user. - // @see: https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#list-repositories-for-the-authenticated-user - ...(env.PERMISSION_SYNC_ENABLED === 'true' && await hasEntitlement('permission-syncing') ? - ['repo'] : - [] - ), - ].join(' '), - }, - }, - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - }); -} - -const createGitLabProvider = async (id: string, clientId: string, clientSecret: string, baseUrl: string) => { - return Gitlab({ - id, - clientId: clientId, - clientSecret: clientSecret, - authorization: { - url: `${baseUrl}/oauth/authorize`, - params: { - scope: [ - "read_user", - // Permission syncing requires the `read_api` scope in order to fetch projects - // for the authenticated user and project members. - // @see: https://docs.gitlab.com/ee/api/projects.html#list-all-projects - ...(env.PERMISSION_SYNC_ENABLED === 'true' && await hasEntitlement('permission-syncing') ? - ['read_api'] : - [] - ), - ].join(' '), - }, - }, - token: { - url: `${baseUrl}/oauth/token`, - }, - userinfo: { - url: `${baseUrl}/api/v4/user`, - }, - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - }); -} - -const createGoogleProvider = (id: string, clientId: string, clientSecret: string) => { - return Google({ - id, - clientId: clientId, - clientSecret: clientSecret, - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - }); -} - -const createOktaProvider = (id: string, clientId: string, clientSecret: string, issuer: string): Provider => { - return Okta({ - id, - clientId: clientId, - clientSecret: clientSecret, - issuer: issuer, - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - }); -} - -const createKeycloakProvider = (id: string, clientId: string, clientSecret: string, issuer: string): Provider => { - return Keycloak({ - id, - clientId: clientId, - clientSecret: clientSecret, - issuer: issuer, - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - }); -} - -const createMicrosoftEntraIDProvider = (id: string, clientId: string, clientSecret: string, issuer: string): Provider => { - return MicrosoftEntraID({ - id, - clientId: clientId, - clientSecret: clientSecret, - issuer: issuer, - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - }); -} - -const createBitbucketCloudProvider = async (id: string, clientId: string, clientSecret: string): Promise => { - return Bitbucket({ - id, - name: "Bitbucket Cloud", - clientId, - clientSecret, - authorization: { - url: "https://bitbucket.org/site/oauth2/authorize", - params: { - scope: [ - "account", - "email", - ...(env.PERMISSION_SYNC_ENABLED === 'true' && await hasEntitlement('permission-syncing') ? - ['repository'] : - [] - ), - ].join(' '), - }, - }, - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - }); -} - -const createBitbucketServerProvider = async (id: string, clientId: string, clientSecret: string, baseUrl: string): Promise => { - return { - id, - name: "Bitbucket Server", - type: "oauth", - clientId, - clientSecret, - authorization: { - url: `${baseUrl}/rest/oauth2/latest/authorize`, - params: { - response_type: "code", - // @see: https://confluence.atlassian.com/bitbucketserver/bitbucket-oauth-2-0-provider-api-1108483661.html - scope: [ - "PUBLIC_REPOS", - ...(env.PERMISSION_SYNC_ENABLED === 'true' && await hasEntitlement('permission-syncing') - ? ['REPO_READ'] - : []), - ].join(' ') - }, - }, - token: { url: `${baseUrl}/rest/oauth2/latest/token` }, - // Bitbucket Server expects client credentials as body params, not Basic Auth header - client: { token_endpoint_auth_method: "client_secret_post" }, - userinfo: { - // url is required by Auth.js endpoint validation; the request function overrides the actual fetch - url: `${baseUrl}/plugins/servlet/applinks/whoami`, - async request({ tokens }: { tokens: TokenSet }) { - const accessToken = tokens.access_token; - if (!accessToken) { - throw new Error("Missing access token for Bitbucket Server userinfo request"); - } - - const whoamiRes = await fetch(`${baseUrl}/plugins/servlet/applinks/whoami`, { - headers: { Authorization: `Bearer ${accessToken}` }, - signal: AbortSignal.timeout(10_000), - }); - if (!whoamiRes.ok) { - throw new Error(`Bitbucket whoami failed (${whoamiRes.status})`); - } - - const username = (await whoamiRes.text()).trim(); - if (!username) { - throw new Error("Bitbucket whoami returned an empty username"); - } - - const profileRes = await fetch(`${baseUrl}/rest/api/1.0/users/${encodeURIComponent(username)}`, { - headers: { Authorization: `Bearer ${accessToken}` }, - signal: AbortSignal.timeout(10_000), - }); - if (!profileRes.ok) { - throw new Error(`Bitbucket profile lookup failed (${profileRes.status})`); - } - - return await profileRes.json(); - } - }, - profile(profile) { - return { - id: String(profile.id), - name: profile.displayName, - email: profile.emailAddress, - image: null, - }; - }, - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - } as Provider; -} - -export const createAuthentikProvider = (id: string, clientId: string, clientSecret: string, issuer: string): Provider => { - return Authentik({ - id, - clientId: clientId, - clientSecret: clientSecret, - issuer: issuer, - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - }); -} - -const createJumpCloudProvider = (id: string, clientId: string, clientSecret: string, issuer: string): Provider => { - return { - id, - name: "JumpCloud", - type: "oidc", - clientId: clientId, - clientSecret: clientSecret, - issuer: issuer, - checks: ["pkce", "state"], - allowDangerousEmailAccountLinking: env.AUTH_EE_ALLOW_EMAIL_ACCOUNT_LINKING === 'true', - } as Provider; -} - -type CreateIdiraProviderOptions = { - id: string; - clientId: string; - clientSecret: string; - issuer: string; - allowDangerousEmailAccountLinking: boolean; -}; - -const createIdiraProvider = ({ - id, - clientId, - clientSecret, - issuer, - allowDangerousEmailAccountLinking, -}: CreateIdiraProviderOptions): Provider => ({ - id, - name: "Idira", - type: "oidc", - clientId, - clientSecret, - issuer, - checks: ["pkce", "state"], - authorization: { - params: { - scope: "openid profile email", - }, - }, - allowDangerousEmailAccountLinking, -} as Provider); - -const createGCPIAPProvider = (id: string, audience: string): Provider => { - return Credentials({ - id, - name: "Google Cloud IAP", - credentials: {}, - authorize: async (_credentials, req) => { - try { - const iapAssertion = req.headers?.get("x-goog-iap-jwt-assertion"); - if (!iapAssertion || typeof iapAssertion !== "string") { - logger.warn("No IAP assertion found in headers"); - return null; - } - - const oauth2Client = new OAuth2Client(); - - const { pubkeys } = await oauth2Client.getIapPublicKeys(); - const ticket = await oauth2Client.verifySignedJwtWithCertsAsync( - iapAssertion, - pubkeys, - audience, - ['https://cloud.google.com/iap'] - ); - - const payload = ticket.getPayload(); - if (!payload) { - logger.warn("Invalid IAP token payload"); - return null; - } - - const email = payload.email; - const name = payload.name || payload.email; - const image = payload.picture; - - if (!email) { - logger.warn("Missing email in IAP token"); - return null; - } - - const existingUser = await __unsafePrisma.user.findUnique({ - where: { email } - }); - - if (!existingUser) { - const newUser = await __unsafePrisma.user.create({ - data: { - email, - name, - image, - } - }); - - const authJsUser: AuthJsUser = { - id: newUser.id, - email: newUser.email, - name: newUser.name, - image: newUser.image, - }; - - await onCreateUser({ user: authJsUser }); - return authJsUser; - } else { - return { - id: existingUser.id, - email: existingUser.email, - name: existingUser.name, - image: existingUser.image, - }; - } - } catch (error) { - logger.error("Error verifying IAP token:", error); - return null; - } - }, - }); -} diff --git a/packages/web/src/ee/features/sso/types.ts b/packages/web/src/ee/features/sso/types.ts deleted file mode 100644 index edad92ebd..000000000 --- a/packages/web/src/ee/features/sso/types.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { AccountPermissionSyncIssue } from "@sourcebot/db"; - -export type LinkedAccount = { - /** Provider instance id (e.g., 'github', 'gitlab-corp') — used for `signIn(provider)`. */ - providerId: string; - /** Provider type (e.g., 'github', 'gitlab') — used to pick icon / display defaults. */ - providerType: string; - /** Optional admin-supplied display name from config; overrides type-derived defaults in the UI. */ - displayName?: string; - isLinked: boolean; - // Present when isLinked = true - accountId?: string; - providerAccountId?: string; - permissionSyncIssue?: AccountPermissionSyncIssue; - // From config (only meaningful for account_linking providers) - isAccountLinkingProvider: boolean; - required: boolean; - // Permission sync - supportsPermissionSync: boolean; -}; diff --git a/packages/web/src/ee/features/sso/utils.ts b/packages/web/src/ee/features/sso/utils.ts deleted file mode 100644 index 8350aec6b..000000000 --- a/packages/web/src/ee/features/sso/utils.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { LinkedAccount } from "./types"; - -/** Returns whether any account-linking provider is not yet linked. */ -export const hasUnlinkedProviders = (accounts: readonly LinkedAccount[]): boolean => - accounts.some(account => account.isAccountLinkingProvider && !account.isLinked); - -/** Returns whether any required account-linking provider is not yet linked. */ -export const hasRequiredUnlinkedProviders = (accounts: readonly LinkedAccount[]): boolean => - accounts.some(account => account.isAccountLinkingProvider && account.required && !account.isLinked); - -/** Returns whether an unlinked optional account-linking provider has not been skipped. */ -export const hasUnskippedOptionalProviders = (accounts: readonly LinkedAccount[], skippedProviderIds: readonly string[]): boolean => - accounts.some(account => account.isAccountLinkingProvider && !account.required && !account.isLinked && !skippedProviderIds.includes(account.providerId)); - -/** Reads skipped provider IDs, treating legacy boolean cookies and invalid values as empty. */ -export const parseSkippedOptionalProviderIds = (value: string | undefined): string[] => { - if (!value) { - return []; - } - try { - const parsed: unknown = JSON.parse(value); - return Array.isArray(parsed) && parsed.every(id => typeof id === 'string') ? parsed : []; - } catch { - return []; - } -}; diff --git a/packages/web/src/emails/constants.ts b/packages/web/src/emails/constants.ts deleted file mode 100644 index 1dcbb3ef9..000000000 --- a/packages/web/src/emails/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const SOURCEBOT_LOGO_LIGHT_LARGE_URL = "https://framerusercontent.com/images/hFtwmNtuQSpgYuypFCICKr384.png"; -export const SOURCEBOT_ARROW_IMAGE_URL = "https://framerusercontent.com/images/hEk6w8i85onEQ3mrn1jhHzq8c.png"; -export const SOURCEBOT_PLACEHOLDER_AVATAR_URL = "https://framerusercontent.com/images/YW1HBfmcq7oLix1MFvLJObMv4Q.png"; diff --git a/packages/web/src/emails/emailFooter.tsx b/packages/web/src/emails/emailFooter.tsx deleted file mode 100644 index 82e16f4cc..000000000 --- a/packages/web/src/emails/emailFooter.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { - Hr, - Link, - Section, - Text, -} from '@react-email/components'; - -export const EmailFooter = () => { - return ( -
-
- - - Sourcebot.dev, - -  blazingly fast code search. - -
- ) -} \ No newline at end of file diff --git a/packages/web/src/emails/inviteUserEmail.tsx b/packages/web/src/emails/inviteUserEmail.tsx deleted file mode 100644 index fbcd0304d..000000000 --- a/packages/web/src/emails/inviteUserEmail.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import { - Body, - Button, - Column, - Container, - Head, - Heading, - Html, - Img, - Link, - Preview, - Row, - Section, - Tailwind, - Text, -} from '@react-email/components'; -import { EmailFooter } from './emailFooter'; -import { SOURCEBOT_LOGO_LIGHT_LARGE_URL, SOURCEBOT_ARROW_IMAGE_URL, SOURCEBOT_PLACEHOLDER_AVATAR_URL } from './constants'; - -interface InviteUserEmailProps { - baseUrl: string; - inviteLink: string; - host: { - email: string; - name?: string; - avatarUrl?: string; - }, - recipient: { - name?: string; - }, - orgName: string; - orgImageUrl?: string; -} - -export const InviteUserEmail = ({ - baseUrl, - host, - recipient, - orgName, - orgImageUrl, - inviteLink, -}: InviteUserEmailProps) => { - const previewText = `Join ${host.name ?? host.email} on Sourcebot`; - - return ( - - - - - {previewText} - -
- Sourcebot Logo -
- - Join {orgName} on Sourcebot - - - {`Hello${recipient.name ? ` ${recipient.name.split(' ')[0]}` : ''},`} - - - has invited you to the {orgName} organization on{' '} - Sourcebot. - -
- - - - - - invited you to - - - - - -
-
- -
- - or copy and paste this URL into your browser:{' '} - - {inviteLink} - - - -
- -
- - ); -}; - -const InvitedByText = ({ email, name }: { email: string, name?: string }) => { - const emailElement = {email}; - - if (name) { - const firstName = name.split(' ')[0]; - return {firstName} ({emailElement}); - } - - return emailElement; -} - -InviteUserEmail.PreviewProps = { - baseUrl: 'http://localhost:3000', - host: { - name: 'Alan Turing', - email: 'alan.turing@example.com', - }, - recipient: { - // name: 'alanturing', - }, - orgName: 'Enigma', - inviteLink: 'http://localhost:3000/redeem?invite_id=1234', -} satisfies InviteUserEmailProps; - -export default InviteUserEmail; \ No newline at end of file diff --git a/packages/web/src/emails/joinRequestApprovedEmail.tsx b/packages/web/src/emails/joinRequestApprovedEmail.tsx deleted file mode 100644 index f43a26320..000000000 --- a/packages/web/src/emails/joinRequestApprovedEmail.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { - Body, - Button, - Container, - Head, - Heading, - Html, - Img, - Link, - Preview, - Section, - Tailwind, - Text, -} from '@react-email/components'; -import { EmailFooter } from './emailFooter'; -import { SOURCEBOT_LOGO_LIGHT_LARGE_URL, SOURCEBOT_PLACEHOLDER_AVATAR_URL } from './constants'; - -interface JoinRequestApprovedEmailProps { - baseUrl: string; - user: { - email: string; - name?: string; - avatarUrl?: string; - }, - orgName: string; -} - -export const JoinRequestApprovedEmail = ({ - baseUrl, - user, - orgName, -}: JoinRequestApprovedEmailProps) => { - const previewText = `Your request to join ${orgName} on Sourcebot has been approved`; - const orgLink = baseUrl; - - return ( - - - - - {previewText} - -
- Sourcebot Logo -
- - Welcome to {orgName} - - - Hello{user.name ? ` ${user.name}` : ''}, - - - Your request to join {orgName} on Sourcebot has been approved. You now have access to the organization. - -
- -
- - or copy and paste this URL into your browser:{' '} - - {orgLink} - - - -
- -
- - ); -}; - -JoinRequestApprovedEmail.PreviewProps = { - baseUrl: 'https://sourcebot.example.com', - user: { - name: 'Alan Turing', - email: 'alan.turing@example.com', - avatarUrl: SOURCEBOT_PLACEHOLDER_AVATAR_URL, - }, - orgName: 'Enigma', -} satisfies JoinRequestApprovedEmailProps; - -export default JoinRequestApprovedEmail; \ No newline at end of file diff --git a/packages/web/src/emails/joinRequestSubmittedEmail.tsx b/packages/web/src/emails/joinRequestSubmittedEmail.tsx deleted file mode 100644 index b10774af1..000000000 --- a/packages/web/src/emails/joinRequestSubmittedEmail.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import { - Body, - Button, - Column, - Container, - Head, - Heading, - Html, - Img, - Link, - Preview, - Row, - Section, - Tailwind, - Text, -} from '@react-email/components'; -import { EmailFooter } from './emailFooter'; -import { SOURCEBOT_LOGO_LIGHT_LARGE_URL, SOURCEBOT_ARROW_IMAGE_URL, SOURCEBOT_PLACEHOLDER_AVATAR_URL } from './constants'; - -interface JoinRequestSubmittedEmailProps { - baseUrl: string; - requestor: { - email: string; - name?: string; - avatarUrl?: string; - }, - orgName: string; - orgImageUrl?: string; -} - -export const JoinRequestSubmittedEmail = ({ - baseUrl, - requestor, - orgName, - orgImageUrl, -}: JoinRequestSubmittedEmailProps) => { - const previewText = `${requestor.name ?? requestor.email} has requested to join ${orgName} on Sourcebot`; - const reviewLink = `${baseUrl}/settings/members?tab=requests`; - - return ( - - - - - {previewText} - -
- Sourcebot Logo -
- - New Join Request for {orgName} - - - Hello, - - - has requested to join your organization {orgName} on Sourcebot. - -
- - - Requestor avatar - - - requesting to join - - - Organization avatar - - -
-
- -
- - or copy and paste this URL into your browser:{' '} - - {reviewLink} - - - -
- -
- - ); -}; - -const RequestorInfo = ({ email, name }: { email: string, name?: string }) => { - const emailElement = {email}; - - if (name) { - return {name} ({emailElement}); - } - - return emailElement; -} - -JoinRequestSubmittedEmail.PreviewProps = { - baseUrl: 'http://localhost:3000', - requestor: { - name: 'Alan Turing', - email: 'alan.turing@example.com', - }, - orgName: 'Enigma', -} satisfies JoinRequestSubmittedEmailProps; - -export default JoinRequestSubmittedEmail; diff --git a/packages/web/src/emails/magicLinkEmail.tsx b/packages/web/src/emails/magicLinkEmail.tsx deleted file mode 100644 index 0866446f5..000000000 --- a/packages/web/src/emails/magicLinkEmail.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { - Body, - Container, - Head, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from '@react-email/components'; -import { SOURCEBOT_LOGO_LIGHT_LARGE_URL } from './constants'; - -interface MagicLinkEmailProps { - token: string, -} - -export const MagicLinkEmail = ({ - token, -}: MagicLinkEmailProps) => ( - - - Use this code {token} to log in to Sourcebot - - - -
- Sourcebot Logo -
- -
- - Use the code below to log in to Sourcebot. - -
- -
- - {token} - -
- -
- - This code is only valid for the next 10 minutes. If you didn't try to log in, - you can safely ignore this email. - -
-
- -
- -); - -MagicLinkEmail.PreviewProps = { - token: '123456', -} as MagicLinkEmailProps; - -export default MagicLinkEmail; diff --git a/packages/web/src/features/agents/review-agent/app.ts b/packages/web/src/features/agents/review-agent/app.ts deleted file mode 100644 index 043a80fad..000000000 --- a/packages/web/src/features/agents/review-agent/app.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Octokit } from "octokit"; -import { Gitlab } from "@gitbeaker/rest"; -import { generatePrReviews } from "@/features/agents/review-agent/nodes/generatePrReview"; -import { githubPushPrReviews } from "@/features/agents/review-agent/nodes/githubPushPrReviews"; -import { githubPrParser } from "@/features/agents/review-agent/nodes/githubPrParser"; -import { getReviewAgentLogDir } from "@/features/agents/review-agent/nodes/invokeDiffReviewLlm"; -import { gitlabMrParser } from "@/features/agents/review-agent/nodes/gitlabMrParser"; -import { gitlabPushMrReviews } from "@/features/agents/review-agent/nodes/gitlabPushMrReviews"; -import { GitHubPullRequest, GitLabMergeRequestPayload } from "@/features/agents/review-agent/types"; -import { env } from "@sourcebot/shared"; -import path from "path"; -import fs from "fs"; -import { createLogger } from "@sourcebot/shared"; - -const rules = [ - "Do NOT provide general feedback, summaries, explanations of changes, or praises for making good additions.", - "Do NOT provide any advice that is not actionable or directly related to the changes.", - "Do NOT provide any comments or reviews on code that you believe is good, correct, or a good addition. Your job is only to identify issues and provide feedback on how to fix them.", - "If a review for a chunk contains different reviews at different line ranges, return a separate review object for each line range.", - "Focus solely on offering specific, objective insights based on the given context and refrain from making broad comments about potential impacts on the system or question intentions behind the changes.", - "Keep comments concise and to the point. Every comment must highlight a specific issue and provide a clear and actionable solution to the developer.", - "If there are no issues found on a line range, do NOT respond with any comments. This includes comments such as \"No issues found\" or \"LGTM\"." -] - -const logger = createLogger('review-agent'); - -function getReviewAgentLogPath(identifier: string): string | undefined { - if (!env.REVIEW_AGENT_LOGGING_ENABLED) { - return undefined; - } - - const reviewAgentLogDir = getReviewAgentLogDir(); - if (!fs.existsSync(reviewAgentLogDir)) { - fs.mkdirSync(reviewAgentLogDir, { recursive: true }); - } - - const timestamp = new Date().toLocaleString('en-US', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - hour12: false - }).replace(/(\d+)\/(\d+)\/(\d+), (\d+):(\d+):(\d+)/, '$3_$1_$2_$4_$5_$6'); - const logPath = path.join(reviewAgentLogDir, `review-agent-${identifier}-${timestamp}.log`); - logger.info(`Review agent logging to ${logPath}`); - return logPath; -} - -export async function processGitHubPullRequest(octokit: Octokit, pullRequest: GitHubPullRequest) { - logger.info(`Received a pull request event for #${pullRequest.number}`); - - const reviewAgentLogPath = getReviewAgentLogPath(String(pullRequest.number)); - - const prPayload = await githubPrParser(octokit, pullRequest); - const fileDiffReviews = await generatePrReviews(reviewAgentLogPath, prPayload, rules); - await githubPushPrReviews(octokit, prPayload, fileDiffReviews); -} - -export async function processGitLabMergeRequest( - gitlabClient: InstanceType, - projectId: number, - mrPayload: GitLabMergeRequestPayload, - hostDomain: string, -) { - logger.info(`Received a merge request event for !${mrPayload.object_attributes.iid}`); - - const reviewAgentLogPath = getReviewAgentLogPath(`mr-${mrPayload.object_attributes.iid}`); - - const prPayload = await gitlabMrParser(gitlabClient, mrPayload, hostDomain); - const fileDiffReviews = await generatePrReviews(reviewAgentLogPath, prPayload, rules); - await gitlabPushMrReviews(gitlabClient, projectId, prPayload, fileDiffReviews); -} diff --git a/packages/web/src/features/agents/review-agent/lib.ts b/packages/web/src/features/agents/review-agent/lib.ts deleted file mode 100644 index 0426f38fe..000000000 --- a/packages/web/src/features/agents/review-agent/lib.ts +++ /dev/null @@ -1,13 +0,0 @@ -import path from "path"; -import { env } from "@sourcebot/shared"; -import fs from "fs"; - -export const REVIEW_AGENT_LOG_DIR = env.DATA_CACHE_DIR + "/review-agent"; - -export const appendReviewAgentLog = (logFileName: string, log: string): void => { - const resolvedPath = path.resolve(REVIEW_AGENT_LOG_DIR, logFileName); - if (!resolvedPath.startsWith(path.resolve(REVIEW_AGENT_LOG_DIR) + path.sep)) { - throw new Error(`Invalid log file path: ${logFileName}`); - } - fs.appendFileSync(resolvedPath, log); -}; \ No newline at end of file diff --git a/packages/web/src/features/agents/review-agent/nodes/fetchFileContent.ts b/packages/web/src/features/agents/review-agent/nodes/fetchFileContent.ts deleted file mode 100644 index 41e5a6e58..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/fetchFileContent.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { sourcebot_context, sourcebot_pr_payload } from "@/features/agents/review-agent/types"; -import { fileSourceResponseSchema, getFileSourceForRepo } from '@/features/git'; -import { SINGLE_TENANT_ORG_ID } from "@/lib/constants"; -import { isServiceError } from "@/lib/utils"; -import { __unsafePrisma } from "@/prisma"; -import { createLogger } from "@sourcebot/shared"; - -const logger = createLogger('fetch-file-content'); - -type Org = Awaited>; -let cachedOrg: Org | undefined; - -const getOrg = async (): Promise> => { - if (!cachedOrg) { - cachedOrg = await __unsafePrisma.org.findUnique({ - where: { id: SINGLE_TENANT_ORG_ID }, - }); - } - if (!cachedOrg) { - throw new Error("Organization not found"); - } - return cachedOrg; -}; - -export const fetchFileContent = async (pr_payload: sourcebot_pr_payload, filename: string): Promise => { - logger.debug("Executing fetch_file_content"); - - const org = await getOrg(); - - const repoPath = pr_payload.hostDomain + "/" + pr_payload.owner + "/" + pr_payload.repo; - const fileSourceRequest = { - path: filename, - repo: repoPath, - ref: pr_payload.head_sha, - }; - logger.debug(JSON.stringify(fileSourceRequest, null, 2)); - - const response = await getFileSourceForRepo(fileSourceRequest, { org, prisma: __unsafePrisma }); - if (isServiceError(response)) { - throw new Error(`Failed to fetch file content for ${filename} from ${repoPath}: ${response.message}`); - } - - const fileSourceResponse = fileSourceResponseSchema.parse(response); - const fileContent = fileSourceResponse.source; - - const fileContentContext: sourcebot_context = { - type: "file_content", - description: `The content of the file ${filename}`, - context: fileContent, - }; - - logger.debug("Completed fetch_file_content"); - return fileContentContext; -}; diff --git a/packages/web/src/features/agents/review-agent/nodes/generateDiffReviewPrompt.ts b/packages/web/src/features/agents/review-agent/nodes/generateDiffReviewPrompt.ts deleted file mode 100644 index f5eda1ca0..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/generateDiffReviewPrompt.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { sourcebot_diff, sourcebot_context, sourcebot_file_diff_review_schema } from "@/features/agents/review-agent/types"; -import { zodToJsonSchema } from "zod-to-json-schema"; -import { createLogger } from "@sourcebot/shared"; - -const logger = createLogger('generate-diff-review-prompt'); - -export const generateDiffReviewPrompt = async (diff: sourcebot_diff, context: sourcebot_context[], rules: string[]) => { - logger.debug("Executing generate_diff_review_prompt"); - - const prompt = ` - You are an expert software engineer that excels at reviewing code changes. Given the input, additional context, and rules defined below, review the code changes and provide a detailed review. The review you provide - must conform to all of the rules defined below. The output format of your review must conform to the output format defined below. - - # Input - - The input is the old and new code snippets, which represent a single hunk from a git diff. The old code snippet is the code before the changes were made, and the new code snippet is the code after the changes were made. Each code snippet - is a sequence of lines each with a line number. - - ## Old Code Snippet - - \`\`\` - ${diff.oldSnippet} - \`\`\` - - ## New Code Snippet - - \`\`\` - ${diff.newSnippet} - \`\`\` - - # Additional Context - - ${context.map(c => `${c.type}: ${c.description}\n\n${c.context}`).join("\n\n----------------------\n\n")} - - # Rules - - - ${rules.join("\n- ")} - - # Output Format (JSON Schema) - The output must be a valid JSON object that conforms to the following JSON schema. Do NOT respond with anything other than the JSON object. Do NOT respond with - the JSON object in a markdown code block. - ${JSON.stringify(zodToJsonSchema(sourcebot_file_diff_review_schema), null, 2)} - `; - - logger.debug("Completed generate_diff_review_prompt"); - return prompt; -} \ No newline at end of file diff --git a/packages/web/src/features/agents/review-agent/nodes/generatePrReview.ts b/packages/web/src/features/agents/review-agent/nodes/generatePrReview.ts deleted file mode 100644 index afea4fb5e..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/generatePrReview.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { sourcebot_pr_payload, sourcebot_diff_review, sourcebot_file_diff_review, sourcebot_context } from "@/features/agents/review-agent/types"; -import { generateDiffReviewPrompt } from "@/features/agents/review-agent/nodes/generateDiffReviewPrompt"; -import { invokeDiffReviewLlm } from "@/features/agents/review-agent/nodes/invokeDiffReviewLlm"; -import { fetchFileContent } from "@/features/agents/review-agent/nodes/fetchFileContent"; -import { createLogger } from "@sourcebot/shared"; - -const logger = createLogger('generate-pr-review'); - -export const generatePrReviews = async (reviewAgentLogFileName: string | undefined, pr_payload: sourcebot_pr_payload, rules: string[]): Promise => { - logger.debug("Executing generate_pr_reviews"); - - const file_diff_reviews: sourcebot_file_diff_review[] = []; - for (const file_diff of pr_payload.file_diffs) { - const reviews: sourcebot_diff_review[] = []; - - for (const diff of file_diff.diffs) { - try { - const fileContentContext = await fetchFileContent(pr_payload, file_diff.to); - const context: sourcebot_context[] = [ - { - type: "pr_title", - description: "The title of the pull request", - context: pr_payload.title, - }, - { - type: "pr_description", - description: "The description of the pull request", - context: pr_payload.description, - }, - fileContentContext, - ]; - - const prompt = await generateDiffReviewPrompt(diff, context, rules); - - const diffReview = await invokeDiffReviewLlm(reviewAgentLogFileName, prompt); - reviews.push(...diffReview.reviews); - } catch (error) { - logger.error(`Error generating review for ${file_diff.to}: ${error}`); - } - } - - if (reviews.length > 0) { - file_diff_reviews.push({ - filename: file_diff.to, - oldFilename: file_diff.from, - reviews: reviews, - }); - } - } - - logger.debug("Completed generate_pr_reviews"); - return file_diff_reviews; -} \ No newline at end of file diff --git a/packages/web/src/features/agents/review-agent/nodes/githubPrParser.test.ts b/packages/web/src/features/agents/review-agent/nodes/githubPrParser.test.ts deleted file mode 100644 index e8a9b6729..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/githubPrParser.test.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { expect, test, vi, describe } from 'vitest'; -import { Octokit } from 'octokit'; -import { githubPrParser } from './githubPrParser'; -import { GitHubPullRequest } from '../types'; - -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => ({ - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})); - -// Minimal shape satisfying the fields accessed by githubPrParser -function makePullRequest(overrides: Partial<{ - number: number; - title: string; - body: string | null; - head_sha: string; - owner: string; - repo: string; - diff_url: string; -}> = {}): GitHubPullRequest { - const opts = { - number: 7, - title: 'My PR title', - body: 'My PR description', - head_sha: 'sha_abc123', - owner: 'my-org', - repo: 'my-repo', - diff_url: 'https://github.com/my-org/my-repo/pull/7.diff', - ...overrides, - }; - - return { - number: opts.number, - title: opts.title, - body: opts.body, - diff_url: opts.diff_url, - head: { sha: opts.head_sha, repo: {} }, - base: { - repo: { - name: opts.repo, - owner: { login: opts.owner }, - }, - }, - } as unknown as GitHubPullRequest; -} - -function makeMockOctokit(diffText: string) { - return { - request: vi.fn().mockResolvedValue({ data: diffText }), - } as unknown as Octokit; -} - -describe('githubPrParser', () => { - test('maps pull request metadata correctly', async () => { - const octokit = makeMockOctokit(''); - const pr = makePullRequest(); - - const result = await githubPrParser(octokit, pr); - - expect(result.title).toBe('My PR title'); - expect(result.description).toBe('My PR description'); - expect(result.number).toBe(7); - expect(result.head_sha).toBe('sha_abc123'); - expect(result.owner).toBe('my-org'); - expect(result.repo).toBe('my-repo'); - expect(result.hostDomain).toBe('github.com'); - }); - - test('uses empty string when body is null', async () => { - const octokit = makeMockOctokit(''); - const pr = makePullRequest({ body: null }); - - const result = await githubPrParser(octokit, pr); - - expect(result.description).toBe(''); - }); - -test('fetches diff using the GitHub pulls API with diff accept header', async () => { - const mockRequest = vi.fn().mockResolvedValue({ data: '' }); - const octokit = { request: mockRequest } as unknown as Octokit; - const pr = makePullRequest({ - owner: 'my-org', - repo: 'my-repo', - number: 7, - diff_url: 'https://github.com/my-org/my-repo/pull/7.diff', - }); - - await githubPrParser(octokit, pr); - - expect(mockRequest).toHaveBeenCalledWith( - 'GET /repos/{owner}/{repo}/pulls/{pull_number}', - { - owner: 'my-org', - repo: 'my-repo', - pull_number: 7, - headers: { - accept: 'application/vnd.github.diff', - }, - } - ); -}); - - test('returns empty file_diffs for an empty diff', async () => { - const octokit = makeMockOctokit(''); - const pr = makePullRequest(); - - const result = await githubPrParser(octokit, pr); - - expect(result.file_diffs).toEqual([]); - }); - - test('parses a unified diff with added and context lines', async () => { - const unifiedDiff = [ - 'diff --git a/src/foo.ts b/src/foo.ts', - '--- a/src/foo.ts', - '+++ b/src/foo.ts', - '@@ -1,2 +1,3 @@', - ' context line', - '+added line', - ' another context', - ].join('\n'); - const octokit = makeMockOctokit(unifiedDiff); - const pr = makePullRequest(); - - const result = await githubPrParser(octokit, pr); - - expect(result.file_diffs).toHaveLength(1); - expect(result.file_diffs[0].from).toBe('src/foo.ts'); - expect(result.file_diffs[0].to).toBe('src/foo.ts'); - expect(result.file_diffs[0].diffs).toHaveLength(1); - }); - - test('newSnippet contains added lines and context', async () => { - const unifiedDiff = [ - 'diff --git a/src/foo.ts b/src/foo.ts', - '--- a/src/foo.ts', - '+++ b/src/foo.ts', - '@@ -1,1 +1,2 @@', - ' context', - '+new line here', - ].join('\n'); - const octokit = makeMockOctokit(unifiedDiff); - const pr = makePullRequest(); - - const result = await githubPrParser(octokit, pr); - const diff = result.file_diffs[0].diffs[0]; - - expect(diff.newSnippet).toContain('+new line here'); - expect(diff.oldSnippet).not.toContain('+new line here'); - }); - - test('oldSnippet contains deleted lines', async () => { - const unifiedDiff = [ - 'diff --git a/src/foo.ts b/src/foo.ts', - '--- a/src/foo.ts', - '+++ b/src/foo.ts', - '@@ -1,2 +1,1 @@', - ' context', - '-removed line', - ].join('\n'); - const octokit = makeMockOctokit(unifiedDiff); - const pr = makePullRequest(); - - const result = await githubPrParser(octokit, pr); - const diff = result.file_diffs[0].diffs[0]; - - expect(diff.oldSnippet).toContain('-removed line'); - expect(diff.newSnippet).not.toContain('-removed line'); - }); - - test('parses multiple files from a diff', async () => { - const unifiedDiff = [ - 'diff --git a/src/a.ts b/src/a.ts', - '--- a/src/a.ts', - '+++ b/src/a.ts', - '@@ -1,1 +1,2 @@', - ' ctx', - '+add', - 'diff --git a/src/b.ts b/src/b.ts', - '--- a/src/b.ts', - '+++ b/src/b.ts', - '@@ -1,2 +1,1 @@', - ' ctx', - '-remove', - ].join('\n'); - const octokit = makeMockOctokit(unifiedDiff); - const pr = makePullRequest(); - - const result = await githubPrParser(octokit, pr); - - expect(result.file_diffs).toHaveLength(2); - expect(result.file_diffs[0].to).toBe('src/a.ts'); - expect(result.file_diffs[1].to).toBe('src/b.ts'); - }); - - test('throws when the diff request fails', async () => { - const octokit = { - request: vi.fn().mockRejectedValue(new Error('Network error')), - } as unknown as Octokit; - const pr = makePullRequest(); - - await expect(githubPrParser(octokit, pr)).rejects.toThrow('Network error'); - }); -}); diff --git a/packages/web/src/features/agents/review-agent/nodes/githubPrParser.ts b/packages/web/src/features/agents/review-agent/nodes/githubPrParser.ts deleted file mode 100644 index c5549b65b..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/githubPrParser.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { sourcebot_pr_payload, sourcebot_file_diff, sourcebot_diff } from "@/features/agents/review-agent/types"; -import parse from "parse-diff"; -import { Octokit } from "octokit"; -import { GitHubPullRequest } from "@/features/agents/review-agent/types"; -import { createLogger } from "@sourcebot/shared"; - -const logger = createLogger('github-pr-parser'); - -export const githubPrParser = async (octokit: Octokit, pullRequest: GitHubPullRequest): Promise => { - logger.debug("Executing github_pr_parser"); - - let parsedDiff: parse.File[] = []; - try { - const { owner, name: repo } = pullRequest.base.repo; - const pullNumber = pullRequest.number; - - const diff = await octokit.request("GET /repos/{owner}/{repo}/pulls/{pull_number}", { - owner: owner.login, - repo, - pull_number: pullNumber, - headers: { - accept: "application/vnd.github.diff", - }, - }); - - parsedDiff = parse(diff.data as unknown as string); -} catch (error) { - logger.error("Error fetching diff: ", error); - throw error; -} - - const sourcebotFileDiffs: (sourcebot_file_diff | null)[] = parsedDiff.map((file) => { - if (!file.from || !file.to) { - logger.debug(`Skipping file due to missing from (${file.from}) or to (${file.to})`) - return null; - } - - const diffs: sourcebot_diff[] = file.chunks.map((chunk) => { - let oldSnippet = `@@ -${chunk.oldStart},${chunk.oldLines} +${chunk.newStart},${chunk.newLines} @@\n`; - let newSnippet = `@@ -${chunk.oldStart},${chunk.oldLines} +${chunk.newStart},${chunk.newLines} @@\n`; - - for (const change of chunk.changes) { - if (change.type === "normal") { - oldSnippet += change.ln1 + ":" + change.content + "\n"; - newSnippet += change.ln2 + ":" + change.content + "\n"; - } else if (change.type === "add") { - newSnippet += change.ln + ":" + change.content + "\n"; - } else if (change.type === "del") { - oldSnippet += change.ln + ":" + change.content + "\n"; - } - } - - return { - oldSnippet: oldSnippet, - newSnippet: newSnippet, - } - }); - - return { - from: file.from, - to: file.to, - diffs: diffs, - } - }); - const filteredSourcebotFileDiffs: sourcebot_file_diff[] = sourcebotFileDiffs.filter((file) => file !== null) as sourcebot_file_diff[]; - - logger.debug("Completed github_pr_parser"); - return { - title: pullRequest.title, - description: pullRequest.body ?? "", - hostDomain: "github.com", - owner: pullRequest.base.repo.owner.login, - repo: pullRequest.base.repo.name, - file_diffs: filteredSourcebotFileDiffs, - number: pullRequest.number, - head_sha: pullRequest.head.sha - } -} diff --git a/packages/web/src/features/agents/review-agent/nodes/githubPushPrReviews.test.ts b/packages/web/src/features/agents/review-agent/nodes/githubPushPrReviews.test.ts deleted file mode 100644 index 153263a70..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/githubPushPrReviews.test.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { expect, test, vi, describe } from 'vitest'; -import { Octokit } from 'octokit'; -import { githubPushPrReviews } from './githubPushPrReviews'; -import { sourcebot_pr_payload, sourcebot_file_diff_review } from '../types'; - -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => ({ - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})); - -const MOCK_PAYLOAD: sourcebot_pr_payload = { - title: 'Test PR', - description: 'desc', - hostDomain: 'github.com', - owner: 'my-org', - repo: 'my-repo', - file_diffs: [], - number: 7, - head_sha: 'sha_abc123', -}; - -const SINGLE_REVIEW: sourcebot_file_diff_review[] = [ - { - filename: 'src/foo.ts', - reviews: [{ line_start: 10, line_end: 10, review: 'Missing null check' }], - }, -]; - -function makeMockOctokit(createReviewCommentResult: 'resolve' | 'reject' = 'resolve') { - return { - rest: { - pulls: { - createReviewComment: createReviewCommentResult === 'resolve' - ? vi.fn().mockResolvedValue({}) - : vi.fn().mockRejectedValue(new Error('Unprocessable Entity')), - }, - }, - } as unknown as Octokit; -} - -describe('githubPushPrReviews', () => { - test('posts a review comment for each review', async () => { - const octokit = makeMockOctokit(); - - await githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW); - - expect(octokit.rest.pulls.createReviewComment).toHaveBeenCalledOnce(); - expect(octokit.rest.pulls.createReviewComment).toHaveBeenCalledWith( - expect.objectContaining({ - owner: 'my-org', - repo: 'my-repo', - pull_number: 7, - commit_id: 'sha_abc123', - body: 'Missing null check', - path: 'src/foo.ts', - side: 'RIGHT', - line: 10, - }), - ); - }); - - test('uses line for a single-line review', async () => { - const octokit = makeMockOctokit(); - - await githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW); - - const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0]; - expect(call).toHaveProperty('line', 10); - expect(call).not.toHaveProperty('start_line'); - }); - - test('uses start_line and line for a multi-line review', async () => { - const multiLineReviews: sourcebot_file_diff_review[] = [ - { - filename: 'src/bar.ts', - reviews: [{ line_start: 5, line_end: 15, review: 'Refactor this block' }], - }, - ]; - const octokit = makeMockOctokit(); - - await githubPushPrReviews(octokit, MOCK_PAYLOAD, multiLineReviews); - - const call = vi.mocked(octokit.rest.pulls.createReviewComment).mock.calls[0][0]; - expect(call).toHaveProperty('start_line', 5); - expect(call).toHaveProperty('line', 15); - expect(call).toHaveProperty('start_side', 'RIGHT'); - }); - - test('posts multiple reviews across multiple files', async () => { - const multiFileReviews: sourcebot_file_diff_review[] = [ - { - filename: 'src/a.ts', - reviews: [ - { line_start: 1, line_end: 1, review: 'Comment A1' }, - { line_start: 5, line_end: 5, review: 'Comment A2' }, - ], - }, - { - filename: 'src/b.ts', - reviews: [{ line_start: 3, line_end: 3, review: 'Comment B1' }], - }, - ]; - const octokit = makeMockOctokit(); - - await githubPushPrReviews(octokit, MOCK_PAYLOAD, multiFileReviews); - - expect(octokit.rest.pulls.createReviewComment).toHaveBeenCalledTimes(3); - }); - - test('continues posting remaining reviews when one fails', async () => { - const twoReviews: sourcebot_file_diff_review[] = [ - { - filename: 'src/foo.ts', - reviews: [ - { line_start: 1, line_end: 1, review: 'First' }, - { line_start: 2, line_end: 2, review: 'Second' }, - ], - }, - ]; - const mockCreate = vi.fn() - .mockRejectedValueOnce(new Error('422')) - .mockResolvedValueOnce({}); - const octokit = { rest: { pulls: { createReviewComment: mockCreate } } } as unknown as Octokit; - - await githubPushPrReviews(octokit, MOCK_PAYLOAD, twoReviews); - - expect(mockCreate).toHaveBeenCalledTimes(2); - }); - - test('does not throw when all review comments fail', async () => { - const octokit = makeMockOctokit('reject'); - - await expect( - githubPushPrReviews(octokit, MOCK_PAYLOAD, SINGLE_REVIEW), - ).resolves.toBeUndefined(); - }); - - test('does nothing when file_diff_reviews is empty', async () => { - const octokit = makeMockOctokit(); - - await githubPushPrReviews(octokit, MOCK_PAYLOAD, []); - - expect(octokit.rest.pulls.createReviewComment).not.toHaveBeenCalled(); - }); -}); diff --git a/packages/web/src/features/agents/review-agent/nodes/githubPushPrReviews.ts b/packages/web/src/features/agents/review-agent/nodes/githubPushPrReviews.ts deleted file mode 100644 index a6ef88d2b..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/githubPushPrReviews.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Octokit } from "octokit"; -import { sourcebot_pr_payload, sourcebot_file_diff_review } from "@/features/agents/review-agent/types"; -import { createLogger } from "@sourcebot/shared"; - -const logger = createLogger('github-push-pr-reviews'); - -export const githubPushPrReviews = async (octokit: Octokit, pr_payload: sourcebot_pr_payload, file_diff_reviews: sourcebot_file_diff_review[]) => { - logger.info("Executing github_push_pr_reviews"); - - try { - for (const file_diff_review of file_diff_reviews) { - for (const review of file_diff_review.reviews) { - try { - await octokit.rest.pulls.createReviewComment({ - owner: pr_payload.owner, - repo: pr_payload.repo, - pull_number: pr_payload.number, - body: review.review, - path: file_diff_review.filename, - commit_id: pr_payload.head_sha, - side: "RIGHT", - ...(review.line_start === review.line_end - ? { line: review.line_start } - : { - start_line: review.line_start, - line: review.line_end, - start_side: "RIGHT", - }), - }); - } catch (error) { - logger.error(`Error pushing pr reviews for ${file_diff_review.filename}: ${error}`); - } - } - } - } catch (error) { - logger.error(`Error pushing pr reviews: ${error}`); - } - - logger.info("Completed github_push_pr_reviews"); -} \ No newline at end of file diff --git a/packages/web/src/features/agents/review-agent/nodes/gitlabMrParser.test.ts b/packages/web/src/features/agents/review-agent/nodes/gitlabMrParser.test.ts deleted file mode 100644 index e52fbe820..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/gitlabMrParser.test.ts +++ /dev/null @@ -1,258 +0,0 @@ -import { expect, test, vi, describe } from 'vitest'; -import { Gitlab } from '@gitbeaker/rest'; -import { gitlabMrParser } from './gitlabMrParser'; -import { GitLabMergeRequestPayload } from '../types'; - -type GitlabClient = InstanceType; - -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => ({ - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})); - -const MOCK_MR_PAYLOAD: GitLabMergeRequestPayload = { - object_kind: 'merge_request', - object_attributes: { - iid: 42, - title: 'My MR title', - description: 'My MR description', - action: 'open', - last_commit: { id: 'abc123def456' }, - diff_refs: { - base_sha: 'base_sha_value', - head_sha: 'head_sha_value', - start_sha: 'start_sha_value', - }, - }, - project: { - id: 101, - name: 'my-repo', - path_with_namespace: 'my-group/my-repo', - web_url: 'https://gitlab.com/my-group/my-repo', - namespace: 'my-group', - }, -}; - -const MOCK_MR_API_RESPONSE = { - title: 'My MR title', - description: 'My MR description', - sha: 'abc123def456', - diff_refs: { - base_sha: 'base_sha_value', - head_sha: 'head_sha_value', - start_sha: 'start_sha_value', - }, -}; - -type MockMrApiResponseOverrides = Omit, 'description'> & { - description?: string | null; -}; - -function makeMockGitlabClient(allDiffsResult: unknown, mrOverrides: MockMrApiResponseOverrides = {}) { - return { - MergeRequests: { - show: vi.fn().mockResolvedValue({ ...MOCK_MR_API_RESPONSE, ...mrOverrides }), - allDiffs: vi.fn().mockResolvedValue(allDiffsResult), - }, - } as unknown as GitlabClient; -} - -describe('gitlabMrParser', () => { - test('maps MR payload metadata correctly to sourcebot_pr_payload', async () => { - const client = makeMockGitlabClient([]); - - const result = await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com'); - - expect(result.title).toBe('My MR title'); - expect(result.description).toBe('My MR description'); - expect(result.number).toBe(42); - expect(result.head_sha).toBe('abc123def456'); - expect(result.hostDomain).toBe('gitlab.com'); - expect(result.owner).toBe('my-group'); - expect(result.repo).toBe('my-repo'); - }); - - test('maps diff_refs from payload', async () => { - const client = makeMockGitlabClient([]); - - const result = await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com'); - - expect(result.diff_refs).toEqual({ - base_sha: 'base_sha_value', - head_sha: 'head_sha_value', - start_sha: 'start_sha_value', - }); - }); - - test('uses custom hostDomain', async () => { - const client = makeMockGitlabClient([]); - - const result = await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.example.com'); - - expect(result.hostDomain).toBe('gitlab.example.com'); - }); - - test('uses empty string when description is null', async () => { - const client = makeMockGitlabClient([], { description: null }); - - const result = await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com'); - - expect(result.description).toBe(''); - }); - - test('calls show and allDiffs with the correct project id and MR iid', async () => { - const mockShow = vi.fn().mockResolvedValue(MOCK_MR_API_RESPONSE); - const mockAllDiffs = vi.fn().mockResolvedValue([]); - const client = { MergeRequests: { show: mockShow, allDiffs: mockAllDiffs } } as unknown as GitlabClient; - - await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com'); - - expect(mockShow).toHaveBeenCalledWith(101, 42); - expect(mockAllDiffs).toHaveBeenCalledWith(101, 42); - }); - - test('returns empty file_diffs when allDiffs returns no files', async () => { - const client = makeMockGitlabClient([]); - - const result = await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com'); - - expect(result.file_diffs).toEqual([]); - }); - - test('parses a file diff with added and context lines', async () => { - const client = makeMockGitlabClient([ - { - old_path: 'src/foo.ts', - new_path: 'src/foo.ts', - diff: '@@ -1,2 +1,3 @@\n context line\n+added line\n', - new_file: false, - renamed_file: false, - deleted_file: false, - a_mode: '100644', - b_mode: '100644', - }, - ]); - - const result = await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com'); - - expect(result.file_diffs).toHaveLength(1); - expect(result.file_diffs[0].from).toBe('src/foo.ts'); - expect(result.file_diffs[0].to).toBe('src/foo.ts'); - expect(result.file_diffs[0].diffs).toHaveLength(1); - }); - - test('diff newSnippet contains added lines', async () => { - const client = makeMockGitlabClient([ - { - old_path: 'src/foo.ts', - new_path: 'src/foo.ts', - diff: '@@ -1,1 +1,2 @@\n context\n+added line\n', - new_file: false, - renamed_file: false, - deleted_file: false, - a_mode: '100644', - b_mode: '100644', - }, - ]); - - const result = await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com'); - const diff = result.file_diffs[0].diffs[0]; - - expect(diff.newSnippet).toContain('+added line'); - expect(diff.oldSnippet).not.toContain('+added line'); - }); - - test('diff oldSnippet contains deleted lines', async () => { - const client = makeMockGitlabClient([ - { - old_path: 'src/foo.ts', - new_path: 'src/foo.ts', - diff: '@@ -1,2 +1,1 @@\n context\n-removed line\n', - new_file: false, - renamed_file: false, - deleted_file: false, - a_mode: '100644', - b_mode: '100644', - }, - ]); - - const result = await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com'); - const diff = result.file_diffs[0].diffs[0]; - - expect(diff.oldSnippet).toContain('-removed line'); - expect(diff.newSnippet).not.toContain('-removed line'); - }); - - test('skips files with empty diff strings', async () => { - const client = makeMockGitlabClient([ - { - old_path: 'binary.png', - new_path: 'binary.png', - diff: '', - new_file: false, - renamed_file: false, - deleted_file: false, - a_mode: '100644', - b_mode: '100644', - }, - ]); - - const result = await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com'); - - expect(result.file_diffs).toHaveLength(0); - }); - - test('handles multiple files in allDiffs response', async () => { - const client = makeMockGitlabClient([ - { - old_path: 'src/a.ts', - new_path: 'src/a.ts', - diff: '@@ -1,1 +1,2 @@\n ctx\n+add\n', - new_file: false, renamed_file: false, deleted_file: false, a_mode: '100644', b_mode: '100644', - }, - { - old_path: 'src/b.ts', - new_path: 'src/b.ts', - diff: '@@ -1,2 +1,1 @@\n ctx\n-remove\n', - new_file: false, renamed_file: false, deleted_file: false, a_mode: '100644', b_mode: '100644', - }, - ]); - - const result = await gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com'); - - expect(result.file_diffs).toHaveLength(2); - expect(result.file_diffs[0].to).toBe('src/a.ts'); - expect(result.file_diffs[1].to).toBe('src/b.ts'); - }); - - test('extracts owner from path_with_namespace with nested groups', async () => { - const client = makeMockGitlabClient([]); - const payload = { - ...MOCK_MR_PAYLOAD, - project: { - ...MOCK_MR_PAYLOAD.project, - path_with_namespace: 'top-group/sub-group/my-repo', - }, - }; - - const result = await gitlabMrParser(client, payload, 'gitlab.com'); - - expect(result.owner).toBe('top-group/sub-group'); - expect(result.repo).toBe('my-repo'); - }); - - test('throws when an API call fails', async () => { - const client = { - MergeRequests: { - show: vi.fn().mockResolvedValue(MOCK_MR_API_RESPONSE), - allDiffs: vi.fn().mockRejectedValue(new Error('Network error')), - }, - } as unknown as GitlabClient; - - await expect(gitlabMrParser(client, MOCK_MR_PAYLOAD, 'gitlab.com')).rejects.toThrow('Network error'); - }); -}); diff --git a/packages/web/src/features/agents/review-agent/nodes/gitlabMrParser.ts b/packages/web/src/features/agents/review-agent/nodes/gitlabMrParser.ts deleted file mode 100644 index 61b068a1c..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/gitlabMrParser.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { sourcebot_pr_payload, sourcebot_file_diff, sourcebot_diff } from "@/features/agents/review-agent/types"; -import { GitLabMergeRequestPayload } from "@/features/agents/review-agent/types"; -import parse from "parse-diff"; -import { Gitlab } from "@gitbeaker/rest"; -import { createLogger } from "@sourcebot/shared"; - -const logger = createLogger('gitlab-mr-parser'); - -export const gitlabMrParser = async ( - gitlabClient: InstanceType, - mrPayload: GitLabMergeRequestPayload, - hostDomain: string, -): Promise => { - logger.debug("Executing gitlab_mr_parser"); - - const projectId = mrPayload.project.id; - const mrIid = mrPayload.object_attributes.iid; - - // Fetch the full MR from the API to guarantee diff_refs and last_commit are present. - // The webhook payload omits or nulls diff_refs on some action types (e.g. "update"). - let mr: Awaited>; - let fileDiffs: Awaited> = []; - try { - [mr, fileDiffs] = await Promise.all([ - gitlabClient.MergeRequests.show(projectId, mrIid), - gitlabClient.MergeRequests.allDiffs(projectId, mrIid), - ]); - } catch (error) { - logger.error("Error fetching MR data: ", error); - throw error; - } - - const pathParts = mrPayload.project.path_with_namespace.split('/'); - const namespace = pathParts.slice(0, -1).join('/'); - const repoName = pathParts[pathParts.length - 1]; - - const sourcebotFileDiffs: (sourcebot_file_diff | null)[] = fileDiffs.map((fileDiff) => { - const fromPath = fileDiff.old_path as string; - const toPath = fileDiff.new_path as string; - - if (!fromPath || !toPath) { - logger.debug(`Skipping file due to missing old_path (${fromPath}) or new_path (${toPath})`); - return null; - } - - if (!fileDiff.diff) { - logger.debug(`Skipping file ${toPath} due to empty diff`); - return null; - } - - // Construct a standard unified diff header so parse-diff can process it - const unifiedDiff = `--- a/${fromPath}\n+++ b/${toPath}\n${fileDiff.diff}`; - const parsed = parse(unifiedDiff); - if (parsed.length === 0) { - return null; - } - - const parsedFile = parsed[0]; - const diffs: sourcebot_diff[] = parsedFile.chunks.map((chunk) => { - let oldSnippet = `@@ -${chunk.oldStart},${chunk.oldLines} +${chunk.newStart},${chunk.newLines} @@\n`; - let newSnippet = `@@ -${chunk.oldStart},${chunk.oldLines} +${chunk.newStart},${chunk.newLines} @@\n`; - - for (const change of chunk.changes) { - if (change.type === "normal") { - oldSnippet += change.ln1 + ":" + change.content + "\n"; - newSnippet += change.ln2 + ":" + change.content + "\n"; - } else if (change.type === "add") { - newSnippet += change.ln + ":" + change.content + "\n"; - } else if (change.type === "del") { - oldSnippet += change.ln + ":" + change.content + "\n"; - } - } - - return { - oldSnippet, - newSnippet, - }; - }); - - return { - from: fromPath, - to: toPath, - diffs, - }; - }); - - const filteredSourcebotFileDiffs: sourcebot_file_diff[] = sourcebotFileDiffs.filter( - (file): file is sourcebot_file_diff => file !== null, - ); - - logger.debug("Completed gitlab_mr_parser"); - return { - title: mr.title, - description: mr.description ?? "", - hostDomain, - owner: namespace, - repo: repoName, - file_diffs: filteredSourcebotFileDiffs, - number: mrIid, - head_sha: mr.sha ?? mrPayload.object_attributes.last_commit.id, - diff_refs: mr.diff_refs != null - ? mr.diff_refs as { base_sha: string; head_sha: string; start_sha: string } - : undefined, - }; -}; diff --git a/packages/web/src/features/agents/review-agent/nodes/gitlabPushMrReviews.test.ts b/packages/web/src/features/agents/review-agent/nodes/gitlabPushMrReviews.test.ts deleted file mode 100644 index 9e8ceafd8..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/gitlabPushMrReviews.test.ts +++ /dev/null @@ -1,329 +0,0 @@ -import { expect, test, vi, describe } from 'vitest'; -import { Gitlab } from '@gitbeaker/rest'; -import { gitlabPushMrReviews } from './gitlabPushMrReviews'; -import { sourcebot_pr_payload, sourcebot_file_diff_review } from '../types'; - -type GitlabClient = InstanceType; - -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => ({ - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})); - -const MOCK_PAYLOAD: sourcebot_pr_payload = { - title: 'Test MR', - description: 'desc', - hostDomain: 'gitlab.com', - owner: 'my-group', - repo: 'my-repo', - file_diffs: [], - number: 42, - head_sha: 'head_sha_value', - diff_refs: { - base_sha: 'base_sha_value', - head_sha: 'head_sha_value', - start_sha: 'start_sha_value', - }, -}; - -const SINGLE_REVIEW: sourcebot_file_diff_review[] = [ - { - filename: 'src/foo.ts', - reviews: [{ line_start: 5, line_end: 5, review: 'Avoid this pattern' }], - }, -]; - -function makeMockClient(discussionResult: 'resolve' | 'reject' = 'resolve') { - return { - MergeRequestDiscussions: { - create: discussionResult === 'resolve' - ? vi.fn().mockResolvedValue({}) - : vi.fn().mockRejectedValue(new Error('400 Bad Request')), - }, - MergeRequestNotes: { - create: vi.fn().mockResolvedValue({}), - }, - } as unknown as GitlabClient; -} - -describe('gitlabPushMrReviews', () => { - test('posts an inline discussion for each review', async () => { - const client = makeMockClient(); - - await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW); - - expect(client.MergeRequestDiscussions.create).toHaveBeenCalledOnce(); - expect(client.MergeRequestDiscussions.create).toHaveBeenCalledWith( - 101, - 42, - 'Avoid this pattern', - expect.objectContaining({ - position: expect.objectContaining({ - positionType: 'text', - baseSha: 'base_sha_value', - headSha: 'head_sha_value', - startSha: 'start_sha_value', - oldPath: 'src/foo.ts', - newPath: 'src/foo.ts', - newLine: '5', - }), - }), - ); - }); - - test('does not post a fallback note when inline comment succeeds', async () => { - const client = makeMockClient('resolve'); - - await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW); - - expect(client.MergeRequestNotes.create).not.toHaveBeenCalled(); - }); - - test('falls back to MR note when inline discussion create fails', async () => { - const client = makeMockClient('reject'); - - await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW); - - expect(client.MergeRequestNotes.create).toHaveBeenCalledOnce(); - expect(client.MergeRequestNotes.create).toHaveBeenCalledWith( - 101, - 42, - expect.stringContaining('Avoid this pattern'), - ); - }); - - test('fallback note body includes the filename', async () => { - const client = makeMockClient('reject'); - - await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW); - - const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string; - expect(noteBody).toContain('src/foo.ts'); - }); - - test('fallback note body includes the line range', async () => { - const multiLineReviews: sourcebot_file_diff_review[] = [ - { - filename: 'src/bar.ts', - reviews: [{ line_start: 10, line_end: 20, review: 'Refactor this block' }], - }, - ]; - const client = makeMockClient('reject'); - - await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, multiLineReviews); - - const noteBody = vi.mocked(client.MergeRequestNotes.create).mock.calls[0][2] as string; - expect(noteBody).toContain('10'); - expect(noteBody).toContain('20'); - expect(noteBody).toContain('Refactor this block'); - }); - - test('returns early and does not post when diff_refs is missing', async () => { - const payloadWithoutRefs: sourcebot_pr_payload = { ...MOCK_PAYLOAD, diff_refs: undefined }; - const client = makeMockClient(); - - await gitlabPushMrReviews(client, 101, payloadWithoutRefs, SINGLE_REVIEW); - - expect(client.MergeRequestDiscussions.create).not.toHaveBeenCalled(); - expect(client.MergeRequestNotes.create).not.toHaveBeenCalled(); - }); - - test('posts multiple reviews across multiple files', async () => { - const multiFileReviews: sourcebot_file_diff_review[] = [ - { - filename: 'src/a.ts', - reviews: [ - { line_start: 1, line_end: 1, review: 'Comment A1' }, - { line_start: 5, line_end: 5, review: 'Comment A2' }, - ], - }, - { - filename: 'src/b.ts', - reviews: [{ line_start: 3, line_end: 3, review: 'Comment B1' }], - }, - ]; - const client = makeMockClient(); - - await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, multiFileReviews); - - expect(client.MergeRequestDiscussions.create).toHaveBeenCalledTimes(3); - }); - - test('continues posting remaining reviews when one inline comment fails', async () => { - const twoReviews: sourcebot_file_diff_review[] = [ - { - filename: 'src/foo.ts', - reviews: [ - { line_start: 1, line_end: 1, review: 'First comment' }, - { line_start: 10, line_end: 10, review: 'Second comment' }, - ], - }, - ]; - const mockCreate = vi.fn() - .mockRejectedValueOnce(new Error('400')) - .mockResolvedValueOnce({}); - const client = { - MergeRequestDiscussions: { create: mockCreate }, - MergeRequestNotes: { create: vi.fn().mockResolvedValue({}) }, - } as unknown as GitlabClient; - - await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, twoReviews); - - expect(mockCreate).toHaveBeenCalledTimes(2); - // First failed → fallback note; second succeeded → no note - expect(client.MergeRequestNotes.create).toHaveBeenCalledOnce(); - }); - - test('does not throw when both discussion and note creation fail', async () => { - const client = { - MergeRequestDiscussions: { create: vi.fn().mockRejectedValue(new Error('500')) }, - MergeRequestNotes: { create: vi.fn().mockRejectedValue(new Error('500')) }, - } as unknown as GitlabClient; - - await expect( - gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, SINGLE_REVIEW), - ).resolves.not.toThrow(); - }); - - test('uses oldFilename as oldPath when file was renamed', async () => { - const renamedReview: sourcebot_file_diff_review[] = [ - { - filename: 'src/new-name.ts', - oldFilename: 'src/old-name.ts', - reviews: [{ line_start: 1, line_end: 1, review: 'Comment on renamed file' }], - }, - ]; - const client = makeMockClient(); - - await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, renamedReview); - - expect(client.MergeRequestDiscussions.create).toHaveBeenCalledWith( - 101, - 42, - 'Comment on renamed file', - expect.objectContaining({ - position: expect.objectContaining({ - oldPath: 'src/old-name.ts', - newPath: 'src/new-name.ts', - }), - }), - ); - }); - - test('passes oldLine for context lines', async () => { - // old line 47 = new line 48 (a line was added at new line 47 before it) - const payloadWithDiffs: sourcebot_pr_payload = { - ...MOCK_PAYLOAD, - file_diffs: [{ - from: 'src/foo.ts', - to: 'src/foo.ts', - diffs: [{ - oldSnippet: '@@ -47,1 +48,1 @@\n47: context line\n', - newSnippet: '@@ -47,1 +48,1 @@\n48: context line\n', - }], - }], - }; - const contextReview: sourcebot_file_diff_review[] = [ - { - filename: 'src/foo.ts', - reviews: [{ line_start: 48, line_end: 48, review: 'Context line comment' }], - }, - ]; - const client = makeMockClient(); - - await gitlabPushMrReviews(client, 101, payloadWithDiffs, contextReview); - - expect(client.MergeRequestDiscussions.create).toHaveBeenCalledWith( - 101, - 42, - 'Context line comment', - expect.objectContaining({ - position: expect.objectContaining({ - newLine: '48', - oldLine: '47', - }), - }), - ); - }); - - test('does not pass oldLine for added lines', async () => { - const payloadWithDiffs: sourcebot_pr_payload = { - ...MOCK_PAYLOAD, - file_diffs: [{ - from: 'src/foo.ts', - to: 'src/foo.ts', - diffs: [{ - oldSnippet: '@@ -1,1 +1,2 @@\n1: existing line\n', - newSnippet: '@@ -1,1 +1,2 @@\n1: existing line\n2:+added line\n', - }], - }], - }; - const addedLineReview: sourcebot_file_diff_review[] = [ - { - filename: 'src/foo.ts', - reviews: [{ line_start: 2, line_end: 2, review: 'Comment on added line' }], - }, - ]; - const client = makeMockClient(); - - await gitlabPushMrReviews(client, 101, payloadWithDiffs, addedLineReview); - - const position = vi.mocked(client.MergeRequestDiscussions.create).mock.calls[0]![3]!.position!; - expect(position).not.toHaveProperty('oldLine'); - expect(position.newLine).toBe('2'); - }); - - test('uses new path for both oldPath and newPath when old path is /dev/null (added file)', async () => { - const addedFileReview: sourcebot_file_diff_review[] = [ - { - filename: 'src/new-file.ts', - oldFilename: '/dev/null', - reviews: [{ line_start: 1, line_end: 1, review: 'Comment on new file' }], - }, - ]; - const client = makeMockClient(); - - await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, addedFileReview); - - expect(client.MergeRequestDiscussions.create).toHaveBeenCalledWith( - 101, - 42, - 'Comment on new file', - expect.objectContaining({ - position: expect.objectContaining({ - oldPath: 'src/new-file.ts', - newPath: 'src/new-file.ts', - }), - }), - ); - }); - - test('uses old path for both oldPath and newPath when new path is /dev/null (deleted file)', async () => { - const deletedFileReview: sourcebot_file_diff_review[] = [ - { - filename: '/dev/null', - oldFilename: 'src/deleted-file.ts', - reviews: [{ line_start: 1, line_end: 1, review: 'Comment on deleted file' }], - }, - ]; - const client = makeMockClient(); - - await gitlabPushMrReviews(client, 101, MOCK_PAYLOAD, deletedFileReview); - - expect(client.MergeRequestDiscussions.create).toHaveBeenCalledWith( - 101, - 42, - 'Comment on deleted file', - expect.objectContaining({ - position: expect.objectContaining({ - oldPath: 'src/deleted-file.ts', - newPath: 'src/deleted-file.ts', - }), - }), - ); - }); -}); diff --git a/packages/web/src/features/agents/review-agent/nodes/gitlabPushMrReviews.ts b/packages/web/src/features/agents/review-agent/nodes/gitlabPushMrReviews.ts deleted file mode 100644 index 0751a0138..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/gitlabPushMrReviews.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { sourcebot_pr_payload, sourcebot_file_diff_review } from "@/features/agents/review-agent/types"; -import { Gitlab } from "@gitbeaker/rest"; -import { createLogger } from "@sourcebot/shared"; - -// Derive the position type from the Gitlab client to avoid importing from @gitbeaker/core. -type DiscussionNotePosition = NonNullable< - NonNullable['MergeRequestDiscussions']['create']>[3]>['position'] ->; - -const logger = createLogger('gitlab-push-mr-reviews'); - -/** - * Extracts new-file line numbers for context (unchanged) lines from a snippet. - * Snippet lines have the format `:` where content starts with - * a space for context lines, `+` for additions, and `-` for deletions. - */ -function extractContextLineNumbers(snippet: string): number[] { - const result: number[] = []; - for (const line of snippet.split('\n')) { - if (line.startsWith('@@')) { - continue; - } - const colonIdx = line.indexOf(':'); - if (colonIdx === -1) { - continue; - } - const lineNum = parseInt(line.substring(0, colonIdx), 10); - if (isNaN(lineNum)) { - continue; - } - const content = line.substring(colonIdx + 1); - if (content.startsWith(' ')) { - result.push(lineNum); - } - } - return result; -} - -/** - * Builds a per-file map from new-file line number → old-file line number for - * context lines. Context lines appear at the same index in oldSnippet and - * newSnippet, so zipping them gives the mapping. - */ -function buildContextLineMap(prPayload: sourcebot_pr_payload): Map> { - const fileMap = new Map>(); - for (const fileDiff of prPayload.file_diffs) { - const lineMap = new Map(); - for (const diff of fileDiff.diffs) { - const oldNums = extractContextLineNumbers(diff.oldSnippet); - const newNums = extractContextLineNumbers(diff.newSnippet); - for (let i = 0; i < Math.min(oldNums.length, newNums.length); i++) { - lineMap.set(newNums[i], oldNums[i]); - } - } - fileMap.set(fileDiff.to, lineMap); - } - return fileMap; -} - -export const gitlabPushMrReviews = async ( - gitlabClient: InstanceType, - projectId: number, - prPayload: sourcebot_pr_payload, - fileDiffReviews: sourcebot_file_diff_review[], -): Promise => { - logger.info("Executing gitlab_push_mr_reviews"); - - if (!prPayload.diff_refs) { - logger.error("diff_refs is missing from pr_payload, cannot post inline GitLab MR reviews"); - return; - } - - const { base_sha, head_sha, start_sha } = prPayload.diff_refs; - const contextLineMap = buildContextLineMap(prPayload); - - for (const fileDiffReview of fileDiffReviews) { - const fileContextMap = contextLineMap.get(fileDiffReview.filename); - const resolvedOldPath = fileDiffReview.oldFilename ?? fileDiffReview.filename; - // GitLab requires both oldPath and newPath in the position object. - // For added files (old is /dev/null) use the new path for both; - // for deleted files (new is /dev/null) use the old path for both. - const oldPath = resolvedOldPath !== '/dev/null' ? resolvedOldPath : fileDiffReview.filename; - const newPath = fileDiffReview.filename !== '/dev/null' ? fileDiffReview.filename : resolvedOldPath; - for (const review of fileDiffReview.reviews) { - const oldLine = fileContextMap?.get(review.line_end); - const position: DiscussionNotePosition = { - positionType: 'text', - baseSha: base_sha, - headSha: head_sha, - startSha: start_sha, - oldPath, - newPath, - newLine: String(review.line_end), - ...(oldLine !== undefined ? { oldLine: String(oldLine) } : {}), - }; - try { - await gitlabClient.MergeRequestDiscussions.create( - projectId, - prPayload.number, - review.review, - { position }, - ); - } catch (error) { - // Inline comment failed (e.g. line not in diff) — fall back to a general MR note - logger.warn( - `Inline comment failed for ${fileDiffReview.filename}:${review.line_start}-${review.line_end}, falling back to general note: ${error}`, - ); - try { - await gitlabClient.MergeRequestNotes.create( - projectId, - prPayload.number, - `**${fileDiffReview.filename}** (lines ${review.line_start}–${review.line_end}):\n\n${review.review}`, - ); - } catch (fallbackError) { - logger.error( - `Error posting fallback note for ${fileDiffReview.filename}: ${fallbackError}`, - ); - } - } - } - } - - logger.info("Completed gitlab_push_mr_reviews"); -}; diff --git a/packages/web/src/features/agents/review-agent/nodes/invokeDiffReviewLlm.ts b/packages/web/src/features/agents/review-agent/nodes/invokeDiffReviewLlm.ts deleted file mode 100644 index 915db6cec..000000000 --- a/packages/web/src/features/agents/review-agent/nodes/invokeDiffReviewLlm.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { sourcebot_file_diff_review, sourcebot_file_diff_review_schema } from "@/features/agents/review-agent/types"; -import { getConfiguredLanguageModels } from "@/features/chat/utils.server"; -import { getAISDKLanguageModelAndOptions } from "@/features/chat/llm.server"; -import { env } from "@sourcebot/shared"; -import { generateText } from "ai"; -import fs from "fs"; -import path from "path"; -import { createLogger } from "@sourcebot/shared"; - -const logger = createLogger('invoke-diff-review-llm'); - -export const getReviewAgentLogDir = (): string => { - return path.join(env.DATA_CACHE_DIR, 'review-agent'); -}; - -const validateLogPath = (logPath: string): void => { - const resolved = path.resolve(logPath); - const logDir = getReviewAgentLogDir(); - if (!resolved.startsWith(logDir + path.sep)) { - throw new Error('reviewAgentLogPath escapes log directory'); - } -}; - -export const invokeDiffReviewLlm = async (reviewAgentLogPath: string | undefined, prompt: string): Promise => { - logger.debug("Executing invoke_diff_review_llm"); - - const models = await getConfiguredLanguageModels(); - if (models.length === 0) { - throw new Error("No language models are configured"); - } - - let selectedModel = models[0]; - if (env.REVIEW_AGENT_MODEL) { - const match = models.find((m) => m.displayName === env.REVIEW_AGENT_MODEL); - if (match) { - selectedModel = match; - } else { - logger.warn(`REVIEW_AGENT_MODEL="${env.REVIEW_AGENT_MODEL}" did not match any configured model displayName. Falling back to the first configured model.`); - } - } - - const { model, providerOptions, temperature } = await getAISDKLanguageModelAndOptions(selectedModel); - - if (reviewAgentLogPath) { - validateLogPath(reviewAgentLogPath); - fs.appendFileSync(reviewAgentLogPath, `\n\nPrompt:\n${prompt}`); - } - - try { - const result = await generateText({ - model, - system: "You are a code review assistant. Respond only with valid JSON matching the expected schema.", - prompt, - providerOptions, - temperature, - }); - - const responseText = result.text; - if (reviewAgentLogPath) { - validateLogPath(reviewAgentLogPath); - fs.appendFileSync(reviewAgentLogPath, `\n\nResponse:\n${responseText}`); - } - - const diffReviewJson = JSON.parse(responseText || '{}'); - const diffReview = sourcebot_file_diff_review_schema.safeParse(diffReviewJson); - - if (!diffReview.success) { - throw new Error(`Invalid diff review format: ${diffReview.error}`); - } - - logger.debug("Completed invoke_diff_review_llm"); - return diffReview.data; - } catch (error) { - logger.error('Error invoking language model:', error); - throw error; - } -} diff --git a/packages/web/src/features/agents/review-agent/types.ts b/packages/web/src/features/agents/review-agent/types.ts deleted file mode 100644 index 412a99b93..000000000 --- a/packages/web/src/features/agents/review-agent/types.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { components } from "@octokit/openapi-types"; -import { z } from "zod"; - -export type GitHubPullRequest = components["schemas"]["pull-request"]; - -export const sourcebot_diff_schema = z.object({ - oldSnippet: z.string(), - newSnippet: z.string(), -}); -export type sourcebot_diff = z.infer; - -export const sourcebot_file_diff_schema = z.object({ - from: z.string(), - to: z.string(), - diffs: z.array(sourcebot_diff_schema), -}); -export type sourcebot_file_diff = z.infer; - -export const sourcebot_diff_refs_schema = z.object({ - base_sha: z.string(), - head_sha: z.string(), - start_sha: z.string(), -}); -export type sourcebot_diff_refs = z.infer; - -export const sourcebot_pr_payload_schema = z.object({ - title: z.string(), - description: z.string(), - hostDomain: z.string(), - owner: z.string(), - repo: z.string(), - file_diffs: z.array(sourcebot_file_diff_schema), - number: z.number(), - head_sha: z.string(), - diff_refs: sourcebot_diff_refs_schema.optional(), -}); -export type sourcebot_pr_payload = z.infer; - -export const sourcebot_context_schema = z.object({ - type: z.enum(["pr_title", "pr_description", "pr_summary", "comment_chains", "file_content"]), - description: z.string().optional(), - context: z.string(), -}); -export type sourcebot_context = z.infer; - -export const sourcebot_diff_review_schema = z.object({ - line_start: z.number(), - line_end: z.number(), - review: z.string(), -}); -export type sourcebot_diff_review = z.infer; - -export const sourcebot_file_diff_review_schema = z.object({ - filename: z.string(), - oldFilename: z.string().optional(), - reviews: z.array(sourcebot_diff_review_schema), -}); -export type sourcebot_file_diff_review = z.infer; - -const gitLabProjectSchema = z.object({ - id: z.number(), - name: z.string(), - path_with_namespace: z.string(), - web_url: z.string(), - namespace: z.string(), -}); - -const gitLabDiffRefsSchema = z.object({ - base_sha: z.string(), - head_sha: z.string(), - start_sha: z.string(), -}).nullable().optional(); - -export const gitLabMergeRequestPayloadSchema = z.object({ - object_kind: z.literal('merge_request'), - object_attributes: z.object({ - iid: z.number(), - title: z.string(), - description: z.string().nullable(), - action: z.string(), - last_commit: z.object({ id: z.string() }), - diff_refs: gitLabDiffRefsSchema, - }), - project: gitLabProjectSchema, -}); -export type GitLabMergeRequestPayload = z.infer; - -export const gitLabNotePayloadSchema = z.object({ - object_kind: z.literal('note'), - object_attributes: z.object({ - note: z.string(), - noteable_type: z.literal('MergeRequest'), - }), - merge_request: z.object({ - iid: z.number(), - title: z.string(), - description: z.string().nullable(), - last_commit: z.object({ id: z.string() }), - diff_refs: gitLabDiffRefsSchema, - }), - project: gitLabProjectSchema, -}); -export type GitLabNotePayload = z.infer; - diff --git a/packages/web/src/features/auth/components/loginMessage.test.tsx b/packages/web/src/features/auth/components/loginMessage.test.tsx deleted file mode 100644 index ece33f2c1..000000000 --- a/packages/web/src/features/auth/components/loginMessage.test.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'; -import { afterEach, expect, test, vi } from 'vitest'; -import { LoginMessage } from './loginMessage'; - -afterEach(() => { - cleanup(); - vi.restoreAllMocks(); - vi.unstubAllGlobals(); -}); - -test('renders formatted access instructions and links that preserve the login tab', () => { - const { container } = render(); - expect(container.querySelector('strong')?.textContent).toBe('Before signing in'); - expect(container.querySelectorAll('li')).toHaveLength(2); - const link = screen.getByRole('link', { name: 'Request access' }); - expect(link.getAttribute('href')).toBe('https://example.com/access'); - expect(link.getAttribute('target')).toBe('_blank'); - expect(link.getAttribute('rel')).toBe('noopener noreferrer'); -}); - -test.each([null, undefined, '', ' \n '])('renders nothing for an empty message %j', (message) => { - const { container } = render(); - expect(container.innerHTML).toBe(''); -}); - -test('does not render raw HTML, images, or executable links', () => { - const { container } = render(alert(1)\n\n\n\n![image](https://example.com/image.png)\n\n[unsafe](javascript:alert%281%29)'} />); - expect(container.querySelector('script, img')).toBeNull(); - expect(screen.queryByRole('link')).toBeNull(); - expect(screen.getByText('unsafe')).toBeTruthy(); -}); - -test.each([40, 120])('shows the full message without an expand button when its height is %i pixels', (height) => { - vi.spyOn(HTMLElement.prototype, 'scrollHeight', 'get').mockReturnValue(height); - render(); - expect(screen.queryByRole('button')).toBeNull(); -}); - -test('allows long messages to be expanded and collapsed', () => { - vi.spyOn(HTMLElement.prototype, 'scrollHeight', 'get').mockReturnValue(200); - render(); - const button = screen.getByRole('button', { name: 'Show more' }); - const content = document.getElementById(button.getAttribute('aria-controls')!)!; - expect(button.getAttribute('aria-expanded')).toBe('false'); - expect(content.style.maxHeight).toBe('120px'); - - fireEvent.click(button); - expect(screen.getByRole('button', { name: 'Show less' }).getAttribute('aria-expanded')).toBe('true'); - expect(content.style.maxHeight).toBe(''); - - fireEvent.click(button); - expect(screen.getByRole('button', { name: 'Show more' }).getAttribute('aria-expanded')).toBe('false'); - expect(content.style.maxHeight).toBe('120px'); -}); - -test('updates the expand button when content height changes', () => { - const height = vi.spyOn(HTMLElement.prototype, 'scrollHeight', 'get').mockReturnValue(40); - let measure: () => void; - const disconnect = vi.fn(); - vi.stubGlobal('ResizeObserver', class { - constructor(callback: () => void) { - measure = callback; - } - observe() {} - disconnect = disconnect; - }); - const { unmount } = render(); - expect(screen.queryByRole('button')).toBeNull(); - - height.mockReturnValue(200); - act(() => measure()); - expect(screen.getByRole('button', { name: 'Show more' })).toBeTruthy(); - - height.mockReturnValue(40); - act(() => measure()); - expect(screen.queryByRole('button')).toBeNull(); - unmount(); - expect(disconnect).toHaveBeenCalledOnce(); -}); - -test('collapses the preview again when the message changes', () => { - vi.spyOn(HTMLElement.prototype, 'scrollHeight', 'get').mockReturnValue(200); - const { rerender } = render(); - fireEvent.click(screen.getByRole('button', { name: 'Show more' })); - - rerender(); - expect(screen.getByRole('button', { name: 'Show more' }).getAttribute('aria-expanded')).toBe('false'); -}); - -test('reveals the message when a link receives keyboard focus', () => { - vi.spyOn(HTMLElement.prototype, 'scrollHeight', 'get').mockReturnValue(200); - render(); - fireEvent.focus(screen.getByRole('link', { name: 'Request access' })); - expect(screen.getByRole('button', { name: 'Show less' }).getAttribute('aria-expanded')).toBe('true'); -}); diff --git a/packages/web/src/features/auth/components/loginMessage.tsx b/packages/web/src/features/auth/components/loginMessage.tsx deleted file mode 100644 index 36ac73a7c..000000000 --- a/packages/web/src/features/auth/components/loginMessage.tsx +++ /dev/null @@ -1,89 +0,0 @@ -"use client"; - -import { useEffect, useId, useRef, useState } from "react"; -import Markdown from "react-markdown"; -import { Button } from "@/components/ui/button"; - -const COLLAPSED_MESSAGE_HEIGHT = 120; - -interface LoginMessageProps { - message: string | null | undefined; -} - -export function LoginMessage({ message }: LoginMessageProps) { - if (!message?.trim()) { - return null; - } - - return ; -} - -function ExpandableLoginMessage({ message }: { message: string }) { - const [isExpanded, setIsExpanded] = useState(false); - const [isOverflowing, setIsOverflowing] = useState(false); - const contentRef = useRef(null); - const contentId = useId(); - - useEffect(() => { - const content = contentRef.current; - if (!content) { - return; - } - - const measure = () => setIsOverflowing(content.scrollHeight > COLLAPSED_MESSAGE_HEIGHT); - measure(); - const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(measure); - observer?.observe(content); - window.addEventListener('resize', measure); - return () => { - observer?.disconnect(); - window.removeEventListener('resize', measure); - }; - }, []); - - return ( -
-
{ - // Reveal clipped links when keyboard navigation reaches the message. - if (isOverflowing) { - setIsExpanded(true); - } - }} - > -
- href ? ( - {children} - ) : {children}, - }} - > - {message} - -
-
- {isOverflowing && !isExpanded && ( - - )} - {isOverflowing && ( - - )} -
- ); -} diff --git a/packages/web/src/features/auth/constants.ts b/packages/web/src/features/auth/constants.ts deleted file mode 100644 index eb9ca2134..000000000 --- a/packages/web/src/features/auth/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const LOGIN_MESSAGE_MAX_LENGTH = 5000; diff --git a/packages/web/src/features/auth/errorMessages.ts b/packages/web/src/features/auth/errorMessages.ts deleted file mode 100644 index 6e2bf4c3d..000000000 --- a/packages/web/src/features/auth/errorMessages.ts +++ /dev/null @@ -1,49 +0,0 @@ -const ERROR_CONTENT: Record = { - CredentialsSignin: { - title: "Unable to sign in", - description: "Invalid email or password. Please try again.", - }, - OAuthAccountNotLinked: { - title: "Different sign-in method required", - description: "This email is already associated with a different sign-in method.", - }, - OAuthCallbackError: { - title: "Provider sign-in failed", - description: "Sign-in with your identity provider was cancelled or could not be completed. Please try again. If this continues, contact your administrator.", - }, - MissingCSRF: { - title: "Sign-in security check failed", - description: "We couldn't verify your sign-in request. Refresh the page and try again.", - }, - AccountNotLinked: { - title: "Account not linked", - description: "This account isn't linked to your Sourcebot user. Sign in using your original method, then link the account in Settings.", - }, - WebAuthnVerificationError: { - title: "Passkey verification failed", - description: "We couldn't verify your passkey. Please try again or use another available sign-in method.", - }, - Configuration: { - title: "Server configuration error", - description: "There is a problem with the server's authentication configuration. Please contact your administrator.", - }, - AccessDenied: { - title: "Access denied", - description: "You do not have permission to sign in.", - }, - EmailRequired: { - title: "No email on your account", - description: "Your identity provider didn't share an email address, which Sourcebot requires to sign you in. Add or verify an email on your upstream account, then try again.", - }, - Verification: { - title: "This sign-in link has expired", - description: "The code or link you used is no longer valid - it may have expired or already been used. Request a new one and try again.", - }, - Default: { - title: "Unable to sign in", - description: "An error occurred during authentication. Please try again.", - }, -}; - -export const getAuthErrorContent = (error: string | null | undefined) => - error && Object.hasOwn(ERROR_CONTENT, error) ? ERROR_CONTENT[error] : ERROR_CONTENT.Default; diff --git a/packages/web/src/features/auth/identityProvidersProvider.tsx b/packages/web/src/features/auth/identityProvidersProvider.tsx deleted file mode 100644 index e0b36e0c8..000000000 --- a/packages/web/src/features/auth/identityProvidersProvider.tsx +++ /dev/null @@ -1,21 +0,0 @@ -'use client'; - -import { createContext } from "react"; -import type { IdentityProviderMetadata } from "@/lib/identityProviders"; - -export const IdentityProvidersContext = createContext<{ providers: IdentityProviderMetadata[] }>({ providers: [] }); - -interface IdentityProvidersProviderProps { - children: React.ReactNode; - providers: IdentityProviderMetadata[]; -} - -export const IdentityProvidersProvider = ({ children, providers }: IdentityProvidersProviderProps) => { - return ( - - {children} - - ) -}; diff --git a/packages/web/src/features/auth/roleProvider.tsx b/packages/web/src/features/auth/roleProvider.tsx deleted file mode 100644 index bf996dcce..000000000 --- a/packages/web/src/features/auth/roleProvider.tsx +++ /dev/null @@ -1,21 +0,0 @@ -'use client'; - -import { createContext } from "react"; -import { OrgRole } from "@sourcebot/db"; - -export const RoleContext = createContext<{ role: OrgRole | null }>({ role: null }); - -interface RoleProviderProps { - children: React.ReactNode; - role: OrgRole | null; -} - -export const RoleProvider = ({ children, role }: RoleProviderProps) => { - return ( - - {children} - - ) -}; diff --git a/packages/web/src/features/auth/useIdentityProviders.ts b/packages/web/src/features/auth/useIdentityProviders.ts deleted file mode 100644 index c0a06382a..000000000 --- a/packages/web/src/features/auth/useIdentityProviders.ts +++ /dev/null @@ -1,9 +0,0 @@ -'use client'; - -import { useContext } from "react"; -import { IdentityProvidersContext } from "./identityProvidersProvider"; - -export const useIdentityProviders = () => { - const { providers } = useContext(IdentityProvidersContext); - return providers; -} diff --git a/packages/web/src/features/auth/useRole.ts b/packages/web/src/features/auth/useRole.ts deleted file mode 100644 index 962784c0f..000000000 --- a/packages/web/src/features/auth/useRole.ts +++ /dev/null @@ -1,9 +0,0 @@ -'use client'; - -import { useContext } from "react"; -import { RoleContext } from "./roleProvider"; - -export const useRole = () => { - const { role } = useContext(RoleContext); - return role; -} diff --git a/packages/web/src/features/billing/CLAUDE.md b/packages/web/src/features/billing/CLAUDE.md deleted file mode 100644 index 75451726e..000000000 --- a/packages/web/src/features/billing/CLAUDE.md +++ /dev/null @@ -1,28 +0,0 @@ -# Lighthouse Feature Guidelines - -## Keeping types in sync with the lighthouse service - -The Zod schemas in `packages/shared/src/lighthouseTypes.ts` mirror the request/response schemas defined in the lighthouse service (`sourcebot-dev/lighthouse`, under `lambda/routes/`). They MUST stay in lockstep. - -Whenever you change a schema in `packages/shared/src/lighthouseTypes.ts`, you MUST also update the corresponding schema in: - -``` -lighthouse: lambda/routes/.ts -``` - -Conversely, if a schema changes in the lighthouse service, update `packages/shared/src/lighthouseTypes.ts` to match. - -This applies to: -- Adding, removing, or renaming fields on any `*RequestSchema` / `*ResponseSchema`. -- Changing a field's type, nullability, or validation (e.g. `.optional()`, `.nullable()`, `.datetime()`). -- Adding new route schemas. - -## Keeping the Service Ping docs in sync - -Whenever you change the `servicePingRequestSchema` (the `/ping` request payload) in `packages/shared/src/lighthouseTypes.ts`, you MUST also update the user-facing Service Ping documentation: - -``` -docs/docs/misc/service-ping.mdx -``` - -This includes updating the field reference table and the example payload to reflect any added, removed, or renamed fields. diff --git a/packages/web/src/features/billing/actions.ts b/packages/web/src/features/billing/actions.ts deleted file mode 100644 index 159b8abf3..000000000 --- a/packages/web/src/features/billing/actions.ts +++ /dev/null @@ -1,233 +0,0 @@ -'use server'; - -import { sew } from "@/middleware/sew"; -import { withAuth } from "@/middleware/withAuth"; -import { withMinimumOrgRole } from "@/middleware/withMinimumOrgRole"; -import { OrgRole } from "@sourcebot/db"; -import { ServiceError, ServiceErrorException } from "@/lib/serviceError"; -import { StatusCodes } from "http-status-codes"; -import { ErrorCode } from "@/lib/errorCodes"; -import { encryptActivationCode, decryptActivationCode, env } from "@sourcebot/shared"; -import { syncWithLighthouse } from "./servicePing"; -import { isServiceError } from "@/lib/utils"; -import { revalidatePath } from "next/cache"; -import { captureEvent } from "@/lib/posthog"; -import { UpsellSource } from "@/lib/posthogEvents"; -import { client } from "./client"; -import { z } from "zod"; -import { activeMembershipWhere } from "@/features/membership/utils"; - -export const activateLicense = async (activationCode: string): Promise<{ success: boolean } | ServiceError> => sew(() => - withAuth(async ({ org, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - // Check if a license already exists - const existing = await prisma.license.findUnique({ - where: { orgId: org.id }, - }); - - if (existing) { - return { - statusCode: StatusCodes.CONFLICT, - errorCode: ErrorCode.UNEXPECTED_ERROR, - message: "A license already exists for this organization.", - } satisfies ServiceError; - } - - await prisma.license.create({ - data: { - orgId: org.id, - activationCode: encryptActivationCode(activationCode), - }, - }); - - try { - // Bind the activation code to this install. This is the only - // call that mutates the binding on the Lighthouse side; the - // subsequent ping is pure read. - const activateResult = await client.activate({ - activationCode, - installId: env.SOURCEBOT_INSTALL_ID, - }); - - if (isServiceError(activateResult)) { - throw new ServiceErrorException(activateResult); - } - - // Immediately sync license data from Lighthouse. - await syncWithLighthouse(org.id); - } catch (e) { - // If activation or initial sync fails, remove the license record - await prisma.license.delete({ - where: { orgId: org.id }, - }); - - throw e; - } - - // Invalidate the (app) layout so BannerSlot re-resolves with the - // new license. - revalidatePath('/settings/license', 'layout'); - - return { success: true }; - }) - ) -); - -export const claimActivationCode = async (sessionId: string): Promise<{ activationCode: string } | ServiceError> => sew(() => - withAuth(async ({ role }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - const result = await client.claimActivationCode({ - sessionId, - installId: env.SOURCEBOT_INSTALL_ID, - }); - - if (isServiceError(result)) { - return result; - } - - return { activationCode: result.activationCode }; - }) - ) -); - -export const createCheckoutSession = async ({ - source, - requestTrial = false, - interval = 'year', - returnPath: _returnPath = '/settings/license', - overrideEmail, -}: { - source: UpsellSource; - requestTrial?: boolean; - interval?: 'month' | 'year'; - returnPath?: string; - overrideEmail?: string; -}): Promise<{ url: string } | ServiceError> => sew(() => - withAuth(async ({ user, org, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - if (!user.email) { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.UNEXPECTED_ERROR, - message: "User does not have an email address.", - } satisfies ServiceError; - } - - // Validate the override on the server — never trust a client-supplied - // email. Fall back to the authenticated user's email when omitted. - let checkoutEmail = user.email; - if (overrideEmail !== undefined) { - const parsed = z.string().email().safeParse(overrideEmail); - if (!parsed.success) { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.UNEXPECTED_ERROR, - message: "Invalid overrideEmail.", - } satisfies ServiceError; - } - checkoutEmail = parsed.data; - } - - const memberCount = await prisma.userToOrg.count({ - where: { - orgId: org.id, - ...activeMembershipWhere(), - }, - }); - const quantity = Math.max(memberCount, 1); - - const existingLicense = await prisma.license.findUnique({ - where: { orgId: org.id }, - }); - const existingActivationCode = existingLicense - ? decryptActivationCode(existingLicense.activationCode) - : undefined; - - // Resolve the candidate against AUTH_URL so absolute paths, protocol- - // relative paths (`//evil.com`), and bare relative paths all get - // normalized through the URL parser. Reject anything that lands off- - // origin, carries a fragment, or already uses the reserved query keys - // we append below. - let returnPathname: string; - let returnSearch: string; - try { - const candidate = new URL(_returnPath, env.AUTH_URL); - const authOrigin = new URL(env.AUTH_URL).origin; - if (candidate.origin !== authOrigin) { - throw new Error('returnPath escapes AUTH_URL origin'); - } - if (candidate.hash) { - throw new Error('returnPath must not include a fragment'); - } - for (const reservedKey of ['checkout', 'session_id']) { - if (candidate.searchParams.has(reservedKey)) { - throw new Error(`returnPath must not include reserved query parameter: ${reservedKey}`); - } - } - returnPathname = candidate.pathname; - returnSearch = candidate.search; - } catch { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.UNEXPECTED_ERROR, - message: "Invalid returnPath.", - } satisfies ServiceError; - } - - await captureEvent('wa_upsell_checkout_started', { - source, - requestTrial, - interval, - returnPath: `${returnPathname}${returnSearch}`, - quantity, - }); - - // Build success/cancel URLs as raw strings so Stripe's literal - // `{CHECKOUT_SESSION_ID}` placeholder isn't URL-encoded by URL/ - // URLSearchParams (Stripe substitutes the raw token, not %7B...%7D). - const stripeSuccessQuery = 'checkout=success&session_id={CHECKOUT_SESSION_ID}'; - const successQuerySeparator = returnSearch ? '&' : '?'; - - const result = await client.checkout({ - email: checkoutEmail, - installId: env.SOURCEBOT_INSTALL_ID, - quantity, - requestTrial, - interval, - successUrl: `${env.AUTH_URL}${returnPathname}${returnSearch}${successQuerySeparator}${stripeSuccessQuery}`, - cancelUrl: `${env.AUTH_URL}${returnPathname}${returnSearch}`, - existingActivationCode, - }); - - if (isServiceError(result)) { - return result; - } - - return { url: result.url }; - }) - ) -); - -export const deactivateLicense = async (): Promise<{ success: boolean } | ServiceError> => sew(() => - withAuth(async ({ org, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - const existing = await prisma.license.findUnique({ - where: { orgId: org.id }, - }); - - if (!existing) { - return { - statusCode: StatusCodes.NOT_FOUND, - errorCode: ErrorCode.NOT_FOUND, - message: "No license found.", - } satisfies ServiceError; - } - - await prisma.license.delete({ - where: { orgId: org.id }, - }); - - return { success: true }; - }) - ) -); diff --git a/packages/web/src/features/billing/checkoutDisclosures.tsx b/packages/web/src/features/billing/checkoutDisclosures.tsx deleted file mode 100644 index 7c6b9bfc0..000000000 --- a/packages/web/src/features/billing/checkoutDisclosures.tsx +++ /dev/null @@ -1,156 +0,0 @@ -'use client'; - -import { Form, FormControl, FormField, FormItem } from "@/components/ui/form"; -import { cn } from "@/lib/utils"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { Pencil, Save } from "lucide-react"; -import { useEffect, useState } from "react"; -import { useForm } from "react-hook-form"; -import { z } from "zod"; - -const emailFormSchema = z.object({ - email: z.string().email(), -}); - -interface CheckoutDisclosuresProps { - sessionEmail: string; - onEmailChanged: (email: string) => void; - isEmailValidationMessageVisible?: boolean; - isNoCreditCardRequiredMessageVisible?: boolean; -} - -export const CheckoutDisclosures = ({ - sessionEmail, - onEmailChanged, - isNoCreditCardRequiredMessageVisible = false, - isEmailValidationMessageVisible = true, -}: CheckoutDisclosuresProps) => { - const [isEditing, setIsEditing] = useState(false); - - const form = useForm>({ - resolver: zodResolver(emailFormSchema), - defaultValues: { email: sessionEmail }, - mode: "onChange", - }); - - // Sync once when sessionEmail arrives — the parent's useSession may pass an - // empty value on the first render and populate afterwards. - useEffect(() => { - if (sessionEmail && !form.getValues("email")) { - form.reset({ email: sessionEmail }); - } - }, [sessionEmail, form]); - - useEffect(() => { - if (isEditing) { - form.setFocus("email"); - } - }, [isEditing, form]); - - const email = form.watch("email"); - const isValid = !form.formState.errors.email; - - useEffect(() => { - if (isValid && email && !isEditing) { - onEmailChanged(email); - } - }, [email, isValid, isEditing, onEmailChanged]); - - const commit = () => { - if (!isValid) { - return; - } - setIsEditing(false); - }; - - const revertAndExit = () => { - form.reset({ email: sessionEmail }); - setIsEditing(false); - }; - - if ( - !isNoCreditCardRequiredMessageVisible && - !isEmailValidationMessageVisible - ) { - return null; - } - - return ( -
- {sessionEmail && ( -
- {isNoCreditCardRequiredMessageVisible && ( - No credit card required - )} - {(isNoCreditCardRequiredMessageVisible && isEmailValidationMessageVisible) && ( - - )} - {isEmailValidationMessageVisible && ( - - Your activation code will be sent to - {isEditing ? ( -
- ( - - - { - if (e.key === "Enter") { - e.preventDefault(); - commit(); - } else if (e.key === "Escape") { - revertAndExit(); - } - }} - aria-invalid={!isValid} - className={cn( - "bg-transparent border-none outline-none p-0 m-0 font-medium text-foreground [font:inherit] [letter-spacing:inherit] [field-sizing:content] min-w-[8ch]", - !isValid && "text-destructive", - )} - style={{ fontWeight: 500 }} - /> - - - )} - /> - - - ) : ( - <> - {email} - - - )} -
- )} -
- )} -
- ); -} diff --git a/packages/web/src/features/billing/checkoutReturnHandler.tsx b/packages/web/src/features/billing/checkoutReturnHandler.tsx deleted file mode 100644 index 435608570..000000000 --- a/packages/web/src/features/billing/checkoutReturnHandler.tsx +++ /dev/null @@ -1,19 +0,0 @@ -"use client"; - -import { useSearchParams } from "next/navigation"; -import { LicenseActivactionDialog } from "./licenseActivactionDialog"; - -// Layout-mounted handler that drives the post-Stripe activation flow regardless -// of which page the user lands on after checkout. Detects `session_id` in the -// URL (set by Stripe's substitution of `{CHECKOUT_SESSION_ID}` in successUrl), -// and renders the claim + activate modal when present. -export function CheckoutReturnHandler() { - const searchParams = useSearchParams(); - const sessionId = searchParams.get("session_id"); - - if (!sessionId) { - return null; - } - - return ; -} diff --git a/packages/web/src/features/billing/client.ts b/packages/web/src/features/billing/client.ts deleted file mode 100644 index e5a12ca9c..000000000 --- a/packages/web/src/features/billing/client.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { fetchWithRetry, isServiceError } from "@/lib/utils"; -import { env } from "@sourcebot/shared"; -import { - ActivateRequest, - ActivateResponse, - activateResponseSchema, - CheckoutRequest, - CheckoutResponse, - checkoutResponseSchema, - ClaimActivationCodeRequest, - ClaimActivationCodeResponse, - claimActivationCodeResponseSchema, - InvoicesRequest, - InvoicesResponse, - invoicesResponseSchema, - OffersQuery, - OffersResponse, - offersResponseSchema, - PortalRequest, - PortalResponse, - portalResponseSchema, - ServicePingRequest, - ServicePingResponse, - servicePingResponseSchema, -} from "@sourcebot/shared/client"; -import { lighthouseUnreachable, ServiceError } from "@/lib/serviceError"; -import { ErrorCode } from "@/lib/errorCodes"; -import { StatusCodes } from "http-status-codes"; -import { z } from "zod"; - -const requestLighthouse = async ( - path: string, - init: RequestInit, - schema: T, - retryOptions: { retries?: number; backoffMs?: number } = {}, -): Promise | ServiceError> => { - const url = `${env.SOURCEBOT_LIGHTHOUSE_URL}${path}`; - - let response: Response; - try { - response = await fetchWithRetry(url, init, retryOptions) - } catch (error) { - return lighthouseUnreachable(url, error); - } - - return parseResponseBody(response, schema); -} - -const jsonPost = (body: unknown): RequestInit => ({ - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(body), -}); - -export const client = { - activate: (body: ActivateRequest): Promise => { - return requestLighthouse('/activate', jsonPost(body), activateResponseSchema); - }, - - claimActivationCode: (body: ClaimActivationCodeRequest): Promise => { - return requestLighthouse('/claim-activation-code', jsonPost(body), claimActivationCodeResponseSchema); - }, - - ping: (body: ServicePingRequest): Promise => { - return requestLighthouse('/ping', jsonPost(body), servicePingResponseSchema); - }, - - pingSchema: (): Promise | ServiceError> => { - return requestLighthouse('/schema', { method: 'GET' }, z.record(z.string(), z.unknown())); - }, - - checkout: (body: CheckoutRequest): Promise => { - return requestLighthouse('/checkout', jsonPost(body), checkoutResponseSchema); - }, - - portal: (body: PortalRequest): Promise => { - return requestLighthouse('/portal', jsonPost(body), portalResponseSchema); - }, - - invoices: (body: InvoicesRequest): Promise => { - return requestLighthouse('/invoices', jsonPost(body), invoicesResponseSchema); - }, - - offers: (query: OffersQuery): Promise => { - const params = new URLSearchParams(query); - return requestLighthouse(`/offers?${params}`, { method: 'GET' }, offersResponseSchema, { retries: 0}); - }, -} - -const parseResponseBody = async ( - response: Response, - schema: T, -): Promise | ServiceError> => { - let body: unknown; - try { - body = await response.json(); - } catch (error) { - return { - statusCode: StatusCodes.INTERNAL_SERVER_ERROR, - errorCode: ErrorCode.INVALID_RESPONSE_BODY, - message: `Failed to parse response body as JSON: ${error instanceof Error ? error.message : String(error)}`, - }; - } - - if (isServiceError(body)) { - return body; - } - - const parsed = schema.safeParse(body); - if (!parsed.success) { - return { - statusCode: StatusCodes.INTERNAL_SERVER_ERROR, - errorCode: ErrorCode.INVALID_RESPONSE_BODY, - message: `Response body failed schema validation: ${parsed.error.message}`, - }; - } - - return parsed.data; -} diff --git a/packages/web/src/features/billing/hasLicenseProvider.tsx b/packages/web/src/features/billing/hasLicenseProvider.tsx deleted file mode 100644 index 16ab16c6a..000000000 --- a/packages/web/src/features/billing/hasLicenseProvider.tsx +++ /dev/null @@ -1,16 +0,0 @@ -'use client'; - -import { createContext, useContext } from "react"; - -const HasLicenseContext = createContext(false); - -interface HasLicenseProviderProps { - children: React.ReactNode; - hasLicense: boolean; -} - -export const HasLicenseProvider = ({ children, hasLicense }: HasLicenseProviderProps) => ( - {children} -); - -export const useHasLicense = () => useContext(HasLicenseContext); diff --git a/packages/web/src/features/billing/licenseActivactionDialog.tsx b/packages/web/src/features/billing/licenseActivactionDialog.tsx deleted file mode 100644 index 257513c44..000000000 --- a/packages/web/src/features/billing/licenseActivactionDialog.tsx +++ /dev/null @@ -1,226 +0,0 @@ -"use client"; - -import { useCallback, useEffect, useState } from "react"; -import { usePathname, useRouter, useSearchParams } from "next/navigation"; -import { CheckCircle2, Loader2 } from "lucide-react"; -import confetti from "canvas-confetti"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import { LoadingButton } from "@/components/ui/loading-button"; -import { useToast } from "@/components/hooks/use-toast"; -import { activateLicense, deactivateLicense } from "@/features/billing/actions"; -import { useClaimActivationCode } from "@/features/billing/useClaimActivationCode"; -import { isServiceError } from "@/lib/utils"; -import { useHasLicense } from "./hasLicenseProvider"; - -const CONFETTI_COLORS = [ - "#ff3b3b", // red - "#ffb800", // amber - "#ffe600", // yellow - "#3ecf8e", // green - "#3b82f6", // blue - "#a855f7", // purple - "#ec4899", // pink -]; - -const rainConfetti = () => { - const duration = 1500; - const end = Date.now() + duration; - const frame = () => { - confetti({ - particleCount: 10, - startVelocity: 20, - ticks: 250, - spread: 360, - gravity: 2.5, - colors: CONFETTI_COLORS, - origin: { x: Math.random(), y: -0.1 }, - }); - if (Date.now() < end) { - requestAnimationFrame(frame); - } - }; - frame(); -}; - -export function LicenseActivactionDialog() { - const [open, setOpen] = useState(true); - const [activationCode, setActivationCode] = useState(""); - const [isActivating, setIsActivating] = useState(false); - const router = useRouter(); - const pathname = usePathname(); - const { toast } = useToast(); - const hasLicense = useHasLicense(); - - const searchParams = useSearchParams(); - const sessionId = searchParams.get("session_id"); - - const { - status: claimStatus, - activationCode: claimedCode, - attempt: claimAttempt, - start: startClaim, - } = useClaimActivationCode(); - - const dismiss = useCallback(() => { - setOpen(false); - // Strip the Stripe query params from whatever page we're currently on, - // so a refresh doesn't re-trigger the claim flow. - router.replace(pathname); - }, [router, pathname]); - - const handleOpenChange = useCallback((next: boolean) => { - if (!next) { - dismiss(); - } - }, [dismiss]); - - const activate = useCallback(async (code: string) => { - setIsActivating(true); - - try { - // Deactivate any existing license - if (hasLicense) { - const deactivateLicenseResponse = await deactivateLicense() - if (isServiceError(deactivateLicenseResponse)) { - toast({ - description: `Failed to deactive existing license: ${deactivateLicenseResponse.message}`, - variant: "destructive", - }); - } - } - - const activateLicenseResponse = await activateLicense(code) - if (isServiceError(activateLicenseResponse)) { - toast({ - description: `Failed to activate license: ${activateLicenseResponse.message}`, - variant: "destructive", - }); - return; - } - - toast({ - description: "✅ License activated successfully.", - }); - rainConfetti(); - // Re-fetch the server-rendered layout so PlanContext picks up the - // newly granted entitlements. Without this, callers like ChatBox - // would keep reading the stale `isAskEnabled === false` and never - // resume the pending submission stashed pre-checkout. - router.refresh(); - dismiss(); - } finally { - setIsActivating(false); - } - }, [hasLicense, toast, router, dismiss]); - - const handleManualActivate = useCallback(() => { - const code = activationCode.trim(); - if (!code) { - return; - } - activate(code); - }, [activationCode, activate]); - - // Kick off auto-claim polling if Stripe redirected us with a session_id. - useEffect(() => { - if (sessionId) { - startClaim(sessionId); - } - }, [sessionId, startClaim]); - - // When the claim succeeds, populate the input (so the user can see what was - // claimed) and chain straight into activation. - useEffect(() => { - if (claimStatus === "success" && claimedCode) { - setActivationCode(claimedCode); - activate(claimedCode); - } - }, [claimStatus, claimedCode, activate]); - - const isPolling = claimStatus === "polling"; - - return ( - - { - if (isPolling) { - e.preventDefault(); - } - }} - onInteractOutside={(e) => { - e.preventDefault(); - }} - > - -
- -
- - {isPolling ? "Activating your license" : "One more step"} - - - {isPolling - ? claimAttempt > 3 - ? "Almost there. This is taking a little longer than usual." - : "Just a moment while we activate your license." - : "Check your email for your activation code, then paste it below to activate your license."} - -
- - {isPolling ? ( -
- -
- ) : ( - <> -
- - setActivationCode(e.target.value)} - onKeyDown={(e) => { - if (e.key === "Enter") { - handleManualActivate(); - } - }} - disabled={isActivating} - className="font-mono" - /> -
- - Activate license - -

- Didn't get it?{" "} - - Email us - -

- - )} -
-
- ); -} diff --git a/packages/web/src/features/billing/planComparisonTable.tsx b/packages/web/src/features/billing/planComparisonTable.tsx deleted file mode 100644 index 1fea335d3..000000000 --- a/packages/web/src/features/billing/planComparisonTable.tsx +++ /dev/null @@ -1,154 +0,0 @@ -"use client"; - -import { CircleCheck, CircleX, ExternalLink } from "lucide-react"; -import { Switch } from "@/components/ui/switch"; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { cn, formatCurrency } from "@/lib/utils"; -import type { OffersResponse } from "@sourcebot/shared/client"; - -interface FeatureLinkProps { - text: string; - href: string; -} - -function FeatureLink({ text, href }: FeatureLinkProps) { - return ( - - - {text} - - - - ); -} - -interface SupportIconProps { - supported: boolean; -} - -function SupportIcon({ supported }: SupportIconProps) { - const Icon = supported ? CircleCheck : CircleX; - return ( - - - - ); -} - -export type BillingInterval = "year" | "month"; - -function formatPrice(unitAmount: number, currency: string, interval: BillingInterval): string { - const options = { minimumFractionDigits: 0 }; - if (interval === "year") { - return `${formatCurrency(Math.round(unitAmount / 12), currency, options)} per user/month, annually`; - } - return `${formatCurrency(unitAmount, currency, options)} per user/month`; -} - -interface PlanComparisonTableProps { - offers: OffersResponse; - billingInterval: BillingInterval; - onBillingIntervalChange: (interval: BillingInterval) => void; -} - -export function PlanComparisonTable({ - offers, - billingInterval, - onBillingIntervalChange, -}: PlanComparisonTableProps) { - const proPrice = formatPrice( - billingInterval === "year" ? offers.pricing.annual.unitAmount : offers.pricing.monthly.unitAmount, - billingInterval === "year" ? offers.pricing.annual.currency : offers.pricing.monthly.currency, - billingInterval, - ); - - return ( - - - - - -
Free
-
Free for everyone
-
- - Pro -
{proPrice}
-
- onBillingIntervalChange(checked ? "year" : "month")} - className="scale-75 origin-left" - /> - - Annual billing - -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ); -} diff --git a/packages/web/src/features/billing/servicePing.ts b/packages/web/src/features/billing/servicePing.ts deleted file mode 100644 index 1e637d81e..000000000 --- a/packages/web/src/features/billing/servicePing.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { existsSync } from "fs"; -import { SINGLE_TENANT_ORG_ID } from "@/lib/constants"; -import { isServiceError } from "@/lib/utils"; -import { __unsafePrisma } from "@/prisma"; -import { - createLogger, - decryptActivationCode, - env, - SOURCEBOT_VERSION, - isValidOfflineLicenseActive, - verifyOnlineLicenseAssertion, - type ServicePingRequest, -} from "@sourcebot/shared"; -import { client } from "./client"; -import { ServiceErrorException } from "@/lib/serviceError"; -import { getConfiguredLanguageModels } from "@/features/chat/utils.server"; -import { activeMembershipWhere } from "@/features/membership/utils"; -import { getSystemInfo } from "./systemInfo"; - -const logger = createLogger('service-ping'); - -const SERVICE_PING_INTERVAL_MS = 24 * 60 * 60 * 1000; // 1 day - - -export const syncWithLighthouse = async (orgId: number) => { - // Look up the activation code from the License record - const license = await __unsafePrisma.license.findUnique({ - where: { orgId }, - }); - - const now = Date.now(); - const DAY_MS = 24 * 60 * 60 * 1000; - const dauCutoff = new Date(now - 1 * DAY_MS); - const wauCutoff = new Date(now - 7 * DAY_MS); - const mauCutoff = new Date(now - 30 * DAY_MS); - - const [ - activeUserCount, - dauCount, - wauCount, - mauCount, - repoCount, - ] = await Promise.all([ - __unsafePrisma.userToOrg.count({ - where: { - orgId, - ...activeMembershipWhere(), - }, - }), - __unsafePrisma.userToOrg.count({ - where: { - orgId, - ...activeMembershipWhere(), - lastActiveAt: { gte: dauCutoff }, - }, - }), - __unsafePrisma.userToOrg.count({ - where: { - orgId, - ...activeMembershipWhere(), - lastActiveAt: { gte: wauCutoff }, - }, - }), - __unsafePrisma.userToOrg.count({ - where: { - orgId, - ...activeMembershipWhere(), - lastActiveAt: { gte: mauCutoff }, - }, - }), - __unsafePrisma.repo.count({ - where: { - orgId, - }, - }), - ]); - - const activationCode = license?.activationCode - ? decryptActivationCode(license.activationCode) - : undefined; - - const isLanguageModelConfigured = (await getConfiguredLanguageModels()).length > 0; - - // Best-effort — a failure to collect system info must never prevent the ping. - const systemInfo = await getSystemInfo().catch((error) => { - logger.warn(`Failed to collect system info for service ping: ${error}`); - return undefined; - }); - - const payload: ServicePingRequest = { - installId: env.SOURCEBOT_INSTALL_ID, - version: SOURCEBOT_VERSION, - hostname: env.AUTH_URL, - userCount: activeUserCount, - repoCount, - dauCount, - wauCount, - mauCount, - deploymentType: inferDeploymentType(), - isTelemetryEnabled: env.SOURCEBOT_TELEMETRY_DISABLED === 'false', - isLanguageModelConfigured, - ...(systemInfo && { systemInfo }), - ...(activationCode && { activationCode }), - }; - - await recordServicePingInDB(orgId, payload); - - if (isValidOfflineLicenseActive()) { - logger.debug('Skipping service ping: active offline license detected.'); - return; - } - - const response = await client.ping(payload); - if (isServiceError(response)) { - logger.error(`Service ping failed:\n ${JSON.stringify(response, null, 2)}`) - - if (license) { - await __unsafePrisma.license.update({ - where: { orgId }, - data: { lastSyncErrorCode: response.errorCode }, - }); - } - - throw new ServiceErrorException(response); - } - - logger.info(`Service ping sent successfully`); - - const licenseAssertion = response.licenseAssertion; - const verifiedAssertion = licenseAssertion !== undefined - ? verifyOnlineLicenseAssertion(licenseAssertion) - : null; - - if (licenseAssertion !== undefined && !verifiedAssertion) { - // Never persist an assertion we cannot authenticate. In particular, - // do not silently write only the legacy fields and create a - // signature-downgrade path. - throw new Error('Lighthouse returned an invalid online license assertion'); - } - - if (licenseAssertion !== undefined && !response.license) { - throw new Error('Lighthouse returned an online license assertion without license data'); - } - - // If we have a license and Lighthouse returned license data, sync it - if (license && response.license) { - const { - entitlements, - seats, - status, - planName, - unitAmount, - currency, - interval, - intervalCount, - nextRenewalAt, - nextRenewalAmount, - cancelAt, - trialEnd, - hasPaymentMethod, - yearlyTermStatus, - } = verifiedAssertion?.license ?? response.license; - - await __unsafePrisma.license.update({ - where: { - orgId - }, - data: { - entitlements, - seats, - status, - planName, - unitAmount, - currency, - interval, - intervalCount, - nextRenewalAt: nextRenewalAt ? new Date(nextRenewalAt) : null, - nextRenewalAmount, - cancelAt: cancelAt ? new Date(cancelAt) : null, - trialEnd: trialEnd ? new Date(trialEnd) : null, - hasPaymentMethod, - yearlyTermStartedAt: yearlyTermStatus ? new Date(yearlyTermStatus.termStartedAt) : null, - yearlyTermEndsAt: yearlyTermStatus ? new Date(yearlyTermStatus.termEndsAt) : null, - yearlyTotalQuartersInTerm: yearlyTermStatus?.totalQuartersInTerm ?? null, - yearlyCurrentQuarterNumber: yearlyTermStatus?.currentQuarterNumber ?? null, - yearlyCurrentQuarterStartedAt: yearlyTermStatus ? new Date(yearlyTermStatus.currentQuarterStartedAt) : null, - yearlyCurrentQuarterEndsAt: yearlyTermStatus ? new Date(yearlyTermStatus.currentQuarterEndsAt) : null, - yearlyCommittedSeats: yearlyTermStatus?.committedSeats ?? null, - yearlyOverageSeats: yearlyTermStatus?.overageSeats ?? null, - yearlyBillableOverageSeats: yearlyTermStatus?.billableOverageSeats ?? null, - yearlyPeakSeats: yearlyTermStatus?.peakSeats ?? null, - lastSyncAt: new Date(), - lastSyncErrorCode: null, - ...(licenseAssertion !== undefined && { licenseAssertion }), - }, - }); - - logger.info(`License synced: entitlements=${entitlements.join(',')}, seats=${seats}, status=${status}`); - } -}; - -export const startServicePingCronJob = () => { - setInterval( - () => syncWithLighthouse(SINGLE_TENANT_ORG_ID).catch(() => { /* ignore error */ }), - SERVICE_PING_INTERVAL_MS - ); -}; - -const inferDeploymentType = (): string => { - if (process.env.KUBERNETES_SERVICE_HOST) { - return 'kubernetes'; - } - if (existsSync('/.dockerenv')) { - return 'docker'; - } - return 'other'; -}; - -const recordServicePingInDB = async (orgId: number, payload: ServicePingRequest) => { - // Strip the activation code before persisting. - const { activationCode: _activationCode, ...sanitizedPayload } = payload; - - try { - await __unsafePrisma.servicePingEvent.create({ - data: { - orgId, - payload: sanitizedPayload, - }, - }); - } catch (error) { - // Recording the ping is best-effort: a failure here must not prevent - // the actual ping from being sent to Lighthouse. - logger.error(`Failed to record service ping in database:\n ${error}`); - } -}; diff --git a/packages/web/src/features/billing/systemInfo.ts b/packages/web/src/features/billing/systemInfo.ts deleted file mode 100644 index b72e3fd55..000000000 --- a/packages/web/src/features/billing/systemInfo.ts +++ /dev/null @@ -1,142 +0,0 @@ -import os from "node:os"; -import fs from "node:fs/promises"; -import { env, createLogger, type SystemInfo } from "@sourcebot/shared"; - -const logger = createLogger('system-info'); - -// cgroup v2 (unified hierarchy). -const CGROUP_V2_MEMORY_MAX = '/sys/fs/cgroup/memory.max'; -const CGROUP_V2_MEMORY_CURRENT = '/sys/fs/cgroup/memory.current'; -const CGROUP_V2_CPU_MAX = '/sys/fs/cgroup/cpu.max'; - -// cgroup v1 (legacy hierarchy). -const CGROUP_V1_MEMORY_LIMIT = '/sys/fs/cgroup/memory/memory.limit_in_bytes'; -const CGROUP_V1_MEMORY_USAGE = '/sys/fs/cgroup/memory/memory.usage_in_bytes'; -const CGROUP_V1_CPU_QUOTA = '/sys/fs/cgroup/cpu/cpu.cfs_quota_us'; -const CGROUP_V1_CPU_PERIOD = '/sys/fs/cgroup/cpu/cpu.cfs_period_us'; - -/** - * Collects a snapshot of the resources this deployment is running with, so we - * can quickly diagnose resource issues (e.g. "the customer doesn't have enough - * RAM") from the service ping. - * - * Everything is best-effort: any value we can't read is reported as `null` so a - * partial snapshot still goes out. Resource figures come from the container's - * cgroup (and `statfs` for disk) rather than host-level readings, which in a - * Dockerized or Kubernetes deployment report the underlying machine, not the - * container's actual limits. - */ -export const getSystemInfo = async (): Promise => { - const [memoryLimitBytes, memoryUsedBytes, cpuQuota, disk] = await Promise.all([ - readCgroupMemoryLimit(), - readCgroupMemoryUsage(), - readCgroupCpuQuota(), - readDiskUsage(env.DATA_CACHE_DIR), - ]); - - return { - platform: os.platform(), - arch: os.arch(), - cpuQuota, - memoryLimitMiB: memoryLimitBytes === null ? null : bytesToMiB(memoryLimitBytes), - memoryUsedMiB: memoryUsedBytes === null ? null : bytesToMiB(memoryUsedBytes), - diskTotalMiB: disk.totalBytes === null ? null : bytesToMiB(disk.totalBytes), - diskFreeMiB: disk.freeBytes === null ? null : bytesToMiB(disk.freeBytes), - }; -}; - -const BYTES_PER_MIB = 1024 * 1024; - -// Memory and disk are both reported in whole MiB (binary, 1024-based units), -// matching how RAM and container/k8s volumes are sized. -const bytesToMiB = (bytes: number): number => Math.round(bytes / BYTES_PER_MIB); - -const readFileTrimmed = async (path: string): Promise => { - try { - const contents = await fs.readFile(path, 'utf8'); - return contents.trim(); - } catch { - // The file won't exist outside of a cgroup-managed environment (e.g. - // local dev on macOS), which is expected — treat as "unknown". - return null; - } -}; - -/** - * Parses a byte count from a cgroup file, returning `null` for "unlimited": - * the literal `max` in cgroup v2, or a sentinel larger than JS can safely - * represent in cgroup v1 (e.g. 9223372036854771712). - */ -const parseCgroupBytes = (raw: string | null): number | null => { - if (raw === null || raw === 'max') { - return null; - } - const value = Number(raw); - if (!Number.isSafeInteger(value) || value < 0) { - return null; - } - return value; -}; - -const readCgroupMemoryLimit = async (): Promise => { - const v2 = parseCgroupBytes(await readFileTrimmed(CGROUP_V2_MEMORY_MAX)); - if (v2 !== null) { - return v2; - } - return parseCgroupBytes(await readFileTrimmed(CGROUP_V1_MEMORY_LIMIT)); -}; - -const readCgroupMemoryUsage = async (): Promise => { - const v2 = parseCgroupBytes(await readFileTrimmed(CGROUP_V2_MEMORY_CURRENT)); - if (v2 !== null) { - return v2; - } - return parseCgroupBytes(await readFileTrimmed(CGROUP_V1_MEMORY_USAGE)); -}; - -/** - * Returns the effective CPU limit in cores (e.g. 0.5, 2), or `null` when there - * is no quota (unlimited) or it can't be read. - */ -const readCgroupCpuQuota = async (): Promise => { - // cgroup v2: `cpu.max` is " " (in microseconds), or - // "max " when unlimited. - const v2 = await readFileTrimmed(CGROUP_V2_CPU_MAX); - if (v2 !== null) { - const [quotaRaw, periodRaw] = v2.split(/\s+/); - if (quotaRaw === 'max') { - return null; - } - const quota = Number(quotaRaw); - const period = Number(periodRaw); - if (Number.isFinite(quota) && quota > 0 && Number.isFinite(period) && period > 0) { - return roundToTwo(quota / period); - } - return null; - } - - // cgroup v1: cpu.cfs_quota_us / cpu.cfs_period_us; a quota of -1 is unlimited. - const quota = Number(await readFileTrimmed(CGROUP_V1_CPU_QUOTA)); - const period = Number(await readFileTrimmed(CGROUP_V1_CPU_PERIOD)); - if (!Number.isFinite(quota) || quota <= 0 || !Number.isFinite(period) || period <= 0) { - return null; - } - return roundToTwo(quota / period); -}; - -const readDiskUsage = async (path: string): Promise<{ totalBytes: number | null; freeBytes: number | null }> => { - try { - const stats = await fs.statfs(path); - return { - totalBytes: stats.blocks * stats.bsize, - // bavail is blocks available to unprivileged users, which best - // reflects what the deployment can actually write. - freeBytes: stats.bavail * stats.bsize, - }; - } catch (error) { - logger.debug(`Failed to read disk usage for ${path}: ${error}`); - return { totalBytes: null, freeBytes: null }; - } -}; - -const roundToTwo = (n: number): number => Math.round(n * 100) / 100; diff --git a/packages/web/src/features/billing/upsellDialog.tsx b/packages/web/src/features/billing/upsellDialog.tsx deleted file mode 100644 index 9cb676a81..000000000 --- a/packages/web/src/features/billing/upsellDialog.tsx +++ /dev/null @@ -1,377 +0,0 @@ -"use client"; - -import { useToast } from "@/components/hooks/use-toast"; -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogClose, - DialogContent, - DialogDescription, - DialogTitle, -} from "@/components/ui/dialog"; -import { LoadingButton } from "@/components/ui/loading-button"; -import { Skeleton } from "@/components/ui/skeleton"; -import { createCheckoutSession } from "@/features/billing/actions"; -import { useHasLicense } from "@/features/billing/hasLicenseProvider"; -import { BillingInterval, PlanComparisonTable } from "@/features/billing/planComparisonTable"; -import type { OffersResponse } from "@sourcebot/shared/client"; -import { useOffers } from "@/features/billing/useOffers"; -import { useRole } from "@/features/auth/useRole"; -import useCaptureEvent from "@/hooks/useCaptureEvent"; -import { UpsellSource } from "@/lib/posthogEvents"; -import { cn, isServiceError } from "@/lib/utils"; -import { OrgRole } from "@sourcebot/db"; -import { AlertCircle, ArrowUpCircle, ExternalLink, Loader2 } from "lucide-react"; -import { useSession } from "next-auth/react"; -import { ReactNode, useCallback, useEffect, useMemo, useState } from "react"; -import { CheckoutDisclosures } from "./checkoutDisclosures"; -import { CodeSnippet } from "@/app/components/codeSnippet"; - -interface UpsellDialogProps { - open: boolean; - onOpenChange: (open: boolean) => void; - source: UpsellSource; - returnPath?: string; -} - -export function UpsellDialog({ open, onOpenChange, source, returnPath }: UpsellDialogProps) { - const { data: offers, isPending, isError, refetch } = useOffers(); - const captureEvent = useCaptureEvent(); - - useEffect(() => { - if (open) { - captureEvent('wa_upsell_dialog_viewed', { source }); - } - }, [open, source, captureEvent]); - - return ( - - - {isError ? ( - // Keep the dialog open with a recoverable error state rather than - // closing it out from under the user — the built-in close button - // is still the dismiss affordance. - { void refetch(); }} /> - ) : isPending ? ( -
- -
- ) : ( - - )} -
-
- ); -} - -interface UpsellLoadErrorProps { - variant: "dialog" | "inline"; - onRetry: () => void; - className?: string; -} - -// Shared fallback for when the offers/pricing fetch fails. Offers a retry plus a -// link to the public pricing page — the latter is resilient to the very failure -// that triggered this state, since it doesn't depend on the offers endpoint. -function UpsellLoadError({ variant, onRetry, className }: UpsellLoadErrorProps) { - const role = useRole(); - const isOwner = role === OrgRole.OWNER; - const heading = "Something went wrong"; - const body = ( - <> - We couldn't reach Sourcebot's deployments server.{" "} - {/* Owners get an actionable hint (the most common cause on self-hosted - deployments is outbound access to the lighthouse host being blocked); - members can't act on this themselves, so route them to an admin. */} - {isOwner ? ( - <> - Check that outbound access to{" "} - deployments.sourcebot.dev{" "}isn't blocked.{" "} - - Learn more - - . - - ) : ( - <>Contact your organization admin. - )} - - ); - return ( -
-
- - {variant === "dialog" ? ( - {heading} - ) : ( -

{heading}

- )} - {variant === "dialog" ? ( - {body} - ) : ( -

{body}

- )} -
- -
- - -
-
- ); -} - -// Whether the upsell is being shown to a workspace with no usable license at -// all ('free') or to one with an existing online license that's lapsed -// ('expired'). Drives the no-trial-eligible copy so an expired-license user -// doesn't see misleading "free plan" framing. -export type UpsellLicenseState = 'free' | 'expired'; - -interface UpsellPanelProps { - source: UpsellSource; - returnPath?: string; - className?: string; - licenseState?: UpsellLicenseState; - // Optional context-specific heading + subheading (e.g. "Upgrade to view Ask - // Sourcebot history"). Fall back to the billing-state-derived copy when omitted. - title?: string; - description?: ReactNode; - // How to render the pending state. Use 'skeleton' (default) when the panel is - // embedded in-flow alongside other content, so the reserved space avoids - // layout shift. Use 'spinner' when the panel is the sole, centered element in - // a large empty region (e.g. a full-area feature gate), where a shaped - // skeleton reads as heavier than a simple spinner. - loadingVariant?: 'skeleton' | 'spinner'; -} - -export function UpsellPanel({ source, returnPath, className, licenseState = 'free', title, description, loadingVariant = 'skeleton' }: UpsellPanelProps) { - const { data: offers, isPending, isError, refetch } = useOffers(); - - if (isError) { - return { void refetch(); }} className={className} />; - } - - if (isPending || !offers) { - if (loadingVariant === 'spinner') { - return ( -
- -
- ); - } - return ( -
-
- - - -
- -
- - -
-
- ); - } - - return ( -
- -
- ); -} - -interface UpsellPanelContentProps { - offers: OffersResponse; - source: UpsellSource; - returnPath?: string; - variant: "dialog" | "inline"; - licenseState: UpsellLicenseState; - titleOverride?: string; - descriptionOverride?: ReactNode; -} - -function UpsellPanelContent({ offers, source, returnPath, variant, licenseState, titleOverride, descriptionOverride }: UpsellPanelContentProps) { - const [billingInterval, setBillingInterval] = useState("year"); - const [isCheckoutSessionCreating, setIsCheckoutSessionCreating] = useState(false); - const { data: session } = useSession(); - const sessionEmail = session?.user?.email ?? ""; - const [currentEmail, setCurrentEmail] = useState(""); - const { toast } = useToast(); - const role = useRole(); - const isOwner = role === OrgRole.OWNER; - const hasExistingLicense = useHasLicense(); - - // Only treat the email as an override when the user has actually changed it - // away from the canonical session email. - const overrideEmail = - ( - sessionEmail && - currentEmail && - currentEmail !== sessionEmail - ) - ? currentEmail - : undefined; - - const handlePrimaryAction = useCallback(() => { - setIsCheckoutSessionCreating(true); - createCheckoutSession({ - source, - requestTrial: offers.trial.eligible, - interval: billingInterval, - returnPath, - overrideEmail, - }) - .then((response) => { - if (isServiceError(response)) { - toast({ - description: `Failed to start checkout: ${response.message}`, - variant: "destructive", - }); - setIsCheckoutSessionCreating(false); - } else { - try { - const checkoutUrl = new URL(response.url); - const allowedHosts = new Set(["checkout.stripe.com", "billing.stripe.com"]); - if (checkoutUrl.protocol !== "https:" || !allowedHosts.has(checkoutUrl.hostname)) { - throw new Error("Untrusted checkout URL."); - } - window.location.assign(checkoutUrl.toString()); - } catch { - toast({ - description: "Failed to start checkout. Please try again.", - variant: "destructive", - }); - setIsCheckoutSessionCreating(false); - } - } - }) - .catch(() => { - toast({ - description: "Failed to start checkout. Please try again.", - variant: "destructive", - }); - setIsCheckoutSessionCreating(false); - }) - }, [billingInterval, offers.trial.eligible, returnPath, toast, source, overrideEmail]); - - const { title: computedTitle, description: computedDescription, buttonText } = useMemo(() => { - // Members can't upgrade the workspace themselves — show them the feature - // table so they understand what's gated, but route them to the owner. - if (!isOwner) { - return { - title: "Sourcebot Pro", - description: "Ask your organization owner to upgrade to Sourcebot Pro.", - buttonText: "Got it", - } - } - // trial, no cc - if (offers.trial.eligible && !offers.trial.creditCardRequired) { - return { - title: "Try Sourcebot Pro", - description: `Get full access free for ${offers.trial.durationDays} days. No credit card required.`, - buttonText: `Start ${offers.trial.durationDays}-day free trial` - } - } - // trial, cc - else if (offers.trial.eligible && offers.trial.creditCardRequired) { - return { - title: "Try Sourcebot Pro", - description: `Get full access free for ${offers.trial.durationDays} days. Card required, cancel anytime.`, - buttonText: `Start ${offers.trial.durationDays}-day free trial` - } - } - // no trial - else { - if (licenseState === 'expired') { - return { - title: "Your license has expired", - description: "Upgrade to continue using paid features.", - buttonText: "Upgrade" - } - } - return { - title: "Your organization is on the free plan", - description: "Upgrade to unlock more features.", - buttonText: "Upgrade" - } - } - }, [isOwner, offers.trial.creditCardRequired, offers.trial.durationDays, offers.trial.eligible, licenseState]); - - // Allow callers to override the heading/subheading with feature-specific - // context while keeping the billing-state-derived button text. - const title = titleOverride ?? computedTitle; - const description = descriptionOverride ?? computedDescription; - - return ( - <> -
- - {variant === "dialog" ? ( - {title} - ) : ( -

{title}

- )} - {variant === "dialog" ? ( - {description} - ) : ( -

{description}

- )} -
- - - -
- - {isOwner ? ( - - {buttonText} - - ) : variant === "dialog" ? ( - - - - ) : ( - - )} -
- - {isOwner && ( - - )} - - ); -} diff --git a/packages/web/src/features/billing/useClaimActivationCode.ts b/packages/web/src/features/billing/useClaimActivationCode.ts deleted file mode 100644 index a500e0fc8..000000000 --- a/packages/web/src/features/billing/useClaimActivationCode.ts +++ /dev/null @@ -1,108 +0,0 @@ -'use client'; - -import { ServiceError } from '@/lib/serviceError'; -import { isServiceError } from '@/lib/utils'; -import { useCallback, useEffect, useRef, useState } from 'react'; -import { claimActivationCode } from './actions'; - -// Lighthouse-side error code that means "the subscription.created webhook hasn't -// minted the activation code yet, retry shortly." Any other lighthouse error -// (session not found, install mismatch, already claimed) is terminal. -// See `lighthouse/lambda/serviceError.ts`. -const ACTIVATION_CODE_NOT_READY = 'ACTIVATION_CODE_NOT_READY'; - -const INITIAL_DELAY_MS = 500; -const MAX_DELAY_MS = 3_000; -const MAX_TOTAL_MS = 15_000; - -type ClaimStatus = 'idle' | 'polling' | 'success' | 'error'; - -export interface UseClaimActivationCodeReturn { - status: ClaimStatus; - activationCode?: string; - error?: ServiceError; - attempt: number; - start: (sessionId: string) => void; - cancel: () => void; -} - -export const useClaimActivationCode = (): UseClaimActivationCodeReturn => { - const [status, setStatus] = useState('idle'); - const [activationCode, setActivationCode] = useState(); - const [error, setError] = useState(); - const [attempt, setAttempt] = useState(0); - - const cancelledRef = useRef(false); - - const cancel = useCallback(() => { - cancelledRef.current = true; - }, []); - - const start = useCallback((sessionId: string) => { - cancelledRef.current = false; - const startedAt = Date.now(); - - setStatus('polling'); - setActivationCode(undefined); - setError(undefined); - setAttempt(0); - - const run = async () => { - let delay = INITIAL_DELAY_MS; - let currentAttempt = 0; - - while (!cancelledRef.current) { - currentAttempt++; - setAttempt(currentAttempt); - - if (Date.now() - startedAt >= MAX_TOTAL_MS) { - setError({ - statusCode: 408, - errorCode: 'CLAIM_POLL_TIMEOUT', - message: 'Timed out waiting for the activation code to be issued.', - }); - setStatus('error'); - return; - } - - const result = await claimActivationCode(sessionId); - if (cancelledRef.current) { - return; - } - - if (!isServiceError(result)) { - setActivationCode(result.activationCode); - setStatus('success'); - return; - } - - if (result.errorCode !== ACTIVATION_CODE_NOT_READY) { - setError(result); - setStatus('error'); - return; - } - - await new Promise((resolve) => setTimeout(resolve, delay)); - delay = Math.min(delay * 2, MAX_DELAY_MS); - } - }; - - void run(); - }, []); - - // Cancel any in-flight polling when the component using this hook unmounts. - useEffect(() => { - return () => { - cancelledRef.current = true; - }; - }, []); - - return { - status, - activationCode, - error, - attempt, - start, - cancel, - }; -}; diff --git a/packages/web/src/features/billing/useOffers.ts b/packages/web/src/features/billing/useOffers.ts deleted file mode 100644 index 347e2f4a6..000000000 --- a/packages/web/src/features/billing/useOffers.ts +++ /dev/null @@ -1,16 +0,0 @@ -'use client'; - -import { getOffers } from "@/app/api/(client)/client"; -import { unwrapServiceError } from "@/lib/utils"; -import { useQuery } from "@tanstack/react-query"; - -export const useOffers = (params?: { - retry: number, -}) => { - return useQuery({ - queryKey: ["offers"], - queryFn: async () => unwrapServiceError(getOffers()), - retry: params?.retry, - refetchOnWindowFocus: false - }); -} \ No newline at end of file diff --git a/packages/web/src/features/changelog/listEntriesApi.ts b/packages/web/src/features/changelog/listEntriesApi.ts deleted file mode 100644 index 09718f8b7..000000000 --- a/packages/web/src/features/changelog/listEntriesApi.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { withOptionalAuth } from "@/middleware/withAuth"; -import { env } from "@sourcebot/shared"; - -export type ChangelogEntryDto = { - slug: string; - title: string; - publishedAt: string; - summary: string; - version: string; - bodyMarkdown: string; -}; - -export type ListChangelogEntriesResponse = { - entries: ChangelogEntryDto[]; - /// Base URL used to resolve relative media references in `bodyMarkdown` - /// (e.g. `../media//foo.png`). Derived from CHANGELOG_FEED_URL. - entriesBaseUrl: string; -}; - -export const listChangelogEntries = async () => - sew(() => - withOptionalAuth(async ({ prisma }) => { - const entries = await prisma.changelogEntry.findMany({ - orderBy: { publishedAt: "desc" }, - }); - - const entriesBaseUrl = new URL("entries/", env.CHANGELOG_FEED_URL).toString(); - - const result: ListChangelogEntriesResponse = { - entries: entries.map((entry) => ({ - slug: entry.slug, - title: entry.title, - publishedAt: entry.publishedAt.toISOString(), - summary: entry.summary, - version: entry.version, - bodyMarkdown: entry.bodyMarkdown, - })), - entriesBaseUrl, - }; - return result; - }) - ); diff --git a/packages/web/src/features/changelog/pollChangelog.ts b/packages/web/src/features/changelog/pollChangelog.ts deleted file mode 100644 index dc6945cac..000000000 --- a/packages/web/src/features/changelog/pollChangelog.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { __unsafePrisma } from "@/prisma"; -import { createLogger, env } from "@sourcebot/shared"; -import { changelogFeedIndexSchema, type ChangelogFeedIndexEntry } from "./types"; - -const logger = createLogger("changelog"); - -const POLL_INTERVAL_MS = 6 * 60 * 60 * 1000; // 6 hours -const FETCH_TIMEOUT_MS = 10 * 1000; - -const FRONTMATTER_RE = /^---\r?\n[\s\S]*?\r?\n---\r?\n?/; - -const stripFrontmatter = (markdown: string): string => markdown.replace(FRONTMATTER_RE, "").trimStart(); - -const fetchWithTimeout = async (url: string): Promise => { - const response = await fetch(url, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) }); - if (!response.ok) { - throw new Error(`GET ${url} failed: ${response.status} ${response.statusText}`); - } - return response; -}; - -const upsertEntry = async (entry: ChangelogFeedIndexEntry, baseUrl: string): Promise => { - const bodyUrl = new URL(entry.path, baseUrl).toString(); - const response = await fetchWithTimeout(bodyUrl); - const rawMarkdown = await response.text(); - const bodyMarkdown = stripFrontmatter(rawMarkdown); - - const data = { - slug: entry.slug, - title: entry.title, - publishedAt: new Date(entry.publishedAt), - summary: entry.summary, - version: entry.version, - bodyMarkdown, - }; - - await __unsafePrisma.changelogEntry.upsert({ - where: { slug: entry.slug }, - create: data, - update: data, - }); -}; - -export const pollChangelog = async (): Promise => { - if (env.CHANGELOG_ENABLED !== "true") { - return; - } - - const feedUrl = env.CHANGELOG_FEED_URL; - - let parsedIndex; - try { - const response = await fetchWithTimeout(feedUrl); - const json = await response.json(); - parsedIndex = changelogFeedIndexSchema.parse(json); - } catch (err) { - // Network or parse failure — keep serving whatever is cached. - logger.warn(`Failed to fetch changelog index from ${feedUrl}: ${err instanceof Error ? err.message : String(err)}`); - return; - } - - let upserted = 0; - for (const entry of parsedIndex.entries) { - try { - await upsertEntry(entry, feedUrl); - upserted++; - } catch (err) { - logger.warn(`Failed to upsert changelog entry '${entry.slug}': ${err instanceof Error ? err.message : String(err)}`); - } - } - - logger.debug(`Changelog poll complete: ${upserted}/${parsedIndex.entries.length} entries upserted`); -}; - -export const startChangelogPollingJob = (): void => { - if (env.CHANGELOG_ENABLED !== "true") { - logger.info("Changelog feed disabled via CHANGELOG_ENABLED — skipping poll job"); - return; - } - pollChangelog().catch(() => { /* logged inside */ }); - setInterval(() => { - pollChangelog().catch(() => { /* logged inside */ }); - }, POLL_INTERVAL_MS); -}; diff --git a/packages/web/src/features/changelog/types.ts b/packages/web/src/features/changelog/types.ts deleted file mode 100644 index 30d0c7db5..000000000 --- a/packages/web/src/features/changelog/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { z } from "zod"; - -export const changelogFeedIndexEntrySchema = z.object({ - slug: z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/), - title: z.string().min(1), - publishedAt: z.string().regex(/^\d{4}-\d{2}-\d{2}$/), - summary: z.string().min(1), - version: z.string().regex(/^v\d+\.\d+\.\d+$/), - path: z.string().min(1), -}); - -export const changelogFeedIndexSchema = z.object({ - schemaVersion: z.literal(1), - entries: z.array(changelogFeedIndexEntrySchema), -}); - -export type ChangelogFeedIndex = z.infer; -export type ChangelogFeedIndexEntry = z.infer; diff --git a/packages/web/src/features/chat/README.md b/packages/web/src/features/chat/README.md deleted file mode 100644 index 79d53476b..000000000 --- a/packages/web/src/features/chat/README.md +++ /dev/null @@ -1,15 +0,0 @@ -## Sources and References - -We have the concept of "sources" and "references" in sb: -1. **source** - A source is some artifact that exists in the codebase (e.g., file, commit, etc.) that helps the LLM ground its answer in reality. -2. **references** - A reference (or citation) is a _pointer_ to a source that the LLM can output in it's response so that the developer can understand why the LLM got to the conclusion it got to. - -Sources can be attached to a chat thread in two ways: -1. The developer @ mentions a source (e.g., _"what does `@auth.ts` do?"_) in their request. -2. The LLM makes a tool call (e.g., `readFile`) in its response. - -Sources are included in the chat thread using a [custom data part](https://v5.ai-sdk.dev/docs/ai-sdk-ui/streaming-data#streaming-custom-data) as a JSON payload with the necessary data to allow us to retrieve the source at a later point (e.g., in `ReferencedSourcesListView.tsx`). - -References are included in a LLMs response by embedding a known pattern (e.g., `@file:{auth.ts:12-24}`) that can be grepped and rendered with a custom component using a [remark plugin](https://github.com/remarkjs/remark). The LLM is instructed to use this pattern in the system prompt. - -The process of resolving a reference to a source is inherently fuzzy since we are not guaranteed any determinism with LLMs (e.g., the LLM could hallucinate a source that doesn't exist). We perform reference resolution on a best-effort basis. \ No newline at end of file diff --git a/packages/web/src/features/chat/actions.ts b/packages/web/src/features/chat/actions.ts deleted file mode 100644 index 8a2a9d5ea..000000000 --- a/packages/web/src/features/chat/actions.ts +++ /dev/null @@ -1,541 +0,0 @@ -'use server'; - -import { sew } from "@/middleware/sew"; -import { createAudit } from "@/ee/features/audit/audit"; -import { getAnonymousId, getOrCreateAnonymousId } from "@/lib/anonymousId"; -import { captureEvent } from "@/lib/posthog"; -import { notFound } from "@/lib/serviceError"; -import { withAuth, withOptionalAuth } from "@/middleware/withAuth"; -import { ChatVisibility, Prisma } from "@sourcebot/db"; -import { SBChatMessage } from "./types"; -import { activeMembershipWhere } from "../membership/utils"; -import { checkAskEntitlement, deleteOrphanedAttachments, isChatSharedWithUser, isOwnerOfChat, resolveChatAccess } from "./utils.server"; - -export const createChat = async ({ source }: { source?: string } = {}) => sew(() => - withOptionalAuth(async ({ org, user, prisma }) => { - const askError = await checkAskEntitlement(); - if (askError) { - return askError; - } - - const isGuestUser = user === undefined; - - // For anonymous users, get or create an anonymous ID to track ownership - const anonymousCreatorId = isGuestUser ? await getOrCreateAnonymousId() : undefined; - - const chat = await prisma.chat.create({ - data: { - orgId: org.id, - messages: [] as unknown as Prisma.InputJsonValue, - createdById: user?.id, - anonymousCreatorId, - visibility: isGuestUser ? ChatVisibility.PUBLIC : ChatVisibility.PRIVATE, - }, - }); - - // Only create audit log for authenticated users - if (!isGuestUser) { - await createAudit({ - action: "user.created_ask_chat", - actor: { - id: user.id, - type: "user", - }, - target: { - id: org.id.toString(), - type: "org", - }, - orgId: org.id, - metadata: { source }, - }); - } - - await captureEvent('ask_thread_created', { - chatId: chat.id, - isAnonymous: isGuestUser, - source, - }); - - return { - id: chat.id, - isAnonymous: isGuestUser, - } - }) -); - -export const getChatInfo = async ({ chatId }: { chatId: string }) => sew(() => - withOptionalAuth(async ({ org, user, prisma }) => { - const chat = await prisma.chat.findUnique({ - where: { - id: chatId, - orgId: org.id, - }, - }); - - if (!chat) { - return notFound(); - } - - const { isOwner, isSharedWithUser, canView } = await resolveChatAccess({ prisma, chat, user }); - - // Private chats can only be viewed by the owner or users it's been shared with - if (!canView) { - return notFound(); - } - - return { - messages: chat.messages as unknown as SBChatMessage[], - visibility: chat.visibility, - name: chat.name, - isOwner, - isSharedWithUser, - }; - }) -); - -export const updateChatName = async ({ chatId, name }: { chatId: string, name: string }) => sew(() => - withOptionalAuth(async ({ org, user, prisma }) => { - const chat = await prisma.chat.findUnique({ - where: { - id: chatId, - orgId: org.id, - }, - }); - - if (!chat) { - return notFound(); - } - - const isOwner = await isOwnerOfChat(chat, user); - - // Only the owner can rename chats - if (!isOwner) { - return notFound(); - } - - await prisma.chat.update({ - where: { - id: chatId, - orgId: org.id, - }, - data: { - name, - }, - }); - - return { - success: true, - } - }) -); - -export const updateChatVisibility = async ({ chatId, visibility }: { chatId: string, visibility: ChatVisibility }) => sew(() => - withAuth(async ({ org, user, prisma }) => { - const askError = await checkAskEntitlement(); - if (askError) { - return askError; - } - - const chat = await prisma.chat.findUnique({ - where: { - id: chatId, - orgId: org.id, - }, - }); - - if (!chat) { - return notFound(); - } - - // Only the creator can change visibility - if (chat.createdById !== user.id) { - return notFound(); - } - - await prisma.chat.update({ - where: { - id: chatId, - orgId: org.id, - }, - data: { - visibility, - }, - }); - - await createAudit({ - action: "chat.visibility_updated", - actor: { id: user.id, type: "user" }, - target: { id: chatId, type: "chat" }, - orgId: org.id, - metadata: { message: `Visibility changed to ${visibility}` }, - }); - - return { - success: true, - } - }) -); - -export const deleteChat = async ({ chatId }: { chatId: string }) => sew(() => - withAuth(async ({ org, user, prisma }) => { - const chat = await prisma.chat.findUnique({ - where: { - id: chatId, - orgId: org.id, - }, - }); - - if (!chat) { - return notFound(); - } - - // Only the creator of a chat can delete it. - if (chat.createdById !== user.id) { - return notFound(); - } - - // Capture the linked attachment ids before the delete cascades the - // link rows, so we can sweep any blobs left with zero links afterwards. - const linkedAttachments = await prisma.chatAttachment.findMany({ - where: { chatId }, - select: { attachmentId: true }, - }); - - await prisma.chat.delete({ - where: { - id: chatId, - orgId: org.id, - }, - }); - - await deleteOrphanedAttachments({ - prisma, - attachmentIds: linkedAttachments.map((link) => link.attachmentId), - }); - - await createAudit({ - action: "chat.deleted", - actor: { id: user.id, type: "user" }, - target: { id: chatId, type: "chat" }, - orgId: org.id, - }); - - return { - success: true, - } - }) -); - -/** - * Claims any anonymous chats created by the current user (matched via anonymousCreatorId cookie). - * This should be called after a user signs in to transfer ownership of their anonymous chats. - * Visibility is preserved so shared links continue to work. - */ -export const claimAnonymousChats = async () => sew(() => - withAuth(async ({ org, user, prisma }) => { - const anonymousId = await getAnonymousId(); - - if (!anonymousId) { - return { claimed: 0 }; - } - - const result = await prisma.chat.updateMany({ - where: { - orgId: org.id, - anonymousCreatorId: anonymousId, - createdById: null, - }, - data: { - createdById: user.id, - anonymousCreatorId: null, - }, - }); - - if (result.count > 0) { - captureEvent('wa_anonymous_chats_claimed', { - claimedCount: result.count, - }); - } - - return { claimed: result.count }; - }) -); - -/** - * Duplicates a chat with all its messages. - * The new chat will be owned by the current user (authenticated or anonymous). - */ -export const duplicateChat = async ({ chatId, newName }: { chatId: string, newName: string }) => sew(() => - withOptionalAuth(async ({ org, user, prisma }) => { - const askError = await checkAskEntitlement(); - if (askError) { - return askError; - } - - const originalChat = await prisma.chat.findUnique({ - where: { - id: chatId, - orgId: org.id, - }, - }); - - if (!originalChat) { - return notFound(); - } - - // Check if user can access the chat (owner, shared, or public) - const isOwner = await isOwnerOfChat(originalChat, user); - const isSharedWithUser = await isChatSharedWithUser({ prisma, chatId, userId: user?.id }); - if (originalChat.visibility === ChatVisibility.PRIVATE && !isOwner && !isSharedWithUser) { - return notFound(); - } - - const isGuestUser = user === undefined; - const anonymousCreatorId = isGuestUser ? await getOrCreateAnonymousId() : undefined; - - // Snapshot the source chat's links before creating the duplicate; a - // concurrent delete could otherwise cascade them away first, leaving the - // copied messages pointing at blobs the new chat is never linked to. - const originalLinks = await prisma.chatAttachment.findMany({ - where: { chatId: originalChat.id }, - select: { attachmentId: true }, - }); - - const newChat = await prisma.chat.create({ - data: { - orgId: org.id, - name: newName, - messages: originalChat.messages as unknown as Prisma.InputJsonValue, - createdById: user?.id, - anonymousCreatorId, - visibility: isGuestUser ? ChatVisibility.PUBLIC : ChatVisibility.PRIVATE, - }, - }); - - // Copy the attachment links (metadata-only; no byte copy). The - // duplicated messages reference the same blobs, and access stays - // chat-derived through the new chat's links. - if (originalLinks.length > 0) { - await prisma.chatAttachment.createMany({ - data: originalLinks.map((link) => ({ - chatId: newChat.id, - attachmentId: link.attachmentId, - })), - skipDuplicates: true, - }); - } - - return { - id: newChat.id, - }; - }) -); - -/** - * Returns the users that have been explicitly shared access to a chat. - */ -export const getSharedWithUsersForChat = async ({ chatId }: { chatId: string }) => sew(() => - withAuth(async ({ org, user, prisma }) => { - const askError = await checkAskEntitlement(); - if (askError) { - return askError; - } - - const chat = await prisma.chat.findUnique({ - where: { - id: chatId, - orgId: org.id, - }, - }); - - if (!chat) { - return notFound(); - } - - // Only the creator can view shares - if (chat.createdById !== user.id) { - return notFound(); - } - - const sharedWithUsers = await prisma.chatAccess.findMany({ - where: { - chatId, - }, - select: { - user: true, - }, - }); - - return sharedWithUsers.map(({ user }) => ({ - id: user.id, - email: user.email, - name: user.name, - image: user.image, - })); - }) -); - -/** - * Shares the chat with a list of users. - */ -export const shareChatWithUsers = async ({ chatId, userIds }: { chatId: string, userIds: string[] }) => sew(() => - withAuth(async ({ org, user, prisma }) => { - const askError = await checkAskEntitlement(); - if (askError) { - return askError; - } - - const chat = await prisma.chat.findUnique({ - where: { - id: chatId, - orgId: org.id, - }, - }); - - if (!chat) { - return notFound(); - } - - // Only the creator can share - if (chat.createdById !== user.id) { - return notFound(); - } - - - const memberships = await prisma.userToOrg.findMany({ - where: { - orgId: org.id, - ...activeMembershipWhere(), - userId: { - in: userIds, - }, - }, - }); - - if (memberships.length !== userIds.length) { - return notFound(); - } - - await prisma.chatAccess.createMany({ - data: userIds.map((userId) => ({ - chatId, - userId, - })), - skipDuplicates: true, - }); - - await createAudit({ - action: "chat.shared_with_users", - actor: { id: user.id, type: "user" }, - target: { id: chatId, type: "chat" }, - orgId: org.id, - metadata: { message: userIds.join(", ") }, - }); - - return { success: true }; - }) -); - -/** - * Revokes access to a chat for a particular user. - */ -export const unshareChatWithUser = async ({ chatId, userId }: { chatId: string, userId: string }) => sew(() => - withAuth(async ({ org, user, prisma }) => { - const askError = await checkAskEntitlement(); - if (askError) { - return askError; - } - - const chat = await prisma.chat.findUnique({ - where: { - id: chatId, - orgId: org.id, - }, - }); - - if (!chat) { - return notFound(); - } - - // Only the creator can remove shares - if (chat.createdById !== user.id) { - return notFound(); - } - - await prisma.chatAccess.deleteMany({ - where: { - chatId, - userId, - }, - }); - - await createAudit({ - action: "chat.unshared_with_user", - actor: { id: user.id, type: "user" }, - target: { id: chatId, type: "chat" }, - orgId: org.id, - metadata: { message: userId }, - }); - - return { success: true }; - }) -); - -export const submitFeedback = async ({ - chatId, - messageId, - feedbackType -}: { - chatId: string, - messageId: string, - feedbackType: 'like' | 'dislike' -}) => sew(() => - withOptionalAuth(async ({ org, user, prisma }) => { - const chat = await prisma.chat.findUnique({ - where: { - id: chatId, - orgId: org.id, - }, - }); - - if (!chat) { - return notFound(); - } - - // When a chat is private, only the creator or shared users can submit feedback. - const isSharedWithUser = await isChatSharedWithUser({ prisma, chatId, userId: user?.id }); - if (chat.visibility === ChatVisibility.PRIVATE && chat.createdById !== user?.id && !isSharedWithUser) { - return notFound(); - } - - const messages = chat.messages as unknown as SBChatMessage[]; - const updatedMessages = messages.map(message => { - if (message.id === messageId && message.role === 'assistant') { - return { - ...message, - metadata: { - ...message.metadata, - feedback: [ - ...(message.metadata?.feedback ?? []), - { - type: feedbackType, - timestamp: new Date().toISOString(), - userId: user?.id, - } - ] - } - } satisfies SBChatMessage; - } - return message; - }); - - await prisma.chat.update({ - where: { id: chatId }, - data: { - messages: updatedMessages as unknown as Prisma.InputJsonValue, - }, - }); - - return { success: true }; - }) -) diff --git a/packages/web/src/features/chat/askMcpAnalytics.server.ts b/packages/web/src/features/chat/askMcpAnalytics.server.ts deleted file mode 100644 index 67e1ab6df..000000000 --- a/packages/web/src/features/chat/askMcpAnalytics.server.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { getStoredMcpConnectionStatus } from "@/ee/features/chat/mcp/connectionStatus"; -import { hasEntitlement } from "@/lib/entitlements"; -import type { PrismaClient } from "@sourcebot/db"; -import type { DynamicToolUIPart } from "ai"; -import type { SBChatMessage, SBChatMessagePart } from "./types"; -import { getTurnProgressState } from "./utils"; - -export type AskMcpAvailabilityAnalytics = { - hasAskMcpServersAvailable: boolean; - askMcpConnectedServerCount: number; - askMcpEnabledServerCount: number; - askMcpDisabledServerCount: number; -}; - -export type AskMcpTurnCompletedAnalytics = { - traceId?: string; - askMcpUsed: boolean; - askMcpToolCallCount: number; - askMcpToolSuccessCount: number; - askMcpToolFailureCount: number; - askMcpApprovalRequestedCount: number; - askMcpApprovalDeniedCount: number; - askMcpFailedServerCount: number; - durationMs: number; -}; - -const emptyAskMcpAvailability: AskMcpAvailabilityAnalytics = { - hasAskMcpServersAvailable: false, - askMcpConnectedServerCount: 0, - askMcpEnabledServerCount: 0, - askMcpDisabledServerCount: 0, -}; - -type AskMcpAvailabilityPrismaClient = Pick; - -export async function getAskMcpAvailabilityAnalytics({ - prisma, - userId, - orgId, - disabledMcpServerIds, -}: { - prisma: AskMcpAvailabilityPrismaClient; - userId: string | undefined; - orgId: number; - disabledMcpServerIds: string[]; -}): Promise { - if (!userId || !(await hasEntitlement("oauth"))) { - return emptyAskMcpAvailability; - } - - const userServers = await prisma.userMcpServer.findMany({ - where: { - userId, - tokens: { not: null }, - server: { - orgId, - clientInfo: { not: null }, - }, - }, - select: { - serverId: true, - tokens: true, - tokensExpiresAt: true, - }, - }); - - const connectedServerIds = userServers - .filter((userServer) => - getStoredMcpConnectionStatus(userServer.tokens, userServer.tokensExpiresAt).state === "connected" - ) - .map((userServer) => userServer.serverId); - const disabledServerIds = new Set(disabledMcpServerIds); - const askMcpDisabledServerCount = connectedServerIds.filter((serverId) => disabledServerIds.has(serverId)).length; - const askMcpEnabledServerCount = connectedServerIds.length - askMcpDisabledServerCount; - - return { - hasAskMcpServersAvailable: askMcpEnabledServerCount > 0, - askMcpConnectedServerCount: connectedServerIds.length, - askMcpEnabledServerCount, - askMcpDisabledServerCount, - }; -} - -function isExternalMcpToolPart(part: SBChatMessagePart): part is SBChatMessagePart & DynamicToolUIPart { - return part.type === "dynamic-tool" && part.toolName.startsWith("mcp_"); -} - -function hasApproval(part: DynamicToolUIPart) { - return part.approval !== undefined; -} - -export function getAskMcpTurnCompletedAnalytics({ - messages, - availability, -}: { - messages: SBChatMessage[]; - availability: AskMcpAvailabilityAnalytics; -}): AskMcpTurnCompletedAnalytics | undefined { - const latestMessage = messages.at(-1); - const latestAssistantMessage = latestMessage?.role === "assistant" ? latestMessage : undefined; - if (!latestAssistantMessage) { - return undefined; - } - - const progressState = getTurnProgressState({ messages, status: "ready" }); - if (progressState.isTurnInProgress) { - return undefined; - } - - const externalMcpToolParts = latestAssistantMessage.parts.filter(isExternalMcpToolPart); - const askMcpToolSuccessCount = externalMcpToolParts.filter((part) => part.state === "output-available").length; - const askMcpToolFailureCount = externalMcpToolParts.filter((part) => part.state === "output-error").length; - const askMcpToolCallCount = askMcpToolSuccessCount + askMcpToolFailureCount; - const askMcpApprovalRequestedCount = externalMcpToolParts.filter(hasApproval).length; - const askMcpApprovalDeniedCount = externalMcpToolParts.filter((part) => part.state === "output-denied").length; - const askMcpFailedServerCount = latestAssistantMessage.parts.filter((part) => - part.type === "data-mcp-failed-server" - ).length; - - const hasMcpTurnActivity = externalMcpToolParts.length > 0 || askMcpFailedServerCount > 0; - if (!availability.hasAskMcpServersAvailable && !hasMcpTurnActivity) { - return undefined; - } - - return { - traceId: latestAssistantMessage.metadata?.traceId, - askMcpUsed: askMcpToolCallCount > 0, - askMcpToolCallCount, - askMcpToolSuccessCount, - askMcpToolFailureCount, - askMcpApprovalRequestedCount, - askMcpApprovalDeniedCount, - askMcpFailedServerCount, - durationMs: latestAssistantMessage.metadata?.totalResponseTimeMs ?? 0, - }; -} diff --git a/packages/web/src/features/chat/attachmentUtils.ts b/packages/web/src/features/chat/attachmentUtils.ts deleted file mode 100644 index 8f4084b7c..000000000 --- a/packages/web/src/features/chat/attachmentUtils.ts +++ /dev/null @@ -1,318 +0,0 @@ -'use client'; - -import { - ATTACHMENT_ALLOWED_IMAGE_MIME_TYPES, - ATTACHMENT_ALLOWED_TEXT_EXTENSIONS, - ATTACHMENT_ALLOWED_TEXT_MIME_TYPES, - ATTACHMENT_MAX_IMAGE_BYTES, - ATTACHMENT_MAX_IMAGE_COUNT, - ATTACHMENT_MAX_TURN_TEXT_BYTES, - ATTACHMENT_PASTE_AUTO_CONVERT_MIN_CHARS, - ATTACHMENT_PASTE_AUTO_CONVERT_MIN_LINES, -} from "./constants"; -import { AttachmentData } from "./types"; -import { sanitizeFilename } from "./attachments/filename"; -import { v4 as uuidv4 } from "uuid"; - -export { sanitizeFilename }; - -// A text attachment selected in the chat box but not yet submitted. The -// extracted text travels inline in the message (no upload). -export type PendingTextAttachment = { - kind: 'text'; - id: string; - filename: string; - mediaType: string; - sizeBytes: number; - text: string; -}; - -// An image attachment selected in the chat box. Unlike text, the bytes are -// uploaded to blob storage on select; `status`/`attachmentId` track that -// upload. `previewUrl` is a local object URL used for the pre-send thumbnail, -// and `file` is retained so the upload can be (re)issued. -export type PendingImageAttachment = { - kind: 'image'; - id: string; - filename: string; - mediaType: string; - sizeBytes: number; - previewUrl: string; - file: File; - status: 'uploading' | 'uploaded' | 'error'; - attachmentId?: string; - error?: string; -}; - -// An attachment selected in the chat box but not yet submitted. For text -// attachments the `id` is the stable handle carried into the message so the -// content can later be cited and resolved; for images it is a client-only list -// key (images are addressed by their uploaded `attachmentId` instead). -export type PendingAttachment = PendingTextAttachment | PendingImageAttachment; - -// Builds the comma-separated `accept` attribute for a native `` -// so the OS picker only surfaces supported file types. Image types are included -// only when the selected model can accept image input. -export const getAttachmentAcceptAttribute = (includeImages: boolean): string => { - return [ - 'text/*', - ...ATTACHMENT_ALLOWED_TEXT_MIME_TYPES, - ...ATTACHMENT_ALLOWED_TEXT_EXTENSIONS.map((extension) => `.${extension}`), - ...(includeImages ? ATTACHMENT_ALLOWED_IMAGE_MIME_TYPES : []), - ].join(','); -} - -// Builds the `accept` map for react-dropzone (and the native file picker) so -// the OS dialog and drag overlay only surface supported file types. The -// extension list is attached to `text/plain` so code files that report an empty -// or unusual MIME type are still selectable by extension. Image types are -// included only when the selected model can accept image input. -export const getAttachmentDropzoneAccept = (includeImages: boolean): Record => { - const accept: Record = { - 'text/*': [], - 'text/plain': ATTACHMENT_ALLOWED_TEXT_EXTENSIONS.map((extension) => `.${extension}`), - }; - for (const mimeType of ATTACHMENT_ALLOWED_TEXT_MIME_TYPES) { - accept[mimeType] = []; - } - if (includeImages) { - for (const mimeType of ATTACHMENT_ALLOWED_IMAGE_MIME_TYPES) { - accept[mimeType] = []; - } - } - return accept; -} - -// Total UTF-8 byte size of a turn's submitted text (prompt + text attachment -// bodies), checked against ATTACHMENT_MAX_TURN_TEXT_BYTES at submit time. Image -// attachments are excluded: their bytes are uploaded as blobs, not inlined into -// the message text, so they don't count against the inline-text budget. -export const getSubmittedTextBytes = (text: string, attachments: PendingAttachment[]): number => { - const textBytes = new TextEncoder().encode(text).length; - const attachmentBytes = attachments - .filter((attachment) => attachment.kind === 'text') - .reduce((sum, attachment) => sum + attachment.sizeBytes, 0); - return textBytes + attachmentBytes; -} - -// Converts a pending attachment into the message `AttachmentData` part. Returns -// `undefined` for an image whose upload has not completed (it must not be -// referenced before the blob exists); callers filter these out. -export const toAttachmentData = (attachment: PendingAttachment): AttachmentData | undefined => { - if (attachment.kind === 'text') { - return { - kind: 'text', - id: attachment.id, - filename: attachment.filename, - mediaType: attachment.mediaType, - sizeBytes: attachment.sizeBytes, - text: attachment.text, - }; - } - - if (attachment.status === 'uploaded' && attachment.attachmentId) { - return { - kind: 'blob', - attachmentId: attachment.attachmentId, - filename: attachment.filename, - mediaType: attachment.mediaType, - sizeBytes: attachment.sizeBytes, - }; - } - - return undefined; -} - -const getExtension = (filename: string): string => { - const parts = filename.toLowerCase().split('.'); - return parts.length > 1 ? (parts[parts.length - 1] ?? '') : ''; -} - -export const isAllowedTextFile = (file: File): boolean => { - if (file.type.startsWith('text/')) { - return true; - } - if (ATTACHMENT_ALLOWED_TEXT_MIME_TYPES.includes(file.type)) { - return true; - } - - const extension = getExtension(file.name); - if (ATTACHMENT_ALLOWED_TEXT_EXTENSIONS.includes(extension)) { - return true; - } - - // Files with no extension (e.g. "Dockerfile") report an empty extension; - // fall back to matching the whole lowercased filename. - const nameLower = file.name.toLowerCase(); - if (ATTACHMENT_ALLOWED_TEXT_EXTENSIONS.includes(nameLower)) { - return true; - } - - return false; -} - -export const isAllowedImageFile = (file: File): boolean => { - return (ATTACHMENT_ALLOWED_IMAGE_MIME_TYPES as readonly string[]).includes(file.type); -} - -const readAsText = (file: File): Promise => { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.onerror = () => reject(reader.error ?? new Error('Failed to read file')); - reader.onload = () => resolve(typeof reader.result === 'string' ? reader.result : ''); - reader.readAsText(file); - }); -} - -// Whether a plain-text paste is large enough to auto-convert into an attachment -// instead of being inserted inline. Gated on length or line count. -export const shouldAutoConvertPaste = (text: string): boolean => { - if (text.length >= ATTACHMENT_PASTE_AUTO_CONVERT_MIN_CHARS) { - return true; - } - return countLines(text) >= ATTACHMENT_PASTE_AUTO_CONVERT_MIN_LINES; -} - -export const countLines = (text: string): number => { - if (text.length === 0) { - return 0; - } - return text.split('\n').length; -} - -// Generates a non-colliding filename for an auto-converted paste, e.g. -// `pasted.txt`, then `pasted-2.txt`, `pasted-3.txt`, ... -const getPastedAttachmentFilename = (existing: PendingAttachment[]): string => { - const used = new Set(existing.map((attachment) => attachment.filename)); - if (!used.has('pasted.txt')) { - return 'pasted.txt'; - } - - let index = 2; - while (used.has(`pasted-${index}.txt`)) { - index++; - } - return `pasted-${index}.txt`; -} - -// Builds a pending text attachment from a pasted string. The per-turn text -// budget is enforced once at submit time, not here, so this can't fail. -export const createPastedTextAttachment = ( - text: string, - existing: PendingAttachment[], -): PendingAttachment => { - return { - id: uuidv4(), - kind: 'text', - filename: getPastedAttachmentFilename(existing), - mediaType: 'text/plain', - sizeBytes: new Blob([text]).size, - text, - }; -} - -export type ReadFilesResult = { - attachments: PendingAttachment[]; - errors: string[]; -}; - -// Reads and validates files into pending attachments, enforcing the per-file -// size, allowed-type, and per-message image-count caps (the per-turn text budget -// is enforced at submit time). Text is read inline; images (when `allowImages`) -// become pending uploads the caller then kicks off. The image-count cap mirrors -// the server's for early feedback. Rejected files yield an error, not a throw. -export const readFilesAsAttachments = async ( - files: File[], - { allowImages, existingImageCount = 0, maxImageBytes = ATTACHMENT_MAX_IMAGE_BYTES }: { - allowImages: boolean; - existingImageCount?: number; - maxImageBytes?: number; - }, -): Promise => { - const attachments: PendingAttachment[] = []; - const errors: string[] = []; - let imageCount = existingImageCount; - - for (const file of files) { - if (isAllowedTextFile(file)) { - // Skip before reading to avoid loading a huge file into memory. - if (file.size > ATTACHMENT_MAX_TURN_TEXT_BYTES) { - errors.push(`${file.name}: exceeds the ${Math.round(ATTACHMENT_MAX_TURN_TEXT_BYTES / 1024)}KB per-message limit.`); - continue; - } - try { - const text = await readAsText(file); - attachments.push({ - id: uuidv4(), - kind: 'text', - filename: sanitizeFilename(file.name), - mediaType: file.type || 'text/plain', - sizeBytes: file.size, - text, - }); - } catch { - errors.push(`${file.name}: failed to read file.`); - } - continue; - } - - if (isAllowedImageFile(file)) { - if (!allowImages) { - errors.push(`${file.name}: the selected model does not support image input.`); - continue; - } - if (file.size > maxImageBytes) { - errors.push(`${file.name}: exceeds the ${Math.round(maxImageBytes / (1024 * 1024))}MB image limit.`); - continue; - } - if (imageCount >= ATTACHMENT_MAX_IMAGE_COUNT) { - errors.push(`You can attach at most ${ATTACHMENT_MAX_IMAGE_COUNT} images per message.`); - continue; - } - attachments.push({ - id: uuidv4(), - kind: 'image', - filename: sanitizeFilename(file.name), - mediaType: file.type, - sizeBytes: file.size, - previewUrl: URL.createObjectURL(file), - file, - status: 'uploading', - }); - imageCount++; - continue; - } - - errors.push(`${file.name}: unsupported file type.`); - } - - return { attachments, errors }; -} - -// Uploads an image attachment's bytes to blob storage, returning the committed -// attachment metadata (including the server-assigned `attachmentId`). Throws -// with a human-readable message on failure. -export const uploadImageAttachment = async (file: File): Promise<{ - attachmentId: string; - filename: string; - mediaType: string; - sizeBytes: number; -}> => { - const formData = new FormData(); - formData.append('file', file); - - const response = await fetch('/api/ee/chat/attachments', { - method: 'POST', - body: formData, - headers: { - 'X-Sourcebot-Client-Source': 'sourcebot-web-client', - }, - }); - - if (!response.ok) { - const body = await response.json().catch(() => undefined); - throw new Error(body?.message ?? 'Failed to upload image.'); - } - - return response.json(); -} diff --git a/packages/web/src/features/chat/attachments/filename.ts b/packages/web/src/features/chat/attachments/filename.ts deleted file mode 100644 index fc5a23fdb..000000000 --- a/packages/web/src/features/chat/attachments/filename.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Normalizes an untrusted filename: keeps only the basename, drops control -// characters (which could break the prompt's `` tag -// or the UI), and collapses whitespace. Lives in a non-client module so both -// the client picker and the server upload route can share one implementation. -export const sanitizeFilename = (name: string): string => { - const basename = name.split(/[\\/]/).pop() ?? name; - return Array.from(basename) - .filter((char) => { - const code = char.charCodeAt(0); - return code >= 32 && code !== 127; - }) - .join('') - .replace(/\s+/g, ' ') - .trim() || 'attachment'; -}; diff --git a/packages/web/src/features/chat/attachments/modality.ts b/packages/web/src/features/chat/attachments/modality.ts deleted file mode 100644 index 863e3502d..000000000 --- a/packages/web/src/features/chat/attachments/modality.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { InputModality } from "../types"; - -// Single-medium modalities an attachment blob can occupy (text is excluded: it -// travels inline in the message, not as a native attachment part). -export type AttachmentModality = Exclude; - -/** - * Maps a stored attachment's media type to the model input modality it occupies, - * or `undefined` when it isn't a recognized single-medium attachment. The single - * source of truth for "what kind of attachment is this"; extend it to add - * PDF/audio/video support. - */ -export const mediaTypeToModality = (mediaType: string): AttachmentModality | undefined => { - if (mediaType.startsWith('image/')) { - return 'image'; - } - if (mediaType.startsWith('audio/')) { - return 'audio'; - } - if (mediaType.startsWith('video/')) { - return 'video'; - } - return undefined; -}; - -/** - * Whether a model that accepts `acceptedModalities` can natively ingest an - * attachment of `mediaType`. - */ -export const isMediaTypeAccepted = (mediaType: string, acceptedModalities: InputModality[]): boolean => { - const modality = mediaTypeToModality(mediaType); - return modality !== undefined && acceptedModalities.includes(modality); -}; diff --git a/packages/web/src/features/chat/attachments/validation.ts b/packages/web/src/features/chat/attachments/validation.ts deleted file mode 100644 index 9c29146d5..000000000 --- a/packages/web/src/features/chat/attachments/validation.ts +++ /dev/null @@ -1,76 +0,0 @@ -import 'server-only'; - -import sharp, { type Metadata } from 'sharp'; -import { ATTACHMENT_ALLOWED_IMAGE_MIME_TYPES, ATTACHMENT_MAX_IMAGE_DIMENSION } from '../constants'; - -export type AllowedImageMediaType = typeof ATTACHMENT_ALLOWED_IMAGE_MIME_TYPES[number]; - -const isAllowedImageMediaType = (mediaType: string): mediaType is AllowedImageMediaType => { - return (ATTACHMENT_ALLOWED_IMAGE_MIME_TYPES as readonly string[]).includes(mediaType); -}; - -// sharp/libvips reports the decoded format by name; map the formats we allow to -// their canonical media type. Anything not in this map (svg, tiff, heif, ...) -// is rejected, so the allowlist is enforced by the absence of an entry here as -// well as by `isAllowedImageMediaType`. -const SHARP_FORMAT_TO_MEDIA_TYPE: Record = { - png: 'image/png', - jpeg: 'image/jpeg', - webp: 'image/webp', - gif: 'image/gif', -}; - -export type AttachmentValidationResult = - | { ok: true; mediaType: AllowedImageMediaType } - | { ok: false; reason: string }; - -/** - * Validates uploaded attachment bytes by decoding the image header with sharp - * (libvips), never trusting the client-supplied MIME type or extension. This - * authoritatively determines the format AND the pixel dimensions, letting us - * reject: - * - non-images / corrupt data (sharp throws), - * - disallowed formats (no entry in SHARP_FORMAT_TO_MEDIA_TYPE), - * - over-`maxBytes` files, and - * - decompression bombs (dimensions over ATTACHMENT_MAX_IMAGE_DIMENSION). - * The returned `mediaType` is the decoded type, which callers persist instead of - * any client-supplied value. - */ -export const validateImageAttachment = async ( - buffer: Buffer, - maxBytes: number, -): Promise => { - if (buffer.length === 0) { - return { ok: false, reason: 'Empty file.' }; - } - if (buffer.length > maxBytes) { - return { ok: false, reason: `Image exceeds the ${Math.round(maxBytes / (1024 * 1024))}MB limit.` }; - } - - let metadata: Metadata; - try { - // `failOn: 'error'` makes sharp reject truncated/corrupt inputs instead - // of best-effort decoding them. - metadata = await sharp(buffer, { failOn: 'error' }).metadata(); - } catch { - return { ok: false, reason: 'Unsupported or corrupt image. Allowed: PNG, JPEG, WebP, GIF.' }; - } - - const mediaType = metadata.format ? SHARP_FORMAT_TO_MEDIA_TYPE[metadata.format] : undefined; - if (!mediaType || !isAllowedImageMediaType(mediaType)) { - return { ok: false, reason: 'Unsupported image type. Allowed: PNG, JPEG, WebP, GIF.' }; - } - - const { width, height } = metadata; - if (!width || !height) { - return { ok: false, reason: 'Could not determine image dimensions.' }; - } - if (width > ATTACHMENT_MAX_IMAGE_DIMENSION || height > ATTACHMENT_MAX_IMAGE_DIMENSION) { - return { - ok: false, - reason: `Image dimensions exceed the ${ATTACHMENT_MAX_IMAGE_DIMENSION}px limit.`, - }; - } - - return { ok: true, mediaType }; -}; diff --git a/packages/web/src/features/chat/commands/types.ts b/packages/web/src/features/chat/commands/types.ts deleted file mode 100644 index cdaa6fbcb..000000000 --- a/packages/web/src/features/chat/commands/types.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { z } from "zod"; - -export const ASK_COMMAND_SOURCE_PERSONAL_SKILL = "personal-skill"; -export const ASK_COMMAND_SOURCE_SHARED_SKILL = "shared-skill"; - -export type AskCommandDefinition = { - id: string; - // The registry/source that owns this command, not its execution type. - sourceId: string; - slug: string; - name: string; - description: string; - sourceLabel?: string; - isSynced?: boolean; - aliases?: string[]; - isHidden?: boolean; -} - -export type AskCommandSuggestion = AskCommandDefinition & { - type: 'command'; -} - -// Snapshot data for rendering/restoring the editor chip. Execution should -// resolve the command definition by sourceId + commandId in a later layer. -export const commandMentionDataSchema = z.object({ - type: z.literal('command'), - commandId: z.string(), - // The registry/source that owns this command, not its execution type. - sourceId: z.string(), - slug: z.string(), - name: z.string(), - sourceLabel: z.string().optional(), -}); - -export type CommandMentionData = z.infer; - -export const isCommandMentionData = (value: unknown): value is CommandMentionData => - commandMentionDataSchema.safeParse(value).success; - -export const commandInvocationDataSchema = commandMentionDataSchema.extend({ - expandedText: z.string().optional(), - // Server-assigned outcome of resolving the command to its executable text. - resolutionStatus: z.enum(["success", "failure"]).optional(), -}); - -export type CommandInvocationData = z.infer; diff --git a/packages/web/src/features/chat/commands/utils.test.ts b/packages/web/src/features/chat/commands/utils.test.ts deleted file mode 100644 index e828031d4..000000000 --- a/packages/web/src/features/chat/commands/utils.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { describe, expect, test } from 'vitest'; -import { ASK_COMMAND_SOURCE_SHARED_SKILL, ASK_COMMAND_SOURCE_PERSONAL_SKILL, type AskCommandDefinition } from './types'; -import { createCommandInvocationData, filterAskCommandDefinitions, toAskCommandSuggestion } from './utils'; - -const command = (overrides: Partial): AskCommandDefinition => ({ - id: 'skill-1', - sourceId: ASK_COMMAND_SOURCE_PERSONAL_SKILL, - slug: 'review-pr', - name: 'Review PR', - description: 'Review changes for risky code.', - ...overrides, -}); - -describe('filterAskCommandDefinitions', () => { - test('returns visible commands for an empty query', () => { - const commands = [ - command({ id: 'visible' }), - command({ id: 'hidden', isHidden: true }), - ]; - - expect(filterAskCommandDefinitions(commands, '').map((item) => item.id)).toEqual(['visible']); - }); - - test('matches slug, name, description, and aliases', () => { - const commands = [ - command({ id: 'slug', slug: 'release-notes', name: 'Release notes', description: '' }), - command({ id: 'name', slug: 'ship', name: 'Deploy Checklist', description: '' }), - command({ id: 'description', slug: 'audit', name: 'Audit', description: 'Find security risks.' }), - command({ id: 'alias', slug: 'summarize', name: 'Summarize', description: '', aliases: ['tl-dr'] }), - ]; - - expect(filterAskCommandDefinitions(commands, 'release').map((item) => item.id)).toEqual(['slug']); - expect(filterAskCommandDefinitions(commands, 'deploy').map((item) => item.id)).toEqual(['name']); - expect(filterAskCommandDefinitions(commands, 'security').map((item) => item.id)).toEqual(['description']); - expect(filterAskCommandDefinitions(commands, 'tl-dr').map((item) => item.id)).toEqual(['alias']); - }); - - test('normalizes a leading slash in the query', () => { - expect(filterAskCommandDefinitions([command({})], '/review').map((item) => item.id)).toEqual(['skill-1']); - }); - - test('keeps commands with the same slug from different sources', () => { - const commands = [ - command({ id: 'personal-skill', sourceId: ASK_COMMAND_SOURCE_PERSONAL_SKILL, slug: 'review' }), - command({ id: 'shared-skill', sourceId: ASK_COMMAND_SOURCE_SHARED_SKILL, slug: 'review' }), - ]; - - expect(filterAskCommandDefinitions(commands, '/review').map((item) => item.id)).toEqual([ - 'personal-skill', - 'shared-skill', - ]); - }); -}); - -describe('toAskCommandSuggestion', () => { - test('adds the command suggestion discriminator', () => { - expect(toAskCommandSuggestion(command({}))).toMatchObject({ - type: 'command', - slug: 'review-pr', - }); - }); -}); - -describe('createCommandInvocationData', () => { - const commandMention = { - type: 'command' as const, - commandId: 'skill-1', - sourceId: ASK_COMMAND_SOURCE_PERSONAL_SKILL, - slug: 'review-pr', - name: 'Review PR', - }; - - test('returns the invocation snapshot for a leading command mention', () => { - expect(createCommandInvocationData('/review-pr src/auth/session.ts\n', [commandMention])).toEqual(commandMention); - }); - - test('returns the invocation snapshot when text appears before the command mention', () => { - expect(createCommandInvocationData('please /review-pr src/auth/session.ts', [commandMention])).toEqual(commandMention); - }); - - test('returns the invocation snapshot when the command has no trailing text', () => { - expect(createCommandInvocationData('/review-pr', [commandMention])).toEqual(commandMention); - expect(createCommandInvocationData('/review-pr\n', [commandMention])).toEqual(commandMention); - }); - - test('preserves the command source label when present', () => { - expect(createCommandInvocationData('/review-pr src/auth/session.ts\n', [{ - ...commandMention, - sourceLabel: 'Personal', - }])).toEqual({ - ...commandMention, - sourceLabel: 'Personal', - }); - }); - - test('does not match adjacent command-like text', () => { - expect(createCommandInvocationData('/review-pr-extra src/auth/session.ts', [commandMention])).toBeUndefined(); - }); - - test('does not match a command preceded by non-whitespace', () => { - expect(createCommandInvocationData('foo/review-pr src/auth/session.ts', [commandMention])).toBeUndefined(); - }); - - test('skips an embedded false match and resolves a later valid occurrence', () => { - expect(createCommandInvocationData('x/review-prX then /review-pr real', [commandMention])).toEqual(commandMention); - }); -}); diff --git a/packages/web/src/features/chat/commands/utils.ts b/packages/web/src/features/chat/commands/utils.ts deleted file mode 100644 index ae4c4b4d3..000000000 --- a/packages/web/src/features/chat/commands/utils.ts +++ /dev/null @@ -1,78 +0,0 @@ -import type { AskCommandDefinition, AskCommandSuggestion, CommandInvocationData, CommandMentionData } from "./types"; - -export const toAskCommandSuggestion = (command: AskCommandDefinition): AskCommandSuggestion => ({ - ...command, - type: 'command', -}); - -export const filterAskCommandDefinitions = ( - commands: AskCommandDefinition[], - query: string, -): AskCommandDefinition[] => { - const normalizedQuery = query.trim().replace(/^\//, '').toLowerCase(); - - return commands.filter((command) => { - if (command.isHidden) { - return false; - } - - if (normalizedQuery.length === 0) { - return true; - } - - const searchableFields = [ - command.slug, - command.name, - command.description, - ...(command.aliases ?? []), - ]; - - return searchableFields.some((field) => field.toLowerCase().includes(normalizedQuery)); - }); -}; - -const findCommandPrefixIndex = (text: string, slug: string): number => { - const commandPrefix = `/${slug}`; - let searchFrom = 0; - - while (searchFrom < text.length) { - const index = text.indexOf(commandPrefix, searchFrom); - if (index === -1) { - return -1; - } - - const beforeCommand = index === 0 ? "" : text[index - 1]; - const afterCommand = text[index + commandPrefix.length] ?? ""; - if ((!beforeCommand || /\s/.test(beforeCommand)) && (!afterCommand || /\s/.test(afterCommand))) { - return index; - } - - searchFrom = index + commandPrefix.length; - } - - return -1; -}; - -export const createCommandInvocationData = ( - text: string, - commandMentions: CommandMentionData[], -): CommandInvocationData | undefined => { - const command = commandMentions[0]; - if (!command) { - return undefined; - } - - const commandIndex = findCommandPrefixIndex(text, command.slug); - if (commandIndex === -1) { - return undefined; - } - - return { - type: command.type, - commandId: command.commandId, - sourceId: command.sourceId, - slug: command.slug, - name: command.name, - ...(command.sourceLabel ? { sourceLabel: command.sourceLabel } : {}), - }; -}; diff --git a/packages/web/src/features/chat/components/chatBox/atMentionButton.tsx b/packages/web/src/features/chat/components/chatBox/atMentionButton.tsx deleted file mode 100644 index a108b039f..000000000 --- a/packages/web/src/features/chat/components/chatBox/atMentionButton.tsx +++ /dev/null @@ -1,29 +0,0 @@ -'use client'; - -import { Button } from "@/components/ui/button"; -import { AtSignIcon } from "lucide-react"; -import { useCallback } from "react"; -import { ReactEditor, useSlate } from "slate-react"; - -// @note: we have this as a seperate component to avoid having to re-render the -// entire toolbar whenever the user types (since we are using the useSlate hook -// here). -export const AtMentionButton = () => { - const editor = useSlate(); - - const onAddContext = useCallback(() => { - editor.insertText("@"); - ReactEditor.focus(editor); - }, [editor]); - - return ( - - ); -} \ No newline at end of file diff --git a/packages/web/src/features/chat/components/chatBox/attachmentButton.tsx b/packages/web/src/features/chat/components/chatBox/attachmentButton.tsx deleted file mode 100644 index 33d88b6de..000000000 --- a/packages/web/src/features/chat/components/chatBox/attachmentButton.tsx +++ /dev/null @@ -1,55 +0,0 @@ -'use client'; - -import { Button } from "@/components/ui/button"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; -import { getAttachmentAcceptAttribute } from "@/features/chat/attachmentUtils"; -import { Paperclip } from "lucide-react"; -import { useRef } from "react"; - -interface AttachmentButtonProps { - onAddFiles: (files: File[]) => void; - acceptImages?: boolean; - disabled?: boolean; -} - -export const AttachmentButton = ({ onAddFiles, acceptImages = false, disabled }: AttachmentButtonProps) => { - const inputRef = useRef(null); - - return ( - <> - { - const files = e.target.files ? Array.from(e.target.files) : []; - if (files.length > 0) { - onAddFiles(files); - } - // Reset so selecting the same file again re-triggers onChange. - e.target.value = ''; - }} - /> - - - - - - {acceptImages ? "Attach text files or images" : "Attach text files"} - - - - ) -} diff --git a/packages/web/src/features/chat/components/chatBox/attachmentTray.tsx b/packages/web/src/features/chat/components/chatBox/attachmentTray.tsx deleted file mode 100644 index 3547ddf1b..000000000 --- a/packages/web/src/features/chat/components/chatBox/attachmentTray.tsx +++ /dev/null @@ -1,122 +0,0 @@ -'use client'; - -import { VscodeFileIcon } from "@/app/components/vscodeFileIcon"; -import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card"; -import { cn } from "@/lib/utils"; -import { AlertCircle, Loader2, X } from "lucide-react"; -import { useState } from "react"; -import { PendingAttachment } from "../../attachmentUtils"; -import { AttachmentViewerDialog } from "./attachmentViewerDialog"; - -interface AttachmentTrayProps { - attachments: PendingAttachment[]; - // Omitted when the tray is read-only (e.g. while a submission is - // redirecting); the remove control is hidden in that case. - onRemove?: (id: string) => void; - className?: string; -} - -export const AttachmentTray = ({ attachments, onRemove, className }: AttachmentTrayProps) => { - const [activeAttachment, setActiveAttachment] = useState(null); - - if (attachments.length === 0) { - return null; - } - - return ( - <> -
- {attachments.map((attachment) => ( - attachment.kind === 'image' ? ( - -
- - - - {onRemove && ( - - )} -
- - {/* eslint-disable-next-line @next/next/no-img-element */} - {attachment.filename} - -
- ) : ( -
- - {onRemove && ( - - )} -
- ) - ))} -
- !open && setActiveAttachment(null)} - filename={activeAttachment?.filename} - text={activeAttachment?.kind === 'text' ? activeAttachment.text : undefined} - imageSrc={activeAttachment?.kind === 'image' ? activeAttachment.previewUrl : undefined} - /> - - ) -} diff --git a/packages/web/src/features/chat/components/chatBox/attachmentViewerDialog.tsx b/packages/web/src/features/chat/components/chatBox/attachmentViewerDialog.tsx deleted file mode 100644 index d57eb68ee..000000000 --- a/packages/web/src/features/chat/components/chatBox/attachmentViewerDialog.tsx +++ /dev/null @@ -1,67 +0,0 @@ -'use client'; - -import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog"; -import { useEffect } from "react"; - -interface AttachmentViewerDialogProps { - filename?: string; - text?: string; - // When set, the dialog shows the image at this URL instead of text. Used - // for image attachments (a local object URL pre-send, the serving route - // post-send). - imageSrc?: string; - open: boolean; - onOpenChange: (open: boolean) => void; -} - -// Shared viewer for inspecting an attachment's contents. Used for both staged -// (not-yet-sent) and sent attachments, and for both text and image kinds. -export const AttachmentViewerDialog = ({ filename, text, imageSrc, open, onOpenChange }: AttachmentViewerDialogProps) => { - // The staged viewer is rendered inside the Slate `Editable` subtree, where - // Radix's built-in Escape-to-close can get swallowed by the editor's - // focus/key handling. A capture-phase listener guarantees Escape closes the - // dialog, matching every other modal in the app. - useEffect(() => { - if (!open) { - return; - } - - const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === 'Escape') { - onOpenChange(false); - } - }; - - document.addEventListener('keydown', handleKeyDown, true); - return () => { - document.removeEventListener('keydown', handleKeyDown, true); - }; - }, [open, onOpenChange]); - - return ( - - - - - {filename} - - - Preview of the attached file{filename ? ` ${filename}` : ''}. - - - {imageSrc ? ( - // eslint-disable-next-line @next/next/no-img-element - {filename - ) : ( -
-                        {text}
-                    
- )} -
-
- ) -} diff --git a/packages/web/src/features/chat/components/chatBox/chatBox.tsx b/packages/web/src/features/chat/components/chatBox/chatBox.tsx deleted file mode 100644 index 447d41d4b..000000000 --- a/packages/web/src/features/chat/components/chatBox/chatBox.tsx +++ /dev/null @@ -1,843 +0,0 @@ -'use client'; - -import { Button } from "@/components/ui/button"; -import { Tooltip, TooltipTrigger } from "@/components/ui/tooltip"; -import { FileMentionComponent, MentionChip } from "@/features/chat/components/mentionChip"; -import { AttachmentData, CustomEditor, LanguageModelInfo, MentionElement, RenderElementPropsFor, SearchScope } from "@/features/chat/types"; -import { insertMention, slateContentToString } from "@/features/chat/utils"; -import { createPastedTextAttachment, getSubmittedTextBytes, PendingAttachment, PendingImageAttachment, readFilesAsAttachments, shouldAutoConvertPaste, toAttachmentData, uploadImageAttachment } from "@/features/chat/attachmentUtils"; -import { AttachmentButton } from "./attachmentButton"; -import { AttachmentTray } from "./attachmentTray"; -import { cn } from "@/lib/utils"; -import { useIsMac } from "@/hooks/useIsMac"; -import { computePosition, flip, offset, shift, VirtualElement } from "@floating-ui/react"; -import { ArrowUp, Loader2, StopCircleIcon } from "lucide-react"; -import { forwardRef, KeyboardEvent, memo, Ref, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react"; -import { useHotkeys } from "react-hotkeys-hook"; -import { Descendant, insertText } from "slate"; -import { Editable, ReactEditor, RenderElementProps, RenderLeafProps, useSlate } from "slate-react"; -import { useSelectedLanguageModel } from "../../useSelectedLanguageModel"; -import { SuggestionBox } from "./suggestionsBox"; -import { Suggestion } from "./types"; -import { useSuggestionModeAndQuery } from "./useSuggestionModeAndQuery"; -import { useSuggestionsData } from "./useSuggestionsData"; -import { useToast } from "@/components/hooks/use-toast"; -import { SearchContextQuery } from "@/lib/types"; -import isEqual from "fast-deep-equal/react"; -import { LoginDialog } from "@/app/components/loginDialog"; -import { usePathname } from "next/navigation"; -import { ATTACHMENT_MAX_IMAGE_BYTES, ATTACHMENT_MAX_TURN_TEXT_BYTES, PENDING_CHAT_SUBMISSION_SESSION_STORAGE_KEY } from "@/features/chat/constants"; -import useCaptureEvent from "@/hooks/useCaptureEvent"; -import { useHasEntitlement } from "@/features/entitlements/useHasEntitlement"; -import { UpsellDialog } from "@/features/billing/upsellDialog"; -import { ASK_COMMAND_SOURCE_SHARED_SKILL, type AskCommandDefinition, type CommandMentionData } from "@/features/chat/commands/types"; -import { shouldUsePlainComposerEnterBehavior } from "./keyboard"; -import { SourceLabelBadge } from "./sourceLabelBadge"; - -export interface ChatBoxHandle { - addFiles: (files: File[]) => void; -} - -// Only inline-text attachments survive the login/upgrade redirect: image blobs -// require an authenticated, entitled upload, so a redirected sender can't have -// one, and a stashed blob ref would only fail to commit on re-submit. -const getRedirectSafeAttachments = (attachments: PendingAttachment[]): AttachmentData[] => { - return attachments - .map(toAttachmentData) - .filter((attachment): attachment is AttachmentData => attachment?.kind === 'text'); -} - -interface ChatBoxProps { - onSubmit: (children: Descendant[], editor: CustomEditor, attachments: AttachmentData[]) => void; - onStop?: () => void; - preferredSuggestionsBoxPlacement?: "top-start" | "bottom-start"; - className?: string; - isRedirecting?: boolean; - isTurnInProgress?: boolean; - isNetworkActive?: boolean; - isDisabled?: boolean; - languageModels: LanguageModelInfo[]; - selectedSearchScopes: SearchScope[]; - searchContexts: SearchContextQuery[]; - askCommands: AskCommandDefinition[]; - isLoginWallEnabled: boolean; - isAuthenticated: boolean; - // Authoritative per-image byte cap from the server - // (SOURCEBOT_CHAT_ATTACHMENT_MAX_IMAGE_BYTES), threaded down for early - // client-side rejection. Defaults to the constant when not provided. - maxImageBytes?: number; -} - -const ChatBoxComponent = ({ - onSubmit: _onSubmit, - onStop, - preferredSuggestionsBoxPlacement = "bottom-start", - className, - isRedirecting, - isTurnInProgress, - isNetworkActive, - isDisabled, - isLoginWallEnabled, - isAuthenticated, - languageModels, - selectedSearchScopes, - searchContexts, - maxImageBytes = ATTACHMENT_MAX_IMAGE_BYTES, - askCommands, -}: ChatBoxProps, ref: Ref) => { - const suggestionsBoxRef = useRef(null); - const [index, setIndex] = useState(0); - const editor = useSlate(); - const captureEvent = useCaptureEvent(); - const { suggestionQuery, suggestionMode, range } = useSuggestionModeAndQuery(); - const { suggestions, isLoading } = useSuggestionsData({ - suggestionMode, - suggestionQuery, - selectedRepos: selectedSearchScopes.map((item) => { - if (item.type === 'repo') { - return [item.value]; - } - - if (item.type === 'reposet') { - const reposet = searchContexts.find((reposet) => reposet.name === item.value); - if (reposet) { - return reposet.repoNames; - } - } - - return []; - }).flat(), - askCommands, - }); - const { selectedLanguageModel } = useSelectedLanguageModel(languageModels); - const { toast } = useToast(); - const isMac = useIsMac(); - const isAskEnabled = useHasEntitlement('ask'); - const [isLoginDialogOpen, setIsLoginDialogOpen] = useState(false); - const [isUpsellDialogOpen, setIsUpsellDialogOpen] = useState(false); - const [attachments, setAttachments] = useState([]); - const [submittedAttachments, setSubmittedAttachments] = useState([]); - const pathname = usePathname(); - - // Whether the selected model can accept image input (from #1372). Image - // attachments are gated on this; text attachments are always allowed. - const supportsImages = useMemo( - () => selectedLanguageModel?.inputModalities?.includes('image') ?? false, - [selectedLanguageModel], - ); - - // Uploads an image attachment's bytes and reflects the outcome back into the - // tray (status + server attachment id). - const uploadAndTrackImage = useCallback(async (item: PendingImageAttachment) => { - try { - const result = await uploadImageAttachment(item.file); - setAttachments((prev) => prev.map((attachment) => - attachment.id === item.id && attachment.kind === 'image' - ? { - ...attachment, - status: 'uploaded', - attachmentId: result.attachmentId, - mediaType: result.mediaType, - sizeBytes: result.sizeBytes, - } - : attachment)); - } catch (error) { - const message = error instanceof Error ? error.message : 'upload failed.'; - setAttachments((prev) => prev.map((attachment) => - attachment.id === item.id && attachment.kind === 'image' - ? { ...attachment, status: 'error', error: message } - : attachment)); - toast({ - description: `⚠️ ${item.filename}: ${message}`, - variant: "destructive", - }); - } - }, [toast]); - - // Set when the user triggers a paste with the OS raw-paste chord - // (⌘⇧V / Ctrl+Shift+V). The subsequent `paste` event reads (and clears) - // this so the large-paste auto-conversion is skipped for that one paste. - const rawPasteRequestedRef = useRef(false); - - // Warning shown when prompt text + `nextAttachments` would exceed the per-turn - // budget, so an over-budget add surfaces immediately instead of just disabling submit. - const getOverBudgetWarning = useCallback((nextAttachments: PendingAttachment[]): string | null => { - const totalBytes = getSubmittedTextBytes(slateContentToString(editor.children), nextAttachments); - if (totalBytes <= ATTACHMENT_MAX_TURN_TEXT_BYTES) { - return null; - } - return `Attachments exceed the ${Math.round(ATTACHMENT_MAX_TURN_TEXT_BYTES / 1024)}KB per-message limit. Remove a file or shorten your message to send.`; - }, [editor]); - - const onAddPastedText = useCallback((text: string) => { - const attachment = createPastedTextAttachment(text, attachments); - setAttachments((prev) => [...prev, attachment]); - - const overBudgetWarning = getOverBudgetWarning([...attachments, attachment]); - if (overBudgetWarning) { - toast({ - description: `⚠️ ${overBudgetWarning}`, - variant: "destructive", - }); - } else { - toast({ - title: "Large paste added as an attachment", - duration: 5 * 1000, - className: "w-fit ml-auto", - description: `Use ${isMac ? "⌘+⇧+V" : "Ctrl+Shift+V"} to paste inline instead`, - }); - } - - ReactEditor.focus(editor); - }, [attachments, editor, toast, isMac, getOverBudgetWarning]); - - const onAddFiles = useCallback(async (files: File[]) => { - if (files.length === 0) { - return; - } - - const { attachments: added, errors } = await readFilesAsAttachments( - files, - { - allowImages: supportsImages, - existingImageCount: attachments.filter((attachment) => attachment.kind === 'image').length, - maxImageBytes, - }, - ); - if (added.length > 0) { - setAttachments((prev) => [...prev, ...added]); - } - - const overBudgetWarning = added.length > 0 ? getOverBudgetWarning([...attachments, ...added]) : null; - const messages = [...errors, ...(overBudgetWarning ? [overBudgetWarning] : [])]; - if (messages.length > 0) { - toast({ - description: `⚠️ ${messages.join(' ')}`, - variant: "destructive", - }); - } - - // Upload image attachments immediately (upload-on-select); their refs - // are included at submit once the upload completes. - for (const item of added) { - if (item.kind === 'image') { - void uploadAndTrackImage(item); - } - } - - // Return focus to the prompt input so the user can keep typing. - ReactEditor.focus(editor); - }, [attachments, toast, editor, supportsImages, uploadAndTrackImage, getOverBudgetWarning, maxImageBytes]); - - const removeAttachment = useCallback((id: string) => { - setAttachments((prev) => { - const target = prev.find((attachment) => attachment.id === id); - if (target?.kind === 'image') { - URL.revokeObjectURL(target.previewUrl); - } - return prev.filter((attachment) => attachment.id !== id); - }); - }, []); - - // Track the set of live image preview object URLs (pending or - // just-submitted) so they can be revoked when the chat box unmounts, - // preventing leaks across SPA navigations. - const liveObjectUrlsRef = useRef>(new Set()); - useEffect(() => { - const urls = new Set(); - for (const attachment of [...attachments, ...submittedAttachments]) { - if (attachment.kind === 'image') { - urls.add(attachment.previewUrl); - } - } - liveObjectUrlsRef.current = urls; - }, [attachments, submittedAttachments]); - useEffect(() => { - return () => { - for (const url of liveObjectUrlsRef.current) { - URL.revokeObjectURL(url); - } - }; - }, []); - - // Allow an ancestor pane-level drop zone to forward dropped files into this - // chat box (which owns attachment state). See `ChatPaneDropzone`. - useImperativeHandle(ref, () => ({ - addFiles: (files: File[]) => { - void onAddFiles(files); - }, - }), [onAddFiles]); - - // Reset the index when the active suggestion set changes. - useEffect(() => { - setIndex(0); - }, [suggestionMode, suggestionQuery]); - - // Hotkey to focus the chat box. - useHotkeys("/", (e) => { - if (ReactEditor.isFocused(editor)) { - return; - } - - e.preventDefault(); - ReactEditor.focus(editor); - }); - - // Auto-focus chat box when the component mounts. - useEffect(() => { - ReactEditor.focus(editor); - }, [editor]); - - const renderElement = useCallback((props: RenderElementProps) => { - switch (props.element.type) { - case 'mention': - return } /> - default: - return - } - }, []); - - const renderLeaf = useCallback((props: RenderLeafProps) => { - return - }, []); - - const { isSubmitDisabled, isSubmitDisabledReason } = useMemo((): { - isSubmitDisabled: true, - isSubmitDisabledReason: "empty" | "too-large" | "redirecting" | "generating" | "no-language-model-selected" | "uploading" | "upload-error" - } | { - isSubmitDisabled: false, - isSubmitDisabledReason: undefined, - } => { - const text = slateContentToString(editor.children); - if (text.trim().length === 0 && attachments.length === 0) { - return { - isSubmitDisabled: true, - isSubmitDisabledReason: "empty", - } - } - - // Single per-turn bound on the submitted inline text (prompt + text - // attachments). Image bytes are uploaded as blobs and excluded here. - if (getSubmittedTextBytes(text, attachments) > ATTACHMENT_MAX_TURN_TEXT_BYTES) { - return { - isSubmitDisabled: true, - isSubmitDisabledReason: "too-large", - } - } - - // Block submission until in-flight image uploads finish so their refs - // are available when the message is built. - if (attachments.some((attachment) => attachment.kind === 'image' && attachment.status === 'uploading')) { - return { - isSubmitDisabled: true, - isSubmitDisabledReason: "uploading", - } - } - - // A failed or ref-less image is dropped from `attachmentData` at submit, - // so block (rather than silently sending without it) until it's removed. - if (attachments.some((attachment) => - attachment.kind === 'image' && - (attachment.status === 'error' || !attachment.attachmentId) - )) { - return { - isSubmitDisabled: true, - isSubmitDisabledReason: "upload-error", - } - } - - if (isRedirecting) { - return { - isSubmitDisabled: true, - isSubmitDisabledReason: "redirecting", - } - } - - if (isTurnInProgress) { - return { - isSubmitDisabled: true, - isSubmitDisabledReason: "generating", - } - } - - if (selectedLanguageModel === undefined) { - - return { - isSubmitDisabled: true, - isSubmitDisabledReason: "no-language-model-selected", - } - } - - return { - isSubmitDisabled: false, - isSubmitDisabledReason: undefined, - } - - }, [editor.children, isRedirecting, isTurnInProgress, selectedLanguageModel, attachments]) - - const { - requiresLogin, - requiresUpgrade - } = useMemo(() => ({ - requiresLogin: isLoginWallEnabled && !isAuthenticated, - requiresUpgrade: !isAskEnabled, - }), [ - isAuthenticated, - isLoginWallEnabled, - isAskEnabled - ]) - - const onSubmit = useCallback(() => { - if (isSubmitDisabled) { - if (isSubmitDisabledReason === "no-language-model-selected") { - toast({ - description: "⚠️ You must select a language model", - variant: "destructive", - }); - } else if (isSubmitDisabledReason === "too-large") { - toast({ - description: `⚠️ Message and attachments exceed the ${Math.round(ATTACHMENT_MAX_TURN_TEXT_BYTES / 1024)}KB per-message limit. Remove a file or shorten the text.`, - variant: "destructive", - }); - } - - if (isSubmitDisabledReason === "uploading") { - toast({ - description: "⚠️ Please wait for image uploads to finish", - variant: "destructive", - }); - } - - if (isSubmitDisabledReason === "upload-error") { - toast({ - description: "⚠️ Remove failed image uploads before sending", - variant: "destructive", - }); - } - - return; - } - - if (requiresLogin) { - sessionStorage.setItem( - PENDING_CHAT_SUBMISSION_SESSION_STORAGE_KEY, - JSON.stringify({ pathname, children: editor.children, attachments: getRedirectSafeAttachments(attachments) }), - ); - captureEvent('wa_askgh_login_wall_prompted', {}); - setIsLoginDialogOpen(true); - return; - } - - if (requiresUpgrade) { - sessionStorage.setItem( - PENDING_CHAT_SUBMISSION_SESSION_STORAGE_KEY, - JSON.stringify({ pathname, children: editor.children, attachments: getRedirectSafeAttachments(attachments) }), - ); - setIsUpsellDialogOpen(true); - return; - } - - const attachmentData = attachments - .map(toAttachmentData) - .filter((attachment): attachment is AttachmentData => attachment !== undefined); - - // The persisted message renders images from the serving route (the - // uploader can read their own bytes pre-commit). The preview object URLs - // are kept alive for the `submittedAttachments` redirect tray and revoked - // on unmount (see the cleanup effect above). - _onSubmit(editor.children, editor, attachmentData); - // Replace the prior submitted batch, revoking its preview URLs so they - // don't accumulate across repeated sends in a long-lived chat box. - setSubmittedAttachments((prev) => { - for (const attachment of prev) { - if (attachment.kind === 'image') { - URL.revokeObjectURL(attachment.previewUrl); - } - } - return attachments; - }); - setAttachments([]); - }, [ - isSubmitDisabled, - requiresLogin, - requiresUpgrade, - _onSubmit, - editor, - isSubmitDisabledReason, - toast, - pathname, - captureEvent, - attachments - ]); - - useEffect(() => { - if ( - requiresLogin || - requiresUpgrade - ) { - return; - } - - const stored = sessionStorage.getItem(PENDING_CHAT_SUBMISSION_SESSION_STORAGE_KEY); - if (!stored) { - return; - } - - try { - const { pathname: storedPathname, children, attachments: storedAttachments = [] } = JSON.parse(stored) as { - pathname: string; - children: Descendant[]; - attachments?: AttachmentData[]; - }; - if (storedPathname !== pathname) { - return; - } - - sessionStorage.removeItem(PENDING_CHAT_SUBMISSION_SESSION_STORAGE_KEY); - _onSubmit(children, editor, storedAttachments); - } catch (error) { - console.error('Failed to restore pending chat submission:', error); - sessionStorage.removeItem(PENDING_CHAT_SUBMISSION_SESSION_STORAGE_KEY); - } - }, [ - pathname, - editor, - _onSubmit, - requiresLogin, - requiresUpgrade, - isSubmitDisabled - ]); - - const onInsertSuggestion = useCallback((suggestion: Suggestion) => { - switch (suggestion.type) { - case 'file': - insertMention(editor, { - type: 'file', - path: suggestion.path, - repo: suggestion.repo, - name: suggestion.name, - language: suggestion.language, - revision: suggestion.revision, - }, range); - break; - case 'command': - captureEvent('ask_skill_command_selected', { - source: 'sourcebot-web-client', - entryPoint: 'chat_box', - scope: suggestion.sourceId === ASK_COMMAND_SOURCE_SHARED_SKILL ? 'shared' : 'personal', - isSynced: suggestion.isSynced === true, - suggestionIndex: Math.max(0, suggestions.findIndex((item) => item === suggestion)), - visibleSuggestionCount: suggestions.length, - }); - insertMention(editor, { - type: 'command', - commandId: suggestion.id, - sourceId: suggestion.sourceId, - slug: suggestion.slug, - name: suggestion.name, - sourceLabel: suggestion.sourceLabel, - }, range); - insertText(editor, ' '); - break; - case 'refine': - insertText(editor, 'file:'); - break; - } - ReactEditor.focus(editor); - }, [captureEvent, editor, range, suggestions]); - - const onKeyDown = useCallback((event: KeyboardEvent) => { - // Detect the OS raw-paste chord so the upcoming `paste` event can skip - // the large-paste auto-conversion and insert inline instead. - if ( - (event.key === 'v' || event.key === 'V') && - event.shiftKey && - (isMac ? event.metaKey : event.ctrlKey) - ) { - rawPasteRequestedRef.current = true; - } - - if (shouldUsePlainComposerEnterBehavior(suggestionMode, suggestions.length)) { - switch (event.key) { - case 'Enter': { - if (event.shiftKey) { - break; - } - - if (event.altKey) { - event.preventDefault(); - editor.insertBreak(); - break; - } - - event.preventDefault(); - onSubmit(); - break; - } - } - } - else if (suggestions.length > 0) { - switch (event.key) { - case 'ArrowDown': { - event.preventDefault(); - const prevIndex = index >= suggestions.length - 1 ? 0 : index + 1 - setIndex(prevIndex) - break; - } - case 'ArrowUp': { - event.preventDefault(); - const nextIndex = index <= 0 ? suggestions.length - 1 : index - 1 - setIndex(nextIndex) - break; - } - case 'Tab': - case 'Enter': { - event.preventDefault(); - const suggestion = suggestions[index]; - if (!suggestion) { - break; - } - onInsertSuggestion(suggestion); - break; - } - case 'Escape': { - event.preventDefault(); - break; - } - } - } - }, [suggestionMode, suggestions, onSubmit, editor, index, onInsertSuggestion, isMac]); - - useEffect(() => { - if (!range || !suggestionsBoxRef.current) { - return; - } - - const virtualElement: VirtualElement = { - getBoundingClientRect: () => { - if (!range) { - return new DOMRect(); - } - - return ReactEditor.toDOMRange(editor, range).getBoundingClientRect(); - } - } - - computePosition(virtualElement, suggestionsBoxRef.current, { - placement: preferredSuggestionsBoxPlacement, - middleware: [ - offset(2), - flip({ - mainAxis: true, - crossAxis: false, - fallbackPlacements: ['top-start', 'bottom-start'], - padding: 20, - }), - shift({ - padding: 5, - }) - ] - }).then(({ x, y }) => { - if (suggestionsBoxRef.current) { - suggestionsBoxRef.current.style.left = `${x}px`; - suggestionsBoxRef.current.style.top = `${y}px`; - } - }) - }, [editor, index, range, preferredSuggestionsBoxPlacement]); - - return ( - <> -
- {(isRedirecting ? submittedAttachments : attachments).length > 0 && ( - - )} - {attachments.some((attachment) => attachment.kind === 'image') && !supportsImages && ( -

- Images won't be sent: the selected model doesn't support image input. -

- )} - { - const clipboardData = event.clipboardData; - const files = clipboardData?.files ? Array.from(clipboardData.files) : []; - if (files.length > 0) { - event.preventDefault(); - void onAddFiles(files); - return; - } - - // A raw-paste chord (⌘⇧V / Ctrl+Shift+V) bypasses - // auto-conversion for this one paste. Consume the flag - // regardless so it never leaks into the next paste. - const rawPasteRequested = rawPasteRequestedRef.current; - rawPasteRequestedRef.current = false; - if (rawPasteRequested) { - return; - } - - const text = clipboardData?.getData('text/plain') ?? ''; - if (!shouldAutoConvertPaste(text)) { - return; - } - - event.preventDefault(); - onAddPastedText(text); - }} - /> -
- - {isRedirecting ? ( - - ) : - isNetworkActive ? ( - - ) : ( - - -
{ - // @hack: When submission is disabled, we still want to issue - // a warning to the user as to why the submission is disabled. - // onSubmit on the Button will not be called because of the - // disabled prop, hence the call here. - if (isSubmitDisabled) { - onSubmit(); - } - }} - > - -
-
-
- )} -
- {suggestionMode !== "none" && ( - - )} -
- { - setIsLoginDialogOpen(open); - if (!open) { - sessionStorage.removeItem(PENDING_CHAT_SUBMISSION_SESSION_STORAGE_KEY); - } - }} - /> - { - setIsUpsellDialogOpen(open); - if (!open) { - sessionStorage.removeItem(PENDING_CHAT_SUBMISSION_SESSION_STORAGE_KEY); - } - }} - source="chat_box" - returnPath={pathname} - /> - - ) -} - -export const ChatBox = memo(forwardRef(ChatBoxComponent), isEqual); - -const DefaultElement = (props: RenderElementProps) => { - return

{props.children}

-} - -const Leaf = (props: RenderLeafProps) => { - return ( - - {props.children} - - ) -} - -const MentionComponent = (props: RenderElementPropsFor) => { - const { attributes, children, element: { data } } = props; - - if (data.type === 'file') { - return ; - } - - if (data.type === 'command') { - return ( - - {`/${data.slug}`} - {data.sourceLabel && ( - {data.sourceLabel} - )} - - } - tooltipContent={} - > - {children} - - ) - } - - return null; -} - -const CommandMentionTooltip = ({ data }: { data: CommandMentionData }) => { - return ( - - - {data.name} - {data.sourceLabel && ( - {data.sourceLabel} - )} - - - ); -}; diff --git a/packages/web/src/features/chat/components/chatBox/chatBoxPlusButton.tsx b/packages/web/src/features/chat/components/chatBox/chatBoxPlusButton.tsx deleted file mode 100644 index 7a2c02a5b..000000000 --- a/packages/web/src/features/chat/components/chatBox/chatBoxPlusButton.tsx +++ /dev/null @@ -1,31 +0,0 @@ -'use client'; - -import type { SearchScope } from "@/features/chat/types"; -import { useHasEntitlement } from "@/features/entitlements/useHasEntitlement"; -import { ConnectorsMenu } from "@/ee/features/chat/mcp/components/connectorsMenu"; -import { ConnectorsExplainerMenu } from "./connectorsExplainerMenu"; - -interface ChatBoxPlusButtonProps { - selectedSearchScopes: SearchScope[]; - onSelectedSearchScopesChange: (items: SearchScope[]) => void; - disabledMcpServerIds: string[]; - unavailableMcpServerIds?: string[]; - onDisabledMcpServerIdsChange: (ids: string[]) => void; - isAuthenticated: boolean; -} - -/** - * Entitlement-aware "+" button for the chat box. The connector machinery lives - * in ee/ and only ever renders/runs when the `ask` entitlement is present; - * free-plan users render the FSL explainer instead. Static-importing the ee/ - * component is fine — it is only invoked behind the entitlement check below. - */ -export const ChatBoxPlusButton = (props: ChatBoxPlusButtonProps) => { - const hasAskEntitlement = useHasEntitlement('ask'); - - if (hasAskEntitlement) { - return ; - } - - return ; -}; diff --git a/packages/web/src/features/chat/components/chatBox/chatBoxToolbar.tsx b/packages/web/src/features/chat/components/chatBox/chatBoxToolbar.tsx deleted file mode 100644 index f4006d394..000000000 --- a/packages/web/src/features/chat/components/chatBox/chatBoxToolbar.tsx +++ /dev/null @@ -1,75 +0,0 @@ -'use client'; - -import { Separator } from "@/components/ui/separator"; -import { LanguageModelInfo, SearchScope } from "@/features/chat/types"; -import { RepositoryQuery, SearchContextQuery } from "@/lib/types"; -import { useSelectedLanguageModel } from "../../useSelectedLanguageModel"; -import { AtMentionButton } from "./atMentionButton"; -import { ChatBoxPlusButton } from "./chatBoxPlusButton"; -import { LanguageModelSelector } from "./languageModelSelector"; -import { SearchScopeSelector } from "./searchScopeSelector"; - -export interface ChatBoxToolbarProps { - languageModels: LanguageModelInfo[]; - repos: RepositoryQuery[]; - searchContexts: SearchContextQuery[]; - selectedSearchScopes: SearchScope[]; - onSelectedSearchScopesChange: (items: SearchScope[]) => void; - isContextSelectorOpen: boolean; - onContextSelectorOpenChanged: (isOpen: boolean) => void; - disabledMcpServerIds?: string[]; - unavailableMcpServerIds?: string[]; - onDisabledMcpServerIdsChange?: (ids: string[]) => void; - isAuthenticated: boolean; -} - -export const ChatBoxToolbar = ({ - languageModels, - repos, - searchContexts, - selectedSearchScopes, - onSelectedSearchScopesChange, - isContextSelectorOpen, - onContextSelectorOpenChanged, - disabledMcpServerIds, - unavailableMcpServerIds, - onDisabledMcpServerIdsChange, - isAuthenticated, -}: ChatBoxToolbarProps) => { - const { selectedLanguageModel, setSelectedLanguageModel } = useSelectedLanguageModel(languageModels); - - return ( - <> - {disabledMcpServerIds !== undefined && onDisabledMcpServerIdsChange !== undefined && ( - <> - - - - )} - - - - - - - ) -} diff --git a/packages/web/src/features/chat/components/chatBox/chatPaneDropzone.tsx b/packages/web/src/features/chat/components/chatBox/chatPaneDropzone.tsx deleted file mode 100644 index 5251b6059..000000000 --- a/packages/web/src/features/chat/components/chatBox/chatPaneDropzone.tsx +++ /dev/null @@ -1,99 +0,0 @@ -'use client'; - -import { useToast } from "@/components/hooks/use-toast"; -import { getAttachmentDropzoneAccept } from "@/features/chat/attachmentUtils"; -import { cn } from "@/lib/utils"; -import { FileUp } from "lucide-react"; -import { ReactNode, useEffect, useState } from "react"; -import { useDropzone } from "react-dropzone"; - -interface ChatPaneDropzoneProps { - onFilesDropped: (files: File[]) => void; - disabled?: boolean; - className?: string; - children: ReactNode; -} - -// Makes an entire chat pane a drag-and-drop target for attachments. Drops are -// forwarded to the chat box (which owns attachment state) via `onFilesDropped`. -// `noClick`/`noKeyboard` keep the zone from hijacking clicks/keys; the file -// picker is opened separately from the attachment button. -export const ChatPaneDropzone = ({ onFilesDropped, disabled, className, children }: ChatPaneDropzoneProps) => { - const { toast } = useToast(); - // Only surface the overlay when actual files are being dragged (not, e.g., a - // text selection dragged within the editor). `dragFileCount` is the number of - // files in the active drag (when the browser exposes it). - const [isDraggingFiles, setIsDraggingFiles] = useState(false); - const [dragFileCount, setDragFileCount] = useState(0); - - const { getRootProps, getInputProps, isDragActive, isDragReject } = useDropzone({ - // Accept images at the dropzone layer regardless of model capability; - // the chat box's add handler applies the authoritative image gate (and - // surfaces a precise message when the selected model is text-only). - accept: getAttachmentDropzoneAccept(true), - multiple: true, - noClick: true, - noKeyboard: true, - disabled, - onDrop: (acceptedFiles, fileRejections) => { - setIsDraggingFiles(false); - if (acceptedFiles.length > 0) { - onFilesDropped(acceptedFiles); - } - if (fileRejections.length > 0) { - toast({ - description: `⚠️ Unsupported file type: ${fileRejections.map((rejection) => rejection.file.name).join(', ')}.`, - variant: "destructive", - }); - } - }, - }); - - // react-dropzone clears `isDragActive` when the drag leaves; mirror that for - // our files flag so the overlay never gets stuck. - useEffect(() => { - if (!isDragActive) { - setIsDraggingFiles(false); - setDragFileCount(0); - } - }, [isDragActive]); - - const showOverlay = isDragActive && isDraggingFiles && !disabled; - - return ( -
{ - const types = event.dataTransfer?.types ?? []; - setIsDraggingFiles(types.includes('Files')); - const items = event.dataTransfer?.items; - setDragFileCount(items ? Array.from(items).filter((item) => item.kind === 'file').length : 0); - }, - })} - > - - {showOverlay && ( -
-
- - - {isDragReject ? "Unsupported file type" : "Drop to attach"} - - {dragFileCount > 0 && ( - - {dragFileCount} file{dragFileCount === 1 ? '' : 's'} - - )} -
-
- )} - {children} -
- ) -} diff --git a/packages/web/src/features/chat/components/chatBox/connectorsExplainerMenu.tsx b/packages/web/src/features/chat/components/chatBox/connectorsExplainerMenu.tsx deleted file mode 100644 index f86fb25fa..000000000 --- a/packages/web/src/features/chat/components/chatBox/connectorsExplainerMenu.tsx +++ /dev/null @@ -1,70 +0,0 @@ -'use client'; - -import { useState } from "react"; -import { Button } from "@/components/ui/button"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuLabel, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { CableIcon, PlusIcon } from "lucide-react"; -import { UpsellDialog } from "@/features/billing/upsellDialog"; -import { ConnectorsExplainerText } from "@/features/chat/components/chatBox/connectorsExplainerText"; - -/** - * Free-plan stand-in for the connectors menu. This is intentionally NOT in ee/: - * unlicensed users only ever render this explainer, never the real connector - * machinery (which lives in ee/ and runs solely behind the `mcp` entitlement). - * The "+" button stays visible so the feature is still discoverable, and the - * "paid plan" link opens the shared trial/upgrade dialog. - */ -export const ConnectorsExplainerMenu = () => { - const [isMenuOpen, setIsMenuOpen] = useState(false); - const [isUpsellOpen, setIsUpsellOpen] = useState(false); - - const openUpsell = () => { - // Close the dropdown first, then open the dialog on the next frame so the - // menu's overlay/pointer-events cleanup finishes before the dialog's focus - // trap mounts (avoids a Radix stacked-overlay race). - setIsMenuOpen(false); - requestAnimationFrame(() => setIsUpsellOpen(true)); - }; - - return ( - <> - - - - - e.preventDefault()}> - - - Connectors - - - Connectors are available on a{" "} - . - - } - /> - - - - - ); -}; diff --git a/packages/web/src/features/chat/components/chatBox/connectorsExplainerText.tsx b/packages/web/src/features/chat/components/chatBox/connectorsExplainerText.tsx deleted file mode 100644 index fc4868e71..000000000 --- a/packages/web/src/features/chat/components/chatBox/connectorsExplainerText.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import type { ReactNode } from "react"; -import { cn } from "@/lib/utils"; - -export const CONNECTORS_DOCS_URL = "https://docs.sourcebot.dev/docs/features/ask/connectors"; - -interface ConnectorsExplainerTextProps { - /** Rendered inline before the shared description sentence. */ - leading?: ReactNode; - /** Rendered inline after the shared description sentence, before "Learn more". */ - trailing?: ReactNode; - className?: string; -} - -/** - * Shared connectors explainer copy. Intentionally NOT in ee/ so the free-plan - * teaser and the licensed connectors menu can both render the same description - * without the free path importing ee/ feature code. - */ -export const ConnectorsExplainerText = ({ leading, trailing, className }: ConnectorsExplainerTextProps) => { - return ( -

- {leading} - Connect external tools like Linear or Jira so the agent can pull in context beyond your code.{" "} - {trailing ? <>{trailing}{" "} : null} - Learn more -

- ); -}; diff --git a/packages/web/src/features/chat/components/chatBox/index.ts b/packages/web/src/features/chat/components/chatBox/index.ts deleted file mode 100644 index b35b49675..000000000 --- a/packages/web/src/features/chat/components/chatBox/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { ChatBox } from "./chatBox"; -export type { ChatBoxHandle } from "./chatBox"; diff --git a/packages/web/src/features/chat/components/chatBox/keyboard.test.ts b/packages/web/src/features/chat/components/chatBox/keyboard.test.ts deleted file mode 100644 index 0040e6cea..000000000 --- a/packages/web/src/features/chat/components/chatBox/keyboard.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { describe, expect, test } from 'vitest'; -import { shouldUsePlainComposerEnterBehavior } from './keyboard'; - -describe('shouldUsePlainComposerEnterBehavior', () => { - test('uses plain enter behavior when there is no suggestion mode', () => { - expect(shouldUsePlainComposerEnterBehavior('none', 0)).toBe(true); - expect(shouldUsePlainComposerEnterBehavior('none', 2)).toBe(true); - }); - - test('uses plain enter behavior for command mode with no matching suggestions', () => { - expect(shouldUsePlainComposerEnterBehavior('command', 0)).toBe(true); - }); - - test('keeps suggestion handling when command suggestions are available', () => { - expect(shouldUsePlainComposerEnterBehavior('command', 1)).toBe(false); - }); - - test('preserves existing mention behavior for empty file and refine suggestions', () => { - expect(shouldUsePlainComposerEnterBehavior('file', 0)).toBe(false); - expect(shouldUsePlainComposerEnterBehavior('refine', 0)).toBe(false); - }); -}); diff --git a/packages/web/src/features/chat/components/chatBox/keyboard.ts b/packages/web/src/features/chat/components/chatBox/keyboard.ts deleted file mode 100644 index f601ac00e..000000000 --- a/packages/web/src/features/chat/components/chatBox/keyboard.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { SuggestionMode } from "./types"; - -export const shouldUsePlainComposerEnterBehavior = ( - suggestionMode: SuggestionMode, - suggestionCount: number, -) => suggestionMode === "none" || (suggestionMode === "command" && suggestionCount === 0); diff --git a/packages/web/src/features/chat/components/chatBox/languageModelSelector.tsx b/packages/web/src/features/chat/components/chatBox/languageModelSelector.tsx deleted file mode 100644 index cf5645f9d..000000000 --- a/packages/web/src/features/chat/components/chatBox/languageModelSelector.tsx +++ /dev/null @@ -1,150 +0,0 @@ -'use client'; - -import { Button } from "@/components/ui/button"; -import { - Command, - CommandEmpty, - CommandGroup, - CommandInput, - CommandItem, - CommandList, -} from "@/components/ui/command"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { LanguageModelInfo } from "@/features/chat/types"; -import { cn } from "@/lib/utils"; -import { - Bot, - CheckIcon, - ChevronDown, -} from "lucide-react"; -import { useMemo, useState } from "react"; -import { ModelProviderLogo } from "./modelProviderLogo"; -import { getLanguageModelKey } from "../../utils"; - -interface LanguageModelSelectorProps { - languageModels: LanguageModelInfo[]; - selectedModel?: LanguageModelInfo; - onSelectedModelChange: (model: LanguageModelInfo) => void; - className?: string; -} - -export const LanguageModelSelector = ({ - languageModels: _languageModels, - selectedModel, - onSelectedModelChange, - className, -}: LanguageModelSelectorProps) => { - const [isPopoverOpen, setIsPopoverOpen] = useState(false); - - const handleInputKeyDown = ( - event: React.KeyboardEvent - ) => { - if (event.key === "Enter") { - setIsPopoverOpen(true); - } - }; - - const selectModel = (model: LanguageModelInfo) => { - onSelectedModelChange(model); - setIsPopoverOpen(false); - }; - - const handleTogglePopover = () => { - setIsPopoverOpen((prev) => !prev); - }; - - // De-duplicate models - const languageModels = useMemo(() => { - return _languageModels.filter((model, selfIndex, selfArray) => - selfIndex === selfArray.findIndex((t) => getLanguageModelKey(t) === getLanguageModelKey(model)) - ); - }, [_languageModels]); - - return ( - - - - - setIsPopoverOpen(false)} - > - - - - -

No models found.

-
- - {languageModels - .map((model) => { - const isSelected = selectedModel && getLanguageModelKey(selectedModel) === getLanguageModelKey(model); - return ( - { - selectModel(model) - }} - className="cursor-pointer" - > -
- -
- - {model.displayName ?? model.model} -
- ); - })} -
-
-
-
-
- ); -}; diff --git a/packages/web/src/features/chat/components/chatBox/modelProviderLogo.tsx b/packages/web/src/features/chat/components/chatBox/modelProviderLogo.tsx deleted file mode 100644 index 535cc79d3..000000000 --- a/packages/web/src/features/chat/components/chatBox/modelProviderLogo.tsx +++ /dev/null @@ -1,101 +0,0 @@ -'use client'; - -import { useMemo } from "react"; -import { LanguageModelProvider } from "../../types"; -import { cn } from "@/lib/utils"; -import Image from "next/image"; -import anthropicLogo from "@/public/anthropic.svg"; -import azureAiLogo from "@/public/azureai.svg"; -import bedrockLogo from "@/public/bedrock.svg"; -import geminiLogo from "@/public/gemini.svg"; -import openaiLogo from "@/public/openai.svg"; -import deepseekLogo from "@/public/deepseek.svg"; -import mistralLogo from "@/public/mistral.svg"; -import openrouterLogo from "@/public/openrouter.svg"; -import xaiLogo from "@/public/xai.svg"; -import { Box, LucideIcon } from "lucide-react"; - -interface ModelProviderLogoProps { - provider: LanguageModelProvider; - className?: string; -} - -export const ModelProviderLogo = ({ - provider, - className, -}: ModelProviderLogoProps) => { - const { src, Icon, className: logoClassName } = useMemo((): { src?: string, Icon?: LucideIcon, className?: string } => { - switch (provider) { - case 'amazon-bedrock': - return { - src: bedrockLogo, - className: 'dark:invert' - }; - case 'anthropic': - return { - src: anthropicLogo, - className: 'dark:invert' - }; - case 'azure': - return { - src: azureAiLogo, - }; - case 'deepseek': - return { - src: deepseekLogo, - }; - case 'openai': - return { - src: openaiLogo, - className: 'dark:invert' - }; - case 'google-generative-ai': - case 'google-vertex': - return { - src: geminiLogo, - }; - case 'google-vertex-anthropic': - return { - src: anthropicLogo, - className: 'dark:invert' - }; - case 'mistral': - return { - src: mistralLogo, - }; - case 'openrouter': - return { - src: openrouterLogo, - className: 'dark:invert' - }; - case 'xai': - return { - src: xaiLogo, - className: 'dark:invert' - }; - case 'openai-compatible': - return { - Icon: Box, - className: 'text-muted-foreground' - }; - } - }, [provider]); - - return src ? ( - {provider} - ) : Icon ? ( - - ) : null; -} diff --git a/packages/web/src/features/chat/components/chatBox/searchScopeInfoCard.tsx b/packages/web/src/features/chat/components/chatBox/searchScopeInfoCard.tsx deleted file mode 100644 index d3d3ade4a..000000000 --- a/packages/web/src/features/chat/components/chatBox/searchScopeInfoCard.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { BookMarkedIcon, LibraryBigIcon, ScanSearchIcon } from "lucide-react"; - -export const SearchScopeInfoCard = () => { - return ( -
-
- -

Search Scope

-
-
- When asking Sourcebot a question, you can select one or more scopes to focus the search. - There are two different types of search scopes: -
-
- - Repository: A single repository, indicated by the code host icon. -
-
- - Reposet: A set of repositories, indicated by the library icon. -
-
-
-
- ); -}; \ No newline at end of file diff --git a/packages/web/src/features/chat/components/chatBox/searchScopeSelector.tsx b/packages/web/src/features/chat/components/chatBox/searchScopeSelector.tsx deleted file mode 100644 index 78895c266..000000000 --- a/packages/web/src/features/chat/components/chatBox/searchScopeSelector.tsx +++ /dev/null @@ -1,344 +0,0 @@ -// Adapted from: web/src/components/ui/multi-select.tsx - -import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Separator } from "@/components/ui/separator"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { RepositoryQuery, SearchContextQuery } from "@/lib/types"; -import { cn } from "@/lib/utils"; -import { - CheckIcon, - ChevronDown, - ScanSearchIcon, -} from "lucide-react"; -import { ButtonHTMLAttributes, forwardRef, KeyboardEvent, useCallback, useEffect, useMemo, useRef, useState } from "react"; -import { useVirtualizer } from "@tanstack/react-virtual"; -import { RepoSearchScope, RepoSetSearchScope, SearchScope } from "../../types"; -import { SearchScopeIcon } from "../searchScopeIcon"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; -import { SearchScopeInfoCard } from "./searchScopeInfoCard"; - -interface SearchScopeSelectorProps extends ButtonHTMLAttributes { - repos: RepositoryQuery[]; - searchContexts: SearchContextQuery[]; - selectedSearchScopes: SearchScope[]; - onSelectedSearchScopesChange: (items: SearchScope[]) => void; - className?: string; - isOpen: boolean; - onOpenChanged: (isOpen: boolean) => void; -} - -export const SearchScopeSelector = forwardRef< - HTMLButtonElement, - SearchScopeSelectorProps ->( - ( - { - repos, - searchContexts, - className, - selectedSearchScopes, - onSelectedSearchScopesChange, - isOpen, - onOpenChanged, - ...props - }, - ref - ) => { - const scrollContainerRef = useRef(null); - const scrollPosition = useRef(0); - const [searchQuery, setSearchQuery] = useState(""); - const [isMounted, setIsMounted] = useState(false); - const [highlightedIndex, setHighlightedIndex] = useState(0); - - const toggleItem = useCallback((item: SearchScope) => { - // Store current scroll position before state update - if (scrollContainerRef.current) { - scrollPosition.current = scrollContainerRef.current.scrollTop; - } - - const isSelected = selectedSearchScopes.some( - (selected) => selected.type === item.type && selected.value === item.value - ); - - const newSelectedItems = isSelected ? - selectedSearchScopes.filter( - (selected) => !(selected.type === item.type && selected.value === item.value) - ) : - [...selectedSearchScopes, item]; - - onSelectedSearchScopesChange(newSelectedItems); - }, [selectedSearchScopes, onSelectedSearchScopesChange]); - - const allSearchScopeItems = useMemo(() => { - const repoSetSearchScopeItems: RepoSetSearchScope[] = searchContexts.map(context => ({ - type: 'reposet' as const, - value: context.name, - name: context.name, - repoCount: context.repoNames.length - })); - - const repoSearchScopeItems: RepoSearchScope[] = repos.map(repo => ({ - type: 'repo' as const, - value: repo.repoName, - name: repo.repoDisplayName || repo.repoName.split('/').pop() || repo.repoName, - codeHostType: repo.codeHostType, - })); - - return [...repoSetSearchScopeItems, ...repoSearchScopeItems]; - }, [repos, searchContexts]); - - const handleClear = useCallback(() => { - onSelectedSearchScopesChange([]); - setSearchQuery(""); - requestAnimationFrame(() => { - if (scrollContainerRef.current) { - scrollContainerRef.current.scrollTop = 0; - } - }) - }, [onSelectedSearchScopesChange]); - - const handleTogglePopover = useCallback(() => { - onOpenChanged(!isOpen); - }, [onOpenChanged, isOpen]); - - const sortedSearchScopeItems = useMemo(() => { - const query = searchQuery.toLowerCase(); - - return allSearchScopeItems - .filter((item) => { - // Filter by search query - if (query && !item.name.toLowerCase().includes(query) && !item.value.toLowerCase().includes(query)) { - return false; - } - return true; - }) - .map((item) => ({ - item, - isSelected: selectedSearchScopes.some( - (selected) => selected.type === item.type && selected.value === item.value - ) - })) - .sort((a, b) => { - // Selected items first - if (a.isSelected && !b.isSelected) return -1; - if (!a.isSelected && b.isSelected) return 1; - // Then reposets before repos - if (a.item.type === 'reposet' && b.item.type === 'repo') return -1; - if (a.item.type === 'repo' && b.item.type === 'reposet') return 1; - return 0; - }) - }, [allSearchScopeItems, selectedSearchScopes, searchQuery]); - - const handleInputKeyDown = useCallback( - (event: KeyboardEvent) => { - if (event.key === "ArrowDown") { - event.preventDefault(); - setHighlightedIndex((prev) => - prev < sortedSearchScopeItems.length - 1 ? prev + 1 : prev - ); - } else if (event.key === "ArrowUp") { - event.preventDefault(); - setHighlightedIndex((prev) => prev > 0 ? prev - 1 : 0); - } else if (event.key === "Enter") { - event.preventDefault(); - if (sortedSearchScopeItems.length > 0 && highlightedIndex >= 0) { - toggleItem(sortedSearchScopeItems[highlightedIndex].item); - } - } else if (event.key === "Backspace" && !event.currentTarget.value) { - const newSelectedItems = [...selectedSearchScopes]; - newSelectedItems.pop(); - onSelectedSearchScopesChange(newSelectedItems); - } - }, [highlightedIndex, onSelectedSearchScopesChange, selectedSearchScopes, sortedSearchScopeItems, toggleItem]); - - const virtualizer = useVirtualizer({ - count: sortedSearchScopeItems.length, - getScrollElement: () => scrollContainerRef.current, - estimateSize: () => 36, - overscan: 5, - }); - - // Reset highlighted index and scroll to top when search query changes - useEffect(() => { - setHighlightedIndex(0); - if (scrollContainerRef.current) { - scrollContainerRef.current.scrollTop = 0; - } - }, [searchQuery]); - - // Reset highlighted index when items change (but don't scroll) - useEffect(() => { - setHighlightedIndex(0); - }, [sortedSearchScopeItems.length]); - - // Measure virtualizer when popover opens and container is mounted - useEffect(() => { - if (isOpen) { - setIsMounted(true); - setHighlightedIndex(0); - // Give the DOM a tick to render before measuring - requestAnimationFrame(() => { - if (scrollContainerRef.current) { - virtualizer.measure(); - } - }); - } else { - setIsMounted(false); - } - }, [isOpen, virtualizer]); - - // Scroll highlighted item into view - useEffect(() => { - if (isMounted && highlightedIndex >= 0) { - virtualizer.scrollToIndex(highlightedIndex, { - align: 'auto', - }); - } - }, [highlightedIndex, isMounted, virtualizer]); - - // Restore scroll position after re-render - useEffect(() => { - if (scrollContainerRef.current && scrollPosition.current > 0) { - scrollContainerRef.current.scrollTop = scrollPosition.current; - } - }, [sortedSearchScopeItems]); - - return ( - - - - - - - - - - - onOpenChanged(false)} - > -
-
- setSearchQuery(e.target.value)} - onKeyDown={handleInputKeyDown} - className="border-0 focus-visible:ring-0 focus-visible:ring-offset-0 h-11" - /> -
-
- {sortedSearchScopeItems.length === 0 ? ( -
- No results found. -
- ) : ( -
-
- {isMounted && virtualizer.getVirtualItems().map((virtualItem) => { - const { item, isSelected } = sortedSearchScopeItems[virtualItem.index]; - const isHighlighted = virtualItem.index === highlightedIndex; - return ( -
toggleItem(item)} - onMouseEnter={() => setHighlightedIndex(virtualItem.index)} - className={cn( - "cursor-pointer absolute top-0 left-0 w-full flex items-center px-2 py-1.5 text-sm rounded-sm", - isHighlighted ? "bg-accent text-accent-foreground" : "hover:bg-accent hover:text-accent-foreground" - )} - style={{ - transform: `translateY(${virtualItem.start}px)`, - }} - > -
- -
-
- -

{item.name}

- {item.type === 'reposet' && ( - - {item.repoCount} repo{item.repoCount === 1 ? '' : 's'} - - )} -
-
- ); - })} -
-
- )} -
- {selectedSearchScopes.length > 0 && ( - <> - -
- Clear -
- - )} -
-
-
-
- ); - } -); - -SearchScopeSelector.displayName = "SearchScopeSelector"; \ No newline at end of file diff --git a/packages/web/src/features/chat/components/chatBox/sourceLabelBadge.tsx b/packages/web/src/features/chat/components/chatBox/sourceLabelBadge.tsx deleted file mode 100644 index d3b38507f..000000000 --- a/packages/web/src/features/chat/components/chatBox/sourceLabelBadge.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { cn } from "@/lib/utils"; -import type { ReactNode } from "react"; - -interface SourceLabelBadgeProps { - children: ReactNode; - className?: string; -} - -export const SourceLabelBadge = ({ children, className }: SourceLabelBadgeProps) => ( - - {children} - -); diff --git a/packages/web/src/features/chat/components/chatBox/suggestionsBox.tsx b/packages/web/src/features/chat/components/chatBox/suggestionsBox.tsx deleted file mode 100644 index 4375a165c..000000000 --- a/packages/web/src/features/chat/components/chatBox/suggestionsBox.tsx +++ /dev/null @@ -1,172 +0,0 @@ -'use client'; - -import { VscodeFileIcon } from "@/app/components/vscodeFileIcon"; -import { Skeleton } from "@/components/ui/skeleton"; -import { cn } from "@/lib/utils"; -import { forwardRef, type ReactNode } from "react"; -import { createPortal } from "react-dom"; -import { VscFiles } from "react-icons/vsc"; -import { FileSuggestion, RefineSuggestion, Suggestion } from "./types"; -import { BookOpenIcon } from "lucide-react"; -import type { AskCommandSuggestion } from "@/features/chat/commands/types"; -import { SourceLabelBadge } from "./sourceLabelBadge"; - -interface SuggestionBoxProps { - selectedIndex: number; - onInsertSuggestion: (suggestion: Suggestion) => void; - isLoading: boolean; - suggestions: Suggestion[]; -} - -export const SuggestionBox = forwardRef(({ - selectedIndex, - onInsertSuggestion, - isLoading, - suggestions, -}, ref) => { - - return createPortal( -
- {isLoading ? ( -
- { - Array.from({ length: 10 }).map((_, index) => ( - - )) - } -
- ) : - (suggestions.length === 0) ? ( -
-

- No results found -

-
- ) : - ( -
- {suggestions.map((suggestion, i) => ( -
{ - onInsertSuggestion(suggestion); - }} - > - { - suggestion.type === 'file' && ( - - ) - } - { - suggestion.type === 'refine' && ( - - ) - } - { - suggestion.type === 'command' && ( - - ) - } -
- ))} -
- )} -
, - document.body - ) -}); - -SuggestionBox.displayName = 'SuggestionBox'; - - -const FileSuggestionListItem = ({ file }: { file: FileSuggestion }) => { - return ( - - {file.repo.split('/').pop()}/{file.path} - - } - icon={} - title={file.name} - /> - ) -} - -const RefineSuggestionListItem = ({ refine }: { refine: RefineSuggestion }) => { - return ( - } - title={refine.name} - /> - ) -} - -const CommandSuggestionListItem = ({ command }: { command: AskCommandSuggestion }) => { - return ( - } - title={`/${command.slug}`} - titleDetail={command.name} - badge={command.sourceLabel} - /> - ) -} - -interface SuggestionListItemProps { - description: ReactNode; - icon: ReactNode; - title: ReactNode; - badge?: ReactNode; - titleDetail?: ReactNode; -} - -const SuggestionListItem = ({ - badge, - description, - icon, - title, - titleDetail, -}: SuggestionListItemProps) => { - return ( - <> - {icon} -
- {titleDetail ? ( -
- - {title} - - - {titleDetail} - - {badge && ( - {badge} - )} -
- ) : ( -
- - {title} - - {badge && ( - {badge} - )} -
- )} - - {description} - -
- - ) -} diff --git a/packages/web/src/features/chat/components/chatBox/types.ts b/packages/web/src/features/chat/components/chatBox/types.ts deleted file mode 100644 index 096f34a95..000000000 --- a/packages/web/src/features/chat/components/chatBox/types.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { AskCommandSuggestion } from "@/features/chat/commands/types"; - -export type SuggestionMode = - "none" | - "refine" | - "command" | - "file" -; - -export type RefineSuggestion = { - type: 'refine'; - name: string; - description: string; -} - -export type FileSuggestion = { - type: 'file'; - repo: string; - path: string; - name: string; - language: string; - revision: string; -} - -export type Suggestion = FileSuggestion | RefineSuggestion | AskCommandSuggestion; diff --git a/packages/web/src/features/chat/components/chatBox/useSuggestionModeAndQuery.ts b/packages/web/src/features/chat/components/chatBox/useSuggestionModeAndQuery.ts deleted file mode 100644 index 6bf5325cf..000000000 --- a/packages/web/src/features/chat/components/chatBox/useSuggestionModeAndQuery.ts +++ /dev/null @@ -1,108 +0,0 @@ -'use client'; - -import { word } from "@/features/chat/utils"; -import { useEffect, useMemo } from "react"; -import { Editor, Range } from "slate"; -import { SuggestionMode } from "./types"; -import { useSlate, useSlateSelection } from "slate-react"; -import { usePrevious } from "@uidotdev/usehooks"; - - -export const useSuggestionModeAndQuery = () => { - const selection = useSlateSelection(); - const editor = useSlate(); - - const { suggestionQuery, suggestionMode, range } = useMemo<{ - suggestionQuery: string; - suggestionMode: SuggestionMode; - range: Range | null; - }>(() => { - if (!selection || !Range.isCollapsed(selection)) { - return { - suggestionMode: "none", - suggestionQuery: '', - range: null, - }; - } - - const range = word(editor, selection, { - terminator: [' '], - directions: 'both', - }); - - if (!range) { - return { - suggestionMode: "none", - suggestionQuery: '', - range: null, - }; - } - - const text = Editor.string(editor, range); - - let match: RegExpMatchArray | null = null; - - // Command mode. - match = text.match(/^\/(.*)$/); - if (match && Editor.isStart(editor, Range.start(range), [])) { - return { - suggestionMode: "command", - suggestionQuery: match[1], - range, - }; - } - - // Refine mode. - match = text.match(/^@$/); - if (match) { - return { - suggestionMode: "refine", - suggestionQuery: '', - range, - }; - } - - // File mode. - match = text.match(/^@file:(.*)$/); - if (match) { - return { - suggestionMode: "file", - suggestionQuery: match[1], - range, - }; - } - - // If the user starts typing, fallback to file mode. - // In the future, it would be nice to have a "all" mode that - // searches across all mode types. - match = text.match(/^@(.*)$/); - if (match) { - return { - suggestionMode: "file", - suggestionQuery: match[1], - range, - }; - } - - // Default to none mode. - return { - suggestionMode: "none", - suggestionQuery: '', - range: null, - }; - }, [editor, selection]); - - // Debug logging. - const previousSuggestionMode = usePrevious(suggestionMode); - useEffect(() => { - if (previousSuggestionMode !== suggestionMode) { - console.debug(`Suggestion mode changed: ${previousSuggestionMode} -> ${suggestionMode}`); - } - }, [previousSuggestionMode, suggestionMode]) - - return { - suggestionQuery, - suggestionMode, - range, - } -} diff --git a/packages/web/src/features/chat/components/chatBox/useSuggestionsData.ts b/packages/web/src/features/chat/components/chatBox/useSuggestionsData.ts deleted file mode 100644 index b8253f787..000000000 --- a/packages/web/src/features/chat/components/chatBox/useSuggestionsData.ts +++ /dev/null @@ -1,94 +0,0 @@ -'use client'; - -import { useQuery } from "@tanstack/react-query"; -import { FileSuggestion, RefineSuggestion, Suggestion, SuggestionMode } from "./types"; -import { unwrapServiceError } from "@/lib/utils"; -import { search } from "@/app/api/(client)/client"; -import { useMemo } from "react"; -import type { AskCommandDefinition } from "@/features/chat/commands/types"; -import { filterAskCommandDefinitions, toAskCommandSuggestion } from "@/features/chat/commands/utils"; - -interface Props { - suggestionMode: SuggestionMode; - suggestionQuery: string; - selectedRepos: string[]; - askCommands: AskCommandDefinition[]; -} - -const refineSuggestions: RefineSuggestion[] = [ - { - type: 'refine', - name: 'Files', - description: 'Include a file in the agent\'s context window.', - } -] - -export const useSuggestionsData = ({ - suggestionMode, - suggestionQuery, - selectedRepos, - askCommands, -}: Props): { isLoading: boolean, suggestions: Suggestion[] } => { - const { data: fileSuggestions, isLoading: _isLoadingFileSuggestions } = useQuery({ - queryKey: ["fileSuggestions-agentic", suggestionQuery, selectedRepos], - queryFn: () => { - const query = []; - if (suggestionQuery.length > 0) { - query.push(`file:${suggestionQuery}`); - } else { - query.push('file:.*'); - } - - if (selectedRepos.length > 0) { - query.push(`reposet:${selectedRepos.join(',')}`); - } - - return unwrapServiceError(search({ - query: query.join(' '), - matches: 10, - contextLines: 1, - })) - }, - select: (data): FileSuggestion[] => { - return data.files.map((file) => { - const path = file.fileName.text; - const suggestion: FileSuggestion = { - type: 'file', - path, - repo: file.repository, - name: path.split('/').pop() ?? '', - language: file.language, - revision: 'HEAD', // @todo: make revision configurable. - } - - return suggestion; - }); - }, - enabled: suggestionMode === "file", - }); - const isLoadingFiles = useMemo(() => suggestionMode === "file" && _isLoadingFileSuggestions, [_isLoadingFileSuggestions, suggestionMode]); - - switch (suggestionMode) { - case 'command': - return { - suggestions: filterAskCommandDefinitions(askCommands, suggestionQuery) - .map(toAskCommandSuggestion), - isLoading: false, - } - case 'file': - return { - suggestions: fileSuggestions ?? [], - isLoading: isLoadingFiles, - } - case 'refine': - return { - suggestions: refineSuggestions, - isLoading: false, - } - default: - return { - isLoading: false, - suggestions: [], - } - } -} diff --git a/packages/web/src/features/chat/components/chatEntitlementMessage.tsx b/packages/web/src/features/chat/components/chatEntitlementMessage.tsx deleted file mode 100644 index 3a2a0c8cf..000000000 --- a/packages/web/src/features/chat/components/chatEntitlementMessage.tsx +++ /dev/null @@ -1,40 +0,0 @@ -"use client" - -import { ReactNode } from "react" -import { UpsellPanel } from "@/features/billing/upsellDialog" -import { UpsellSource } from "@/lib/posthogEvents" - -interface ChatEntitlementMessageProps { - source?: UpsellSource; - /** Context-specific heading (e.g. "Upgrade to view Ask Sourcebot history"). */ - title?: string; - /** Context-specific subheading describing the value (avoid repeating "Upgrade"). */ - description?: ReactNode; - returnPath?: string; -} - -/** - * Shown in place of the Ask experience when the deployment is not on a plan that - * includes Ask Sourcebot. This is FSL (not ee/) so it can render for free-plan - * users as the upsell surface, and it renders the shared feature-breakdown panel - * (plan comparison + trial/upgrade) without mounting any ee/ feature code. - */ -export function ChatEntitlementMessage({ - source = "chat", - title = "Upgrade to use Ask Sourcebot", - description = "Ask questions about your codebase and get answers with cited sources.", - returnPath = "/chat", -}: ChatEntitlementMessageProps) { - return ( -
- -
- ) -} diff --git a/packages/web/src/features/chat/components/mentionChip.tsx b/packages/web/src/features/chat/components/mentionChip.tsx deleted file mode 100644 index f6f49926b..000000000 --- a/packages/web/src/features/chat/components/mentionChip.tsx +++ /dev/null @@ -1,89 +0,0 @@ -'use client'; - -import { VscodeFileIcon } from "@/app/components/vscodeFileIcon"; -import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; -import type { MentionElement, RenderElementPropsFor } from "@/features/chat/types"; -import { useIsMac } from "@/hooks/useIsMac"; -import { cn } from "@/lib/utils"; -import { Fragment, type ReactNode } from "react"; -import { useFocused, useSelected } from "slate-react"; - -interface MentionChipProps { - attributes: RenderElementPropsFor["attributes"]; - children: ReactNode; - content: ReactNode; - tooltipContent: ReactNode; -} - -export const MentionChip = ({ - attributes, - children, - content, - tooltipContent, -}: MentionChipProps) => { - const selected = useSelected(); - const focused = useFocused(); - const isMac = useIsMac(); - - return ( - - - - - {/* @see: https://github.com/ianstormtaylor/slate/issues/3490 */} - {isMac ? ( - - {children} - {content} - - ) : ( - - {content} - {children} - - )} - - - - - {tooltipContent} - - - ); -}; - -export const FileMentionComponent = ({ - attributes, - children, - element: { data }, -}: RenderElementPropsFor) => { - if (data.type !== "file") { - return {children}; - } - - return ( - - - {data.name} - - } - tooltipContent={ - - {data.repo.split("/").pop()}/{data.path} - - } - > - {children} - - ); -}; diff --git a/packages/web/src/features/chat/components/notConfiguredErrorBanner.tsx b/packages/web/src/features/chat/components/notConfiguredErrorBanner.tsx deleted file mode 100644 index 3b142bf10..000000000 --- a/packages/web/src/features/chat/components/notConfiguredErrorBanner.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { TriangleAlertIcon } from "lucide-react" -import Link from "next/link" -import { cn } from "@/lib/utils"; - -const DOCS_URL = "https://docs.sourcebot.dev/docs/configuration/language-model-providers"; - -interface NotConfiguredErrorBannerProps { - className?: string; -} - -export const NotConfiguredErrorBanner = ({ className }: NotConfiguredErrorBannerProps) => { - return ( -
- - Ask unavailable: no language model configured. See the configuration docs for more information. -
- ) -} \ No newline at end of file diff --git a/packages/web/src/features/chat/components/searchScopeIcon.tsx b/packages/web/src/features/chat/components/searchScopeIcon.tsx deleted file mode 100644 index b134f8d47..000000000 --- a/packages/web/src/features/chat/components/searchScopeIcon.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { cn, getCodeHostIcon } from "@/lib/utils"; -import { CodeHostType } from "@sourcebot/db"; -import { LibraryBigIcon } from "lucide-react"; -import Image from "next/image"; -import { SearchScope } from "../types"; - -interface SearchScopeIconProps { - searchScope: SearchScope; - className?: string; -} - -export const SearchScopeIcon = ({ searchScope, className = "h-4 w-4" }: SearchScopeIconProps) => { - if (searchScope.type === 'reposet') { - return ; - } else { - // Render code host icon for repos - const codeHostIcon = getCodeHostIcon(searchScope.codeHostType as CodeHostType); - const size = className.includes('h-3') ? 12 : 16; - return ( - {`${searchScope.codeHostType} - ); - } -}; \ No newline at end of file diff --git a/packages/web/src/features/chat/constants.ts b/packages/web/src/features/chat/constants.ts deleted file mode 100644 index 99e3083f4..000000000 --- a/packages/web/src/features/chat/constants.ts +++ /dev/null @@ -1,75 +0,0 @@ -export const FILE_REFERENCE_PREFIX = '@file:'; -export const FILE_REFERENCE_REGEX = new RegExp( - // @file:{repoName::fileName:startLine-endLine} - `${FILE_REFERENCE_PREFIX}\\{([^:}]+(:\\d+)?[^:}]*)::([^:}]+)(?::(\\d+)(?:-(\\d+))?)?\\}`, - 'g' -); - -export const ANSWER_TAG = ''; - -export const SELECTED_SEARCH_SCOPES_LOCAL_STORAGE_KEY = 'selectedSearchScopes'; -export const SET_CHAT_STATE_SESSION_STORAGE_KEY = 'setChatState'; -export const PENDING_CHAT_SUBMISSION_SESSION_STORAGE_KEY = 'pendingChatSubmission'; -export const DISABLED_MCP_SERVER_IDS_LOCAL_STORAGE_KEY = 'disabledMcpServerIds'; -export const MCP_OAUTH_DRAFT_SESSION_STORAGE_KEY = 'mcpOAuthDraft'; -export const MCP_RECONNECT_SESSION_STORAGE_KEY = 'mcpReconnectPending'; - -// Single upper bound on the total attachment text submitted per turn (text is -// inlined and re-emitted every turn). ~256KB ≈ 65-85K tokens: enough for a few -// files or a large log while leaving room for retrieval, history, and output. -export const ATTACHMENT_MAX_TURN_TEXT_BYTES = 256 * 1024; // 256KB per turn - -// Fallback client-side image size cap for early rejection before upload. The -// authoritative cap is SOURCEBOT_CHAT_ATTACHMENT_MAX_IMAGE_BYTES, fetched via -// `useAttachmentLimits`; this default is only used while that loads or if it -// fails (and matches the server default). -export const ATTACHMENT_MAX_IMAGE_BYTES = 10 * 1024 * 1024; // 10MB per image - -// Upper bound on an image attachment's pixel dimensions (width and height), -// enforced server-side at upload time. Guards against decompression bombs: a -// small-on-disk file that decodes to an enormous raster would otherwise be -// loaded into memory and shipped to the vision model. -export const ATTACHMENT_MAX_IMAGE_DIMENSION = 12000; // px per side - -// Max image (blob) attachments per message. Enforced server-side in -// `commitMessageAttachments` (mirrored client-side for early feedback) to bound -// per-request memory/cost: each image is loaded and sent to the model. -export const ATTACHMENT_MAX_IMAGE_COUNT = 10; - -// A plain-text paste at or above either of these thresholds is automatically -// converted into a text attachment instead of being inserted inline -export const ATTACHMENT_PASTE_AUTO_CONVERT_MIN_CHARS = 1500; -export const ATTACHMENT_PASTE_AUTO_CONVERT_MIN_LINES = 15; - -// Allowlist for inline-text attachments. Files are accepted if their MIME type -// starts with `text/`, exactly matches an entry here, or their extension is in -// ATTACHMENT_ALLOWED_TEXT_EXTENSIONS. Many code files report an empty MIME type -// in the browser, hence the extension fallback. -export const ATTACHMENT_ALLOWED_TEXT_MIME_TYPES = [ - 'application/json', - 'application/xml', - 'application/x-yaml', - 'application/yaml', - 'application/csv', - 'application/toml', -]; - -// Allowlist for binary image attachments. Validated server-side by decoding -// the image (never by client MIME/extension). `image/svg+xml` is intentionally -// excluded (XML/script surface). Used client-side only to build the file -// picker's `accept` filter and to gate the image-attach affordance. -export const ATTACHMENT_ALLOWED_IMAGE_MIME_TYPES = [ - 'image/png', - 'image/jpeg', - 'image/webp', - 'image/gif', -] as const; - -export const ATTACHMENT_ALLOWED_TEXT_EXTENSIONS = [ - 'txt', 'md', 'markdown', 'log', 'csv', 'tsv', 'json', 'jsonl', 'yaml', 'yml', - 'toml', 'ini', 'cfg', 'conf', 'env', 'xml', 'html', 'css', 'scss', - 'js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs', 'py', 'rb', 'go', 'rs', 'java', - 'kt', 'kts', 'c', 'h', 'cpp', 'cc', 'hpp', 'cs', 'php', 'swift', 'scala', - 'sh', 'bash', 'zsh', 'sql', 'graphql', 'gql', 'proto', 'dockerfile', - 'gitignore', 'tf', 'tfvars', 'lua', 'r', 'pl', 'dart', 'vue', 'svelte', -]; diff --git a/packages/web/src/features/chat/customSlateEditor.tsx b/packages/web/src/features/chat/customSlateEditor.tsx deleted file mode 100644 index 4f52f11a6..000000000 --- a/packages/web/src/features/chat/customSlateEditor.tsx +++ /dev/null @@ -1,27 +0,0 @@ -'use client'; - -import { Slate } from "slate-react"; -import { useCustomSlateEditor } from "./useCustomSlateEditor"; -import { CustomElement } from "./types"; - -interface CustomSlateEditorProps { - children: React.ReactNode; -} - -const initialValue: CustomElement[] = [ - { - type: 'paragraph', - children: [{ text: '' }], - }, -]; - -export const CustomSlateEditor = ({ children }: CustomSlateEditorProps) => { - const editor = useCustomSlateEditor(); - - return - {children} - ; -} \ No newline at end of file diff --git a/packages/web/src/features/chat/languageModelContext.tsx b/packages/web/src/features/chat/languageModelContext.tsx deleted file mode 100644 index b0be7c4d5..000000000 --- a/packages/web/src/features/chat/languageModelContext.tsx +++ /dev/null @@ -1,43 +0,0 @@ -'use client'; - -import { createContext, useMemo, type ReactNode } from "react"; -import { useLocalStorage } from "usehooks-ts"; -import { LanguageModelInfo } from "./types"; - -export interface SelectedLanguageModelContextValue { - storedLanguageModel: LanguageModelInfo | undefined; - setSelectedLanguageModel: (model: LanguageModelInfo | undefined) => void; -} - -export const SelectedLanguageModelContext = createContext(null); - -interface LanguageModelProviderProps { - children: ReactNode; -} - -// Single owner of the persisted model preference, mounted in the (app) layout. -// It must not hold the configured model list: layouts do not re-render on -// client-side navigation, so that list would go stale after a config change. -// `useSelectedLanguageModel` resolves the preference against the page's list. -export const LanguageModelProvider = ({ - children, -}: LanguageModelProviderProps) => { - const [storedLanguageModel, setSelectedLanguageModel] = useLocalStorage( - "selectedLanguageModel", - undefined, - { - initializeWithValue: false, - } - ); - - const value = useMemo(() => ({ - storedLanguageModel, - setSelectedLanguageModel, - }), [storedLanguageModel, setSelectedLanguageModel]); - - return ( - - {children} - - ); -}; diff --git a/packages/web/src/features/chat/llm.server.test.ts b/packages/web/src/features/chat/llm.server.test.ts deleted file mode 100644 index 79abcfbc1..000000000 --- a/packages/web/src/features/chat/llm.server.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - env: { - SOURCEBOT_LLM_USER_EMAIL_HEADER_ENABLED: 'false', - }, - getTokenFromConfig: vi.fn(), - getAuthContext: vi.fn(), - isServiceError: vi.fn(), -})); - -vi.mock('@sourcebot/shared', () => mocks); -vi.mock('server-only', () => ({})); -vi.mock('@/lib/posthog', () => ({ - createPostHogClient: vi.fn(), - tryGetPostHogDistinctId: vi.fn(), -})); -vi.mock('./logger', () => ({ - logger: { - error: vi.fn(), - warn: vi.fn(), - }, -})); -vi.mock('@/middleware/withAuth', () => ({ - getAuthContext: mocks.getAuthContext, -})); -vi.mock('@/lib/utils', () => ({ - isServiceError: mocks.isServiceError, -})); - -import { - resolveLanguageModelHeaders, - SOURCEBOT_USER_EMAIL_HEADER, -} from './llm.server'; - -const resolveHeadersForUser = ( - email: string, - configuredHeaders?: Parameters[0], -) => { - mocks.getAuthContext.mockResolvedValue({ user: { email } }); - return resolveLanguageModelHeaders(configuredHeaders); -}; - -describe('resolveLanguageModelHeaders', () => { - beforeEach(() => { - mocks.env.SOURCEBOT_LLM_USER_EMAIL_HEADER_ENABLED = 'false'; - mocks.getTokenFromConfig.mockReset(); - mocks.getAuthContext.mockReset(); - mocks.getAuthContext.mockResolvedValue({ user: undefined }); - mocks.isServiceError.mockReset(); - mocks.isServiceError.mockReturnValue(false); - }); - - test('does not add the user email header by default', async () => { - await expect(resolveHeadersForUser('User@Example.com')).resolves.toBeUndefined(); - expect(mocks.getAuthContext).not.toHaveBeenCalled(); - }); - - test('adds the current user email in lower case when enabled', async () => { - mocks.env.SOURCEBOT_LLM_USER_EMAIL_HEADER_ENABLED = 'true'; - - await expect(resolveHeadersForUser('User@Example.COM')).resolves.toEqual({ - [SOURCEBOT_USER_EMAIL_HEADER]: 'user@example.com', - }); - }); - - test('omits the user email header for anonymous requests', async () => { - mocks.env.SOURCEBOT_LLM_USER_EMAIL_HEADER_ENABLED = 'true'; - - await expect(resolveLanguageModelHeaders(undefined)).resolves.toBeUndefined(); - }); - - test('omits the user email header when auth context resolution fails', async () => { - const authError = { statusCode: 401 }; - mocks.env.SOURCEBOT_LLM_USER_EMAIL_HEADER_ENABLED = 'true'; - mocks.getAuthContext.mockResolvedValue(authError); - mocks.isServiceError.mockReturnValue(true); - - await expect(resolveLanguageModelHeaders(undefined)).resolves.toBeUndefined(); - expect(mocks.isServiceError).toHaveBeenCalledWith(authError); - }); - - test('preserves configured headers when adding the user email header', async () => { - mocks.env.SOURCEBOT_LLM_USER_EMAIL_HEADER_ENABLED = 'true'; - - await expect(resolveHeadersForUser('Authenticated@Example.com', { - 'X-Custom-Header': 'custom-value', - })).resolves.toEqual({ - 'X-Custom-Header': 'custom-value', - [SOURCEBOT_USER_EMAIL_HEADER]: 'authenticated@example.com', - }); - }); - - test('resolves token-backed configured headers', async () => { - const token = { env: 'CUSTOM_HEADER' }; - mocks.getTokenFromConfig.mockResolvedValue('resolved-value'); - - await expect(resolveLanguageModelHeaders({ Authorization: token })).resolves.toEqual({ - Authorization: 'resolved-value', - }); - expect(mocks.getTokenFromConfig).toHaveBeenCalledWith(token); - }); -}); diff --git a/packages/web/src/features/chat/llm.server.ts b/packages/web/src/features/chat/llm.server.ts deleted file mode 100644 index af13fecf9..000000000 --- a/packages/web/src/features/chat/llm.server.ts +++ /dev/null @@ -1,461 +0,0 @@ -import 'server-only'; - -import { createPostHogClient, tryGetPostHogDistinctId } from "@/lib/posthog"; -import { logger } from "./logger"; -import Anthropic from "@anthropic-ai/sdk"; -import { createAmazonBedrock } from '@ai-sdk/amazon-bedrock'; -import { AnthropicProviderOptions, createAnthropic } from '@ai-sdk/anthropic'; -import { createAzure } from '@ai-sdk/azure'; -import { createDeepSeek } from '@ai-sdk/deepseek'; -import { createGoogleGenerativeAI, GoogleLanguageModelOptions } from '@ai-sdk/google'; -import { createVertex } from '@ai-sdk/google-vertex'; -import { createVertexAnthropic } from '@ai-sdk/google-vertex/anthropic'; -import { createMistral } from '@ai-sdk/mistral'; -import { createOpenAI, OpenAIResponsesProviderOptions } from "@ai-sdk/openai"; -import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; -import { LanguageModelV3 as AISDKLanguageModelV3 } from "@ai-sdk/provider"; -import { createXai } from '@ai-sdk/xai'; -import { fromNodeProviderChain } from '@aws-sdk/credential-providers'; -import { createOpenRouter } from '@openrouter/ai-sdk-provider'; -import { withTracing } from "@posthog/ai"; -import { LanguageModel } from '@sourcebot/schemas/v3/languageModel.type'; -import { Token } from "@sourcebot/schemas/v3/shared.type"; -import { env, getTokenFromConfig } from '@sourcebot/shared'; -import { extractReasoningMiddleware, JSONValue, wrapLanguageModel } from "ai"; -import * as Sentry from "@sentry/nextjs"; -import { getAuthContext } from '@/middleware/withAuth'; -import { isServiceError } from '@/lib/utils'; - -// @note: This module resolves a configured language model into an AI SDK -// provider object. It is intentionally FSL (open source) provider plumbing — -// it contains no Ask-specific logic and is shared by multiple features (the -// Ask chat agent, the MCP `ask_codebase` tool, AI search-assist, and the -// review agent). The re-licensed Ask logic (prompts, tools, threads, chat -// name generation) lives in `@/ee/features/chat`. - -export const getAISDKLanguageModelAndOptions = async (config: LanguageModel): Promise<{ - model: AISDKLanguageModelV3, - providerOptions?: Record>, - temperature?: number, -}> => { - const { provider, model: modelId } = config; - const headers = await resolveLanguageModelHeaders(config.headers); - - const { model: _model, providerOptions } = await (async (): Promise<{ - model: AISDKLanguageModelV3, - providerOptions?: Record>, - }> => { - switch (provider) { - case 'amazon-bedrock': { - const aws = createAmazonBedrock({ - baseURL: config.baseUrl, - region: config.region ?? env.AWS_REGION, - accessKeyId: config.accessKeyId - ? await getTokenFromConfig(config.accessKeyId) - : env.AWS_ACCESS_KEY_ID, - secretAccessKey: config.accessKeySecret - ? await getTokenFromConfig(config.accessKeySecret) - : env.AWS_SECRET_ACCESS_KEY, - sessionToken: config.sessionToken - ? await getTokenFromConfig(config.sessionToken) - : env.AWS_SESSION_TOKEN, - headers, - // Fallback to the default Node.js credential provider chain if no credentials are provided. - // See: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-credential-providers/#fromnodeproviderchain - credentialProvider: !config.accessKeyId && !config.accessKeySecret && !config.sessionToken - ? fromNodeProviderChain() - : undefined, - }); - - return { - model: aws(modelId), - }; - } - case 'anthropic': { - const apiKey = config.token - ? await getTokenFromConfig(config.token) - : env.ANTHROPIC_API_KEY; - const authToken = config.authToken - ? await getTokenFromConfig(config.authToken) - : env.ANTHROPIC_AUTH_TOKEN; - const anthropic = createAnthropic({ - baseURL: config.baseUrl, - apiKey, - authToken, - headers, - }); - - const thinking = await tryResolveAnthropicThinkingConfig({ - modelId, - baseUrl: config.baseUrl, - apiKey, - authToken, - headers, - }); - - return { - model: anthropic(modelId), - providerOptions: { - anthropic: { - ...(thinking ? { thinking } : {}), - } satisfies AnthropicProviderOptions, - }, - }; - } - case 'azure': { - const azure = createAzure({ - baseURL: config.baseUrl, - apiKey: config.token ? (await getTokenFromConfig(config.token)) : env.AZURE_API_KEY, - apiVersion: config.apiVersion, - resourceName: config.resourceName ?? env.AZURE_RESOURCE_NAME, - headers, - }); - - const reasoningSummary = config.reasoningSummary ?? 'auto'; - return { - model: azure(modelId), - providerOptions: { - openai: { - reasoningEffort: config.reasoningEffort ?? 'medium', - ...(reasoningSummary !== 'none' && { reasoningSummary }), - } satisfies OpenAIResponsesProviderOptions, - } - }; - } - case 'deepseek': { - const deepseek = createDeepSeek({ - baseURL: config.baseUrl, - apiKey: config.token ? (await getTokenFromConfig(config.token)) : env.DEEPSEEK_API_KEY, - headers, - }); - - return { - model: deepseek(modelId), - }; - } - case 'google-generative-ai': { - const google = createGoogleGenerativeAI({ - baseURL: config.baseUrl, - apiKey: config.token - ? await getTokenFromConfig(config.token) - : env.GOOGLE_GENERATIVE_AI_API_KEY, - headers, - }); - - return { - model: google(modelId), - providerOptions: { - google: { - thinkingConfig: { - includeThoughts: true, - thinkingBudget: config.thinkingBudget, - thinkingLevel: config.thinkingLevel - } - } satisfies GoogleLanguageModelOptions - } - }; - } - case 'google-vertex': { - const vertex = createVertex({ - project: config.project ?? env.GOOGLE_VERTEX_PROJECT, - location: config.region ?? env.GOOGLE_VERTEX_REGION, - ...(config.credentials ? { - googleAuthOptions: { - keyFilename: await getTokenFromConfig(config.credentials), - } - } : {}), - headers, - }); - - return { - model: vertex(modelId), - providerOptions: { - vertex: { - thinkingConfig: { - includeThoughts: true, - thinkingBudget: - config.thinkingBudget ?? - env.GOOGLE_VERTEX_THINKING_BUDGET_TOKENS, - thinkingLevel: config.thinkingLevel, - } - } satisfies GoogleLanguageModelOptions - }, - }; - } - case 'google-vertex-anthropic': { - const vertexAnthropic = createVertexAnthropic({ - project: config.project ?? env.GOOGLE_VERTEX_PROJECT, - location: config.region ?? env.GOOGLE_VERTEX_REGION, - ...(config.credentials ? { - googleAuthOptions: { - keyFilename: await getTokenFromConfig(config.credentials), - } - } : {}), - headers, - }); - - return { - model: vertexAnthropic(modelId), - }; - } - case 'mistral': { - const mistral = createMistral({ - baseURL: config.baseUrl, - apiKey: config.token - ? await getTokenFromConfig(config.token) - : env.MISTRAL_API_KEY, - headers, - }); - - return { - model: mistral(modelId), - }; - } - case 'openai': { - const openai = createOpenAI({ - baseURL: config.baseUrl, - apiKey: config.token - ? await getTokenFromConfig(config.token) - : env.OPENAI_API_KEY, - headers, - }); - - const reasoningSummary = config.reasoningSummary ?? 'auto'; - return { - model: openai(modelId), - providerOptions: { - openai: { - reasoningEffort: config.reasoningEffort ?? 'medium', - ...(reasoningSummary !== 'none' && { reasoningSummary }), - } satisfies OpenAIResponsesProviderOptions, - }, - }; - } - case 'openai-compatible': { - const openai = createOpenAICompatible({ - baseURL: config.baseUrl, - name: config.displayName ?? modelId, - apiKey: config.token - ? await getTokenFromConfig(config.token) - : undefined, - headers, - queryParams: config.queryParams - ? await extractLanguageModelKeyValuePairs(config.queryParams) - : undefined, - }); - - const model = wrapLanguageModel({ - model: openai.chatModel(modelId), - middleware: [ - extractReasoningMiddleware({ - tagName: config.reasoningTag ?? 'think', - }), - ] - }); - - return { - model, - } - } - case 'openrouter': { - const openrouter = createOpenRouter({ - baseURL: config.baseUrl, - apiKey: config.token - ? await getTokenFromConfig(config.token) - : env.OPENROUTER_API_KEY, - headers, - }); - - return { - model: openrouter(modelId), - }; - } - case 'xai': { - const xai = createXai({ - baseURL: config.baseUrl, - apiKey: config.token - ? await getTokenFromConfig(config.token) - : env.XAI_API_KEY, - headers, - }); - - return { - model: xai(modelId), - }; - } - } - })(); - - const posthog = await createPostHogClient(); - const { distinctId } = await tryGetPostHogDistinctId(); - - // Only enable posthog LLM analytics for the ask GH experiment. - const model = env.EXPERIMENT_ASK_GH_ENABLED === 'true' ? - withTracing(_model, posthog, { - // @note: Key anonymous events to the install id so they - // collapse to a single identity instead of a brand-new one - // on every call. - posthogDistinctId: distinctId ?? env.SOURCEBOT_INSTALL_ID, - }) : - _model; - - return { - model, - providerOptions, - temperature: config.temperature, - }; -} - -const extractLanguageModelKeyValuePairs = async ( - pairs: { - [k: string]: string | Token; - } | undefined -): Promise> => { - const resolvedPairs: Record = {}; - - if (!pairs) { - return resolvedPairs; - } - - for (const [key, val] of Object.entries(pairs)) { - if (typeof val === "string") { - resolvedPairs[key] = val; - continue; - } - - const value = await getTokenFromConfig(val); - resolvedPairs[key] = value; - } - - return resolvedPairs; -}; - -export const SOURCEBOT_USER_EMAIL_HEADER = 'X-Sourcebot-User-Email'; - -export const resolveLanguageModelHeaders = async ( - configuredHeaders: Record | undefined, -): Promise | undefined> => { - const headers = await extractLanguageModelKeyValuePairs(configuredHeaders); - - const userEmail = await (async () => { - if (env.SOURCEBOT_LLM_USER_EMAIL_HEADER_ENABLED !== 'true') { - return undefined; - } - - const authContext = await getAuthContext(); - return isServiceError(authContext) ? undefined : authContext.user?.email; - })(); - if (userEmail) { - headers[SOURCEBOT_USER_EMAIL_HEADER] = userEmail.toLowerCase(); - } - - return Object.keys(headers).length > 0 ? headers : undefined; -}; - -type AnthropicThinkingConfig = NonNullable; -const anthropicThinkingConfigCache = new Map(); - -/** - * Resolves the `thinking` provider option we pass to the - * ai sdk for anthropic models. Queries the Models API to - * determine the model's capabilities. Returns undefined - * if we are unable to resolve. Results are cached in a - * in-memory cache. - * - * @see https://docs.anthropic.com/en/api/models - */ -const tryResolveAnthropicThinkingConfig = async ({ - modelId, - baseUrl, - apiKey, - authToken, - headers, -}: { - modelId: string, - baseUrl?: string, - apiKey?: string, - authToken?: string, - headers?: Record, -}): Promise => { - const cacheKey = `${baseUrl ?? 'default'}::${modelId}`; - if (anthropicThinkingConfigCache.has(cacheKey)) { - return anthropicThinkingConfigCache.get(cacheKey); - } - - const { - thinkingConfig, - shouldCache - } = await (async (): Promise<{ thinkingConfig: AnthropicThinkingConfig | undefined, shouldCache: boolean }> => { - try { - // `@ai-sdk/anthropic` expects `baseURL` to include the `/v1` path segment, - // whereas the SDK client appends `/v1` itself — so strip a trailing `/v1` - // from the same configured value before handing it to the client. - const baseURL = baseUrl - ? (baseUrl.replace(/\/+$/, '').replace(/\/v1$/, '') || undefined) - : undefined; - - const client = new Anthropic({ - apiKey, - authToken, - baseURL, - defaultHeaders: headers, - maxRetries: 1, - }); - - const { capabilities } = await client.models.retrieve(modelId, undefined, { - timeout: 10_000, - }); - - if (!capabilities) { - throw new Error('the models API did not return a capabilities object.'); - } - - const thinking = capabilities.thinking; - if (thinking.supported === false) { - return { - thinkingConfig: undefined, - shouldCache: true - }; - } - - if (thinking.types.adaptive.supported) { - return { - thinkingConfig: { - type: "adaptive", - display: "summarized", - } satisfies AnthropicThinkingConfig, - shouldCache: true, - }; - } - - if (thinking.types.enabled.supported) { - return { - thinkingConfig: { - type: "enabled", - budgetTokens: env.ANTHROPIC_THINKING_BUDGET_TOKENS, - } satisfies AnthropicThinkingConfig, - shouldCache: true, - }; - } - - return { - thinkingConfig: undefined, - shouldCache: true - }; - } catch (error) { - Sentry.captureException(error); - logger.warn(`Failed to fetch Anthropic model capabilities for '${modelId}'. Omitting the thinking option. ${error}`); - return { - thinkingConfig: undefined, - shouldCache: false - }; - } - })(); - - - if (shouldCache) { - anthropicThinkingConfigCache.set(cacheKey, thinkingConfig); - } - - return thinkingConfig; -}; diff --git a/packages/web/src/features/chat/logger.ts b/packages/web/src/features/chat/logger.ts deleted file mode 100644 index bbd1b7001..000000000 --- a/packages/web/src/features/chat/logger.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createLogger } from "@sourcebot/shared"; - -export const logger = createLogger('ask-agent'); \ No newline at end of file diff --git a/packages/web/src/features/chat/mcp/utils.test.ts b/packages/web/src/features/chat/mcp/utils.test.ts deleted file mode 100644 index 5953a878f..000000000 --- a/packages/web/src/features/chat/mcp/utils.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { expect, test, describe } from 'vitest'; -import { getMcpFaviconUrl, sanitizeMcpServerName } from './utils'; - -describe('sanitizeMcpServerName', () => { - test('lowercases ASCII letters', () => { - expect(sanitizeMcpServerName('MyServer')).toBe('myserver'); - }); - - test('replaces special characters with underscores', () => { - expect(sanitizeMcpServerName('My Server!')).toBe('my_server_'); - }); - - test('preserves digits', () => { - expect(sanitizeMcpServerName('server123')).toBe('server123'); - }); - - test('replaces spaces and hyphens', () => { - expect(sanitizeMcpServerName('my-cool server')).toBe('my_cool_server'); - }); - - test('handles empty string', () => { - expect(sanitizeMcpServerName('')).toBe(''); - }); - - test('replaces unicode characters with underscores', () => { - expect(sanitizeMcpServerName('Ñoño')).toBe('_o_o'); - }); - - test('replaces all special characters', () => { - expect(sanitizeMcpServerName('@#$%')).toBe('____'); - }); - - test('returns already sanitized name unchanged', () => { - expect(sanitizeMcpServerName('linear')).toBe('linear'); - }); -}); - -describe('getMcpFaviconUrl', () => { - test('returns a Google favicon URL for a valid server URL', () => { - expect(getMcpFaviconUrl('https://mcp.linear.app/mcp')).toBe('https://www.google.com/s2/favicons?domain=https://mcp.linear.app&sz=32'); - }); - - test('returns a local Atlassian icon for the Atlassian prefab server', () => { - expect(getMcpFaviconUrl('https://mcp.atlassian.com/v1/mcp/authv2', 'Atlassian')).toMatch(/^data:image\/svg\+xml,/); - }); - - test('returns known vendor favicon URLs for prefab servers with non-canonical MCP domains', () => { - expect(getMcpFaviconUrl('https://mcp.betterstack.com', 'Better Stack')).toBe('https://betterstack.com/favicon.ico'); - expect(getMcpFaviconUrl('https://mcp.notion.com/mcp', 'Notion')).toBe('https://www.notion.com/front-static/favicon.ico'); - }); - - test('returns a local GitHub icon for the GitHub prefab server', () => { - expect(getMcpFaviconUrl('https://api.githubcopilot.com/mcp/', 'GitHub')).toMatch(/^data:image\/svg\+xml,/); - }); - - test('returns undefined for a malformed server URL', () => { - expect(getMcpFaviconUrl('not a url')).toBeUndefined(); - }); -}); diff --git a/packages/web/src/features/chat/mcp/utils.ts b/packages/web/src/features/chat/mcp/utils.ts deleted file mode 100644 index 4b8935146..000000000 --- a/packages/web/src/features/chat/mcp/utils.ts +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Sanitizes an MCP server name into a lowercase alphanumeric string suitable - * for use as a tool-name prefix (e.g. "My Server!" → "my_server_"). - * - * This is used to namespace MCP tools (mcp_{sanitizedName}__{toolName}) and - * to key favicon maps. Must be kept consistent everywhere — collisions on - * this value are prevented at server-creation time. - */ -// @techdebt : duplicated in ee and non-ee -export function sanitizeMcpServerName(name: string): string { - return name.toLowerCase().replace(/[^a-z0-9]/g, '_'); -} - -// @techdebt : duplicated in ee and non-ee -export function pluralize(count: number, singular: string, plural = `${singular}s`) { - return count === 1 ? singular : plural; -} - -const standardNumberFormatter = new Intl.NumberFormat(); -const compactNumberFormatter = new Intl.NumberFormat(undefined, { - notation: "compact", - maximumFractionDigits: 1, -}); - -// @techdebt : duplicated in ee and non-ee -export function formatCount(count: number) { - if (count >= 10_000) { - return compactNumberFormatter.format(count); - } - return standardNumberFormatter.format(count); -} - -// @techdebt : duplicated in ee and non-ee -export function formatUsageSharePercent(percent: number) { - if (percent <= 0) { - return "0%"; - } - if (percent < 1) { - return "<1%"; - } - if (percent < 10) { - return `${percent.toFixed(1).replace(/\.0$/, "")}%`; - } - return `${Math.round(percent)}%`; -} - -function createMcpIconDataUri(svg: string): string { - return `data:image/svg+xml,${encodeURIComponent(svg)}`; -} - -const atlassianIconSvg = ` - - - - - - - - - - - - - -`; - -const githubIconSvg = ` - - -`; - -const knownMcpFaviconUrlsBySanitizedName: Record = { - atlassian: createMcpIconDataUri(atlassianIconSvg), - better_stack: "https://betterstack.com/favicon.ico", - github: createMcpIconDataUri(githubIconSvg), - notion: "https://www.notion.com/front-static/favicon.ico", -}; - -// @techdebt : duplicated in ee and non-ee -export function getMcpFaviconUrl(serverUrl: string, serverName?: string): string | undefined { - if (serverName) { - const knownFaviconUrl = knownMcpFaviconUrlsBySanitizedName[sanitizeMcpServerName(serverName)]; - if (knownFaviconUrl) { - return knownFaviconUrl; - } - } - - try { - const origin = new URL(serverUrl).origin; - return `https://www.google.com/s2/favicons?domain=${origin}&sz=32`; - } catch { - return undefined; - } -} diff --git a/packages/web/src/features/chat/mcpOAuthDraft.test.ts b/packages/web/src/features/chat/mcpOAuthDraft.test.ts deleted file mode 100644 index df5e5b4ef..000000000 --- a/packages/web/src/features/chat/mcpOAuthDraft.test.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { beforeEach, describe, expect, test } from 'vitest'; -import { MCP_OAUTH_DRAFT_SESSION_STORAGE_KEY } from '@/features/chat/constants'; -import { - consumeMcpOAuthDraftForPath, - normalizeMcpOAuthDraftPath, - resolveMcpOAuthDraftForPath, - saveMcpOAuthDraft, -} from './mcpOAuthDraft'; -import type { Descendant } from 'slate'; -import type { SearchScope } from '@/features/chat/types'; - -const children = [{ - type: 'paragraph', - children: [{ text: 'check the Linear ticket' }], -}] satisfies Descendant[]; - -const commandChildren = [{ - type: 'paragraph', - children: [ - { - type: 'mention', - data: { - type: 'command', - commandId: 'skill-1', - sourceId: 'personal-skill', - slug: 'review-pr', - name: 'Review PR', - }, - children: [{ text: '' }], - }, - { text: ' focus on auth changes' }, - ], -}] satisfies Descendant[]; - -const selectedSearchScopes = [{ - type: 'repo', - value: 'sourcebot/sourcebot', - name: 'sourcebot/sourcebot', - codeHostType: 'github', -}] satisfies SearchScope[]; - -const draft = { - returnTo: '/chat/thread-1?scope=sourcebot', - children, - selectedSearchScopes, - disabledMcpServerIds: ['server-disabled'], - createdAt: 100, -}; - -describe('MCP OAuth draft persistence', () => { - beforeEach(() => { - sessionStorage.clear(); - }); - - test('normalizes chat paths and strips OAuth status params', () => { - expect(normalizeMcpOAuthDraftPath('/chat/thread-1?scope=sourcebot&status=connected&server=Linear')).toBe('/chat/thread-1?scope=sourcebot'); - expect(normalizeMcpOAuthDraftPath('/settings/accountAskAgent')).toBeUndefined(); - expect(normalizeMcpOAuthDraftPath('https://evil.example.com/chat')).toBeUndefined(); - expect(normalizeMcpOAuthDraftPath('//evil.example.com/chat')).toBeUndefined(); - }); - - test('resolves a draft for the same chat path after the OAuth callback adds status params', () => { - const result = resolveMcpOAuthDraftForPath( - JSON.stringify(draft), - '/chat/thread-1?scope=sourcebot&status=connected&server=Linear', - 200, - ); - - expect(result.shouldClear).toBe(true); - expect(result.draft).toEqual(draft); - }); - - test('keeps a draft when the current chat path does not match', () => { - const result = resolveMcpOAuthDraftForPath(JSON.stringify(draft), '/chat/thread-2', 200); - - expect(result.shouldClear).toBe(false); - expect(result.draft).toBeUndefined(); - }); - - test('clears invalid and stale drafts', () => { - expect(resolveMcpOAuthDraftForPath('{', '/chat/thread-1').shouldClear).toBe(true); - expect(resolveMcpOAuthDraftForPath(JSON.stringify({ ...draft, children: [1] }), '/chat/thread-1?scope=sourcebot', 200).shouldClear).toBe(true); - expect(resolveMcpOAuthDraftForPath(JSON.stringify(draft), '/chat/thread-1?scope=sourcebot', 30 * 60 * 1000 + 101).shouldClear).toBe(true); - }); - - test('accepts drafts with command mentions', () => { - const commandDraft = { - ...draft, - children: commandChildren, - }; - - const result = resolveMcpOAuthDraftForPath( - JSON.stringify(commandDraft), - '/chat/thread-1?scope=sourcebot&status=connected&server=Linear', - 200, - ); - - expect(result.shouldClear).toBe(true); - expect(result.draft?.children).toEqual(commandChildren); - }); - - test('saves and consumes the composer draft from sessionStorage', () => { - saveMcpOAuthDraft({ - returnTo: '/chat/thread-1?scope=sourcebot&status=error', - children, - selectedSearchScopes, - disabledMcpServerIds: ['server-disabled'], - }); - - const restoredDraft = consumeMcpOAuthDraftForPath('/chat/thread-1?scope=sourcebot&status=connected&server=Linear'); - - expect(restoredDraft?.returnTo).toBe('/chat/thread-1?scope=sourcebot'); - expect(restoredDraft?.children).toEqual(children); - expect(restoredDraft?.selectedSearchScopes).toEqual(selectedSearchScopes); - expect(restoredDraft?.disabledMcpServerIds).toEqual(['server-disabled']); - expect(sessionStorage.getItem(MCP_OAUTH_DRAFT_SESSION_STORAGE_KEY)).toBeNull(); - }); -}); diff --git a/packages/web/src/features/chat/mcpOAuthDraft.ts b/packages/web/src/features/chat/mcpOAuthDraft.ts deleted file mode 100644 index 08884b667..000000000 --- a/packages/web/src/features/chat/mcpOAuthDraft.ts +++ /dev/null @@ -1,212 +0,0 @@ -import type { Descendant } from "slate"; -import { MCP_OAUTH_DRAFT_SESSION_STORAGE_KEY } from "@/features/chat/constants"; -import { isFileMentionData, type CustomText, type MentionElement, type ParagraphElement, type SearchScope } from "@/features/chat/types"; -import { isCommandMentionData } from "@/features/chat/commands/types"; - -const MCP_OAUTH_DRAFT_BASE_URL = 'https://sourcebot.invalid'; -const MCP_OAUTH_DRAFT_MAX_AGE_MS = 30 * 60 * 1000; -const MCP_OAUTH_STATUS_PARAMS = ['status', 'server', 'message']; - -export interface McpOAuthDraft { - returnTo: string; - children: Descendant[]; - selectedSearchScopes: SearchScope[]; - disabledMcpServerIds: string[]; - createdAt: number; -} - -type McpOAuthDraftInput = Omit; - -interface ResolveMcpOAuthDraftResult { - draft?: McpOAuthDraft; - shouldClear: boolean; -} - -function isAllowedMcpOAuthDraftPath(pathname: string): boolean { - return pathname === '/chat' || pathname.startsWith('/chat/'); -} - -function isRecord(value: unknown): value is Record { - return typeof value === 'object' && value !== null; -} - -function isCustomText(value: unknown): value is CustomText { - return isRecord(value) && typeof value.text === 'string'; -} - -function isMentionElement(value: unknown): value is MentionElement { - return ( - isRecord(value) && - value.type === 'mention' && - (isFileMentionData(value.data) || isCommandMentionData(value.data)) && - Array.isArray(value.children) && - value.children.every(isCustomText) - ); -} - -function isParagraphElement(value: unknown): value is ParagraphElement { - return ( - isRecord(value) && - value.type === 'paragraph' && - (value.align === undefined || typeof value.align === 'string') && - Array.isArray(value.children) && - value.children.length > 0 && - value.children.every((child) => isCustomText(child) || isMentionElement(child)) - ); -} - -function isMcpOAuthDraftChildren(value: unknown): value is Descendant[] { - return Array.isArray(value) && value.length > 0 && value.every(isParagraphElement); -} - -export function normalizeMcpOAuthDraftPath(path: string): string | undefined { - const trimmedPath = path.trim(); - if (!trimmedPath || !trimmedPath.startsWith('/') || trimmedPath.startsWith('//') || trimmedPath.includes('\\')) { - return undefined; - } - - try { - const url = new URL(trimmedPath, MCP_OAUTH_DRAFT_BASE_URL); - if (url.origin !== MCP_OAUTH_DRAFT_BASE_URL || !isAllowedMcpOAuthDraftPath(url.pathname)) { - return undefined; - } - - for (const param of MCP_OAUTH_STATUS_PARAMS) { - url.searchParams.delete(param); - } - - const query = url.searchParams.toString(); - return `${url.pathname}${query ? `?${query}` : ''}`; - } catch { - return undefined; - } -} - -export function createMcpOAuthDraftPath(pathname: string, search: string): string | undefined { - return normalizeMcpOAuthDraftPath(`${pathname}${search}`); -} - -function isMcpOAuthDraft(value: unknown): value is McpOAuthDraft { - return ( - isRecord(value) && - 'returnTo' in value && - typeof value.returnTo === 'string' && - 'children' in value && - isMcpOAuthDraftChildren(value.children) && - 'selectedSearchScopes' in value && - Array.isArray(value.selectedSearchScopes) && - 'disabledMcpServerIds' in value && - Array.isArray(value.disabledMcpServerIds) && - value.disabledMcpServerIds.every((id) => typeof id === 'string') && - 'createdAt' in value && - typeof value.createdAt === 'number' - ); -} - -export function resolveMcpOAuthDraftForPath( - storedDraft: string | null, - currentPath: string, - now = Date.now(), -): ResolveMcpOAuthDraftResult { - if (!storedDraft) { - return { shouldClear: false }; - } - - let parsedDraft: unknown; - try { - parsedDraft = JSON.parse(storedDraft); - } catch { - return { shouldClear: true }; - } - - if (!isMcpOAuthDraft(parsedDraft)) { - return { shouldClear: true }; - } - - if (now - parsedDraft.createdAt > MCP_OAUTH_DRAFT_MAX_AGE_MS) { - return { shouldClear: true }; - } - - const storedPath = normalizeMcpOAuthDraftPath(parsedDraft.returnTo); - if (!storedPath) { - return { shouldClear: true }; - } - - const normalizedCurrentPath = normalizeMcpOAuthDraftPath(currentPath); - if (!normalizedCurrentPath) { - return { shouldClear: false }; - } - - if (storedPath !== normalizedCurrentPath) { - return { shouldClear: false }; - } - - return { - draft: { - ...parsedDraft, - returnTo: storedPath, - }, - shouldClear: true, - }; -} - -function getSessionStorage(): Storage | undefined { - if (typeof window === 'undefined') { - return undefined; - } - - try { - return window.sessionStorage; - } catch { - return undefined; - } -} - -export function saveMcpOAuthDraft(draft: McpOAuthDraftInput): void { - const storage = getSessionStorage(); - const returnTo = normalizeMcpOAuthDraftPath(draft.returnTo); - if (!storage || !returnTo) { - return; - } - - try { - storage.setItem(MCP_OAUTH_DRAFT_SESSION_STORAGE_KEY, JSON.stringify({ - ...draft, - returnTo, - createdAt: Date.now(), - } satisfies McpOAuthDraft)); - } catch { - // If sessionStorage is unavailable or full, OAuth should still proceed. - } -} - -export function clearMcpOAuthDraft(): void { - const storage = getSessionStorage(); - if (!storage) { - return; - } - - try { - storage.removeItem(MCP_OAUTH_DRAFT_SESSION_STORAGE_KEY); - } catch { - // Ignore storage cleanup failures. - } -} - -export function consumeMcpOAuthDraftForPath(currentPath: string): McpOAuthDraft | undefined { - const storage = getSessionStorage(); - if (!storage) { - return undefined; - } - - const result = resolveMcpOAuthDraftForPath( - storage.getItem(MCP_OAUTH_DRAFT_SESSION_STORAGE_KEY), - currentPath, - ); - - if (result.shouldClear) { - clearMcpOAuthDraft(); - } - - return result.draft; -} diff --git a/packages/web/src/features/chat/mcpReconnect.test.ts b/packages/web/src/features/chat/mcpReconnect.test.ts deleted file mode 100644 index cc3e9fc7e..000000000 --- a/packages/web/src/features/chat/mcpReconnect.test.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { beforeEach, describe, expect, test } from 'vitest'; -import { MCP_RECONNECT_SESSION_STORAGE_KEY } from './constants'; -import { - clearMcpPendingReconnect, - consumeMcpPendingReconnectForPath, - resolveMcpPendingReconnectForPath, - saveMcpPendingReconnect, -} from './mcpReconnect'; - -const NOW = 1_700_000_000_000; - -const createStoredPending = (overrides: Record = {}) => JSON.stringify({ - serverId: 'server-1', - serverName: 'Linear', - toolCallId: 'tool-call-1', - returnTo: '/chat/abc123', - createdAt: NOW, - ...overrides, -}); - -describe('resolveMcpPendingReconnectForPath', () => { - test('returns the pending reconnect when the current path matches', () => { - const result = resolveMcpPendingReconnectForPath(createStoredPending(), '/chat/abc123', NOW + 1000); - expect(result.shouldClear).toBe(true); - expect(result.pending).toMatchObject({ - serverId: 'server-1', - serverName: 'Linear', - toolCallId: 'tool-call-1', - source: 'tool-call', - returnTo: '/chat/abc123', - }); - }); - - test('ignores OAuth status query parameters on the current path', () => { - const result = resolveMcpPendingReconnectForPath( - createStoredPending(), - '/chat/abc123?status=connected&server=Linear', - NOW + 1000, - ); - expect(result.pending).toBeDefined(); - expect(result.shouldClear).toBe(true); - }); - - test('keeps the pending reconnect when the current path is a different thread', () => { - const result = resolveMcpPendingReconnectForPath(createStoredPending(), '/chat/other', NOW + 1000); - expect(result.pending).toBeUndefined(); - expect(result.shouldClear).toBe(false); - }); - - test('clears when the stored value is not valid JSON or has the wrong shape', () => { - expect(resolveMcpPendingReconnectForPath('not-json', '/chat/abc123', NOW).shouldClear).toBe(true); - expect(resolveMcpPendingReconnectForPath(JSON.stringify({ serverId: 'server-1' }), '/chat/abc123', NOW).shouldClear).toBe(true); - }); - - test('clears when the pending reconnect has expired', () => { - const result = resolveMcpPendingReconnectForPath( - createStoredPending(), - '/chat/abc123', - NOW + 31 * 60 * 1000, - ); - expect(result.pending).toBeUndefined(); - expect(result.shouldClear).toBe(true); - }); - - test('clears when the stored return path is not an allowed chat path', () => { - const result = resolveMcpPendingReconnectForPath( - createStoredPending({ returnTo: '/settings/accountAskAgent' }), - '/chat/abc123', - NOW, - ); - expect(result.pending).toBeUndefined(); - expect(result.shouldClear).toBe(true); - }); - - test('does nothing when no value is stored', () => { - expect(resolveMcpPendingReconnectForPath(null, '/chat/abc123', NOW)).toEqual({ shouldClear: false }); - }); - - test('accepts a tool-load reconnect without a tool call ID', () => { - const result = resolveMcpPendingReconnectForPath( - createStoredPending({ source: 'tool-load', toolCallId: undefined }), - '/chat/abc123', - NOW, - ); - - expect(result.pending).toMatchObject({ - serverId: 'server-1', - source: 'tool-load', - }); - }); -}); - -describe('sessionStorage round trip', () => { - beforeEach(() => { - window.sessionStorage.clear(); - }); - - test('saves, consumes, and clears the pending reconnect', () => { - saveMcpPendingReconnect({ - serverId: 'server-1', - serverName: 'Linear', - toolCallId: 'tool-call-1', - returnTo: '/chat/abc123', - }); - expect(window.sessionStorage.getItem(MCP_RECONNECT_SESSION_STORAGE_KEY)).not.toBeNull(); - - const pending = consumeMcpPendingReconnectForPath('/chat/abc123?status=connected'); - expect(pending?.serverId).toBe('server-1'); - expect(window.sessionStorage.getItem(MCP_RECONNECT_SESSION_STORAGE_KEY)).toBeNull(); - }); - - test('does not save a pending reconnect for a disallowed return path', () => { - saveMcpPendingReconnect({ - serverId: 'server-1', - serverName: 'Linear', - toolCallId: 'tool-call-1', - returnTo: 'https://evil.example.com/chat', - }); - expect(window.sessionStorage.getItem(MCP_RECONNECT_SESSION_STORAGE_KEY)).toBeNull(); - }); - - test('clearMcpPendingReconnect removes the stored value', () => { - saveMcpPendingReconnect({ - serverId: 'server-1', - serverName: 'Linear', - toolCallId: 'tool-call-1', - returnTo: '/chat/abc123', - }); - clearMcpPendingReconnect(); - expect(window.sessionStorage.getItem(MCP_RECONNECT_SESSION_STORAGE_KEY)).toBeNull(); - }); -}); diff --git a/packages/web/src/features/chat/mcpReconnect.ts b/packages/web/src/features/chat/mcpReconnect.ts deleted file mode 100644 index 06805e236..000000000 --- a/packages/web/src/features/chat/mcpReconnect.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { MCP_RECONNECT_SESSION_STORAGE_KEY } from "@/features/chat/constants"; -import { normalizeMcpOAuthDraftPath } from "@/features/chat/mcpOAuthDraft"; - -const MCP_RECONNECT_MAX_AGE_MS = 30 * 60 * 1000; - -export type McpReconnectSource = 'tool-call' | 'tool-load'; - -// The reconnect metadata preserved across the current-tab OAuth redirect. It -// re-associates the reconnect flow with the failed tool call or tool load when -// the browser returns to the thread, because in-memory state does not survive -// the navigation. -export interface McpPendingReconnect { - serverId: string; - serverName: string; - toolCallId?: string; - source: McpReconnectSource; - returnTo: string; - createdAt: number; -} - -type McpPendingReconnectInput = Omit & { - source?: McpReconnectSource; -}; -type StoredMcpPendingReconnect = Omit & { - source?: McpReconnectSource; -}; - -interface ResolveMcpPendingReconnectResult { - pending?: McpPendingReconnect; - shouldClear: boolean; -} - -function isRecord(value: unknown): value is Record { - return typeof value === 'object' && value !== null; -} - -function isMcpPendingReconnect(value: unknown): value is StoredMcpPendingReconnect { - const source = isRecord(value) && value.source === 'tool-load' ? 'tool-load' : 'tool-call'; - return ( - isRecord(value) && - typeof value.serverId === 'string' && - value.serverId.length > 0 && - typeof value.serverName === 'string' && - (source === 'tool-load' || (typeof value.toolCallId === 'string' && value.toolCallId.length > 0)) && - (value.source === undefined || value.source === 'tool-call' || value.source === 'tool-load') && - typeof value.returnTo === 'string' && - typeof value.createdAt === 'number' - ); -} - -export function resolveMcpPendingReconnectForPath( - storedValue: string | null, - currentPath: string, - now = Date.now(), -): ResolveMcpPendingReconnectResult { - if (!storedValue) { - return { shouldClear: false }; - } - - let parsed: unknown; - try { - parsed = JSON.parse(storedValue); - } catch { - return { shouldClear: true }; - } - - if (!isMcpPendingReconnect(parsed)) { - return { shouldClear: true }; - } - - if (now - parsed.createdAt > MCP_RECONNECT_MAX_AGE_MS) { - return { shouldClear: true }; - } - - const storedPath = normalizeMcpOAuthDraftPath(parsed.returnTo); - if (!storedPath) { - return { shouldClear: true }; - } - - const normalizedCurrentPath = normalizeMcpOAuthDraftPath(currentPath); - if (!normalizedCurrentPath) { - return { shouldClear: false }; - } - - if (storedPath !== normalizedCurrentPath) { - return { shouldClear: false }; - } - - return { - pending: { - ...parsed, - source: parsed.source ?? 'tool-call', - returnTo: storedPath, - }, - shouldClear: true, - }; -} - -function getSessionStorage(): Storage | undefined { - if (typeof window === 'undefined') { - return undefined; - } - - try { - return window.sessionStorage; - } catch { - return undefined; - } -} - -export function saveMcpPendingReconnect(input: McpPendingReconnectInput): void { - const storage = getSessionStorage(); - const returnTo = normalizeMcpOAuthDraftPath(input.returnTo); - if (!storage || !returnTo) { - return; - } - - try { - storage.setItem(MCP_RECONNECT_SESSION_STORAGE_KEY, JSON.stringify({ - ...input, - source: input.source ?? 'tool-call', - returnTo, - createdAt: Date.now(), - } satisfies McpPendingReconnect)); - } catch { - // If sessionStorage is unavailable or full, OAuth should still proceed. - } -} - -export function clearMcpPendingReconnect(): void { - const storage = getSessionStorage(); - if (!storage) { - return; - } - - try { - storage.removeItem(MCP_RECONNECT_SESSION_STORAGE_KEY); - } catch { - // Ignore storage cleanup failures. - } -} - -export function consumeMcpPendingReconnectForPath(currentPath: string): McpPendingReconnect | undefined { - const storage = getSessionStorage(); - if (!storage) { - return undefined; - } - - const result = resolveMcpPendingReconnectForPath( - storage.getItem(MCP_RECONNECT_SESSION_STORAGE_KEY), - currentPath, - ); - - if (result.shouldClear) { - clearMcpPendingReconnect(); - } - - return result.pending; -} diff --git a/packages/web/src/features/chat/mcpServerIconContext.tsx b/packages/web/src/features/chat/mcpServerIconContext.tsx deleted file mode 100644 index 94628f4a5..000000000 --- a/packages/web/src/features/chat/mcpServerIconContext.tsx +++ /dev/null @@ -1,10 +0,0 @@ -'use client'; - -import { createContext, useContext } from 'react'; - -// Maps sanitized server name (e.g. "linear") to a favicon URL. -export type McpServerIconMap = Record; - -export const McpServerIconContext = createContext({}); - -export const useMcpServerIconMap = () => useContext(McpServerIconContext); diff --git a/packages/web/src/features/chat/modelCapabilities.server.test.ts b/packages/web/src/features/chat/modelCapabilities.server.test.ts deleted file mode 100644 index 3c75cd011..000000000 --- a/packages/web/src/features/chat/modelCapabilities.server.test.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { afterEach, describe, expect, test, vi } from 'vitest'; -import type { LanguageModel } from '@sourcebot/schemas/v3/languageModel.type'; - -vi.mock('server-only', () => ({ default: vi.fn() })); - -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})); - -import { lookupModelCapabilities, resolveModelCapabilities } from './modelCapabilities.server'; -import type { ModelsDevCatalog } from './modelsDevCatalog.server'; - -const catalog: ModelsDevCatalog = { - anthropic: { - id: 'anthropic', - models: { - // Text + image + a document (pdf) container format. - 'claude-sonnet-4-5': { - id: 'claude-sonnet-4-5', - modalities: { input: ['text', 'image', 'pdf'], output: ['text'] }, - }, - }, - }, - // models.dev keys Gemini under 'google', whereas Sourcebot's provider id is - // 'google-generative-ai' — exercises the provider id override. - google: { - id: 'google', - models: { - 'gemini-2.5-pro': { - id: 'gemini-2.5-pro', - modalities: { input: ['text', 'image', 'audio', 'video', 'pdf'], output: ['text'] }, - }, - }, - }, - openai: { - id: 'openai', - models: { - // Catalogued model that omits `text` from its input list. - 'image-only': { id: 'image-only', modalities: { input: ['image'], output: ['text'] } }, - // Catalogued model with no `modalities` object at all. - 'no-modalities-model': { id: 'no-modalities-model' }, - }, - }, -}; - -const model = (provider: string, modelId: string) => - ({ provider, model: modelId }) as Pick; - -describe('lookupModelCapabilities', () => { - test('splits modalities and document types for a direct provider/model hit', () => { - expect(lookupModelCapabilities(catalog, model('anthropic', 'claude-sonnet-4-5'))).toEqual({ - inputModalities: ['text', 'image'], - supportedDocumentTypes: ['pdf'], - }); - }); - - test('maps google-generative-ai to the catalog\'s google key', () => { - expect(lookupModelCapabilities(catalog, model('google-generative-ai', 'gemini-2.5-pro'))).toEqual({ - inputModalities: ['text', 'image', 'audio', 'video'], - supportedDocumentTypes: ['pdf'], - }); - }); - - test('always includes text even when the catalog omits it', () => { - expect(lookupModelCapabilities(catalog, model('openai', 'image-only'))).toEqual({ - inputModalities: ['text', 'image'], - supportedDocumentTypes: [], - }); - }); - - test('falls back to text-only for a catalogued model with no modalities', () => { - expect(lookupModelCapabilities(catalog, model('openai', 'no-modalities-model'))).toEqual({ - inputModalities: ['text'], - supportedDocumentTypes: [], - }); - }); - - test('falls back to text-only for an uncatalogued model (e.g. openai-compatible / self-hosted)', () => { - expect(lookupModelCapabilities(catalog, model('openai-compatible', 'my-local-model'))).toEqual({ - inputModalities: ['text'], - supportedDocumentTypes: [], - }); - expect(lookupModelCapabilities(catalog, model('anthropic', 'claude-unknown'))).toEqual({ - inputModalities: ['text'], - supportedDocumentTypes: [], - }); - }); - - test('falls back to text-only when the catalog is null (fetch failed / unreachable)', () => { - expect(lookupModelCapabilities(null, model('anthropic', 'claude-sonnet-4-5'))).toEqual({ - inputModalities: ['text'], - supportedDocumentTypes: [], - }); - }); -}); - -describe('resolveModelCapabilities', () => { - afterEach(() => { - vi.unstubAllGlobals(); - }); - - test('blocks on the first (cold) fetch and then serves capabilities from cache (incl. provider mapping)', async () => { - const fetchMock = vi.fn(async () => ({ - ok: true, - json: async () => catalog, - }) as unknown as Response); - vi.stubGlobal('fetch', fetchMock); - - // The genuinely-first resolution blocks on the cold fetch (bounded) so - // capabilities resolve correctly instead of silently degrading to - // text-only right after a process start. - expect(await resolveModelCapabilities(model('anthropic', 'claude-sonnet-4-5'))).toEqual({ - inputModalities: ['text', 'image'], - supportedDocumentTypes: ['pdf'], - }); - - // Subsequent lookups reuse the cached catalog (incl. provider mapping) - // rather than refetching or blocking again. - expect(await resolveModelCapabilities(model('google-generative-ai', 'gemini-2.5-pro'))).toEqual({ - inputModalities: ['text', 'image', 'audio', 'video'], - supportedDocumentTypes: ['pdf'], - }); - - expect(fetchMock).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/web/src/features/chat/modelCapabilities.server.ts b/packages/web/src/features/chat/modelCapabilities.server.ts deleted file mode 100644 index 1dc9e19e7..000000000 --- a/packages/web/src/features/chat/modelCapabilities.server.ts +++ /dev/null @@ -1,66 +0,0 @@ -import 'server-only'; - -import { LanguageModel } from '@sourcebot/schemas/v3/languageModel.type'; -import { DocumentType, InputModality } from './types'; -import { loadCatalog, resolveProviderId, type ModelsDevCatalog } from './modelsDevCatalog.server'; - -// models.dev folds every accepted input — perceptual channels (text, image, -// audio, video) AND container formats (pdf) — into a single `modalities.input` -// list. Sourcebot keeps those two concepts apart: `inputModalities` are the -// raw channels a model encodes, while `supportedDocumentTypes` are rich -// compound formats providers decompose server-side. We partition the catalog's -// input list into those two buckets here. -const INPUT_MODALITY_VALUES = ['text', 'image', 'audio', 'video'] as const satisfies readonly InputModality[]; -const DOCUMENT_TYPE_VALUES = ['pdf'] as const satisfies readonly DocumentType[]; - -const isInputModality = (value: string): value is InputModality => - (INPUT_MODALITY_VALUES as readonly string[]).includes(value); - -const isDocumentType = (value: string): value is DocumentType => - (DOCUMENT_TYPE_VALUES as readonly string[]).includes(value); - -export type ModelCapabilities = { - inputModalities: InputModality[]; - supportedDocumentTypes: DocumentType[]; -}; - -/** - * Pure lookup of a model's input capabilities in a models.dev catalog. - * Separated from the network fetch so it can be unit-tested directly. - * - * Resolution is automatic from the catalog — capabilities are NOT hand-declared - * in config.json. When a model isn't catalogued (e.g. a self-hosted / - * openai-compatible endpoint we can't introspect), we fall back to text-only - * with no document support: the model stays fully usable for normal chat, and - * richer attachments stay gated off until we can positively confirm support. - */ -export const lookupModelCapabilities = ( - catalog: ModelsDevCatalog | null, - config: Pick, -): ModelCapabilities => { - const providerId = resolveProviderId(config.provider); - const inputs = catalog?.[providerId]?.models?.[config.model]?.modalities?.input; - - if (!inputs || inputs.length === 0) { - return { inputModalities: ['text'], supportedDocumentTypes: [] }; - } - - const inputModalities = inputs.filter(isInputModality); - const supportedDocumentTypes = inputs.filter(isDocumentType); - - // Every model accepts text, even if the catalog omits it from the list. - if (!inputModalities.includes('text')) { - inputModalities.unshift('text'); - } - - return { inputModalities, supportedDocumentTypes }; -}; - -export const resolveModelCapabilities = async ( - config: Pick, -): Promise => { - // Block on the first (cold) fetch so capabilities resolve correctly instead - // of degrading to text-only right after start. Bounded/one-time (see loadCatalog). - const catalog = await loadCatalog({ awaitWhenEmpty: true }); - return lookupModelCapabilities(catalog, config); -}; diff --git a/packages/web/src/features/chat/modelContextWindow.server.ts b/packages/web/src/features/chat/modelContextWindow.server.ts deleted file mode 100644 index f87bbcf3b..000000000 --- a/packages/web/src/features/chat/modelContextWindow.server.ts +++ /dev/null @@ -1,37 +0,0 @@ -import 'server-only'; - -import { LanguageModel } from '@sourcebot/schemas/v3/languageModel.type'; -import { loadCatalog, resolveProviderId, type ModelsDevCatalog } from './modelsDevCatalog.server'; - -// Re-exported so existing consumers/tests can keep importing the catalog type -// from here. -export type { ModelsDevCatalog } from './modelsDevCatalog.server'; - -/** - * Pure lookup of a model's context window in a models.dev catalog. Separated - * from the network fetch so it can be unit-tested directly. - * - * Returns the total context window in tokens, or `undefined` when the model - * isn't catalogued or has no usable window. - */ -export const lookupContextWindow = ( - catalog: ModelsDevCatalog | null, - config: Pick, -): number | undefined => { - if (!catalog) { - return undefined; - } - const providerId = resolveProviderId(config.provider); - const context = catalog[providerId]?.models?.[config.model]?.limit?.context; - // `limit` is schema-optional, and models.dev reports a 0 context window for - // non-text models (image/audio/etc.). Treat both as "unknown" so the UI - // gracefully omits the gauge rather than rendering a bogus denominator. - return typeof context === 'number' && context > 0 ? context : undefined; -}; - -export const resolveContextWindow = async ( - config: Pick, -): Promise => { - const catalog = await loadCatalog(); - return lookupContextWindow(catalog, config); -}; diff --git a/packages/web/src/features/chat/modelContextWindow.test.ts b/packages/web/src/features/chat/modelContextWindow.test.ts deleted file mode 100644 index 818251a3f..000000000 --- a/packages/web/src/features/chat/modelContextWindow.test.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { afterEach, describe, expect, test, vi } from 'vitest'; -import type { LanguageModel } from '@sourcebot/schemas/v3/languageModel.type'; - -vi.mock('server-only', () => ({ default: vi.fn() })); - -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})); - -import { lookupContextWindow, resolveContextWindow, type ModelsDevCatalog } from './modelContextWindow.server'; - -const catalog: ModelsDevCatalog = { - anthropic: { - id: 'anthropic', - models: { - 'claude-sonnet-4-5': { id: 'claude-sonnet-4-5', limit: { context: 200000, output: 64000 } }, - }, - }, - // models.dev keys Gemini under 'google', whereas Sourcebot's provider id is - // 'google-generative-ai' — exercises PROVIDER_ID_OVERRIDES. - google: { - id: 'google', - models: { - 'gemini-2.5-pro': { id: 'gemini-2.5-pro', limit: { context: 1048576, output: 65536 } }, - }, - }, - openai: { - id: 'openai', - models: { - 'gpt-4.1': { id: 'gpt-4.1', limit: { context: 1047576 } }, - // Non-text model: models.dev reports a 0 context window. - 'gpt-image-1': { id: 'gpt-image-1', limit: { context: 0, output: 0 } }, - // Catalogued model with no `limit` object at all. - 'no-limit-model': { id: 'no-limit-model' }, - }, - }, -}; - -const model = (provider: string, modelId: string) => - ({ provider, model: modelId }) as Pick; - -describe('lookupContextWindow', () => { - test('returns the context window for a direct provider/model hit', () => { - expect(lookupContextWindow(catalog, model('anthropic', 'claude-sonnet-4-5'))).toBe(200000); - expect(lookupContextWindow(catalog, model('openai', 'gpt-4.1'))).toBe(1047576); - }); - - test('maps google-generative-ai to the catalog\'s google key', () => { - expect(lookupContextWindow(catalog, model('google-generative-ai', 'gemini-2.5-pro'))).toBe(1048576); - }); - - test('returns undefined for an uncatalogued provider', () => { - expect(lookupContextWindow(catalog, model('mistral', 'mistral-large-latest'))).toBeUndefined(); - }); - - test('returns undefined for an uncatalogued model id (e.g. openai-compatible / self-hosted)', () => { - expect(lookupContextWindow(catalog, model('openai-compatible', 'my-local-model'))).toBeUndefined(); - expect(lookupContextWindow(catalog, model('anthropic', 'claude-unknown'))).toBeUndefined(); - }); - - test('treats a 0 context window (non-text models) as unknown', () => { - expect(lookupContextWindow(catalog, model('openai', 'gpt-image-1'))).toBeUndefined(); - }); - - test('treats a missing limit object as unknown', () => { - expect(lookupContextWindow(catalog, model('openai', 'no-limit-model'))).toBeUndefined(); - }); - - test('returns undefined when the catalog is null (fetch failed / unreachable)', () => { - expect(lookupContextWindow(null, model('anthropic', 'claude-sonnet-4-5'))).toBeUndefined(); - }); -}); - -describe('resolveContextWindow', () => { - afterEach(() => { - vi.unstubAllGlobals(); - }); - - test('fetches the catalog once in the background and resolves windows (incl. provider mapping)', async () => { - const fetchMock = vi.fn(async () => ({ - ok: true, - json: async () => catalog, - }) as unknown as Response); - vi.stubGlobal('fetch', fetchMock); - - // The request path never blocks on the fetch: the first lookup kicks off - // the background fetch and falls back to "unknown" while it's in flight. - expect(await resolveContextWindow(model('anthropic', 'claude-sonnet-4-5'))).toBeUndefined(); - - // Once the background fetch settles, lookups resolve from the cached catalog. - await new Promise((resolve) => setTimeout(resolve, 0)); - expect(await resolveContextWindow(model('anthropic', 'claude-sonnet-4-5'))).toBe(200000); - // Subsequent lookups reuse the cached catalog rather than refetching. - expect(await resolveContextWindow(model('google-generative-ai', 'gemini-2.5-pro'))).toBe(1048576); - expect(await resolveContextWindow(model('openai-compatible', 'my-local-model'))).toBeUndefined(); - - expect(fetchMock).toHaveBeenCalledTimes(1); - }); -}); - -describe('resolveContextWindow resilience', () => { - afterEach(() => { - vi.unstubAllGlobals(); - vi.restoreAllMocks(); - vi.resetModules(); - }); - - // Re-import the module so each scenario starts with fresh internal cache state. - const importFresh = async () => { - vi.resetModules(); - return await import('./modelContextWindow.server'); - }; - - test('negative-caches failures instead of refetching on every call', async () => { - const fetchMock = vi.fn(async () => ({ - ok: false, - status: 503, - statusText: 'Service Unavailable', - }) as unknown as Response); - vi.stubGlobal('fetch', fetchMock); - - const mod = await importFresh(); - - expect(await mod.resolveContextWindow(model('anthropic', 'claude-sonnet-4-5'))).toBeUndefined(); - expect(await mod.resolveContextWindow(model('anthropic', 'claude-sonnet-4-5'))).toBeUndefined(); - expect(await mod.resolveContextWindow(model('openai', 'gpt-4.1'))).toBeUndefined(); - - // Only the first attempt hit the network; the rest were short-circuited - // by the negative-cache window, so chat sends don't repeatedly block. - expect(fetchMock).toHaveBeenCalledTimes(1); - }); - - test('preserves the last-known-good catalog when a refresh fails', async () => { - let nowMs = 1_700_000_000_000; - vi.spyOn(Date, 'now').mockImplementation(() => nowMs); - - let shouldFail = false; - const fetchMock = vi.fn(async () => (shouldFail - ? { ok: false, status: 503, statusText: 'Service Unavailable' } - : { ok: true, json: async () => catalog }) as unknown as Response); - vi.stubGlobal('fetch', fetchMock); - - const mod = await importFresh(); - - // First load kicks off the background fetch (returning the "unknown" - // fallback until it settles), which then populates the cache. - expect(await mod.resolveContextWindow(model('anthropic', 'claude-sonnet-4-5'))).toBeUndefined(); - await new Promise((resolve) => setTimeout(resolve, 0)); - expect(await mod.resolveContextWindow(model('anthropic', 'claude-sonnet-4-5'))).toBe(200000); - expect(fetchMock).toHaveBeenCalledTimes(1); - - // Advance past the TTL and make every refresh fail. - nowMs += 7 * 60 * 60 * 1000; - shouldFail = true; - - // Stale-while-revalidate: serves the cached value and refreshes in the - // background (which fails). - expect(await mod.resolveContextWindow(model('anthropic', 'claude-sonnet-4-5'))).toBe(200000); - // Let the background refresh settle. - await new Promise((resolve) => setTimeout(resolve, 0)); - expect(fetchMock).toHaveBeenCalledTimes(2); - - // The failed refresh must not have discarded the good catalog. - expect(await mod.resolveContextWindow(model('anthropic', 'claude-sonnet-4-5'))).toBe(200000); - }); -}); diff --git a/packages/web/src/features/chat/modelsDevCatalog.server.ts b/packages/web/src/features/chat/modelsDevCatalog.server.ts deleted file mode 100644 index b025fb454..000000000 --- a/packages/web/src/features/chat/modelsDevCatalog.server.ts +++ /dev/null @@ -1,135 +0,0 @@ -import 'server-only'; - -import { createLogger } from '@sourcebot/shared'; - -const logger = createLogger('models-dev-catalog'); - -// The same public, unauthenticated catalog the setup wizard already consumes -// (see packages/setupWizard/src/models.ts). Each model entry exposes a -// `limit.context` field (total context window in tokens) and a `modalities` -// field describing the inputs/outputs the model supports natively. -const MODELS_DEV_API_URL = 'https://models.dev/api.json'; -const FETCH_TIMEOUT_MS = 8000; -// Re-fetch the (~2.4 MB) catalog at most once per this interval per server -// process. New models trickle in daily; a stale window for a few hours is fine. -const CATALOG_TTL_MS = 6 * 60 * 60 * 1000; -// After a failed fetch, don't reattempt for this long. Since the request path -// never blocks on the fetch (see loadCatalog), this throttles background -// refresh attempts to once per interval during a models.dev outage instead of -// kicking one off on (nearly) every request. -const NEGATIVE_CACHE_MS = 60 * 1000; -// Max time a single `awaitWhenEmpty` caller blocks on the first fetch (well -// under FETCH_TIMEOUT_MS); past it the caller falls back while the fetch -// continues warming the cache in the background. -const COLD_START_BLOCK_BUDGET_MS = 2500; - -// Sourcebot provider id -> models.dev top-level catalog key. Only providers -// whose Sourcebot id differs from the models.dev id need an entry; everything -// else (anthropic, openai, azure, amazon-bedrock, mistral, deepseek, xai, -// openrouter, google-vertex, google-vertex-anthropic) matches 1:1. -const PROVIDER_ID_OVERRIDES: Record = { - 'google-generative-ai': 'google', -}; - -export const resolveProviderId = (provider: string): string => - PROVIDER_ID_OVERRIDES[provider] ?? provider; - -type ModelsDevModel = { - id: string; - limit?: { - context?: number; - output?: number; - }; - modalities?: { - // e.g. ["text", "image", "pdf", "audio", "video"] - input?: string[]; - output?: string[]; - }; -}; - -type ModelsDevProvider = { - id: string; - models?: Record; -}; - -export type ModelsDevCatalog = Record; - -// Last successfully-fetched catalog. Served while fresh, and kept as a fallback -// when a later refresh fails. `catalogFetchedAt` is when it was fetched (TTL), -// `lastFailedAt` the most recent fetch failure (negative-cache backoff), and -// `inFlightFetch` dedupes concurrent fetches. -let cachedCatalog: ModelsDevCatalog | null = null; -let catalogFetchedAt = 0; -let lastFailedAt = 0; -let inFlightFetch: Promise | null = null; - -const fetchCatalog = async (): Promise => { - try { - const response = await fetch(MODELS_DEV_API_URL, { - signal: AbortSignal.timeout(FETCH_TIMEOUT_MS), - }); - if (!response.ok) { - logger.warn(`Failed to fetch models.dev catalog: ${response.status} ${response.statusText}`); - return null; - } - return await response.json() as ModelsDevCatalog; - } catch (error) { - logger.warn(`Failed to fetch models.dev catalog: ${error}`); - return null; - } -}; - -/** - * Returns the cached models.dev catalog, refreshing it in the background when - * stale. The request path NEVER blocks on the network: the last-known-good - * catalog is returned immediately (even if stale), or null before the first - * successful fetch lands, and any refresh settles in the background. - * - * By default the request path NEVER blocks on the network: a cold cache returns - * null (text-only fallback) and an unreachable catalog costs nothing. Callers - * needing a correct answer on a cold cache may pass `awaitWhenEmpty: true`, - * which blocks only on the first-ever fetch and only up to - * COLD_START_BLOCK_BUDGET_MS (see below). - */ -export const loadCatalog = async ( - { awaitWhenEmpty = false }: { awaitWhenEmpty?: boolean } = {}, -): Promise => { - const now = Date.now(); - const isFresh = cachedCatalog !== null && now - catalogFetchedAt <= CATALOG_TTL_MS; - const isBackingOff = now - lastFailedAt < NEGATIVE_CACHE_MS; - - // Kick off a (deduped) refresh when the cache is stale/empty and we're not - // within the post-failure backoff window. On success it replaces the cache; - // on failure it only records the failure time, leaving the last-known-good - // catalog intact. The promise is intentionally not awaited here so the - // request path never waits on models.dev. - if (!isFresh && !isBackingOff && !inFlightFetch) { - inFlightFetch = fetchCatalog().then((catalog) => { - if (catalog) { - cachedCatalog = catalog; - catalogFetchedAt = Date.now(); - } else { - lastFailedAt = Date.now(); - } - inFlightFetch = null; - return catalog; - }); - } - - // Block on the first-ever fetch only (`!hasAttempted`), bounded by - // COLD_START_BLOCK_BUDGET_MS, so a cold cache resolves correctly instead of - // silently degrading. After any attempt we never block again (airgapped pays - // at most one short wait per process); the background refresh self-heals. - const hasAttempted = catalogFetchedAt > 0 || lastFailedAt > 0; - if (awaitWhenEmpty && cachedCatalog === null && inFlightFetch && !hasAttempted) { - return Promise.race([ - inFlightFetch, - new Promise((resolve) => - setTimeout(() => resolve(cachedCatalog), COLD_START_BLOCK_BUDGET_MS)), - ]); - } - - // Serve whatever we currently have cached (possibly null on a cold start) - // and let any in-flight refresh settle in the background. - return cachedCatalog; -}; diff --git a/packages/web/src/features/chat/toolApprovalContext.tsx b/packages/web/src/features/chat/toolApprovalContext.tsx deleted file mode 100644 index d4379c394..000000000 --- a/packages/web/src/features/chat/toolApprovalContext.tsx +++ /dev/null @@ -1,9 +0,0 @@ -'use client'; - -import { createContext, useContext } from 'react'; -import type { ChatAddToolApproveResponseFunction } from 'ai'; - -const ToolApprovalContext = createContext(null); - -export const ToolApprovalProvider = ToolApprovalContext.Provider; -export const useToolApproval = () => useContext(ToolApprovalContext); \ No newline at end of file diff --git a/packages/web/src/features/chat/types.test.ts b/packages/web/src/features/chat/types.test.ts deleted file mode 100644 index a9f41df7c..000000000 --- a/packages/web/src/features/chat/types.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { expect, test, describe } from 'vitest'; -import { sbChatMessageMetadataSchema, additionalChatRequestParamsSchema } from './types'; - -describe('sbChatMessageMetadataSchema', () => { - test('accepts disabledMcpServerIds as array of strings', () => { - const result = sbChatMessageMetadataSchema.safeParse({ - disabledMcpServerIds: ['id1', 'id2'], - }); - - expect(result.success).toBe(true); - if (result.success) { - expect(result.data.disabledMcpServerIds).toEqual(['id1', 'id2']); - } - }); - - test('accepts missing disabledMcpServerIds (optional)', () => { - const result = sbChatMessageMetadataSchema.safeParse({}); - - expect(result.success).toBe(true); - if (result.success) { - expect(result.data.disabledMcpServerIds).toBeUndefined(); - } - }); - - test('rejects non-string array values', () => { - const result = sbChatMessageMetadataSchema.safeParse({ - disabledMcpServerIds: [123, 456], - }); - - expect(result.success).toBe(false); - }); -}); - -describe('additionalChatRequestParamsSchema', () => { - const validBase = { - languageModel: { - provider: 'anthropic', - model: 'claude-sonnet-4-20250514', - }, - selectedSearchScopes: [], - }; - - test('defaults disabledMcpServerIds to empty array', () => { - const result = additionalChatRequestParamsSchema.safeParse(validBase); - - expect(result.success).toBe(true); - if (result.success) { - expect(result.data.disabledMcpServerIds).toEqual([]); - } - }); - - test('accepts explicit disabledMcpServerIds array', () => { - const result = additionalChatRequestParamsSchema.safeParse({ - ...validBase, - disabledMcpServerIds: ['abc'], - }); - - expect(result.success).toBe(true); - if (result.success) { - expect(result.data.disabledMcpServerIds).toEqual(['abc']); - } - }); - - test('rejects non-array value for disabledMcpServerIds', () => { - const result = additionalChatRequestParamsSchema.safeParse({ - ...validBase, - disabledMcpServerIds: 'not-an-array', - }); - - expect(result.success).toBe(false); - }); -}); diff --git a/packages/web/src/features/chat/types.ts b/packages/web/src/features/chat/types.ts deleted file mode 100644 index 2c4d62c69..000000000 --- a/packages/web/src/features/chat/types.ts +++ /dev/null @@ -1,304 +0,0 @@ -import { CreateUIMessage, InferUITool, UIMessage, UIMessagePart } from "ai"; -import { BaseEditor, Descendant } from "slate"; -import { HistoryEditor } from "slate-history"; -import { ReactEditor, RenderElementProps } from "slate-react"; -import { z } from "zod"; -import { LanguageModel } from "@sourcebot/schemas/v3/index.type"; -// Type-only import: the chat message tool types are derived from the shape of the -// EE agent's tools, but no runtime dependency on ee/ is introduced (erased at build). -import type { createTools } from "@/ee/features/chat/tools"; -export { sourceSchema } from "@/features/tools/types"; -export type { FileSource, Source } from "@/features/tools/types"; -import type { Source } from "@/features/tools/types"; -import type { CommandInvocationData, CommandMentionData } from "./commands/types"; - -const fileReferenceSchema = z.object({ - type: z.literal('file'), - id: z.string(), - repo: z.string(), - path: z.string(), - range: z.object({ - startLine: z.number(), - endLine: z.number(), - }).optional(), -}); -export type FileReference = z.infer; - -export const referenceSchema = z.discriminatedUnion('type', [ - fileReferenceSchema, -]); -export type Reference = z.infer; - -export const repoSearchScopeSchema = z.object({ - type: z.literal('repo'), - value: z.string(), - name: z.string(), - codeHostType: z.string(), -}); -export type RepoSearchScope = z.infer; - -export const repoSetSearchScopeSchema = z.object({ - type: z.literal('reposet'), - value: z.string(), - name: z.string(), - repoCount: z.number(), -}); -export type RepoSetSearchScope = z.infer; - -export const searchScopeSchema = z.discriminatedUnion('type', [ - repoSearchScopeSchema, - repoSetSearchScopeSchema, -]); -export type SearchScope = z.infer; - -export const sbChatMessageMetadataSchema = z.object({ - modelName: z.string().optional(), - totalInputTokens: z.number().optional(), - totalOutputTokens: z.number().optional(), - totalTokens: z.number().optional(), - // Portion of input tokens served from / written to the prompt cache. - totalCacheReadTokens: z.number().optional(), - totalCacheWriteTokens: z.number().optional(), - totalResponseTimeMs: z.number().optional(), - contextWindow: z.number().optional(), - feedback: z.array(z.object({ - type: z.enum(['like', 'dislike']), - timestamp: z.string(), // ISO date string - userId: z.string().optional(), - })).optional(), - selectedSearchScopes: z.array(searchScopeSchema).optional(), - disabledMcpServerIds: z.array(z.string()).optional(), - traceId: z.string().optional(), - // Token usage of each agent step in this message's turn, in step order - // across all approval-continuation phases. The step array position is the - // step's identity: the UI joins these entries to its steps by array - // index, so the array must stay 1:1 with the turn's steps. - stepTokenUsage: z.array(z.object({ - // Provider-reported (billed, not estimated) usage of this step. - inputTokens: z.number().optional(), - outputTokens: z.number().optional(), - cacheReadTokens: z.number().optional(), - // Tool calls that ran in this step, each with the estimated - // input-token footprint its output imposes when fed back to the model - // on the next step. These are local estimates — never to be confused - // with the authoritative provider-reported fields. - tools: z.array(z.object({ - toolCallId: z.string(), - toolName: z.string(), - estimatedOutputTokens: z.number(), - })), - })).optional(), -}); - -export type SBChatMessageMetadata = z.infer; - -export type StepTokenUsageEntry = NonNullable[number]; -export type ToolTokenUsageEntry = StepTokenUsageEntry['tools'][number]; - -export type SBChatMessageToolTypes = { - [K in keyof ReturnType]: InferUITool[K]>; -} & { - tool_request_activation: { - input: { tool_to_activate_name: string }; - output: { results: Array<{ name: string; description: string }> }; - }; - // load_skill is constructed in the EE agent (createLoadSkillTool), not in - // createTools, so its UI part shape is declared here by hand — mirror of the - // execute() return in ee/features/chat/tools/loadSkillTool.ts. - load_skill: { - input: { skill_id: string }; - output: - | { skill: { id: string; slug: string; name: string }; instructions: string } - | { error: string }; - }; -}; - -// A user-provided file attachment. The `text` variant carries the file's -// extracted text inline (used for text/code/structured files). The `blob` -// variant references stored bytes by id (used for binary attachments like -// images that cannot be inlined as text); the bytes live in the StorageBackend -// and never travel in the `messages` JSON. -export const textAttachmentSchema = z.object({ - kind: z.literal('text'), - // Stable, message-persisted handle for the attachment. Carried through from - // the pending attachment's client id so later features (citing/referencing - // attachment content) have a durable handle on every persisted attachment. - id: z.string(), - filename: z.string(), - mediaType: z.string(), - sizeBytes: z.number(), - text: z.string(), -}); -export type TextAttachment = z.infer; - -export const blobAttachmentSchema = z.object({ - kind: z.literal('blob'), - attachmentId: z.string(), - filename: z.string(), - mediaType: z.string(), - sizeBytes: z.number(), -}); -export type BlobAttachment = z.infer; - -export const attachmentDataSchema = z.discriminatedUnion('kind', [ - textAttachmentSchema, - blobAttachmentSchema, -]); -export type AttachmentData = z.infer; - -export type SBChatMessageDataParts = { - // The `source` data type allows us to know what sources the LLM saw - // during retrieval. - "source": Source, - // The `mcp-server` data type carries favicon metadata for connected MCP servers, - // keyed by sanitized server name (e.g. "linear"). - "mcp-server": { sanitizedName: string; faviconUrl: string }, - // The `mcp-tool` data type maps the provider-safe model tool name back to - // the raw MCP tool name for display. - "mcp-tool": { modelToolName: string; rawToolName: string }, - // The `mcp-failed-server` data type surfaces MCP servers that failed to load their tools. - "mcp-failed-server": { serverId: string; serverName: string }, - // The `mcp-auth-required` data type signals that a connector's tool call - // failed with a reconnect-required authentication failure. Always written - // with `transient: true`: it is consumed live by the client to drive the - // connector reconnect UI and is never included in persisted messages. - "mcp-auth-required": { serverId: string; serverName: string; toolCallId: string }, - // A user-provided file attachment included with the message. - "attachment": AttachmentData, - // The `command` data type preserves the slash command identity so the server - // can resolve and expand the command's instructions securely. - "command": CommandInvocationData, -} - -export type SBChatMessage = UIMessage< - SBChatMessageMetadata, - SBChatMessageDataParts, - SBChatMessageToolTypes ->; - -export type SBChatMessagePart = UIMessagePart< - SBChatMessageDataParts, - SBChatMessageToolTypes ->; - -// Slate specific types // - -export type CustomText = { text: string; } - -export type ParagraphElement = { - type: 'paragraph' - align?: string - children: Descendant[]; -} - -export const fileMentionDataSchema = z.object({ - type: z.literal('file'), - repo: z.string(), - path: z.string(), - name: z.string(), - language: z.string(), - revision: z.string(), -}); - -export type FileMentionData = z.infer; - -export const isFileMentionData = (value: unknown): value is FileMentionData => - fileMentionDataSchema.safeParse(value).success; - -export type MentionData = FileMentionData | CommandMentionData; - -export type MentionElement = { - type: 'mention'; - data: MentionData; - children: CustomText[]; -} - -export type CustomElement = - ParagraphElement | - MentionElement - ; - - -export type CustomEditor = - BaseEditor & - ReactEditor & - HistoryEditor - ; - -export type RenderElementPropsFor = RenderElementProps & { - element: T -} - -declare module 'slate' { - interface CustomTypes { - Editor: CustomEditor - Element: CustomElement - Text: CustomText - } -} - -///////////////////////// - -// Misc // -export type SetChatStatePayload = { - inputMessage: CreateUIMessage; - selectedSearchScopes: SearchScope[]; - disabledMcpServerIds: string[]; -} - - -export type LanguageModelProvider = LanguageModel['provider']; - -export const languageModelProviders = [ - "amazon-bedrock", - "anthropic", - "azure", - "deepseek", - "google-generative-ai", - "google-vertex-anthropic", - "google-vertex", - "mistral", - "openai", - "openai-compatible", - "openrouter", - "xai", -] as const satisfies readonly LanguageModelProvider[]; - -// Type-check assertion that ensure the above array is up to date -// with the LanguageModelProvider type. -type _AssertAllProviders = LanguageModelProvider extends typeof languageModelProviders[number] ? true : never; -const _assertAllProviders: _AssertAllProviders = true; -void _assertAllProviders; - -export const inputModalities = ['text', 'image', 'audio', 'video'] as const; -export type InputModality = typeof inputModalities[number]; - -export const documentTypes = ['pdf'] as const; -export type DocumentType = typeof documentTypes[number]; - -export const languageModelInfoSchema = z.object({ - provider: z.enum(languageModelProviders).describe("The model provider (e.g., 'anthropic', 'openai')"), - model: z.string().describe("The model ID"), - displayName: z.string().optional().describe("Optional display name for the model"), - inputModalities: z.array(z.enum(inputModalities)).default(['text']).describe("The input modalities the model can accept (images, audio, video, text). Single-medium attachments are gated by these. Defaults to text-only."), - supportedDocumentTypes: z.array(z.enum(documentTypes)).default([]).describe("Rich compound document formats (e.g. PDF) the model can ingest natively, distinct from single-medium attachments gated by inputModalities. Defaults to none."), -}); - -/** - * Client safe subset of information about a language model. - */ -export type LanguageModelInfo = { - provider: LanguageModelProvider, - model: LanguageModel['model'], - displayName?: LanguageModel['displayName'], - inputModalities: InputModality[], - supportedDocumentTypes: DocumentType[], -} - -// Additional request body data that we send along to the chat API. -export const additionalChatRequestParamsSchema = z.object({ - languageModel: languageModelInfoSchema, - selectedSearchScopes: z.array(searchScopeSchema), - disabledMcpServerIds: z.array(z.string()).default([]), -}); -export type AdditionalChatRequestParams = z.infer; diff --git a/packages/web/src/features/chat/useCreateNewChatThread.ts b/packages/web/src/features/chat/useCreateNewChatThread.ts deleted file mode 100644 index ef5018ccf..000000000 --- a/packages/web/src/features/chat/useCreateNewChatThread.ts +++ /dev/null @@ -1,71 +0,0 @@ -'use client'; - -import { useCallback, useState } from "react"; -import { Descendant } from "slate"; -import { createUIMessage, getAllMentionElements } from "./utils"; -import { slateContentToString } from "./utils"; -import { useToast } from "@/components/hooks/use-toast"; -import { useRouter } from "next/navigation"; -import { createChat } from "./actions"; -import { isServiceError } from "@/lib/utils"; -import { createPathWithQueryParams } from "@/lib/utils"; -import { AttachmentData, SearchScope, SetChatStatePayload } from "./types"; -import { DISABLED_MCP_SERVER_IDS_LOCAL_STORAGE_KEY, SELECTED_SEARCH_SCOPES_LOCAL_STORAGE_KEY, SET_CHAT_STATE_SESSION_STORAGE_KEY } from "./constants"; -import { useSessionStorage } from "usehooks-ts"; - -export const useCreateNewChatThread = () => { - const [isLoading, setIsLoading] = useState(false); - const { toast } = useToast(); - const router = useRouter(); - const [, setChatState] = useSessionStorage(SET_CHAT_STATE_SESSION_STORAGE_KEY, null); - - const createNewChatThread = useCallback(async (children: Descendant[], overrideSearchScopes?: SearchScope[], overrideDisabledMcpServerIds?: string[], attachments: AttachmentData[] = []) => { - const text = slateContentToString(children); - const mentions = getAllMentionElements(children); - - let storedScopes: SearchScope[] = []; - try { - const stored = window.localStorage.getItem(SELECTED_SEARCH_SCOPES_LOCAL_STORAGE_KEY); - if (stored) { - storedScopes = JSON.parse(stored) as SearchScope[]; - } - } catch { /* fall through to [] */ } - - let storedDisabledMcpServerIds: string[] = []; - try { - const stored = window.localStorage.getItem(DISABLED_MCP_SERVER_IDS_LOCAL_STORAGE_KEY); - if (stored) { - storedDisabledMcpServerIds = JSON.parse(stored) as string[]; - } - } catch { /* fall through to [] */ } - - const selectedSearchScopes = overrideSearchScopes ?? storedScopes; - const disabledMcpServerIds = overrideDisabledMcpServerIds ?? storedDisabledMcpServerIds; - const inputMessage = createUIMessage(text, mentions.map((mention) => mention.data), selectedSearchScopes, disabledMcpServerIds, attachments); - - setIsLoading(true); - const response = await createChat({ source: 'sourcebot-web-client' }); - if (isServiceError(response)) { - toast({ - description: `❌ Failed to create chat. Reason: ${response.message}` - }); - setIsLoading(false); - return; - } - - setChatState({ - inputMessage, - selectedSearchScopes, - disabledMcpServerIds, - }); - - const url = createPathWithQueryParams(`/chat/${response.id}`); - - router.push(url); - }, [router, toast, setChatState]); - - return { - createNewChatThread, - isLoading, - }; -} diff --git a/packages/web/src/features/chat/useCustomSlateEditor.ts b/packages/web/src/features/chat/useCustomSlateEditor.ts deleted file mode 100644 index 20c871473..000000000 --- a/packages/web/src/features/chat/useCustomSlateEditor.ts +++ /dev/null @@ -1,37 +0,0 @@ -'use client'; - -import { createEditor } from "slate"; -import { useState } from "react"; -import { withReact } from "slate-react"; -import { withHistory } from "slate-history"; -import { CustomEditor } from "./types"; -import { Element } from "slate"; - -export const useCustomSlateEditor = () => { - const [editor] = useState(() => - withMentions( - withReact( - withHistory(createEditor()) - ) - ) - ); - return editor; -} - -const withMentions = (editor: CustomEditor) => { - const { isInline, isVoid, markableVoid } = editor; - - editor.isInline = (element: Element) => { - return element.type === 'mention' ? true : isInline(element) - } - - editor.isVoid = (element: Element) => { - return element.type === 'mention' ? true : isVoid(element) - } - - editor.markableVoid = (element: Element) => { - return element.type === 'mention' || markableVoid(element) - } - - return editor -} diff --git a/packages/web/src/features/chat/useSelectedLanguageModel.test.tsx b/packages/web/src/features/chat/useSelectedLanguageModel.test.tsx deleted file mode 100644 index 3d5566fc1..000000000 --- a/packages/web/src/features/chat/useSelectedLanguageModel.test.tsx +++ /dev/null @@ -1,173 +0,0 @@ -import { cleanup, fireEvent, render, screen } from "@testing-library/react"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; -import { LanguageModelSelector } from "./components/chatBox/languageModelSelector"; -import { LanguageModelProvider } from "./languageModelContext"; -import { LanguageModelInfo } from "./types"; -import { useSelectedLanguageModel } from "./useSelectedLanguageModel"; - -vi.mock("./components/chatBox/modelProviderLogo", () => ({ - ModelProviderLogo: () => null, -})); - -const STORAGE_KEY = "selectedLanguageModel"; - -const makeModel = (model: string, overrides: Partial = {}): LanguageModelInfo => ({ - provider: "anthropic", - model, - inputModalities: ["text"], - supportedDocumentTypes: [], - ...overrides, -}); - -const oldModels = [makeModel("old-default"), makeModel("old-other")]; -const newModels = [makeModel("new-default"), makeModel("new-other")]; - -// Mirrors a chat page: the toolbar selector and the chat thread each resolve -// the selection against the page's model list. -const Toolbar = ({ languageModels }: { languageModels: LanguageModelInfo[] }) => { - const { selectedLanguageModel, setSelectedLanguageModel } = useSelectedLanguageModel(languageModels); - return ( - - ); -}; - -const Thread = ({ languageModels }: { languageModels: LanguageModelInfo[] }) => { - const { selectedLanguageModel } = useSelectedLanguageModel(languageModels); - return ( - - {selectedLanguageModel?.model ?? "none"} - - ); -}; - -const ChatPage = ({ languageModels }: { languageModels: LanguageModelInfo[] }) => ( - <> - - - -); - -// The provider is mounted once by the (app) layout and survives client-side -// navigation, while each page renders with a freshly loaded model list. -const renderSession = (languageModels: LanguageModelInfo[]) => { - const result = render( - - - - ); - - return { - navigateWithModels: (nextModels: LanguageModelInfo[]) => result.rerender( - - - - ), - }; -}; - -const selectModel = (currentModel: string, nextModel: string) => { - fireEvent.click(screen.getByRole("button", { name: currentModel })); - fireEvent.click(screen.getByRole("option", { name: nextModel })); -}; - -const getStoredModel = () => { - const stored = window.localStorage.getItem(STORAGE_KEY); - return stored ? (JSON.parse(stored) as LanguageModelInfo).model : undefined; -}; - -beforeAll(() => { - // cmdk relies on these browser APIs, which jsdom does not implement. - globalThis.ResizeObserver ??= class { - observe() {} - unobserve() {} - disconnect() {} - }; - Element.prototype.scrollIntoView ??= () => {}; -}); - -// Node 25 ships a global localStorage that shadows jsdom's, so install a fresh -// in-memory store for each test. -const installMockLocalStorage = () => { - const store = new Map(); - const storage: Storage = { - get length() { - return store.size; - }, - clear: () => store.clear(), - getItem: (key: string) => store.get(key) ?? null, - key: (index: number) => Array.from(store.keys())[index] ?? null, - removeItem: (key: string) => { - store.delete(key); - }, - setItem: (key: string, value: string) => { - store.set(key, value); - }, - }; - Object.defineProperty(window, "localStorage", { configurable: true, value: storage }); - Object.defineProperty(globalThis, "localStorage", { configurable: true, value: storage }); -}; - -beforeEach(() => { - installMockLocalStorage(); -}); - -afterEach(() => { - cleanup(); -}); - -describe("useSelectedLanguageModel", () => { - test("restores the stored model on mount", () => { - window.localStorage.setItem(STORAGE_KEY, JSON.stringify(oldModels[1])); - - renderSession(oldModels); - - expect(screen.getByRole("button", { name: "old-other" })).toBeTruthy(); - expect(screen.getByTestId("submitted-model").textContent).toBe("old-other"); - }); - - test("keeps a newly configured model selected after the config changes mid-session", () => { - const session = renderSession(oldModels); - session.navigateWithModels(newModels); - - selectModel("new-default", "new-other"); - - expect(screen.getByRole("button", { name: "new-other" })).toBeTruthy(); - expect(screen.getByTestId("submitted-model").textContent).toBe("new-other"); - expect(getStoredModel()).toBe("new-other"); - }); - - test("converges on the first configured model when the selected model is removed", () => { - const session = renderSession(oldModels); - selectModel("old-default", "old-other"); - expect(getStoredModel()).toBe("old-other"); - - session.navigateWithModels(newModels); - - expect(screen.getByRole("button", { name: "new-default" })).toBeTruthy(); - expect(screen.getByTestId("submitted-model").textContent).toBe("new-default"); - // Reconciliation is derived, not written back, so consumers cannot - // trigger each other into a storage write loop. - expect(getStoredModel()).toBe("old-other"); - }); - - test("uses the current config's capabilities for a stored model", () => { - window.localStorage.setItem(STORAGE_KEY, JSON.stringify(oldModels[1])); - const session = renderSession(oldModels); - - session.navigateWithModels([oldModels[0], makeModel("old-other", { inputModalities: ["text", "image"] })]); - - expect(screen.getByTestId("submitted-model").dataset.modalities).toBe("text,image"); - }); - - test("selects nothing when no models are configured", () => { - window.localStorage.setItem(STORAGE_KEY, JSON.stringify(oldModels[0])); - - renderSession([]); - - expect(screen.getByTestId("submitted-model").textContent).toBe("none"); - }); -}); diff --git a/packages/web/src/features/chat/useSelectedLanguageModel.ts b/packages/web/src/features/chat/useSelectedLanguageModel.ts deleted file mode 100644 index adcb02e98..000000000 --- a/packages/web/src/features/chat/useSelectedLanguageModel.ts +++ /dev/null @@ -1,35 +0,0 @@ -'use client'; - -import { useContext, useMemo } from "react"; -import { SelectedLanguageModelContext } from "./languageModelContext"; -import { LanguageModelInfo } from "./types"; -import { getLanguageModelKey } from "./utils"; - -// Returns the list's own entry rather than the stored copy so capabilities -// reflect the current config. Unavailable selections fall back without writing -// to storage, so multiple consumers cannot trigger each other into a write loop. -export const useSelectedLanguageModel = (languageModels: LanguageModelInfo[]) => { - const context = useContext(SelectedLanguageModelContext); - if (!context) { - throw new Error("useSelectedLanguageModel must be used within a LanguageModelProvider"); - } - - const { storedLanguageModel, setSelectedLanguageModel } = context; - - const selectedLanguageModel = useMemo(() => { - if (storedLanguageModel) { - const storedKey = getLanguageModelKey(storedLanguageModel); - const match = languageModels.find((model) => getLanguageModelKey(model) === storedKey); - if (match) { - return match; - } - } - - return languageModels.length > 0 ? languageModels[0] : undefined; - }, [storedLanguageModel, languageModels]); - - return { - selectedLanguageModel, - setSelectedLanguageModel, - }; -}; diff --git a/packages/web/src/features/chat/utils.server.ts b/packages/web/src/features/chat/utils.server.ts deleted file mode 100644 index 704ed691e..000000000 --- a/packages/web/src/features/chat/utils.server.ts +++ /dev/null @@ -1,373 +0,0 @@ -import 'server-only'; - -import { getAnonymousId } from '@/lib/anonymousId'; -import { AttachmentStatus, Chat, ChatVisibility, Prisma, PrismaClient, User } from '@sourcebot/db'; -import { LanguageModel } from '@sourcebot/schemas/v3/languageModel.type'; -import { createLogger, env, getStorageBackend, loadConfig } from '@sourcebot/shared'; -import fs from 'fs'; -import path from 'path'; -import { BlobAttachment, LanguageModelInfo, SBChatMessage } from './types'; -import { getUserMessageAttachments } from './utils'; -import { ATTACHMENT_MAX_IMAGE_COUNT } from './constants'; -import { resolveModelCapabilities } from './modelCapabilities.server'; -import { loadCatalog } from './modelsDevCatalog.server'; -import { hasEntitlement } from '@/lib/entitlements'; -import { ServiceError } from '@/lib/serviceError'; -import { ErrorCode } from '@/lib/errorCodes'; -import { StatusCodes } from 'http-status-codes'; - -const logger = createLogger('chat-utils'); - -// Thrown inside the attachment-commit transaction when the atomic claim matches -// fewer rows than expected (a concurrent send claimed one first), so the whole -// transaction rolls back and we can surface a typed 400. -class AttachmentClaimConflictError extends Error {} - -/** - * Returns a FORBIDDEN ServiceError when the deployment lacks the `ask` - * entitlement, or null when Ask is available. Gates the generative chat - * surfaces (message streaming, chat creation, sharing) server-side so the - * client gate can't be bypassed. - */ -export const checkAskEntitlement = async (): Promise => { - if (await hasEntitlement('ask')) { - return null; - } - return { - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS, - message: "Ask Sourcebot is not available in your current plan", - } satisfies ServiceError; -}; - -/** - * Checks if the current user (authenticated or anonymous) is the owner of a chat. - */ -export const isOwnerOfChat = async (chat: Chat, user: User | undefined): Promise => { - // Authenticated user owns the chat - if (user && chat.createdById === user.id) { - return true; - } - - // Only check the anonymous cookie for unclaimed chats (createdById === null). - // Once a chat has been claimed by an authenticated user, the anonymous path - // must not grant access — even if the same browser still holds the original cookie. - if (!chat.createdById && chat.anonymousCreatorId) { - const anonymousId = await getAnonymousId(); - if (anonymousId && chat.anonymousCreatorId === anonymousId) { - return true; - } - } - - return false; -}; - -/** - * Checks if a user has been explicitly shared access to a chat. - */ -export const isChatSharedWithUser = async ({ - prisma, chatId, userId, -}: { - prisma: PrismaClient; - chatId: string; - userId?: string; -}): Promise => { - if (!userId) { - return false; - } - - const share = await prisma.chatAccess.findUnique({ - where: { - chatId_userId: { - chatId, - userId, - }, - }, - }); - - return share !== null; -}; - -/** - * Resolves a (possibly anonymous) user's access to a chat. This is the single - * source of truth for the "can view this chat" rule, shared by `getChatInfo` - * and the attachment serving route so the two cannot drift: a PUBLIC chat is - * viewable by anyone in the org; a PRIVATE chat only by its owner or users it - * has been explicitly shared with. - */ -export const resolveChatAccess = async ({ - prisma, chat, user, -}: { - prisma: PrismaClient; - chat: Chat; - user: User | undefined; -}): Promise<{ isOwner: boolean; isSharedWithUser: boolean; canView: boolean }> => { - const isOwner = await isOwnerOfChat(chat, user); - const isSharedWithUser = await isChatSharedWithUser({ prisma, chatId: chat.id, userId: user?.id }); - const canView = chat.visibility !== ChatVisibility.PRIVATE || isOwner || isSharedWithUser; - return { isOwner, isSharedWithUser, canView }; -}; - -/** - * Verifies and commits the binary (blob) attachments referenced by the latest - * user message, then links them to the chat. Each referenced `attachmentId` - * must exist in this org, have been uploaded by this user, and still be - * `PENDING` (never trust client ids). Already-linked ids are treated as a - * no-op so re-sends / approval continuations are idempotent. On success the - * blobs are linked via `ChatAttachment` and flipped to `COMMITTED`. - * - * Returns a `ServiceError` to reject the request, or `null` when there is - * nothing to commit / the commit succeeded. - */ -export const commitMessageAttachments = async ({ - prisma, chatId, orgId, userId, message, -}: { - prisma: PrismaClient; - chatId: string; - orgId: number; - userId: string | undefined; - message: Pick | undefined; -}): Promise => { - if (!message) { - return null; - } - - const blobRefs = getUserMessageAttachments(message) - .filter((attachment): attachment is BlobAttachment => attachment.kind === 'blob'); - - if (blobRefs.length === 0) { - return null; - } - - // Authoritative per-message image cap (the client mirror can't be trusted). - if (blobRefs.length > ATTACHMENT_MAX_IMAGE_COUNT) { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_REQUEST_BODY, - message: `You can attach at most ${ATTACHMENT_MAX_IMAGE_COUNT} images per message.`, - } satisfies ServiceError; - } - - // Anonymous users cannot upload binary attachments, so a blob ref from an - // unauthenticated request can only be a forged/replayed id. - if (!userId) { - return { - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS, - message: 'Anonymous users cannot attach files.', - } satisfies ServiceError; - } - - const ids = [...new Set(blobRefs.map((ref) => ref.attachmentId))]; - - const [attachments, existingLinks] = await Promise.all([ - prisma.attachment.findMany({ where: { id: { in: ids }, orgId } }), - prisma.chatAttachment.findMany({ where: { chatId, attachmentId: { in: ids } } }), - ]); - - const attachmentById = new Map(attachments.map((attachment) => [attachment.id, attachment])); - const alreadyLinkedIds = new Set(existingLinks.map((link) => link.attachmentId)); - - const idsToCommit: string[] = []; - for (const id of ids) { - // Already linked to this chat (idempotent re-send): nothing to do. - if (alreadyLinkedIds.has(id)) { - continue; - } - - const attachment = attachmentById.get(id); - if ( - !attachment || - attachment.uploadedById !== userId || - attachment.status !== AttachmentStatus.PENDING - ) { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_REQUEST_BODY, - message: 'Invalid or unauthorized attachment reference.', - } satisfies ServiceError; - } - idsToCommit.push(id); - } - - if (idsToCommit.length > 0) { - try { - await prisma.$transaction(async (tx) => { - // Atomically claim the uploads: only rows still PENDING and owned - // by this user/org flip to COMMITTED. The pre-checks above can go - // stale, so if fewer rows match than we intend to commit, another - // send already claimed one — abort the whole commit. - const claimed = await tx.attachment.updateMany({ - where: { - id: { in: idsToCommit }, - orgId, - uploadedById: userId, - status: AttachmentStatus.PENDING, - }, - data: { status: AttachmentStatus.COMMITTED }, - }); - if (claimed.count !== idsToCommit.length) { - throw new AttachmentClaimConflictError(); - } - await tx.chatAttachment.createMany({ - data: idsToCommit.map((attachmentId) => ({ chatId, attachmentId })), - skipDuplicates: true, - }); - }); - } catch (error) { - if (error instanceof AttachmentClaimConflictError) { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_REQUEST_BODY, - message: 'Invalid or unauthorized attachment reference.', - } satisfies ServiceError; - } - throw error; - } - } - - return null; -}; - -/** - * Reclaims any of the given attachments that no longer have a `ChatAttachment` - * link, along with their stored bytes. Bytes are never removed by DB cascade, - * so this is the refcount-aware byte sweep invoked after a chat (and its links) - * is deleted. - * - * Uses the tombstone protocol so a transient storage error can never orphan - * bytes: an orphan is first atomically flipped to `DELETING` (the claim doubles - * as the concurrency guard — a row re-linked by a parallel duplicate-chat keeps - * a link and is skipped), then its bytes are deleted inline for low latency, and - * only then is the row removed. Any row whose byte delete fails is left - * `DELETING` for the backend pruner's reclaim sweep to retry. - */ -export const deleteOrphanedAttachments = async ({ - prisma, attachmentIds, -}: { - prisma: PrismaClient; - attachmentIds: string[]; -}): Promise => { - if (attachmentIds.length === 0) { - return; - } - - // Atomically claim the orphans (committed blobs left with zero links) by - // flipping them to DELETING. A row re-linked concurrently still has a link, - // so `chats: { none: {} }` excludes it and it survives untouched. - const claimed = await prisma.attachment.updateMany({ - where: { - id: { in: attachmentIds }, - status: AttachmentStatus.COMMITTED, - chats: { none: {} }, - }, - data: { status: AttachmentStatus.DELETING }, - }); - - if (claimed.count === 0) { - return; - } - - const tombstoned = await prisma.attachment.findMany({ - where: { id: { in: attachmentIds }, status: AttachmentStatus.DELETING }, - select: { id: true, storageKey: true }, - }); - - // Best-effort inline byte delete for low latency. Rows whose bytes are - // confirmed gone are removed now; the rest stay DELETING for the pruner. - const storage = getStorageBackend(); - const settled = await Promise.allSettled( - tombstoned.map((attachment) => storage.delete(attachment.storageKey))); - const reclaimedIds = tombstoned - .filter((_, index) => settled[index].status === 'fulfilled') - .map((attachment) => attachment.id); - - if (reclaimedIds.length > 0) { - await prisma.attachment.deleteMany({ - where: { id: { in: reclaimedIds }, status: AttachmentStatus.DELETING }, - }); - } -}; - -export const updateChatMessages = async ({ - prisma, chatId, messages, -}: { - prisma: PrismaClient; - chatId: string; - messages: SBChatMessage[]; -}) => { - await prisma.chat.update({ - where: { - id: chatId, - }, - data: { - messages: messages as unknown as Prisma.InputJsonValue, - }, - }); - - if (env.DEBUG_WRITE_CHAT_MESSAGES_TO_FILE) { - const chatDir = path.join(env.DATA_CACHE_DIR, 'chats'); - if (!fs.existsSync(chatDir)) { - fs.mkdirSync(chatDir, { recursive: true }); - } - - const chatFile = path.join(chatDir, `${chatId}.json`); - fs.writeFileSync(chatFile, JSON.stringify(messages, null, 2)); - } -}; - -/** - * Returns the full configuration of the language models. - * - * @warning this can contain sensitive information like environment - * variable names and base URLs. When passing information to the client, - * use getConfiguredLanguageModelsInfo instead. - */ -export const getConfiguredLanguageModels = async (): Promise => { - try { - const config = await loadConfig(env.CONFIG_PATH); - return config.models ?? []; - } catch (error) { - console.error('Failed to load language model configuration', error); - return []; - } -}; - -/** - * Returns the subset of information about the configured language models - * that we can safely send to the client. - */ -export const getConfiguredLanguageModelsInfo = async () => { - const models = await getConfiguredLanguageModels(); - return Promise.all(models.map(async (model): Promise => { - const { inputModalities, supportedDocumentTypes } = await resolveModelCapabilities(model); - return { - provider: model.provider, - model: model.model, - displayName: model.displayName, - inputModalities, - supportedDocumentTypes, - }; - })); -}; - -/** - * Eagerly warms the models.dev capability catalog at server startup so the first - * request after a cold start resolves real model capabilities instead of the - * text-only fallback. No-op when no language models are configured (avoids a - * gratuitous outbound call for deployments not using Ask). Best-effort and - * non-blocking: loadCatalog kicks off a background fetch and returns immediately, - * and any unexpected error is logged rather than surfaced. - */ -export const warmModelCapabilitiesCatalog = (): void => { - void (async () => { - const configuredModels = await getConfiguredLanguageModels(); - if (configuredModels.length === 0) { - return; - } - logger.info(`Warming models.dev capability catalog for ${configuredModels.length} configured language model(s)`); - void loadCatalog(); - })().catch((error) => { - logger.error(`Failed to warm models.dev capability catalog: ${error}`); - }); -}; diff --git a/packages/web/src/features/chat/utils.test.ts b/packages/web/src/features/chat/utils.test.ts deleted file mode 100644 index 4e73bbb24..000000000 --- a/packages/web/src/features/chat/utils.test.ts +++ /dev/null @@ -1,872 +0,0 @@ -import { expect, test, describe, vi } from 'vitest' -import { createUIMessage, fileReferenceToString, getAnswerPartFromAssistantMessage, getLastStepParts, getTurnProgressState, getUserMessageText, groupMessageIntoSteps, repairReferences, slateContentToString } from './utils' -import { FILE_REFERENCE_REGEX, ANSWER_TAG } from './constants'; -import { SBChatMessage, SBChatMessagePart } from './types'; -import type { Descendant } from 'slate'; - -// Mock the env module -vi.mock('@sourcebot/shared', () => ({ - env: { - SOURCEBOT_CHAT_FILE_MAX_CHARACTERS: 4000, - } -})); - -const createAssistantMessage = (parts: SBChatMessagePart[]): SBChatMessage => ({ - id: 'assistant-message', - role: 'assistant', - parts, -}); - -const createUserMessage = (): SBChatMessage => ({ - id: 'user-message', - role: 'user', - parts: [ - { - type: 'text', - text: 'Hello', - }, - ], -}); - -const dynamicApprovalRequestedPart = { - type: 'dynamic-tool', - toolName: 'mcp_linear__save_issue', - toolCallId: 'tool-call-1', - state: 'approval-requested', - input: { title: 'Issue' }, - approval: { id: 'approval-1' }, -} satisfies SBChatMessagePart; - -const dynamicApprovalRespondedPart = { - type: 'dynamic-tool', - toolName: 'mcp_linear__save_issue', - toolCallId: 'tool-call-1', - state: 'approval-responded', - input: { title: 'Issue' }, - approval: { id: 'approval-1', approved: true }, -} satisfies SBChatMessagePart; - -const listReposInput = { - sort: 'name', - page: 1, - perPage: 30, - direction: 'asc', -} as const; - -const listReposOutput = { - output: 'Done', - metadata: { - repos: [], - totalCount: 0, - }, -}; - -const staticApprovalRequestedPart = { - type: 'tool-list_repos', - toolCallId: 'tool-call-2', - state: 'approval-requested', - input: listReposInput, - approval: { id: 'approval-2' }, -} satisfies SBChatMessagePart; - -const staticApprovalRespondedPart = { - type: 'tool-list_repos', - toolCallId: 'tool-call-2', - state: 'approval-responded', - input: listReposInput, - approval: { id: 'approval-2', approved: true }, -} satisfies SBChatMessagePart; - -const outputAvailablePart = { - type: 'tool-list_repos', - toolCallId: 'tool-call-3', - state: 'output-available', - input: listReposInput, - output: listReposOutput, -} satisfies SBChatMessagePart; - -const outputErrorPart = { - type: 'tool-list_repos', - toolCallId: 'tool-call-5', - state: 'output-error', - input: listReposInput, - errorText: 'Tool failed', -} satisfies SBChatMessagePart; - -const inputAvailablePart = { - type: 'tool-list_repos', - toolCallId: 'tool-call-4', - state: 'input-available', - input: listReposInput, -} satisfies SBChatMessagePart; - - -test('fileReferenceToString formats file references correctly', () => { - expect(fileReferenceToString({ - repo: 'github.com/sourcebot-dev/sourcebot', - path: 'auth.ts' - })).toBe('@file:{github.com/sourcebot-dev/sourcebot::auth.ts}'); - - expect(fileReferenceToString({ - repo: 'github.com/sourcebot-dev/sourcebot', - path: 'auth.ts', - range: { - startLine: 45, - endLine: 60, - } - })).toBe('@file:{github.com/sourcebot-dev/sourcebot::auth.ts:45-60}'); -}); - -test('fileReferenceToString matches FILE_REFERENCE_REGEX', () => { - expect(FILE_REFERENCE_REGEX.test(fileReferenceToString({ - repo: 'github.com/sourcebot-dev/sourcebot', - path: 'auth.ts' - }))).toBe(true); - - FILE_REFERENCE_REGEX.lastIndex = 0; - expect(FILE_REFERENCE_REGEX.test(fileReferenceToString({ - repo: 'github.com/sourcebot-dev/sourcebot', - path: 'auth.ts', - range: { - startLine: 45, - endLine: 60, - } - }))).toBe(true); -}); - -test('fileReferenceToString matches FILE_REFERENCE_REGEX for repos with ports', () => { - const reference = fileReferenceToString({ - repo: 'git.example.com:8080/org/repo', - path: 'auth.ts', - range: { - startLine: 45, - endLine: 60, - }, - }); - - FILE_REFERENCE_REGEX.lastIndex = 0; - const match = FILE_REFERENCE_REGEX.exec(reference); - - expect(match).not.toBeNull(); - expect(match?.[1]).toBe('git.example.com:8080/org/repo'); - expect(match?.[2]).toBe(':8080'); - expect(match?.[3]).toBe('auth.ts'); - expect(match?.[4]).toBe('45'); - expect(match?.[5]).toBe('60'); -}); - -test('slateContentToString serializes command mentions as literal slash commands', () => { - const children = [{ - type: 'paragraph', - children: [ - { - type: 'mention', - data: { - type: 'command', - commandId: 'skill-1', - sourceId: 'personal-skill', - slug: 'review-pr', - name: 'Review PR', - }, - children: [{ text: '' }], - }, - { text: ' focus on auth changes' }, - ], - }] satisfies Descendant[]; - - expect(slateContentToString(children)).toBe('/review-pr focus on auth changes\n'); -}); - -test('slateContentToString separates command mentions from adjacent text without doubling spaces', () => { - const commandMention = { - type: 'mention' as const, - data: { - type: 'command' as const, - commandId: 'skill-1', - sourceId: 'personal-skill', - slug: 'review-pr', - name: 'Review PR', - }, - children: [{ text: '' }], - }; - - expect(slateContentToString([{ - type: 'paragraph', - children: [ - commandMention, - { text: 'focus on auth changes' }, - ], - }])).toBe('/review-pr focus on auth changes\n'); - - expect(slateContentToString([{ - type: 'paragraph', - children: [ - commandMention, - { text: ' focus on auth changes' }, - ], - }])).toBe('/review-pr focus on auth changes\n'); -}); - -test('groupMessageIntoSteps returns an empty array when there are no parts', () => { - const parts: SBChatMessagePart[] = [] - - const steps = groupMessageIntoSteps(parts); - - expect(steps).toEqual([]); -}); - -test('groupMessageIntoSteps returns a single group when there is only one step-start part', () => { - const parts: SBChatMessagePart[] = [ - { - type: 'step-start', - }, - { - type: 'text', - text: 'Hello, world!', - } - ] - - const steps = groupMessageIntoSteps(parts); - - expect(steps).toEqual([ - [ - { - type: 'step-start', - }, - { - type: 'text', - text: 'Hello, world!', - } - ] - ]); -}); - -test('groupMessageIntoSteps returns a multiple groups when there is multiple step-start parts', () => { - const parts: SBChatMessagePart[] = [ - { - type: 'step-start', - }, - { - type: 'text', - text: 'Hello, world!', - }, - { - type: 'step-start', - }, - { - type: 'text', - text: 'Ok lets go', - }, - ] - - const steps = groupMessageIntoSteps(parts); - - expect(steps).toEqual([ - [ - { - type: 'step-start', - }, - { - type: 'text', - text: 'Hello, world!', - } - ], - [ - { - type: 'step-start', - }, - { - type: 'text', - text: 'Ok lets go', - } - ] - ]); -}); - -test('groupMessageIntoSteps returns a single group when there is no step-start part', () => { - const parts: SBChatMessagePart[] = [ - { - type: 'text', - text: 'Hello, world!', - }, - { - type: 'text', - text: 'Ok lets go', - }, - ] - - const steps = groupMessageIntoSteps(parts); - - expect(steps).toEqual([ - [ - { - type: 'text', - text: 'Hello, world!', - }, - { - type: 'text', - text: 'Ok lets go', - } - ] - ]); -}); - -test('getLastStepParts returns the last grouped step', () => { - const parts: SBChatMessagePart[] = [ - { - type: 'step-start', - }, - { - type: 'text', - text: 'First step', - }, - { - type: 'step-start', - }, - { - type: 'text', - text: 'Last step', - }, - ]; - - const lastStep = getLastStepParts(parts); - - expect(lastStep).toEqual([ - { - type: 'step-start', - }, - { - type: 'text', - text: 'Last step', - }, - ]); -}); - -test('getTurnProgressState treats submitted and streaming as in progress and navigation guarded', () => { - expect(getTurnProgressState({ messages: [createUserMessage()], status: 'submitted' })).toMatchObject({ - isNetworkActive: true, - isTurnInProgress: true, - shouldGuardNavigation: true, - }); - expect(getTurnProgressState({ messages: [createUserMessage()], status: 'streaming' })).toMatchObject({ - isNetworkActive: true, - isTurnInProgress: true, - shouldGuardNavigation: true, - }); -}); - -test('getTurnProgressState returns idle for no messages and latest user message when ready', () => { - expect(getTurnProgressState({ messages: [], status: 'ready' })).toMatchObject({ - isNetworkActive: false, - isTurnInProgress: false, - shouldGuardNavigation: false, - }); - expect(getTurnProgressState({ messages: [createUserMessage()], status: 'ready' })).toMatchObject({ - isNetworkActive: false, - isTurnInProgress: false, - shouldGuardNavigation: false, - }); -}); - -test('getTurnProgressState treats latest-step approval-requested as awaiting approval but not navigation guarded', () => { - const message = createAssistantMessage([ - { - type: 'step-start', - }, - dynamicApprovalRequestedPart, - ]); - - expect(getTurnProgressState({ messages: [createUserMessage(), message], status: 'ready' })).toMatchObject({ - hasPendingToolApproval: true, - isAwaitingToolApproval: true, - isTurnInProgress: true, - shouldGuardNavigation: false, - }); -}); - -test('getTurnProgressState treats approval continuation readiness as in progress and navigation guarded', () => { - const message = createAssistantMessage([ - { - type: 'step-start', - }, - dynamicApprovalRespondedPart, - outputAvailablePart, - ]); - - expect(getTurnProgressState({ messages: [createUserMessage(), message], status: 'ready' })).toMatchObject({ - hasApprovalContinuationReady: true, - isAwaitingToolApproval: false, - isTurnInProgress: true, - shouldGuardNavigation: true, - }); -}); - -test('getTurnProgressState treats approval-responded and output-error as continuation-ready', () => { - const message = createAssistantMessage([ - { - type: 'step-start', - }, - dynamicApprovalRespondedPart, - outputErrorPart, - ]); - - expect(getTurnProgressState({ messages: [createUserMessage(), message], status: 'ready' })).toMatchObject({ - hasApprovalContinuationReady: true, - isTurnInProgress: true, - shouldGuardNavigation: true, - }); -}); - -test('getTurnProgressState does not treat a responded approval with non-terminal tools as continuation-ready', () => { - const message = createAssistantMessage([ - { - type: 'step-start', - }, - dynamicApprovalRespondedPart, - inputAvailablePart, - ]); - - expect(getTurnProgressState({ messages: [createUserMessage(), message], status: 'ready' })).toMatchObject({ - hasApprovalContinuationReady: false, - isTurnInProgress: false, - shouldGuardNavigation: false, - }); -}); - -test('getTurnProgressState does not keep terminal tool states in progress', () => { - const message = createAssistantMessage([ - { - type: 'step-start', - }, - outputAvailablePart, - ]); - - expect(getTurnProgressState({ messages: [createUserMessage(), message], status: 'ready' })).toMatchObject({ - hasPendingToolApproval: false, - hasApprovalContinuationReady: false, - isTurnInProgress: false, - }); -}); - -test('getTurnProgressState treats error as not in progress even with pending approval', () => { - const message = createAssistantMessage([ - { - type: 'step-start', - }, - dynamicApprovalRequestedPart, - ]); - - expect(getTurnProgressState({ messages: [createUserMessage(), message], status: 'error' })).toMatchObject({ - hasPendingToolApproval: true, - isTurnInProgress: false, - shouldGuardNavigation: false, - }); -}); - -test('getTurnProgressState ignores approvals in older messages and older steps', () => { - const olderMessage = createAssistantMessage([ - { - type: 'step-start', - }, - dynamicApprovalRequestedPart, - ]); - const latestMessage = createAssistantMessage([ - { - type: 'step-start', - }, - dynamicApprovalRequestedPart, - { - type: 'step-start', - }, - { - type: 'text', - text: 'Later step', - }, - ]); - - expect(getTurnProgressState({ messages: [createUserMessage(), olderMessage, createUserMessage()], status: 'ready' })).toMatchObject({ - isTurnInProgress: false, - }); - expect(getTurnProgressState({ messages: [createUserMessage(), latestMessage], status: 'ready' })).toMatchObject({ - isTurnInProgress: false, - }); -}); - -test('getTurnProgressState classifies dynamic and static tool approvals', () => { - expect(getTurnProgressState({ - messages: [createAssistantMessage([dynamicApprovalRequestedPart])], - status: 'ready', - })).toMatchObject({ - hasPendingToolApproval: true, - isAwaitingToolApproval: true, - }); - expect(getTurnProgressState({ - messages: [createAssistantMessage([staticApprovalRequestedPart])], - status: 'ready', - })).toMatchObject({ - hasPendingToolApproval: true, - isAwaitingToolApproval: true, - }); - expect(getTurnProgressState({ - messages: [createAssistantMessage([staticApprovalRespondedPart])], - status: 'ready', - })).toMatchObject({ - hasApprovalContinuationReady: true, - shouldGuardNavigation: true, - }); -}); - -test('getAnswerPartFromAssistantMessage returns text part when it starts with ANSWER_TAG while turn is complete', () => { - const message: SBChatMessage = { - role: 'assistant', - parts: [ - { - type: 'text', - text: 'Some initial text' - }, - { - type: 'text', - text: `${ANSWER_TAG}This is the answer to your question.` - } - ] - } as SBChatMessage; - - const result = getAnswerPartFromAssistantMessage(message, false); - - expect(result).toEqual({ - type: 'text', - text: `This is the answer to your question.` - }); -}); - -test('getAnswerPartFromAssistantMessage returns text part when it starts with ANSWER_TAG while turn is in progress', () => { - const message: SBChatMessage = { - role: 'assistant', - parts: [ - { - type: 'text', - text: 'Some initial text' - }, - { - type: 'text', - text: `${ANSWER_TAG}This is the answer to your question.` - } - ] - } as SBChatMessage; - - const result = getAnswerPartFromAssistantMessage(message, true); - - expect(result).toEqual({ - type: 'text', - text: `This is the answer to your question.` - }); -}); - -test('getAnswerPartFromAssistantMessage returns last text part as fallback when turn is complete and no ANSWER_TAG', () => { - const message: SBChatMessage = { - role: 'assistant', - parts: [ - { - type: 'text', - text: 'First text part' - }, - { - type: 'tool-call', - id: 'call-1', - name: 'search', - args: {} - }, - { - type: 'text', - text: 'This is the last text part without answer tag' - } - ] - } as SBChatMessage; - - const result = getAnswerPartFromAssistantMessage(message, false); - - expect(result).toEqual({ - type: 'text', - text: 'This is the last text part without answer tag' - }); -}); - -test('getAnswerPartFromAssistantMessage returns undefined when turn is in progress and no ANSWER_TAG', () => { - const message: SBChatMessage = { - role: 'assistant', - parts: [ - { - type: 'text', - text: 'Some text without answer tag' - }, - { - type: 'text', - text: 'Another text part' - } - ] - } as SBChatMessage; - - const result = getAnswerPartFromAssistantMessage(message, true); - - expect(result).toBeUndefined(); -}); - -describe('getUserMessageText', () => { - test('returns the text when the text part is first', () => { - const message: SBChatMessage = { - role: 'user', - parts: [ - { - type: 'text', - text: 'Hello, world!', - }, - ], - } as SBChatMessage; - - expect(getUserMessageText(message)).toBe('Hello, world!'); - }); - - test('returns the text when a non-text part precedes the text part', () => { - const message: SBChatMessage = { - role: 'user', - parts: [ - { - type: 'data-source', - data: { - type: 'file', - path: 'auth.ts', - repo: 'github.com/sourcebot-dev/sourcebot', - name: 'auth.ts', - revision: 'main', - }, - }, - { - type: 'text', - text: 'Explain this file', - }, - ], - } as SBChatMessage; - - expect(getUserMessageText(message)).toBe('Explain this file'); - }); - - test('returns an empty string when there is no text part', () => { - const message: SBChatMessage = { - role: 'user', - parts: [ - { - type: 'data-source', - data: { - type: 'file', - path: 'auth.ts', - repo: 'github.com/sourcebot-dev/sourcebot', - name: 'auth.ts', - revision: 'main', - }, - }, - ], - } as SBChatMessage; - - expect(getUserMessageText(message)).toBe(''); - }); - - test('returns an empty string when there are no parts', () => { - const message: SBChatMessage = { - role: 'user', - parts: [], - } as unknown as SBChatMessage; - - expect(getUserMessageText(message)).toBe(''); - }); -}); - -test('repairReferences fixes missing colon after @file', () => { - const input = 'See the function in @file{github.com/sourcebot-dev/sourcebot::auth.ts} for details.'; - const expected = 'See the function in @file:{github.com/sourcebot-dev/sourcebot::auth.ts} for details.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences fixes missing colon with range', () => { - const input = 'Check @file{github.com/sourcebot-dev/sourcebot::config.ts:15-20} for the configuration.'; - const expected = 'Check @file:{github.com/sourcebot-dev/sourcebot::config.ts:15-20} for the configuration.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences fixes missing braces around filename', () => { - const input = 'The logic is in @file:github.com/sourcebot-dev/sourcebot::utils.js and handles validation.'; - const expected = 'The logic is in @file:{github.com/sourcebot-dev/sourcebot::utils.js} and handles validation.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences fixes missing braces with path', () => { - const input = 'Look at @file:github.com/sourcebot-dev/sourcebot::src/components/Button.tsx for the component.'; - const expected = 'Look at @file:{github.com/sourcebot-dev/sourcebot::src/components/Button.tsx} for the component.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences removes multiple ranges keeping only first', () => { - const input = 'See @file:{github.com/sourcebot-dev/sourcebot::service.ts:10-15,20-25,30-35} for implementation.'; - const expected = 'See @file:{github.com/sourcebot-dev/sourcebot::service.ts:10-15} for implementation.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences fixes malformed triple number ranges', () => { - const input = 'Check @file:{github.com/sourcebot-dev/sourcebot::handler.ts:5-10-15} for the logic.'; - const expected = 'Check @file:{github.com/sourcebot-dev/sourcebot::handler.ts:5-10} for the logic.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences handles multiple citations in same text', () => { - const input = 'See @file{github.com/sourcebot-dev/sourcebot::auth.ts} and @file:github.com/sourcebot-dev/sourcebot::config.js for setup details.'; - const expected = 'See @file:{github.com/sourcebot-dev/sourcebot::auth.ts} and @file:{github.com/sourcebot-dev/sourcebot::config.js} for setup details.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences leaves correctly formatted citations unchanged', () => { - const input = 'The function @file:{github.com/sourcebot-dev/sourcebot::utils.ts:42-50} handles validation correctly.'; - expect(repairReferences(input)).toBe(input); -}); - -test('repairReferences handles edge cases with spaces and punctuation', () => { - const input = 'Functions like @file:github.com/sourcebot-dev/sourcebot::helper.ts, @file{github.com/sourcebot-dev/sourcebot::main.js}, and @file:{github.com/sourcebot-dev/sourcebot::app.ts:1-5,10-15} work.'; - const expected = 'Functions like @file:{github.com/sourcebot-dev/sourcebot::helper.ts}, @file:{github.com/sourcebot-dev/sourcebot::main.js}, and @file:{github.com/sourcebot-dev/sourcebot::app.ts:1-5} work.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences returns empty string unchanged', () => { - expect(repairReferences('')).toBe(''); -}); - -test('repairReferences returns text without citations unchanged', () => { - const input = 'This is just regular text without any file references.'; - expect(repairReferences(input)).toBe(input); -}); - -test('repairReferences handles complex file paths correctly', () => { - const input = 'Check @file:github.com/sourcebot-dev/sourcebot::src/components/ui/Button/index.tsx for implementation.'; - const expected = 'Check @file:{github.com/sourcebot-dev/sourcebot::src/components/ui/Button/index.tsx} for implementation.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences handles files with numbers and special characters', () => { - const input = 'See @file{github.com/sourcebot-dev/sourcebot::utils-v2.0.1.ts} and @file:github.com/sourcebot-dev/sourcebot::config_2024.json for setup.'; - const expected = 'See @file:{github.com/sourcebot-dev/sourcebot::utils-v2.0.1.ts} and @file:{github.com/sourcebot-dev/sourcebot::config_2024.json} for setup.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences handles citation at end of sentence', () => { - const input = 'The implementation is in @file:github.com/sourcebot-dev/sourcebot::helper.ts.'; - const expected = 'The implementation is in @file:{github.com/sourcebot-dev/sourcebot::helper.ts}.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences preserves already correct citations with ranges', () => { - const input = 'The function @file:{github.com/sourcebot-dev/sourcebot::utils.ts:10-20} and variable @file:{github.com/sourcebot-dev/sourcebot::config.js:5} work correctly.'; - expect(repairReferences(input)).toBe(input); -}); - -test('repairReferences handles extra closing parenthesis', () => { - const input = 'See @file:{github.com/sourcebot-dev/sourcebot::packages/web/src/auth.ts:5-6)} for details.'; - const expected = 'See @file:{github.com/sourcebot-dev/sourcebot::packages/web/src/auth.ts:5-6} for details.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences handles extra colon at end of range', () => { - const input = 'See @file:{github.com/sourcebot-dev/sourcebot::packages/web/src/auth.ts:5-6:} for details.'; - const expected = 'See @file:{github.com/sourcebot-dev/sourcebot::packages/web/src/auth.ts:5-6} for details.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences handles inline code blocks around file references', () => { - const input = 'See `@file:{github.com/sourcebot-dev/sourcebot::packages/web/src/auth.ts}` for details.'; - const expected = 'See @file:{github.com/sourcebot-dev/sourcebot::packages/web/src/auth.ts} for details.'; - expect(repairReferences(input)).toBe(expected); -}); - -test('repairReferences handles malformed inline code blocks', () => { - const input = 'See `@file:{github.com/sourcebot-dev/sourcebot::packages/web/src/auth.ts`} for details.'; - const expected = 'See @file:{github.com/sourcebot-dev/sourcebot::packages/web/src/auth.ts} for details.'; - expect(repairReferences(input)).toBe(expected); -}); - -describe('createUIMessage', () => { - test('includes disabledMcpServerIds in metadata when provided', () => { - const result = createUIMessage('hello', [], [], ['server1', 'server2']); - - expect(result.metadata?.disabledMcpServerIds).toEqual(['server1', 'server2']); - }); - - test('defaults disabledMcpServerIds to empty array when omitted', () => { - const result = createUIMessage('hello', [], []); - - expect(result.metadata?.disabledMcpServerIds).toEqual([]); - }); - - test('passes through empty array', () => { - const result = createUIMessage('hello', [], [], []); - - expect(result.metadata?.disabledMcpServerIds).toEqual([]); - }); - - test('includes both selectedSearchScopes and disabledMcpServerIds in metadata', () => { - const scopes = [{ type: 'repo' as const, value: 'org/repo', name: 'repo', codeHostType: 'github' }]; - const result = createUIMessage('hello', [], scopes, ['disabled1']); - - expect(result.metadata?.selectedSearchScopes).toEqual(scopes); - expect(result.metadata?.disabledMcpServerIds).toEqual(['disabled1']); - }); - - test('converts a leading command mention into command data', () => { - const result = createUIMessage('/review-pr src/auth/session.ts\n', [{ - type: 'command', - commandId: 'skill-1', - sourceId: 'personal-skill', - slug: 'review-pr', - name: 'Review PR', - }], [], []); - - expect(result.parts).toEqual([ - { - type: 'text', - text: '/review-pr src/auth/session.ts\n', - }, - { - type: 'data-command', - data: { - type: 'command', - commandId: 'skill-1', - sourceId: 'personal-skill', - slug: 'review-pr', - name: 'Review PR', - }, - }, - ]); - }); - - test('converts non-leading command mentions into command data', () => { - const result = createUIMessage('please /review-pr src/auth/session.ts', [{ - type: 'command', - commandId: 'skill-1', - sourceId: 'personal-skill', - slug: 'review-pr', - name: 'Review PR', - }], [], []); - - expect(result.parts).toEqual([ - { - type: 'text', - text: 'please /review-pr src/auth/session.ts', - }, - { - type: 'data-command', - data: { - type: 'command', - commandId: 'skill-1', - sourceId: 'personal-skill', - slug: 'review-pr', - name: 'Review PR', - }, - }, - ]); - }); -}); diff --git a/packages/web/src/features/chat/utils.ts b/packages/web/src/features/chat/utils.ts deleted file mode 100644 index 54f0f0e15..000000000 --- a/packages/web/src/features/chat/utils.ts +++ /dev/null @@ -1,522 +0,0 @@ -import { BrowseHighlightRange, getBrowsePath } from "@/app/(app)/browse/hooks/utils"; -import { CreateUIMessage, isToolUIPart, TextUIPart, UIMessagePart } from "ai"; -import type { ChatStatus, DynamicToolUIPart, ToolUIPart } from "ai"; -import { Descendant, Editor, Point, Range, Transforms } from "slate"; -import { createCommandInvocationData } from "./commands/utils"; -import { ANSWER_TAG, FILE_REFERENCE_PREFIX, FILE_REFERENCE_REGEX } from "./constants"; -import { - AttachmentData, - CustomEditor, - CustomText, - FileReference, - FileSource, - LanguageModelInfo, - MentionData, - MentionElement, - ParagraphElement, - SBChatMessage, - SBChatMessageDataParts, - SBChatMessagePart, - SBChatMessageToolTypes, - SearchScope, - Source, -} from "./types"; - -export type SBChatToolPart = (ToolUIPart | DynamicToolUIPart) & SBChatMessagePart; - -export const isSBChatToolPart = (part: SBChatMessagePart): part is SBChatToolPart => { - return isToolUIPart(part); -}; - -export const insertMention = (editor: CustomEditor, data: MentionData, target?: Range | null) => { - const mention: MentionElement = { - type: 'mention', - data, - children: [{ text: '' }], - } - - if (target) { - Transforms.select(editor, target) - } - - Transforms.insertNodes(editor, mention) - Transforms.move(editor) -} - -// @see: https://github.com/ianstormtaylor/slate/issues/4162#issuecomment-1127062098 -export function word( - editor: CustomEditor, - location: Range, - options: { - terminator?: string[] - include?: boolean - directions?: 'both' | 'left' | 'right' - } = {}, -): Range | undefined { - const { terminator = [' '], include = false, directions = 'both' } = options - - const { selection } = editor - if (!selection) return - - // Get start and end, modify it as we move along. - let [start, end] = Range.edges(location) - - let point: Point = start - - function move(direction: 'right' | 'left'): boolean { - const next = - direction === 'right' - ? Editor.after(editor, point, { - unit: 'character', - }) - : Editor.before(editor, point, { unit: 'character' }) - - const wordNext = - next && - Editor.string( - editor, - direction === 'right' ? { anchor: point, focus: next } : { anchor: next, focus: point }, - ) - - const last = wordNext && wordNext[direction === 'right' ? 0 : wordNext.length - 1] - if (next && last && !terminator.includes(last)) { - point = next - - if (point.offset === 0) { - // Means we've wrapped to beginning of another block - return false - } - } else { - return false - } - - return true - } - - // Move point and update start & end ranges - - // Move forwards - if (directions !== 'left') { - point = end - while (move('right')); - end = point - } - - // Move backwards - if (directions !== 'right') { - point = start - while (move('left')); - start = point - } - - if (include) { - return { - anchor: Editor.before(editor, start, { unit: 'offset' }) ?? start, - focus: Editor.after(editor, end, { unit: 'offset' }) ?? end, - } - } - - return { anchor: start, focus: end } -} - -export const isMentionElement = (element: Descendant): element is MentionElement => { - return 'type' in element && element.type === 'mention'; -} - -export const isCustomTextElement = (element: Descendant): element is CustomText => { - return 'text' in element && typeof element.text === 'string'; -} - -export const isParagraphElement = (element: Descendant): element is ParagraphElement => { - return 'type' in element && element.type === 'paragraph'; -} - -const commandMentionSeparator = (nextChild: Descendant | undefined) => { - if (nextChild && isCustomTextElement(nextChild) && /^\s/.test(nextChild.text)) { - return ""; - } - - return " "; -} - -export const slateContentToString = (children: Descendant[]): string => { - return children.map((child, index) => { - if (isCustomTextElement(child)) { - return child.text; - } - - else if (isMentionElement(child)) { - const { type } = child.data; - - switch (type) { - case 'file': - return `${fileReferenceToString({ repo: child.data.repo, path: child.data.path })} `; - case 'command': - return `/${child.data.slug}${commandMentionSeparator(children[index + 1])}`; - } - } - - else if (isParagraphElement(child)) { - return `${slateContentToString(child.children)}\n`; - } - - else { - return ""; - } - }).join(""); -} - -export const getAllMentionElements = (children: Descendant[]): MentionElement[] => { - return children.flatMap((child) => { - if (isCustomTextElement(child)) { - return []; - } - - if (isMentionElement(child)) { - return [child]; - } - - return getAllMentionElements(child.children); - }); -} - -export const clearEditorHistory = (editor: CustomEditor) => { - // slate-history exposes `history` publicly, but does not provide a clear API. - editor.history = { redos: [], undos: [] }; -} - -// @see: https://stackoverflow.com/a/74102147 -export const resetEditor = (editor: CustomEditor) => { - const point = { path: [0, 0], offset: 0 } - editor.selection = { anchor: point, focus: point }; - clearEditorHistory(editor); - editor.children = [{ - type: "paragraph", - children: [{ text: "" }] - }]; -} - -export const addLineNumbers = (source: string, lineOffset = 1) => { - return source.split('\n').map((line, index) => `${index + lineOffset}: ${line}`).join('\n'); -} - -export const createUIMessage = (text: string, mentions: MentionData[], selectedSearchScopes: SearchScope[], disabledMcpServerIds: string[] = [], attachments: AttachmentData[] = []): CreateUIMessage => { - // Converts applicable mentions into sources. - const sources: Source[] = mentions - .map((mention) => { - if (mention.type === 'file') { - const fileSource: FileSource = { - type: 'file', - path: mention.path, - repo: mention.repo, - name: mention.name, - revision: mention.revision, - } - return fileSource; - } - - return undefined; - }) - .filter((source) => source !== undefined); - const commandInvocation = createCommandInvocationData( - text, - mentions.filter((mention) => mention.type === 'command'), - ); - - return { - role: 'user', - parts: [ - { - type: 'text', - text, - }, - ...sources.map((data) => ({ - type: 'data-source', - data, - })) as UIMessagePart<{ source: Source }, SBChatMessageToolTypes>[], - ...attachments.map((data) => ({ - type: 'data-attachment', - data, - })) as UIMessagePart<{ attachment: AttachmentData }, SBChatMessageToolTypes>[], - ...(commandInvocation ? [{ - type: 'data-command', - data: commandInvocation, - }] as UIMessagePart[] : []), - ], - metadata: { - selectedSearchScopes, - disabledMcpServerIds, - }, - } -} - -export const getFileReferenceId = ({ repo, path, range }: Omit) => { - return `file-reference-${repo}::${path}${range ? `-${range.startLine}-${range.endLine}` : ''}`; -} - -export const fileReferenceToString = ({ repo, path, range }: Omit) => { - return `${FILE_REFERENCE_PREFIX}{${repo}::${path}${range ? `:${range.startLine}-${range.endLine}` : ''}}`; -} - -export const createFileReference = ({ repo, path, startLine, endLine }: { repo: string, path: string, startLine?: string, endLine?: string }): FileReference => { - const range = startLine && endLine ? { - startLine: parseInt(startLine), - endLine: parseInt(endLine), - } : startLine ? { - startLine: parseInt(startLine), - endLine: parseInt(startLine), - } : undefined; - - return { - type: 'file', - id: getFileReferenceId({ repo, path, range }), - repo, - path, - range, - } -} - -/** - * Converts LLM text that includes references (e.g., @file:...) into a portable - * Markdown format. Practically, this means converting references into Markdown - * links and removing the answer tag. - */ -export const convertLLMOutputToPortableMarkdown = (text: string, baseUrl: string, sources: FileSource[]): string => { - return text - .replace(ANSWER_TAG, '') - .replace(FILE_REFERENCE_REGEX, (_, repo, _port, fileName, startLine, endLine) => { - const reference = createFileReference({ - repo, - path: fileName, - startLine, - endLine - }); - - const source = tryResolveFileReference(reference, sources); - if (!source) { - return fileName; - } - - let linkText = source.name; - if (startLine) { - if (endLine && startLine !== endLine) { - linkText += `:${startLine}-${endLine}`; - } else { - linkText += `:${startLine}`; - } - } - - // Construct highlight range for line numbers - const highlightRange: BrowseHighlightRange | undefined = startLine ? { - start: { lineNumber: parseInt(startLine) }, - end: { lineNumber: parseInt(endLine || startLine) }, - } : undefined; - - // Construct full browse URL - const browsePath = getBrowsePath({ - repoName: repo, - revisionName: source.revision, - path: fileName, - pathType: 'blob', - highlightRange, - }); - - const fullUrl = `${baseUrl}${browsePath}`; - return `[${linkText}](${fullUrl})`; - }) - .trim(); -} - -// Groups message parts into groups based on step-start delimiters. -export const groupMessageIntoSteps = (parts: SBChatMessagePart[]) => { - if (!parts || parts.length === 0) { - return []; - } - - const steps: SBChatMessagePart[][] = []; - let currentStep: SBChatMessagePart[] = []; - - for (let i = 0; i < parts.length; i++) { - const part = parts[i]; - - if (part.type === 'step-start') { - if (currentStep.length > 0) { - steps.push([...currentStep]); - } - currentStep = [part]; - } else { - currentStep.push(part); - } - } - - if (currentStep.length > 0) { - steps.push(currentStep); - } - - return steps; -} - -export const getLastStepParts = (parts: SBChatMessagePart[]): SBChatMessagePart[] => { - return groupMessageIntoSteps(parts).at(-1) ?? parts; -} - -export const getTurnProgressState = ({ - messages, - status, -}: { - messages: SBChatMessage[]; - status: ChatStatus; -}) => { - const isNetworkActive = status === 'submitted' || status === 'streaming'; - const latestMessage = messages.at(-1); - const latestAssistantMessage = latestMessage?.role === 'assistant' ? latestMessage : undefined; - const latestStepToolParts = getLastStepParts(latestAssistantMessage?.parts ?? []) - .filter(isSBChatToolPart); - - const hasPendingToolApproval = latestStepToolParts.some( - (part) => part.state === 'approval-requested' - ); - const hasApprovalContinuationReady = - latestStepToolParts.some((part) => part.state === 'approval-responded') && - latestStepToolParts.every((part) => - part.state === 'output-available' || - part.state === 'output-error' || - part.state === 'approval-responded' - ); - - const isReady = status === 'ready'; - const isTurnInProgress = - isNetworkActive || - (isReady && (hasPendingToolApproval || hasApprovalContinuationReady)); - const isAwaitingToolApproval = isReady && hasPendingToolApproval; - const shouldGuardNavigation = isNetworkActive || (isReady && hasApprovalContinuationReady); - - return { - isNetworkActive, - hasPendingToolApproval, - hasApprovalContinuationReady, - isAwaitingToolApproval, - isTurnInProgress, - shouldGuardNavigation, - }; -} - -// LLMs like to not follow instructions... this takes care of some common mistakes they tend to make. -export const repairReferences = (text: string): string => { - return text - // Fix missing colon: @file{...} -> @file:{...} - .replace(/@file\{([^}]+)\}/g, '@file:{$1}') - // Fix missing braces: @file:filename -> @file:{filename} - .replace(/@file:([^\s{]\S*?)(\s|[,;!?](?:\s|$)|\.(?:\s|$)|$)/g, '@file:{$1}$2') - // Fix multiple ranges: keep only first range - .replace(/@file:\{(.+?):(\d+-\d+),[\d,-]+\}/g, '@file:{$1:$2}') - // Fix malformed ranges - .replace(/@file:\{(.+?):(\d+)-(\d+)-(\d+)\}/g, '@file:{$1:$2-$3}') - // Fix extra closing parenthesis: @file:{...)} -> @file:{...} - .replace(/@file:\{([^}]+)\)\}/g, '@file:{$1}') - // Fix extra colon at end: @file:{...range:} -> @file:{...range} - .replace(/@file:\{(.+?):(\d+(?:-\d+)?):?\}/g, '@file:{$1:$2}') - // Fix inline code blocks around file references: `@file:{...}` -> @file:{...} - .replace(/`(@file:\{[^}]+\})`/g, '$1') - // Fix malformed inline code blocks: `@file:{...`} -> @file:{...} - .replace(/`(@file:\{[^`]+)`\}/g, '$1}'); -}; - -// Extracts the user's text from a message by finding the first text part. -// User messages may contain non-text parts (e.g., file attachments), so we -// cannot assume the text is always at index 0. Accepts anything carrying -// `parts` so it works for both persisted and freshly created messages. -export const getUserMessageText = (message: Pick): string => { - return message.parts.find((part) => part.type === 'text')?.text ?? ''; -} - -// Extracts the inline-text attachments a user included with a message. -export const getUserMessageAttachments = (message: Pick): AttachmentData[] => { - return message.parts - .filter((part) => part.type === 'data-attachment') - .map((part) => part.data); -} - -// UTF-8 byte size of a message's inlined text (prompt + text-attachment bodies; -// image blobs are referenced by id, not inlined). Server-side counterpart to -// the chat box's `getSubmittedTextBytes` for enforcing the per-turn text budget. -export const getMessageTextBytes = (message: Pick): number => { - const encoder = new TextEncoder(); - const promptBytes = encoder.encode(getUserMessageText(message)).length; - const attachmentBytes = getUserMessageAttachments(message) - .filter((attachment) => attachment.kind === 'text') - .reduce((sum, attachment) => sum + encoder.encode(attachment.text).length, 0); - return promptBytes + attachmentBytes; -} - -// Neutralizes `
`/`` sequences in a body so it can't -// close its own wrapper early. Unrelated markup (e.g. `
`) is left intact. -const escapeAttachmentBody = (text: string): string => { - return text.replace(/<(\/attachments?>)/gi, '<$1'); -} - -// Formats a user message's text attachments into a delimited block to inline -// into the turn's content. Returns '' when there are none. Size is bounded at -// submit, so nothing is truncated here. -export const formatAttachmentsForPrompt = (attachments: AttachmentData[]): string => { - const textAttachments = attachments.filter((attachment) => attachment.kind === 'text'); - if (textAttachments.length === 0) { - return ''; - } - - const blocks = textAttachments.map((attachment) => { - const text = escapeAttachmentBody(attachment.text); - // Keep the filename on a single line and escape quotes so the body - // can't break out of the tag (the client also sanitizes via - // sanitizeFilename). - const filename = attachment.filename - .replace(/\s+/g, ' ') - .replace(/"/g, '"'); - return `\n${text}\n`; - }); - - return `\n${blocks.join('\n')}\n`; -} - -// Attempts to find the part of the assistant's message -// that contains the answer. -export const getAnswerPartFromAssistantMessage = (message: SBChatMessage, isTurnInProgress: boolean): TextUIPart | undefined => { - const lastTextPart = message.parts - .findLast((part) => part.type === 'text') - - if (lastTextPart?.text.includes(ANSWER_TAG)) { - const answerIndex = lastTextPart.text.indexOf(ANSWER_TAG); - const answer = lastTextPart.text.substring(answerIndex + ANSWER_TAG.length); - return { - ...lastTextPart, - text: answer - }; - } - - // If the agent did not include the answer tag, then fallback to using the last text part. - // Only do this when the turn is complete since the agent may still be thinking or waiting. - if (!isTurnInProgress && lastTextPart) { - return lastTextPart; - } - - return undefined; -} - -/** - * Generates a unique key for a language model. Accepts any object carrying the - * identifying fields, so both the full `LanguageModel` config and the - * client-safe `LanguageModelInfo` can be keyed with it. - */ -export const getLanguageModelKey = (model: Pick) => { - return `${model.provider}-${model.model}-${model.displayName}`; -} - -/** - * Given a file reference and a list of file sources, attempts to resolve the file source that the reference points to. - */ -export const tryResolveFileReference = (reference: FileReference, sources: FileSource[]): FileSource | undefined => { - return sources.find( - (source) => source.repo.endsWith(reference.repo) && - source.path.endsWith(reference.path) - ); -}; diff --git a/packages/web/src/features/codeNav/api.ts b/packages/web/src/features/codeNav/api.ts deleted file mode 100644 index 60a36ffd7..000000000 --- a/packages/web/src/features/codeNav/api.ts +++ /dev/null @@ -1,211 +0,0 @@ -import 'server-only'; - -import { sew } from "@/middleware/sew"; -import { search } from "@/features/search"; -import { ServiceError } from "@/lib/serviceError"; -import { isServiceError } from "@/lib/utils"; -import { withOptionalAuth } from "@/middleware/withAuth"; -import { SearchResponse } from "../search/types"; -import { FindRelatedSymbolsRequest, FindRelatedSymbolsResponse } from "./types"; -import { QueryIR } from '../search/ir'; -import escapeStringRegexp from "escape-string-regexp"; - -// The maximum number of matches to return from the search API. -const MAX_REFERENCE_COUNT = 1000; - -export const findSearchBasedSymbolReferences = async (props: FindRelatedSymbolsRequest): Promise => sew(() => - withOptionalAuth(async () => { - const { - symbolName, - language, - revisionName = "HEAD", - repoName, - } = props; - - const query: QueryIR = { - and: { - children: [ - { - regexp: { - regexp: `\\b${symbolName}\\b`, - case_sensitive: true, - file_name: false, - content: true, - } - }, - { - branch: { - pattern: revisionName, - exact: true, - } - }, - ...(language ? [getExpandedLanguageFilter(language)] : []), - ...(repoName ? [{ - repo: { - regexp: `^${escapeStringRegexp(repoName)}$`, - } - }]: []) - ] - } - } - - const searchResult = await search({ - queryType: 'ir', - query, - options: { - matches: MAX_REFERENCE_COUNT, - contextLines: 0, - }, - source: 'sourcebot-ui-codenav', - }); - - if (isServiceError(searchResult)) { - return searchResult; - } - - return parseRelatedSymbolsSearchResponse(searchResult); - })); - - -export const findSearchBasedSymbolDefinitions = async (props: FindRelatedSymbolsRequest): Promise => sew(() => - withOptionalAuth(async () => { - const { - symbolName, - language, - revisionName = "HEAD", - repoName - } = props; - - const query: QueryIR = { - and: { - children: [ - { - symbol: { - expr: { - regexp: { - regexp: `\\b${symbolName}\\b`, - case_sensitive: true, - file_name: false, - content: true, - } - }, - } - }, - { - branch: { - pattern: revisionName, - exact: true, - } - }, - ...(language ? [getExpandedLanguageFilter(language)] : []), - ...(repoName ? [{ - repo: { - regexp: `^${escapeStringRegexp(repoName)}$`, - } - }]: []) - ] - } - } - - const searchResult = await search({ - queryType: 'ir', - query, - options: { - matches: MAX_REFERENCE_COUNT, - contextLines: 0, - }, - source: 'sourcebot-ui-codenav', - }); - - if (isServiceError(searchResult)) { - return searchResult; - } - - return parseRelatedSymbolsSearchResponse(searchResult); - })); - -const parseRelatedSymbolsSearchResponse = (searchResult: SearchResponse): FindRelatedSymbolsResponse => { - return { - stats: { - matchCount: searchResult.stats.actualMatchCount, - }, - files: searchResult.files.flatMap((file) => { - const chunks = file.chunks; - - return { - fileName: file.fileName.text, - repository: file.repository, - repositoryId: file.repositoryId, - webUrl: file.webUrl, - language: file.language, - matches: chunks.flatMap((chunk) => { - return chunk.matchRanges.map((range) => ({ - lineContent: chunk.content, - range: range, - })) - }) - } - }).filter((file) => file.matches.length > 0), - repositoryInfo: searchResult.repositoryInfo - }; -} - -// Expands the language filter to include all variants of the language. -const getExpandedLanguageFilter = (language: string): QueryIR => { - switch (language) { - case "C": - case "C++": - return { - or: { - children: [ - { - language: { - language: "C++" - } - }, - { - language: { - language: "C" - } - } - ] - } - } - case "TypeScript": - case "JavaScript": - case "JSX": - case "TSX": - return { - or: { - children: [ - { - language: { - language: "TypeScript", - } - }, - { - language: { - language: "JavaScript", - } - }, - { - language: { - language: "JSX", - } - }, - { - language: { - language: "TSX", - } - }, - ] - }, - } - default: - return { - language: { - language: language, - }, - } - } -} \ No newline at end of file diff --git a/packages/web/src/features/codeNav/types.ts b/packages/web/src/features/codeNav/types.ts deleted file mode 100644 index 59fd7b22f..000000000 --- a/packages/web/src/features/codeNav/types.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { z } from "zod"; -import { rangeSchema, repositoryInfoSchema } from "../search/types"; - -export const findRelatedSymbolsRequestSchema = z.object({ - symbolName: z.string(), - language: z.string().optional(), - /** - * Optional revision name to scope search to. - * If not provided, the search will be scoped to HEAD. - */ - revisionName: z.string().optional(), - /** - * Optional repository name to scope search to. - * If not provided, the search will be across all repositories. - */ - repoName: z.string().optional(), -}); -export type FindRelatedSymbolsRequest = z.infer; - -export const findRelatedSymbolsResponseSchema = z.object({ - stats: z.object({ - matchCount: z.number(), - }), - files: z.array(z.object({ - fileName: z.string(), - repository: z.string(), - repositoryId: z.number(), - webUrl: z.string(), - language: z.string(), - matches: z.array(z.object({ - lineContent: z.string(), - range: rangeSchema, - })) - })), - repositoryInfo: z.array(repositoryInfoSchema), -}); - -export type FindRelatedSymbolsResponse = z.infer; diff --git a/packages/web/src/features/connections/actions.test.ts b/packages/web/src/features/connections/actions.test.ts deleted file mode 100644 index ff9325229..000000000 --- a/packages/web/src/features/connections/actions.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - authContext: undefined as unknown, - enqueue: vi.fn(), -})); - -const connectionQueue = { - name: 'connection-sync', -}; - -vi.mock('@/lib/bullmqClient', () => ({ - getBullMQClient: () => ({ enqueue: mocks.enqueue }), -})); -vi.mock('@/lib/serviceError', () => ({ - unexpectedError: (message: string) => ({ error: message }), -})); -vi.mock('@/middleware/sew', () => ({ - sew: (callback: () => unknown) => callback(), -})); -vi.mock('@/middleware/withAuth', () => ({ - withAuth: (callback: (context: unknown) => unknown) => - callback(mocks.authContext), -})); -vi.mock('@/middleware/withMinimumOrgRole', () => ({ - withMinimumOrgRole: ( - _role: unknown, - _minimumRole: unknown, - callback: () => unknown, - ) => callback(), -})); -vi.mock('@sourcebot/shared', () => ({ - CONNECTION_QUEUE: connectionQueue, - JOB_PRIORITIES: { INTERACTIVE: 1 }, -})); - -const { syncConnection } = await import('./actions'); - -beforeEach(() => { - vi.clearAllMocks(); - mocks.enqueue.mockResolvedValue('job-1'); -}); - -const setAuthContext = (findFirst: ReturnType) => { - mocks.authContext = { - org: { id: 1 }, - prisma: { connection: { findFirst } }, - role: 'OWNER', - }; -}; - -describe('syncConnection', () => { - test('enqueues an interactive sync for an existing connection', async () => { - const findFirst = vi.fn().mockResolvedValue({ id: 42 }); - setAuthContext(findFirst); - - await expect(syncConnection(42)).resolves.toEqual({ jobId: 'job-1' }); - - expect(findFirst).toHaveBeenCalledWith({ - where: { - id: 42, - orgId: 1, - }, - select: { - id: true, - }, - }); - expect(mocks.enqueue).toHaveBeenCalledWith( - connectionQueue, - { connectionId: 42 }, - { priority: 1 }, - ); - }); - - test('does not enqueue a sync for a missing connection', async () => { - setAuthContext(vi.fn().mockResolvedValue(null)); - - await expect(syncConnection(42)).resolves.toEqual({ - error: 'Failed to sync connection', - }); - expect(mocks.enqueue).not.toHaveBeenCalled(); - }); - - test('returns a service error when Redis rejects the job', async () => { - setAuthContext(vi.fn().mockResolvedValue({ id: 42 })); - mocks.enqueue.mockRejectedValue(new Error('Redis unavailable')); - - await expect(syncConnection(42)).resolves.toEqual({ - error: 'Failed to sync connection', - }); - }); -}); diff --git a/packages/web/src/features/connections/actions.ts b/packages/web/src/features/connections/actions.ts deleted file mode 100644 index d6563cf95..000000000 --- a/packages/web/src/features/connections/actions.ts +++ /dev/null @@ -1,40 +0,0 @@ -'use server'; - -import { getBullMQClient } from '@/lib/bullmqClient'; -import { unexpectedError } from '@/lib/serviceError'; -import { sew } from '@/middleware/sew'; -import { withAuth } from '@/middleware/withAuth'; -import { withMinimumOrgRole } from '@/middleware/withMinimumOrgRole'; -import { OrgRole } from '@sourcebot/db'; -import { CONNECTION_QUEUE, JOB_PRIORITIES } from '@sourcebot/shared'; - -export const syncConnection = async (connectionId: number) => sew(() => - withAuth(({ org, prisma, role }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - try { - const connection = await prisma.connection.findFirst({ - where: { - id: connectionId, - orgId: org.id, - }, - select: { - id: true, - }, - }); - if (!connection) { - return unexpectedError('Failed to sync connection'); - } - - const jobId = await getBullMQClient().enqueue( - CONNECTION_QUEUE, - { connectionId: connection.id }, - { priority: JOB_PRIORITIES.INTERACTIVE }, - ); - - return { jobId }; - } catch { - return unexpectedError('Failed to sync connection'); - } - }) - ) -); diff --git a/packages/web/src/features/connections/connectionSyncCounts.server.test.ts b/packages/web/src/features/connections/connectionSyncCounts.server.test.ts deleted file mode 100644 index 5fab08b9a..000000000 --- a/packages/web/src/features/connections/connectionSyncCounts.server.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import type { WorkloadJob } from "@sourcebot/shared"; -import { beforeEach, describe, expect, test, vi } from "vitest"; - -const mocks = vi.hoisted(() => { - const findMany = vi.fn(); - return { - findMany, - getJobs: vi.fn(), - prisma: { - connection: { findMany }, - }, - }; -}); - -vi.mock("server-only", () => ({})); -vi.mock("@/middleware/withAuth", () => ({ - withAuth: (fn: (context: unknown) => unknown) => fn({ - org: { id: 42 }, - prisma: mocks.prisma, - role: "OWNER", - }), -})); -vi.mock("@/lib/bullmqClient", () => ({ - getBullMQClient: () => ({ - getJobs: mocks.getJobs, - }), -})); - -const { getConnectionSyncCounts } = await import( - "./connectionSyncCounts.server" -); - -const job = ( - id: string, - connectionId: number, - status: WorkloadJob<"connection-sync">["status"], - result: WorkloadJob<"connection-sync">["result"] = null, -): WorkloadJob<"connection-sync"> => ({ - id, - data: { connectionId }, - status, - startedAt: null, - errorMessage: status === "FAILED" ? "sync failed" : null, - result, -}); - -beforeEach(() => { - vi.clearAllMocks(); -}); - -describe("getConnectionSyncCounts", () => { - test("classifies never-synced failures separately from warnings", async () => { - mocks.findMany.mockResolvedValue([ - { id: 1, syncedAt: null, latestSyncJobId: "failed-first-sync", firstSyncJobFinishedAt: new Date() }, - { id: 2, syncedAt: new Date(), latestSyncJobId: "failed-resync", firstSyncJobFinishedAt: new Date() }, - { id: 3, syncedAt: new Date(), latestSyncJobId: "partial-success", firstSyncJobFinishedAt: new Date() }, - { id: 4, syncedAt: new Date(), latestSyncJobId: "success", firstSyncJobFinishedAt: new Date() }, - { id: 5, syncedAt: null, latestSyncJobId: "mismatched-job", firstSyncJobFinishedAt: new Date() }, - { id: 6, syncedAt: null, latestSyncJobId: null, firstSyncJobFinishedAt: null }, - { id: 7, syncedAt: null, latestSyncJobId: "active-first-sync", firstSyncJobFinishedAt: null }, - ]); - mocks.getJobs.mockResolvedValue(new Map([ - ["failed-first-sync", job("failed-first-sync", 1, "FAILED")], - ["failed-resync", job("failed-resync", 2, "FAILED")], - ["partial-success", job( - "partial-success", - 3, - "COMPLETED", - { outcome: "PARTIAL_SUCCESS", reasons: [] }, - )], - ["success", job("success", 4, "COMPLETED", { outcome: "SUCCESS" })], - ["mismatched-job", job("mismatched-job", 999, "FAILED")], - ["active-first-sync", job("active-first-sync", 7, "IN_PROGRESS")], - ])); - - await expect(getConnectionSyncCounts()).resolves.toEqual({ - firstTimeSyncingCount: 2, - failedCount: 1, - warningCount: 2, - }); - expect(mocks.findMany).toHaveBeenCalledWith({ - where: { orgId: 42 }, - select: { - id: true, - syncedAt: true, - latestSyncJobId: true, - firstSyncJobFinishedAt: true, - }, - }); - expect(mocks.getJobs).toHaveBeenCalledWith( - expect.objectContaining({ name: "connection-sync" }), - [ - "failed-first-sync", - "failed-resync", - "partial-success", - "success", - "mismatched-job", - "active-first-sync", - ], - ); - }); -}); diff --git a/packages/web/src/features/connections/connectionSyncCounts.server.ts b/packages/web/src/features/connections/connectionSyncCounts.server.ts deleted file mode 100644 index 43239d377..000000000 --- a/packages/web/src/features/connections/connectionSyncCounts.server.ts +++ /dev/null @@ -1,67 +0,0 @@ -import "server-only"; - -import { getBullMQClient } from "@/lib/bullmqClient"; -import { withAuth } from "@/middleware/withAuth"; -import { withMinimumOrgRole } from "@/middleware/withMinimumOrgRole"; -import { OrgRole } from "@sourcebot/db"; -import { CONNECTION_QUEUE } from "@sourcebot/shared"; -import { cache } from "react"; - -export interface ConnectionSyncCounts { - firstTimeSyncingCount: number; - failedCount: number; - warningCount: number; -} - -export const getConnectionSyncCounts = cache(async () => - withAuth(({ org, prisma, role }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - const connections = await prisma.connection.findMany({ - where: { orgId: org.id }, - select: { - id: true, - syncedAt: true, - latestSyncJobId: true, - firstSyncJobFinishedAt: true, - }, - }); - const latestJobIds = connections.flatMap((connection) => - connection.latestSyncJobId ? [connection.latestSyncJobId] : [] - ); - const latestJobs = await getBullMQClient().getJobs( - CONNECTION_QUEUE, - latestJobIds, - ); - - return connections.reduce((counts, connection) => { - if ( - connection.syncedAt === null - && connection.firstSyncJobFinishedAt === null - ) { - counts.firstTimeSyncingCount += 1; - } - - const latestJob = connection.latestSyncJobId - ? latestJobs.get(connection.latestSyncJobId) - : null; - if (!latestJob || latestJob.data.connectionId !== connection.id) { - return counts; - } - - if (latestJob.status === "FAILED") { - if (connection.syncedAt) { - counts.warningCount += 1; - } else { - counts.failedCount += 1; - } - } else if ( - latestJob.status === "COMPLETED" - && latestJob.result?.outcome === "PARTIAL_SUCCESS" - ) { - counts.warningCount += 1; - } - - return counts; - }, { firstTimeSyncingCount: 0, failedCount: 0, warningCount: 0 }); - }) - )); diff --git a/packages/web/src/features/entitlements/planProvider.tsx b/packages/web/src/features/entitlements/planProvider.tsx deleted file mode 100644 index 9601aaa10..000000000 --- a/packages/web/src/features/entitlements/planProvider.tsx +++ /dev/null @@ -1,21 +0,0 @@ -'use client'; - -import { createContext } from "react"; -import { Entitlement } from "@sourcebot/shared"; - -export const PlanContext = createContext<{ entitlements: Entitlement[] }>({ entitlements: [] }); - -interface PlanProviderProps { - children: React.ReactNode; - entitlements: Entitlement[]; -} - -export const PlanProvider = ({ children, entitlements }: PlanProviderProps) => { - return ( - - {children} - - ) -}; diff --git a/packages/web/src/features/entitlements/useEntitlements.ts b/packages/web/src/features/entitlements/useEntitlements.ts deleted file mode 100644 index f30fc6ede..000000000 --- a/packages/web/src/features/entitlements/useEntitlements.ts +++ /dev/null @@ -1,9 +0,0 @@ -'use client'; - -import { useContext } from "react"; -import { PlanContext } from "./planProvider"; - -export const useEntitlements = () => { - const { entitlements } = useContext(PlanContext); - return entitlements; -} \ No newline at end of file diff --git a/packages/web/src/features/entitlements/useHasEntitlement.ts b/packages/web/src/features/entitlements/useHasEntitlement.ts deleted file mode 100644 index 622ac4a10..000000000 --- a/packages/web/src/features/entitlements/useHasEntitlement.ts +++ /dev/null @@ -1,10 +0,0 @@ -'use client'; - -import { Entitlement } from "@sourcebot/shared"; -import { useContext } from "react"; -import { PlanContext } from "./planProvider"; - -export const useHasEntitlement = (entitlement: Entitlement) => { - const { entitlements } = useContext(PlanContext); - return entitlements.includes(entitlement); -} \ No newline at end of file diff --git a/packages/web/src/features/git/dateUtils.test.ts b/packages/web/src/features/git/dateUtils.test.ts deleted file mode 100644 index a64a83c14..000000000 --- a/packages/web/src/features/git/dateUtils.test.ts +++ /dev/null @@ -1,379 +0,0 @@ -import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; -import { - parseTemporalDate, - validateDateRange, - toDbDate, - toGitDate, -} from './dateUtils'; - -describe('dateUtils', () => { - // Mock the current time for consistent testing - const MOCK_NOW = new Date('2024-06-15T12:00:00.000Z'); - - beforeEach(() => { - vi.useFakeTimers(); - vi.setSystemTime(MOCK_NOW); - }); - - afterEach(() => { - vi.useRealTimers(); - }); - - describe('parseTemporalDate', () => { - describe('ISO 8601 dates', () => { - it('should parse ISO date (YYYY-MM-DD)', () => { - const result = parseTemporalDate('2024-01-01'); - expect(result).toBe('2024-01-01T00:00:00.000Z'); - }); - - it('should parse ISO datetime with timezone', () => { - const result = parseTemporalDate('2024-01-01T12:30:00Z'); - expect(result).toBe('2024-01-01T12:30:00.000Z'); - }); - - it('should parse ISO datetime without timezone', () => { - const result = parseTemporalDate('2024-01-01T12:30:00'); - expect(result).toBeDefined(); - expect(result).toContain('2024-01-01'); - }); - - it('should return undefined for undefined input', () => { - const result = parseTemporalDate(undefined); - expect(result).toBeUndefined(); - }); - - it('should return undefined for empty string', () => { - const result = parseTemporalDate(''); - expect(result).toBeUndefined(); - }); - }); - - describe('relative dates - yesterday', () => { - it('should parse "yesterday"', () => { - const result = parseTemporalDate('yesterday'); - expect(result).toBe('2024-06-14T12:00:00.000Z'); - }); - - it('should parse "YESTERDAY" (case insensitive)', () => { - const result = parseTemporalDate('YESTERDAY'); - expect(result).toBe('2024-06-14T12:00:00.000Z'); - }); - }); - - describe('relative dates - N units ago', () => { - it('should parse "1 day ago"', () => { - const result = parseTemporalDate('1 day ago'); - expect(result).toBe('2024-06-14T12:00:00.000Z'); - }); - - it('should parse "30 days ago"', () => { - const result = parseTemporalDate('30 days ago'); - expect(result).toBe('2024-05-16T12:00:00.000Z'); - }); - - it('should parse "1 week ago"', () => { - const result = parseTemporalDate('1 week ago'); - expect(result).toBe('2024-06-08T12:00:00.000Z'); - }); - - it('should parse "2 weeks ago"', () => { - const result = parseTemporalDate('2 weeks ago'); - expect(result).toBe('2024-06-01T12:00:00.000Z'); - }); - - it('should parse "1 month ago"', () => { - const result = parseTemporalDate('1 month ago'); - expect(result).toBe('2024-05-15T12:00:00.000Z'); - }); - - it('should parse "3 months ago"', () => { - const result = parseTemporalDate('3 months ago'); - expect(result).toBe('2024-03-15T12:00:00.000Z'); - }); - - it('should parse "1 year ago"', () => { - const result = parseTemporalDate('1 year ago'); - expect(result).toBe('2023-06-15T12:00:00.000Z'); - }); - - it('should parse "2 hours ago"', () => { - const result = parseTemporalDate('2 hours ago'); - expect(result).toBe('2024-06-15T10:00:00.000Z'); - }); - - it('should parse "30 minutes ago"', () => { - const result = parseTemporalDate('30 minutes ago'); - expect(result).toBe('2024-06-15T11:30:00.000Z'); - }); - - it('should parse "45 seconds ago"', () => { - const result = parseTemporalDate('45 seconds ago'); - expect(result).toBe('2024-06-15T11:59:15.000Z'); - }); - - it('should handle singular "day" without "s"', () => { - const result = parseTemporalDate('1 day ago'); - expect(result).toBe('2024-06-14T12:00:00.000Z'); - }); - - it('should be case insensitive', () => { - const result = parseTemporalDate('30 DAYS AGO'); - expect(result).toBe('2024-05-16T12:00:00.000Z'); - }); - }); - - describe('relative dates - last unit', () => { - it('should parse "last week"', () => { - const result = parseTemporalDate('last week'); - expect(result).toBe('2024-06-08T12:00:00.000Z'); - }); - - it('should parse "last month"', () => { - const result = parseTemporalDate('last month'); - expect(result).toBe('2024-05-15T12:00:00.000Z'); - }); - - it('should parse "last year"', () => { - const result = parseTemporalDate('last year'); - expect(result).toBe('2023-06-15T12:00:00.000Z'); - }); - - it('should be case insensitive', () => { - const result = parseTemporalDate('LAST WEEK'); - expect(result).toBe('2024-06-08T12:00:00.000Z'); - }); - }); - - describe('invalid or unknown formats', () => { - it('should return original string for unrecognized format', () => { - const result = parseTemporalDate('some random string'); - expect(result).toBe('some random string'); - }); - - it('should return original string for git-specific formats', () => { - // Git understands these but our parser doesn't convert them - const result = parseTemporalDate('2 weeks 3 days ago'); - expect(result).toBe('2 weeks 3 days ago'); - }); - }); - }); - - describe('validateDateRange', () => { - it('should return null for valid date range', () => { - const error = validateDateRange('2024-01-01', '2024-12-31'); - expect(error).toBeNull(); - }); - - it('should return null when only since is provided', () => { - const error = validateDateRange('2024-01-01', undefined); - expect(error).toBeNull(); - }); - - it('should return null when only until is provided', () => { - const error = validateDateRange(undefined, '2024-12-31'); - expect(error).toBeNull(); - }); - - it('should return null when both are undefined', () => { - const error = validateDateRange(undefined, undefined); - expect(error).toBeNull(); - }); - - it('should return error when since > until', () => { - const error = validateDateRange('2024-12-31', '2024-01-01'); - expect(error).toContain('since'); - expect(error).toContain('until'); - expect(error).toContain('before'); - }); - - it('should validate relative dates', () => { - const error = validateDateRange('30 days ago', '1 day ago'); - expect(error).toBeNull(); - }); - - it('should return error for invalid relative date range', () => { - const error = validateDateRange('1 day ago', '30 days ago'); - expect(error).toContain('since'); - expect(error).toContain('until'); - }); - - it('should handle mixed ISO and relative dates', () => { - const error = validateDateRange('2024-01-01', '30 days ago'); - expect(error).toBeNull(); // 2024-01-01 is before 30 days ago - }); - - it('should return null for same date', () => { - const error = validateDateRange('2024-06-15', '2024-06-15'); - expect(error).toBeNull(); - }); - }); - - describe('toDbDate', () => { - it('should convert ISO date to Date object', () => { - const result = toDbDate('2024-01-01'); - expect(result).toBeInstanceOf(Date); - expect(result?.toISOString()).toBe('2024-01-01T00:00:00.000Z'); - }); - - it('should convert relative date to Date object', () => { - const result = toDbDate('30 days ago'); - expect(result).toBeInstanceOf(Date); - expect(result?.toISOString()).toBe('2024-05-16T12:00:00.000Z'); - }); - - it('should return undefined for undefined input', () => { - const result = toDbDate(undefined); - expect(result).toBeUndefined(); - }); - - it('should return undefined for empty string', () => { - const result = toDbDate(''); - expect(result).toBeUndefined(); - }); - - it('should handle "yesterday"', () => { - const result = toDbDate('yesterday'); - expect(result).toBeInstanceOf(Date); - expect(result?.toISOString()).toBe('2024-06-14T12:00:00.000Z'); - }); - - it('should handle "last week"', () => { - const result = toDbDate('last week'); - expect(result).toBeInstanceOf(Date); - expect(result?.toISOString()).toBe('2024-06-08T12:00:00.000Z'); - }); - }); - - describe('toGitDate', () => { - it('should preserve ISO date format', () => { - const result = toGitDate('2024-01-01'); - expect(result).toBe('2024-01-01'); - }); - - it('should preserve ISO datetime format', () => { - const result = toGitDate('2024-01-01T12:30:00Z'); - expect(result).toBe('2024-01-01T12:30:00Z'); - }); - - it('should preserve "N days ago" format', () => { - const result = toGitDate('30 days ago'); - expect(result).toBe('30 days ago'); - }); - - it('should preserve "yesterday" format', () => { - const result = toGitDate('yesterday'); - expect(result).toBe('yesterday'); - }); - - it('should preserve "last week" format', () => { - const result = toGitDate('last week'); - expect(result).toBe('last week'); - }); - - it('should preserve "last month" format', () => { - const result = toGitDate('last month'); - expect(result).toBe('last month'); - }); - - it('should preserve "last year" format', () => { - const result = toGitDate('last year'); - expect(result).toBe('last year'); - }); - - it('should return undefined for undefined input', () => { - const result = toGitDate(undefined); - expect(result).toBeUndefined(); - }); - - it('should pass through unrecognized format unchanged', () => { - // For formats git doesn't natively understand, pass through to git - const result = toGitDate('some random string'); - expect(result).toBe('some random string'); - }); - - it('should preserve relative time formats', () => { - const result = toGitDate('2 weeks ago'); - expect(result).toBe('2 weeks ago'); - }); - }); - - describe('edge cases', () => { - it('should handle dates at month boundaries', () => { - vi.setSystemTime(new Date('2024-03-31T12:00:00.000Z')); - const result = parseTemporalDate('1 month ago'); - // JavaScript Date handles month rollover - expect(result).toBeDefined(); - }); - - it('should handle dates at year boundaries', () => { - vi.setSystemTime(new Date('2024-01-15T12:00:00.000Z')); - const result = parseTemporalDate('1 month ago'); - expect(result).toBe('2023-12-15T12:00:00.000Z'); - }); - - it('should handle leap year February', () => { - vi.setSystemTime(new Date('2024-03-01T12:00:00.000Z')); - const result = parseTemporalDate('1 month ago'); - expect(result).toBe('2024-02-01T12:00:00.000Z'); - }); - - it('should handle midnight times', () => { - vi.setSystemTime(new Date('2024-06-15T00:00:00.000Z')); - const result = parseTemporalDate('1 day ago'); - expect(result).toBe('2024-06-14T00:00:00.000Z'); - }); - - it('should handle end of day times', () => { - vi.setSystemTime(new Date('2024-06-15T23:59:59.999Z')); - const result = parseTemporalDate('1 day ago'); - expect(result).toBe('2024-06-14T23:59:59.999Z'); - }); - }); - - describe('integration scenarios', () => { - it('should correctly validate a typical user query range', () => { - const since = '30 days ago'; - const until = 'yesterday'; - - const parsedSince = parseTemporalDate(since); - const parsedUntil = parseTemporalDate(until); - const validationError = validateDateRange(since, until); - - expect(parsedSince).toBe('2024-05-16T12:00:00.000Z'); - expect(parsedUntil).toBe('2024-06-14T12:00:00.000Z'); - expect(validationError).toBeNull(); - }); - - it('should correctly convert for database queries', () => { - const since = '7 days ago'; - const until = 'yesterday'; - - const dbSince = toDbDate(since); - const dbUntil = toDbDate(until); - - expect(dbSince).toBeInstanceOf(Date); - expect(dbUntil).toBeInstanceOf(Date); - expect(dbSince!.getTime()).toBeLessThan(dbUntil!.getTime()); - }); - - it('should correctly preserve for git commands', () => { - const since = '30 days ago'; - const until = 'yesterday'; - - const gitSince = toGitDate(since); - const gitUntil = toGitDate(until); - - // Git natively understands these, so they're preserved - expect(gitSince).toBe('30 days ago'); - expect(gitUntil).toBe('yesterday'); - }); - - it('should handle mixed ISO and relative dates in range validation', () => { - const since = '2024-01-01'; - const until = '7 days ago'; - - const validationError = validateDateRange(since, until); - expect(validationError).toBeNull(); - }); - }); -}); diff --git a/packages/web/src/features/git/dateUtils.ts b/packages/web/src/features/git/dateUtils.ts deleted file mode 100644 index f28e9a5bd..000000000 --- a/packages/web/src/features/git/dateUtils.ts +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Utilities for parsing and validating date parameters for temporal queries. - * Supports both absolute (ISO 8601) and relative date formats. - */ - -/** - * Parse a date string that can be either: - * - ISO 8601 format (e.g., "2024-01-01", "2024-01-01T12:00:00Z") - * - Relative format (e.g., "30 days ago", "1 week ago", "yesterday", "last week") - * - * @param dateStr - The date string to parse - * @returns ISO 8601 string if successfully parsed, original string if not parseable (to allow git to try), or undefined if input is falsy - * - * @example - * parseTemporalDate('2024-01-01') // '2024-01-01T00:00:00.000Z' - * parseTemporalDate('30 days ago') // Calculates and returns ISO string - * parseTemporalDate('yesterday') // Yesterday's date as ISO string - * parseTemporalDate('some-git-format') // 'some-git-format' (passed through) - * parseTemporalDate(undefined) // undefined - */ -export function parseTemporalDate(dateStr: string | undefined): string | undefined { - if (!dateStr) { - return undefined; - } - - // Try parsing as ISO date first - const isoDate = new Date(dateStr); - if (!isNaN(isoDate.getTime())) { - return isoDate.toISOString(); - } - - // Parse relative dates (Git-compatible format) - // Git accepts these natively, but we normalize to ISO for consistency - const lowerStr = dateStr.toLowerCase().trim(); - - // Handle "yesterday" - if (lowerStr === 'yesterday') { - const date = new Date(); - date.setDate(date.getDate() - 1); - return date.toISOString(); - } - - // Handle "N s ago" format - const matchRelative = lowerStr.match(/^(\d+)\s+(second|minute|hour|day|week|month|year)s?\s+ago$/i); - if (matchRelative) { - const amount = parseInt(matchRelative[1]); - const unit = matchRelative[2].toLowerCase(); - const date = new Date(); - - switch (unit) { - case 'second': - date.setSeconds(date.getSeconds() - amount); - break; - case 'minute': - date.setMinutes(date.getMinutes() - amount); - break; - case 'hour': - date.setHours(date.getHours() - amount); - break; - case 'day': - date.setDate(date.getDate() - amount); - break; - case 'week': - date.setDate(date.getDate() - (amount * 7)); - break; - case 'month': - date.setMonth(date.getMonth() - amount); - break; - case 'year': - date.setFullYear(date.getFullYear() - amount); - break; - } - - return date.toISOString(); - } - - // Handle "last " format - const matchLast = lowerStr.match(/^last\s+(week|month|year)$/i); - if (matchLast) { - const unit = matchLast[1].toLowerCase(); - const date = new Date(); - - switch (unit) { - case 'week': - date.setDate(date.getDate() - 7); - break; - case 'month': - date.setMonth(date.getMonth() - 1); - break; - case 'year': - date.setFullYear(date.getFullYear() - 1); - break; - } - - return date.toISOString(); - } - - // If we can't parse it, return the original string - // This allows git log to try parsing it with its own logic - return dateStr; -} - -/** - * Validate that a date range is consistent (since < until). - * - * @param since - Start date (inclusive) - * @param until - End date (inclusive) - * @returns Error message if invalid, null if valid - */ -export function validateDateRange(since: string | undefined, until: string | undefined): string | null { - if (!since || !until) { - return null; // No validation needed if either is missing - } - - const parsedSince = parseTemporalDate(since); - const parsedUntil = parseTemporalDate(until); - - if (!parsedSince || !parsedUntil) { - return null; // Let individual date parsing handle invalid formats - } - - const sinceDate = new Date(parsedSince); - const untilDate = new Date(parsedUntil); - - if (isNaN(sinceDate.getTime()) || isNaN(untilDate.getTime())) { - return null; - } - - if (sinceDate > untilDate) { - return `Invalid date range: 'since' (${since}) must be before 'until' (${until})`; - } - - return null; -} - -/** - * Convert a date to a format suitable for Prisma database queries. - * Returns a Date object or undefined. - * - * @param dateStr - The date string to convert - * @returns Date object or undefined - */ -export function toDbDate(dateStr: string | undefined): Date | undefined { - if (!dateStr) { - return undefined; - } - - const parsed = parseTemporalDate(dateStr); - if (!parsed) { - return undefined; - } - - const date = new Date(parsed); - return isNaN(date.getTime()) ? undefined : date; -} - -/** - * Convert a date to a format suitable for git log commands. - * Git accepts relative formats directly, so we preserve them when possible. - * - * @param dateStr - The date string to convert - * @returns Git-compatible date string or undefined - */ -export function toGitDate(dateStr: string | undefined): string | undefined { - if (!dateStr) { - return undefined; - } - - // Git natively understands these formats, so preserve them - const gitNativeFormats = [ - /^\d+\s+(second|minute|hour|day|week|month|year)s?\s+ago$/i, - /^yesterday$/i, - /^last\s+(week|month|year)$/i, - /^\d{4}-\d{2}-\d{2}$/, // ISO date - /^\d{4}-\d{2}-\d{2}T/, // ISO datetime - ]; - - for (const pattern of gitNativeFormats) { - if (pattern.test(dateStr)) { - return dateStr; // Git can handle this directly - } - } - - // Otherwise, parse and convert to ISO - return parseTemporalDate(dateStr); -} diff --git a/packages/web/src/features/git/getCommitApi.ts b/packages/web/src/features/git/getCommitApi.ts deleted file mode 100644 index 5e4843629..000000000 --- a/packages/web/src/features/git/getCommitApi.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { invalidGitRef, notFound, ServiceError, unexpectedError } from '@/lib/serviceError'; -import { withOptionalAuth } from '@/middleware/withAuth'; -import { getRepoPath } from '@sourcebot/shared'; -import { z } from 'zod'; -import { simpleGit } from 'simple-git'; -import { commitDetailSchema } from './schemas'; -import { isGitRefValid } from './utils'; - -export type CommitDetail = z.infer; - -type GetCommitRequest = { - repo: string; - ref: string; -} - -// Field separator that won't appear in commit data -const FIELD_SEP = '\x1f'; -const FORMAT = [ - '%H', // hash - '%aI', // author date ISO 8601 - '%s', // subject - '%D', // refs - '%b', // body - '%aN', // author name - '%aE', // author email - '%P', // parent hashes (space-separated) -].join(FIELD_SEP); - -export const getCommit = async ({ - repo: repoName, - ref, -}: GetCommitRequest): Promise => sew(() => - withOptionalAuth(async ({ org, prisma }) => { - const repo = await prisma.repo.findFirst({ - where: { - name: repoName, - orgId: org.id, - }, - }); - - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - if (!isGitRefValid(ref)) { - return invalidGitRef(ref); - } - - const { path: repoPath } = getRepoPath(repo); - const git = simpleGit().cwd(repoPath); - - try { - const output = (await git.raw([ - 'log', - '-1', - `--format=${FORMAT}`, - ref, - ])).trim(); - - const fields = output.split(FIELD_SEP); - if (fields.length < 8) { - return unexpectedError(`Failed to parse commit data for revision "${ref}".`); - } - - const [hash, date, message, refs, body, authorName, authorEmail, parentStr] = fields; - const parents = parentStr.trim() === '' ? [] : parentStr.trim().split(' '); - - return { - hash, - date, - message, - refs, - body, - authorName, - authorEmail, - parents, - }; - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - - if (errorMessage.includes('not a git repository')) { - return unexpectedError( - `Invalid git repository at ${repoPath}. ` + - `The directory exists but is not a valid git repository.` - ); - } - - if (errorMessage.includes('unknown revision') || errorMessage.includes('bad object')) { - return notFound(`Revision "${ref}" not found in repository "${repoName}".`); - } - - if (error instanceof Error) { - throw new Error( - `Failed to get commit in repository ${repoName}: ${error.message}` - ); - } else { - throw new Error( - `Failed to get commit in repository ${repoName}: ${errorMessage}` - ); - } - } - })); diff --git a/packages/web/src/features/git/getDiffApi.ts b/packages/web/src/features/git/getDiffApi.ts deleted file mode 100644 index 343920a95..000000000 --- a/packages/web/src/features/git/getDiffApi.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { invalidGitRef, notFound, ServiceError, unexpectedError } from '@/lib/serviceError'; -import { withOptionalAuth } from '@/middleware/withAuth'; -import { getRepoPath } from '@sourcebot/shared'; -import parseDiff from 'parse-diff'; -import { simpleGit } from 'simple-git'; -import { isGitRefValid } from './utils'; - -export interface HunkRange { - start: number; - lines: number; -} - -export interface DiffHunk { - oldRange: HunkRange; - newRange: HunkRange; - heading?: string; - body: string; -} - -export interface FileDiff { - oldPath: string | null; - newPath: string | null; - hunks: DiffHunk[]; -} - -export interface GetDiffResult { - files: FileDiff[]; -} - -type GetDiffRequest = { - repo: string; - base: string; - head: string; - path?: string; -} - -export const getDiff = async ({ - repo: repoName, - base, - head, - path, -}: GetDiffRequest): Promise => sew(() => - withOptionalAuth(async ({ org, prisma }) => { - if (!isGitRefValid(base)) { - return invalidGitRef(base); - } - - if (!isGitRefValid(head)) { - return invalidGitRef(head); - } - - const repo = await prisma.repo.findFirst({ - where: { - name: repoName, - orgId: org.id, - }, - }); - - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - const { path: repoPath } = getRepoPath(repo); - const git = simpleGit().cwd(repoPath); - - try { - const diffArgs: string[] = ['diff', base, head]; - // The `--` pathspec separator both restricts the diff to the path - // and prevents anything path-shaped from being interpreted as a - // flag or ref by git. - if (path) { - diffArgs.push('--', path); - } - - const rawDiff = await git.raw(diffArgs); - const files = parseDiff(rawDiff); - - const nodes: FileDiff[] = files.map((file) => ({ - oldPath: file.from && file.from !== '/dev/null' ? file.from : null, - newPath: file.to && file.to !== '/dev/null' ? file.to : null, - hunks: file.chunks.map((chunk) => { - // chunk.content is the full @@ header line, e.g.: - // "@@ -7,6 +7,8 @@ some heading text" - // The heading is the optional text after the second @@. - const headingMatch = chunk.content.match(/^@@ .+ @@ (.+)$/); - const heading = headingMatch ? headingMatch[1].trim() : undefined; - - return { - oldRange: { start: chunk.oldStart, lines: chunk.oldLines }, - newRange: { start: chunk.newStart, lines: chunk.newLines }, - heading, - body: chunk.changes.map((change) => change.content).join('\n'), - }; - }), - })); - - return { - files: nodes, - }; - } catch (error: unknown) { - const message = error instanceof Error ? error.message : String(error); - - if (message.includes('unknown revision') || message.includes('bad revision')) { - return invalidGitRef(`${base}..${head}`); - } - - return unexpectedError(`Failed to compute diff for ${repoName}: ${message}`); - } - })); diff --git a/packages/web/src/features/git/getFileBlameApi.ts b/packages/web/src/features/git/getFileBlameApi.ts deleted file mode 100644 index f922bd3f6..000000000 --- a/packages/web/src/features/git/getFileBlameApi.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { ServiceError, notFound, fileNotFound, invalidGitRef, unresolvedGitRef, unexpectedError } from '@/lib/serviceError'; -import { withOptionalAuth } from '@/middleware/withAuth'; -import { getRepoPath } from '@sourcebot/shared'; -import { headers } from 'next/headers'; -import { simpleGit } from 'simple-git'; -import type z from 'zod'; -import { isGitRefValid, isPathValid } from './utils'; -import { fileBlameRequestSchema, fileBlameResponseSchema } from './schemas'; -import { createAudit } from "@/ee/features/audit/audit"; - -export { fileBlameRequestSchema, fileBlameResponseSchema } from './schemas'; -export type FileBlameRequest = z.infer; -export type FileBlameResponse = z.infer; - -type CommitMeta = FileBlameResponse['commits'][string]; - -/** - * Parses `git blame --porcelain` output into ranges and deduplicated commit metadata. - * - * Format reference: each blamed line produces an entry of the form - * - * [] (4-field header → first line of a group) - * [author (metadata block, emitted only on - * author-mail <> the first global appearance of a - * author-time commit; subsequent groups for the - * author-tz <+/-HHMM> same commit are header-only. With - * committer ... -C/-M, `filename` may be re-emitted - * summary if it differs from the prior value.) - * previous (optional) - * filename ] - * \t - * - * Within a contiguous group of lines from the same commit, only the first line's - * header carries ``; subsequent lines have a 3-field header. We detect - * group boundaries via the presence of `` and emit one range per group. - * - * Because `filename` is emitted per-commit (not per-group), we cache it in - * `filenameByHash` and look it up when pushing a range. - */ -const parsePorcelainBlame = (output: string): FileBlameResponse => { - const ranges: FileBlameResponse['ranges'] = []; - const commits: Record = {}; - const filenameByHash = new Map(); - - if (output.length === 0) { - return { ranges, commits }; - } - - const rawLines = output.split('\n'); - let i = 0; - - while (i < rawLines.length) { - const headerLine = rawLines[i]; - if (headerLine.length === 0) { - i++; - continue; - } - - const headerParts = headerLine.split(' '); - const hash = headerParts[0]; - const finalLine = parseInt(headerParts[2], 10); - if (!hash || Number.isNaN(finalLine)) { - throw new Error(`Malformed git blame porcelain header: "${headerLine}"`); - } - - // Group-start headers carry a 4th field with the group size; intra-group - // continuation headers have only 3 fields and don't start a new range. - const isGroupStart = headerParts.length >= 4; - const lineCount = isGroupStart ? parseInt(headerParts[3], 10) : NaN; - if (isGroupStart && Number.isNaN(lineCount)) { - throw new Error(`Malformed git blame porcelain header (bad num-lines): "${headerLine}"`); - } - - i++; - - // Metadata lines may appear after any header but only the first time we - // see a given commit. Accumulate whatever's there until the "\t" - // sentinel; for continuation lines this loop usually exits immediately. - let authorName: string | undefined; - let authorMail: string | undefined; - let date: string | undefined; - let message: string | undefined; - let previous: CommitMeta['previous'] | undefined; - - while (i < rawLines.length && !rawLines[i].startsWith('\t')) { - const fieldLine = rawLines[i]; - const spaceIdx = fieldLine.indexOf(' '); - const key = spaceIdx === -1 ? fieldLine : fieldLine.substring(0, spaceIdx); - const value = spaceIdx === -1 ? '' : fieldLine.substring(spaceIdx + 1); - - if (key === 'author') { - authorName = value; - } else if (key === 'author-mail') { - authorMail = value.replace(/^<|>$/g, ''); - } else if (key === 'author-time') { - date = new Date(parseInt(value, 10) * 1000).toISOString(); - } else if (key === 'summary') { - message = value; - } else if (key === 'previous') { - // "previous " — path may contain spaces, so split once. - const sep = value.indexOf(' '); - if (sep !== -1) { - previous = { - hash: value.substring(0, sep), - path: value.substring(sep + 1), - }; - } - } else if (key === 'filename') { - filenameByHash.set(hash, value); - } - // committer*, boundary are intentionally ignored. - - i++; - } - - // Skip the "\t" sentinel; the file source is fetched separately. - if (i < rawLines.length && rawLines[i].startsWith('\t')) { - i++; - } - - if (!commits[hash] && authorName !== undefined && authorMail !== undefined && date !== undefined && message !== undefined) { - commits[hash] = { - hash, - date, - message, - authorName, - authorEmail: authorMail, - ...(previous ? { previous } : {}), - }; - } - - if (isGroupStart) { - const path = filenameByHash.get(hash); - if (path === undefined) { - throw new Error(`Malformed git blame porcelain output: missing "filename" for commit ${hash}`); - } - ranges.push({ hash, path, startLine: finalLine, lineCount }); - } - } - - // Coalesce adjacent same-commit ranges. Porcelain emits a fresh group - // whenever the source-line numbering is discontinuous in the commit's - // snapshot, even when the final-file lines are contiguous and attributed - // to the same commit. - const coalescedRanges: FileBlameResponse['ranges'] = []; - for (const range of ranges) { - const last = coalescedRanges[coalescedRanges.length - 1]; - if (last && last.hash === range.hash && last.path === range.path && last.startLine + last.lineCount === range.startLine) { - last.lineCount += range.lineCount; - } else { - coalescedRanges.push({ ...range }); - } - } - - return { ranges: coalescedRanges, commits }; -}; - -export const getFileBlame = async ({ path: filePath, repo: repoName, ref }: FileBlameRequest, { source }: { source?: string } = {}): Promise => - sew(() => - withOptionalAuth(async ({ org, prisma, user }) => { - if (user) { - const resolvedSource = source ?? (await headers()).get('X-Sourcebot-Client-Source') ?? undefined; - await createAudit({ - action: 'user.fetched_file_blame', - actor: { id: user.id, type: 'user' }, - target: { id: org.id.toString(), type: 'org' }, - orgId: org.id, - metadata: { source: resolvedSource }, - }); - } - - const repo = await prisma.repo.findFirst({ - where: { name: repoName, orgId: org.id }, - }); - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - if (!isPathValid(filePath)) { - return fileNotFound(filePath, repoName); - } - - if (ref !== undefined && !isGitRefValid(ref)) { - return invalidGitRef(ref); - } - - const { path: repoPath } = getRepoPath(repo); - const git = simpleGit().cwd(repoPath); - - const gitRef = ref ?? repo.defaultBranch ?? 'HEAD'; - - let porcelain: string; - try { - porcelain = await git.raw(['blame', '--porcelain', gitRef, '--', filePath]); - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - if (errorMessage.includes('no such path') || errorMessage.includes('does not exist') || errorMessage.includes('fatal: path') || errorMessage.includes('no such file')) { - return fileNotFound(filePath, repoName); - } - if (errorMessage.includes('unknown revision') || errorMessage.includes('bad revision') || errorMessage.includes('invalid object name')) { - return unresolvedGitRef(gitRef); - } - return unexpectedError(errorMessage); - } - - try { - return parsePorcelainBlame(porcelain) satisfies FileBlameResponse; - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - return unexpectedError(`Failed to parse git blame output: ${errorMessage}`); - } - }) - ); diff --git a/packages/web/src/features/git/getFileSourceApi.test.ts b/packages/web/src/features/git/getFileSourceApi.test.ts deleted file mode 100644 index 0553fa394..000000000 --- a/packages/web/src/features/git/getFileSourceApi.test.ts +++ /dev/null @@ -1,362 +0,0 @@ -import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest'; - -// Hoist the mock function so it can be referenced in both the vi.mock factory -// and the test body. -const mockSimpleGit = vi.hoisted(() => vi.fn()); - -vi.mock('simple-git', () => ({ - simpleGit: mockSimpleGit, -})); -vi.mock('@sourcebot/shared', () => ({ - getRepoPath: (repo: { id: number }) => ({ - path: `/mock/repos/${repo.id}`, - }), - env: { - AUTH_URL: 'https://sourcebot.example.com', - }, - createLogger: () => ({ - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})); -vi.mock('@/lib/utils', () => ({ - getCodeHostBrowseFileAtBranchUrl: vi.fn().mockReturnValue('https://github.com/owner/repo/blob/main/src/index.ts'), - isServiceError: (obj: unknown): boolean => { - return obj !== null && typeof obj === 'object' && 'errorCode' in (obj as object); - }, -})); -vi.mock('@/app/(app)/browse/hooks/utils', () => ({ - getBrowsePath: vi.fn().mockReturnValue('/browse/github.com/owner/repo/blob/main/src/index.ts'), -})); -vi.mock('@/lib/gitattributes', () => ({ - parseGitAttributes: vi.fn().mockReturnValue({}), - resolveLanguageFromGitAttributes: vi.fn().mockReturnValue(undefined), -})); -vi.mock('@/lib/languageDetection', () => ({ - detectLanguageFromFilename: vi.fn().mockReturnValue('TypeScript'), -})); -// Required for module load; not exercised by getFileSourceForRepo directly -vi.mock('next/headers', () => ({ - headers: vi.fn().mockResolvedValue(new Headers()), -})); -vi.mock('@/middleware/sew', () => ({ - sew: async (fn: () => Promise | T): Promise => { - try { - return await fn(); - } catch (error) { - return { - errorCode: 'UNEXPECTED_ERROR', - message: error instanceof Error ? error.message : String(error), - } as T; - } - }, -})); -vi.mock('@/middleware/withAuth', () => ({ - withOptionalAuth: vi.fn(), -})); -vi.mock('@/ee/features/audit/audit', () => ({ - createAudit: vi.fn(), -})); - -import { getFileSourceForRepo } from './getFileSourceApi'; - -const MOCK_ORG = { id: 1, name: 'test-org' } as Parameters[1]['org']; - -const MOCK_REPO = { - id: 123, - name: 'github.com/owner/repo', - orgId: 1, - defaultBranch: 'main', - webUrl: 'https://github.com/owner/repo', - external_codeHostType: 'GITHUB', - displayName: null, -}; - -describe('getFileSourceForRepo', () => { - const mockGitRaw = vi.fn(); - const mockCwd = vi.fn(); - const mockFindFirst = vi.fn(); - - const mockPrisma = { - repo: { findFirst: mockFindFirst }, - } as unknown as Parameters[1]['prisma']; - - beforeEach(() => { - vi.clearAllMocks(); - - mockCwd.mockReturnValue({ raw: mockGitRaw }); - mockSimpleGit.mockReturnValue({ cwd: mockCwd }); - mockFindFirst.mockResolvedValue(MOCK_REPO); - - // Default: file show succeeds; .gitattributes not present - mockGitRaw.mockImplementation(async (args: string[]) => { - if (args[1]?.endsWith('.gitattributes')) { - throw new Error('does not exist in HEAD'); - } - return 'console.log("hello");'; - }); - }); - - describe('repository validation', () => { - it('returns NOT_FOUND when repo is absent from the database', async () => { - mockFindFirst.mockResolvedValue(null); - - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ errorCode: 'NOT_FOUND' }); - }); - - it('queries the database by repo name and orgId', async () => { - await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(mockFindFirst).toHaveBeenCalledWith({ - where: { name: 'github.com/owner/repo', orgId: 1 }, - }); - }); - - it('returns UNEXPECTED_ERROR when the database throws (caught by sew)', async () => { - mockFindFirst.mockRejectedValue(new Error('DB connection refused')); - - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ errorCode: 'UNEXPECTED_ERROR' }); - }); - }); - - describe('input validation', () => { - it('returns FILE_NOT_FOUND for path traversal attempts', async () => { - const result = await getFileSourceForRepo( - { path: 'src/../../etc/passwd', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ errorCode: 'FILE_NOT_FOUND' }); - }); - - it('returns FILE_NOT_FOUND for null-byte paths', async () => { - const result = await getFileSourceForRepo( - { path: 'src/\0evil', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ errorCode: 'FILE_NOT_FOUND' }); - }); - - it('returns INVALID_GIT_REF with a syntactic message for refs starting with "-" (flag injection guard)', async () => { - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo', ref: '--upload-pack=evil' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ - errorCode: 'INVALID_GIT_REF', - message: expect.stringContaining("cannot start with '-'"), - }); - }); - }); - - describe('git error handling', () => { - it('returns FILE_NOT_FOUND when git reports the file does not exist', async () => { - mockGitRaw.mockRejectedValueOnce( - new Error("fatal: path 'src/missing.ts' does not exist in 'main'"), - ); - - const result = await getFileSourceForRepo( - { path: 'src/missing.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ errorCode: 'FILE_NOT_FOUND' }); - }); - - it('returns FILE_NOT_FOUND for "fatal: path" errors', async () => { - mockGitRaw.mockRejectedValueOnce(new Error('fatal: path not found')); - - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ errorCode: 'FILE_NOT_FOUND' }); - }); - - it('returns INVALID_GIT_REF with an unresolved-ref message when head_sha has not been fetched ("unknown revision")', async () => { - // This is the scenario from the v4.16.14 regression: the review agent passes - // pr_payload.head_sha as ref, but the bare clone hasn't fetched it yet. - mockGitRaw.mockRejectedValueOnce( - new Error("fatal: ambiguous argument 'deadbeef': unknown revision or path not in the working tree"), - ); - - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo', ref: 'deadbeef' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ - errorCode: 'INVALID_GIT_REF', - message: expect.stringContaining('could not be resolved'), - }); - }); - - it('returns INVALID_GIT_REF with an unresolved-ref message for "bad revision" errors', async () => { - mockGitRaw.mockRejectedValueOnce(new Error('fatal: bad revision')); - - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo', ref: 'nonexistent' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ - errorCode: 'INVALID_GIT_REF', - message: expect.stringContaining('could not be resolved'), - }); - }); - - it('returns INVALID_GIT_REF with an unresolved-ref message for "invalid object name" errors', async () => { - mockGitRaw.mockRejectedValueOnce(new Error('fatal: invalid object name HEAD')); - - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ - errorCode: 'INVALID_GIT_REF', - message: expect.stringContaining('could not be resolved'), - }); - }); - - it('returns UNEXPECTED_ERROR — not throw — for unrecognised git errors (regression: v4.16.14 fatal exception)', async () => { - // Before the fix, getFileSourceForRepo re-threw unknown errors. - // Outside sew(), this caused a fatal Next.js task-runner exception. - // After the fix, all errors are returned as ServiceError. - mockGitRaw.mockRejectedValueOnce(new Error('I/O error: device busy')); - - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ errorCode: 'UNEXPECTED_ERROR' }); - }); - - it('never rejects its returned promise for unrecognised git errors', async () => { - mockGitRaw.mockRejectedValueOnce(new Error('transient I/O error')); - - await expect( - getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ), - ).resolves.toMatchObject({ errorCode: 'UNEXPECTED_ERROR' }); - }); - }); - - describe('successful response', () => { - it('returns the file source with language detected from filename', async () => { - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ - source: 'console.log("hello");', - language: 'TypeScript', - path: 'src/index.ts', - repo: 'github.com/owner/repo', - }); - }); - - it('uses the provided ref for the git show command', async () => { - await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo', ref: 'abc123sha' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(mockGitRaw).toHaveBeenCalledWith(['show', 'abc123sha:src/index.ts']); - }); - - it('falls back to defaultBranch when ref is omitted', async () => { - await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(mockGitRaw).toHaveBeenCalledWith(['show', 'main:src/index.ts']); - }); - - it('falls back to HEAD when both ref and defaultBranch are absent', async () => { - mockFindFirst.mockResolvedValue({ ...MOCK_REPO, defaultBranch: null }); - - await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(mockGitRaw).toHaveBeenCalledWith(['show', 'HEAD:src/index.ts']); - }); - - it('uses the repo path from getRepoPath for the git working directory', async () => { - await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - // getRepoPath mock returns `/mock/repos/${repo.id}` - expect(mockCwd).toHaveBeenCalledWith('/mock/repos/123'); - }); - }); - - describe('language detection', () => { - it('uses language from .gitattributes when present', async () => { - const { resolveLanguageFromGitAttributes, parseGitAttributes } = await import('@/lib/gitattributes'); - const mockResolve = resolveLanguageFromGitAttributes as unknown as Mock; - const mockParse = parseGitAttributes as unknown as Mock; - - mockParse.mockReturnValue({ '*.ts': { linguist_language: 'TypeScript' } }); - mockResolve.mockReturnValue('TypeScript'); - - // Override default: .gitattributes call succeeds - mockGitRaw.mockImplementation(async (args: string[]) => { - if (args[1]?.endsWith('.gitattributes')) { - return 'linguist-language=TypeScript'; - } - return 'file content'; - }); - - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ language: 'TypeScript' }); - expect(mockResolve).toHaveBeenCalled(); - }); - - it('falls back to filename-based detection when .gitattributes is absent', async () => { - const { detectLanguageFromFilename } = await import('@/lib/languageDetection'); - const mockDetect = detectLanguageFromFilename as unknown as Mock; - mockDetect.mockReturnValue('TypeScript'); - - // Default beforeEach setup: .gitattributes throws → falls back to filename detection - const result = await getFileSourceForRepo( - { path: 'src/index.ts', repo: 'github.com/owner/repo' }, - { org: MOCK_ORG, prisma: mockPrisma }, - ); - - expect(result).toMatchObject({ language: 'TypeScript' }); - expect(mockDetect).toHaveBeenCalledWith('src/index.ts'); - }); - }); -}); diff --git a/packages/web/src/features/git/getFileSourceApi.ts b/packages/web/src/features/git/getFileSourceApi.ts deleted file mode 100644 index ef057362b..000000000 --- a/packages/web/src/features/git/getFileSourceApi.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { getBrowsePath } from '@/app/(app)/browse/hooks/utils'; -import { createAudit } from '@/ee/features/audit/audit'; -import { parseGitAttributes, resolveLanguageFromGitAttributes } from '@/lib/gitattributes'; -import { detectLanguageFromFilename } from '@/lib/languageDetection'; -import { ServiceError, notFound, fileNotFound, invalidGitRef, unresolvedGitRef, unexpectedError } from '@/lib/serviceError'; -import { getCodeHostBrowseFileAtBranchUrl } from '@/lib/utils'; -import { withOptionalAuth } from '@/middleware/withAuth'; -import { env, getRepoPath } from '@sourcebot/shared'; -import { Org, PrismaClient } from '@sourcebot/db'; -import { headers } from 'next/headers'; -import { simpleGit } from 'simple-git'; -import type z from 'zod'; -import { isGitRefValid, isPathValid } from './utils'; -import { fileSourceRequestSchema, fileSourceResponseSchema } from './schemas'; - -export { fileSourceRequestSchema, fileSourceResponseSchema } from './schemas'; -export type FileSourceRequest = z.infer; -export type FileSourceResponse = z.infer; - -/** - * Fetches file source without an auth layer. Intended for privileged server-side - * callers (e.g. the review agent webhook handler) that have already been - * authenticated via their own mechanism and need direct repo access. - */ -export const getFileSourceForRepo = async ( - { path: filePath, repo: repoName, ref }: FileSourceRequest, - { org, prisma }: { org: Org; prisma: PrismaClient }, -): Promise => sew(async () => { - const repo = await prisma.repo.findFirst({ - where: { name: repoName, orgId: org.id }, - }); - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - if (!isPathValid(filePath)) { - return fileNotFound(filePath, repoName); - } - - if (ref !== undefined && !isGitRefValid(ref)) { - return invalidGitRef(ref); - } - - const { path: repoPath } = getRepoPath(repo); - const git = simpleGit().cwd(repoPath); - - const gitRef = ref ?? repo.defaultBranch ?? 'HEAD'; - - let fileContent: string; - try { - fileContent = await git.raw(['show', `${gitRef}:${filePath}`]); - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - if (errorMessage.includes('does not exist') || errorMessage.includes('fatal: path')) { - return fileNotFound(filePath, repoName); - } - if (errorMessage.includes('unknown revision') || errorMessage.includes('bad revision') || errorMessage.includes('invalid object name')) { - return unresolvedGitRef(gitRef); - } - return unexpectedError(errorMessage); - } - - // The git blob OID is a content hash of the file at this ref. We resolve it - // best-effort so callers that track imported files (agent skills) can detect - // when the indexed file changes. A failure here must not fail the read. - let blobSha: string | undefined; - try { - blobSha = (await git.raw(['rev-parse', `${gitRef}:${filePath}`])).trim(); - } catch { - blobSha = undefined; - } - - let gitattributesContent: string | undefined; - try { - gitattributesContent = await git.raw(['show', `${gitRef}:.gitattributes`]); - } catch { - // No .gitattributes in this repo/ref, that's fine - } - - const language = gitattributesContent - ? (resolveLanguageFromGitAttributes(filePath, parseGitAttributes(gitattributesContent)) ?? detectLanguageFromFilename(filePath)) - : detectLanguageFromFilename(filePath); - - const externalWebUrl = getCodeHostBrowseFileAtBranchUrl({ - webUrl: repo.webUrl, - codeHostType: repo.external_codeHostType, - branchName: gitRef, - filePath, - }); - - const baseUrl = env.AUTH_URL; - const webUrl = `${baseUrl}${getBrowsePath({ - repoName: repo.name, - revisionName: ref, - path: filePath, - pathType: 'blob', - })}`; - - return { - source: fileContent, - language, - path: filePath, - repo: repoName, - repoCodeHostType: repo.external_codeHostType, - repoDisplayName: repo.displayName ?? undefined, - repoExternalWebUrl: repo.webUrl ?? undefined, - webUrl, - externalWebUrl, - blobSha, - } satisfies FileSourceResponse; -}); - -/** - * Resolves the git blob OID for a file at a ref without reading its contents. - * Used to cheaply detect whether an imported file has changed since import. - * Distinguishes "repo not found" from "file not found" from "bad ref" so callers - * can surface the right sync state. Privileged: intended for callers that have - * already established org context (e.g. via withAuth). - */ -export const resolveFileBlobShaForRepo = async ( - { path: filePath, repo: repoName, ref }: FileSourceRequest, - { org, prisma }: { org: Org; prisma: PrismaClient }, -): Promise => sew(async () => { - const repo = await prisma.repo.findFirst({ - where: { name: repoName, orgId: org.id }, - }); - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - if (!isPathValid(filePath)) { - return fileNotFound(filePath, repoName); - } - - if (ref !== undefined && !isGitRefValid(ref)) { - return invalidGitRef(ref); - } - - const { path: repoPath } = getRepoPath(repo); - const git = simpleGit().cwd(repoPath); - const gitRef = ref ?? repo.defaultBranch ?? 'HEAD'; - - try { - return (await git.raw(['rev-parse', `${gitRef}:${filePath}`])).trim(); - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - if (errorMessage.includes('does not exist') || errorMessage.includes('fatal: path')) { - return fileNotFound(filePath, repoName); - } - if (errorMessage.includes('unknown revision') || errorMessage.includes('bad revision') || errorMessage.includes('invalid object name')) { - return unresolvedGitRef(gitRef); - } - return unexpectedError(errorMessage); - } -}); - -const gitBlobShaSchema = /^[0-9a-f]{40}(?:[0-9a-f]{24})?$/; - -/** - * Reads a blob's raw content by its git object id from an indexed repo's local - * clone. Used to recover the originally-imported version of a synced agent - * skill file so local edits can be detected without storing extra state. - * Privileged: intended for callers that have already established org context - * (e.g. via withAuth); repo visibility is enforced by the caller's prisma. - */ -export const getBlobContentForRepo = async ( - { repo: repoName, blobSha }: { repo: string; blobSha: string }, - { org, prisma }: { org: Org; prisma: PrismaClient }, -): Promise => sew(async () => { - const repo = await prisma.repo.findFirst({ - where: { name: repoName, orgId: org.id }, - }); - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - if (!gitBlobShaSchema.test(blobSha)) { - return invalidGitRef(blobSha); - } - - const { path: repoPath } = getRepoPath(repo); - const git = simpleGit().cwd(repoPath); - - try { - return await git.raw(['cat-file', 'blob', blobSha]); - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - // The object may have been pruned (e.g. after an upstream force-push and - // gc), so treat any lookup failure as "blob not found". - if (errorMessage.includes('does not exist') || errorMessage.includes('bad file') || errorMessage.includes('Not a valid object name') || errorMessage.includes('invalid object name')) { - return notFound(`Blob "${blobSha}" not found in repository "${repoName}".`); - } - return unexpectedError(errorMessage); - } -}); - -export const getFileSource = async ({ path: filePath, repo: repoName, ref }: FileSourceRequest, { source }: { source?: string } = {}): Promise => sew(() => withOptionalAuth(async ({ org, prisma, user }) => { - if (user) { - const resolvedSource = source ?? (await headers()).get('X-Sourcebot-Client-Source') ?? undefined; - await createAudit({ - action: 'user.fetched_file_source', - actor: { id: user.id, type: 'user' }, - target: { id: org.id.toString(), type: 'org' }, - orgId: org.id, - metadata: { source: resolvedSource }, - }); - } - - return getFileSourceForRepo({ path: filePath, repo: repoName, ref }, { org, prisma }); -})); diff --git a/packages/web/src/features/git/getFilesApi.ts b/packages/web/src/features/git/getFilesApi.ts deleted file mode 100644 index ac218d445..000000000 --- a/packages/web/src/features/git/getFilesApi.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { FileTreeItem } from "./types"; -import { notFound, ServiceError, unexpectedError } from '@/lib/serviceError'; -import { withOptionalAuth } from "@/middleware/withAuth"; -import { getRepoPath } from '@sourcebot/shared'; -import { simpleGit } from 'simple-git'; -import type z from 'zod'; -import { getFilesRequestSchema, getFilesResponseSchema } from './schemas'; -import { logger } from './logger'; - - -export { getFilesRequestSchema, getFilesResponseSchema } from './schemas'; -export type GetFilesRequest = z.infer; -export type GetFilesResponse = z.infer; - -export const getFiles = async ({ repoName, revisionName }: GetFilesRequest): Promise => sew(() => - withOptionalAuth(async ({ org, prisma }) => { - const repo = await prisma.repo.findFirst({ - where: { - name: repoName, - orgId: org.id, - }, - }); - - if (!repo) { - return notFound(); - } - - const { path: repoPath } = getRepoPath(repo); - - const git = simpleGit().cwd(repoPath); - - let result: string; - try { - result = await git.raw([ - // Disable quoting of non-ASCII characters in paths - '-c', 'core.quotePath=false', - 'ls-tree', - revisionName, - // recursive - '-r', - // only return the names of the files - '--name-only', - ]); - } catch (error) { - logger.error('git ls-tree failed.', { error }); - return unexpectedError('git ls-tree command failed.'); - } - - const paths = result.split('\n').filter(line => line.trim()); - - const files: FileTreeItem[] = paths.map(path => { - const name = path.split('/').pop() ?? ''; - return { - type: 'blob', - path, - name, - } - }); - - return files; - })); diff --git a/packages/web/src/features/git/getFolderContentsApi.ts b/packages/web/src/features/git/getFolderContentsApi.ts deleted file mode 100644 index e2d1180ca..000000000 --- a/packages/web/src/features/git/getFolderContentsApi.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { FileTreeItem } from "./types"; -import { notFound, unexpectedError } from '@/lib/serviceError'; -import { withOptionalAuth } from "@/middleware/withAuth"; -import { getRepoPath } from '@sourcebot/shared'; -import { simpleGit } from 'simple-git'; -import z from 'zod'; -import { compareFileTreeItems, isPathValid, normalizePath } from './utils'; -import { logger } from './logger'; - - -export const getFolderContentsRequestSchema = z.object({ - repoName: z.string(), - revisionName: z.string(), - path: z.string(), -}); -export type GetFolderContentsRequest = z.infer; - -/** - * Returns the contents of a folder at a given path in a given repository, - * at a given revision. - */ -export const getFolderContents = async ({ repoName, revisionName, path }: GetFolderContentsRequest) => sew(() => - withOptionalAuth(async ({ org, prisma }) => { - const repo = await prisma.repo.findFirst({ - where: { - name: repoName, - orgId: org.id, - }, - }); - - if (!repo) { - return notFound(); - } - - const { path: repoPath } = getRepoPath(repo); - const git = simpleGit().cwd(repoPath); - - if (!isPathValid(path)) { - return notFound(); - } - const normalizedPath = normalizePath(path); - - let result: string; - try { - result = await git.raw([ - // Disable quoting of non-ASCII characters in paths - '-c', 'core.quotePath=false', - 'ls-tree', - revisionName, - // format as output as {type},{path} - '--format=%(objecttype),%(path)', - ...(normalizedPath.length === 0 ? [] : [normalizedPath]), - ]); - } catch (error) { - logger.error('git ls-tree failed.', { error }); - return unexpectedError('git ls-tree command failed.'); - } - - const lines = result.split('\n').filter(line => line.trim()); - - const contents: FileTreeItem[] = lines.map(line => { - const commaIndex = line.indexOf(','); - if (commaIndex === -1) { - throw new Error(`Unexpected ls-tree output: ${line}`); - } - const type = line.substring(0, commaIndex); - const path = line.substring(commaIndex + 1); - const name = path.split('/').pop() ?? ''; - - return { - type, - path, - name, - } - }); - - // Sort the contents in place, first by type (trees before blobs), then by name. - contents.sort(compareFileTreeItems); - - return contents; - })); diff --git a/packages/web/src/features/git/getPathTypeApi.ts b/packages/web/src/features/git/getPathTypeApi.ts deleted file mode 100644 index 3a25596ba..000000000 --- a/packages/web/src/features/git/getPathTypeApi.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { invalidGitRef, notFound, ServiceError, unexpectedError } from '@/lib/serviceError'; -import { withOptionalAuth } from '@/middleware/withAuth'; -import { getRepoPath } from '@sourcebot/shared'; -import { simpleGit } from 'simple-git'; -import { isGitRefValid } from './utils'; - -export type GitObjectPathType = 'blob' | 'tree'; - -type GetPathTypeRequest = { - repo: string; - ref?: string; - path: string; -}; - -/** - * Resolve whether a given path inside a repo is a file (`blob`) or a - * directory (`tree`) at the supplied ref. Empty paths always resolve to - * `tree` (the repo root). - * - * Backed by `git cat-file -t :`, which is a constant-time - * object lookup — no walking, just an index read. - */ -export const getPathType = async ({ - repo: repoName, - ref = 'HEAD', - path, -}: GetPathTypeRequest): Promise => sew(() => - withOptionalAuth(async ({ org, prisma }) => { - if (path === '' || path === '/') { - return 'tree'; - } - - const repo = await prisma.repo.findFirst({ - where: { - name: repoName, - orgId: org.id, - }, - }); - - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - if (!isGitRefValid(ref)) { - return invalidGitRef(ref); - } - - const { path: repoPath } = getRepoPath(repo); - const git = simpleGit().cwd(repoPath); - - try { - const output = await git.raw(['cat-file', '-t', `${ref}:${path}`]); - const type = output.trim(); - if (type === 'blob' || type === 'tree') { - return type; - } - return notFound(`Path "${path}" at ref "${ref}" is not a file or directory.`); - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - - if (errorMessage.includes('not a git repository')) { - return unexpectedError( - `Invalid git repository at ${repoPath}. ` - + `The directory exists but is not a valid git repository.`, - ); - } - - // `git cat-file` returns "Not a valid object name :" when - // the path doesn't exist at that ref. Treat as not-found. - if (errorMessage.includes('Not a valid object name')) { - return notFound(`Path "${path}" not found at ref "${ref}".`); - } - - if (error instanceof Error) { - throw new Error( - `Failed to resolve path type for ${repoName}:${path}: ${error.message}`, - ); - } - throw new Error( - `Failed to resolve path type for ${repoName}:${path}: ${errorMessage}`, - ); - } - })); diff --git a/packages/web/src/features/git/getTreeApi.ts b/packages/web/src/features/git/getTreeApi.ts deleted file mode 100644 index 22bcb2e45..000000000 --- a/packages/web/src/features/git/getTreeApi.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { createAudit } from '@/ee/features/audit/audit'; -import { invalidGitRef, notFound, ServiceError, unexpectedError } from '@/lib/serviceError'; -import { withOptionalAuth } from "@/middleware/withAuth"; -import { getRepoPath } from '@sourcebot/shared'; -import { headers } from 'next/headers'; -import { simpleGit } from 'simple-git'; -import type z from 'zod'; -import { getTreeRequestSchema, getTreeResponseSchema } from './schemas'; -import { buildFileTree, isGitRefValid, isPathValid, normalizePath } from './utils'; -import { logger } from './logger'; - -export { getTreeRequestSchema, getTreeResponseSchema } from './schemas'; -export type GetTreeRequest = z.infer; -export type GetTreeResponse = z.infer; - -/** - * Returns a file tree spanning the union of all provided paths for the given - * repo/revision, including intermediate directories needed to connect them - * into a single tree. - */ -export const getTree = async ({ repoName, revisionName, paths }: GetTreeRequest, { source }: { source?: string } = {}): Promise => sew(() => - withOptionalAuth(async ({ org, prisma, user }) => { - if (user) { - const resolvedSource = source ?? (await headers()).get('X-Sourcebot-Client-Source') ?? undefined; - await createAudit({ - action: 'user.fetched_file_tree', - actor: { id: user.id, type: 'user' }, - target: { id: org.id.toString(), type: 'org' }, - orgId: org.id, - metadata: { source: resolvedSource }, - }); - } - - const repo = await prisma.repo.findFirst({ - where: { - name: repoName, - orgId: org.id, - }, - }); - - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - if (!isGitRefValid(revisionName)) { - return invalidGitRef(revisionName); - } - - const { path: repoPath } = getRepoPath(repo); - - const git = simpleGit().cwd(repoPath); - if (!paths.every(path => isPathValid(path))) { - return notFound(); - } - - const normalizedPaths = paths.map(path => normalizePath(path)); - - let result: string = ''; - try { - - const command = [ - // Disable quoting of non-ASCII characters in paths - '-c', 'core.quotePath=false', - 'ls-tree', - revisionName, - // format as output as {type},{path} - '--format=%(objecttype),%(path)', - // include tree nodes - '-t', - '--', - '.', - ...normalizedPaths, - ]; - - result = await git.raw(command); - } catch (error) { - logger.error('git ls-tree failed.', { error }); - return unexpectedError('git ls-tree command failed.'); - } - - const lines = result.split('\n').filter(line => line.trim()); - - const flatList = lines.map(line => { - const commaIndex = line.indexOf(','); - if (commaIndex === -1) { - throw new Error(`Unexpected ls-tree output: ${line}`); - } - const type = line.substring(0, commaIndex); - const path = line.substring(commaIndex + 1); - return { - type, - path, - } - }); - - const tree = buildFileTree(flatList); - - return { - tree, - } - })); diff --git a/packages/web/src/features/git/index.ts b/packages/web/src/features/git/index.ts deleted file mode 100644 index def2c16e9..000000000 --- a/packages/web/src/features/git/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -export * from './getCommitApi'; -export * from './getDiffApi'; -export * from './getFilesApi'; -export * from './getFolderContentsApi'; -export * from './getTreeApi'; -export * from './getFileSourceApi'; -export * from './getFileBlameApi'; -export * from './listCommitsApi'; -export * from './listBranchesApi'; -export * from './listCommitAuthorsApi'; -export * from './getPathTypeApi'; -export * from './types'; diff --git a/packages/web/src/features/git/listBranchesApi.test.ts b/packages/web/src/features/git/listBranchesApi.test.ts deleted file mode 100644 index ac41e8c43..000000000 --- a/packages/web/src/features/git/listBranchesApi.test.ts +++ /dev/null @@ -1,429 +0,0 @@ -import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest'; -import { listBranches } from './listBranchesApi'; - -vi.mock('simple-git'); -vi.mock('fs', () => ({ - existsSync: vi.fn().mockReturnValue(true), -})); -vi.mock('@sourcebot/shared', async () => { - const { z } = await import('zod'); - return { - REPOS_CACHE_DIR: '/mock/cache/dir', - getRepoPath: (repo: { id: number }) => ({ - path: `/mock/cache/dir/${repo.id}`, - }), - createLogger: () => ({ - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), - repoMetadataSchema: z.object({ - indexedRevisions: z.array(z.string()).optional(), - }).passthrough(), - }; -}); -vi.mock('@/lib/serviceError', () => ({ - unexpectedError: (message: string) => ({ - errorCode: 'UNEXPECTED_ERROR', - message, - }), - notFound: (message: string) => ({ - errorCode: 'NOT_FOUND', - message, - }), -})); -vi.mock('@/middleware/sew', () => ({ - sew: async (fn: () => Promise | T): Promise => { - try { - return await fn(); - } catch (error) { - return { - errorCode: 'UNEXPECTED_ERROR', - message: error instanceof Error ? error.message : String(error), - } as T; - } - }, -})); - -const mockFindFirst = vi.fn(); - -vi.mock('@/middleware/withAuth', () => ({ - withOptionalAuth: async (fn: (args: { org: { id: number; name: string }; prisma: unknown }) => Promise): Promise => { - const mockOrg = { id: 1, name: 'test-org' }; - const mockPrisma = { - repo: { - findFirst: mockFindFirst, - }, - }; - return await fn({ org: mockOrg, prisma: mockPrisma }); - }, -})); -vi.mock('@/lib/utils', () => ({ - isServiceError: (obj: unknown): obj is { errorCode: string } => { - return obj !== null && typeof obj === 'object' && 'errorCode' in obj; - }, -})); - -import { simpleGit } from 'simple-git'; - -describe('listBranches', () => { - const mockGitRaw = vi.fn(); - const mockCwd = vi.fn(); - const mockSimpleGit = simpleGit as unknown as Mock; - - const defaultRepo = { - id: 123, - name: 'github.com/test/repo', - defaultBranch: 'main', - indexedAt: new Date('2026-01-15T12:00:00.000Z'), - metadata: { indexedRevisions: ['refs/heads/main'] }, - }; - - // for-each-ref output: \t\t, sorted newest-first by git. - const defaultGitOutput = [ - 'feature-x\taaa111\t2026-02-01T10:00:00+00:00', - 'main\tbbb222\t2026-01-15T09:00:00+00:00', - 'old-branch\tccc333\t2025-06-01T08:00:00+00:00', - ].join('\n') + '\n'; - - beforeEach(() => { - vi.clearAllMocks(); - mockFindFirst.mockReset(); - mockCwd.mockReturnValue({ raw: mockGitRaw }); - mockSimpleGit.mockReturnValue({ cwd: mockCwd }); - mockFindFirst.mockResolvedValue(defaultRepo); - mockGitRaw.mockResolvedValue(defaultGitOutput); - }); - - describe('repository lookup', () => { - it('queries the database with the repository name and org id', async () => { - await listBranches({ repo: 'github.com/test/repo' }); - - expect(mockFindFirst).toHaveBeenCalledWith({ - where: { - name: 'github.com/test/repo', - orgId: 1, - }, - }); - }); - - it('returns NOT_FOUND when the repository does not exist', async () => { - mockFindFirst.mockResolvedValue(null); - - const result = await listBranches({ repo: 'github.com/nonexistent/repo' }); - - expect(result).toMatchObject({ - errorCode: 'NOT_FOUND', - message: expect.stringContaining('github.com/nonexistent/repo'), - }); - }); - - it('resolves the clone path from the repo id', async () => { - await listBranches({ repo: 'github.com/test/repo' }); - - expect(mockCwd).toHaveBeenCalledWith('/mock/cache/dir/123'); - }); - }); - - describe('git command', () => { - it('runs for-each-ref over refs/heads only, sorted by committer date', async () => { - await listBranches({ repo: 'github.com/test/repo' }); - - expect(mockGitRaw).toHaveBeenCalledWith([ - 'for-each-ref', - '--sort=-committerdate', - // lstrip=2 (not refname:short) so a tag with the same name as a - // branch cannot turn the emitted name into "heads/". - '--format=%(refname:lstrip=2)%09%(objectname)%09%(committerdate:iso-strict)', - 'refs/heads', - ]); - expect(mockGitRaw).toHaveBeenCalledTimes(1); - }); - }); - - describe('parsing and ordering', () => { - it('parses branch name, commit SHA, and commit date from git output', async () => { - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toHaveProperty('branches.0', { - name: 'feature-x', - commit: 'aaa111', - committedAt: '2026-02-01T10:00:00+00:00', - isDefault: false, - isIndexed: false, - }); - }); - - it("preserves git's newest-first ordering", async () => { - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - branches: [ - { name: 'feature-x' }, - { name: 'main' }, - { name: 'old-branch' }, - ], - }); - }); - - it('returns an empty list for an empty repository', async () => { - mockGitRaw.mockResolvedValue(''); - - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toEqual({ - repo: 'github.com/test/repo', - defaultBranch: 'main', - indexedAt: '2026-01-15T12:00:00.000Z', - totalCount: 0, - branches: [], - }); - }); - }); - - describe('default branch marking', () => { - it('marks only the default branch as isDefault', async () => { - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - branches: [ - { name: 'feature-x', isDefault: false }, - { name: 'main', isDefault: true }, - { name: 'old-branch', isDefault: false }, - ], - }); - }); - - it('normalizes a refs/heads-prefixed defaultBranch', async () => { - mockFindFirst.mockResolvedValue({ - ...defaultRepo, - defaultBranch: 'refs/heads/main', - }); - - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - defaultBranch: 'main', - branches: [ - { name: 'feature-x', isDefault: false }, - { name: 'main', isDefault: true }, - { name: 'old-branch', isDefault: false }, - ], - }); - }); - - it('handles a missing default branch', async () => { - mockFindFirst.mockResolvedValue({ - ...defaultRepo, - defaultBranch: null, - }); - - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - defaultBranch: undefined, - branches: [ - { name: 'feature-x', isDefault: false }, - { name: 'main', isDefault: false }, - { name: 'old-branch', isDefault: false }, - ], - }); - }); - }); - - describe('indexed branch marking', () => { - it('marks branches present in indexedRevisions', async () => { - mockFindFirst.mockResolvedValue({ - ...defaultRepo, - metadata: { - indexedRevisions: ['refs/heads/main', 'refs/heads/feature-x'], - }, - }); - - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - branches: [ - { name: 'feature-x', isIndexed: true }, - { name: 'main', isIndexed: true }, - { name: 'old-branch', isIndexed: false }, - ], - }); - }); - - it('marks the default branch when indexedRevisions contains HEAD', async () => { - mockFindFirst.mockResolvedValue({ - ...defaultRepo, - metadata: { indexedRevisions: ['HEAD'] }, - }); - - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - branches: [ - { name: 'feature-x', isIndexed: false }, - { name: 'main', isIndexed: true }, - { name: 'old-branch', isIndexed: false }, - ], - }); - }); - - it('treats unparseable metadata as no indexed revisions', async () => { - mockFindFirst.mockResolvedValue({ - ...defaultRepo, - metadata: { indexedRevisions: 'not-an-array' }, - }); - - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - branches: [ - { name: 'feature-x', isIndexed: false }, - { name: 'main', isIndexed: false }, - { name: 'old-branch', isIndexed: false }, - ], - }); - }); - - it('treats missing metadata as no indexed revisions', async () => { - mockFindFirst.mockResolvedValue({ - ...defaultRepo, - metadata: {}, - }); - - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - branches: [ - { name: 'feature-x', isIndexed: false }, - { name: 'main', isIndexed: false }, - { name: 'old-branch', isIndexed: false }, - ], - }); - }); - }); - - describe('filtering', () => { - it('filters branch names case-insensitively', async () => { - const result = await listBranches({ - repo: 'github.com/test/repo', - query: 'FEAT', - }); - - expect(result).toMatchObject({ - totalCount: 1, - branches: [{ name: 'feature-x' }], - }); - }); - - it('returns an empty page when nothing matches', async () => { - const result = await listBranches({ - repo: 'github.com/test/repo', - query: 'zzz', - }); - - expect(result).toMatchObject({ - totalCount: 0, - branches: [], - }); - }); - }); - - describe('pagination', () => { - it('paginates after filtering and reports the filtered totalCount', async () => { - mockGitRaw.mockResolvedValue([ - 'branch-1\taaa111\t2026-02-05T10:00:00+00:00', - 'branch-2\tbbb222\t2026-02-04T10:00:00+00:00', - 'branch-3\tccc333\t2026-02-03T10:00:00+00:00', - 'branch-4\tddd444\t2026-02-02T10:00:00+00:00', - 'branch-5\teee555\t2026-02-01T10:00:00+00:00', - ].join('\n') + '\n'); - - const result = await listBranches({ - repo: 'github.com/test/repo', - page: 2, - perPage: 2, - }); - - expect(result).toMatchObject({ - totalCount: 5, - branches: [ - { name: 'branch-3' }, - { name: 'branch-4' }, - ], - }); - }); - - it('defaults to page 1 with perPage 50', async () => { - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - totalCount: 3, - branches: [ - { name: 'feature-x' }, - { name: 'main' }, - { name: 'old-branch' }, - ], - }); - }); - - it('returns an empty branches array for a page past the end', async () => { - const result = await listBranches({ - repo: 'github.com/test/repo', - page: 10, - perPage: 50, - }); - - expect(result).toMatchObject({ - totalCount: 3, - branches: [], - }); - }); - }); - - describe('error handling', () => { - it('returns a clear error when the clone is missing', async () => { - mockGitRaw.mockRejectedValue(new Error('fatal: not a git repository')); - - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - errorCode: 'UNEXPECTED_ERROR', - message: expect.stringContaining('unavailable'), - }); - }); - - it('returns a clear error for other git failures', async () => { - mockGitRaw.mockRejectedValue(new Error('some git failure')); - - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - errorCode: 'UNEXPECTED_ERROR', - message: expect.stringContaining('Failed to list branches in repository github.com/test/repo'), - }); - }); - }); - - describe('response shape', () => { - it('serializes indexedAt as an ISO string', async () => { - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toMatchObject({ - indexedAt: '2026-01-15T12:00:00.000Z', - }); - }); - - it('returns undefined indexedAt when the repo has never been indexed', async () => { - mockFindFirst.mockResolvedValue({ - ...defaultRepo, - indexedAt: null, - }); - - const result = await listBranches({ repo: 'github.com/test/repo' }); - - expect(result).toHaveProperty('indexedAt', undefined); - }); - }); -}); diff --git a/packages/web/src/features/git/listBranchesApi.ts b/packages/web/src/features/git/listBranchesApi.ts deleted file mode 100644 index 4e88429d4..000000000 --- a/packages/web/src/features/git/listBranchesApi.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { notFound, ServiceError, unexpectedError } from '@/lib/serviceError'; -import { withOptionalAuth } from '@/middleware/withAuth'; -import { getRepoPath, repoMetadataSchema } from '@sourcebot/shared'; -import { z } from 'zod'; -import { simpleGit } from 'simple-git'; -import { branchSchema } from './schemas'; - -export type Branch = z.infer; - -export type ListBranchesResponse = { - repo: string; - defaultBranch?: string; - indexedAt?: string; - totalCount: number; - branches: Branch[]; -}; - -type ListBranchesRequest = { - repo: string; - query?: string; - page?: number; - perPage?: number; -}; - -export const listBranches = async ({ - repo: repoName, - query, - page = 1, - perPage = 50, -}: ListBranchesRequest): Promise => sew(() => - withOptionalAuth(async ({ org, prisma }) => { - const repo = await prisma.repo.findFirst({ - where: { - name: repoName, - orgId: org.id, - }, - }); - - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - const { path: repoPath } = getRepoPath(repo); - const git = simpleGit().cwd(repoPath); - - try { - // Tab is a safe separator: git ref names cannot contain whitespace - // or control characters. - const output = await git.raw([ - 'for-each-ref', - '--sort=-committerdate', - '--format=%(refname:lstrip=2)%09%(objectname)%09%(committerdate:iso-strict)', - 'refs/heads', - ]); - - const defaultBranch = repo.defaultBranch?.replace(/^refs\/heads\//, ''); - - const metadataParseResult = repoMetadataSchema.safeParse(repo.metadata); - const indexedRevisions = metadataParseResult.success - ? (metadataParseResult.data.indexedRevisions ?? []) - : []; - - const allBranches: Branch[] = output - .split('\n') - .map((line) => line.trim()) - .filter(Boolean) - .map((line) => { - const [name, commit, committedAt] = line.split('\t'); - const isDefault = name === defaultBranch; - const isIndexed = - indexedRevisions.includes(`refs/heads/${name}`) || - indexedRevisions.includes(name) || - (isDefault && indexedRevisions.includes('HEAD')); - return { name, commit, committedAt, isDefault, isIndexed }; - }); - - const filteredBranches = query - ? allBranches.filter((branch) => branch.name.toLowerCase().includes(query.toLowerCase())) - : allBranches; - - const startIndex = (page - 1) * perPage; - const paginatedBranches = filteredBranches.slice(startIndex, startIndex + perPage); - - return { - repo: repo.name, - defaultBranch, - indexedAt: repo.indexedAt?.toISOString(), - totalCount: filteredBranches.length, - branches: paginatedBranches, - }; - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - - if (errorMessage.includes('not a git repository') || errorMessage.includes('ENOENT')) { - return unexpectedError( - `Local clone for repository ${repoName} is unavailable at ${repoPath}. ` + - `The repository may not have been fetched by Sourcebot yet.` - ); - } - - return unexpectedError( - `Failed to list branches in repository ${repoName}: ${errorMessage}` - ); - } - })); diff --git a/packages/web/src/features/git/listCommitAuthorsApi.ts b/packages/web/src/features/git/listCommitAuthorsApi.ts deleted file mode 100644 index bfcba39ca..000000000 --- a/packages/web/src/features/git/listCommitAuthorsApi.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { invalidGitRef, notFound, ServiceError, unexpectedError } from '@/lib/serviceError'; -import { withOptionalAuth } from '@/middleware/withAuth'; -import { getRepoPath } from '@sourcebot/shared'; -import { z } from 'zod'; -import { simpleGit } from 'simple-git'; -import { commitAuthorSchema } from './schemas'; -import { isGitRefValid } from './utils'; - -export type CommitAuthor = z.infer; - -export type ListCommitAuthorsResponse = { - authors: CommitAuthor[]; - totalCount: number; -}; - -type ListCommitAuthorsRequest = { - repo: string; - ref?: string; - path?: string; - maxCount?: number; - skip?: number; -}; - -/** - * List unique authors who committed in a repository, optionally scoped - * to a file path. Returns authors sorted by commit count (descending), - * deduped by lowercased email. - */ -export const listCommitAuthors = async ({ - repo: repoName, - ref = 'HEAD', - path, - maxCount = 50, - skip = 0, -}: ListCommitAuthorsRequest): Promise => sew(() => - withOptionalAuth(async ({ org, prisma }) => { - const repo = await prisma.repo.findFirst({ - where: { - name: repoName, - orgId: org.id, - }, - }); - - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - if (!isGitRefValid(ref)) { - return invalidGitRef(ref); - } - - const { path: repoPath } = getRepoPath(repo); - const git = simpleGit().cwd(repoPath); - - try { - const args = ['shortlog', '-sne', ref]; - if (path) { - args.push('--', path); - } - - const output = await git.raw(args); - const lines = output.split('\n').filter(Boolean); - - // shortlog output: " \t <>" — already sorted - // by commit count descending (-n) and deduped by author. - const lineRegex = /^\s*(\d+)\s+(.+?)\s+<(.+?)>\s*$/; - const all: CommitAuthor[] = []; - for (const line of lines) { - const match = line.match(lineRegex); - if (!match) { - continue; - } - all.push({ - name: match[2], - email: match[3], - commitCount: parseInt(match[1], 10), - }); - } - - const totalCount = all.length; - const authors = all.slice(skip, skip + maxCount); - - return { authors, totalCount }; - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - - if (errorMessage.includes('not a git repository')) { - return unexpectedError( - `Invalid git repository at ${repoPath}. ` - + `The directory exists but is not a valid git repository.`, - ); - } - - if (errorMessage.includes('ambiguous argument')) { - return unexpectedError(`Invalid git reference: ${ref}`); - } - - if (error instanceof Error) { - throw new Error( - `Failed to list commit authors in repository ${repoName}: ${error.message}`, - ); - } - throw new Error( - `Failed to list commit authors in repository ${repoName}: ${errorMessage}`, - ); - } - })); diff --git a/packages/web/src/features/git/listCommitsApi.test.ts b/packages/web/src/features/git/listCommitsApi.test.ts deleted file mode 100644 index 0cc694a14..000000000 --- a/packages/web/src/features/git/listCommitsApi.test.ts +++ /dev/null @@ -1,651 +0,0 @@ -import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest'; -import { listCommits } from './listCommitsApi'; -import * as dateUtils from './dateUtils'; - -// Mock dependencies -vi.mock('simple-git'); -vi.mock('fs', () => ({ - existsSync: vi.fn().mockReturnValue(true), -})); -vi.mock('@sourcebot/shared', () => ({ - REPOS_CACHE_DIR: '/mock/cache/dir', - getRepoPath: (repo: { id: number }) => ({ - path: `/mock/cache/dir/${repo.id}`, - }), - createLogger: () => ({ - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})); -vi.mock('@/lib/serviceError', () => ({ - unexpectedError: (message: string) => ({ - errorCode: 'UNEXPECTED_ERROR', - message, - }), - notFound: (message: string) => ({ - errorCode: 'NOT_FOUND', - message, - }), - invalidGitRef: (ref: string) => ({ - errorCode: 'INVALID_GIT_REF', - message: `Invalid git reference: "${ref}". Git refs cannot start with '-'.`, - }), -})); -vi.mock('@/middleware/sew', () => ({ - sew: async (fn: () => Promise | T): Promise => { - try { - return await fn(); - } catch (error) { - // Mock sew to convert thrown errors to ServiceError - return { - errorCode: 'UNEXPECTED_ERROR', - message: error instanceof Error ? error.message : String(error), - } as T; - } - }, -})); -// Create a mock findFirst function that we can configure per-test -const mockFindFirst = vi.fn(); - -vi.mock('@/middleware/withAuth', () => ({ - withOptionalAuth: async (fn: (args: { org: { id: number; name: string }; prisma: unknown }) => Promise): Promise => { - // Mock withOptionalAuth to provide org and prisma context - const mockOrg = { id: 1, name: 'test-org' }; - const mockPrisma = { - repo: { - findFirst: mockFindFirst, - }, - }; - return await fn({ org: mockOrg, prisma: mockPrisma }); - }, -})); -vi.mock('@/lib/utils', () => ({ - isServiceError: (obj: unknown): obj is { errorCode: string } => { - return obj !== null && typeof obj === 'object' && 'errorCode' in obj; - }, -})); - -// Import mocked modules -import { simpleGit } from 'simple-git'; -import { existsSync } from 'fs'; - -describe('searchCommits', () => { - const mockGitLog = vi.fn(); - const mockGitRaw = vi.fn(); - const mockCwd = vi.fn(); - const mockSimpleGit = simpleGit as unknown as Mock; - const mockExistsSync = existsSync as unknown as Mock; - - beforeEach(() => { - vi.clearAllMocks(); - - // Reset mockFindFirst before each test - mockFindFirst.mockReset(); - - // Setup default mocks - mockExistsSync.mockReturnValue(true); - mockCwd.mockReturnValue({ - log: mockGitLog, - raw: mockGitRaw, - }); - mockSimpleGit.mockReturnValue({ - cwd: mockCwd, - }); - - // Setup default repo mock - mockFindFirst.mockResolvedValue({ id: 123, name: 'github.com/test/repo' }); - // Setup default raw mock for rev-list count - mockGitRaw.mockResolvedValue('10'); - }); - - describe('repository validation', () => { - it('should return error when repository is not found in database', async () => { - mockFindFirst.mockResolvedValue(null); - - const result = await listCommits({ - repo: 'github.com/nonexistent/repo', - }); - - expect(result).toMatchObject({ - errorCode: 'NOT_FOUND', - message: expect.stringContaining('Repository "github.com/nonexistent/repo" not found'), - }); - }); - - it('should query database with correct repository name', async () => { - mockFindFirst.mockResolvedValue({ id: 456, name: 'github.com/test/repo' }); - mockGitLog.mockResolvedValue({ all: [] }); - - await listCommits({ - repo: 'github.com/test/repo', - }); - - expect(mockFindFirst).toHaveBeenCalledWith({ - where: { - name: 'github.com/test/repo', - orgId: 1, - }, - }); - }); - }); - - describe('date range validation', () => { - it('should validate date range and return error for invalid range', async () => { - vi.spyOn(dateUtils, 'validateDateRange').mockReturnValue( - 'Invalid date range: since must be before until' - ); - - const result = await listCommits({ - repo: 'github.com/test/repo', - since: '2024-12-31', - until: '2024-01-01', - }); - - expect(result).toMatchObject({ - errorCode: 'UNEXPECTED_ERROR', - message: 'Invalid date range: since must be before until', - }); - }); - - it('should proceed when date range is valid', async () => { - vi.spyOn(dateUtils, 'validateDateRange').mockReturnValue(null); - vi.spyOn(dateUtils, 'toGitDate').mockImplementation((date) => date); - mockGitLog.mockResolvedValue({ all: [] }); - - const result = await listCommits({ - repo: 'github.com/test/repo', - since: '2024-01-01', - until: '2024-12-31', - }); - - expect(result).toMatchObject({ commits: [], totalCount: expect.any(Number) }); - }); - }); - - describe('date parsing', () => { - it('should parse dates using toGitDate', async () => { - const toGitDateSpy = vi.spyOn(dateUtils, 'toGitDate'); - toGitDateSpy.mockImplementation((date) => date); - mockGitLog.mockResolvedValue({ all: [] }); - - await listCommits({ - repo: 'github.com/test/repo', - since: '30 days ago', - until: 'yesterday', - }); - - expect(toGitDateSpy).toHaveBeenCalledWith('30 days ago'); - expect(toGitDateSpy).toHaveBeenCalledWith('yesterday'); - }); - - it('should pass parsed dates to git log', async () => { - vi.spyOn(dateUtils, 'toGitDate') - .mockReturnValueOnce('2024-01-01') - .mockReturnValueOnce('2024-12-31'); - mockGitLog.mockResolvedValue({ all: [] }); - - await listCommits({ - repo: 'github.com/test/repo', - since: '30 days ago', - until: 'yesterday', - }); - - expect(mockGitLog).toHaveBeenCalledWith( - expect.arrayContaining([ - '--since=2024-01-01', - '--until=2024-12-31', - ]) - ); - }); - }); - - describe('git log options', () => { - beforeEach(() => { - vi.spyOn(dateUtils, 'toGitDate').mockImplementation((date) => date); - mockGitLog.mockResolvedValue({ all: [] }); - }); - - it('should set default maxCount', async () => { - await listCommits({ - repo: 'github.com/test/repo', - }); - - expect(mockGitLog).toHaveBeenCalledWith( - expect.arrayContaining([ - '--max-count=50', - 'HEAD', - ]) - ); - }); - - it('should use custom maxCount', async () => { - await listCommits({ - repo: 'github.com/test/repo', - maxCount: 100, - }); - - expect(mockGitLog).toHaveBeenCalledWith( - expect.arrayContaining([ - '--max-count=100', - 'HEAD', - ]) - ); - }); - - it('should add --since when since is provided', async () => { - await listCommits({ - repo: 'github.com/test/repo', - since: '30 days ago', - }); - - expect(mockGitLog).toHaveBeenCalledWith( - expect.arrayContaining([ - '--since=30 days ago', - 'HEAD', - ]) - ); - }); - - it('should add --until when until is provided', async () => { - await listCommits({ - repo: 'github.com/test/repo', - until: 'yesterday', - }); - - expect(mockGitLog).toHaveBeenCalledWith( - expect.arrayContaining([ - '--until=yesterday', - 'HEAD', - ]) - ); - }); - - it('should add --author when author is provided', async () => { - await listCommits({ - repo: 'github.com/test/repo', - author: 'john@example.com', - }); - - expect(mockGitLog).toHaveBeenCalledWith( - expect.arrayContaining([ - '--author=john@example.com', - '--regexp-ignore-case', - 'HEAD', - ]) - ); - }); - - it('should pass author through as a regex pattern verbatim', async () => { - // Caller is responsible for escaping literal inputs. Here we pass a - // pre-escaped BRE pattern and assert it reaches git log unchanged. - await listCommits({ - repo: 'github.com/test/repo', - author: '49699333+dependabot\\[bot\\]@users\\.noreply\\.github\\.com', - }); - - expect(mockGitLog).toHaveBeenCalledWith( - expect.arrayContaining([ - '--author=49699333+dependabot\\[bot\\]@users\\.noreply\\.github\\.com', - '--regexp-ignore-case', - 'HEAD', - ]) - ); - }); - - it('should add --grep and --regexp-ignore-case when query is provided', async () => { - await listCommits({ - repo: 'github.com/test/repo', - query: 'fix bug', - }); - - expect(mockGitLog).toHaveBeenCalledWith( - expect.arrayContaining([ - '--grep=fix bug', - '--regexp-ignore-case', - 'HEAD', - ]) - ); - }); - - it('should combine all options', async () => { - await listCommits({ - repo: 'github.com/test/repo', - query: 'feature', - since: '2024-01-01', - until: '2024-12-31', - author: 'jane@example.com', - maxCount: 25, - }); - - expect(mockGitLog).toHaveBeenCalledWith([ - '--max-count=25', - '--since=2024-01-01', - '--until=2024-12-31', - '--author=jane@example.com', - '--regexp-ignore-case', - '--grep=feature', - 'HEAD', - ]); - }); - }); - - describe('successful responses', () => { - it('should return commits and totalCount from git log', async () => { - const gitLogOutput = [ - { - hash: 'abc123', - date: '2024-06-15', - message: 'feat: add feature', - refs: 'HEAD -> main', - body: '', - author_name: 'John Doe', - author_email: 'john@example.com', - }, - { - hash: 'def456', - date: '2024-06-14', - message: 'fix: bug fix', - refs: '', - body: '', - author_name: 'Jane Smith', - author_email: 'jane@example.com', - }, - ]; - - const expectedCommits = [ - { - hash: 'abc123', - date: '2024-06-15', - message: 'feat: add feature', - refs: 'HEAD -> main', - body: '', - authorName: 'John Doe', - authorEmail: 'john@example.com', - }, - { - hash: 'def456', - date: '2024-06-14', - message: 'fix: bug fix', - refs: '', - body: '', - authorName: 'Jane Smith', - authorEmail: 'jane@example.com', - }, - ]; - - mockGitLog.mockResolvedValue({ all: gitLogOutput }); - mockGitRaw.mockResolvedValue('2'); - - const result = await listCommits({ - repo: 'github.com/test/repo', - }); - - expect(result).toEqual({ commits: expectedCommits, totalCount: 2 }); - }); - - it('should return empty commits array when no commits match', async () => { - mockGitLog.mockResolvedValue({ all: [] }); - mockGitRaw.mockResolvedValue('0'); - - const result = await listCommits({ - repo: 'github.com/test/repo', - query: 'nonexistent', - }); - - expect(result).toEqual({ commits: [], totalCount: 0 }); - }); - }); - - describe('error handling', () => { - it('should return error for "not a git repository"', async () => { - mockGitLog.mockRejectedValue(new Error('not a git repository')); - - const result = await listCommits({ - repo: 'github.com/test/repo', - }); - - expect(result).toMatchObject({ - errorCode: 'UNEXPECTED_ERROR', - message: expect.stringContaining('not a valid git repository'), - }); - }); - - it('should return error for "ambiguous argument"', async () => { - mockGitLog.mockRejectedValue(new Error('ambiguous argument')); - - const result = await listCommits({ - repo: 'github.com/test/repo', - since: 'invalid-date', - }); - - expect(result).toMatchObject({ - errorCode: 'UNEXPECTED_ERROR', - message: expect.stringContaining('Invalid git reference or date format'), - }); - }); - - it('should return error for timeout', async () => { - mockGitLog.mockRejectedValue(new Error('timeout exceeded')); - - const result = await listCommits({ - repo: 'github.com/test/repo', - }); - - expect(result).toMatchObject({ - errorCode: 'UNEXPECTED_ERROR', - message: expect.stringContaining('timed out'), - }); - }); - - it('should return ServiceError for other Error instances', async () => { - mockGitLog.mockRejectedValue(new Error('some other error')); - - const result = await listCommits({ - repo: 'github.com/test/repo', - }); - - expect(result).toMatchObject({ - errorCode: 'UNEXPECTED_ERROR', - message: expect.stringContaining('Failed to search commits in repository github.com/test/repo'), - }); - }); - - it('should return ServiceError for non-Error exceptions', async () => { - mockGitLog.mockRejectedValue('string error'); - - const result = await listCommits({ - repo: 'github.com/test/repo', - }); - - expect(result).toMatchObject({ - errorCode: 'UNEXPECTED_ERROR', - message: expect.stringContaining('Failed to search commits in repository github.com/test/repo'), - }); - }); - }); - - describe('git client configuration', () => { - it('should set working directory using cwd', async () => { - mockGitLog.mockResolvedValue({ all: [] }); - - await listCommits({ - repo: 'github.com/test/repo', - }); - - expect(mockCwd).toHaveBeenCalledWith('/mock/cache/dir/123'); - }); - - it('should use correct repository path from database', async () => { - mockFindFirst.mockResolvedValue({ id: 456, name: 'github.com/other/repo' }); - mockGitLog.mockResolvedValue({ all: [] }); - - await listCommits({ - repo: 'github.com/other/repo', - }); - - expect(mockCwd).toHaveBeenCalledWith('/mock/cache/dir/456'); - }); - }); - - describe('integration scenarios', () => { - it('should handle a typical commit search with filters', async () => { - const gitLogOutput = [ - { - hash: 'abc123', - date: '2024-06-10T14:30:00Z', - message: 'fix: resolve authentication bug', - refs: 'HEAD -> main', - body: 'Fixed issue with JWT token validation', - author_name: 'Security Team', - author_email: 'security@example.com', - }, - ]; - - const expectedCommits = [ - { - hash: 'abc123', - date: '2024-06-10T14:30:00Z', - message: 'fix: resolve authentication bug', - refs: 'HEAD -> main', - body: 'Fixed issue with JWT token validation', - authorName: 'Security Team', - authorEmail: 'security@example.com', - }, - ]; - - vi.spyOn(dateUtils, 'validateDateRange').mockReturnValue(null); - vi.spyOn(dateUtils, 'toGitDate').mockImplementation((date) => date); - mockGitLog.mockResolvedValue({ all: gitLogOutput }); - mockGitRaw.mockResolvedValue('1'); - - const result = await listCommits({ - repo: 'github.com/test/repo', - query: 'authentication', - since: '30 days ago', - until: 'yesterday', - author: 'security', - maxCount: 20, - }); - - expect(result).toEqual({ commits: expectedCommits, totalCount: 1 }); - expect(mockGitLog).toHaveBeenCalledWith([ - '--max-count=20', - '--since=30 days ago', - '--until=yesterday', - '--author=security', - '--regexp-ignore-case', - '--grep=authentication', - 'HEAD', - ]); - }); - - it('should handle repository not found in database', async () => { - mockFindFirst.mockResolvedValue(null); - - const result = await listCommits({ - repo: 'github.com/nonexistent/repo', - query: 'feature', - }); - - expect(result).toMatchObject({ - errorCode: 'NOT_FOUND', - }); - expect(result).toHaveProperty('message'); - const message = (result as { message: string }).message; - expect(message).toContain('github.com/nonexistent/repo'); - expect(message).toContain('not found'); - }); - }); - - describe('repository lookup', () => { - beforeEach(() => { - // Reset mockFindFirst before each test in this suite - mockFindFirst.mockReset(); - }); - - it('should query database for repository by name', async () => { - mockFindFirst.mockResolvedValue({ id: 456, name: 'github.com/owner/repo' }); - mockGitLog.mockResolvedValue({ all: [] }); - - const result = await listCommits({ - repo: 'github.com/owner/repo', - }); - - expect(result).toMatchObject({ commits: [], totalCount: expect.any(Number) }); - expect(mockFindFirst).toHaveBeenCalledWith({ - where: { - name: 'github.com/owner/repo', - orgId: 1, - }, - }); - }); - - it('should return NOT_FOUND error when repository is not found', async () => { - mockFindFirst.mockResolvedValue(null); - - const result = await listCommits({ - repo: 'github.com/nonexistent/repo', - }); - - expect(result).toMatchObject({ - errorCode: 'NOT_FOUND', - message: expect.stringContaining('Repository "github.com/nonexistent/repo" not found'), - }); - }); - - it('should use repository ID from database to determine path', async () => { - mockFindFirst.mockResolvedValue({ id: 789, name: 'github.com/example/project' }); - mockGitLog.mockResolvedValue({ all: [] }); - - await listCommits({ - repo: 'github.com/example/project', - }); - - expect(mockCwd).toHaveBeenCalledWith('/mock/cache/dir/789'); - }); - - it('should work end-to-end with repository lookup', async () => { - const gitLogOutput = [ - { - hash: 'xyz789', - date: '2024-06-20T10:00:00Z', - message: 'feat: new feature', - refs: 'main', - body: 'Added new functionality', - author_name: 'Developer', - author_email: 'dev@example.com', - }, - ]; - - const expectedCommits = [ - { - hash: 'xyz789', - date: '2024-06-20T10:00:00Z', - message: 'feat: new feature', - refs: 'main', - body: 'Added new functionality', - authorName: 'Developer', - authorEmail: 'dev@example.com', - }, - ]; - - mockFindFirst.mockResolvedValue({ id: 555, name: 'github.com/test/repository' }); - vi.spyOn(dateUtils, 'validateDateRange').mockReturnValue(null); - vi.spyOn(dateUtils, 'toGitDate').mockImplementation((date) => date); - mockGitLog.mockResolvedValue({ all: gitLogOutput }); - mockGitRaw.mockResolvedValue('1'); - - const result = await listCommits({ - repo: 'github.com/test/repository', - query: 'feature', - since: '7 days ago', - author: 'Developer', - }); - - expect(result).toEqual({ commits: expectedCommits, totalCount: 1 }); - expect(mockCwd).toHaveBeenCalledWith('/mock/cache/dir/555'); - }); - }); -}); diff --git a/packages/web/src/features/git/listCommitsApi.ts b/packages/web/src/features/git/listCommitsApi.ts deleted file mode 100644 index 682692ab9..000000000 --- a/packages/web/src/features/git/listCommitsApi.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { invalidGitRef, notFound, ServiceError, unexpectedError } from '@/lib/serviceError'; -import { withOptionalAuth } from '@/middleware/withAuth'; -import { getRepoPath } from '@sourcebot/shared'; -import { z } from 'zod'; -import { simpleGit } from 'simple-git'; -import { toGitDate, validateDateRange } from './dateUtils'; -import { commitSchema } from './schemas'; -import { isGitRefValid } from './utils'; - -export type Commit = z.infer; - -export type ListCommitsResponse = { - commits: Commit[]; - totalCount: number; -}; - -export type ListCommitsQueryParams = { - repo: string; - query?: string; - since?: string; - until?: string; - author?: string; - ref?: string; - path?: string; - page?: number; - perPage?: number; -}; - -type ListCommitsRequest = { - repo: string; - query?: string; - since?: string; - until?: string; - author?: string; - ref?: string; - path?: string; - maxCount?: number; - skip?: number; -} - -/** - * List commits in a repository using git log. - * - * **Date Formats**: Supports both ISO 8601 dates and relative formats - * (e.g., "30 days ago", "last week", "yesterday"). Git natively handles - * these formats in the --since and --until flags. - */ -export const listCommits = async ({ - repo: repoName, - query, - since, - until, - author, - ref = 'HEAD', - path, - maxCount = 50, - skip = 0, -}: ListCommitsRequest): Promise => sew(() => - withOptionalAuth(async ({ org, prisma }) => { - const repo = await prisma.repo.findFirst({ - where: { - name: repoName, - orgId: org.id, - }, - }); - - if (!repo) { - return notFound(`Repository "${repoName}" not found.`); - } - - if (!isGitRefValid(ref)) { - return invalidGitRef(ref); - } - - const { path: repoPath } = getRepoPath(repo); - - // Validate date range if both since and until are provided - const dateRangeError = validateDateRange(since, until); - if (dateRangeError) { - return unexpectedError(dateRangeError); - } - - // Parse dates to git-compatible format - const gitSince = toGitDate(since); - const gitUntil = toGitDate(until); - - const git = simpleGit().cwd(repoPath); - - try { - // --author and --grep are interpreted as git's default regex (POSIX BRE - // with GNU extensions). Callers are responsible for escaping metacharacters - // when they want literal matching. - const sharedOptions: Record = { - ...(gitSince ? { '--since': gitSince } : {}), - ...(gitUntil ? { '--until': gitUntil } : {}), - ...(author ? { - '--author': author, - '--regexp-ignore-case': null /// Case insensitive - } : {}), - ...(query ? { - '--grep': query, - '--regexp-ignore-case': null /// Case insensitive - } : {}), - }; - - // Build args array directly to ensure correct ordering: - // git log [flags] [-- ] - const logArgs: string[] = [`--max-count=${maxCount}`]; - if (skip > 0) { - logArgs.push(`--skip=${skip}`); - } - for (const [key, value] of Object.entries(sharedOptions)) { - logArgs.push(value !== null ? `${key}=${value}` : key); - } - logArgs.push(ref); - if (path) { - logArgs.push('--', path); - } - - // First, get the commits - const log = await git.log(logArgs); - - // Then, use rev-list to get the total count of commits - const countArgs = ['rev-list', '--count', ref]; - for (const [key, value] of Object.entries(sharedOptions)) { - countArgs.push(value !== null ? `${key}=${value}` : key); - } - if (path) { - countArgs.push('--', path); - } - - const totalCount = parseInt((await git.raw(countArgs)).trim(), 10); - - const commits: Commit[] = log.all.map((c) => ({ - hash: c.hash, - date: c.date, - message: c.message, - refs: c.refs, - body: c.body, - authorName: c.author_name, - authorEmail: c.author_email, - })); - - return { commits, totalCount }; - } catch (error: unknown) { - // Provide detailed error messages for common git errors - const errorMessage = error instanceof Error ? error.message : String(error); - - if (errorMessage.includes('not a git repository')) { - return unexpectedError( - `Invalid git repository at ${repoPath}. ` + - `The directory exists but is not a valid git repository.` - ); - } - - if (errorMessage.includes('ambiguous argument')) { - return unexpectedError( - `Invalid git reference or date format. ` + - `Please check your date parameters: since="${since}", until="${until}"` - ); - } - - if (errorMessage.includes('timeout')) { - return unexpectedError( - `Git operation timed out after 30 seconds for repository ${repoName}. ` + - `The repository may be too large or the git operation is taking too long.` - ); - } - - // Generic error fallback - if (error instanceof Error) { - throw new Error( - `Failed to search commits in repository ${repoName}: ${error.message}` - ); - } else { - throw new Error( - `Failed to search commits in repository ${repoName}: ${errorMessage}` - ); - } - } - })); diff --git a/packages/web/src/features/git/logger.ts b/packages/web/src/features/git/logger.ts deleted file mode 100644 index 71c08f5f0..000000000 --- a/packages/web/src/features/git/logger.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createLogger } from "@sourcebot/shared"; - -export const logger = createLogger('git'); \ No newline at end of file diff --git a/packages/web/src/features/git/schemas.ts b/packages/web/src/features/git/schemas.ts deleted file mode 100644 index ba548c275..000000000 --- a/packages/web/src/features/git/schemas.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { CodeHostType } from '@sourcebot/db'; -import z from 'zod'; -import { fileTreeItemSchema, fileTreeNodeSchema } from './types'; - -export const getTreeRequestSchema = z.object({ - repoName: z.string(), - revisionName: z.string(), - paths: z.array(z.string()), -}); - -export const getTreeResponseSchema = z.object({ - tree: fileTreeNodeSchema, -}); - -export const getFilesRequestSchema = z.object({ - repoName: z.string(), - revisionName: z.string(), -}); - -export const getFilesResponseSchema = z.array(fileTreeItemSchema); - -export const fileSourceRequestSchema = z.object({ - path: z.string(), - repo: z.string(), - ref: z.string().optional(), -}); - -export const fileSourceResponseSchema = z.object({ - source: z.string(), - language: z.string(), - path: z.string(), - repo: z.string(), - repoCodeHostType: z.nativeEnum(CodeHostType), - repoDisplayName: z.string().optional(), - repoExternalWebUrl: z.string().optional(), - webUrl: z.string(), - externalWebUrl: z.string().optional(), - // The git blob OID (SHA-1 of the file bytes) at the resolved ref. Used as a - // cheap content identifier to detect when an imported file has changed. - // Optional because it is best-effort; absent if `git rev-parse` failed. - blobSha: z.string().optional(), -}); - -export const getDiffRequestSchema = z.object({ - repo: z.string().describe('The fully-qualified repository name.'), - base: z.string().describe('The base git ref (branch, tag, or commit SHA) to diff from.'), - head: z.string().describe('The head git ref (branch, tag, or commit SHA) to diff to.'), - path: z.string().optional().describe('Restrict the diff to changes touching this file path. Omit to diff all changes between the two refs.'), -}); - -const hunkRangeSchema = z.object({ - start: z.number().int().describe('The 1-based line number where the range starts.'), - lines: z.number().int().describe('The number of lines the range spans.'), -}); - -const diffHunkSchema = z.object({ - oldRange: hunkRangeSchema.describe('The line range in the old file.'), - newRange: hunkRangeSchema.describe('The line range in the new file.'), - heading: z.string().optional().describe('Optional context heading extracted from the @@ line, typically the enclosing function or class name.'), - body: z.string().describe('The diff content, with each line prefixed by a space (context), + (addition), or - (deletion).'), -}); - -const fileDiffSchema = z.object({ - oldPath: z.string().nullable().describe('The file path before the change. `null` for added files.'), - newPath: z.string().nullable().describe('The file path after the change. `null` for deleted files.'), - hunks: z.array(diffHunkSchema).describe('The list of changed regions within the file.'), -}); - -export const getDiffResponseSchema = z.object({ - files: z.array(fileDiffSchema).describe('The list of changed files.'), -}); - -export const listCommitsQueryParamsSchema = z.object({ - repo: z.string().describe('The fully-qualified repository name.'), - query: z.string().optional().describe('Filter commits by message content (case-insensitive). Interpreted as a POSIX BRE regex — escape metacharacters for literal matching.'), - since: z.string().optional().describe('Return commits after this date. Accepts ISO 8601 or relative formats (e.g. `30 days ago`).'), - until: z.string().optional().describe('Return commits before this date. Accepts ISO 8601 or relative formats.'), - author: z.string().optional().describe('Filter commits by author name or email (case-insensitive). Interpreted as a POSIX BRE regex — escape metacharacters for literal matching.'), - ref: z.string().optional().describe('The git ref (branch, tag, or commit SHA) to list commits from. Defaults to `HEAD`.'), - path: z.string().optional().describe('Restrict commits to those that touch this file path.'), - page: z.coerce.number().int().positive().default(1), - perPage: z.coerce.number().int().positive().max(100).default(50), -}); - -export const commitSchema = z.object({ - hash: z.string().describe('The full commit SHA.'), - date: z.string().describe('The commit date in ISO 8601 format.'), - message: z.string().describe('The commit subject line.'), - refs: z.string().describe('Refs pointing to this commit (e.g. branch or tag names).'), - body: z.string().describe('The commit body (everything after the subject line).'), - authorName: z.string(), - authorEmail: z.string(), -}); - -export const getCommitQueryParamsSchema = z.object({ - repo: z.string().describe('The fully-qualified repository name.'), - ref: z.string().describe('The git ref (commit SHA, branch, or tag).'), -}); - -export const commitDetailSchema = commitSchema.extend({ - parents: z.array(z.string()).describe('The parent commit SHAs.'), -}); - -export const listCommitAuthorsQueryParamsSchema = z.object({ - repo: z.string().describe('The fully-qualified repository name.'), - ref: z.string().optional().describe('The git ref (branch, tag, or commit SHA) to list authors from. Defaults to `HEAD`.'), - path: z.string().optional().describe('Restrict authors to those who touched this file path.'), - page: z.coerce.number().int().positive().default(1), - perPage: z.coerce.number().int().positive().max(100).default(50), -}); - -export const commitAuthorSchema = z.object({ - name: z.string(), - email: z.string(), - commitCount: z.number().int().nonnegative(), -}); - -export const fileBlameRequestSchema = z.object({ - path: z.string().describe('The file path to blame, relative to the repository root.'), - repo: z.string().describe('The fully-qualified repository name.'), - ref: z.string().optional().describe('The git ref (branch, tag, or commit SHA) to blame at. Defaults to the repository\'s default branch.'), -}); - -export const blameRangeSchema = z.object({ - hash: z.string().describe('The hash of the commit that last modified the lines in this range.'), - path: z.string().describe('The file path as it existed at the attributing commit. May differ from the current path due to renames.'), - startLine: z.number().int().positive().describe('The 1-based line number where the range begins (inclusive).'), - lineCount: z.number().int().positive().describe('The number of contiguous lines in this range.'), -}); - -export const blamePreviousSchema = z.object({ - hash: z.string().describe('The hash of the commit that previously affected these lines (i.e., the next step backwards in the blame walk).'), - path: z.string().describe('The file path as it existed at the previous commit. May differ from the current path due to renames.'), -}); - -export const blameCommitSchema = z.object({ - hash: z.string().describe('The full commit SHA.'), - date: z.string().describe('The commit date in ISO 8601 format.'), - message: z.string().describe('The commit subject line.'), - authorName: z.string(), - authorEmail: z.string(), - previous: blamePreviousSchema.optional().describe('Pointer to the previous commit that affected these lines, with the file path as it existed there. Absent when the commit introduced the lines (no earlier history to walk to).'), -}); - -export const fileBlameResponseSchema = z.object({ - ranges: z.array(blameRangeSchema).describe('Contiguous, non-overlapping line ranges ordered by startLine. Each range is attributed to a single commit.'), - commits: z.record(z.string(), blameCommitSchema).describe('Commit metadata keyed by hash, deduplicated across ranges.'), -}); - -export const branchSchema = z.object({ - name: z.string().describe('The branch name without the `refs/heads/` prefix.'), - commit: z.string().describe('The commit SHA at the branch head.'), - committedAt: z.string().describe('The committer date of the latest commit on the branch, in ISO 8601 format.'), - isDefault: z.boolean().describe('Whether this is the repository\'s default branch.'), - isIndexed: z.boolean().describe('Whether this branch is included in Sourcebot\'s current indexed revisions, i.e. whether code search can search it.'), -}); diff --git a/packages/web/src/features/git/types.ts b/packages/web/src/features/git/types.ts deleted file mode 100644 index 6c8b2de80..000000000 --- a/packages/web/src/features/git/types.ts +++ /dev/null @@ -1,24 +0,0 @@ -import z from "zod"; - -export const fileTreeItemSchema = z.object({ - type: z.string(), - path: z.string(), - name: z.string(), -}); - -export type FileTreeItem = z.infer; - -type FileTreeNodeType = { - type: string; - path: string; - name: string; - children: FileTreeNodeType[]; -}; - -export const fileTreeNodeSchema: z.ZodType = z.lazy(() => z.object({ - type: z.string(), - path: z.string(), - name: z.string(), - children: z.array(fileTreeNodeSchema), -})); -export type FileTreeNode = z.infer; diff --git a/packages/web/src/features/git/utils.test.ts b/packages/web/src/features/git/utils.test.ts deleted file mode 100644 index e4aa5f8e2..000000000 --- a/packages/web/src/features/git/utils.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { expect, test, vi } from 'vitest'; - -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => ({ - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})); - -import { buildFileTree, isPathValid, normalizePath } from './utils'; - -test('normalizePath adds a trailing slash and strips leading slashes', () => { - expect(normalizePath('/a/b')).toBe('a/b/'); -}); - -test('normalizePath keeps an existing trailing slash', () => { - expect(normalizePath('a/b/')).toBe('a/b/'); -}); - -test('normalizePath returns empty string for root', () => { - expect(normalizePath('/')).toBe(''); -}); - -test('isPathValid rejects traversal and null bytes', () => { - expect(isPathValid('a/../b')).toBe(false); - expect(isPathValid('a/\0b')).toBe(false); -}); - -test('isPathValid allows normal paths', () => { - expect(isPathValid('a/b')).toBe(true); -}); - -test('isPathValid allows paths with dots', () => { - expect(isPathValid('a/b/c.txt')).toBe(true); - expect(isPathValid('a/b/c...')).toBe(true); - expect(isPathValid('a/b/c.../d')).toBe(true); - expect(isPathValid('a/b/..c')).toBe(true); - expect(isPathValid('a/b/[..path]')).toBe(true); -}); - - -test('buildFileTree handles a empty flat list', () => { - const flatList: { type: string, path: string }[] = []; - const tree = buildFileTree(flatList); - expect(tree).toMatchObject({ - name: 'root', - type: 'tree', - path: '', - }); -}); - -test('buildFileTree builds a sorted tree from a flat list', () => { - const flatList: { type: string, path: string }[] = [ - { type: 'blob', path: 'a' }, - { type: 'tree', path: 'b' }, - { type: 'tree', path: 'b/c' }, - { type: 'tree', path: 'd' }, - { type: 'blob', path: 'd/e' } - ]; - - const tree = buildFileTree(flatList); - - expect(tree).toMatchObject({ - name: 'root', - type: 'tree', - path: '', - children: [ - { - name: 'b', - type: 'tree', - path: 'b', - children: [ - { - name: 'c', - type: 'tree', - path: 'b/c', - children: [], - }, - ], - }, - { - name: 'd', - type: 'tree', - path: 'd', - children: [ - { - name: 'e', - type: 'blob', - path: 'd/e', - children: [], - }, - ], - }, - { - name: 'a', - type: 'blob', - path: 'a', - children: [], - } - ], - }); -}); - diff --git a/packages/web/src/features/git/utils.ts b/packages/web/src/features/git/utils.ts deleted file mode 100644 index f9b1a71e7..000000000 --- a/packages/web/src/features/git/utils.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { FileTreeItem, FileTreeNode } from "./types"; - -// @note: reject refs starting with '-' to prevent git flag injection. -export const isGitRefValid = (ref: string): boolean => { - return !ref.startsWith('-'); -} - -// @note: we don't allow directory traversal -// or null bytes in the path. -export const isPathValid = (path: string) => { - const pathSegments = path.split('/'); - if (pathSegments.some(segment => segment === '..') || path.includes('\0')) { - return false; - } - - return true; -} - -export const normalizePath = (path: string): string => { - // Normalize the path by... - let normalizedPath = path; - - // ... adding a trailing slash if it doesn't have one. - // This is important since ls-tree won't return the contents - // of a directory if it doesn't have a trailing slash. - if (!normalizedPath.endsWith('/')) { - normalizedPath = `${normalizedPath}/`; - } - - // ... removing any leading slashes. This is needed since - // the path is relative to the repository's root, so we - // need a relative path. - if (normalizedPath.startsWith('/')) { - normalizedPath = normalizedPath.slice(1); - } - - return normalizedPath; -} - -export const compareFileTreeItems = (a: FileTreeItem, b: FileTreeItem): number => { - if (a.type !== b.type) { - return a.type === 'tree' ? -1 : 1; - } - return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }); -} - - - -export const buildFileTree = (flatList: { type: string, path: string }[]): FileTreeNode => { - const root: FileTreeNode = { - name: 'root', - path: '', - type: 'tree', - children: [], - }; - - for (const item of flatList) { - const parts = item.path.split('/'); - let current: FileTreeNode = root; - - for (let i = 0; i < parts.length; i++) { - const part = parts[i]; - const isLeaf = i === parts.length - 1; - const nodeType = isLeaf ? item.type : 'tree'; - let next = current.children.find((child: FileTreeNode) => child.name === part && child.type === nodeType); - - if (!next) { - next = { - name: part, - path: item.path, - type: nodeType, - children: [], - }; - current.children.push(next); - } - current = next; - } - } - - const sortTree = (node: FileTreeNode): FileTreeNode => { - if (node.type === 'blob') { - return node; - } - - const sortedChildren = node.children - .map(sortTree) - .sort(compareFileTreeItems); - - return { - ...node, - children: sortedChildren, - }; - }; - - return sortTree(root); -} \ No newline at end of file diff --git a/packages/web/src/features/mcp/mcpOAuthReturnTo.test.ts b/packages/web/src/features/mcp/mcpOAuthReturnTo.test.ts deleted file mode 100644 index 8b3b8a0fe..000000000 --- a/packages/web/src/features/mcp/mcpOAuthReturnTo.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { describe, expect, test } from 'vitest'; -import { - createMcpOAuthState, - getMcpOAuthReturnToFromState, - normalizeMcpOAuthReturnTo, -} from './mcpOAuthReturnTo'; - -describe('MCP OAuth return paths', () => { - test('allows chat return paths', () => { - expect(normalizeMcpOAuthReturnTo('/chat')).toBe('/chat'); - expect(normalizeMcpOAuthReturnTo('/chat/thread-1?foo=bar')).toBe('/chat/thread-1?foo=bar'); - }); - - test('allows connector settings return paths', () => { - expect(normalizeMcpOAuthReturnTo('/settings/accountAskAgent?status=connected')).toBe('/settings/accountAskAgent?status=connected'); - }); - - test('rejects external and unrelated return paths', () => { - expect(normalizeMcpOAuthReturnTo('https://evil.example.com/chat')).toBeUndefined(); - expect(normalizeMcpOAuthReturnTo('//evil.example.com/chat')).toBeUndefined(); - expect(normalizeMcpOAuthReturnTo('/settings')).toBeUndefined(); - }); - - test('encodes and decodes return paths inside OAuth state', () => { - const state = createMcpOAuthState('nonce-1', '/chat'); - - expect(state).not.toBe('nonce-1'); - expect(getMcpOAuthReturnToFromState(state)).toBe('/chat'); - }); - - test('leaves state unchanged when no valid return path exists', () => { - expect(createMcpOAuthState('nonce-1')).toBe('nonce-1'); - expect(createMcpOAuthState('nonce-1', '/settings')).toBe('nonce-1'); - expect(getMcpOAuthReturnToFromState('nonce-1')).toBeUndefined(); - }); -}); diff --git a/packages/web/src/features/mcp/mcpOAuthReturnTo.ts b/packages/web/src/features/mcp/mcpOAuthReturnTo.ts deleted file mode 100644 index 8127abdbc..000000000 --- a/packages/web/src/features/mcp/mcpOAuthReturnTo.ts +++ /dev/null @@ -1,63 +0,0 @@ -const MCP_OAUTH_STATE_PREFIX = 'sourcebot_mcp.'; -const MCP_OAUTH_STATE_BASE_URL = 'https://sourcebot.invalid'; - -function isAllowedMcpOAuthReturnPath(pathname: string): boolean { - return pathname === '/chat' || pathname.startsWith('/chat/') || pathname === '/settings/accountAskAgent'; -} - -export function normalizeMcpOAuthReturnTo(returnTo: unknown): string | undefined { - if (typeof returnTo !== 'string') { - return undefined; - } - - const trimmedReturnTo = returnTo.trim(); - if (!trimmedReturnTo || !trimmedReturnTo.startsWith('/') || trimmedReturnTo.startsWith('//') || trimmedReturnTo.includes('\\')) { - return undefined; - } - - try { - const url = new URL(trimmedReturnTo, MCP_OAUTH_STATE_BASE_URL); - if (url.origin !== MCP_OAUTH_STATE_BASE_URL || !isAllowedMcpOAuthReturnPath(url.pathname)) { - return undefined; - } - - return `${url.pathname}${url.search}`; - } catch { - return undefined; - } -} - -export function createMcpOAuthState(nonce: string, returnTo?: string): string { - const normalizedReturnTo = normalizeMcpOAuthReturnTo(returnTo); - if (!normalizedReturnTo) { - return nonce; - } - - const encoded = Buffer.from(JSON.stringify({ - nonce, - returnTo: normalizedReturnTo, - })).toString('base64url'); - return `${MCP_OAUTH_STATE_PREFIX}${encoded}`; -} - -export function getMcpOAuthReturnToFromState(state: string | null | undefined): string | undefined { - if (!state?.startsWith(MCP_OAUTH_STATE_PREFIX)) { - return undefined; - } - - try { - const encoded = state.slice(MCP_OAUTH_STATE_PREFIX.length); - const payload = JSON.parse(Buffer.from(encoded, 'base64url').toString('utf8')) as unknown; - if ( - typeof payload === 'object' && - payload !== null && - 'returnTo' in payload - ) { - return normalizeMcpOAuthReturnTo(payload.returnTo); - } - } catch { - return undefined; - } - - return undefined; -} diff --git a/packages/web/src/features/mcp/prismaOAuthClientProvider.test.ts b/packages/web/src/features/mcp/prismaOAuthClientProvider.test.ts deleted file mode 100644 index 998181c7b..000000000 --- a/packages/web/src/features/mcp/prismaOAuthClientProvider.test.ts +++ /dev/null @@ -1,268 +0,0 @@ -import { describe, expect, test, vi, beforeEach } from 'vitest'; -import { McpServerClientInfoSource } from '@sourcebot/db'; - -const mocks = vi.hoisted(() => ({ - logger: { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }, -})); - -vi.mock('server-only', () => ({})); -vi.mock('@/prisma', () => ({ - __unsafePrisma: { - mcpServer: {}, - userMcpServer: {}, - }, -})); -vi.mock('@sourcebot/shared', () => ({ - encryptOAuthToken: vi.fn((text: string | null | undefined) => text ? `encrypted:${text}` : undefined), - decryptOAuthToken: vi.fn((text: string | null | undefined) => text?.startsWith('encrypted:') ? text.slice('encrypted:'.length) : text), - createLogger: () => mocks.logger, -})); - -const { - PrismaOAuthClientProvider, - clearMcpServerClientCredentialsForObservedClient, -} = await import('./prismaOAuthClientProvider'); - -function createPrismaMock() { - return { - mcpServer: { - findFirst: vi.fn(), - updateMany: vi.fn(), - }, - userMcpServer: { - findUnique: vi.fn(), - update: vi.fn(), - updateMany: vi.fn(), - }, - }; -} - -function createProvider(prisma = createPrismaMock(), allowClientRegistration = false) { - return new PrismaOAuthClientProvider({ - prisma: prisma as never, - clientInvalidationPrisma: prisma as never, - serverId: 'server-1', - orgId: 1, - userId: 'user-1', - callbackUrl: 'https://sourcebot.example.com/api/ee/askmcp/callback', - allowClientRegistration, - }); -} - -beforeEach(() => { - vi.clearAllMocks(); -}); - -describe('PrismaOAuthClientProvider modes', () => { - test('connect-mode provider exposes saveClientInformation', () => { - const provider = createProvider(createPrismaMock(), true); - - expect('saveClientInformation' in provider).toBe(true); - expect(provider.saveClientInformation).toEqual(expect.any(Function)); - }); - - test('runtime and callback providers omit saveClientInformation', () => { - const provider = createProvider(); - - expect('saveClientInformation' in provider).toBe(false); - expect(provider.saveClientInformation).toBeUndefined(); - }); -}); - -describe('clearMcpServerClientCredentialsForObservedClient', () => { - test('matching observed clientInfo clears org clientInfo and all server tokens', async () => { - const prisma = createPrismaMock(); - prisma.mcpServer.updateMany.mockResolvedValue({ count: 1 }); - prisma.userMcpServer.updateMany.mockResolvedValue({ count: 2 }); - - const didClear = await clearMcpServerClientCredentialsForObservedClient({ - prisma: prisma as never, - serverId: 'server-1', - orgId: 1, - observedClientInfo: 'encrypted-client-info', - }); - - expect(didClear).toBe(true); - expect(prisma.mcpServer.updateMany).toHaveBeenCalledWith({ - where: { - id: 'server-1', - orgId: 1, - clientInfo: 'encrypted-client-info', - clientInfoSource: McpServerClientInfoSource.DYNAMIC, - }, - data: { clientInfo: null }, - }); - expect(prisma.userMcpServer.updateMany).toHaveBeenCalledWith({ - where: { - serverId: 'server-1', - server: { orgId: 1 }, - }, - data: { - tokens: null, - tokensExpiresAt: null, - }, - }); - }); - - test('stale observed clientInfo clears neither org clientInfo nor tokens', async () => { - const prisma = createPrismaMock(); - prisma.mcpServer.updateMany.mockResolvedValue({ count: 0 }); - - const didClear = await clearMcpServerClientCredentialsForObservedClient({ - prisma: prisma as never, - serverId: 'server-1', - orgId: 1, - observedClientInfo: 'stale-client-info', - }); - - expect(didClear).toBe(false); - expect(prisma.mcpServer.updateMany).toHaveBeenCalledOnce(); - expect(prisma.userMcpServer.updateMany).not.toHaveBeenCalled(); - }); -}); - -describe('PrismaOAuthClientProvider PKCE verifier storage', () => { - test('saveCodeVerifier encrypts the verifier before persisting it', async () => { - const prisma = createPrismaMock(); - prisma.userMcpServer.update.mockResolvedValue({ - userId: 'user-1', - serverId: 'server-1', - }); - const provider = createProvider(prisma); - - await provider.saveCodeVerifier('verifier-secret'); - - expect(prisma.userMcpServer.update).toHaveBeenCalledWith({ - where: { - userId_serverId: { userId: 'user-1', serverId: 'server-1' }, - }, - data: { - codeVerifier: 'encrypted:verifier-secret', - }, - }); - }); - - test('codeVerifier decrypts the stored verifier', async () => { - const prisma = createPrismaMock(); - prisma.userMcpServer.findUnique.mockResolvedValue({ - codeVerifier: 'encrypted:verifier-secret', - tokens: null, - state: null, - }); - const provider = createProvider(prisma); - - await expect(provider.codeVerifier()).resolves.toBe('verifier-secret'); - expect(mocks.logger.warn).not.toHaveBeenCalled(); - }); - - test('codeVerifier still accepts plaintext verifier values during migration and logs the fallback', async () => { - const prisma = createPrismaMock(); - prisma.userMcpServer.findUnique.mockResolvedValue({ - codeVerifier: 'plaintext-verifier', - tokens: null, - state: null, - }); - const provider = createProvider(prisma); - - await expect(provider.codeVerifier()).resolves.toBe('plaintext-verifier'); - expect(mocks.logger.warn).toHaveBeenCalledWith( - 'MCP OAuth code verifier was read without decryption.', - { - serverId: 'server-1', - orgId: 1, - userId: 'user-1', - }, - ); - }); -}); - -describe('PrismaOAuthClientProvider authorization redirect', () => { - test('overwrites existing prompt values with consent', async () => { - const prisma = createPrismaMock(); - prisma.userMcpServer.update.mockResolvedValue({ - userId: 'user-1', - serverId: 'server-1', - }); - const provider = createProvider(prisma); - - await provider.redirectToAuthorization(new URL('https://oauth.example.com/authorize?prompt=none&client_id=client-1')); - - expect(provider.authorizationUrl).toBe('https://oauth.example.com/authorize?prompt=consent&client_id=client-1'); - expect(prisma.userMcpServer.update).toHaveBeenCalledWith({ - where: { - userId_serverId: { userId: 'user-1', serverId: 'server-1' }, - }, - data: { - tokens: null, - tokensExpiresAt: null, - }, - }); - }); -}); - -describe('PrismaOAuthClientProvider static client information', () => { - test('clientInformation returns static OAuth client credentials', async () => { - const prisma = createPrismaMock(); - prisma.mcpServer.findFirst.mockResolvedValue({ - clientInfo: 'encrypted:{"client_id":"client-id","client_secret":"client-secret"}', - clientInfoSource: McpServerClientInfoSource.STATIC, - }); - const provider = createProvider(prisma); - - await expect(provider.clientInformation()).resolves.toEqual({ - client_id: 'client-id', - client_secret: 'client-secret', - }); - }); - - test('invalidate all preserves static client information and clears only the current user tokens and verifier', async () => { - const prisma = createPrismaMock(); - prisma.mcpServer.findFirst.mockResolvedValue({ - clientInfo: 'encrypted:{"client_id":"client-id","client_secret":"client-secret"}', - clientInfoSource: McpServerClientInfoSource.STATIC, - }); - prisma.mcpServer.updateMany.mockResolvedValue({ count: 0 }); - prisma.userMcpServer.update.mockResolvedValue({ - userId: 'user-1', - serverId: 'server-1', - }); - const provider = createProvider(prisma); - - await provider.clientInformation(); - await provider.invalidateCredentials('all'); - - expect(prisma.mcpServer.updateMany).toHaveBeenCalledWith({ - where: { - id: 'server-1', - orgId: 1, - clientInfo: 'encrypted:{"client_id":"client-id","client_secret":"client-secret"}', - clientInfoSource: McpServerClientInfoSource.DYNAMIC, - }, - data: { clientInfo: null }, - }); - expect(prisma.userMcpServer.updateMany).not.toHaveBeenCalled(); - expect(prisma.userMcpServer.update).toHaveBeenCalledWith({ - where: { - userId_serverId: { userId: 'user-1', serverId: 'server-1' }, - }, - data: { - tokens: null, - tokensExpiresAt: null, - }, - }); - expect(prisma.userMcpServer.update).toHaveBeenCalledWith({ - where: { - userId_serverId: { userId: 'user-1', serverId: 'server-1' }, - }, - data: { - codeVerifier: null, - state: null, - }, - }); - }); -}); diff --git a/packages/web/src/features/mcp/prismaOAuthClientProvider.ts b/packages/web/src/features/mcp/prismaOAuthClientProvider.ts deleted file mode 100644 index 263a0c66b..000000000 --- a/packages/web/src/features/mcp/prismaOAuthClientProvider.ts +++ /dev/null @@ -1,305 +0,0 @@ -import 'server-only'; -import type { - OAuthClientProvider, - OAuthClientInformation, - OAuthClientMetadata, - OAuthTokens, -} from '@ai-sdk/mcp'; -import { McpServerClientInfoSource, type PrismaClient } from '@sourcebot/db'; -import { encryptOAuthToken, decryptOAuthToken, createLogger } from '@sourcebot/shared'; -import { __unsafePrisma } from '@/prisma'; -import { createMcpOAuthState } from './mcpOAuthReturnTo'; - -type McpOAuthPrismaClient = Pick; -const logger = createLogger('mcp-oauth-client-provider'); - -interface PrismaOAuthClientProviderOptions { - prisma: McpOAuthPrismaClient; - serverId: string; - orgId: number; - userId: string; - callbackUrl: string; - callbackReturnTo?: string; - allowClientRegistration?: boolean; - clientInvalidationPrisma?: McpOAuthPrismaClient; -} - -export interface ClearMcpServerClientCredentialsOptions { - prisma?: McpOAuthPrismaClient; - serverId: string; - orgId: number; - observedClientInfo: string | undefined; -} - -export async function clearMcpServerClientCredentialsForObservedClient({ - prisma = __unsafePrisma, - serverId, - orgId, - observedClientInfo, -}: ClearMcpServerClientCredentialsOptions): Promise { - if (!observedClientInfo) { - return false; - } - - const result = await prisma.mcpServer.updateMany({ - where: { - id: serverId, - orgId, - clientInfo: observedClientInfo, - clientInfoSource: McpServerClientInfoSource.DYNAMIC, - }, - data: { clientInfo: null }, - }); - - if (result.count === 0) { - return false; - } - - await prisma.userMcpServer.updateMany({ - where: { - serverId, - server: { orgId }, - }, - data: { - tokens: null, - tokensExpiresAt: null, - }, - }); - - return true; -} - -/** - * Prisma-backed OAuthClientProvider for connecting to external MCP servers. - * - * Stores dynamic client registration on McpServer (per-org), and per-user - * tokens + ephemeral PKCE state on UserMcpServer. - */ -export class PrismaOAuthClientProvider implements OAuthClientProvider { - private readonly prisma: McpOAuthPrismaClient; - private readonly clientInvalidationPrisma: McpOAuthPrismaClient; - private readonly serverId: string; - private readonly orgId: number; - private readonly userId: string; - private readonly callbackUrl: string; - private readonly callbackReturnTo: string | undefined; - private observedClientInfo: string | undefined; - private observedClientInfoSource: McpServerClientInfoSource | undefined; - - /** Populated by redirectToAuthorization — read after auth() returns 'REDIRECT'. */ - public authorizationUrl: string | undefined; - - /** Only present in connect mode. If absent, the SDK cannot perform DCR. */ - declare saveClientInformation?: (info: OAuthClientInformation) => Promise; - - constructor({ - prisma, - serverId, - orgId, - userId, - callbackUrl, - callbackReturnTo, - allowClientRegistration = false, - clientInvalidationPrisma = __unsafePrisma, - }: PrismaOAuthClientProviderOptions) { - this.prisma = prisma; - this.clientInvalidationPrisma = clientInvalidationPrisma; - this.serverId = serverId; - this.orgId = orgId; - this.userId = userId; - this.callbackUrl = callbackUrl; - this.callbackReturnTo = callbackReturnTo; - - if (allowClientRegistration) { - this.saveClientInformation = async (info: OAuthClientInformation) => { - const encrypted = encryptOAuthToken(JSON.stringify(info)); - if (!encrypted) { - throw new Error('Failed to encrypt OAuth client information'); - } - - const result = await this.prisma.mcpServer.updateMany({ - where: { id: this.serverId, orgId: this.orgId }, - data: { - clientInfo: encrypted, - clientInfoSource: McpServerClientInfoSource.DYNAMIC, - }, - }); - if (result.count === 0) { - throw new Error('MCP server not found'); - } - - this.observedClientInfo = encrypted; - this.observedClientInfoSource = McpServerClientInfoSource.DYNAMIC; - }; - } - } - - get redirectUrl(): string | URL { - return this.callbackUrl; - } - - get clientMetadata(): OAuthClientMetadata { - return { - redirect_uris: [this.callbackUrl], - client_name: 'Sourcebot', - grant_types: ['authorization_code', 'refresh_token'], - response_types: ['code'], - token_endpoint_auth_method: 'none', - }; - } - - async clientInformation(): Promise { - const server = await this.prisma.mcpServer.findFirst({ - where: { id: this.serverId, orgId: this.orgId }, - select: { - clientInfo: true, - clientInfoSource: true, - }, - }); - if (!server?.clientInfo) { - this.observedClientInfo = undefined; - this.observedClientInfoSource = undefined; - return undefined; - } - - this.observedClientInfo = server.clientInfo; - this.observedClientInfoSource = server.clientInfoSource; - const decrypted = decryptOAuthToken(server.clientInfo); - return decrypted ? JSON.parse(decrypted) : undefined; - } - - async tokens(): Promise { - const userServer = await this.getUserServer(); - if (!userServer?.tokens) { - return undefined; - } - - const decrypted = decryptOAuthToken(userServer.tokens); - return decrypted ? JSON.parse(decrypted) : undefined; - } - - async saveTokens(tokens: OAuthTokens): Promise { - const encrypted = encryptOAuthToken(JSON.stringify(tokens)); - if (!encrypted) { - throw new Error('Failed to encrypt OAuth tokens'); - } - - const tokensExpiresAt = tokens.expires_in - ? new Date(Date.now() + tokens.expires_in * 1000) - : null; - await this.updateUserServer({ tokens: encrypted, tokensExpiresAt }); - } - - async codeVerifier(): Promise { - const userServer = await this.getUserServer(); - if (!userServer?.codeVerifier) { - throw new Error('No code verifier found'); - } - - const decrypted = decryptOAuthToken(userServer.codeVerifier); - if (!decrypted) { - throw new Error('Failed to decrypt OAuth code verifier'); - } - - if (decrypted === userServer.codeVerifier) { - logger.warn('MCP OAuth code verifier was read without decryption.', { - serverId: this.serverId, - orgId: this.orgId, - userId: this.userId, - }); - } - - return decrypted; - } - - async saveCodeVerifier(codeVerifier: string): Promise { - const encrypted = encryptOAuthToken(codeVerifier); - if (!encrypted) { - throw new Error('Failed to encrypt OAuth code verifier'); - } - - await this.updateUserServer({ codeVerifier: encrypted }); - } - - async state(): Promise { - return createMcpOAuthState(crypto.randomUUID(), this.callbackReturnTo); - } - - async saveState(state: string): Promise { - await this.updateUserServer({ state }); - } - - async storedState(): Promise { - const userServer = await this.getUserServer(); - return userServer?.state ?? undefined; - } - - async redirectToAuthorization(url: URL): Promise { - // Force the OAuth provider to show a consent/login screen on every authorization. - // This prevents a stolen-session attack where an attacker signs into Sourcebot on - // a victim's machine and silently obtains the victim's provider tokens via an - // existing browser session. - url.searchParams.set('prompt', 'consent'); - - // Clear stale tokens before starting a new authorization flow so the UI reflects - // that the user needs to complete OAuth again. - await this.invalidateCredentials('tokens'); - - this.authorizationUrl = url.toString(); - } - - async invalidateCredentials( - scope: 'all' | 'client' | 'tokens' | 'verifier', - ): Promise { - if (scope === 'all' || scope === 'client') { - const didClearDynamicClient = await clearMcpServerClientCredentialsForObservedClient({ - prisma: this.clientInvalidationPrisma, - serverId: this.serverId, - orgId: this.orgId, - observedClientInfo: this.observedClientInfo, - }); - if ( - scope === 'all' && - !didClearDynamicClient && - this.observedClientInfoSource === McpServerClientInfoSource.STATIC - ) { - await this.updateUserServer({ tokens: null, tokensExpiresAt: null }); - } - } - - if (scope === 'tokens') { - await this.updateUserServer({ tokens: null, tokensExpiresAt: null }); - } - - if (scope === 'all' || scope === 'verifier') { - await this.updateUserServer({ codeVerifier: null, state: null }); - } - } - - private async getUserServer() { - return this.prisma.userMcpServer.findUnique({ - where: { - userId_serverId: { userId: this.userId, serverId: this.serverId }, - }, - select: { - tokens: true, - codeVerifier: true, - state: true, - }, - }); - } - - private async updateUserServer(data: { - tokens?: string | null; - tokensExpiresAt?: Date | null; - codeVerifier?: string | null; - state?: string | null; - }) { - await this.prisma.userMcpServer.update({ - where: { - userId_serverId: { userId: this.userId, serverId: this.serverId }, - }, - data, - }); - } -} diff --git a/packages/web/src/features/mcp/prismaScope.test.ts b/packages/web/src/features/mcp/prismaScope.test.ts deleted file mode 100644 index 39650304d..000000000 --- a/packages/web/src/features/mcp/prismaScope.test.ts +++ /dev/null @@ -1,444 +0,0 @@ -import { describe, expect, test, vi } from 'vitest'; -import type { UserWithAccounts } from '@sourcebot/db'; -import { getMcpPrismaQueryExtension, scopeUserMcpServerWhere } from './prismaScope'; - -const user = { - id: 'user-1', - name: 'Test User', - email: 'test@example.com', - hashedPassword: null, - emailVerified: null, - image: null, - sessionVersion: 0, - lastActiveAt: null, - createdAt: new Date('2026-01-01T00:00:00Z'), - updatedAt: new Date('2026-01-01T00:00:00Z'), - accounts: [], -} satisfies UserWithAccounts; - -const callQuery = vi.fn(async (args: unknown) => args); - -const resetQuery = () => { - callQuery.mockClear(); - return callQuery; -}; - -const callAllOperations = ( - model: { - $allOperations: (params: { - operation: string; - args: unknown; - query: (args: unknown) => Promise; - }) => Promise; - }, - operation: string, - args: unknown, - query = resetQuery(), -) => model.$allOperations({ operation, args, query }); - -describe('scopeUserMcpServerWhere', () => { - test('merges existing filters with the authenticated user id', () => { - expect(scopeUserMcpServerWhere({ tokens: { not: null } }, user)).toEqual({ - AND: [ - { tokens: { not: null } }, - { userId: 'user-1' }, - ], - }); - }); - - test('fails closed for anonymous users', () => { - expect(scopeUserMcpServerWhere(undefined, undefined)).toEqual({ - AND: [ - { userId: '__sourcebot_anonymous_user__' }, - { userId: '__sourcebot_no_authenticated_user__' }, - ], - }); - }); -}); - -describe('getMcpPrismaQueryExtension', () => { - test('scopes list-style UserMcpServer reads', async () => { - const extension = getMcpPrismaQueryExtension(user); - const result = await extension.userMcpServer.findMany({ - args: { where: { tokens: { not: null } } }, - query: resetQuery(), - }); - - expect(result).toEqual({ - where: { - AND: [ - { tokens: { not: null } }, - { userId: 'user-1' }, - ], - }, - }); - }); - - test('returns null for anonymous or mismatched findUnique queries', async () => { - const anonymousExtension = getMcpPrismaQueryExtension(); - const mismatchedExtension = getMcpPrismaQueryExtension(user); - const query = resetQuery(); - - await expect(anonymousExtension.userMcpServer.findUnique({ - args: { where: { userId_serverId: { userId: 'user-1', serverId: 'server-1' } } }, - query, - })).resolves.toBeNull(); - await expect(mismatchedExtension.userMcpServer.findUnique({ - args: { where: { userId_serverId: { userId: 'user-2', serverId: 'server-1' } } }, - query, - })).resolves.toBeNull(); - - expect(query).not.toHaveBeenCalled(); - }); - - test('allows matching findUnique queries through', async () => { - const extension = getMcpPrismaQueryExtension(user); - const args = { where: { userId_serverId: { userId: 'user-1', serverId: 'server-1' } } }; - - await expect(extension.userMcpServer.findUnique({ - args, - query: resetQuery(), - })).resolves.toBe(args); - }); - - test('rejects creates for anonymous or mismatched users', async () => { - const anonymousExtension = getMcpPrismaQueryExtension(); - const extension = getMcpPrismaQueryExtension(user); - const query = resetQuery(); - - await expect(anonymousExtension.userMcpServer.create({ - args: { data: { userId: 'user-1', serverId: 'server-1' } }, - query, - })).rejects.toThrow('requires an authenticated user'); - await expect(extension.userMcpServer.create({ - args: { data: { userId: 'user-2', serverId: 'server-1' } }, - query, - })).rejects.toThrow('must create UserMcpServer rows for the authenticated user'); - - expect(query).not.toHaveBeenCalled(); - }); - - test('allows checked creates that connect the authenticated user', async () => { - const extension = getMcpPrismaQueryExtension(user); - const args = { - data: { - user: { connect: { id: 'user-1' } }, - server: { connect: { id: 'server-1' } }, - }, - }; - - await expect(extension.userMcpServer.create({ - args, - query: resetQuery(), - })).resolves.toBe(args); - }); - - test('rejects checked creates that do not connect the authenticated user', async () => { - const extension = getMcpPrismaQueryExtension(user); - const query = resetQuery(); - - await expect(extension.userMcpServer.create({ - args: { - data: { - user: { connect: { id: 'user-2' } }, - server: { connect: { id: 'server-1' } }, - }, - }, - query, - })).rejects.toThrow('must create UserMcpServer rows for the authenticated user'); - await expect(extension.userMcpServer.create({ - args: { - data: { - user: { create: { id: 'user-1', email: 'test@example.com' } }, - server: { connect: { id: 'server-1' } }, - }, - }, - query, - })).rejects.toThrow('must create UserMcpServer rows for the authenticated user'); - - expect(query).not.toHaveBeenCalled(); - }); - - test('rejects mismatched update/delete composite keys', async () => { - const extension = getMcpPrismaQueryExtension(user); - const query = resetQuery(); - - await expect(extension.userMcpServer.update({ - args: { - where: { userId_serverId: { userId: 'user-2', serverId: 'server-1' } }, - data: { state: null }, - }, - query, - })).rejects.toThrow('cannot access UserMcpServer rows for another user'); - await expect(extension.userMcpServer.delete({ - args: { where: { userId_serverId: { userId: 'user-2', serverId: 'server-1' } } }, - query, - })).rejects.toThrow('cannot access UserMcpServer rows for another user'); - - expect(query).not.toHaveBeenCalled(); - }); - - test('rejects attempts to mutate UserMcpServer ownership', async () => { - const extension = getMcpPrismaQueryExtension(user); - - await expect(extension.userMcpServer.update({ - args: { - where: { userId_serverId: { userId: 'user-1', serverId: 'server-1' } }, - data: { userId: 'user-2' }, - }, - query: resetQuery(), - })).rejects.toThrow('cannot change UserMcpServer identity'); - await expect(extension.userMcpServer.update({ - args: { - where: { userId_serverId: { userId: 'user-1', serverId: 'server-1' } }, - data: { server: { connect: { id: 'server-2' } } }, - }, - query: resetQuery(), - })).rejects.toThrow('cannot change UserMcpServer identity'); - await expect(extension.userMcpServer.upsert({ - args: { - where: { userId_serverId: { userId: 'user-1', serverId: 'server-1' } }, - create: { userId: 'user-1', serverId: 'server-1' }, - update: { user: { connect: { id: 'user-2' } } }, - }, - query: resetQuery(), - })).rejects.toThrow('cannot change UserMcpServer identity'); - }); - - test('scopes updateMany and deleteMany', async () => { - const extension = getMcpPrismaQueryExtension(user); - - await expect(extension.userMcpServer.updateMany({ - args: { where: { tokens: { not: null } }, data: { state: null } }, - query: resetQuery(), - })).resolves.toEqual({ - where: { - AND: [ - { tokens: { not: null } }, - { userId: 'user-1' }, - ], - }, - data: { state: null }, - }); - await expect(extension.userMcpServer.deleteMany({ - args: { where: { serverId: 'server-1' } }, - query: resetQuery(), - })).resolves.toEqual({ - where: { - AND: [ - { serverId: 'server-1' }, - { userId: 'user-1' }, - ], - }, - }); - }); - - test('scopes returning bulk UserMcpServer operations', async () => { - const extension = getMcpPrismaQueryExtension(user); - - await expect(extension.userMcpServer.createManyAndReturn({ - args: { data: { userId: 'user-2', serverId: 'server-1' } }, - query: resetQuery(), - })).rejects.toThrow('must create UserMcpServer rows for the authenticated user'); - await expect(extension.userMcpServer.updateManyAndReturn({ - args: { where: { serverId: 'server-1' }, data: { state: null } }, - query: resetQuery(), - })).resolves.toEqual({ - where: { - AND: [ - { serverId: 'server-1' }, - { userId: 'user-1' }, - ], - }, - data: { state: null }, - }); - }); - - test('rejects nested UserMcpServer relation access through direct UserMcpServer queries', async () => { - const extension = getMcpPrismaQueryExtension(user); - const query = resetQuery(); - - await expect(extension.userMcpServer.findMany({ - args: { - include: { - server: { - include: { - userMcpServers: true, - }, - }, - }, - }, - query, - })).rejects.toThrow('cannot access UserMcpServer rows through a parent relation'); - - expect(query).not.toHaveBeenCalled(); - }); - - test('rejects nested UserMcpServer writes through McpServer operations', async () => { - const extension = getMcpPrismaQueryExtension(user); - const query = resetQuery(); - - await expect(callAllOperations( - extension.mcpServer, - 'update', - { - where: { id: 'server-1' }, - data: { userMcpServers: { create: { userId: 'user-1' } } }, - }, - query, - )).rejects.toThrow('cannot access UserMcpServer rows through a parent relation'); - - expect(query).not.toHaveBeenCalled(); - }); - - test('rejects nested UserMcpServer reads and writes through parent models', async () => { - const extension = getMcpPrismaQueryExtension(user); - const query = resetQuery(); - - await expect(callAllOperations( - extension.mcpServer, - 'findUnique', - { - where: { id: 'server-1' }, - include: { userMcpServers: true }, - }, - query, - )).rejects.toThrow('cannot access UserMcpServer rows through a parent relation'); - await expect(callAllOperations( - extension.user, - 'findMany', - { - where: { userMcpServers: { some: { serverId: 'server-1' } } }, - }, - query, - )).rejects.toThrow('cannot access UserMcpServer rows through a parent relation'); - await expect(callAllOperations( - extension.user, - 'update', - { - where: { id: 'user-1' }, - data: { userMcpServers: { create: { serverId: 'server-1' } } }, - }, - query, - )).rejects.toThrow('cannot access UserMcpServer rows through a parent relation'); - - expect(query).not.toHaveBeenCalled(); - }); - - test('rejects transitive MCP relation access through Org and UserToOrg operations', async () => { - const extension = getMcpPrismaQueryExtension(user); - const query = resetQuery(); - - await expect(callAllOperations( - extension.org, - 'findUnique', - { - where: { id: 1 }, - include: { - mcpServers: { - include: { - userMcpServers: true, - }, - }, - }, - }, - query, - )).rejects.toThrow('cannot access MCP server relations through a parent relation'); - await expect(callAllOperations( - extension.org, - 'update', - { - where: { id: 1 }, - data: { - mcpServers: { - create: { - name: 'Linear', - sanitizedName: 'linear', - serverUrl: 'https://mcp.linear.app/mcp', - userMcpServers: { - create: { userId: 'user-1' }, - }, - }, - }, - }, - }, - query, - )).rejects.toThrow('cannot access MCP server relations through a parent relation'); - await expect(callAllOperations( - extension.userToOrg, - 'findMany', - { - include: { - org: { - include: { - mcpServers: { - include: { - userMcpServers: true, - }, - }, - }, - }, - }, - }, - query, - )).rejects.toThrow('cannot access MCP server relations through a parent relation'); - - expect(query).not.toHaveBeenCalled(); - }); - - test('allows JSON metadata payloads with relation-like keys', async () => { - const extension = getMcpPrismaQueryExtension(user); - const args = { - where: { id: 1 }, - data: { - metadata: { - mcpServers: 'display-state', - userMcpServers: { collapsed: true }, - }, - }, - }; - - await expect(callAllOperations(extension.org, 'update', args)).resolves.toBe(args); - }); - - test('passes safe parent-model operations through the compact hooks', async () => { - const extension = getMcpPrismaQueryExtension(user); - const args = { where: { orgId: 1 } }; - - await expect(callAllOperations(extension.userToOrg, 'findMany', args)).resolves.toBe(args); - }); - - test('allows single user deletes but blocks bulk user deletes', async () => { - const extension = getMcpPrismaQueryExtension(user); - const args = { where: { id: 'user-2' } }; - const query = resetQuery(); - - await expect(callAllOperations(extension.user, 'delete', args, query)).resolves.toBe(args); - expect(query).toHaveBeenCalledTimes(1); - query.mockClear(); - - await expect(callAllOperations(extension.user, 'deleteMany', { where: {} }, query)) - .rejects.toThrow('user.deleteMany cannot delete users through a user-scoped client'); - expect(query).not.toHaveBeenCalled(); - }); - - test('rejects shared McpServer deletes through the scoped client', async () => { - const extension = getMcpPrismaQueryExtension(user); - const query = resetQuery(); - - await expect(callAllOperations( - extension.mcpServer, - 'delete', - { where: { id: 'server-1' } }, - query, - )).rejects.toThrow('cannot delete shared McpServer rows through a user-scoped client'); - await expect(callAllOperations( - extension.mcpServer, - 'deleteMany', - { where: { orgId: 1 } }, - query, - )).rejects.toThrow('cannot delete shared McpServer rows through a user-scoped client'); - - expect(query).not.toHaveBeenCalled(); - }); -}); diff --git a/packages/web/src/features/mcp/prismaScope.ts b/packages/web/src/features/mcp/prismaScope.ts deleted file mode 100644 index 9e3089f24..000000000 --- a/packages/web/src/features/mcp/prismaScope.ts +++ /dev/null @@ -1,366 +0,0 @@ -import { Prisma, UserWithAccounts } from '@sourcebot/db'; - -type QueryHookParams = { - args: TArgs; - query: (args: TArgs) => Promise; -}; - -type AllOperationsHookParams = { - operation: string; - args: unknown; - query: (args: unknown) => Promise; -}; - -type UserMcpServerWhereArgs = { - where?: Prisma.UserMcpServerWhereInput; -}; - -type UserMcpServerWhereUniqueArgs = { - where: Prisma.UserMcpServerWhereUniqueInput; -}; - -type UserMcpServerCreateArgs = { - data: unknown; -}; - -type UserMcpServerUpdateArgs = UserMcpServerWhereUniqueArgs & { - data: unknown; -}; - -type UserMcpServerUpsertArgs = UserMcpServerWhereUniqueArgs & { - create: unknown; - update: unknown; -}; - -// Deliberately impossible filter — AND-ing two different userId values guarantees zero rows. -// Used as the fallback when no user is authenticated, so anonymous queries see nothing. -// Prisma doesn't expose a "match nothing" primitive, so this is the standard workaround. -const anonymousUserScope: Prisma.UserMcpServerWhereInput = { - AND: [ - { userId: '__sourcebot_anonymous_user__' }, - { userId: '__sourcebot_no_authenticated_user__' }, - ], -}; - -const isRecord = (value: unknown): value is Record => - typeof value === 'object' && value !== null && !Array.isArray(value); - -const userScopeWhere = (user?: UserWithAccounts): Prisma.UserMcpServerWhereInput => - user ? { userId: user.id } : anonymousUserScope; - -export const scopeUserMcpServerWhere = ( - where: Prisma.UserMcpServerWhereInput | undefined, - user?: UserWithAccounts, -): Prisma.UserMcpServerWhereInput => { - const scope = userScopeWhere(user); - return where ? { AND: [where, scope] } : scope; -}; - -const scopeUserMcpServerReadArgs = ( - args: TArgs, - user?: UserWithAccounts, -): TArgs => ({ - ...args, - where: scopeUserMcpServerWhere(args.where, user), -}); - -const requireAuthenticatedUser = ( - user: UserWithAccounts | undefined, - operation: string, -): UserWithAccounts => { - if (!user) { - throw new Error(`${operation} requires an authenticated user.`); - } - return user; -}; - -const uniqueWhereUserId = (where: Prisma.UserMcpServerWhereUniqueInput): string | undefined => { - const compositeKey = where.userId_serverId; - return isRecord(compositeKey) && typeof compositeKey.userId === 'string' - ? compositeKey.userId - : undefined; -}; - -export const isUserMcpServerUniqueWhereForUser = ( - where: Prisma.UserMcpServerWhereUniqueInput, - user?: UserWithAccounts, -) => !!user && uniqueWhereUserId(where) === user.id; - -const assertUserMcpServerUniqueWhereForUser = ( - where: Prisma.UserMcpServerWhereUniqueInput, - user: UserWithAccounts | undefined, - operation: string, -) => { - const authenticatedUser = requireAuthenticatedUser(user, operation); - if (!isUserMcpServerUniqueWhereForUser(where, authenticatedUser)) { - throw new Error(`${operation} cannot access UserMcpServer rows for another user.`); - } -}; - -const assertNoIdentityMutation = (data: unknown, operation: string) => { - if (!isRecord(data)) { - return; - } - - if ('userId' in data || 'user' in data || 'serverId' in data || 'server' in data) { - throw new Error(`${operation} cannot change UserMcpServer identity.`); - } -}; - -// Extracts the userId from a Prisma relation connect object. -// Prisma's connect syntax for a relation looks like: { connect: { id: "some-id" } } -const connectedUserId = (userRelation: unknown): string | undefined => { - if (!isRecord(userRelation) || !('connect' in userRelation)) { - return undefined; - } - - const connect = userRelation.connect; - if (!isRecord(connect) || !('id' in connect) || typeof connect.id !== 'string') { - return undefined; - } - - return connect.id; -}; - -const createDataUserId = (row: unknown): string | undefined => { - if (!isRecord(row)) { - return undefined; - } - const scalarUserId = typeof row.userId === 'string' ? row.userId : undefined; - const relationUserId = row.user === undefined ? undefined : connectedUserId(row.user); - - if (row.user !== undefined && relationUserId === undefined) { - return undefined; - } - if (scalarUserId !== undefined && relationUserId !== undefined && scalarUserId !== relationUserId) { - return undefined; - } - - return relationUserId ?? scalarUserId; -}; - -const assertCreateDataForUser = ( - data: unknown, - user: UserWithAccounts | undefined, - operation: string, -) => { - const authenticatedUser = requireAuthenticatedUser(user, operation); - - const rows = Array.isArray(data) ? data : [data]; - for (const row of rows) { - if (createDataUserId(row) !== authenticatedUser.id) { - throw new Error(`${operation} must create UserMcpServer rows for the authenticated user.`); - } - } -}; - -const scopeUserMcpServerWriteManyArgs = ( - args: TArgs, - user: UserWithAccounts | undefined, - operation: string, -): TArgs => { - const authenticatedUser = requireAuthenticatedUser(user, operation); - return scopeUserMcpServerReadArgs(args, authenticatedUser); -}; - -const PRISMA_SELECTION_KEYS = new Set(['include', 'select']); -const PRISMA_STRUCTURAL_KEYS = new Set([ - ...PRISMA_SELECTION_KEYS, - 'where', - 'orderBy', - 'data', - 'create', - 'connectOrCreate', - 'update', - 'updateMany', - 'upsert', - 'delete', - 'deleteMany', - 'AND', - 'OR', - 'NOT', - 'some', - 'none', - 'every', - 'is', - 'isNot', -]); -const MCP_RELATION_BRIDGE_KEYS = new Set([ - 'user', - 'server', - 'org', - 'orgs', - 'members', -]); - -const containsPrismaRelationAccess = ( - value: unknown, - relationNames: string[], - isSelectionObject = false, -): boolean => { - if (Array.isArray(value)) { - return value.some((item) => containsPrismaRelationAccess(item, relationNames, isSelectionObject)); - } - if (!isRecord(value)) { - return false; - } - if (relationNames.some((relationName) => relationName in value)) { - return true; - } - - return Object.entries(value).some(([key, nestedValue]) => { - if (PRISMA_SELECTION_KEYS.has(key)) { - return containsPrismaRelationAccess(nestedValue, relationNames, true); - } - - if (isSelectionObject || PRISMA_STRUCTURAL_KEYS.has(key) || MCP_RELATION_BRIDGE_KEYS.has(key)) { - return containsPrismaRelationAccess(nestedValue, relationNames); - } - - return false; - }); -}; - -const assertNoUserMcpServerRelationAccess = (args: unknown, operation: string) => { - if (containsPrismaRelationAccess(args, ['userMcpServers'])) { - throw new Error(`${operation} cannot access UserMcpServer rows through a parent relation.`); - } -}; - -const assertNoMcpServerRelationAccess = (args: unknown, operation: string) => { - if (containsPrismaRelationAccess(args, ['mcpServers', 'userMcpServers'])) { - throw new Error(`${operation} cannot access MCP server relations through a parent relation.`); - } -}; - -const rejectSharedMcpServerDelete = (operation: string) => { - throw new Error(`${operation} cannot delete shared McpServer rows through a user-scoped client.`); -}; - -const rejectUserDeleteMany = () => { - throw new Error('user.deleteMany cannot delete users through a user-scoped client.'); -}; - -const guardMcpParentOperation = ( - modelName: string, - guard: (args: unknown, operation: string) => void, -) => async ({ operation, args, query }: AllOperationsHookParams) => { - guard(args, `${modelName}.${operation}`); - return query(args); -}; - -export const getMcpPrismaQueryExtension = (user?: UserWithAccounts) => ({ - userMcpServer: { - async findMany({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.findMany'); - return query(scopeUserMcpServerReadArgs(args, user)); - }, - async findFirst({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.findFirst'); - return query(scopeUserMcpServerReadArgs(args, user)); - }, - async findFirstOrThrow({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.findFirstOrThrow'); - return query(scopeUserMcpServerReadArgs(args, user)); - }, - async findUnique({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.findUnique'); - // Preserve Prisma's nullable "not found" semantics for scoped reads. Callers that - // need a hard failure should use findUniqueOrThrow; write paths throw on mismatch. - return isUserMcpServerUniqueWhereForUser(args.where, user) ? query(args) : null; - }, - async findUniqueOrThrow({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.findUniqueOrThrow'); - assertUserMcpServerUniqueWhereForUser(args.where, user, 'userMcpServer.findUniqueOrThrow'); - return query(args); - }, - async count({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.count'); - return query(scopeUserMcpServerReadArgs(args, user)); - }, - async aggregate({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.aggregate'); - return query(scopeUserMcpServerReadArgs(args, user)); - }, - async groupBy({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.groupBy'); - return query(scopeUserMcpServerReadArgs(args, user)); - }, - async create({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.create'); - assertCreateDataForUser((args as UserMcpServerCreateArgs).data, user, 'userMcpServer.create'); - return query(args); - }, - async createMany({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.createMany'); - assertCreateDataForUser((args as UserMcpServerCreateArgs).data, user, 'userMcpServer.createMany'); - return query(args); - }, - async createManyAndReturn({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.createManyAndReturn'); - assertCreateDataForUser((args as UserMcpServerCreateArgs).data, user, 'userMcpServer.createManyAndReturn'); - return query(args); - }, - async update({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.update'); - assertUserMcpServerUniqueWhereForUser(args.where, user, 'userMcpServer.update'); - assertNoIdentityMutation((args as UserMcpServerUpdateArgs).data, 'userMcpServer.update'); - return query(args); - }, - async updateMany({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.updateMany'); - requireAuthenticatedUser(user, 'userMcpServer.updateMany'); - assertNoIdentityMutation((args as UserMcpServerUpdateArgs).data, 'userMcpServer.updateMany'); - return query(scopeUserMcpServerWriteManyArgs(args, user, 'userMcpServer.updateMany')); - }, - async updateManyAndReturn({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.updateManyAndReturn'); - requireAuthenticatedUser(user, 'userMcpServer.updateManyAndReturn'); - assertNoIdentityMutation((args as UserMcpServerUpdateArgs).data, 'userMcpServer.updateManyAndReturn'); - return query(scopeUserMcpServerWriteManyArgs(args, user, 'userMcpServer.updateManyAndReturn')); - }, - async delete({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.delete'); - assertUserMcpServerUniqueWhereForUser(args.where, user, 'userMcpServer.delete'); - return query(args); - }, - async deleteMany({ args, query }: QueryHookParams) { - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.deleteMany'); - return query(scopeUserMcpServerWriteManyArgs(args, user, 'userMcpServer.deleteMany')); - }, - async upsert({ args, query }: QueryHookParams) { - const upsertArgs = args as UserMcpServerUpsertArgs; - assertNoUserMcpServerRelationAccess(args, 'userMcpServer.upsert'); - assertUserMcpServerUniqueWhereForUser(args.where, user, 'userMcpServer.upsert'); - assertCreateDataForUser(upsertArgs.create, user, 'userMcpServer.upsert'); - assertNoIdentityMutation(upsertArgs.update, 'userMcpServer.upsert'); - return query(args); - }, - }, - user: { - async $allOperations({ operation, args, query }: AllOperationsHookParams) { - if (operation === 'deleteMany') { - rejectUserDeleteMany(); - } - // The owner-only user deletion API intentionally deletes one user and relies on - // cascade to remove that user's rows. Bulk deletes stay blocked above. - assertNoUserMcpServerRelationAccess(args, `user.${operation}`); - return query(args); - }, - }, - mcpServer: { - async $allOperations({ operation, args, query }: AllOperationsHookParams) { - if (operation === 'delete' || operation === 'deleteMany') { - rejectSharedMcpServerDelete(`mcpServer.${operation}`); - } - assertNoUserMcpServerRelationAccess(args, `mcpServer.${operation}`); - return query(args); - }, - }, - org: { - $allOperations: guardMcpParentOperation('org', assertNoMcpServerRelationAccess), - }, - userToOrg: { - $allOperations: guardMcpParentOperation('userToOrg', assertNoMcpServerRelationAccess), - }, -}); diff --git a/packages/web/src/features/membership/actions/accountRequests.ts b/packages/web/src/features/membership/actions/accountRequests.ts deleted file mode 100644 index 5f1a0e222..000000000 --- a/packages/web/src/features/membership/actions/accountRequests.ts +++ /dev/null @@ -1,281 +0,0 @@ -'use server'; - -import { createAudit } from "@/ee/features/audit/audit"; -import JoinRequestApprovedEmail from "@/emails/joinRequestApprovedEmail"; -import { ensureActiveMember } from "@/features/membership/membership.service"; -import { getDefaultMemberRole } from "@/features/membership/utils"; -import { membershipManagedByIdpError } from "@/features/membership/errors"; -import { isScimEnabled } from "@/features/scim/utils"; -import { notAuthenticated, notFound } from "@/lib/serviceError"; -import { isServiceError } from "@/lib/utils"; -import { sew } from "@/middleware/sew"; -import { getAuthenticatedUser, withAuth } from "@/middleware/withAuth"; -import { withMinimumOrgRole } from "@/middleware/withMinimumOrgRole"; -import { render } from "@react-email/components"; -import { OrgRole } from "@sourcebot/db"; -import { env, getSMTPConnectionURL } from "@sourcebot/shared"; -import { createTransport } from "nodemailer"; -import { logger } from "../logger"; -import { __unsafePrisma } from "@/prisma"; -import { SINGLE_TENANT_ORG_ID } from "@/lib/constants"; -import JoinRequestSubmittedEmail from "@/emails/joinRequestSubmittedEmail"; - -// eslint-disable-next-line authz/require-auth-wrapper -- calls getAuthenticatedUser() directly; runs pre-org-membership so cannot use withAuth -export const createAccountRequest = async () => sew(async () => { - const authResult = await getAuthenticatedUser(); - if (!authResult) { - return notAuthenticated(); - } - - const { user } = authResult; - - const org = await __unsafePrisma.org.findUnique({ - where: { - id: SINGLE_TENANT_ORG_ID, - }, - }); - - if (!org) { - return notFound("Organization not found"); - } - - // With SCIM enabled the IdP is the source of truth for membership, so - // un-provisioned users can't request to join. - if (await isScimEnabled(org)) { - return membershipManagedByIdpError(); - } - - const existingRequest = await __unsafePrisma.accountRequest.findUnique({ - where: { - requestedById_orgId: { - requestedById: user.id, - orgId: org.id, - }, - }, - }); - - if (existingRequest) { - logger.warn(`User ${user.id} already has an account request for org ${org.id}. Skipping account request creation.`); - return { - success: true, - existingRequest: true, - } - } - - await __unsafePrisma.accountRequest.create({ - data: { - requestedById: user.id, - orgId: org.id, - }, - }); - - const smtpConnectionUrl = getSMTPConnectionURL(); - if (smtpConnectionUrl && env.EMAIL_FROM_ADDRESS) { - // TODO: This is needed because we can't fetch the origin from the request headers when this is called - // on user creation (the header isn't set when next-auth calls onCreateUser for some reason) - const deploymentUrl = env.AUTH_URL; - - const owners = await __unsafePrisma.user.findMany({ - where: { - orgs: { - some: { - orgId: org.id, - role: "OWNER", - }, - }, - }, - }); - - if (owners.length === 0) { - logger.error(`Failed to find any owners for org ${org.id} when drafting email for account request from ${user.id}`); - } else { - const html = await render(JoinRequestSubmittedEmail({ - baseUrl: deploymentUrl, - requestor: { - name: user.name ?? undefined, - email: user.email, - avatarUrl: user.image ?? undefined, - }, - orgName: org.name, - orgImageUrl: org.imageUrl ?? undefined, - })); - - const ownerEmails = owners - .map((owner) => owner.email) - .filter((email): email is string => email !== null); - - const transport = createTransport(smtpConnectionUrl); - const result = await transport.sendMail({ - to: ownerEmails, - from: env.EMAIL_FROM_ADDRESS, - subject: `New account request for ${org.name} on Sourcebot`, - html, - text: `New account request for ${org.name} on Sourcebot by ${user.name ?? user.email}`, - }); - - const failed = result.rejected.concat(result.pending ?? []).filter(Boolean); - if (failed.length > 0) { - logger.error(`Failed to send account request email to ${ownerEmails.join(', ')}: ${failed}`); - } - } - } else { - logger.warn(`SMTP_CONNECTION_URL or EMAIL_FROM_ADDRESS not set. Skipping account request email to owner`); - } - - return { - success: true, - existingRequest: false, - } -}); - -export const approveAccountRequest = async (requestId: string) => sew(async () => - withAuth(async ({ org, user, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - // With SCIM enabled the IdP is the source of truth for membership; - // approving a request would mint a member it never provisioned. - if (await isScimEnabled(org)) { - return membershipManagedByIdpError(); - } - - const failAuditCallback = async (error: string) => { - await createAudit({ - action: "user.join_request_approve_failed", - actor: { - id: user.id, - type: "user" - }, - target: { - id: requestId, - type: "account_join_request" - }, - orgId: org.id, - metadata: { - message: error, - } - }); - } - - const request = await prisma.accountRequest.findUnique({ - where: { - id: requestId, - }, - include: { - requestedBy: true, - }, - }); - - if (!request || request.orgId !== org.id) { - await failAuditCallback("Request not found"); - return notFound(); - } - - const addUserToOrgRes = await ensureActiveMember(org.id, request.requestedById, { - actor: { id: request.requestedById, type: "user" }, - role: await getDefaultMemberRole(), - }); - if (isServiceError(addUserToOrgRes)) { - await failAuditCallback(addUserToOrgRes.message); - return addUserToOrgRes; - } - - await prisma.accountRequest.deleteMany({ - where: { - id: requestId, - orgId: org.id, - }, - }); - - await createAudit({ - action: "user.join_request_approved", - actor: { - id: user.id, - type: "user" - }, - orgId: org.id, - target: { - id: requestId, - type: "account_join_request" - } - }); - - // Send approval email to the user - const smtpConnectionUrl = getSMTPConnectionURL(); - if (smtpConnectionUrl && env.EMAIL_FROM_ADDRESS) { - const html = await render(JoinRequestApprovedEmail({ - baseUrl: env.AUTH_URL, - user: { - name: request.requestedBy.name ?? undefined, - email: request.requestedBy.email, - avatarUrl: request.requestedBy.image ?? undefined, - }, - orgName: org.name, - })); - - const transport = createTransport(smtpConnectionUrl); - const result = await transport.sendMail({ - to: request.requestedBy.email, - from: env.EMAIL_FROM_ADDRESS, - subject: `Your request to join ${org.name} has been approved`, - html, - text: `Your request to join ${org.name} on Sourcebot has been approved. You can now access the organization at ${env.AUTH_URL}`, - }); - - const failed = result.rejected.concat(result.pending ?? []).filter(Boolean); - if (failed.length > 0) { - logger.error(`Failed to send approval email to ${request.requestedBy.email}: ${failed}`); - } - } else { - logger.warn(`SMTP_CONNECTION_URL or EMAIL_FROM_ADDRESS not set. Skipping approval email to ${request.requestedBy.email}`); - } - - return { - success: true, - } - }) - )); - -export const rejectAccountRequest = async (requestId: string) => sew(() => - withAuth(async ({ org, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - const request = await prisma.accountRequest.findUnique({ - where: { - id: requestId, - }, - }); - - if (!request || request.orgId !== org.id) { - return notFound(); - } - - await prisma.accountRequest.delete({ - where: { - id: requestId, - }, - }); - - return { - success: true, - } - }) - )); - -export const getOrgAccountRequests = async () => sew(() => - withAuth(async ({ org, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - const requests = await prisma.accountRequest.findMany({ - where: { - orgId: org.id, - }, - include: { - requestedBy: true, - }, - }); - - return requests.map((request) => ({ - id: request.id, - email: request.requestedBy.email, - createdAt: request.createdAt, - name: request.requestedBy.name ?? undefined, - image: request.requestedBy.image ?? undefined, - })); - }))); diff --git a/packages/web/src/features/membership/actions/index.ts b/packages/web/src/features/membership/actions/index.ts deleted file mode 100644 index 13ef2b22f..000000000 --- a/packages/web/src/features/membership/actions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './members'; -export * from './invites'; -export * from './accountRequests'; \ No newline at end of file diff --git a/packages/web/src/features/membership/actions/invites.ts b/packages/web/src/features/membership/actions/invites.ts deleted file mode 100644 index 1459d90b3..000000000 --- a/packages/web/src/features/membership/actions/invites.ts +++ /dev/null @@ -1,436 +0,0 @@ -'use server'; - -import { createAudit } from "@/ee/features/audit/audit"; -import InviteUserEmail from "@/emails/inviteUserEmail"; -import { ensureActiveMember } from "@/features/membership/membership.service"; -import { getDefaultMemberRole, orgHasAvailability } from "@/features/membership/utils"; -import { membershipManagedByIdpError } from "@/features/membership/errors"; -import { isScimEnabled } from "@/features/scim/utils"; -import { SINGLE_TENANT_ORG_ID } from "@/lib/constants"; -import { ErrorCode } from "@/lib/errorCodes"; -import { notAuthenticated, notFound, orgNotFound, ServiceError } from "@/lib/serviceError"; -import { isServiceError } from "@/lib/utils"; -import { sew } from "@/middleware/sew"; -import { getAuthenticatedUser, withAuth } from "@/middleware/withAuth"; -import { withMinimumOrgRole } from "@/middleware/withMinimumOrgRole"; -import { __unsafePrisma } from "@/prisma"; -import { render } from "@react-email/components"; -import { OrgRole } from "@sourcebot/db"; -import { env, getSMTPConnectionURL, isMemberApprovalRequired } from "@sourcebot/shared"; -import { StatusCodes } from "http-status-codes"; -import { createTransport } from "nodemailer"; -import { logger } from "../logger"; - -export const createInvites = async (emails: string[]): Promise<{ success: boolean } | ServiceError> => sew(() => - withAuth(async ({ org, user, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - // With SCIM enabled the IdP is the source of truth for membership; - // invites would add members outside it. - if (await isScimEnabled(org)) { - return membershipManagedByIdpError(); - } - - const failAuditCallback = async (error: string) => { - await createAudit({ - action: "user.invite_failed", - actor: { - id: user.id, - type: "user" - }, - target: { - id: org.id.toString(), - type: "org" - }, - orgId: org.id, - metadata: { - message: error, - emails: emails.join(", ") - } - }); - } - - const hasAvailability = await orgHasAvailability(org.id, prisma); - if (!hasAvailability) { - await createAudit({ - action: "user.invite_failed", - actor: { - id: user.id, - type: "user" - }, - target: { - id: org.id.toString(), - type: "org" - }, - orgId: org.id, - metadata: { - message: "Organization has reached maximum number of seats", - emails: emails.join(", ") - } - }); - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.ORG_SEAT_COUNT_REACHED, - message: "The organization has reached the maximum number of seats. Unable to create a new invite", - } satisfies ServiceError; - } - - // Check for existing invites - const existingInvites = await prisma.invite.findMany({ - where: { - recipientEmail: { - in: emails - }, - orgId: org.id, - } - }); - - if (existingInvites.length > 0) { - await failAuditCallback("A pending invite already exists for one or more of the provided emails"); - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_INVITE, - message: `A pending invite already exists for one or more of the provided emails.`, - } satisfies ServiceError; - } - - // Check for members that are already in the org - const existingMembers = await prisma.userToOrg.findMany({ - where: { - user: { - email: { - in: emails, - } - }, - orgId: org.id, - }, - }); - - if (existingMembers.length > 0) { - await failAuditCallback("One or more of the provided emails are already members of this org"); - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_INVITE, - message: `One or more of the provided emails are already members of this org.`, - } satisfies ServiceError; - } - - await prisma.invite.createMany({ - data: emails.map((email) => ({ - recipientEmail: email, - hostUserId: user.id, - orgId: org.id, - })), - skipDuplicates: true, - }); - - // Send invites to recipients - const smtpConnectionUrl = getSMTPConnectionURL(); - if (smtpConnectionUrl && env.EMAIL_FROM_ADDRESS) { - await Promise.all(emails.map(async (email) => { - const invite = await prisma.invite.findUnique({ - where: { - recipientEmail_orgId: { - recipientEmail: email, - orgId: org.id, - }, - }, - include: { - org: true, - } - }); - - if (!invite) { - return; - } - - const recipient = await prisma.user.findUnique({ - where: { - email, - }, - }); - const inviteLink = `${env.AUTH_URL}/redeem?invite_id=${invite.id}`; - const transport = createTransport(smtpConnectionUrl); - const html = await render(InviteUserEmail({ - baseUrl: env.AUTH_URL, - host: { - name: user.name ?? undefined, - email: user.email, - avatarUrl: user.image ?? undefined, - }, - recipient: { - name: recipient?.name ?? undefined, - }, - orgName: invite.org.name, - orgImageUrl: invite.org.imageUrl ?? undefined, - inviteLink, - })); - - const result = await transport.sendMail({ - to: email, - from: env.EMAIL_FROM_ADDRESS, - subject: `Join ${invite.org.name} on Sourcebot`, - html, - text: `Join ${invite.org.name} on Sourcebot by clicking here: ${inviteLink}`, - }); - - const failed = result.rejected.concat(result.pending ?? []).filter(Boolean); - if (failed.length > 0) { - logger.error(`Failed to send invite email to ${email}: ${failed}`); - } - })); - } else { - logger.warn(`SMTP_CONNECTION_URL or EMAIL_FROM_ADDRESS not set. Skipping invite email to ${emails.join(", ")}`); - } - - await createAudit({ - action: "user.invites_created", - actor: { - id: user.id, - type: "user" - }, - target: { - id: org.id.toString(), - type: "org" - }, - orgId: org.id, - metadata: { - emails: emails.join(", ") - } - }); - return { - success: true, - } - }) - )); - -export const cancelInvite = async (inviteId: string): Promise<{ success: boolean } | ServiceError> => sew(() => - withAuth(async ({ org, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - const invite = await prisma.invite.findUnique({ - where: { - id: inviteId, - orgId: org.id, - }, - }); - - if (!invite) { - return notFound(); - } - - await prisma.invite.delete({ - where: { - id: inviteId, - }, - }); - - return { - success: true, - } - }) - )); - -export const getOrgInvites = async () => sew(() => - withAuth(async ({ org, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - const invites = await prisma.invite.findMany({ - where: { - orgId: org.id, - }, - }); - - return invites.map((invite) => ({ - id: invite.id, - email: invite.recipientEmail, - createdAt: invite.createdAt, - })); - }))); - -// eslint-disable-next-line authz/require-auth-wrapper -- runs pre-org-membership; uses getAuthenticatedUser() directly since withAuth requires a user-to-org link this call is establishing -export const joinOrganization = async (inviteLinkId?: string) => sew(async () => { - const authResult = await getAuthenticatedUser(); - if (!authResult) { - return notAuthenticated(); - } - - const { user } = authResult; - - const org = await __unsafePrisma.org.findUnique({ - where: { - id: SINGLE_TENANT_ORG_ID, - }, - }); - - if (!org) { - return orgNotFound(); - } - - // With SCIM enabled the IdP is the source of truth for membership; joining - // via an invite link would bypass it. - if (await isScimEnabled(org)) { - return membershipManagedByIdpError(); - } - - // If member approval is required we must be using a valid invite link - if (isMemberApprovalRequired(org)) { - if (!org.inviteLinkEnabled) { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVITE_LINK_NOT_ENABLED, - message: "Invite link is not enabled.", - } satisfies ServiceError; - } - - if (org.inviteLinkId !== inviteLinkId) { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_INVITE_LINK, - message: "Invalid invite link.", - } satisfies ServiceError; - } - } - - const addUserToOrgRes = await ensureActiveMember(org.id, user.id, { - actor: { id: user.id, type: "user" }, - role: await getDefaultMemberRole(), - }); - if (isServiceError(addUserToOrgRes)) { - return addUserToOrgRes; - } - - return { - success: true, - } -}); - -// eslint-disable-next-line authz/require-auth-wrapper -- runs pre-org-membership; uses getAuthenticatedUser() directly since withAuth requires a user-to-org link this call is establishing -export const redeemInvite = async (inviteId: string): Promise<{ success: boolean; } | ServiceError> => sew(async () => { - const authResult = await getAuthenticatedUser(); - if (!authResult) { - return notAuthenticated(); - } - - const { user } = authResult; - - const invite = await __unsafePrisma.invite.findUnique({ - where: { - id: inviteId, - }, - include: { - org: true, - } - }); - - if (!invite) { - return notFound(); - } - - // With SCIM enabled the IdP is the source of truth for membership; accepting - // an invite would bypass it. - if (await isScimEnabled(invite.org)) { - return membershipManagedByIdpError(); - } - - const failAuditCallback = async (error: string) => { - await createAudit({ - action: "user.invite_accept_failed", - actor: { - id: user.id, - type: "user" - }, - target: { - id: inviteId, - type: "invite" - }, - orgId: invite.org.id, - metadata: { - message: error - } - }); - }; - - const hasAvailability = await orgHasAvailability(invite.org.id, __unsafePrisma); - if (!hasAvailability) { - await failAuditCallback("Organization is at max capacity"); - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.ORG_SEAT_COUNT_REACHED, - message: "Organization is at max capacity", - } satisfies ServiceError; - } - - // Check if the user is the recipient of the invite - if (user.email !== invite.recipientEmail) { - await failAuditCallback("User is not the recipient of the invite"); - return notFound(); - } - - const addUserToOrgRes = await ensureActiveMember(invite.orgId, user.id, { - actor: { id: user.id, type: "user" }, - role: await getDefaultMemberRole(), - }); - if (isServiceError(addUserToOrgRes)) { - await failAuditCallback(addUserToOrgRes.message); - return addUserToOrgRes; - } - - await createAudit({ - action: "user.invite_accepted", - actor: { - id: user.id, - type: "user" - }, - orgId: invite.org.id, - target: { - id: inviteId, - type: "invite" - } - }); - - return { - success: true, - }; -}); - - -// eslint-disable-next-line authz/require-auth-wrapper -- runs pre-org-membership; uses getAuthenticatedUser() directly since the invitee is not yet a member -export const getInviteInfo = async (inviteId: string) => sew(async () => { - const authResult = await getAuthenticatedUser(); - if (!authResult) { - return notAuthenticated(); - } - - const { user } = authResult; - - const invite = await __unsafePrisma.invite.findUnique({ - where: { - id: inviteId, - }, - include: { - org: true, - host: true, - } - }); - - if (!invite) { - return notFound(); - } - - if (invite.recipientEmail !== user.email) { - return notFound(); - } - - return { - id: invite.id, - orgName: invite.org.name, - orgImageUrl: invite.org.imageUrl ?? undefined, - host: { - name: invite.host.name ?? undefined, - email: invite.host.email, - avatarUrl: invite.host.image ?? undefined, - }, - recipient: { - name: user.name ?? undefined, - email: user.email, - } - }; -}); diff --git a/packages/web/src/features/membership/actions/members.ts b/packages/web/src/features/membership/actions/members.ts deleted file mode 100644 index edffc30e1..000000000 --- a/packages/web/src/features/membership/actions/members.ts +++ /dev/null @@ -1,114 +0,0 @@ -'use server'; - -import { membershipManagedByIdpError } from "@/features/membership/errors"; -import { removeMember, setMembershipSuspended } from "@/features/membership/membership.service"; -import { isScimEnabled } from "@/features/scim/utils"; -import { ServiceError } from "@/lib/serviceError"; -import { isServiceError } from "@/lib/utils"; -import { sew } from "@/middleware/sew"; -import { withAuth } from "@/middleware/withAuth"; -import { withMinimumOrgRole } from "@/middleware/withMinimumOrgRole"; -import { OrgRole } from "@sourcebot/db"; - -export const removeMemberFromOrg = async (memberId: string): Promise<{ success: boolean } | ServiceError> => sew(() => - withAuth(async ({ user, org, role }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - if (await isScimEnabled(org)) { - return membershipManagedByIdpError(); - } - - const result = await removeMember(org.id, memberId, { - actor: { id: user.id, type: "user" }, - }); - - if (isServiceError(result)) { - return result; - } - - return { success: true }; - })) -); - -export const suspendMember = async (memberId: string): Promise<{ success: boolean } | ServiceError> => sew(() => - withAuth(async ({ user, org, role }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - if (await isScimEnabled(org)) { - return membershipManagedByIdpError(); - } - - const result = await setMembershipSuspended(org.id, memberId, true, { - actor: { id: user.id, type: "user" }, - }); - - if (isServiceError(result)) { - return result; - } - - return { success: true }; - })) -); - -export const reactivateMember = async (memberId: string): Promise<{ success: boolean } | ServiceError> => sew(() => - withAuth(async ({ user, org, role }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - if (await isScimEnabled(org)) { - return membershipManagedByIdpError(); - } - - const result = await setMembershipSuspended(org.id, memberId, false, { - actor: { id: user.id, type: "user" }, - }); - - if (isServiceError(result)) { - return result; - } - - return { success: true }; - })) -); - -export const leaveOrg = async (): Promise<{ success: boolean } | ServiceError> => sew(() => - withAuth(async ({ user, org }) => { - if (await isScimEnabled(org)) { - return membershipManagedByIdpError(); - } - - const result = await removeMember(org.id, user.id, { - actor: { id: user.id, type: "user" }, - reason: "left", - }); - - if (isServiceError(result)) { - return result; - } - - return { - success: true, - } - })); - - -export const getOrgMembers = async () => sew(() => - withAuth(async ({ org, role, prisma }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - const members = await prisma.userToOrg.findMany({ - where: { - orgId: org.id, - }, - include: { - user: true, - }, - }); - - return members.map((member) => ({ - id: member.userId, - email: member.user.email, - name: member.user.name ?? undefined, - avatarUrl: member.user.image ?? undefined, - role: member.role, - joinedAt: member.joinedAt, - suspendedAt: member.suspendedAt, - scimManaged: !!member.scimExternalId, - lastActiveAt: member.lastActiveAt, - })); - }))); diff --git a/packages/web/src/features/membership/components/joinOrganizationCard.tsx b/packages/web/src/features/membership/components/joinOrganizationCard.tsx deleted file mode 100644 index 37f2f0023..000000000 --- a/packages/web/src/features/membership/components/joinOrganizationCard.tsx +++ /dev/null @@ -1,72 +0,0 @@ -'use client'; - -import { SourcebotLogo } from "@/app/components/sourcebotLogo"; -import { useToast } from "@/components/hooks/use-toast"; -import { Button } from "@/components/ui/button"; -import { Card, CardContent, CardHeader } from "@/components/ui/card"; -import { joinOrganization } from "@/features/membership/actions"; -import { isServiceError } from "@/lib/utils"; -import { Loader2 } from "lucide-react"; -import { useRouter } from "next/navigation"; -import { useState } from "react"; -import { LogoutEscapeHatch } from "../../../app/components/logoutEscapeHatch"; - -export function JoinOrganizationCard({ inviteLinkId }: { inviteLinkId?: string }) { - const [isLoading, setIsLoading] = useState(false); - const router = useRouter(); - const { toast } = useToast(); - - const handleJoinOrganization = async () => { - setIsLoading(true); - - try { - const result = await joinOrganization(inviteLinkId); - - if (isServiceError(result)) { - toast({ - title: "Failed to join organization", - description: result.message, - variant: "destructive", - }); - return; - } - - router.refresh(); - } catch (error) { - console.error("Error joining organization:", error); - toast({ - title: "Error", - description: "An unexpected error occurred. Please try again.", - variant: "destructive", - }); - } finally { - setIsLoading(false); - } - }; - - return ( -
- - - - - - -
-

- Welcome to Sourcebot! Click the button below to join this organization. -

-
- -
-
-
- ); -} \ No newline at end of file diff --git a/packages/web/src/features/membership/components/managedByScimBadge.tsx b/packages/web/src/features/membership/components/managedByScimBadge.tsx deleted file mode 100644 index 5de93d8f9..000000000 --- a/packages/web/src/features/membership/components/managedByScimBadge.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Badge } from "@/components/ui/badge"; -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; -import { Info } from "lucide-react"; -import { type ReactNode } from "react"; - -interface ManagedByScimBadgeProps { - /** Tooltip explaining the SCIM relationship in the badge's context. */ - tooltip?: ReactNode; -} - -/** - * Marks something governed by SCIM provisioning (a setting that's superseded, or - * a member provisioned by the IdP). Pair it with a disabled control where it - * marks a setting. The tooltip is context-specific via the `tooltip` prop. - */ -export const ManagedByScimBadge = ({ - tooltip = "Provisioned through your identity provider.", -}: ManagedByScimBadgeProps) => ( - - - - - Managed by SCIM - - - - - {tooltip} - - - -); diff --git a/packages/web/src/features/membership/components/managedByScimNotice.tsx b/packages/web/src/features/membership/components/managedByScimNotice.tsx deleted file mode 100644 index cf8b9022b..000000000 --- a/packages/web/src/features/membership/components/managedByScimNotice.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Alert, AlertDescription } from "@/components/ui/alert"; -import { Info } from "lucide-react"; -import { type ReactNode } from "react"; - -/** - * Inline notice shown on settings surfaces whose controls are superseded when - * SCIM provisioning is enabled (the IdP owns membership). The message is passed - * as children so each surface can phrase it for its own controls. - */ -export const ManagedByScimNotice = ({ children }: { children: ReactNode }) => ( - - - {children} - -); diff --git a/packages/web/src/features/membership/components/notProvisionedCard.tsx b/packages/web/src/features/membership/components/notProvisionedCard.tsx deleted file mode 100644 index 5f95b5ace..000000000 --- a/packages/web/src/features/membership/components/notProvisionedCard.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { LogoutEscapeHatch } from "@/app/components/logoutEscapeHatch"; -import { SourcebotLogo } from "@/app/components/sourcebotLogo"; - -/** - * Shown to an authenticated user who is not a member of the org while SCIM - * provisioning is enabled. Membership is owned by the IdP, so the usual - * join / request-to-join flows don't apply — they must be provisioned upstream. - */ -export const NotProvisionedCard = () => { - return ( -
- - -
-
- - -
-
- - - -
- -
-

- Account not provisioned -

-

- Access to this organization is managed by your identity provider. Ask your administrator to provision your account. -

-
-
-
-
-
- ); -}; diff --git a/packages/web/src/features/membership/components/orgAtCapacityCard.tsx b/packages/web/src/features/membership/components/orgAtCapacityCard.tsx deleted file mode 100644 index a5fbe1ea6..000000000 --- a/packages/web/src/features/membership/components/orgAtCapacityCard.tsx +++ /dev/null @@ -1,50 +0,0 @@ -"use client"; - -import { LogoutEscapeHatch } from "@/app/components/logoutEscapeHatch"; -import { SourcebotLogo } from "@/app/components/sourcebotLogo"; -import { Button } from "@/components/ui/button"; -import { UsersRound } from "lucide-react"; - -interface OrgAtCapacityCardProps { - onRetry: () => void; -} - -export const OrgAtCapacityCard = ({ onRetry }: OrgAtCapacityCardProps) => { - return ( -
- - -
-
- - -
-
- -
- -
-

- Organization at capacity -

-

- This organization has reached its seat limit. Ask an owner to add seats or deactivate an inactive member. -

-
-
- - -
-
-
- ); -}; diff --git a/packages/web/src/features/membership/components/pendingApprovalCard.tsx b/packages/web/src/features/membership/components/pendingApprovalCard.tsx deleted file mode 100644 index 0034a5041..000000000 --- a/packages/web/src/features/membership/components/pendingApprovalCard.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { LogoutEscapeHatch } from "@/app/components/logoutEscapeHatch" -import { SourcebotLogo } from "@/app/components/sourcebotLogo" - -export const PendingApprovalCard = async () => { - return ( -
- - -
-
- - -
-
- - - -
- -
-

- Approval Pending -

-

- Your request is being reviewed. -

-
-
- -
-
-
- - - -
- Awaiting review -
-
- -
-
-
- ) -} diff --git a/packages/web/src/features/membership/components/submitJoinRequestCard.tsx b/packages/web/src/features/membership/components/submitJoinRequestCard.tsx deleted file mode 100644 index e13ec1714..000000000 --- a/packages/web/src/features/membership/components/submitJoinRequestCard.tsx +++ /dev/null @@ -1,102 +0,0 @@ -'use client'; - -import { LogoutEscapeHatch } from "@/app/components/logoutEscapeHatch" -import { SourcebotLogo } from "@/app/components/sourcebotLogo" -import { useToast } from "@/components/hooks/use-toast" -import { LoadingButton } from "@/components/ui/loading-button"; -import { createAccountRequest } from "@/features/membership/actions" -import { isServiceError } from "@/lib/utils" -import { Clock } from "lucide-react" -import { useRouter } from "next/navigation" -import { useState } from "react" - -export const SubmitJoinRequestCard = () => { - const { toast } = useToast() - const router = useRouter() - const [isSubmitting, setIsSubmitting] = useState(false) - - const handleSubmit = async () => { - setIsSubmitting(true) - try { - const result = await createAccountRequest() - if (!isServiceError(result)) { - if (result.existingRequest) { - toast({ - title: "Request Already Submitted", - description: "Your request to join the organization has already been submitted. Please wait for it to be approved.", - variant: "default", - }) - } else { - toast({ - title: "Request Submitted", - description: "Your request to join the organization has been submitted.", - variant: "default", - }) - } - // Refresh the page to trigger layout re-render and show PendingApprovalCard - router.refresh() - } else { - toast({ - title: "Failed to Submit", - description: `There was an error submitting your request. Reason: ${result.message}`, - variant: "destructive", - }) - } - } catch (error) { - toast({ - title: "Failed to Submit", - description: error instanceof Error ? error.message : "An unexpected error occurred.", - variant: "destructive", - }) - } finally { - setIsSubmitting(false) - } - } - - return ( -
- - -
-
- - -
-
- - - -
- -
-

- Request Access -

-

- Submit a request to join this organization -

-
-
- -
-
- - {!isSubmitting && } - Submit Request - -
-
-
-
-
- ) -} diff --git a/packages/web/src/features/membership/errors.ts b/packages/web/src/features/membership/errors.ts deleted file mode 100644 index 8da00a4c3..000000000 --- a/packages/web/src/features/membership/errors.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ErrorCode } from "@/lib/errorCodes"; -import { ServiceError } from "@/lib/serviceError"; -import { StatusCodes } from "http-status-codes"; - - -export const seatLimitReached = (): ServiceError => ({ - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.ORG_SEAT_COUNT_REACHED, - message: "Organization is at max capacity", -}); - -export const lastOwnerError = (reason: "removed" | "left"): ServiceError => ({ - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.LAST_OWNER_CANNOT_BE_REMOVED, - message: reason === "left" - ? "You are the last owner of this organization. Promote another member to owner before leaving." - : "Cannot remove the last owner of the organization", -}); - -export const lastOwnerDemoteError = (): ServiceError => ({ - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.LAST_OWNER_CANNOT_BE_DEMOTED, - message: "Cannot demote the last owner. Promote another member to owner first.", -}); - -export const memberSuspendedError = (): ServiceError => ({ - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.MEMBER_SUSPENDED, - message: "Suspended members cannot be promoted or demoted. Reactivate the member first.", -}); - -// When SCIM is enabled the IdP is the source of truth for membership, so paths -// that would grant membership outside it (invites, join requests) are disabled. -export const membershipManagedByIdpError = (): ServiceError => ({ - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.MEMBERSHIP_MANAGED_BY_IDP, - message: "SCIM provisioning is enabled. Membership is managed through your identity provider.", -}); diff --git a/packages/web/src/features/membership/logger.ts b/packages/web/src/features/membership/logger.ts deleted file mode 100644 index f2b56522b..000000000 --- a/packages/web/src/features/membership/logger.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createLogger } from "@sourcebot/shared"; - -export const logger = createLogger('membership'); \ No newline at end of file diff --git a/packages/web/src/features/membership/membership.service.test.ts b/packages/web/src/features/membership/membership.service.test.ts deleted file mode 100644 index 30eade54f..000000000 --- a/packages/web/src/features/membership/membership.service.test.ts +++ /dev/null @@ -1,486 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { activatePendingMembership, ensureActiveMember, removeMember, setMemberRole, setMembershipSuspended } from './membership.service'; -import { prisma, MOCK_USER_WITH_ACCOUNTS } from '@/__mocks__/prisma'; -import { OrgRole, type UserToOrg } from '@sourcebot/db'; -import { ErrorCode } from '@/lib/errorCodes'; -import { isServiceError } from '@/lib/utils'; -import type { ServiceError } from '@/lib/serviceError'; - -const mocks = vi.hoisted(() => ({ - orgHasAvailability: vi.fn(), - syncWithLighthouse: vi.fn(), - createAudit: vi.fn(), -})); - -vi.mock('@/prisma', async () => { - const actual = await vi.importActual('@/__mocks__/prisma'); - return { ...actual }; -}); -vi.mock('server-only', () => ({ default: vi.fn() })); -vi.mock('@/features/membership/utils', () => ({ - orgHasAvailability: mocks.orgHasAvailability, - activeMembershipWhere: () => ({ suspendedAt: null, lastActiveAt: { not: null } }), - pendingMembershipWhere: () => ({ suspendedAt: null, lastActiveAt: null }), - unsuspendedMembershipWhere: () => ({ suspendedAt: null }), -})); -vi.mock('@/features/billing/servicePing', () => ({ syncWithLighthouse: mocks.syncWithLighthouse })); -vi.mock('@/ee/features/audit/audit', () => ({ createAudit: mocks.createAudit })); - -const ORG_ID = 1; -const USER_ID = 'user-1'; -const ACTOR = { id: 'scim', type: 'scim_token' } as const; -const SUSPENDED_AT = new Date('2026-01-01T00:00:00.000Z'); -const ACTIVE_AT = new Date('2026-01-02T00:00:00.000Z'); - -const makeMembership = (overrides: Partial = {}): UserToOrg => ({ - orgId: ORG_ID, - userId: USER_ID, - role: OrgRole.MEMBER, - joinedAt: new Date(), - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - ...overrides, -}); - -const mockUser = { ...MOCK_USER_WITH_ACCOUNTS, id: USER_ID, email: 'user@example.com' }; - -beforeEach(() => { - mocks.orgHasAvailability.mockReset().mockResolvedValue(true); - mocks.syncWithLighthouse.mockReset().mockResolvedValue(undefined); - mocks.createAudit.mockReset().mockResolvedValue(undefined); - // Run $transaction callbacks against the same deep mock as the tx client. - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (prisma.$transaction as any).mockImplementation(async (cb: any) => cb(prisma)); -}); - -describe('activatePendingMembership', () => { - test('activates a pending unsuspended membership with a guarded update and syncs Lighthouse', async () => { - prisma.userToOrg.updateMany.mockResolvedValue({ count: 1 }); - - const result = await activatePendingMembership(makeMembership()); - - expect(result).toBeNull(); - expect(prisma.$transaction).toHaveBeenCalledWith(expect.any(Function)); - expect(mocks.orgHasAvailability).toHaveBeenCalledWith(ORG_ID, prisma); - expect(prisma.userToOrg.updateMany).toHaveBeenCalledWith({ - where: { - orgId: ORG_ID, - userId: USER_ID, - suspendedAt: null, - lastActiveAt: null, - }, - data: { lastActiveAt: expect.any(Date) }, - }); - expect(mocks.syncWithLighthouse).toHaveBeenCalledWith(ORG_ID); - }); - - test('returns a seat-limit error when active seats are at the cap', async () => { - mocks.orgHasAvailability.mockResolvedValue(false); - - const result = await activatePendingMembership(makeMembership()); - - expect(isServiceError(result)).toBe(true); - expect((result as ServiceError).errorCode).toBe(ErrorCode.ORG_SEAT_COUNT_REACHED); - expect(prisma.userToOrg.updateMany).not.toHaveBeenCalled(); - expect(mocks.syncWithLighthouse).not.toHaveBeenCalled(); - }); - - test('does not activate non-pending memberships', async () => { - expect(await activatePendingMembership(makeMembership({ lastActiveAt: new Date() }))).toBeNull(); - expect(await activatePendingMembership(makeMembership({ suspendedAt: SUSPENDED_AT }))).toBeNull(); - - expect(prisma.$transaction).not.toHaveBeenCalled(); - expect(prisma.userToOrg.updateMany).not.toHaveBeenCalled(); - expect(mocks.syncWithLighthouse).not.toHaveBeenCalled(); - }); - - test('does not sync Lighthouse when the guarded update does not activate the row', async () => { - prisma.userToOrg.updateMany.mockResolvedValue({ count: 0 }); - - const result = await activatePendingMembership(makeMembership()); - - expect(result).toBeNull(); - expect(mocks.syncWithLighthouse).not.toHaveBeenCalled(); - }); -}); - -describe('ensureActiveMember', () => { - test('creates a new active membership when none exists', async () => { - const created = makeMembership(); - prisma.user.findUnique.mockResolvedValue(mockUser); - prisma.userToOrg.findUnique.mockResolvedValue(null); - prisma.userToOrg.create.mockResolvedValue(created); - - const result = await ensureActiveMember(ORG_ID, USER_ID, { actor: ACTOR, role: OrgRole.MEMBER }); - - expect(isServiceError(result)).toBe(false); - expect(result).toEqual(created); - expect(prisma.userToOrg.create).toHaveBeenCalledWith( - expect.objectContaining({ - data: expect.objectContaining({ userId: USER_ID, orgId: ORG_ID, role: OrgRole.MEMBER }), - }), - ); - expect(mocks.syncWithLighthouse).toHaveBeenCalledWith(ORG_ID); - expect(mocks.createAudit).toHaveBeenCalledWith(expect.objectContaining({ action: 'org.member_added' })); - }); - - test('records scimExternalId on create when provided', async () => { - prisma.user.findUnique.mockResolvedValue(mockUser); - prisma.userToOrg.findUnique.mockResolvedValue(null); - prisma.userToOrg.create.mockResolvedValue(makeMembership({ scimExternalId: 'ext-1' })); - - await ensureActiveMember(ORG_ID, USER_ID, { actor: ACTOR, role: OrgRole.MEMBER, scimExternalId: 'ext-1' }); - - expect(prisma.userToOrg.create).toHaveBeenCalledWith( - expect.objectContaining({ data: expect.objectContaining({ scimExternalId: 'ext-1' }) }), - ); - }); - - test('clears pending invites and account requests on create', async () => { - prisma.user.findUnique.mockResolvedValue(mockUser); - prisma.userToOrg.findUnique.mockResolvedValue(null); - prisma.userToOrg.create.mockResolvedValue(makeMembership()); - - await ensureActiveMember(ORG_ID, USER_ID, { actor: ACTOR, role: OrgRole.MEMBER }); - - expect(prisma.accountRequest.deleteMany).toHaveBeenCalledWith({ where: { requestedById: USER_ID, orgId: ORG_ID } }); - expect(prisma.invite.deleteMany).toHaveBeenCalledWith({ where: { recipientEmail: mockUser.email, orgId: ORG_ID } }); - }); - - test('is an idempotent no-op when an unsuspended membership already exists', async () => { - const existing = makeMembership({ suspendedAt: null }); - prisma.user.findUnique.mockResolvedValue(mockUser); - prisma.userToOrg.findUnique.mockResolvedValue(existing); - - const result = await ensureActiveMember(ORG_ID, USER_ID, { actor: ACTOR, role: OrgRole.MEMBER }); - - expect(result).toEqual(existing); - expect(prisma.userToOrg.create).not.toHaveBeenCalled(); - expect(mocks.createAudit).not.toHaveBeenCalled(); - }); - - test('refreshes scimExternalId when an unsuspended membership already exists', async () => { - const existing = makeMembership({ suspendedAt: null, scimExternalId: 'old' }); - const refreshed = makeMembership({ suspendedAt: null, scimExternalId: 'new' }); - prisma.user.findUnique.mockResolvedValue(mockUser); - prisma.userToOrg.findUnique.mockResolvedValue(existing); - prisma.userToOrg.update.mockResolvedValue(refreshed); - - const result = await ensureActiveMember(ORG_ID, USER_ID, { actor: ACTOR, role: OrgRole.MEMBER, scimExternalId: 'new' }); - - expect(result).toEqual(refreshed); - expect(prisma.userToOrg.update).toHaveBeenCalledWith( - expect.objectContaining({ data: { scimExternalId: 'new' } }), - ); - expect(mocks.orgHasAvailability).not.toHaveBeenCalled(); - expect(mocks.createAudit).not.toHaveBeenCalled(); - }); - - test('reactivates a suspended membership', async () => { - const existing = makeMembership({ suspendedAt: SUSPENDED_AT }); - const reactivated = makeMembership({ suspendedAt: null }); - prisma.user.findUnique.mockResolvedValue(mockUser); - prisma.userToOrg.findUnique.mockResolvedValue(existing); - prisma.userToOrg.update.mockResolvedValue(reactivated); - mocks.orgHasAvailability.mockResolvedValue(true); - - const result = await ensureActiveMember(ORG_ID, USER_ID, { actor: ACTOR, role: OrgRole.MEMBER }); - - expect(isServiceError(result)).toBe(false); - expect(result).toEqual(reactivated); - expect(prisma.userToOrg.create).not.toHaveBeenCalled(); - expect(prisma.userToOrg.update).toHaveBeenCalledWith( - expect.objectContaining({ data: expect.objectContaining({ suspendedAt: null }) }), - ); - expect(mocks.createAudit).toHaveBeenCalledWith(expect.objectContaining({ action: 'org.member_reactivated' })); - }); - - test('errors when the org is at seat capacity', async () => { - prisma.user.findUnique.mockResolvedValue(mockUser); - prisma.userToOrg.findUnique.mockResolvedValue(null); - mocks.orgHasAvailability.mockResolvedValue(false); - - const result = await ensureActiveMember(ORG_ID, USER_ID, { actor: ACTOR, role: OrgRole.MEMBER }); - - expect(isServiceError(result)).toBe(true); - expect((result as ServiceError).errorCode).toBe(ErrorCode.ORG_SEAT_COUNT_REACHED); - expect(prisma.userToOrg.create).not.toHaveBeenCalled(); - }); - - test('errors when the user does not exist', async () => { - prisma.user.findUnique.mockResolvedValue(null); - - const result = await ensureActiveMember(ORG_ID, USER_ID, { actor: ACTOR, role: OrgRole.MEMBER }); - - expect(isServiceError(result)).toBe(true); - expect(prisma.userToOrg.create).not.toHaveBeenCalled(); - }); -}); - -describe('removeMember', () => { - test('deletes the membership and revokes sessions + tokens', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership()); - - const result = await removeMember(ORG_ID, USER_ID, { actor: ACTOR }); - - expect(result).toBeNull(); - expect(prisma.user.update).toHaveBeenCalledWith({ where: { id: USER_ID }, data: { sessionVersion: { increment: 1 } } }); - expect(prisma.apiKey.deleteMany).toHaveBeenCalledWith({ where: { createdById: USER_ID, orgId: ORG_ID } }); - expect(prisma.oAuthToken.deleteMany).toHaveBeenCalled(); - expect(prisma.userToOrg.delete).toHaveBeenCalledWith({ where: { orgId_userId: { orgId: ORG_ID, userId: USER_ID } } }); - expect(mocks.createAudit).toHaveBeenCalledWith(expect.objectContaining({ action: 'org.member_removed' })); - }); - - test('errors when the membership does not exist', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(null); - - const result = await removeMember(ORG_ID, USER_ID, { actor: ACTOR }); - - expect(isServiceError(result)).toBe(true); - expect(prisma.userToOrg.delete).not.toHaveBeenCalled(); - }); - - test('blocks removing the last active owner', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ role: OrgRole.OWNER, suspendedAt: null, lastActiveAt: ACTIVE_AT })); - prisma.userToOrg.count.mockResolvedValue(1); - - const result = await removeMember(ORG_ID, USER_ID, { actor: ACTOR }); - - expect(isServiceError(result)).toBe(true); - expect((result as ServiceError).errorCode).toBe(ErrorCode.LAST_OWNER_CANNOT_BE_REMOVED); - expect(prisma.userToOrg.delete).not.toHaveBeenCalled(); - }); - - test('allows removing a pending owner without applying the last-owner guard', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ role: OrgRole.OWNER, suspendedAt: null, lastActiveAt: null })); - prisma.userToOrg.count.mockResolvedValue(1); - - const result = await removeMember(ORG_ID, USER_ID, { actor: ACTOR }); - - expect(result).toBeNull(); - expect(prisma.userToOrg.count).not.toHaveBeenCalled(); - expect(prisma.userToOrg.delete).toHaveBeenCalled(); - }); - - test('allows removing an owner when others remain', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ role: OrgRole.OWNER, suspendedAt: null, lastActiveAt: ACTIVE_AT })); - prisma.userToOrg.count.mockResolvedValue(2); - - const result = await removeMember(ORG_ID, USER_ID, { actor: ACTOR }); - - expect(result).toBeNull(); - expect(prisma.userToOrg.delete).toHaveBeenCalled(); - }); - - test('reason "left" audits org.member_left', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership()); - - const result = await removeMember(ORG_ID, USER_ID, { actor: ACTOR, reason: 'left' }); - - expect(result).toBeNull(); - expect(mocks.createAudit).toHaveBeenCalledWith(expect.objectContaining({ action: 'org.member_left' })); - }); -}); - -describe('setMemberRole', () => { - test('promotes a member to owner and audits it', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ role: OrgRole.MEMBER, lastActiveAt: ACTIVE_AT })); - - const result = await setMemberRole(ORG_ID, USER_ID, OrgRole.OWNER, { actor: ACTOR }); - - expect(result).toBeNull(); - expect(prisma.userToOrg.update).toHaveBeenCalledWith( - expect.objectContaining({ data: { role: OrgRole.OWNER } }), - ); - expect(mocks.createAudit).toHaveBeenCalledWith(expect.objectContaining({ action: 'org.member_promoted_to_owner' })); - }); - - test('demotes an owner to member when other owners remain', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ role: OrgRole.OWNER, suspendedAt: null, lastActiveAt: ACTIVE_AT })); - prisma.userToOrg.count.mockResolvedValue(2); - - const result = await setMemberRole(ORG_ID, USER_ID, OrgRole.MEMBER, { actor: ACTOR }); - - expect(result).toBeNull(); - expect(mocks.createAudit).toHaveBeenCalledWith(expect.objectContaining({ action: 'org.owner_demoted_to_member' })); - }); - - test('blocks demoting the last active owner', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ role: OrgRole.OWNER, suspendedAt: null, lastActiveAt: ACTIVE_AT })); - prisma.userToOrg.count.mockResolvedValue(1); - - const result = await setMemberRole(ORG_ID, USER_ID, OrgRole.MEMBER, { actor: ACTOR }); - - expect(isServiceError(result)).toBe(true); - expect((result as ServiceError).errorCode).toBe(ErrorCode.LAST_OWNER_CANNOT_BE_DEMOTED); - expect(prisma.userToOrg.update).not.toHaveBeenCalled(); - }); - - test('promotes a pending member to owner and audits it', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ role: OrgRole.MEMBER, lastActiveAt: null })); - - const result = await setMemberRole(ORG_ID, USER_ID, OrgRole.OWNER, { actor: ACTOR }); - - expect(result).toBeNull(); - expect(prisma.userToOrg.update).toHaveBeenCalledWith( - expect.objectContaining({ data: { role: OrgRole.OWNER } }), - ); - expect(mocks.createAudit).toHaveBeenCalledWith(expect.objectContaining({ action: 'org.member_promoted_to_owner' })); - }); - - test('demotes a pending owner without applying the last-owner guard', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ role: OrgRole.OWNER, lastActiveAt: null })); - prisma.userToOrg.count.mockResolvedValue(1); - - const result = await setMemberRole(ORG_ID, USER_ID, OrgRole.MEMBER, { actor: ACTOR }); - - expect(result).toBeNull(); - expect(prisma.userToOrg.count).not.toHaveBeenCalled(); - expect(prisma.userToOrg.update).toHaveBeenCalledWith( - expect.objectContaining({ data: { role: OrgRole.MEMBER } }), - ); - }); - - test('blocks promoting a suspended member', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ - role: OrgRole.MEMBER, - suspendedAt: SUSPENDED_AT, - })); - - const result = await setMemberRole(ORG_ID, USER_ID, OrgRole.OWNER, { actor: ACTOR }); - - expect(isServiceError(result)).toBe(true); - expect((result as ServiceError).errorCode).toBe(ErrorCode.MEMBER_SUSPENDED); - expect(prisma.userToOrg.update).not.toHaveBeenCalled(); - }); - - test('blocks demoting a suspended owner', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ - role: OrgRole.OWNER, - suspendedAt: SUSPENDED_AT, - lastActiveAt: ACTIVE_AT, - })); - - const result = await setMemberRole(ORG_ID, USER_ID, OrgRole.MEMBER, { actor: ACTOR }); - - expect(isServiceError(result)).toBe(true); - expect((result as ServiceError).errorCode).toBe(ErrorCode.MEMBER_SUSPENDED); - expect(prisma.userToOrg.update).not.toHaveBeenCalled(); - }); - - test('is a no-op when the role is unchanged', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ role: OrgRole.MEMBER })); - - const result = await setMemberRole(ORG_ID, USER_ID, OrgRole.MEMBER, { actor: ACTOR }); - - expect(result).toBeNull(); - expect(prisma.userToOrg.update).not.toHaveBeenCalled(); - expect(mocks.createAudit).not.toHaveBeenCalled(); - }); - - test('errors when the membership does not exist', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(null); - - const result = await setMemberRole(ORG_ID, USER_ID, OrgRole.OWNER, { actor: ACTOR }); - - expect(isServiceError(result)).toBe(true); - expect(prisma.userToOrg.update).not.toHaveBeenCalled(); - }); -}); - -describe('setMembershipSuspended', () => { - describe('suspend', () => { - test('suspends an active member and revokes access', async () => { - const suspended = makeMembership({ suspendedAt: SUSPENDED_AT }); - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ suspendedAt: null })); - prisma.userToOrg.update.mockResolvedValue(suspended); - - const result = await setMembershipSuspended(ORG_ID, USER_ID, true, { actor: ACTOR }); - - expect(result).toEqual(suspended); - expect(prisma.user.update).toHaveBeenCalledWith({ where: { id: USER_ID }, data: { sessionVersion: { increment: 1 } } }); - expect(prisma.apiKey.deleteMany).toHaveBeenCalledWith({ where: { createdById: USER_ID, orgId: ORG_ID } }); - expect(prisma.oAuthToken.deleteMany).toHaveBeenCalled(); - expect(prisma.userToOrg.update).toHaveBeenCalledWith( - expect.objectContaining({ data: expect.objectContaining({ suspendedAt: expect.any(Date), lastActiveAt: null }) }), - ); - expect(mocks.createAudit).toHaveBeenCalledWith(expect.objectContaining({ action: 'org.member_deactivated' })); - }); - - test('is a no-op when already suspended', async () => { - const existing = makeMembership({ suspendedAt: SUSPENDED_AT }); - prisma.userToOrg.findUnique.mockResolvedValue(existing); - - const result = await setMembershipSuspended(ORG_ID, USER_ID, true, { actor: ACTOR }); - - expect(result).toEqual(existing); - expect(prisma.userToOrg.update).not.toHaveBeenCalled(); - expect(prisma.user.update).not.toHaveBeenCalled(); - expect(mocks.createAudit).not.toHaveBeenCalled(); - }); - - test('errors when the membership does not exist', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(null); - - const result = await setMembershipSuspended(ORG_ID, USER_ID, true, { actor: ACTOR }); - - expect(isServiceError(result)).toBe(true); - expect(prisma.userToOrg.update).not.toHaveBeenCalled(); - }); - }); - - describe('reactivate', () => { - test('reactivates a suspended member when a seat is available', async () => { - const reactivated = makeMembership({ suspendedAt: null, scimExternalId: 'ext-1' }); - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ suspendedAt: SUSPENDED_AT })); - prisma.userToOrg.update.mockResolvedValue(reactivated); - mocks.orgHasAvailability.mockResolvedValue(true); - - const result = await setMembershipSuspended(ORG_ID, USER_ID, false, { actor: ACTOR, scimExternalId: 'ext-1' }); - - expect(result).toEqual(reactivated); - expect(prisma.userToOrg.update).toHaveBeenCalledWith( - expect.objectContaining({ data: expect.objectContaining({ suspendedAt: null, scimExternalId: 'ext-1' }) }), - ); - expect(mocks.createAudit).toHaveBeenCalledWith(expect.objectContaining({ action: 'org.member_reactivated' })); - }); - - test('errors when the org is at seat capacity', async () => { - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ suspendedAt: SUSPENDED_AT })); - mocks.orgHasAvailability.mockResolvedValue(false); - - const result = await setMembershipSuspended(ORG_ID, USER_ID, false, { actor: ACTOR }); - - expect(isServiceError(result)).toBe(true); - expect((result as ServiceError).errorCode).toBe(ErrorCode.ORG_SEAT_COUNT_REACHED); - expect(prisma.userToOrg.update).not.toHaveBeenCalled(); - }); - - test('is a no-op when already active (no audit, no seat check)', async () => { - const existing = makeMembership({ suspendedAt: null, scimExternalId: 'ext-1' }); - prisma.userToOrg.findUnique.mockResolvedValue(existing); - - const result = await setMembershipSuspended(ORG_ID, USER_ID, false, { actor: ACTOR, scimExternalId: 'ext-1' }); - - expect(result).toEqual(existing); - expect(prisma.userToOrg.update).not.toHaveBeenCalled(); - expect(mocks.orgHasAvailability).not.toHaveBeenCalled(); - expect(mocks.createAudit).not.toHaveBeenCalled(); - }); - - test('refreshes externalId when already active and it changed', async () => { - const refreshed = makeMembership({ suspendedAt: null, scimExternalId: 'new' }); - prisma.userToOrg.findUnique.mockResolvedValue(makeMembership({ suspendedAt: null, scimExternalId: 'old' })); - prisma.userToOrg.update.mockResolvedValue(refreshed); - - const result = await setMembershipSuspended(ORG_ID, USER_ID, false, { actor: ACTOR, scimExternalId: 'new' }); - - expect(result).toEqual(refreshed); - expect(prisma.userToOrg.update).toHaveBeenCalledWith( - expect.objectContaining({ data: { scimExternalId: 'new' } }), - ); - expect(mocks.createAudit).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/packages/web/src/features/membership/membership.service.ts b/packages/web/src/features/membership/membership.service.ts deleted file mode 100644 index 4a04baa46..000000000 --- a/packages/web/src/features/membership/membership.service.ts +++ /dev/null @@ -1,420 +0,0 @@ -import 'server-only'; - -import { createAudit } from "@/ee/features/audit/audit"; -import { type AuditActor } from "@/ee/features/audit/types"; -import { syncWithLighthouse } from "@/features/billing/servicePing"; -import { activeMembershipWhere, orgHasAvailability, pendingMembershipWhere } from "@/features/membership/utils"; -import { notFound, type ServiceError } from "@/lib/serviceError"; -import { isServiceError } from "@/lib/utils"; -import { __unsafePrisma as prisma } from "@/prisma"; -import { OrgRole, Prisma, type UserToOrg } from "@sourcebot/db"; -import { lastOwnerDemoteError, lastOwnerError, memberSuspendedError, seatLimitReached } from "./errors"; - -export interface EnsureActiveMemberOptions { - actor: AuditActor; - role: OrgRole; - scimExternalId?: string; -} - -/** - * Moves an unsuspended pending membership into the active seat set. This is the - * auth-path admission gate for provisioned users: SCIM/group sync can create - * pending memberships above the offline seat cap, but the first actual login - * must reserve a seat before the user gets access. - */ -export const activatePendingMembership = async ( - membership: UserToOrg, -): Promise => { - if (membership.suspendedAt !== null || membership.lastActiveAt !== null) { - return null; - } - - const activated = await prisma.$transaction(async (tx) => { - if (!(await orgHasAvailability(membership.orgId, tx))) { - return seatLimitReached(); - } - - const result = await tx.userToOrg.updateMany({ - where: { - orgId: membership.orgId, - userId: membership.userId, - ...pendingMembershipWhere(), - }, - data: { lastActiveAt: new Date() }, - }); - - return result.count === 1; - }); - - if (isServiceError(activated)) { - return activated; - } - - if (activated) { - await syncWithLighthouse(membership.orgId).catch(() => { /* best effort */ }); - } - - return null; -}; - -/** - * Ensures the user has an unsuspended membership. Unsuspended: returned - * unchanged. Suspended: reactivated (re-checks the seat cap). Otherwise: created. - * `role` only applies on create. Enforces the seat cap and clears pending - * invites / account requests for the user. - */ -export const ensureActiveMember = async ( - orgId: number, - userId: string, - options: EnsureActiveMemberOptions, -): Promise => { - const { actor, role, scimExternalId } = options; - const user = await prisma.user.findUnique({ where: { id: userId } }); - if (!user) { - return notFound("User not found"); - } - - const existing = await prisma.userToOrg.findUnique({ - where: { orgId_userId: { orgId, userId } }, - }); - - if (existing && existing.suspendedAt === null) { - // SCIM reprovisioning can refresh the IdP identifier even when the - // membership is already active, so persist a changed external ID. - if (scimExternalId && existing.scimExternalId !== scimExternalId) { - return setMembershipSuspended(orgId, userId, false, { - actor, - scimExternalId, - }); - } - return existing; - } - if (existing && existing.suspendedAt !== null) { - return setMembershipSuspended(orgId, userId, false, { - actor, - scimExternalId, - }); - } - - const membership = await prisma.$transaction(async (tx) => { - if (!(await orgHasAvailability(orgId, tx))) { - return seatLimitReached(); - } - - const created = await tx.userToOrg.create({ - data: { - userId, - orgId, - role, - ...(scimExternalId ? { scimExternalId } : {}), - }, - }); - - await tx.accountRequest.deleteMany({ - where: { requestedById: userId, orgId }, - }); - await tx.invite.deleteMany({ - where: { recipientEmail: user.email, orgId }, - }); - - return created; - }); - - if (isServiceError(membership)) { - return membership; - } - - await syncWithLighthouse(orgId).catch(() => { /* best effort */ }); - await createAudit({ - action: "org.member_added", - actor, - target: { id: userId, type: "user" }, - orgId, - }); - - return membership; -}; - - -export interface RemoveMemberOptions { - actor: AuditActor; - reason?: "removed" | "left"; -} - -/** - * Hard-removes a membership (deletes the join row, preserving the `User`). - * Bumps `sessionVersion` and revokes the user's API keys + OAuth tokens. - */ -export const removeMember = async ( - orgId: number, - userId: string, - options: RemoveMemberOptions, -): Promise => { - const { actor, reason = "removed" } = options; - - const result = await prisma.$transaction(async (tx) => { - const target = await tx.userToOrg.findUnique({ - where: { orgId_userId: { orgId, userId } }, - }); - if (!target) { - return notFound("Member not found in this organization"); - } - - if (isActiveOwner(target)) { - if ((await countActiveOwners(tx, orgId)) <= 1) { - return lastOwnerError(reason); - } - } - - await revokeAllUserAuthCredentials(tx, userId, orgId); - - await tx.userToOrg.delete({ - where: { orgId_userId: { orgId, userId } }, - }); - - return null; - }); - - if (!isServiceError(result)) { - await syncWithLighthouse(orgId).catch(() => { /* best effort */ }); - await createAudit({ - action: reason === "left" ? "org.member_left" : "org.member_removed", - actor, - target: { id: userId, type: "user" }, - orgId, - }); - } - - return result; -}; - - -export interface SetMemberRoleOptions { - actor: AuditActor; -} - -/** - * Changes a member's role (no-op when unchanged). Pending members can be - * promoted or demoted so an owner can be lined up before they first sign in; - * suspended members cannot. No session/token revocation: role is resolved from - * the DB on every request, so a change takes effect on the member's next - * request. Seats are unaffected, so no lighthouse sync. - */ -export const setMemberRole = async ( - orgId: number, - userId: string, - role: OrgRole, - options: SetMemberRoleOptions, -): Promise => { - const { actor } = options; - - let didChange = false; - - const result = await prisma.$transaction(async (tx) => { - const target = await tx.userToOrg.findUnique({ - where: { orgId_userId: { orgId, userId } }, - }); - if (!target) { - return notFound("Member not found in this organization"); - } - - if (target.role === role) { - return null; - } - - if (target.suspendedAt !== null) { - return memberSuspendedError(); - } - - const isDemotionFromOwner = target.role === OrgRole.OWNER && role !== OrgRole.OWNER; - if (isDemotionFromOwner && isActiveOwner(target)) { - if ((await countActiveOwners(tx, orgId)) <= 1) { - return lastOwnerDemoteError(); - } - } - - await tx.userToOrg.update({ - where: { orgId_userId: { orgId, userId } }, - data: { role }, - }); - didChange = true; - - return null; - }); - - if (!isServiceError(result) && didChange) { - await createAudit({ - action: role === OrgRole.OWNER ? "org.member_promoted_to_owner" : "org.owner_demoted_to_member", - actor, - target: { id: userId, type: "user" }, - orgId, - }); - } - - return result; -}; - -export interface SetMembershipSuspendedOptions { - actor: AuditActor; - scimExternalId?: string; -} - -/** - * Suspends or restores a membership without deleting it. Suspension bumps - * `sessionVersion` + revokes tokens; reactivation re-checks the seat cap. A - * no-op when already in the requested state. - */ -export const setMembershipSuspended = async ( - orgId: number, - userId: string, - suspended: boolean, - options: SetMembershipSuspendedOptions, -): Promise => { - const { actor, scimExternalId } = options; - - if (suspended) { - let didChange = false; - - const result = await prisma.$transaction(async (tx) => { - let target = await tx.userToOrg.findUnique({ - where: { orgId_userId: { orgId, userId } }, - }); - if (!target) { - return notFound("Member not found in this organization"); - } - if (target.suspendedAt !== null) { - return target; - } - - await revokeAllUserAuthCredentials(tx, userId, orgId); - - target = await tx.userToOrg.update({ - where: { orgId_userId: { orgId, userId } }, - data: { - suspendedAt: new Date(), - // @note: when a user is suspended, reset the lastActiveAt - // s.t., if they are re-provisioned, they will be in the - // "pending" state rather than "active". - lastActiveAt: null, - }, - }); - didChange = true; - return target; - }); - - if (!isServiceError(result) && didChange) { - await syncWithLighthouse(orgId).catch(() => { /* best effort */ }); - await createAudit({ - action: "org.member_deactivated", - actor, - target: { id: userId, type: "user" }, - orgId, - }); - } - - return result; - - } else { - let didChange = false; - - const result = await prisma.$transaction(async (tx) => { - let target = await tx.userToOrg.findUnique({ - where: { orgId_userId: { orgId, userId } }, - }); - if (!target) { - return notFound("Member not found in this organization"); - } - - if (target.suspendedAt === null) { - if (scimExternalId && target.scimExternalId !== scimExternalId) { - target = await tx.userToOrg.update({ - where: { orgId_userId: { orgId, userId } }, - data: { scimExternalId }, - }); - } - return target; - } - - if (!(await orgHasAvailability(orgId, tx))) { - return seatLimitReached(); - } - - target = await tx.userToOrg.update({ - where: { orgId_userId: { orgId, userId } }, - data: { - suspendedAt: null, - ...(scimExternalId ? { scimExternalId } : {}), - }, - }); - didChange = true; - return target; - }); - - if (!isServiceError(result) && didChange) { - await syncWithLighthouse(orgId).catch(() => { /* best effort */ }); - await createAudit({ - action: "org.member_reactivated", - actor, - target: { id: userId, type: "user" }, - orgId, - }); - } - - return result; - } -}; - -// Pending owners have never signed in and are excluded from `countActiveOwners`, -// so the last-owner guards only apply when the target itself is an active owner. -// Otherwise removing or demoting a pending owner would be blocked by the actor's -// own seat being the only active one counted. -const isActiveOwner = (membership: UserToOrg): boolean => - membership.role === OrgRole.OWNER - && membership.suspendedAt === null - && membership.lastActiveAt !== null; - -const countActiveOwners = (tx: Prisma.TransactionClient, orgId: number): Promise => - tx.userToOrg.count({ - where: { - orgId, - ...activeMembershipWhere(), - role: OrgRole.OWNER, - }, - }); - -const revokeAllUserAuthCredentials = async ( - prisma: Prisma.TransactionClient, - userId: string, - orgId: number, -): Promise => { - // JWT token - await prisma.user.update({ - where: { id: userId }, - data: { sessionVersion: { increment: 1 } }, - }); - - // API Keys - await prisma.apiKey.deleteMany({ - where: { - createdById: userId, - orgId, - } - }); - - // OAuth tokens - await prisma.oAuthToken.deleteMany({ - where: { - userId - } - }); - await prisma.oAuthRefreshToken.deleteMany({ - where: { - userId - } - }); - await prisma.oAuthAuthorizationCode.deleteMany({ - where: { - userId - } - }); -}; diff --git a/packages/web/src/features/membership/onCreateUser.ts b/packages/web/src/features/membership/onCreateUser.ts deleted file mode 100644 index 869eb73f6..000000000 --- a/packages/web/src/features/membership/onCreateUser.ts +++ /dev/null @@ -1,120 +0,0 @@ -import type { User as AuthJsUser } from "next-auth"; -import { __unsafePrisma } from "@/prisma"; -import { OrgRole } from "@sourcebot/db"; -import { SINGLE_TENANT_ORG_ID } from "@/lib/constants"; -import { isMemberApprovalRequired } from "@sourcebot/shared"; -import { createAudit } from "@/ee/features/audit/audit"; -import { isScimEnabled } from "@/features/scim/utils"; -import { getDefaultMemberRole } from "@/features/membership/utils"; -import { isServiceError } from "@/lib/utils"; -import { ensureActiveMember } from "@/features/membership/membership.service"; -import { logger } from "./logger"; -import { captureEvent } from "@/lib/posthog"; - -/** - * Auth-layer hook invoked whenever a new user account is created (NextAuth's - * `createUser` event, the credentials provider, and SSO). Handles org onboarding: - * the first user bootstraps the org as OWNER, subsequent users auto-join as - * members in open self-serve mode, and auto-join is suppressed when member - * approval is required or SCIM is enabled (the IdP is then the source of truth). - * Membership writes go through the membership service. - */ -export const onCreateUser = async ({ user }: { user: AuthJsUser }) => { - if (!user.id) { - logger.error("User ID is undefined on user creation"); - await createAudit({ - action: "user.creation_failed", - actor: { - id: "undefined", - type: "user" - }, - target: { - id: "undefined", - type: "user" - }, - orgId: SINGLE_TENANT_ORG_ID, - metadata: { - message: "User ID is undefined on user creation" - } - }); - throw new Error("User ID is undefined on user creation"); - } - - const defaultOrg = await __unsafePrisma.org.findUnique({ - where: { - id: SINGLE_TENANT_ORG_ID, - }, - include: { - members: true, - } - }); - - if (defaultOrg === null) { - await createAudit({ - action: "user.creation_failed", - actor: { - id: user.id, - type: "user" - }, - target: { - id: user.id, - type: "user" - }, - orgId: SINGLE_TENANT_ORG_ID, - metadata: { - message: "Default org not found on single tenant user creation" - } - }); - throw new Error("Default org not found on single tenant user creation"); - } - - // @note when creating a user, there are two cases for when - // we should be adding them to the single tenant organization. - // - // 1. The organization is empty. In this case, we add the - // user as a member with the OWNER role. - const isFirstUser = defaultOrg.members.length === 0; - if (isFirstUser) { - const result = await ensureActiveMember(SINGLE_TENANT_ORG_ID, user.id, { - actor: { id: user.id, type: "user" }, - role: OrgRole.OWNER, - }); - if (isServiceError(result)) { - throw new Error(`Failed to bootstrap initial owner for user ${user.id}: ${result.message}`); - } - - await createAudit({ - action: "user.owner_created", - actor: { - id: user.id, - type: "user" - }, - orgId: SINGLE_TENANT_ORG_ID, - target: { - id: SINGLE_TENANT_ORG_ID.toString(), - type: "org" - } - }); - } - - // 2. Otherwise, if both member approvals is disabled && - // scim is disabled, then we add the user as a member with - // whatever the default role is. - else if ( - !isMemberApprovalRequired(defaultOrg) && - !(await isScimEnabled(defaultOrg)) - ) { - const result = await ensureActiveMember(SINGLE_TENANT_ORG_ID, user.id, { - actor: { id: user.id, type: "user" }, - role: await getDefaultMemberRole(), - }); - if (isServiceError(result)) { - logger.warn(`onCreateUser: user ${user.id} was not auto-joined to org ${SINGLE_TENANT_ORG_ID}: ${result.message}`); - return; - } - } - - // Dynamic import to avoid circular dependency: - // authUtils -> posthog -> auth -> authUtils - await captureEvent('wa_user_created', { userId: user.id }); -}; \ No newline at end of file diff --git a/packages/web/src/features/membership/utils.ts b/packages/web/src/features/membership/utils.ts deleted file mode 100644 index 572e65288..000000000 --- a/packages/web/src/features/membership/utils.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { hasEntitlement } from "@/lib/entitlements"; -import { createLogger, getSeatCap } from "@sourcebot/shared"; -import { OrgRole, Prisma } from "@sourcebot/db"; - -const logger = createLogger("membership-utils"); - -/** - * Resolves the role a user receives when joining the org via invite, - * account-request approval, or interactive-login auto-join. On paid plans (the - * `org-management` entitlement) joiners are MEMBERs; on free plans there is no - * role distinction, so they join as OWNER. - */ -export const getDefaultMemberRole = async (): Promise => - (await hasEntitlement("org-management")) ? OrgRole.MEMBER : OrgRole.OWNER; - -/** - * Matches suspended memberships. - */ -export const suspendedMembershipWhere = (): Prisma.UserToOrgWhereInput => ({ - suspendedAt: { not: null }, -}); - -/** - * Matches unsuspended memberships, regardless of activity. - */ -export const activeOrPendingMembershipWhere = (): Prisma.UserToOrgWhereInput => ({ - suspendedAt: null, -}); - -/** - * Matches pending memberships: unsuspended and never seen. - */ -export const pendingMembershipWhere = (): Prisma.UserToOrgWhereInput => ({ - ...activeOrPendingMembershipWhere(), - lastActiveAt: null, -}); - -/** - * Matches active memberships: unsuspended and seen at least once. - */ -export const activeMembershipWhere = (): Prisma.UserToOrgWhereInput => ({ - ...activeOrPendingMembershipWhere(), - lastActiveAt: { not: null }, -}); - -/** - * Checks to see if the given organization has seat availability. Seat - * availability is determined by the `seats` parameter in the offline license - * key, if available. - */ -export const orgHasAvailability = async (orgId: number, tx: Prisma.TransactionClient): Promise => { - const seatCap = getSeatCap(); - - // Pending and suspended members are preserved but don't consume seats. - const activeUserCount = await tx.userToOrg.count({ - where: { - orgId, - ...activeMembershipWhere(), - }, - }); - - if ( - seatCap && - activeUserCount >= seatCap - ) { - logger.error(`orgHasAvailability: org ${orgId} has reached max capacity`); - return false; - } - - return true; -}; diff --git a/packages/web/src/features/repos/actions.test.ts b/packages/web/src/features/repos/actions.test.ts deleted file mode 100644 index 02452ba12..000000000 --- a/packages/web/src/features/repos/actions.test.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - authContext: undefined as unknown, - enqueue: vi.fn(), - getFailedJobIds: vi.fn(), -})); - -const repoIndexQueue = { - name: 'repo-index', -}; - -vi.mock('@/lib/bullmqClient', () => ({ - getBullMQClient: () => ({ - enqueue: mocks.enqueue, - getFailedJobIds: mocks.getFailedJobIds, - }), -})); -vi.mock('@/lib/serviceError', () => ({ - unexpectedError: (message: string) => ({ error: message }), -})); -vi.mock('@/middleware/sew', () => ({ - sew: (callback: () => unknown) => callback(), -})); -vi.mock('@/middleware/withAuth', () => ({ - withAuth: (callback: (context: unknown) => unknown) => - callback(mocks.authContext), -})); -vi.mock('@/middleware/withMinimumOrgRole', () => ({ - withMinimumOrgRole: ( - _role: unknown, - _minimumRole: unknown, - callback: () => unknown, - ) => callback(), -})); -vi.mock('@sourcebot/shared', () => ({ - JOB_PRIORITIES: { INTERACTIVE: 1 }, - REPO_INDEX_QUEUE: repoIndexQueue, -})); - -const { indexRepo, retryReposWithSyncIssues } = await import('./actions'); - -beforeEach(() => { - vi.clearAllMocks(); - mocks.enqueue.mockResolvedValue('job-1'); - mocks.getFailedJobIds.mockResolvedValue([]); -}); - -const setAuthContext = ( - findFirst: ReturnType, - findMany = vi.fn().mockResolvedValue([]), -) => { - mocks.authContext = { - org: { id: 1 }, - prisma: { repo: { findFirst, findMany } }, - role: 'OWNER', - }; -}; - -describe('indexRepo', () => { - test('enqueues an interactive index job for an existing repo', async () => { - const findFirst = vi.fn().mockResolvedValue({ id: 42 }); - setAuthContext(findFirst); - - await expect(indexRepo(42)).resolves.toEqual({ jobId: 'job-1' }); - - expect(findFirst).toHaveBeenCalledWith({ - where: { - id: 42, - orgId: 1, - }, - select: { - id: true, - }, - }); - expect(mocks.enqueue).toHaveBeenCalledWith( - repoIndexQueue, - { repoId: 42 }, - { priority: 1 }, - ); - }); - - test('does not enqueue an index job for a missing repo', async () => { - setAuthContext(vi.fn().mockResolvedValue(null)); - - await expect(indexRepo(42)).resolves.toEqual({ - error: 'Failed to index repo', - }); - expect(mocks.enqueue).not.toHaveBeenCalled(); - }); - - test('returns a service error when Redis rejects the job', async () => { - setAuthContext(vi.fn().mockResolvedValue({ id: 42 })); - mocks.enqueue.mockRejectedValue(new Error('Redis unavailable')); - - await expect(indexRepo(42)).resolves.toEqual({ - error: 'Failed to index repo', - }); - }); -}); - -describe('retryReposWithSyncIssues', () => { - test('retries every repository whose latest job failed', async () => { - const findMany = vi.fn().mockResolvedValue([{ id: 10 }, { id: 20 }]); - setAuthContext(vi.fn(), findMany); - mocks.getFailedJobIds.mockResolvedValue(['failed-1', 'failed-2']); - mocks.enqueue - .mockResolvedValueOnce('retry-10') - .mockResolvedValueOnce('retry-20'); - - await expect(retryReposWithSyncIssues()).resolves.toEqual({ - jobs: [ - { repoId: 10, jobId: 'retry-10' }, - { repoId: 20, jobId: 'retry-20' }, - ], - failedCount: 0, - }); - - expect(findMany).toHaveBeenCalledWith({ - where: { - orgId: 1, - latestIndexingJobId: { in: ['failed-1', 'failed-2'] }, - }, - orderBy: { id: 'asc' }, - select: { id: true }, - }); - expect(mocks.enqueue).toHaveBeenNthCalledWith( - 1, - repoIndexQueue, - { repoId: 10 }, - { priority: 1 }, - ); - expect(mocks.enqueue).toHaveBeenNthCalledWith( - 2, - repoIndexQueue, - { repoId: 20 }, - { priority: 1 }, - ); - }); - - test('returns successful jobs when part of the batch fails', async () => { - const findMany = vi.fn().mockResolvedValue([{ id: 10 }, { id: 20 }]); - setAuthContext(vi.fn(), findMany); - mocks.getFailedJobIds.mockResolvedValue(['failed-1']); - mocks.enqueue - .mockResolvedValueOnce('retry-10') - .mockRejectedValueOnce(new Error('Redis unavailable')); - - await expect(retryReposWithSyncIssues()).resolves.toEqual({ - jobs: [{ repoId: 10, jobId: 'retry-10' }], - failedCount: 1, - }); - }); -}); diff --git a/packages/web/src/features/repos/actions.ts b/packages/web/src/features/repos/actions.ts deleted file mode 100644 index 29d2753a5..000000000 --- a/packages/web/src/features/repos/actions.ts +++ /dev/null @@ -1,104 +0,0 @@ -'use server'; - -import { getBullMQClient } from '@/lib/bullmqClient'; -import { unexpectedError } from '@/lib/serviceError'; -import { sew } from '@/middleware/sew'; -import { withAuth } from '@/middleware/withAuth'; -import { withMinimumOrgRole } from '@/middleware/withMinimumOrgRole'; -import { OrgRole } from '@sourcebot/db'; -import { JOB_PRIORITIES, REPO_INDEX_QUEUE } from '@sourcebot/shared'; - -const MAX_CONCURRENT_REPO_RETRIES = 10; - -export type ScheduledRepoIndexJob = { - repoId: number; - jobId: string; -}; - -export const indexRepo = async (repoId: number) => sew(() => - withAuth(({ org, prisma, role }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - try { - const repo = await prisma.repo.findFirst({ - where: { - id: repoId, - orgId: org.id, - }, - select: { - id: true, - }, - }); - if (!repo) { - return unexpectedError('Failed to index repo'); - } - - const jobId = await getBullMQClient().enqueue( - REPO_INDEX_QUEUE, - { repoId: repo.id }, - { priority: JOB_PRIORITIES.INTERACTIVE }, - ); - - return { jobId }; - } catch { - return unexpectedError('Failed to index repo'); - } - }) - ) -); - -export const retryReposWithSyncIssues = async () => sew(() => - withAuth(({ org, prisma, role }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - try { - const client = getBullMQClient(); - const failedJobIds = await client.getFailedJobIds( - REPO_INDEX_QUEUE, - ); - const repos = await prisma.repo.findMany({ - where: { - orgId: org.id, - latestIndexingJobId: { in: failedJobIds }, - }, - orderBy: { id: 'asc' }, - select: { id: true }, - }); - - const jobs: ScheduledRepoIndexJob[] = []; - let failedCount = 0; - - for ( - let offset = 0; - offset < repos.length; - offset += MAX_CONCURRENT_REPO_RETRIES - ) { - const batch = repos.slice( - offset, - offset + MAX_CONCURRENT_REPO_RETRIES, - ); - const results = await Promise.allSettled( - batch.map(async ({ id: repoId }) => ({ - repoId, - jobId: await client.enqueue( - REPO_INDEX_QUEUE, - { repoId }, - { priority: JOB_PRIORITIES.INTERACTIVE }, - ), - })), - ); - - for (const result of results) { - if (result.status === 'fulfilled') { - jobs.push(result.value); - } else { - failedCount += 1; - } - } - } - - return { jobs, failedCount }; - } catch { - return unexpectedError('Failed to retry repository syncs'); - } - }) - ) -); diff --git a/packages/web/src/features/repos/repositorySyncCounts.server.ts b/packages/web/src/features/repos/repositorySyncCounts.server.ts deleted file mode 100644 index 772ef1c1d..000000000 --- a/packages/web/src/features/repos/repositorySyncCounts.server.ts +++ /dev/null @@ -1,57 +0,0 @@ -import "server-only"; - -import { getBullMQClient } from "@/lib/bullmqClient"; -import { withAuth } from "@/middleware/withAuth"; -import { withMinimumOrgRole } from "@/middleware/withMinimumOrgRole"; -import { OrgRole } from "@sourcebot/db"; -import { REPO_INDEX_QUEUE } from "@sourcebot/shared"; -import { cache } from "react"; - -export interface RepositorySyncCounts { - firstTimeSyncingCount: number; - failedCount: number; - warningCount: number; -} - -export const getRepositorySyncCounts = cache(async () => - withAuth(({ org, prisma, role }) => - withMinimumOrgRole(role, OrgRole.OWNER, async () => { - const failedJobIds = await getBullMQClient().getFailedJobIds( - REPO_INDEX_QUEUE, - ); - - const [ - firstTimeSyncingCount, - failedCount, - warningCount, - ] = await Promise.all([ - prisma.repo.count({ - where: { - orgId: org.id, - indexedAt: null, - firstIndexingJobFinishedAt: null, - }, - }), - prisma.repo.count({ - where: { - orgId: org.id, - latestIndexingJobId: { in: failedJobIds }, - indexedAt: null, - }, - }), - prisma.repo.count({ - where: { - orgId: org.id, - latestIndexingJobId: { in: failedJobIds }, - indexedAt: { not: null }, - }, - }), - ]); - - return { - firstTimeSyncingCount, - failedCount, - warningCount, - }; - }) - )); diff --git a/packages/web/src/features/scim/utils.ts b/packages/web/src/features/scim/utils.ts deleted file mode 100644 index a9c0fc680..000000000 --- a/packages/web/src/features/scim/utils.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { __unsafePrisma } from "@/prisma"; -import { hasEntitlement } from "@/lib/entitlements"; -import { Org } from "@sourcebot/db"; - -export const isScimEnabled = async (org: Org): Promise => { - if (!await hasEntitlement('scim')) { - return false; - } - return org?.isScimEnabled ?? false; -}; diff --git a/packages/web/src/features/search/README.md b/packages/web/src/features/search/README.md deleted file mode 100644 index ff34a2e80..000000000 --- a/packages/web/src/features/search/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# `/search` - -Code search interface for Sourcebot. - -## Overview - -The search feature parses user queries into an intermediate representation (IR), which is then executed against Zoekt's gRPC search backend. Query parsing uses Lezer for syntax analysis. - -## Architecture - -**Query Flow:** -1. User query string → Lezer parser (via `@sourcebot/query-language`) -2. Lezer syntax tree → Query IR (Zoekt gRPC `Q` proto) -3. Query IR → Zoekt backend → Search results - -## Files - -- **`index.ts`** - Public API exports for the search feature, including search functions and type definitions. - -- **`parser.ts`** - Parses query strings into the query IR using the Lezer parser from `@sourcebot/query-language`. - -- **`ir.ts`** - Defines the `QueryIR` type (internally the Zoekt gRPC `Q` proto) and provides utilities for traversing and querying the IR tree structure. - -- **`types.ts`** - TypeScript types and Zod schemas for search requests, responses, file matches, stats, and streaming results. - -- **`searchApi.ts`** - High-level search API that handles authentication, permission filtering, and orchestrates the query parsing and Zoekt backend calls. - -- **`zoektSearcher.ts`** - Low-level interface to the Zoekt gRPC backend. Handles request construction, streaming search, response transformation, and repository metadata resolution. - -- **`fileSourceApi.ts`** - Retrieves full file contents by executing a specialized search query against Zoekt for a specific file path. - diff --git a/packages/web/src/features/search/index.ts b/packages/web/src/features/search/index.ts deleted file mode 100644 index 665e070eb..000000000 --- a/packages/web/src/features/search/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export { search, streamSearch } from './searchApi'; -export { - searchRequestSchema, -} from './types'; -export type { - SourceRange, - SearchSymbol, - RepositoryInfo, - SearchRequest, - SearchResultFile, - SearchStats, - StreamedSearchResponse, - SearchResultChunk, - SearchResponse, -} from './types'; \ No newline at end of file diff --git a/packages/web/src/features/search/ir.ts b/packages/web/src/features/search/ir.ts deleted file mode 100644 index 11c3cb41a..000000000 --- a/packages/web/src/features/search/ir.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { Q as QueryIR } from '@/proto/zoekt/webserver/v1/Q'; -import { RawConfig } from '@/proto/zoekt/webserver/v1/RawConfig'; -import { Regexp } from '@/proto/zoekt/webserver/v1/Regexp'; -import { Symbol } from '@/proto/zoekt/webserver/v1/Symbol'; -import { Language } from '@/proto/zoekt/webserver/v1/Language'; -import { Repo } from '@/proto/zoekt/webserver/v1/Repo'; -import { RepoRegexp } from '@/proto/zoekt/webserver/v1/RepoRegexp'; -import { BranchesRepos } from '@/proto/zoekt/webserver/v1/BranchesRepos'; -import { RepoIds } from '@/proto/zoekt/webserver/v1/RepoIds'; -import { RepoSet } from '@/proto/zoekt/webserver/v1/RepoSet'; -import { FileNameSet } from '@/proto/zoekt/webserver/v1/FileNameSet'; -import { Type } from '@/proto/zoekt/webserver/v1/Type'; -import { Substring } from '@/proto/zoekt/webserver/v1/Substring'; -import { And } from '@/proto/zoekt/webserver/v1/And'; -import { Or } from '@/proto/zoekt/webserver/v1/Or'; -import { Not } from '@/proto/zoekt/webserver/v1/Not'; -import { Branch } from '@/proto/zoekt/webserver/v1/Branch'; -import { Boost } from '@/proto/zoekt/webserver/v1/Boost'; - -export type { - QueryIR, -} - -// Type guards for each query node type -export const isRawConfigQuery = (query: QueryIR): query is QueryIR & { raw_config: RawConfig } => query.raw_config != null; -export const isRegexpQuery = (query: QueryIR): query is QueryIR & { regexp: Regexp } => query.regexp != null; -export const isSymbolQuery = (query: QueryIR): query is QueryIR & { symbol: Symbol } => query.symbol != null; -export const isLanguageQuery = (query: QueryIR): query is QueryIR & { language: Language } => query.language != null; -export const isConstQuery = (query: QueryIR): query is QueryIR & { const: boolean } => query.const != null; -export const isRepoQuery = (query: QueryIR): query is QueryIR & { repo: Repo } => query.repo != null; -export const isRepoRegexpQuery = (query: QueryIR): query is QueryIR & { repo_regexp: RepoRegexp } => query.repo_regexp != null; -export const isBranchesReposQuery = (query: QueryIR): query is QueryIR & { branches_repos: BranchesRepos } => query.branches_repos != null; -export const isRepoIdsQuery = (query: QueryIR): query is QueryIR & { repo_ids: RepoIds } => query.repo_ids != null; -export const isRepoSetQuery = (query: QueryIR): query is QueryIR & { repo_set: RepoSet } => query.repo_set != null; -export const isFileNameSetQuery = (query: QueryIR): query is QueryIR & { file_name_set: FileNameSet } => query.file_name_set != null; -export const isTypeQuery = (query: QueryIR): query is QueryIR & { type: Type } => query.type != null; -export const isSubstringQuery = (query: QueryIR): query is QueryIR & { substring: Substring } => query.substring != null; -export const isAndQuery = (query: QueryIR): query is QueryIR & { and: And } => query.and != null; -export const isOrQuery = (query: QueryIR): query is QueryIR & { or: Or } => query.or != null; -export const isNotQuery = (query: QueryIR): query is QueryIR & { not: Not } => query.not != null; -export const isBranchQuery = (query: QueryIR): query is QueryIR & { branch: Branch } => query.branch != null; -export const isBoostQuery = (query: QueryIR): query is QueryIR & { boost: Boost } => query.boost != null; - -/** - * Visitor pattern for traversing a QueryIR tree. - * Return false from any method to stop traversal early. - */ -export type QueryVisitor = { - onRawConfig?: (query: QueryIR) => boolean | void; - onRegexp?: (query: QueryIR) => boolean | void; - onSymbol?: (query: QueryIR) => boolean | void; - onLanguage?: (query: QueryIR) => boolean | void; - onConst?: (query: QueryIR) => boolean | void; - onRepo?: (query: QueryIR) => boolean | void; - onRepoRegexp?: (query: QueryIR) => boolean | void; - onBranchesRepos?: (query: QueryIR) => boolean | void; - onRepoIds?: (query: QueryIR) => boolean | void; - onRepoSet?: (query: QueryIR) => boolean | void; - onFileNameSet?: (query: QueryIR) => boolean | void; - onType?: (query: QueryIR) => boolean | void; - onSubstring?: (query: QueryIR) => boolean | void; - onAnd?: (query: QueryIR) => boolean | void; - onOr?: (query: QueryIR) => boolean | void; - onNot?: (query: QueryIR) => boolean | void; - onBranch?: (query: QueryIR) => boolean | void; - onBoost?: (query: QueryIR) => boolean | void; -}; - -/** - * Traverses a QueryIR tree using the visitor pattern. - * @param query The query to traverse - * @param visitor An object with optional callback methods for each query type - * @returns false if traversal was stopped early, true otherwise - */ -export function traverseQueryIR( - query: QueryIR, - visitor: QueryVisitor -): boolean { - let shouldContinue: boolean | void = true; - - if (isRawConfigQuery(query)) { - shouldContinue = visitor.onRawConfig?.(query); - - } else if (isRegexpQuery(query)) { - shouldContinue = visitor.onRegexp?.(query); - - } else if (isSymbolQuery(query)) { - shouldContinue = visitor.onSymbol?.(query); - if (shouldContinue !== false && query.symbol.expr) { - shouldContinue = traverseQueryIR(query.symbol.expr, visitor); - } - - } else if (isLanguageQuery(query)) { - shouldContinue = visitor.onLanguage?.(query); - - } else if (isConstQuery(query)) { - shouldContinue = visitor.onConst?.(query); - - } else if (isRepoQuery(query)) { - shouldContinue = visitor.onRepo?.(query); - - } else if (isRepoRegexpQuery(query)) { - shouldContinue = visitor.onRepoRegexp?.(query); - - } else if (isBranchesReposQuery(query)) { - shouldContinue = visitor.onBranchesRepos?.(query); - - } else if (isRepoIdsQuery(query)) { - shouldContinue = visitor.onRepoIds?.(query); - - } else if (isRepoSetQuery(query)) { - shouldContinue = visitor.onRepoSet?.(query); - - } else if (isFileNameSetQuery(query)) { - shouldContinue = visitor.onFileNameSet?.(query); - - } else if (isTypeQuery(query)) { - shouldContinue = visitor.onType?.(query); - - } else if (isSubstringQuery(query)) { - shouldContinue = visitor.onSubstring?.(query); - - } else if (isAndQuery(query)) { - shouldContinue = visitor.onAnd?.(query); - if (shouldContinue !== false && query.and.children) { - for (const child of query.and.children) { - if (!traverseQueryIR(child, visitor)) { - return false; - } - } - } - - } else if (isOrQuery(query)) { - shouldContinue = visitor.onOr?.(query); - if (shouldContinue !== false && query.or.children) { - for (const child of query.or.children) { - if (!traverseQueryIR(child, visitor)) { - return false; - } - } - } - - } else if (isNotQuery(query)) { - shouldContinue = visitor.onNot?.(query); - if (shouldContinue !== false && query.not.child) { - shouldContinue = traverseQueryIR(query.not.child, visitor); - } - - } else if (isBranchQuery(query)) { - shouldContinue = visitor.onBranch?.(query); - - } else if (isBoostQuery(query)) { - shouldContinue = visitor.onBoost?.(query); - if (shouldContinue !== false && query.boost.child) { - shouldContinue = traverseQueryIR(query.boost.child, visitor); - } - } - - return shouldContinue !== false; -} - -/** - * Finds a node in the query tree that matches the predicate. - * @param query The query to search - * @param predicate A function that returns true if the node matches - * @returns The first matching query node, or undefined if none found - */ -export function findInQueryIR( - query: QueryIR, - predicate: (query: QueryIR) => boolean -): QueryIR | undefined { - let found: QueryIR | undefined; - - traverseQueryIR(query, { - onRawConfig: (q) => { if (predicate(q)) { found = q; return false; } }, - onRegexp: (q) => { if (predicate(q)) { found = q; return false; } }, - onSymbol: (q) => { if (predicate(q)) { found = q; return false; } }, - onLanguage: (q) => { if (predicate(q)) { found = q; return false; } }, - onConst: (q) => { if (predicate(q)) { found = q; return false; } }, - onRepo: (q) => { if (predicate(q)) { found = q; return false; } }, - onRepoRegexp: (q) => { if (predicate(q)) { found = q; return false; } }, - onBranchesRepos: (q) => { if (predicate(q)) { found = q; return false; } }, - onRepoIds: (q) => { if (predicate(q)) { found = q; return false; } }, - onRepoSet: (q) => { if (predicate(q)) { found = q; return false; } }, - onFileNameSet: (q) => { if (predicate(q)) { found = q; return false; } }, - onType: (q) => { if (predicate(q)) { found = q; return false; } }, - onSubstring: (q) => { if (predicate(q)) { found = q; return false; } }, - onAnd: (q) => { if (predicate(q)) { found = q; return false; } }, - onOr: (q) => { if (predicate(q)) { found = q; return false; } }, - onNot: (q) => { if (predicate(q)) { found = q; return false; } }, - onBranch: (q) => { if (predicate(q)) { found = q; return false; } }, - onBoost: (q) => { if (predicate(q)) { found = q; return false; } }, - }); - - return found; -} - -/** - * Checks if any node in the query tree matches the predicate. - * @param query The query to search - * @param predicate A function that returns true if the node matches - * @returns true if any node matches, false otherwise - */ -export function someInQueryIR( - query: QueryIR, - predicate: (query: QueryIR) => boolean -): boolean { - return findInQueryIR(query, predicate) !== undefined; -} diff --git a/packages/web/src/features/search/parser.test.ts b/packages/web/src/features/search/parser.test.ts deleted file mode 100644 index 69c4fcb47..000000000 --- a/packages/web/src/features/search/parser.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import type { PrismaClient } from '@sourcebot/db'; -import { parseQuerySyntaxIntoIR } from './parser'; -import { ServiceErrorException } from '@/lib/serviceError'; -import { ErrorCode } from '@/lib/errorCodes'; - -describe('parseQuerySyntaxIntoIR', () => { - it('throws a ServiceErrorException when a search context is not found', async () => { - const prisma = { - searchContext: { - findUnique: async () => null, - }, - } as unknown as PrismaClient; - - const promise = parseQuerySyntaxIntoIR({ - query: 'Helpers context:0', - options: {}, - prisma, - }); - - await expect(promise).rejects.toBeInstanceOf(ServiceErrorException); - await expect(promise).rejects.toMatchObject({ - serviceError: { errorCode: ErrorCode.SEARCH_CONTEXT_NOT_FOUND }, - }); - }); - - it('expands a search context into its repo set when found', async () => { - const prisma = { - searchContext: { - findUnique: async () => ({ - repos: [{ name: 'org/repo-a' }, { name: 'org/repo-b' }], - }), - }, - } as unknown as PrismaClient; - - const ir = await parseQuerySyntaxIntoIR({ - query: 'context:my-context', - options: {}, - prisma, - }); - - expect(JSON.stringify(ir)).toContain('org/repo-a'); - expect(JSON.stringify(ir)).toContain('org/repo-b'); - }); -}); diff --git a/packages/web/src/features/search/parser.ts b/packages/web/src/features/search/parser.ts deleted file mode 100644 index bb3ee5d77..000000000 --- a/packages/web/src/features/search/parser.ts +++ /dev/null @@ -1,448 +0,0 @@ -import { QueryIR } from './ir'; -import { - AndExpr, - ArchivedExpr, - ContentExpr, - ContextExpr, - FileExpr, - ForkExpr, - LangExpr, - NegateExpr, - OrExpr, - ParenExpr, - PrefixExpr, - Program, - RepoExpr, - RepoSetExpr, - RevisionExpr, - SymExpr, - SyntaxNode, - Term, - QuotedTerm, - Tree, - VisibilityExpr, -} from '@sourcebot/query-language'; -import { parser as _parser } from '@sourcebot/query-language'; -import { PrismaClient } from '@sourcebot/db'; -import { SINGLE_TENANT_ORG_ID } from '@/lib/constants'; -import { ServiceErrorException } from '@/lib/serviceError'; -import { StatusCodes } from 'http-status-codes'; -import { ErrorCode } from '@/lib/errorCodes'; -import { languageMetadataMap } from '@/lib/languageMetadata'; - -// Configure the parser to throw errors when encountering invalid syntax. -const parser = _parser.configure({ - strict: true, -}); - -// In regex mode, bare regex parens should stay part of a term while query-like -// parenthesized expressions (e.g. grouped filters) should still parse as groups. -const regexParser = _parser.configure({ - strict: true, - dialect: "regex", -}); - -type ArchivedValue = 'yes' | 'no' | 'only'; -type VisibilityValue = 'public' | 'private' | 'any'; -type ForkValue = 'yes' | 'no' | 'only'; - -const isArchivedValue = (value: string): value is ArchivedValue => { - return value === 'yes' || value === 'no' || value === 'only'; -} - -const isVisibilityValue = (value: string): value is VisibilityValue => { - return value === 'public' || value === 'private' || value === 'any'; -} - -const isForkValue = (value: string): value is ForkValue => { - return value === 'yes' || value === 'no' || value === 'only'; -} - -// Build a map for case-insensitive language lookup -const languageKeyLowerCaseMap: Map = new Map( - Object.keys(languageMetadataMap).map(key => [key.toLowerCase(), key]) -); - -/** - * Finds the correct linguist language name from a case-insensitive input. - * Returns the correctly-cased language name if found, otherwise returns the original input. - */ -const findLinguistLanguage = (value: string): string => { - return languageKeyLowerCaseMap.get(value.toLowerCase()) ?? value; -} - -/** - * Given a query string, parses it into the query intermediate representation. - */ -export const parseQuerySyntaxIntoIR = async ({ - query, - options, - prisma, -}: { - query: string, - options: { - isCaseSensitivityEnabled?: boolean; - isRegexEnabled?: boolean; - }, - prisma: PrismaClient, -}): Promise => { - - try { - // First parse the query into a Lezer tree. - // In regex mode, use the regex dialect so bare regex parens stay inside - // a term while query-like parenthesized groups still tokenize correctly. - const activeParser = (options.isRegexEnabled ?? false) ? regexParser : parser; - const tree = activeParser.parse(query); - - // Then transform the tree into the intermediate representation. - return transformTreeToIR({ - tree, - input: query, - isCaseSensitivityEnabled: options.isCaseSensitivityEnabled ?? false, - isRegexEnabled: options.isRegexEnabled ?? false, - onExpandSearchContext: async (contextName: string) => { - const context = await prisma.searchContext.findUnique({ - where: { - name_orgId: { - name: contextName, - orgId: SINGLE_TENANT_ORG_ID, - } - }, - include: { - repos: true, - } - }); - - if (!context) { - throw new ServiceErrorException({ - statusCode: StatusCodes.NOT_FOUND, - errorCode: ErrorCode.SEARCH_CONTEXT_NOT_FOUND, - message: `Search context "${contextName}" not found`, - }); - } - - return context.repos.map((repo) => repo.name); - }, - }); - } catch (error) { - if (error instanceof SyntaxError) { - throw new ServiceErrorException({ - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.FAILED_TO_PARSE_QUERY, - message: `Failed to parse query "${query}" with message: ${error.message}`, - }); - } - throw error; - } -} - -/** - * Given a Lezer tree, transforms it into the query intermediate representation. - */ -const transformTreeToIR = async ({ - tree, - input, - isCaseSensitivityEnabled, - isRegexEnabled, - onExpandSearchContext, -}: { - tree: Tree; - input: string; - isCaseSensitivityEnabled: boolean; - isRegexEnabled: boolean; - onExpandSearchContext: (contextName: string) => Promise; -}): Promise => { - const transformNode = async (node: SyntaxNode): Promise => { - switch (node.type.id) { - case Program: { - // Program wraps the actual query - transform its child - const child = node.firstChild; - if (!child) { - // Empty query - match nothing - return { const: false, query: "const" }; - } - return transformNode(child); - } - case AndExpr: - return { - and: { - children: await Promise.all(getChildren(node).map(c => transformNode(c))) - }, - query: "and" - } - - case OrExpr: - return { - or: { - children: await Promise.all(getChildren(node).map(c => transformNode(c))) - }, - query: "or" - }; - - case NegateExpr: { - // Find the child after the negate token - const negateChild = node.getChild("PrefixExpr") || node.getChild("ParenExpr"); - if (!negateChild) { - throw new Error("NegateExpr missing child"); - } - return { - not: { - child: await transformNode(negateChild) - }, - query: "not" - }; - } - case ParenExpr: { - // Parentheses just group - transform the inner query - const innerQuery = node.getChild("query") || node.firstChild; - if (!innerQuery) { - return { const: false, query: "const" }; - } - return transformNode(innerQuery); - } - case PrefixExpr: - // PrefixExpr contains specific prefix types - return transformPrefixExpr(node); - - case QuotedTerm: - case Term: { - const fullText = input.substring(node.from, node.to); - // If the term is quoted, then we remove the quotes as they are - // not interpreted. - const termText = node.type.id === QuotedTerm ? fullText.replace(/^"|"$/g, '') : fullText; - - return isRegexEnabled ? { - regexp: { - regexp: termText, - case_sensitive: isCaseSensitivityEnabled, - file_name: false, - content: true - }, - query: "regexp" - } : { - substring: { - pattern: termText, - case_sensitive: isCaseSensitivityEnabled, - file_name: false, - content: true - }, - query: "substring" - }; - } - default: - console.warn(`Unhandled node type: ${node.type.name} (id: ${node.type.id})`); - return { const: true, query: "const" }; - } - } - - const transformPrefixExpr = async (node: SyntaxNode): Promise => { - // Find which specific prefix type this is - const prefixNode = node.firstChild; - if (!prefixNode) { - throw new Error("PrefixExpr has no child"); - } - - const prefixTypeId = prefixNode.type.id; - - // Extract the full text (e.g., "file:test.js") and split on the colon - const fullText = input.substring(prefixNode.from, prefixNode.to); - const colonIndex = fullText.indexOf(':'); - if (colonIndex === -1) { - throw new Error(`${prefixNode.type.name} missing colon`); - } - - // Get the value part after the colon and remove quotes if present - const value = fullText.substring(colonIndex + 1).replace(/^"|"$/g, ''); - - switch (prefixTypeId) { - case FileExpr: - return { - regexp: { - regexp: value, - case_sensitive: isCaseSensitivityEnabled, - file_name: true, - content: false - }, - query: "regexp" - }; - - case RepoExpr: - return { - repo: { - regexp: value - }, - query: "repo" - }; - - case RevisionExpr: - return { - branch: { - // Special case - "*" means search all branches. Passing in a - // blank string will match all branches. - pattern: value === '*' ? "" : value, - exact: false - }, - query: "branch" - }; - - case ContentExpr: - return isRegexEnabled ? { - regexp: { - regexp: value, - case_sensitive: isCaseSensitivityEnabled, - file_name: false, - content: true - }, - query: "regexp" - } : { - substring: { - pattern: value, - case_sensitive: isCaseSensitivityEnabled, - file_name: false, - content: true - }, - query: "substring" - }; - - - case LangExpr: { - return { - language: { - language: findLinguistLanguage(value) - }, - query: "language" - }; - } - - case SymExpr: - // Symbol search wraps a pattern - return { - symbol: { - expr: { - regexp: { - regexp: value, - case_sensitive: isCaseSensitivityEnabled, - file_name: false, - content: true - }, - query: "regexp" - } - }, - query: "symbol" - }; - - case VisibilityExpr: { - const rawValue = value.toLowerCase(); - - if (!isVisibilityValue(rawValue)) { - throw new Error(`Invalid visibility value: ${rawValue}. Expected 'public', 'private', or 'any'`); - } - - const flags: ('FLAG_ONLY_PUBLIC' | 'FLAG_ONLY_PRIVATE')[] = []; - - if (rawValue === 'any') { - // 'any' means no filter - } else if (rawValue === 'public') { - flags.push('FLAG_ONLY_PUBLIC'); - } else if (rawValue === 'private') { - flags.push('FLAG_ONLY_PRIVATE'); - } - - return { - raw_config: { - flags - }, - query: "raw_config" - }; - } - - case ArchivedExpr: { - const rawValue = value.toLowerCase(); - - if (!isArchivedValue(rawValue)) { - throw new Error(`Invalid archived value: ${rawValue}. Expected 'yes', 'no', or 'only'`); - } - - const flags: ('FLAG_ONLY_ARCHIVED' | 'FLAG_NO_ARCHIVED')[] = []; - - if (rawValue === 'yes') { - // 'yes' means include archived repositories (default) - } else if (rawValue === 'no') { - flags.push('FLAG_NO_ARCHIVED'); - } else if (rawValue === 'only') { - flags.push('FLAG_ONLY_ARCHIVED'); - } - - return { - raw_config: { - flags - }, - query: "raw_config" - }; - } - case ForkExpr: { - const rawValue = value.toLowerCase(); - - if (!isForkValue(rawValue)) { - throw new Error(`Invalid fork value: ${rawValue}. Expected 'yes', 'no', or 'only'`); - } - - const flags: ('FLAG_ONLY_FORKS' | 'FLAG_NO_FORKS')[] = []; - - if (rawValue === 'yes') { - // 'yes' means include forks (default) - } else if (rawValue === 'no') { - flags.push('FLAG_NO_FORKS'); - } else if (rawValue === 'only') { - flags.push('FLAG_ONLY_FORKS'); - } - - return { - raw_config: { - flags - }, - query: "raw_config" - }; - } - - case ContextExpr: { - const repoNames = await onExpandSearchContext(value); - return { - repo_set: { - set: repoNames.reduce((acc, s) => { - acc[s.trim()] = true; - return acc; - }, {} as Record) - }, - query: "repo_set" - }; - } - - case RepoSetExpr: { - return { - repo_set: { - set: value.split(',').reduce((acc, s) => { - acc[s.trim()] = true; - return acc; - }, {} as Record) - }, - query: "repo_set" - }; - } - default: - throw new Error(`Unknown prefix type: ${prefixNode.type.name} (id: ${prefixTypeId})`); - } - } - - return transformNode(tree.topNode); -} - -const getChildren = (node: SyntaxNode): SyntaxNode[] => { - const children: SyntaxNode[] = []; - let child = node.firstChild; - while (child) { - children.push(child); - child = child.nextSibling; - } - return children; -} diff --git a/packages/web/src/features/search/searchApi.test.ts b/packages/web/src/features/search/searchApi.test.ts deleted file mode 100644 index 08397e58b..000000000 --- a/packages/web/src/features/search/searchApi.test.ts +++ /dev/null @@ -1,171 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - authContext: undefined as unknown, - createAudit: vi.fn(), - createZoektSearchRequest: vi.fn(), - env: {} as Record, - hasEntitlement: vi.fn(), - zoektSearch: vi.fn(), - zoektStreamSearch: vi.fn(), -})); - -vi.mock('@/middleware/sew', () => ({ - sew: (callback: () => unknown) => callback(), -})); - -vi.mock('@/middleware/withAuth', () => ({ - withOptionalAuth: vi.fn((callback: (context: unknown) => unknown) => callback(mocks.authContext)), -})); - -vi.mock('@/ee/features/audit/audit', () => ({ - createAudit: mocks.createAudit, -})); - -vi.mock('@/lib/entitlements', () => ({ - hasEntitlement: mocks.hasEntitlement, -})); - -vi.mock('@sourcebot/shared', () => ({ - env: mocks.env, -})); - -vi.mock('next/headers', () => ({ - headers: vi.fn(async () => new Headers()), -})); - -vi.mock('./parser', () => ({ - parseQuerySyntaxIntoIR: vi.fn(), -})); - -vi.mock('./zoektSearcher', () => ({ - createZoektSearchRequest: mocks.createZoektSearchRequest, - zoektSearch: mocks.zoektSearch, - zoektStreamSearch: mocks.zoektStreamSearch, -})); - -const { search, streamSearch } = await import('./searchApi'); - -const query = {} as never; -const request = { - queryType: 'ir' as const, - query, - options: { matches: 10 }, -}; - -function createPrismaMock(repositoryNames: string[]) { - return { - repo: { - findMany: vi.fn().mockResolvedValue( - repositoryNames.map((name) => ({ name })), - ), - }, - }; -} - -beforeEach(() => { - vi.clearAllMocks(); - Object.keys(mocks.env).forEach((key) => delete mocks.env[key]); - mocks.createAudit.mockResolvedValue(undefined); - mocks.createZoektSearchRequest.mockImplementation(async (input) => input); - mocks.zoektSearch.mockResolvedValue({ files: [] }); - mocks.zoektStreamSearch.mockResolvedValue('stream-result'); - mocks.hasEntitlement.mockResolvedValue(false); -}); - -describe('scoped access token search filtering', () => { - test('passes the scoped Prisma repository names to blocking search when permission syncing is disabled', async () => { - const prisma = createPrismaMock(['github.com/acme/a', 'github.com/acme/b']); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - principal: { - source: 'scoped_access_token', - credentialId: 'token-id', - orgId: 1, - repositoryIds: [11, 22], - expiresAt: new Date('2026-08-06T05:00:00.000Z'), - }, - prisma, - }; - - await search(request); - - expect(prisma.repo.findMany).toHaveBeenCalledWith({ - select: { name: true }, - }); - expect(mocks.createZoektSearchRequest).toHaveBeenCalledWith(expect.objectContaining({ - repoSearchScope: { - kind: 'repos', - repos: ['github.com/acme/a', 'github.com/acme/b'], - }, - })); - expect(mocks.hasEntitlement).not.toHaveBeenCalled(); - }); - - test('passes an empty repository scope to streaming search instead of treating it as unrestricted', async () => { - const prisma = createPrismaMock([]); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - principal: { - source: 'scoped_access_token', - credentialId: 'token-id', - orgId: 1, - repositoryIds: [], - expiresAt: new Date('2026-08-06T05:00:00.000Z'), - }, - prisma, - }; - - await streamSearch(request); - - expect(mocks.createZoektSearchRequest).toHaveBeenCalledWith(expect.objectContaining({ - repoSearchScope: { - kind: 'repos', - repos: [], - }, - })); - }); - - test('preserves unrestricted search for API keys when permission syncing is disabled', async () => { - const prisma = createPrismaMock(['github.com/acme/a']); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - principal: { source: 'api_key' }, - prisma, - }; - - await search(request); - - expect(prisma.repo.findMany).not.toHaveBeenCalled(); - expect(mocks.createZoektSearchRequest).toHaveBeenCalledWith(expect.objectContaining({ - repoSearchScope: { kind: 'all' }, - })); - }); - - test('passes the scoped Prisma repository names for API keys when permission syncing is enabled', async () => { - const prisma = createPrismaMock(['github.com/acme/a']); - mocks.env.PERMISSION_SYNC_ENABLED = 'true'; - mocks.hasEntitlement.mockResolvedValue(true); - mocks.authContext = { - org: { id: 1 }, - user: { id: 'user-id' }, - principal: { source: 'api_key' }, - prisma, - }; - - await search(request); - - expect(prisma.repo.findMany).toHaveBeenCalledWith({ - select: { name: true }, - }); - expect(mocks.createZoektSearchRequest).toHaveBeenCalledWith(expect.objectContaining({ - repoSearchScope: { - kind: 'repos', - repos: ['github.com/acme/a'], - }, - })); - }); -}); diff --git a/packages/web/src/features/search/searchApi.ts b/packages/web/src/features/search/searchApi.ts deleted file mode 100644 index 741b6d701..000000000 --- a/packages/web/src/features/search/searchApi.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { sew } from "@/middleware/sew"; -import { createAudit } from "@/ee/features/audit/audit"; -import { withOptionalAuth, type AuthPrincipal } from "@/middleware/withAuth"; -import { PrismaClient } from "@sourcebot/db"; -import { env } from "@sourcebot/shared"; -import { hasEntitlement } from "@/lib/entitlements"; -import { headers } from "next/headers"; -import { QueryIR } from './ir'; -import { parseQuerySyntaxIntoIR } from './parser'; -import { SearchOptions } from "./types"; -import { createZoektSearchRequest, type RepoSearchScope, zoektSearch, zoektStreamSearch } from './zoektSearcher'; - - -type QueryStringSearchRequest = { - queryType: 'string'; - query: string; - options: SearchOptions; - source?: string; -} - -type QueryIRSearchRequest = { - queryType: 'ir'; - query: QueryIR; - // Omit options that are specific to query syntax parsing. - options: Omit; - source?: string; -} - -type SearchRequest = QueryStringSearchRequest | QueryIRSearchRequest; - -export const search = (request: SearchRequest) => sew(() => - withOptionalAuth(async ({ prisma, user, org, principal }) => { - if (user) { - const source = request.source ?? (await headers()).get('X-Sourcebot-Client-Source') ?? undefined; - await createAudit({ - action: 'user.performed_code_search', - actor: { id: user.id, type: 'user' }, - target: { id: org.id.toString(), type: 'org' }, - orgId: org.id, - metadata: { source }, - }); - } - - const repoSearchScope = await getRepoSearchScope({ prisma, principal }); - - // If needed, parse the query syntax into the query intermediate representation. - const query = request.queryType === 'string' ? await parseQuerySyntaxIntoIR({ - query: request.query, - options: request.options, - prisma, - }) : request.query; - - const zoektSearchRequest = await createZoektSearchRequest({ - query, - options: request.options, - repoSearchScope, - }); - - return zoektSearch(zoektSearchRequest, prisma); - })); - -export const streamSearch = (request: SearchRequest) => sew(() => - withOptionalAuth(async ({ prisma, user, org, principal }) => { - if (user) { - const source = request.source ?? (await headers()).get('X-Sourcebot-Client-Source') ?? undefined; - await createAudit({ - action: 'user.performed_code_search', - actor: { id: user.id, type: 'user' }, - target: { id: org.id.toString(), type: 'org' }, - orgId: org.id, - metadata: { source }, - }); - } - - const repoSearchScope = await getRepoSearchScope({ prisma, principal }); - - // If needed, parse the query syntax into the query intermediate representation. - const query = request.queryType === 'string' ? await parseQuerySyntaxIntoIR({ - query: request.query, - options: request.options, - prisma, - }) : request.query; - - const zoektSearchRequest = await createZoektSearchRequest({ - query, - options: request.options, - repoSearchScope, - }); - - return zoektStreamSearch(zoektSearchRequest, prisma); - })); - -/** - * Returns whether search can include all repositories or must be constrained to - * the repositories exposed by the scoped Prisma client. - */ -const getRepoSearchScope = async ({ - prisma, - principal, -}: { - prisma: PrismaClient; - principal?: AuthPrincipal; -}): Promise => { - if ( - principal?.source !== 'scoped_access_token' && - ( - env.PERMISSION_SYNC_ENABLED !== 'true' || - !await hasEntitlement('permission-syncing') - ) - ) { - return { kind: 'all' }; - } - - const accessibleRepos = await prisma.repo.findMany({ - select: { - name: true, - } - }); - return { - kind: 'repos', - repos: accessibleRepos.map(repo => repo.name), - }; -} diff --git a/packages/web/src/features/search/types.ts b/packages/web/src/features/search/types.ts deleted file mode 100644 index e053c8e20..000000000 --- a/packages/web/src/features/search/types.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { CodeHostType } from "@sourcebot/db"; -import { z } from "zod"; -import { serviceErrorSchema } from "@/lib/serviceError"; - -export const locationSchema = z.object({ - byteOffset: z.number(), // 0-based byte offset from the beginning of the file - lineNumber: z.number(), // 1-based line number from the beginning of the file - column: z.number(), // 1-based column number (in runes) from the beginning of line -}); -export type SourceLocation = z.infer; - -export const rangeSchema = z.object({ - start: locationSchema, - end: locationSchema, -}); -export type SourceRange = z.infer; - -export const symbolSchema = z.object({ - symbol: z.string(), - kind: z.string(), -}); -export type SearchSymbol = z.infer; - -export const repositoryInfoSchema = z.object({ - id: z.number(), - codeHostType: z.nativeEnum(CodeHostType), - name: z.string(), - displayName: z.string().optional(), - webUrl: z.string().optional(), -}); -export type RepositoryInfo = z.infer; - -// @note: Many of these fields are defined in zoekt/api.go. -export const searchStatsSchema = z.object({ - actualMatchCount: z.number(), // The actual number of matches returned by the search. This will always be less than or equal to `totalMatchCount`. - totalMatchCount: z.number(), // The total number of matches found during the search. - duration: z.number(), // The duration (in nanoseconds) of the search. - fileCount: z.number(), // Number of files containing a match. - filesSkipped: z.number(), // Candidate files whose contents weren't examined because we gathered enough matches. - contentBytesLoaded: z.number(), // Amount of I/O for reading contents. - indexBytesLoaded: z.number(), // Amount of I/O for reading from index. - crashes: z.number(), // Number of search shards that had a crash. - shardFilesConsidered: z.number(), // Number of files in shards that we considered. - filesConsidered: z.number(), // Files that we evaluated. Equivalent to files for which all atom matches (including negations) evaluated to true. - filesLoaded: z.number(), // Files for which we loaded file content to verify substring matches - shardsScanned: z.number(), // Shards that we scanned to find matches. - shardsSkipped: z.number(), // Shards that we did not process because a query was canceled. - shardsSkippedFilter: z.number(), // Shards that we did not process because the query was rejected by the ngram filter indicating it had no matches. - ngramMatches: z.number(), // Number of candidate matches as a result of searching ngrams. - ngramLookups: z.number(), // NgramLookups is the number of times we accessed an ngram in the index. - wait: z.number(), // Wall clock time for queued search. - matchTreeConstruction: z.number(), // Aggregate wall clock time spent constructing and pruning the match tree. This accounts for time such as lookups in the trigram index. - matchTreeSearch: z.number(), // Aggregate wall clock time spent searching the match tree. This accounts for the bulk of search work done looking for matches. - regexpsConsidered: z.number(), // Number of times regexp was called on files that we evaluated. - flushReason: z.string(), // FlushReason explains why results were flushed. -}); -export type SearchStats = z.infer; - -export const searchFileSchema = z.object({ - fileName: z.object({ - // The name of the file - text: z.string(), - // Any matching ranges - matchRanges: z.array(rangeSchema), - }), - webUrl: z.string(), - externalWebUrl: z.string().optional(), - repository: z.string(), - repositoryId: z.number(), - language: z.string(), - chunks: z.array(z.object({ - content: z.string(), - matchRanges: z.array(rangeSchema), - contentStart: locationSchema, - symbols: z.array(z.object({ - ...symbolSchema.shape, - parent: symbolSchema.optional(), - })).optional(), - })), - branches: z.array(z.string()).optional(), - // Set if `whole` is true. - content: z.string().optional(), -}); -export type SearchResultFile = z.infer; -export type SearchResultChunk = SearchResultFile["chunks"][number]; - -export const searchOptionsSchema = z.object({ - matches: z.number(), // The number of matches to return. - contextLines: z.number().optional(), // The number of context lines to return. - whole: z.boolean().optional(), // Whether to return the whole file as part of the response. - isRegexEnabled: z.boolean().optional(), // Whether to enable regular expression search. - isCaseSensitivityEnabled: z.boolean().optional(), // Whether to enable case sensitivity. -}); -export type SearchOptions = z.infer; - -export const searchRequestSchema = z.object({ - query: z.string(), // The zoekt query to execute. - ...searchOptionsSchema.shape, -}); -export type SearchRequest = z.infer; - -export const searchResponseSchema = z.object({ - stats: searchStatsSchema, - files: z.array(searchFileSchema), - repositoryInfo: z.array(repositoryInfoSchema), - isSearchExhaustive: z.boolean(), -}); -export type SearchResponse = z.infer; - -/** - * Sent after each chunk of results is processed. - */ -export const streamedSearchChunkResponseSchema = z.object({ - type: z.literal('chunk'), - stats: searchStatsSchema, - files: z.array(searchFileSchema), - repositoryInfo: z.array(repositoryInfoSchema), -}); -export type StreamedSearchChunkResponse = z.infer; - -/** - * Sent after the search is complete. - */ -export const streamedSearchFinalResponseSchema = z.object({ - type: z.literal('final'), - accumulatedStats: searchStatsSchema, - isSearchExhaustive: z.boolean(), -}); -export type StreamedSearchFinalResponse = z.infer; - -/** - * Sent when an error occurs during streaming. - */ -export const streamedSearchErrorResponseSchema = z.object({ - type: z.literal('error'), - error: serviceErrorSchema, -}); -export type StreamedSearchErrorResponse = z.infer; - -export const streamedSearchResponseSchema = z.discriminatedUnion('type', [ - streamedSearchChunkResponseSchema, - streamedSearchFinalResponseSchema, - streamedSearchErrorResponseSchema, -]); -export type StreamedSearchResponse = z.infer; - diff --git a/packages/web/src/features/search/zoektSearcher.test.ts b/packages/web/src/features/search/zoektSearcher.test.ts deleted file mode 100644 index 0bdb72818..000000000 --- a/packages/web/src/features/search/zoektSearcher.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -import type { PrismaClient } from '@sourcebot/db'; -import type { SearchRequest as ZoektGrpcSearchRequest } from '@/proto/zoekt/webserver/v1/SearchRequest'; -import { beforeEach, describe, expect, test, vi } from 'vitest'; - -const mocks = vi.hoisted(() => { - const close = vi.fn(); - const search = vi.fn(); - - class WebserverService { - Search = search; - close = close; - } - - return { - close, - loadSync: vi.fn(() => ({})), - search, - WebserverService, - }; -}); - -vi.mock('@grpc/proto-loader', () => ({ - loadSync: mocks.loadSync, -})); - -vi.mock('@grpc/grpc-js', async (importOriginal) => { - const actual = await importOriginal(); - return { - ...actual, - loadPackageDefinition: vi.fn(() => ({ - zoekt: { - webserver: { - v1: { - WebserverService: mocks.WebserverService, - }, - }, - }, - })), - }; -}); - -vi.mock('@sentry/nextjs', () => ({ - captureException: vi.fn(), - captureMessage: vi.fn(), -})); - -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => ({ - debug: vi.fn(), - error: vi.fn(), - warn: vi.fn(), - }), - env: { - AUTH_URL: 'http://sourcebot.test', - ZOEKT_WEBSERVER_URL: 'http://zoekt:6070', - }, -})); - -vi.mock('@/lib/posthog', () => ({ - captureEvent: vi.fn(), -})); - -import { zoektSearch } from './zoektSearcher'; - -const searchRequest = {} as ZoektGrpcSearchRequest; - -describe('zoektSearch', () => { - beforeEach(() => { - vi.clearAllMocks(); - }); - - test('closes its gRPC client after a successful unary search', async () => { - mocks.search.mockImplementation((_request, _metadata, callback) => { - callback(null, { files: [] }); - }); - - const response = await zoektSearch(searchRequest, {} as PrismaClient); - - expect(response.files).toEqual([]); - expect(mocks.close).toHaveBeenCalledOnce(); - }); - - test('closes its gRPC client when the unary search fails', async () => { - mocks.search.mockImplementation((_request, _metadata, callback) => { - callback({ details: 'zoekt unavailable' }); - }); - - await expect(zoektSearch(searchRequest, {} as PrismaClient)).rejects.toThrow(); - expect(mocks.close).toHaveBeenCalledOnce(); - }); - - test('closes its gRPC client when response transformation fails', async () => { - mocks.search.mockImplementation((_request, _metadata, callback) => { - callback(null, { - files: [{ repository_id: 1 }], - }); - }); - const prisma = { - repo: { - findUnique: vi.fn().mockRejectedValue(new Error('database unavailable')), - }, - } as unknown as PrismaClient; - - await expect(zoektSearch(searchRequest, prisma)).rejects.toThrow('database unavailable'); - expect(mocks.close).toHaveBeenCalledOnce(); - }); -}); diff --git a/packages/web/src/features/search/zoektSearcher.ts b/packages/web/src/features/search/zoektSearcher.ts deleted file mode 100644 index 087e44043..000000000 --- a/packages/web/src/features/search/zoektSearcher.ts +++ /dev/null @@ -1,602 +0,0 @@ -import { getCodeHostBrowseFileAtBranchUrl } from "@/lib/utils"; -import { ServiceErrorException, unexpectedError } from "@/lib/serviceError"; -import type { ProtoGrpcType } from '@/proto/webserver'; -import { FileMatch__Output as ZoektGrpcFileMatch } from "@/proto/zoekt/webserver/v1/FileMatch"; -import { FlushReason as ZoektGrpcFlushReason } from "@/proto/zoekt/webserver/v1/FlushReason"; -import { Range__Output as ZoektGrpcRange } from "@/proto/zoekt/webserver/v1/Range"; -import type { SearchRequest as ZoektGrpcSearchRequest } from '@/proto/zoekt/webserver/v1/SearchRequest'; -import { SearchResponse__Output as ZoektGrpcSearchResponse } from "@/proto/zoekt/webserver/v1/SearchResponse"; -import { StreamSearchRequest as ZoektGrpcStreamSearchRequest } from "@/proto/zoekt/webserver/v1/StreamSearchRequest"; -import { StreamSearchResponse__Output as ZoektGrpcStreamSearchResponse } from "@/proto/zoekt/webserver/v1/StreamSearchResponse"; -import { WebserverServiceClient } from '@/proto/zoekt/webserver/v1/WebserverService'; -import * as grpc from '@grpc/grpc-js'; -import * as protoLoader from '@grpc/proto-loader'; -import * as Sentry from '@sentry/nextjs'; -import { PrismaClient, Repo } from "@sourcebot/db"; -import { createLogger, env } from "@sourcebot/shared"; -import path from 'path'; -import { isBranchQuery, QueryIR, someInQueryIR } from './ir'; -import { RepositoryInfo, SearchResponse, SearchResultFile, SearchStats, SourceRange, StreamedSearchErrorResponse, StreamedSearchResponse } from "./types"; -import { captureEvent } from "@/lib/posthog"; -import { getBrowsePath } from "@/app/(app)/browse/hooks/utils"; - -const logger = createLogger("zoekt-searcher"); - -export type RepoSearchScope = - | { kind: 'all' } - | { kind: 'repos'; repos: string[] }; - -/** - * Creates a ZoektGrpcSearchRequest given a query IR. - */ -export const createZoektSearchRequest = async ({ - query, - options, - repoSearchScope, -}: { - query: QueryIR; - options: { - matches: number, - contextLines?: number, - whole?: boolean, - }; - repoSearchScope: RepoSearchScope; -}) => { - // Find if there are any `rev:` filters in the query. - const containsRevExpression = someInQueryIR(query, (q) => isBranchQuery(q)); - - const zoektSearchRequest: ZoektGrpcSearchRequest = { - query: { - and: { - children: [ - query, - // If the query does not contain a `rev:` filter, we default to searching `HEAD`. - ...(!containsRevExpression ? [{ - branch: { - pattern: 'HEAD', - exact: true, - } - }] : []), - ...(repoSearchScope.kind === 'repos' ? [{ - repo_set: { - set: repoSearchScope.repos.reduce((acc, repo) => { - acc[repo] = true; - return acc; - }, {} as Record) - } - }] : []), - ] - } - }, - opts: { - chunk_matches: true, - // @note: Zoekt has several different ways to limit a given search. The two that - // we care about are `MaxMatchDisplayCount` and `TotalMaxMatchCount`: - // - `MaxMatchDisplayCount` truncates the number of matches AFTER performing - // a search (specifically, after collating and sorting the results). The number of - // results returned by the API will be less than or equal to this value. - // - // - `TotalMaxMatchCount` truncates the number of matches DURING a search. The results - // returned by the API the API can be less than, equal to, or greater than this value. - // Why greater? Because this value is compared _after_ a given shard has finished - // being processed, the number of matches returned by the last shard may have exceeded - // this value. - // - // Let's define two variables: - // - `actualMatchCount` : The number of matches that are returned by the API. This is - // always less than or equal to `MaxMatchDisplayCount`. - // - `totalMatchCount` : The number of matches that zoekt found before it either - // 1) found all matches or 2) hit the `TotalMaxMatchCount` limit. This number is - // not bounded and can be less than, equal to, or greater than both `TotalMaxMatchCount` - // and `MaxMatchDisplayCount`. - // - // - // Our challenge is to determine whether or not the search returned all possible matches/ - // (it was exaustive) or if it was truncated. By setting the `TotalMaxMatchCount` to - // `MaxMatchDisplayCount + 1`, we can determine which of these occurred by comparing - // `totalMatchCount` to `MaxMatchDisplayCount`. - // - // if (totalMatchCount ≤ actualMatchCount): - // Search is EXHAUSTIVE (found all possible matches) - // Proof: totalMatchCount ≤ MaxMatchDisplayCount < TotalMaxMatchCount - // Therefore Zoekt stopped naturally, not due to limit - // - // if (totalMatchCount > actualMatchCount): - // Search is TRUNCATED (more matches exist) - // Proof: totalMatchCount > MaxMatchDisplayCount + 1 = TotalMaxMatchCount - // Therefore Zoekt hit the limit and stopped searching - // - max_match_display_count: options.matches, - total_max_match_count: options.matches + 1, - num_context_lines: options.contextLines ?? 0, - whole: !!options.whole, - shard_max_match_count: -1, - max_wall_time: { - seconds: 0, - } - }, - }; - - return zoektSearchRequest; -} - -export const zoektSearch = async (searchRequest: ZoektGrpcSearchRequest, prisma: PrismaClient): Promise => { - const client = createGrpcClient(); - const metadata = new grpc.Metadata(); - - try { - const response = await new Promise((resolve, reject) => { - client.Search(searchRequest, metadata, (error, response) => { - if (error || !response) { - reject(new ServiceErrorException(unexpectedError(error?.details || 'No response received'))) - return; - } - - resolve(response); - }); - }); - - const reposMapCache = await createReposMapForChunk(response, new Map(), prisma); - const { stats, files, repositoryInfo } = await transformZoektSearchResponse(response, reposMapCache); - - return { - stats, - files, - repositoryInfo, - isSearchExhaustive: stats.totalMatchCount <= stats.actualMatchCount, - } satisfies SearchResponse; - } finally { - // grpc-js keeps each channel in its process-wide channelz registry until - // the owning client is explicitly closed. - client.close(); - } -} - -export const zoektStreamSearch = async (searchRequest: ZoektGrpcSearchRequest, prisma: PrismaClient): Promise => { - const client = createGrpcClient(); - let grpcStream: ReturnType | null = null; - let isStreamActive = true; - let pendingChunks = 0; - let accumulatedStats: SearchStats = { - actualMatchCount: 0, - totalMatchCount: 0, - duration: 0, - fileCount: 0, - filesSkipped: 0, - contentBytesLoaded: 0, - indexBytesLoaded: 0, - crashes: 0, - shardFilesConsidered: 0, - filesConsidered: 0, - filesLoaded: 0, - shardsScanned: 0, - shardsSkipped: 0, - shardsSkippedFilter: 0, - ngramMatches: 0, - ngramLookups: 0, - wait: 0, - matchTreeConstruction: 0, - matchTreeSearch: 0, - regexpsConsidered: 0, - flushReason: ZoektGrpcFlushReason.FLUSH_REASON_UNKNOWN_UNSPECIFIED, - }; - - return new ReadableStream({ - async start(controller) { - const tryCloseController = () => { - if (!isStreamActive && pendingChunks === 0) { - const finalResponse: StreamedSearchResponse = { - type: 'final', - accumulatedStats, - isSearchExhaustive: accumulatedStats.totalMatchCount <= accumulatedStats.actualMatchCount, - } - - controller.enqueue(encodeSSEREsponseChunk(finalResponse)); - controller.enqueue(encodeSSEREsponseChunk('[DONE]')); - controller.close(); - client.close(); - logger.debug('SSE stream closed'); - } - }; - - try { - const metadata = new grpc.Metadata(); - - const streamRequest: ZoektGrpcStreamSearchRequest = { - request: searchRequest, - }; - - grpcStream = client.StreamSearch(streamRequest, metadata); - - // `_reposMapCache` is used to cache repository metadata across all chunks. - // This reduces the number of database queries required to transform file matches. - const _reposMapCache = new Map(); - - // Handle incoming data chunks - grpcStream.on('data', async (chunk: ZoektGrpcStreamSearchResponse) => { - if (!isStreamActive) { - logger.debug('SSE stream closed, skipping chunk'); - return; - } - - // Track that we're processing a chunk - pendingChunks++; - - // grpcStream.on doesn't actually await on our handler, so we need to - // explicitly pause the stream here to prevent the stream from completing - // prior to our asynchronous work being completed. - grpcStream?.pause(); - - try { - if (!chunk.response_chunk) { - logger.warn('No response chunk received'); - return; - } - - const reposMapCache = await createReposMapForChunk(chunk.response_chunk, _reposMapCache, prisma); - const { stats, files, repositoryInfo } = await transformZoektSearchResponse(chunk.response_chunk, reposMapCache); - - accumulatedStats = accumulateStats(accumulatedStats, stats); - - const response: StreamedSearchResponse = { - type: 'chunk', - files, - repositoryInfo, - stats - } - - controller.enqueue(encodeSSEREsponseChunk(response)); - } catch (error) { - logger.error('Error processing chunk:', error); - Sentry.captureException(error); - isStreamActive = false; - - const errorMessage = error instanceof Error ? error.message : 'Unknown error processing chunk'; - const errorResponse: StreamedSearchErrorResponse = { - type: 'error', - error: unexpectedError(errorMessage), - }; - controller.enqueue(encodeSSEREsponseChunk(errorResponse)); - } finally { - pendingChunks--; - grpcStream?.resume(); - - // @note: we were hitting "Controller is already closed" errors when calling - // `controller.enqueue` above for the last chunk. The reasoning was the event - // handler for 'end' was being invoked prior to the completion of the last chunk, - // resulting in the controller being closed prematurely. The workaround was to - // keep track of the number of pending chunks and only close the controller - // when there are no more chunks to process. We need to explicitly call - // `tryCloseController` since there _seems_ to be no ordering guarantees between - // the 'end' event handler and this callback. - tryCloseController(); - } - }); - - // Handle stream completion - grpcStream.on('end', () => { - if (!isStreamActive) { - return; - } - isStreamActive = false; - tryCloseController(); - }); - - // Handle errors - grpcStream.on('error', (error: grpc.ServiceError) => { - logger.error('gRPC stream error:', error); - Sentry.captureException(error); - - if (!isStreamActive) { - return; - } - isStreamActive = false; - - // Send properly typed error response - const errorResponse: StreamedSearchErrorResponse = { - type: 'error', - error: unexpectedError(error.details || error.message), - }; - controller.enqueue(encodeSSEREsponseChunk(errorResponse)); - - controller.close(); - client.close(); - }); - } catch (error) { - logger.error('Stream initialization error:', error); - Sentry.captureException(error); - - const errorMessage = error instanceof Error ? error.message : 'Unknown error'; - const errorResponse: StreamedSearchErrorResponse = { - type: 'error', - error: unexpectedError(errorMessage), - }; - controller.enqueue(encodeSSEREsponseChunk(errorResponse)); - - controller.close(); - client.close(); - } - }, - cancel() { - logger.warn('SSE stream cancelled by client'); - isStreamActive = false; - - // Cancel the gRPC stream to stop receiving data - if (grpcStream) { - grpcStream.cancel(); - } - - client.close(); - } - }); -} - -// Encodes a response chunk into a SSE-compatible format. -const encodeSSEREsponseChunk = (response: object | string) => { - const data = typeof response === 'string' ? response : JSON.stringify(response); - return new TextEncoder().encode(`data: ${data}\n\n`); -} - -// Creates a mapping between all repository ids in a given response -// chunk. The mapping allows us to efficiently lookup repository metadata. -const createReposMapForChunk = async (chunk: ZoektGrpcSearchResponse, reposMapCache: Map, prisma: PrismaClient): Promise> => { - const reposMap = new Map(); - await Promise.all(chunk.files.map(async (file) => { - const id = getRepoIdForFile(file); - - const repo = await (async () => { - // If it's in the cache, return the cached value. - if (reposMapCache.has(id)) { - return reposMapCache.get(id); - } - - // Otherwise, query the database for the record. - const repo = typeof id === 'number' ? - await prisma.repo.findUnique({ - where: { - id: id, - }, - }) : - await prisma.repo.findFirst({ - where: { - name: id, - }, - }); - - // If a repository is found, cache it for future lookups. - if (repo) { - reposMapCache.set(id, repo); - } - - return repo; - })(); - - // Only add the repository to the map if it was found. - if (repo) { - reposMap.set(id, repo); - } - })); - - return reposMap; -} - -const transformZoektSearchResponse = async (response: ZoektGrpcSearchResponse, reposMapCache: Map): Promise<{ - stats: SearchStats, - files: SearchResultFile[], - repositoryInfo: RepositoryInfo[], -}> => { - const files = response.files.map((file) => { - const fileNameChunks = file.chunk_matches.filter((chunk) => chunk.file_name); - const repoId = getRepoIdForFile(file); - const repo = reposMapCache.get(repoId); - - // This can happen when a shard exists for a repository that does not exist in the database. - // In this case, issue a error message and skip the file. - // @see: https://github.com/sourcebot-dev/sourcebot/issues/669 - if (!repo) { - const errorMessage = `Unable to find repository "${file.repository}" in database for file "${file.file_name}". This can happen when a search shard exists for a repository that does not exist in the database. See https://github.com/sourcebot-dev/sourcebot/issues/669 for more details. Skipping file...`; - - logger.error(errorMessage); - Sentry.captureMessage(errorMessage); - captureEvent('wa_repo_not_found_for_zoekt_file', {}); - - return undefined; - } - - // @todo: address "file_name might not be a valid UTF-8 string" warning. - const fileName = file.file_name.toString('utf-8'); - - const convertRange = (range: ZoektGrpcRange): SourceRange => ({ - start: { - byteOffset: range.start?.byte_offset ?? 0, - column: range.start?.column ?? 1, - lineNumber: range.start?.line_number ?? 1, - }, - end: { - byteOffset: range.end?.byte_offset ?? 0, - column: range.end?.column ?? 1, - lineNumber: range.end?.line_number ?? 1, - } - }) - - // If a file has multiple branches, default to the first one. - const branchName = file.branches.length > 0 ? file.branches[0] : undefined; - - return { - fileName: { - text: fileName, - matchRanges: fileNameChunks.length === 1 ? fileNameChunks[0].ranges.map(convertRange) : [], - }, - repository: repo.name, - repositoryId: repo.id, - language: file.language, - webUrl: `${env.AUTH_URL}${getBrowsePath({ - repoName: repo.name, - path: fileName, - pathType: 'blob', - revisionName: branchName, - })}`, - externalWebUrl: getCodeHostBrowseFileAtBranchUrl({ - webUrl: repo.webUrl, - codeHostType: repo.external_codeHostType, - branchName: branchName ?? 'HEAD', - filePath: fileName, - }), - chunks: file.chunk_matches - .filter((chunk) => !chunk.file_name) // filter out filename chunks. - .map((chunk) => { - return { - content: chunk.content.toString('utf-8'), - matchRanges: chunk.ranges.map(convertRange), - contentStart: chunk.content_start ? { - byteOffset: chunk.content_start.byte_offset, - column: chunk.content_start.column, - lineNumber: chunk.content_start.line_number, - } : { - byteOffset: 0, - column: 1, - lineNumber: 1, - }, - symbols: chunk.symbol_info.map((symbol) => { - return { - symbol: symbol.sym, - kind: symbol.kind, - parent: symbol.parent ? { - symbol: symbol.parent, - kind: symbol.parent_kind, - } : undefined, - } - }) - } - }), - branches: file.branches, - content: file.content ? file.content.toString('utf-8') : undefined, - } - }).filter(file => file !== undefined); - - const actualMatchCount = files.reduce( - (acc, file) => - // Match count is the sum of the number of chunk matches and file name matches. - acc + file.chunks.reduce( - (acc, chunk) => acc + chunk.matchRanges.length, - 0, - ) + file.fileName.matchRanges.length, - 0, - ); - - const stats: SearchStats = { - actualMatchCount, - totalMatchCount: response.stats?.match_count ?? 0, - duration: response.stats?.duration?.nanos ?? 0, - fileCount: response.stats?.file_count ?? 0, - filesSkipped: response.stats?.files_skipped ?? 0, - contentBytesLoaded: response.stats?.content_bytes_loaded ?? 0, - indexBytesLoaded: response.stats?.index_bytes_loaded ?? 0, - crashes: response.stats?.crashes ?? 0, - shardFilesConsidered: response.stats?.shard_files_considered ?? 0, - filesConsidered: response.stats?.files_considered ?? 0, - filesLoaded: response.stats?.files_loaded ?? 0, - shardsScanned: response.stats?.shards_scanned ?? 0, - shardsSkipped: response.stats?.shards_skipped ?? 0, - shardsSkippedFilter: response.stats?.shards_skipped_filter ?? 0, - ngramMatches: response.stats?.ngram_matches ?? 0, - ngramLookups: response.stats?.ngram_lookups ?? 0, - wait: response.stats?.wait?.nanos ?? 0, - matchTreeConstruction: response.stats?.match_tree_construction?.nanos ?? 0, - matchTreeSearch: response.stats?.match_tree_search?.nanos ?? 0, - regexpsConsidered: response.stats?.regexps_considered ?? 0, - flushReason: response.stats?.flush_reason?.toString() ?? ZoektGrpcFlushReason.FLUSH_REASON_UNKNOWN_UNSPECIFIED, - } - - return { - files, - repositoryInfo: Array.from(reposMapCache.values()).map((repo) => ({ - id: repo.id, - codeHostType: repo.external_codeHostType, - name: repo.name, - displayName: repo.displayName ?? undefined, - webUrl: repo.webUrl ?? undefined, - })), - stats, - } -} - -// @note (2025-05-12): in zoekt, repositories are identified by the `RepositoryID` field -// which corresponds to the `id` in the Repo table. In order to efficiently fetch repository -// metadata when transforming (potentially thousands) of file matches, we aggregate a unique -// set of repository ids* and map them to their corresponding Repo record. -// -// *Q: Why is `RepositoryID` optional? And why are we falling back to `Repository`? -// A: Prior to this change, the repository id was not plumbed into zoekt, so RepositoryID was -// always undefined. To make this a non-breaking change, we fallback to using the repository's name -// (`Repository`) as the identifier in these cases. This is not guaranteed to be unique, but in -// practice it is since the repository name includes the host and path (e.g., 'github.com/org/repo', -// 'gitea.com/org/repo', etc.). -// -// Note: When a repository is re-indexed (every hour) this ID will be populated. -// @see: https://github.com/sourcebot-dev/zoekt/pull/6 -const getRepoIdForFile = (file: ZoektGrpcFileMatch): string | number => { - return file.repository_id ?? file.repository; -} - -const createGrpcClient = (): WebserverServiceClient => { - // Path to proto files - these should match your monorepo structure - const protoBasePath = path.join(process.cwd(), '../../vendor/zoekt/grpc/protos'); - const protoPath = path.join(protoBasePath, 'zoekt/webserver/v1/webserver.proto'); - - const packageDefinition = protoLoader.loadSync(protoPath, { - keepCase: true, - longs: Number, - enums: String, - defaults: true, - oneofs: true, - includeDirs: [protoBasePath], - }); - - const proto = grpc.loadPackageDefinition(packageDefinition) as unknown as ProtoGrpcType; - - // Extract host and port from ZOEKT_WEBSERVER_URL - const zoektUrl = new URL(env.ZOEKT_WEBSERVER_URL); - const grpcAddress = `${zoektUrl.hostname}:${zoektUrl.port}`; - - return new proto.zoekt.webserver.v1.WebserverService( - grpcAddress, - grpc.credentials.createInsecure(), - { - 'grpc.max_receive_message_length': 500 * 1024 * 1024, // 500MB - 'grpc.max_send_message_length': 500 * 1024 * 1024, // 500MB - } - ); -} - - -const accumulateStats = (a: SearchStats, b: SearchStats): SearchStats => { - return { - actualMatchCount: a.actualMatchCount + b.actualMatchCount, - totalMatchCount: a.totalMatchCount + b.totalMatchCount, - duration: a.duration + b.duration, - fileCount: a.fileCount + b.fileCount, - filesSkipped: a.filesSkipped + b.filesSkipped, - contentBytesLoaded: a.contentBytesLoaded + b.contentBytesLoaded, - indexBytesLoaded: a.indexBytesLoaded + b.indexBytesLoaded, - crashes: a.crashes + b.crashes, - shardFilesConsidered: a.shardFilesConsidered + b.shardFilesConsidered, - filesConsidered: a.filesConsidered + b.filesConsidered, - filesLoaded: a.filesLoaded + b.filesLoaded, - shardsScanned: a.shardsScanned + b.shardsScanned, - shardsSkipped: a.shardsSkipped + b.shardsSkipped, - shardsSkippedFilter: a.shardsSkippedFilter + b.shardsSkippedFilter, - ngramMatches: a.ngramMatches + b.ngramMatches, - ngramLookups: a.ngramLookups + b.ngramLookups, - wait: a.wait + b.wait, - matchTreeConstruction: a.matchTreeConstruction + b.matchTreeConstruction, - matchTreeSearch: a.matchTreeSearch + b.matchTreeSearch, - regexpsConsidered: a.regexpsConsidered + b.regexpsConsidered, - // Capture the first non-unknown flush reason. - ...(a.flushReason === ZoektGrpcFlushReason.FLUSH_REASON_UNKNOWN_UNSPECIFIED ? { - flushReason: b.flushReason - } : { - flushReason: a.flushReason, - }), - } -} diff --git a/packages/web/src/features/searchAssist/actions.ts b/packages/web/src/features/searchAssist/actions.ts deleted file mode 100644 index cf02e6087..000000000 --- a/packages/web/src/features/searchAssist/actions.ts +++ /dev/null @@ -1,53 +0,0 @@ -'use server'; - -import { sew } from "@/middleware/sew"; -import { getConfiguredLanguageModels } from "../chat/utils.server"; -import { getAISDKLanguageModelAndOptions } from "@/features/chat/llm.server"; -import { ErrorCode } from "@/lib/errorCodes"; -import { ServiceError } from "@/lib/serviceError"; -import { withOptionalAuth } from "@/middleware/withAuth"; -import { SEARCH_SYNTAX_DESCRIPTION } from "@sourcebot/query-language"; -import { generateObject } from "ai"; -import { z } from "zod"; -import { StatusCodes } from "http-status-codes"; - -const SYSTEM_PROMPT = `You are a search query translator for Sourcebot, a code search engine. - -Your job is to convert a natural language description into a valid Sourcebot search query. - -${SEARCH_SYNTAX_DESCRIPTION} - -## Instructions - -- Output ONLY the search query string. Do not include any explanation, markdown formatting, code fences, or surrounding text. -- Use the most specific filters that match the user's intent. -- Use regex values (bare word with regex syntax) when the user implies patterns, ranges, or variations. -- Keep the query as simple as possible while accurately capturing the intent. -`; - -export const translateSearchQuery = async ({ prompt }: { prompt: string }) => sew(() => - withOptionalAuth(async () => { - const models = await getConfiguredLanguageModels(); - - if (models.length === 0) { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_REQUEST_BODY, - message: 'No language models are configured.', - } satisfies ServiceError; - } - - const { model } = await getAISDKLanguageModelAndOptions(models[0]); - - const { object } = await generateObject({ - model, - system: SYSTEM_PROMPT, - prompt, - schema: z.object({ - query: z.string().describe("The Sourcebot search query."), - }), - }); - - return { query: object.query }; - }) -); diff --git a/packages/web/src/features/tools/adapters.test.ts b/packages/web/src/features/tools/adapters.test.ts deleted file mode 100644 index a0e6f9aed..000000000 --- a/packages/web/src/features/tools/adapters.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { describe, expect, test, vi } from "vitest"; -import { z } from "zod"; -import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import type { ToolDefinition } from "./types"; - -vi.mock("@/lib/posthog", () => ({ - captureEvent: vi.fn(), -})); - -const { registerMcpTool, toVercelAITool } = await import("./adapters"); - -const emptyShape = {}; - -const makeDefinition = (overrides: Partial>): ToolDefinition => ({ - name: "fake_tool", - title: "Fake tool", - description: "A fake tool.", - inputSchema: z.object(emptyShape), - isReadOnly: true, - isIdempotent: true, - execute: vi.fn(async () => ({ output: "", metadata: {} })), - ...overrides, -}); - -describe("toVercelAITool", () => { - test("requires approval for non-read-only tools", () => { - const tool = toVercelAITool(makeDefinition({ isReadOnly: false }), {}); - expect(tool.needsApproval).toBe(true); - }); - - test("does not require approval for read-only tools", () => { - const tool = toVercelAITool(makeDefinition({ isReadOnly: true }), {}); - expect(tool.needsApproval).toBeFalsy(); - }); -}); - -describe("registerMcpTool", () => { - const registerOn = (def: ToolDefinition) => { - const registerTool = vi.fn(); - registerMcpTool({ registerTool } as unknown as McpServer, def, {}); - return registerTool.mock.calls[0][1].annotations as Record; - }; - - test("emits destructiveHint: false for an additive write", () => { - const annotations = registerOn(makeDefinition({ isReadOnly: false, isIdempotent: false, isDestructive: false })); - expect(annotations).toEqual({ - readOnlyHint: false, - idempotentHint: false, - destructiveHint: false, - }); - }); - - test("emits destructiveHint: true for a destructive write", () => { - const annotations = registerOn(makeDefinition({ isReadOnly: false, isDestructive: true })); - expect(annotations).toMatchObject({ destructiveHint: true }); - }); - - test("omits destructiveHint when isDestructive is undefined", () => { - const annotations = registerOn(makeDefinition({})); - expect(annotations).toEqual({ - readOnlyHint: true, - idempotentHint: true, - }); - }); -}); diff --git a/packages/web/src/features/tools/adapters.ts b/packages/web/src/features/tools/adapters.ts deleted file mode 100644 index 2cb68985c..000000000 --- a/packages/web/src/features/tools/adapters.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { tool } from "ai"; -import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; -import { z } from "zod"; -import { captureEvent } from "@/lib/posthog"; -import { ToolContext, ToolDefinition } from "./types"; - -export function toVercelAITool( - def: ToolDefinition, - context: ToolContext, -) { - return tool({ - description: def.description, - inputSchema: def.inputSchema, - title: def.title, - // Policy: every non-read-only built-in requires user approval in Ask. - needsApproval: !def.isReadOnly, - execute: async (input) => { - let success = true; - try { - return await def.execute(input, context); - } catch (error) { - success = false; - throw error; - } finally { - captureEvent('tool_used', { - toolName: def.name, - source: context.source ?? 'unknown', - success, - }); - } - }, - toModelOutput: ({ output }) => ({ - type: "content", - value: [{ type: "text", text: output.output }], - }), - }); -} - -export function registerMcpTool( - server: McpServer, - def: ToolDefinition, - context: ToolContext, -) { - // Widening .shape to z.ZodRawShape (its base constraint) gives TypeScript a - // concrete InputArgs so it can fully resolve BaseToolCallback's conditional - // type. def.inputSchema.parse() recovers the correctly typed value inside. - server.registerTool( - def.name, - { - description: def.description, - inputSchema: def.inputSchema.shape as z.ZodRawShape, - annotations: { - readOnlyHint: def.isReadOnly, - idempotentHint: def.isIdempotent, - ...(def.isDestructive !== undefined ? { destructiveHint: def.isDestructive } : {}), - }, - }, - async (input) => { - let success = true; - try { - const parsed = def.inputSchema.parse(input); - const result = await def.execute(parsed, context); - return { content: [{ type: "text" as const, text: result.output }] }; - } catch (error) { - success = false; - const message = error instanceof Error ? error.message : String(error); - return { content: [{ type: "text" as const, text: `Tool "${def.name}" failed: ${message}` }], isError: true }; - } finally { - captureEvent('tool_used', { - toolName: def.name, - source: context.source ?? 'unknown', - success, - }); - } - }, - ); -} diff --git a/packages/web/src/features/tools/createSkill.test.ts b/packages/web/src/features/tools/createSkill.test.ts deleted file mode 100644 index bd794c890..000000000 --- a/packages/web/src/features/tools/createSkill.test.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from "vitest"; -import { ErrorCode } from "@/lib/errorCodes"; -import { StatusCodes } from "http-status-codes"; - -const mocks = vi.hoisted(() => ({ - authContext: undefined as unknown, - checkAskEntitlement: vi.fn(), - withAuth: vi.fn(), - createPersonalAgentSkillForContext: vi.fn(), -})); - -vi.mock("@sourcebot/shared", () => ({ - createLogger: () => ({ error: vi.fn(), info: vi.fn(), warn: vi.fn(), debug: vi.fn() }), - env: { AUTH_URL: "https://sourcebot.example.com" }, -})); - -vi.mock("@/features/chat/utils.server", () => ({ - checkAskEntitlement: mocks.checkAskEntitlement, -})); - -vi.mock("@/middleware/withAuth", () => ({ - withAuth: mocks.withAuth, -})); - -vi.mock("@/ee/features/chat/skills/skillCreation", () => ({ - createPersonalAgentSkillForContext: mocks.createPersonalAgentSkillForContext, -})); - -const { createSkillDefinition } = await import("./createSkill"); - -const validInput = { - name: "Review PR", - slug: "Review PR", - description: "Review a pull request.", - instructions: "Look for correctness issues first.", -}; - -const createdSkill = { - id: "skill-1", - scope: "PERSONAL", - slug: "review-pr", - name: "Review PR", - description: "Review a pull request.", - instructions: "Look for correctness issues first.", - enabled: true, - source: null, - createdAt: "2026-01-01T00:00:00.000Z", - updatedAt: "2026-01-01T00:00:00.000Z", -}; - -beforeEach(() => { - vi.clearAllMocks(); - mocks.authContext = { - org: { id: 1 }, - user: { id: "user-1" }, - prisma: {}, - principal: { source: "api_key" }, - }; - mocks.withAuth.mockImplementation(async (callback: (context: unknown) => unknown) => callback(mocks.authContext)); - mocks.checkAskEntitlement.mockResolvedValue(null); - mocks.createPersonalAgentSkillForContext.mockResolvedValue(createdSkill); -}); - -describe("createSkillDefinition", () => { - test("has the expected definition flags", () => { - expect(createSkillDefinition.name).toBe("create_skill"); - expect(createSkillDefinition.isReadOnly).toBe(false); - expect(createSkillDefinition.isIdempotent).toBe(false); - expect(createSkillDefinition.isDestructive).toBe(false); - }); - - test("normalizes the slug before creating", async () => { - await createSkillDefinition.execute(validInput, { source: "sourcebot-ask-agent" }); - - expect(mocks.createPersonalAgentSkillForContext).toHaveBeenCalledWith(expect.objectContaining({ - userId: "user-1", - orgId: 1, - input: expect.objectContaining({ slug: "review-pr" }), - analytics: { - source: "sourcebot-ask-agent", - entryPoint: "agent_tool", - creationMethod: "manual", - }, - })); - }); - - test("throws the schema message on invalid input without calling withAuth", async () => { - await expect(createSkillDefinition.execute( - { ...validInput, name: " " }, - { source: "sourcebot-ask-agent" }, - )).rejects.toThrow("Name is required."); - - expect(mocks.withAuth).not.toHaveBeenCalled(); - expect(mocks.createPersonalAgentSkillForContext).not.toHaveBeenCalled(); - }); - - test("throws when the requester is not authenticated", async () => { - mocks.withAuth.mockResolvedValue({ - statusCode: StatusCodes.UNAUTHORIZED, - errorCode: ErrorCode.NOT_AUTHENTICATED, - message: "Not authenticated", - }); - - await expect(createSkillDefinition.execute(validInput, { source: "sourcebot-ask-agent" })) - .rejects.toThrow("Authentication is required to create skills."); - }); - - test("rejects a repository-scoped access token without creating", async () => { - mocks.authContext = { - org: { id: 1 }, - user: { id: "user-1" }, - prisma: {}, - principal: { source: "scoped_access_token" }, - }; - - await expect(createSkillDefinition.execute(validInput, { source: "sourcebot-mcp-server" })) - .rejects.toThrow("Repository-scoped access tokens cannot manage skills."); - expect(mocks.createPersonalAgentSkillForContext).not.toHaveBeenCalled(); - }); - - test("throws the entitlement message when Ask is not available", async () => { - mocks.checkAskEntitlement.mockResolvedValue({ - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS, - message: "Ask Sourcebot is not available in your current plan", - }); - - await expect(createSkillDefinition.execute(validInput, { source: "sourcebot-ask-agent" })) - .rejects.toThrow("Ask Sourcebot is not available in your current plan"); - expect(mocks.createPersonalAgentSkillForContext).not.toHaveBeenCalled(); - }); - - test("surfaces a slug conflict with the actionable message", async () => { - mocks.createPersonalAgentSkillForContext.mockResolvedValue({ - statusCode: StatusCodes.CONFLICT, - errorCode: ErrorCode.AGENT_SKILL_ALREADY_EXISTS, - message: "A skill with command /review-pr already exists.", - }); - - await expect(createSkillDefinition.execute(validInput, { source: "sourcebot-ask-agent" })) - .rejects.toThrow("A skill with command /review-pr already exists."); - }); - - test("returns the created skill as JSON output plus UI metadata with a settings deep link", async () => { - const result = await createSkillDefinition.execute(validInput, { source: "sourcebot-mcp-server" }); - - const url = "https://sourcebot.example.com/settings/skills?skill=skill-1"; - expect(JSON.parse(result.output)).toEqual({ - id: "skill-1", - slug: "review-pr", - name: "Review PR", - description: "Review a pull request.", - enabled: true, - createdAt: "2026-01-01T00:00:00.000Z", - url, - }); - expect(result.metadata).toEqual({ - id: "skill-1", - slug: "review-pr", - name: "Review PR", - url, - }); - // Instructions are never echoed back. - expect(result.output).not.toContain("Look for correctness issues first."); - expect(mocks.createPersonalAgentSkillForContext).toHaveBeenCalledWith(expect.objectContaining({ - analytics: expect.objectContaining({ source: "sourcebot-mcp-server" }), - })); - }); -}); diff --git a/packages/web/src/features/tools/createSkill.ts b/packages/web/src/features/tools/createSkill.ts deleted file mode 100644 index 6f76e8f14..000000000 --- a/packages/web/src/features/tools/createSkill.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { z } from "zod"; -import { checkAskEntitlement } from "@/features/chat/utils.server"; -import { agentSkillInputSchema } from "@/ee/features/chat/skills/types"; -import { createPersonalAgentSkillForContext } from "@/ee/features/chat/skills/skillCreation"; -import { isServiceError } from "@/lib/utils"; -import { sew } from "@/middleware/sew"; -import { withAuth } from "@/middleware/withAuth"; -import { ToolDefinition } from "./types"; -import { logger } from "./logger"; -import { scopedTokensCannotManageSkills, skillSettingsUrl, toSkillToolError, toSkillAnalyticsSource } from "./skillToolShared"; -import description from "./createSkill.txt"; - -// Plain described strings rather than the piped slug schema: the AI SDK -// converts piped zod schemas to `allOf` JSON schemas in the model-facing tool -// definition, so validation runs in `execute` via agentSkillInputSchema instead -// (same rules and messages as the settings UI). -const createSkillShape = { - name: z.string().describe("Display name for the skill, 1-80 characters."), - slug: z.string().describe("Slash command for the skill, without the leading '/'. Lowercase letters, numbers, and hyphens; at most 64 characters (e.g. 'review-pr')."), - description: z.string().describe("When to use the skill, 1-500 characters. Shown in the skill catalog the agent uses to auto-load skills."), - instructions: z.string().describe("Markdown instructions the agent follows when the skill is invoked, 1-20,000 characters."), -}; - -export type CreateSkillMetadata = { - id: string; - slug: string; - name: string; - url: string; -}; - -export const createSkillDefinition: ToolDefinition<"create_skill", typeof createSkillShape, CreateSkillMetadata> = { - name: "create_skill", - title: "Create skill", - isReadOnly: false, - isIdempotent: false, - isDestructive: false, - description, - inputSchema: z.object(createSkillShape), - execute: async (input, context) => { - logger.debug('create_skill', { slug: input.slug }); - - const parsed = agentSkillInputSchema.safeParse(input); - if (!parsed.success) { - throw new Error(parsed.error.issues.map((issue) => issue.message).join(' ')); - } - - const result = await sew(() => - withAuth(async ({ org, user, prisma, principal }) => { - if (principal.source === 'scoped_access_token') { - return scopedTokensCannotManageSkills(); - } - - const askError = await checkAskEntitlement(); - if (askError) { - return askError; - } - - return createPersonalAgentSkillForContext({ - prisma, - userId: user.id, - orgId: org.id, - input: parsed.data, - analytics: { - source: toSkillAnalyticsSource(context.source), - entryPoint: 'agent_tool', - creationMethod: 'manual', - }, - }); - })); - - if (isServiceError(result)) { - logger.error('create_skill failed', { serviceError: result }); - throw toSkillToolError(result, { - notAuthenticatedMessage: 'Authentication is required to create skills.', - fallbackMessage: 'Failed to create skill.', - }); - } - - const url = skillSettingsUrl(result.id); - return { - output: JSON.stringify({ - id: result.id, - slug: result.slug, - name: result.name, - description: result.description, - enabled: result.enabled, - createdAt: result.createdAt, - url, - }), - metadata: { - id: result.id, - slug: result.slug, - name: result.name, - url, - }, - }; - }, -}; diff --git a/packages/web/src/features/tools/createSkill.txt b/packages/web/src/features/tools/createSkill.txt deleted file mode 100644 index 20b192f1a..000000000 --- a/packages/web/src/features/tools/createSkill.txt +++ /dev/null @@ -1,9 +0,0 @@ -Creates a new agent skill: a reusable, named instruction set the user can invoke later. - -Usage: -- ONLY call this tool when the user explicitly asks to create or save a skill. NEVER invent skills from conversation context on your own initiative. -- The skill is personal to the requesting user and enabled immediately. In later messages it can be invoked manually as `/` or loaded automatically when a request matches its description. -- `slug` becomes the skill's slash command (without the leading `/`). It must be unique among the user's skills; if it already exists, the tool fails and you can retry with a different slug. Use `list_skills` to check which slugs are taken. -- `description` should say when the skill applies — it is what the agent matches against to auto-load the skill. -- `instructions` are the markdown instructions the agent follows when the skill is invoked. -- The result includes a `url` to the skill in Settings → Skills, where the user can edit, share, or delete it. To change a skill later, use `update_skill`. diff --git a/packages/web/src/features/tools/findSymbolDefinitions.ts b/packages/web/src/features/tools/findSymbolDefinitions.ts deleted file mode 100644 index b77176163..000000000 --- a/packages/web/src/features/tools/findSymbolDefinitions.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { getRepoInfoByName } from "@/actions"; -import { findSearchBasedSymbolDefinitions } from "@/features/codeNav/api"; -import { isServiceError } from "@/lib/utils"; -import { z } from "zod"; -import description from "./findSymbolDefinitions.txt"; -import { FindSymbolFile, FindSymbolRepoInfo } from "./findSymbolReferences"; -import { logger } from "./logger"; -import { Source, ToolDefinition } from "./types"; - - -const MAX_LINE_LENGTH = 2000; -const MAX_LINE_SUFFIX = `... (line truncated to ${MAX_LINE_LENGTH} chars)`; - -const findSymbolDefinitionsShape = { - symbol: z.string().describe("The symbol to find definitions of"), - repo: z.string().describe("The repository to scope the search to"), -}; - - -export type FindSymbolDefinitionsMetadata = { - symbol: string; - matchCount: number; - fileCount: number; - repoInfo: FindSymbolRepoInfo; - files: FindSymbolFile[]; -}; - -export const findSymbolDefinitionsDefinition: ToolDefinition< - 'find_symbol_definitions', - typeof findSymbolDefinitionsShape, - FindSymbolDefinitionsMetadata -> = { - name: 'find_symbol_definitions', - title: 'Find symbol definitions', - isReadOnly: true, - isIdempotent: true, - description, - inputSchema: z.object(findSymbolDefinitionsShape), - execute: async ({ symbol, repo }, _context) => { - logger.debug('find_symbol_definitions', { symbol, repo }); - const revision = "HEAD"; - - const response = await findSearchBasedSymbolDefinitions({ - symbolName: symbol, - revisionName: revision, - repoName: repo, - }); - - if (isServiceError(response)) { - throw new Error(response.message); - } - - const matchCount = response.stats.matchCount; - const fileCount = response.files.length; - - const repoInfoResult = await getRepoInfoByName(repo); - if (isServiceError(repoInfoResult) || !repoInfoResult) { - throw new Error(`Repository "${repo}" not found.`); - } - const repoInfo: FindSymbolRepoInfo = { - name: repoInfoResult.name, - displayName: repoInfoResult.displayName ?? repoInfoResult.name, - codeHostType: repoInfoResult.codeHostType, - }; - - const metadata: FindSymbolDefinitionsMetadata = { - symbol, - matchCount, - fileCount, - repoInfo, - files: response.files.map((file) => ({ - fileName: file.fileName, - repo: file.repository, - revision, - })), - }; - - if (fileCount === 0) { - return { - output: 'No definitions found', - metadata, - }; - } - - const outputLines: string[] = [ - `Found ${matchCount} ${matchCount === 1 ? 'definition' : 'definitions'} in ${fileCount} ${fileCount === 1 ? 'file' : 'files'}`, - ]; - - for (const file of response.files) { - outputLines.push(''); - outputLines.push(`[${file.repository}] ${file.fileName}:`); - for (const { lineContent, range } of file.matches) { - const lineNum = range.start.lineNumber; - const trimmed = lineContent.trimEnd(); - const line = trimmed.length > MAX_LINE_LENGTH - ? trimmed.substring(0, MAX_LINE_LENGTH) + MAX_LINE_SUFFIX - : trimmed; - outputLines.push(` ${lineNum}: ${line}`); - } - } - - const sources: Source[] = metadata.files.map((file) => ({ - type: 'file' as const, - repo: file.repo, - path: file.fileName, - name: file.fileName.split('/').pop() ?? file.fileName, - revision: file.revision, - })); - - return { - output: outputLines.join('\n'), - metadata, - sources, - }; - }, -}; diff --git a/packages/web/src/features/tools/findSymbolDefinitions.txt b/packages/web/src/features/tools/findSymbolDefinitions.txt deleted file mode 100644 index 2588cd31a..000000000 --- a/packages/web/src/features/tools/findSymbolDefinitions.txt +++ /dev/null @@ -1,8 +0,0 @@ -Finds where a symbol (function, class, variable, method, type, etc.) is defined in a repository. - -Usage: -- Use this to answer "where is X defined/implemented?" questions. -- Results include file paths and line numbers for each definition site, grouped by file. -- Symbol matching is exact — use the precise identifier name, not a description (e.g., "UserService" not "user service class"). -- Prefer this over `grep` for symbol lookups: it understands symbol boundaries and won't match partial strings or comments. -- If the repository name is not known, use `list_repos` first to discover the correct name. diff --git a/packages/web/src/features/tools/findSymbolReferences.ts b/packages/web/src/features/tools/findSymbolReferences.ts deleted file mode 100644 index 0b04c9f91..000000000 --- a/packages/web/src/features/tools/findSymbolReferences.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { z } from "zod"; -import { isServiceError } from "@/lib/utils"; -import { findSearchBasedSymbolReferences } from "@/features/codeNav/api"; -import { Source, ToolDefinition } from "./types"; -import { logger } from "./logger"; -import description from "./findSymbolReferences.txt"; -import { getRepoInfoByName } from "@/actions"; -import { CodeHostType } from "@sourcebot/db"; - -const MAX_LINE_LENGTH = 2000; -const MAX_LINE_SUFFIX = `... (line truncated to ${MAX_LINE_LENGTH} chars)`; - -const findSymbolReferencesShape = { - symbol: z.string().describe("The symbol to find references to"), - repo: z.string().describe("The repository to scope the search to"), -}; - -export type FindSymbolRepoInfo = { - name: string; - displayName: string; - codeHostType: CodeHostType; -}; - -export type FindSymbolFile = { - fileName: string; - repo: string; - revision: string; -}; - -export type FindSymbolReferencesMetadata = { - symbol: string; - matchCount: number; - fileCount: number; - repoInfo: FindSymbolRepoInfo; - files: FindSymbolFile[]; -}; - -export const findSymbolReferencesDefinition: ToolDefinition< - 'find_symbol_references', - typeof findSymbolReferencesShape, - FindSymbolReferencesMetadata -> = { - name: 'find_symbol_references', - title: 'Find symbol references', - isReadOnly: true, - isIdempotent: true, - description, - inputSchema: z.object(findSymbolReferencesShape), - execute: async ({ symbol, repo }, _context) => { - logger.debug('find_symbol_references', { symbol, repo }); - const revision = "HEAD"; - - const response = await findSearchBasedSymbolReferences({ - symbolName: symbol, - revisionName: revision, - repoName: repo, - }); - - if (isServiceError(response)) { - throw new Error(response.message); - } - - const matchCount = response.stats.matchCount; - const fileCount = response.files.length; - - const repoInfoResult = await getRepoInfoByName(repo); - if (isServiceError(repoInfoResult) || !repoInfoResult) { - throw new Error(`Repository "${repo}" not found.`); - } - const repoInfo: FindSymbolRepoInfo = { - name: repoInfoResult.name, - displayName: repoInfoResult.displayName ?? repoInfoResult.name, - codeHostType: repoInfoResult.codeHostType, - }; - - const metadata: FindSymbolReferencesMetadata = { - symbol, - matchCount, - fileCount, - repoInfo, - files: response.files.map((file) => ({ - fileName: file.fileName, - repo: file.repository, - revision, - })), - }; - - if (fileCount === 0) { - return { - output: 'No references found', - metadata, - }; - } - - const outputLines: string[] = [ - `Found ${matchCount} ${matchCount === 1 ? 'reference' : 'references'} in ${fileCount} ${fileCount === 1 ? 'file' : 'files'}`, - ]; - - for (const file of response.files) { - outputLines.push(''); - outputLines.push(`[${file.repository}] ${file.fileName}:`); - for (const { lineContent, range } of file.matches) { - const lineNum = range.start.lineNumber; - const trimmed = lineContent.trimEnd(); - const line = trimmed.length > MAX_LINE_LENGTH - ? trimmed.substring(0, MAX_LINE_LENGTH) + MAX_LINE_SUFFIX - : trimmed; - outputLines.push(` ${lineNum}: ${line}`); - } - } - - const sources: Source[] = metadata.files.map((file) => ({ - type: 'file' as const, - repo: file.repo, - path: file.fileName, - name: file.fileName.split('/').pop() ?? file.fileName, - revision: file.revision, - })); - - return { - output: outputLines.join('\n'), - metadata, - sources, - }; - }, -}; diff --git a/packages/web/src/features/tools/findSymbolReferences.txt b/packages/web/src/features/tools/findSymbolReferences.txt deleted file mode 100644 index d1076caaf..000000000 --- a/packages/web/src/features/tools/findSymbolReferences.txt +++ /dev/null @@ -1,8 +0,0 @@ -Finds all usages of a symbol (function, class, variable, method, type, etc.) across a repository. - -Usage: -- Use this to answer "where is X used/called?" questions. -- Results include file paths and line numbers for each reference, grouped by file. -- Symbol matching is exact — use the precise identifier name, not a description (e.g., "getUserById" not "get user by id"). -- Prefer this over `grep` for symbol lookups: it understands symbol boundaries and won't match partial strings or comments. -- If the repository name is not known, use `list_repos` first to discover the correct name. diff --git a/packages/web/src/features/tools/getDiff.ts b/packages/web/src/features/tools/getDiff.ts deleted file mode 100644 index ae1048e54..000000000 --- a/packages/web/src/features/tools/getDiff.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { getDiff, GetDiffResult } from '@/features/git'; -import { getDiffRequestSchema } from '@/features/git/schemas'; -import { isServiceError } from '@/lib/utils'; -import description from './getDiff.txt'; -import { formatDiffAsGitDiff } from './utils'; -import { logger } from './logger'; -import { Source, ToolDefinition } from './types'; -import { CodeHostType } from '@sourcebot/db'; -import { getRepoInfoByName } from '@/actions'; - -export type GetDiffRepoInfo = { - name: string; - displayName: string; - codeHostType: CodeHostType; -}; - -export type GetDiffMetadata = GetDiffResult & { - repo: string; - repoInfo: GetDiffRepoInfo; - base: string; - head: string; -}; - -export const getDiffDefinition: ToolDefinition<'get_diff', typeof getDiffRequestSchema.shape, GetDiffMetadata> = { - name: 'get_diff', - title: 'Get diff', - isReadOnly: true, - isIdempotent: true, - description, - inputSchema: getDiffRequestSchema, - execute: async ({ repo, base, head, path }, _context) => { - logger.debug('get_diff', { repo, base, head, path }); - - const response = await getDiff({ repo, base, head, path }); - - if (isServiceError(response)) { - throw new Error(response.message); - } - - const repoInfoResult = await getRepoInfoByName(repo); - if (isServiceError(repoInfoResult) || !repoInfoResult) { - throw new Error(`Repository "${repo}" not found.`); - } - const repoInfo: GetDiffRepoInfo = { - name: repoInfoResult.name, - displayName: repoInfoResult.displayName ?? repoInfoResult.name, - codeHostType: repoInfoResult.codeHostType, - }; - - const gitDiffOutput = formatDiffAsGitDiff(response); - - const sources: Source[] = response.files.flatMap((file) => { - // Deleted: only the base side exists. - if (file.newPath === null) { - return file.oldPath ? [{ - type: 'file' as const, - repo: repoInfo.name, - path: file.oldPath, - name: file.oldPath.split('/').pop() ?? file.oldPath, - revision: base, - }] : []; - } - - // Renamed: emit both sides since they have distinct paths. - if (file.oldPath && file.oldPath !== file.newPath) { - return [ - { - type: 'file' as const, - repo: repoInfo.name, - path: file.oldPath, - name: file.oldPath.split('/').pop() ?? file.oldPath, - revision: base, - }, - { - type: 'file' as const, - repo: repoInfo.name, - path: file.newPath, - name: file.newPath.split('/').pop() ?? file.newPath, - revision: head, - }, - ]; - } - - // Added or modified: only the head side is citable. - return [{ - type: 'file' as const, - repo: repoInfo.name, - path: file.newPath, - name: file.newPath.split('/').pop() ?? file.newPath, - revision: head, - }]; - }); - - return { - output: gitDiffOutput, - metadata: { - ...response, - repo, - repoInfo, - base, - head, - }, - sources, - }; - }, -}; diff --git a/packages/web/src/features/tools/getDiff.txt b/packages/web/src/features/tools/getDiff.txt deleted file mode 100644 index 84cea0153..000000000 --- a/packages/web/src/features/tools/getDiff.txt +++ /dev/null @@ -1,4 +0,0 @@ -Returns a structured git diff between two refs in a repository. - -Use this tool when you need patch details (added, removed, and context lines) between a base and head revision. -The output includes changed files and hunks with line ranges and diff body content. diff --git a/packages/web/src/features/tools/glob.test.ts b/packages/web/src/features/tools/glob.test.ts deleted file mode 100644 index 16ddff134..000000000 --- a/packages/web/src/features/tools/glob.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - search: vi.fn(), - getRepoInfoByName: vi.fn(), -})); - -vi.mock('@/features/search', () => ({ - search: mocks.search, -})); - -vi.mock('@/actions', () => ({ - getRepoInfoByName: mocks.getRepoInfoByName, -})); - -vi.mock('@/lib/utils', () => ({ - isServiceError: () => false, -})); - -vi.mock('./logger', () => ({ - logger: { debug: vi.fn() }, -})); - -import { globDefinition } from './glob'; -import { buildGlobSearchQuery } from './searchQuery'; - -const emptySearchResponse = { - files: [], - repositoryInfo: [], - stats: { actualMatchCount: 0 }, - isSearchExhaustive: true, -}; - -describe('glob', () => { - beforeEach(() => { - vi.clearAllMocks(); - mocks.search.mockResolvedValue(emptySearchResponse); - }); - - it('executes with QueryIR', async () => { - const result = await globDefinition.execute({ - pattern: 'My Folder/**/*.ts', - ref: 'feature/my feature', - }, { - source: 'test', - selectedRepos: ['Repo One'], - }); - - expect(mocks.search).toHaveBeenCalledWith({ - queryType: 'ir', - query: buildGlobSearchQuery({ - pattern: 'My Folder/**/*.ts', - ref: 'feature/my feature', - selectedRepos: ['Repo One'], - }), - options: { - matches: 100, - contextLines: 0, - }, - source: 'test', - }); - expect(result.metadata).not.toHaveProperty('query'); - }); -}); diff --git a/packages/web/src/features/tools/glob.ts b/packages/web/src/features/tools/glob.ts deleted file mode 100644 index 65b034539..000000000 --- a/packages/web/src/features/tools/glob.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { z } from "zod"; -import { isServiceError } from "@/lib/utils"; -import { search } from "@/features/search"; -import { Source, ToolDefinition } from "./types"; -import { logger } from "./logger"; -import description from "./glob.txt"; -import { CodeHostType } from "@sourcebot/db"; -import { getRepoInfoByName } from "@/actions"; -import { buildGlobSearchQuery } from "./searchQuery"; - -const DEFAULT_LIMIT = 100; -const TRUNCATION_MESSAGE = `(Results truncated. Consider using a more specific pattern, specifying a repo, or increasing the limit.)`; - -const globShape = { - pattern: z - .string() - .describe(`The glob pattern to match file paths against (e.g. "**/*.ts", "src/**/*.test.{ts,tsx}")`), - path: z - .string() - .describe(`Restrict results to files under this subdirectory.`) - .optional(), - repo: z - .string() - .describe(`The name of the repository to search in. If not provided, searches all repositories.`) - .optional(), - ref: z - .string() - .describe(`The commit SHA, branch or tag name to search on. If not provided, defaults to the default branch (usually 'main' or 'master').`) - .optional(), - limit: z - .number() - .describe(`The maximum number of files to return (default: ${DEFAULT_LIMIT})`) - .optional(), -}; - -export type GlobFile = { - path: string; - name: string; - repo: string; - revision: string; -}; - -export type GlobRepoInfo = { - name: string; - displayName: string; - codeHostType: CodeHostType; -}; - -export type GlobMetadata = { - files: GlobFile[]; - pattern: string; - fileCount: number; - repoCount: number; - repoInfoMap: Record; - inputRepo?: GlobRepoInfo; - truncated: boolean; -}; - -export const globDefinition: ToolDefinition<'glob', typeof globShape, GlobMetadata> = { - name: 'glob', - title: 'Find files', - isReadOnly: true, - isIdempotent: true, - description, - inputSchema: z.object(globShape), - execute: async ({ - pattern, - repo, - ref, - path, - limit: _limit, - }, context) => { - const limit = _limit ?? DEFAULT_LIMIT; - - logger.debug('glob', { pattern, repo, ref, path, limit }); - - const query = buildGlobSearchQuery({ - pattern, - path, - repo, - ref, - selectedRepos: context.selectedRepos, - }); - - const response = await search({ - queryType: 'ir', - query, - options: { - matches: limit, - contextLines: 0, - }, - source: context.source, - }); - - if (isServiceError(response)) { - throw new Error(response.message); - } - - const files = response.files.map((file) => ({ - path: file.fileName.text, - name: file.fileName.text.split('/').pop() ?? file.fileName.text, - repo: file.repository, - revision: ref ?? 'HEAD', - } satisfies GlobFile)); - - const repoInfoMap = Object.fromEntries( - response.repositoryInfo.map((info) => [info.name, { - name: info.name, - displayName: info.displayName ?? info.name, - codeHostType: info.codeHostType, - }]) - ); - - const truncated = !response.isSearchExhaustive; - - const inputRepoResult = repo ? await getRepoInfoByName(repo) : undefined; - if (isServiceError(inputRepoResult)) { - throw new Error(`Repository "${repo}" not found.`); - } - - const inputRepo = inputRepoResult ? { - name: inputRepoResult.name, - displayName: inputRepoResult.displayName ?? inputRepoResult.name, - codeHostType: inputRepoResult.codeHostType, - } : undefined; - - const metadata: GlobMetadata = { - files, - pattern, - fileCount: files.length, - repoCount: new Set(files.map((f) => f.repo)).size, - repoInfoMap, - inputRepo: inputRepo, - truncated, - }; - - if (files.length === 0) { - return { - output: 'No files found', - metadata, - }; - } - - const filesByRepo = new Map(); - for (const file of files) { - if (!filesByRepo.has(file.repo)) { - filesByRepo.set(file.repo, []); - } - filesByRepo.get(file.repo)!.push(file); - } - - const outputLines: string[] = [ - `Found ${files.length} file${files.length !== 1 ? 's' : ''} matching "${pattern}":`, - ]; - - for (const [repo, repoFiles] of filesByRepo) { - outputLines.push(''); - outputLines.push(`[${repo}]`); - for (const file of repoFiles) { - outputLines.push(` ${file.path}`); - } - } - - if (truncated) { - outputLines.push(''); - outputLines.push(TRUNCATION_MESSAGE); - } - - const sources: Source[] = files.map((file) => ({ - type: 'file' as const, - repo: file.repo, - path: file.path, - name: file.name, - revision: file.revision, - })); - - return { - output: outputLines.join('\n'), - metadata, - sources, - }; - }, -}; diff --git a/packages/web/src/features/tools/glob.txt b/packages/web/src/features/tools/glob.txt deleted file mode 100644 index c224ba6e4..000000000 --- a/packages/web/src/features/tools/glob.txt +++ /dev/null @@ -1,6 +0,0 @@ -- Find files by name/path pattern using glob syntax (e.g. "**/*.ts", "src/**/*.test.{ts,tsx}") -- Returns matching file paths only — does NOT search file contents -- Use this tool when you need to enumerate files by type or naming convention -- Use grep instead if you need to find files containing specific content -- Supports standard glob syntax: * matches within a path segment, ** matches across segments, {a,b} matches alternatives -- When using the repo param, if the repository name is not known, use list_repos first to discover the correct name diff --git a/packages/web/src/features/tools/grep.test.ts b/packages/web/src/features/tools/grep.test.ts deleted file mode 100644 index 74bc04fe5..000000000 --- a/packages/web/src/features/tools/grep.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - search: vi.fn(), - getRepoInfoByName: vi.fn(), -})); - -vi.mock('@/features/search', () => ({ - search: mocks.search, -})); - -vi.mock('@/actions', () => ({ - getRepoInfoByName: mocks.getRepoInfoByName, -})); - -vi.mock('@/lib/utils', () => ({ - isServiceError: () => false, -})); - -vi.mock('./logger', () => ({ - logger: { debug: vi.fn() }, -})); - -import { grepDefinition } from './grep'; -import { buildGrepSearchQuery } from './searchQuery'; - -const emptySearchResponse = { - files: [], - repositoryInfo: [], - stats: { actualMatchCount: 0 }, - isSearchExhaustive: true, -}; - -describe('grep', () => { - beforeEach(() => { - vi.clearAllMocks(); - mocks.search.mockResolvedValue(emptySearchResponse); - }); - - it('executes with QueryIR', async () => { - const result = await grepDefinition.execute({ - pattern: 'needle', - path: 'src/my dir', - limit: 25, - }, { - source: 'test', - selectedRepos: ['Repo One'], - }); - - expect(mocks.search).toHaveBeenCalledWith({ - queryType: 'ir', - query: buildGrepSearchQuery({ - pattern: 'needle', - path: 'src/my dir', - selectedRepos: ['Repo One'], - }), - options: { - matches: 25, - contextLines: 0, - }, - source: 'test', - }); - expect(result.metadata).not.toHaveProperty('query'); - }); -}); diff --git a/packages/web/src/features/tools/grep.ts b/packages/web/src/features/tools/grep.ts deleted file mode 100644 index eda4acab8..000000000 --- a/packages/web/src/features/tools/grep.ts +++ /dev/null @@ -1,231 +0,0 @@ -import { z } from "zod"; -import { isServiceError } from "@/lib/utils"; -import { search } from "@/features/search"; -import { Source, ToolDefinition } from "./types"; -import { logger } from "./logger"; -import description from "./grep.txt"; -import { CodeHostType } from "@sourcebot/db"; -import { getRepoInfoByName } from "@/actions"; -import { buildGrepSearchQuery } from "./searchQuery"; - -const DEFAULT_LIMIT = 100; -const DEFAULT_GROUP_BY_REPO_LIMIT = 10_000; -const MAX_LINE_LENGTH = 2000; -const MAX_LINE_SUFFIX = `... (line truncated to ${MAX_LINE_LENGTH} chars)`; -const TRUNCATION_MESSAGE = `(Results truncated. Consider using a more specific path or pattern, specifying a repo, or increasing the limit.)`; - -const grepShape = { - pattern: z - .string() - .describe(`The regex pattern to search for in file contents`), - path: z - .string() - .describe(`The directory to search in. Defaults to the repository root.`) - .optional(), - include: z - .string() - .describe(`File pattern to include in the search (e.g. "*.js", "*.{ts,tsx}")`) - .optional(), - repo: z - .string() - .describe(`The name of the repository to search in. If not provided, searches all repositories.`) - .optional(), - ref: z - .string() - .describe(`The commit SHA, branch or tag name to search on. If not provided, defaults to the default branch (usually 'main' or 'master').`) - .optional(), - limit: z - .number() - .describe(`The maximum number of matches to return (default: ${DEFAULT_LIMIT} when groupByRepo=false, ${DEFAULT_GROUP_BY_REPO_LIMIT} when groupByRepo=true)`) - .optional(), - groupByRepo: z - .boolean() - .optional() - .describe(`If true, returns a summary of match counts grouped by repository instead of individual file results.`), -}; - -export type GrepFile = { - path: string; - name: string; - repo: string; - revision: string; -}; - -export type GrepRepoInfo = { - name: string; - displayName: string; - codeHostType: CodeHostType; -}; - -export type GrepMetadata = { - files: GrepFile[]; - pattern: string; - matchCount: number; - repoCount: number; - repoInfoMap: Record; - inputRepo?: GrepRepoInfo; - groupByRepo: boolean; -}; - -export const grepDefinition: ToolDefinition<'grep', typeof grepShape, GrepMetadata> = { - name: 'grep', - title: 'Search code', - isReadOnly: true, - isIdempotent: true, - description, - inputSchema: z.object(grepShape), - execute: async ({ - pattern, - path, - include, - repo, - ref, - limit: _limit, - groupByRepo = false, - }, context) => { - - const limit = _limit ?? (groupByRepo ? DEFAULT_GROUP_BY_REPO_LIMIT : DEFAULT_LIMIT); - - logger.debug('grep', { pattern, path, include, repo, ref, limit, groupByRepo }); - - const query = buildGrepSearchQuery({ - pattern, - path, - include, - repo, - ref, - selectedRepos: context.selectedRepos, - }); - - const response = await search({ - queryType: 'ir', - query, - options: { - matches: limit, - contextLines: 0, - }, - source: context.source, - }); - - if (isServiceError(response)) { - throw new Error(response.message); - } - - const files = response.files.map((file) => ({ - path: file.fileName.text, - name: file.fileName.text.split('/').pop() ?? file.fileName.text, - repo: file.repository, - revision: ref ?? 'HEAD', - } satisfies GrepFile)); - - const repoInfoMap = Object.fromEntries( - response.repositoryInfo.map((info) => [info.name, { - name: info.name, - displayName: info.displayName ?? info.name, - codeHostType: info.codeHostType, - }]) - ); - - const inputRepoResult = repo ? await getRepoInfoByName(repo) : undefined; - if (isServiceError(inputRepoResult)) { - throw new Error(`Repository "${repo}" not found.`); - } - - const inputRepo = inputRepoResult ? { - name: inputRepoResult.name, - displayName: inputRepoResult.displayName ?? inputRepoResult.name, - codeHostType: inputRepoResult.codeHostType, - } : undefined; - - const metadata: GrepMetadata = { - files, - pattern, - matchCount: response.stats.actualMatchCount, - repoCount: new Set(files.map((f) => f.repo)).size, - repoInfoMap, - inputRepo, - groupByRepo, - }; - - const totalFiles = response.files.length; - const actualMatches = response.stats.actualMatchCount; - - if (totalFiles === 0) { - return { - output: 'No files found', - metadata, - }; - } - - if (groupByRepo) { - const repoCounts = new Map(); - for (const file of response.files) { - const repo = file.repository; - const matchCount = file.chunks.reduce((acc, chunk) => acc + chunk.matchRanges.length, 0); - const existing = repoCounts.get(repo) ?? { matches: 0, files: 0 }; - repoCounts.set(repo, { matches: existing.matches + matchCount, files: existing.files + 1 }); - } - - const outputLines: string[] = [ - `Found matches in ${repoCounts.size} ${repoCounts.size === 1 ? 'repository' : 'repositories'}:`, - ]; - for (const [repoName, { matches, files }] of repoCounts) { - outputLines.push(` ${repoName}: ${matches} ${matches === 1 ? 'match' : 'matches'} in ${files} ${files === 1 ? 'file' : 'files'}`); - } - - if (!response.isSearchExhaustive) { - outputLines.push(''); - outputLines.push(TRUNCATION_MESSAGE); - } - - return { - output: outputLines.join('\n'), - metadata, - // @note: we explicitly do not include sources here because `output` does not - // contain any file sources. We previously _did_ include sources here, but it - // was causing performance issues when a search returned a large (1k+) matches. - sources: undefined, - }; - } else { - const outputLines: string[] = [ - `Found ${actualMatches} match${actualMatches !== 1 ? 'es' : ''} in ${totalFiles} file${totalFiles !== 1 ? 's' : ''}`, - ]; - - for (const file of response.files) { - outputLines.push(''); - outputLines.push(`[${file.repository}] ${file.fileName.text}:`); - for (const chunk of file.chunks) { - chunk.content.split('\n').forEach((content, i) => { - if (!content.trim()) { - return; - } - const lineNum = chunk.contentStart.lineNumber + i; - const line = content.length > MAX_LINE_LENGTH - ? content.substring(0, MAX_LINE_LENGTH) + MAX_LINE_SUFFIX - : content; - outputLines.push(` ${lineNum}: ${line}`); - }); - } - } - - if (!response.isSearchExhaustive) { - outputLines.push(''); - outputLines.push(TRUNCATION_MESSAGE); - } - - const sources: Source[] = files.map((file) => ({ - type: 'file' as const, - repo: file.repo, - path: file.path, - name: file.path.split('/').pop() ?? file.path, - revision: file.revision, - })); - - return { - output: outputLines.join('\n'), - metadata, - sources, - }; - } - }, -}; diff --git a/packages/web/src/features/tools/grep.txt b/packages/web/src/features/tools/grep.txt deleted file mode 100644 index c8f06e477..000000000 --- a/packages/web/src/features/tools/grep.txt +++ /dev/null @@ -1,8 +0,0 @@ -- Fast content search tool that works with any codebase size -- Searches file contents using regular expressions -- Supports full regex syntax (eg. "log.*Error", "function\s+\w+", etc.) -- Filter files by pattern with the include parameter (eg. "*.js", "*.{ts,tsx}") -- Returns file paths and line numbers with at least one match -- Use this tool when you need to find files containing specific patterns -- When using the `repo` param, if the repository name is not known, use `list_repos` first to discover the correct name. -- Use `groupByRepo: true` when searching across many repositories and you want to identify which repos are most relevant before drilling in. This returns a per-repository summary (match and file counts) instead of individual file results, and automatically uses a higher match limit for accuracy. diff --git a/packages/web/src/features/tools/index.ts b/packages/web/src/features/tools/index.ts deleted file mode 100644 index a339ef64b..000000000 --- a/packages/web/src/features/tools/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export * from './readFile'; -export * from './listCommits'; -export * from './listBranches'; -export * from './listRepos'; -export * from './grep'; -export * from './glob'; -export * from './getDiff'; -export * from './findSymbolReferences'; -export * from './findSymbolDefinitions'; -export * from './listTree'; -export * from './createSkill'; -export * from './updateSkill'; -export * from './listSkills'; -export * from './adapters'; -export * from './types'; diff --git a/packages/web/src/features/tools/listBranches.ts b/packages/web/src/features/tools/listBranches.ts deleted file mode 100644 index 5196505e9..000000000 --- a/packages/web/src/features/tools/listBranches.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { z } from "zod"; -import { isServiceError } from "@/lib/utils"; -import { listBranches, ListBranchesResponse } from "@/features/git"; -import { ToolDefinition } from "./types"; -import { logger } from "./logger"; -import description from "./listBranches.txt"; - -const listBranchesShape = { - repo: z.string().describe("The repository to list branches from"), - query: z.string().describe("Filter branches by name (case-insensitive substring match)").optional(), - page: z.number().int().positive().describe("Page number for pagination (min 1). Default: 1").optional().default(1), - perPage: z.number().int().positive().max(100).describe("Results per page for pagination (min 1, max 100). Default: 50").optional().default(50), -}; - -export type ListBranchesMetadata = Pick & { - returnedCount: number; -}; - -export const listBranchesDefinition: ToolDefinition<"list_branches", typeof listBranchesShape, ListBranchesMetadata> = { - name: "list_branches", - title: "List branches", - isReadOnly: true, - isIdempotent: true, - description, - inputSchema: z.object(listBranchesShape), - execute: async (params, _context) => { - logger.debug('list_branches', params); - - const { repo, query, page, perPage } = params; - - const response = await listBranches({ repo, query, page, perPage }); - - if (isServiceError(response)) { - logger.error('list_branches failed', { serviceError: response }); - throw new Error('Failed to list branches.'); - } - - return { - output: JSON.stringify(response), - metadata: { - repo: response.repo, - totalCount: response.totalCount, - returnedCount: response.branches.length, - }, - }; - }, -}; diff --git a/packages/web/src/features/tools/listBranches.txt b/packages/web/src/features/tools/listBranches.txt deleted file mode 100644 index c71828c10..000000000 --- a/packages/web/src/features/tools/listBranches.txt +++ /dev/null @@ -1,9 +0,0 @@ -Lists branches in a repository, sorted by latest commit date (newest first). - -Usage: -- Results come from Sourcebot's most recent local snapshot of the repository, not live from the code host. Branches created or deleted on the code host appear here only after Sourcebot next fetches the repository. -- Use `query` to filter branch names (case-insensitive substring match). -- Use `page`/`perPage` to paginate through large branch lists. Check `totalCount` in the response to know if more pages exist. -- `isDefault` marks the repository's default branch. -- `isIndexed` marks branches that are searchable with code search tools (e.g. `grep`, `glob`). Branches with `isIndexed: false` exist in the repository but cannot be searched. -- If the repository name is not known, use `list_repos` first to discover the correct name. diff --git a/packages/web/src/features/tools/listCommits.ts b/packages/web/src/features/tools/listCommits.ts deleted file mode 100644 index abdb1f59c..000000000 --- a/packages/web/src/features/tools/listCommits.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { z } from "zod"; -import { isServiceError } from "@/lib/utils"; -import { listCommits, ListCommitsResponse } from "@/features/git"; -import { ToolDefinition } from "./types"; -import { logger } from "./logger"; -import description from "./listCommits.txt"; -import { CodeHostType } from "@sourcebot/db"; -import { getRepoInfoByName } from "@/actions"; - -const listCommitsShape = { - repo: z.string().describe("The repository to list commits from"), - query: z.string().describe("Search query to filter commits by message (case-insensitive)").optional(), - since: z.string().describe("Start date for commit range (e.g., '30 days ago', '2024-01-01', 'last week')").optional(), - until: z.string().describe("End date for commit range (e.g., 'yesterday', '2024-12-31', 'today')").optional(), - author: z.string().describe("Filter commits by author name or email (case-insensitive)").optional(), - ref: z.string().describe("Commit SHA, branch or tag name to list commits of. If not provided, uses the default branch.").optional(), - path: z.string().describe("Filter commits to only those that touched this file or directory path (relative to repo root).").optional(), - page: z.number().int().positive().describe("Page number for pagination (min 1). Default: 1").optional().default(1), - perPage: z.number().int().positive().max(100).describe("Results per page for pagination (min 1, max 100). Default: 50").optional().default(50), -}; - -export type ListCommitsRepoInfo = { - name: string; - displayName: string; - codeHostType: CodeHostType; -}; - -export type ListCommitsMetadata = ListCommitsResponse & { - repo: string; - repoInfo: ListCommitsRepoInfo; -}; - -export const listCommitsDefinition: ToolDefinition<"list_commits", typeof listCommitsShape, ListCommitsMetadata> = { - name: "list_commits", - title: "List commits", - isReadOnly: true, - isIdempotent: true, - description, - inputSchema: z.object(listCommitsShape), - execute: async (params, _context) => { - logger.debug('list_commits', params); - - const { repo, query, since, until, author, ref, path, page, perPage } = params; - const skip = (page - 1) * perPage; - - const response = await listCommits({ - repo, - query, - since, - until, - author, - ref, - path, - maxCount: perPage, - skip, - }); - - if (isServiceError(response)) { - throw new Error(response.message); - } - - const repoInfoResult = await getRepoInfoByName(repo); - if (isServiceError(repoInfoResult) || !repoInfoResult) { - throw new Error(`Repository "${repo}" not found.`); - } - const repoInfo: ListCommitsRepoInfo = { - name: repoInfoResult.name, - displayName: repoInfoResult.displayName ?? repoInfoResult.name, - codeHostType: repoInfoResult.codeHostType, - }; - - return { - output: JSON.stringify(response), - metadata: { ...response, repo, repoInfo }, - }; - }, -}; diff --git a/packages/web/src/features/tools/listCommits.txt b/packages/web/src/features/tools/listCommits.txt deleted file mode 100644 index a6b95c1c6..000000000 --- a/packages/web/src/features/tools/listCommits.txt +++ /dev/null @@ -1,10 +0,0 @@ -Lists commits in a repository with optional filtering by message, date range, author, branch, and path. - -Usage: -- Use `query` to search commit messages (case-insensitive). Supports substrings and simple patterns. -- Use `since`/`until` for date filtering. Both ISO 8601 dates (e.g., "2024-01-01") and relative formats (e.g., "30 days ago", "last week", "yesterday") are supported. -- Use `author` to filter by author name or email (case-insensitive, partial match). -- Use `path` to limit results to commits that touched a specific file or directory. -- Use `ref` to list commits on a specific branch, tag, or from a specific commit SHA. Defaults to the default branch. -- Use `page`/`perPage` to paginate through large result sets. Check `totalCount` in the response to know if more pages exist. -- If the repository name is not known, use `list_repos` first to discover the correct name. diff --git a/packages/web/src/features/tools/listRepos.ts b/packages/web/src/features/tools/listRepos.ts deleted file mode 100644 index 8958fcec2..000000000 --- a/packages/web/src/features/tools/listRepos.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { z } from "zod"; -import { isServiceError } from "@/lib/utils"; -import { listRepos } from "@/app/api/(server)/repos/listReposApi"; -import { ToolDefinition } from "./types"; -import { logger } from "./logger"; -import description from './listRepos.txt'; - -const listReposShape = { - query: z.string().describe("Filter repositories by name (case-insensitive)").optional(), - page: z.number().int().positive().describe("Page number for pagination (min 1). Default: 1").optional().default(1), - perPage: z.number().int().positive().max(100).describe("Results per page for pagination (min 1, max 100). Default: 30").optional().default(30), - sort: z.enum(['name', 'pushed']).describe("Sort repositories by 'name' or 'pushed' (most recent commit). Default: 'name'").optional().default('name'), - direction: z.enum(['asc', 'desc']).describe("Sort direction: 'asc' or 'desc'. Default: 'asc'").optional().default('asc'), -}; - -export type ListRepo = { - name: string; - url: string | null; - pushedAt: string | null; - defaultBranch: string | null; - isFork: boolean; - isArchived: boolean; -}; - -export type ListReposMetadata = { - repos: ListRepo[]; - totalCount: number; -}; - -export const listReposDefinition: ToolDefinition< - 'list_repos', - typeof listReposShape, - ListReposMetadata -> = { - name: 'list_repos', - title: 'List repositories', - isReadOnly: true, - isIdempotent: true, - description, - inputSchema: z.object(listReposShape), - execute: async ({ page, perPage, sort, direction, query }, context) => { - logger.debug('list_repos', { page, perPage, sort, direction, query }); - const reposResponse = await listRepos({ - page, - perPage, - sort, - direction, - query, - source: context.source, - }); - - if (isServiceError(reposResponse)) { - throw new Error(reposResponse.message); - } - - const metadata: ListReposMetadata = { - repos: reposResponse.data.map((repo) => ({ - name: repo.repoName, - url: repo.webUrl ?? null, - pushedAt: repo.pushedAt?.toISOString() ?? null, - defaultBranch: repo.defaultBranch ?? null, - isFork: repo.isFork, - isArchived: repo.isArchived, - })), - totalCount: reposResponse.totalCount, - }; - - return { - output: JSON.stringify(metadata), - metadata, - }; - }, -}; diff --git a/packages/web/src/features/tools/listRepos.txt b/packages/web/src/features/tools/listRepos.txt deleted file mode 100644 index 343546d27..000000000 --- a/packages/web/src/features/tools/listRepos.txt +++ /dev/null @@ -1 +0,0 @@ -Lists repositories in the organization with optional filtering and pagination. diff --git a/packages/web/src/features/tools/listSkills.test.ts b/packages/web/src/features/tools/listSkills.test.ts deleted file mode 100644 index d13ca1053..000000000 --- a/packages/web/src/features/tools/listSkills.test.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from "vitest"; - -const mocks = vi.hoisted(() => ({ - authContext: undefined as unknown, - checkAskEntitlement: vi.fn(), - withAuth: vi.fn(), -})); - -vi.mock("@sourcebot/shared", () => ({ - createLogger: () => ({ error: vi.fn(), info: vi.fn(), warn: vi.fn(), debug: vi.fn() }), - env: { AUTH_URL: "https://sourcebot.example.com" }, -})); - -vi.mock("@/features/chat/utils.server", () => ({ - checkAskEntitlement: mocks.checkAskEntitlement, -})); - -vi.mock("@/middleware/withAuth", () => ({ - withAuth: mocks.withAuth, -})); - -// The real listing core runs against a mocked prisma so canEdit / isSynced / -// adopted derivation is exercised end-to-end through the tool. -const { listSkillsDefinition } = await import("./listSkills"); - -function createPrismaMock() { - return { - agentSkill: { - findMany: vi.fn().mockResolvedValue([]), - }, - repo: { - findMany: vi.fn().mockResolvedValue([]), - }, - }; -} - -const personalRow = (overrides: Record = {}) => ({ - id: "personal-1", - slug: "review", - name: "Review", - description: "Personal review.", - enabled: true, - autoEnrolled: false, - createdById: "user-1", - sourceRepoName: null, - ...overrides, -}); - -const sharedRow = (overrides: Record = {}) => ({ - id: "shared-1", - slug: "audit", - name: "Audit", - description: "Shared audit.", - enabled: true, - autoEnrolled: false, - createdById: "user-1", - sourceRepoName: null, - adoptions: [], - ...overrides, -}); - -let prisma: ReturnType; - -beforeEach(() => { - vi.clearAllMocks(); - prisma = createPrismaMock(); - mocks.authContext = { - org: { id: 1 }, - user: { id: "user-1" }, - prisma, - principal: { source: "api_key" }, - }; - mocks.withAuth.mockImplementation(async (callback: (context: unknown) => unknown) => callback(mocks.authContext)); - mocks.checkAskEntitlement.mockResolvedValue(null); -}); - -describe("listSkillsDefinition", () => { - test("has the expected definition flags", () => { - expect(listSkillsDefinition.name).toBe("list_skills"); - expect(listSkillsDefinition.isReadOnly).toBe(true); - expect(listSkillsDefinition.isIdempotent).toBe(true); - expect(listSkillsDefinition.isDestructive).toBe(false); - }); - - test("derives canEdit / isSynced / adopted across personal and shared rows and never returns instructions", async () => { - prisma.agentSkill.findMany - .mockResolvedValueOnce([ - personalRow(), - personalRow({ id: "personal-2", slug: "disabled", name: "Disabled", enabled: false }), - personalRow({ id: "personal-3", slug: "synced", name: "Synced", sourceRepoName: "github.com/acme/widgets" }), - ]) - .mockResolvedValueOnce([ - sharedRow({ adoptions: [{ removedAt: null }] }), - sharedRow({ id: "shared-2", slug: "foreign", name: "Foreign", createdById: "author-2", autoEnrolled: true }), - ]); - prisma.repo.findMany.mockResolvedValue([{ name: "github.com/acme/widgets" }]); - - const result = await listSkillsDefinition.execute({}, { source: "sourcebot-ask-agent" }); - - expect(result.metadata).toEqual({ count: 5 }); - const { skills } = JSON.parse(result.output); - expect(skills).toEqual([ - { id: "personal-1", slug: "review", name: "Review", description: "Personal review.", scope: "personal", enabled: true, isSynced: false, canEdit: true }, - { id: "personal-2", slug: "disabled", name: "Disabled", description: "Personal review.", scope: "personal", enabled: false, isSynced: false, canEdit: false }, - { id: "personal-3", slug: "synced", name: "Synced", description: "Personal review.", scope: "personal", enabled: true, isSynced: true, canEdit: false }, - { id: "shared-1", slug: "audit", name: "Audit", description: "Shared audit.", scope: "shared", enabled: true, adopted: true, isSynced: false, canEdit: true }, - { id: "shared-2", slug: "foreign", name: "Foreign", description: "Shared audit.", scope: "shared", enabled: true, adopted: true, isSynced: false, canEdit: false }, - ]); - }); - - test("hides shared skills synced from a repo the user cannot access", async () => { - prisma.agentSkill.findMany - .mockResolvedValueOnce([]) - .mockResolvedValueOnce([ - sharedRow({ sourceRepoName: "github.com/acme/secret" }), - ]); - prisma.repo.findMany.mockResolvedValue([]); - - const result = await listSkillsDefinition.execute({}, { source: "sourcebot-ask-agent" }); - - expect(result.metadata).toEqual({ count: 0 }); - }); - - test("rejects a repository-scoped access token without listing", async () => { - mocks.authContext = { - org: { id: 1 }, - user: { id: "user-1" }, - prisma, - principal: { source: "scoped_access_token" }, - }; - - await expect(listSkillsDefinition.execute({}, { source: "sourcebot-mcp-server" })) - .rejects.toThrow("Repository-scoped access tokens cannot manage skills."); - expect(prisma.agentSkill.findMany).not.toHaveBeenCalled(); - }); - - test("the scope filter limits the query to one catalog", async () => { - prisma.agentSkill.findMany.mockResolvedValueOnce([personalRow()]); - - const result = await listSkillsDefinition.execute({ scope: "personal" }, { source: "sourcebot-ask-agent" }); - - expect(prisma.agentSkill.findMany).toHaveBeenCalledTimes(1); - expect(result.metadata).toEqual({ count: 1 }); - const { skills } = JSON.parse(result.output); - expect(skills[0].scope).toBe("personal"); - }); -}); diff --git a/packages/web/src/features/tools/listSkills.ts b/packages/web/src/features/tools/listSkills.ts deleted file mode 100644 index 5eca43fd0..000000000 --- a/packages/web/src/features/tools/listSkills.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { z } from "zod"; -import { checkAskEntitlement } from "@/features/chat/utils.server"; -import { listAgentSkillsForContext } from "@/ee/features/chat/skills/skillListing"; -import { isServiceError } from "@/lib/utils"; -import { sew } from "@/middleware/sew"; -import { withAuth } from "@/middleware/withAuth"; -import { ToolDefinition } from "./types"; -import { logger } from "./logger"; -import { scopedTokensCannotManageSkills, toSkillToolError } from "./skillToolShared"; -import description from "./listSkills.txt"; - -const listSkillsShape = { - scope: z.enum(['personal', 'shared']).optional().describe("Filter to one catalog: 'personal' or 'shared'. Omit to list both."), -}; - -export type ListSkillsMetadata = { - count: number; -}; - -export const listSkillsDefinition: ToolDefinition<"list_skills", typeof listSkillsShape, ListSkillsMetadata> = { - name: "list_skills", - title: "List skills", - isReadOnly: true, - isIdempotent: true, - isDestructive: false, - description, - inputSchema: z.object(listSkillsShape), - execute: async (input, _context) => { - logger.debug('list_skills', input); - - const result = await sew(() => - withAuth(async ({ org, user, prisma, principal }) => { - if (principal.source === 'scoped_access_token') { - return scopedTokensCannotManageSkills(); - } - - const askError = await checkAskEntitlement(); - if (askError) { - return askError; - } - - return listAgentSkillsForContext({ - prisma, - userId: user.id, - orgId: org.id, - scope: input.scope, - }); - })); - - if (isServiceError(result)) { - logger.error('list_skills failed', { serviceError: result }); - throw toSkillToolError(result, { - notAuthenticatedMessage: 'Authentication is required to list skills.', - fallbackMessage: 'Failed to list skills.', - }); - } - - return { - output: JSON.stringify({ skills: result }), - metadata: { - count: result.length, - }, - }; - }, -}; diff --git a/packages/web/src/features/tools/listSkills.txt b/packages/web/src/features/tools/listSkills.txt deleted file mode 100644 index 20adba2b1..000000000 --- a/packages/web/src/features/tools/listSkills.txt +++ /dev/null @@ -1,7 +0,0 @@ -Lists the agent skills visible to the requesting user: their personal skills plus the organization's shared skill catalog (including shared skills they have not adopted or authored). - -Usage: -- Use `scope` to list only `personal` or only `shared` skills; omit it to list both. -- Each row carries `slug` and `scope`, the identifier pair `update_skill` needs, plus `enabled`, `isSynced` (linked to a repository file), `canEdit` (whether `update_skill` can edit it), and, on shared rows, `adopted` (whether the skill is active for this user). -- Skill instructions are never included in the results. -- Use this before `create_skill` to avoid slug conflicts, and before `update_skill` to locate the target skill and check whether it is editable. diff --git a/packages/web/src/features/tools/listTree.ts b/packages/web/src/features/tools/listTree.ts deleted file mode 100644 index 6e37ead92..000000000 --- a/packages/web/src/features/tools/listTree.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { getRepoInfoByName } from "@/actions"; -import { FileTreeNode, getTree } from "@/features/git"; -import { isServiceError } from "@/lib/utils"; -import { CodeHostType } from "@sourcebot/db"; -import { z } from "zod"; -import description from "./listTree.txt"; -import { logger } from "./logger"; -import { Source, ToolDefinition } from "./types"; - -const DEFAULT_TREE_DEPTH = 1; -const MAX_TREE_DEPTH = 10; -const DEFAULT_MAX_TREE_ENTRIES = 1000; -const MAX_MAX_TREE_ENTRIES = 10000; - -const listTreeShape = { - repo: z.string().describe("The name of the repository to list files from."), - path: z.string().describe("Directory path (relative to repo root). If omitted, the repo root is used.").optional().default(''), - ref: z.string().describe("Commit SHA, branch or tag name to list files from. If not provided, uses the default branch.").optional().default('HEAD'), - depth: z.number().int().positive().max(MAX_TREE_DEPTH).describe(`How many directory levels to traverse below \`path\` (min 1, max ${MAX_TREE_DEPTH}, default ${DEFAULT_TREE_DEPTH}).`).optional().default(DEFAULT_TREE_DEPTH), - includeFiles: z.boolean().describe("Whether to include files in the output (default: true).").optional().default(true), - includeDirectories: z.boolean().describe("Whether to include directories in the output (default: true).").optional().default(true), - maxEntries: z.number().int().positive().max(MAX_MAX_TREE_ENTRIES).describe(`Maximum number of entries to return (min 1, max ${MAX_MAX_TREE_ENTRIES}, default ${DEFAULT_MAX_TREE_ENTRIES}).`).optional().default(DEFAULT_MAX_TREE_ENTRIES), -}; - -export type ListTreeEntry = { - type: 'tree' | 'blob'; - path: string; - name: string; - parentPath: string; - depth: number; -}; - -export type ListTreeRepoInfo = { - name: string; - displayName: string; - codeHostType: CodeHostType; -}; - -export type ListTreeMetadata = { - repo: string; - repoInfo: ListTreeRepoInfo; - ref: string; - path: string; - totalReturned: number; - truncated: boolean; -}; - -export const listTreeDefinition: ToolDefinition<'list_tree', typeof listTreeShape, ListTreeMetadata> = { - name: 'list_tree', - title: 'List directory tree', - isReadOnly: true, - isIdempotent: true, - description, - inputSchema: z.object(listTreeShape), - execute: async ({ repo, path = '', ref = 'HEAD', depth = DEFAULT_TREE_DEPTH, includeFiles = true, includeDirectories = true, maxEntries = DEFAULT_MAX_TREE_ENTRIES }, context) => { - logger.debug('list_tree', { repo, path, ref, depth, includeFiles, includeDirectories, maxEntries }); - const normalizedPath = normalizeTreePath(path); - const normalizedDepth = Math.min(depth, MAX_TREE_DEPTH); - const normalizedMaxEntries = Math.min(maxEntries, MAX_MAX_TREE_ENTRIES); - - const repoInfoResult = await getRepoInfoByName(repo); - if (isServiceError(repoInfoResult) || !repoInfoResult) { - throw new Error(`Repository "${repo}" not found.`); - } - const repoInfo: ListTreeRepoInfo = { - name: repoInfoResult.name, - displayName: repoInfoResult.displayName ?? repoInfoResult.name, - codeHostType: repoInfoResult.codeHostType, - }; - - if (!includeFiles && !includeDirectories) { - const metadata: ListTreeMetadata = { - repo, - repoInfo, - ref, - path: normalizedPath, - totalReturned: 0, - truncated: false, - }; - return { output: 'No entries found', metadata }; - } - - const queue: Array<{ path: string; depth: number }> = [{ path: normalizedPath, depth: 0 }]; - const queuedPaths = new Set([normalizedPath]); - const seenEntries = new Set(); - const entries: ListTreeEntry[] = []; - let truncated = false; - - while (queue.length > 0 && !truncated) { - const currentDepth = queue[0]!.depth; - const currentLevelPaths: string[] = []; - - while (queue.length > 0 && queue[0]!.depth === currentDepth) { - currentLevelPaths.push(queue.shift()!.path); - } - - const treeResult = await getTree({ - repoName: repo, - revisionName: ref, - paths: currentLevelPaths.filter(Boolean), - }, { source: context.source }); - - if (isServiceError(treeResult)) { - throw new Error(treeResult.message); - } - - const treeNodeIndex = buildTreeNodeIndex(treeResult.tree); - - for (const currentPath of currentLevelPaths) { - const currentNode = currentPath === '' ? treeResult.tree : treeNodeIndex.get(currentPath); - if (!currentNode || currentNode.type !== 'tree') continue; - - for (const child of currentNode.children) { - if (child.type !== 'tree' && child.type !== 'blob') continue; - - const childPath = joinTreePath(currentPath, child.name); - const childDepth = currentDepth + 1; - - if (child.type === 'tree' && childDepth < normalizedDepth && !queuedPaths.has(childPath)) { - queue.push({ path: childPath, depth: childDepth }); - queuedPaths.add(childPath); - } - - if ((child.type === 'blob' && !includeFiles) || (child.type === 'tree' && !includeDirectories)) { - continue; - } - - const key = `${child.type}:${childPath}`; - if (seenEntries.has(key)) continue; - seenEntries.add(key); - - if (entries.length >= normalizedMaxEntries) { - truncated = true; - break; - } - - entries.push({ - type: child.type as 'tree' | 'blob', - path: childPath, - name: child.name, - parentPath: currentPath, - depth: childDepth, - }); - } - - if (truncated) break; - } - } - - const sortedEntries = sortTreeEntries(entries); - const metadata: ListTreeMetadata = { - repo, - repoInfo, - ref, - path: normalizedPath, - totalReturned: sortedEntries.length, - truncated, - }; - - const outputLines = [normalizedPath || '/']; - - const childrenByPath = new Map(); - for (const entry of sortedEntries) { - const siblings = childrenByPath.get(entry.parentPath) ?? []; - siblings.push(entry); - childrenByPath.set(entry.parentPath, siblings); - } - - function renderEntries(parentPath: string) { - const children = childrenByPath.get(parentPath) ?? []; - for (const entry of children) { - const indent = ' '.repeat(entry.depth); - const label = entry.type === 'tree' ? `${entry.name}/` : entry.name; - outputLines.push(`${indent}${label}`); - if (entry.type === 'tree') { - renderEntries(entry.path); - } - } - } - - renderEntries(normalizedPath); - - if (sortedEntries.length === 0) { - outputLines.push(' (no entries found)'); - } - - if (truncated) { - outputLines.push(''); - outputLines.push(`(truncated — showing first ${normalizedMaxEntries} entries)`); - } - - const sources: Source[] = sortedEntries - .filter((entry) => entry.type === 'blob') - .map((entry) => ({ - type: 'file' as const, - repo, - path: entry.path, - name: entry.name, - revision: ref, - })); - - return { output: outputLines.join('\n'), metadata, sources }; - }, -}; - -const normalizeTreePath = (path: string): string => { - const withoutLeading = path.replace(/^\/+/, ''); - return withoutLeading.replace(/\/+$/, ''); -} - -const joinTreePath = (parentPath: string, name: string): string => { - if (!parentPath) { - return name; - } - return `${parentPath}/${name}`; -} - -const buildTreeNodeIndex = (root: FileTreeNode): Map => { - const nodeIndex = new Map(); - - const visit = (node: FileTreeNode, currentPath: string) => { - nodeIndex.set(currentPath, node); - for (const child of node.children) { - visit(child, joinTreePath(currentPath, child.name)); - } - }; - - visit(root, ''); - return nodeIndex; -} - -const sortTreeEntries = (entries: ListTreeEntry[]): ListTreeEntry[] => { - const collator = new Intl.Collator(undefined, { sensitivity: 'base' }); - - return [...entries].sort((a, b) => { - const parentCompare = collator.compare(a.parentPath, b.parentPath); - if (parentCompare !== 0) return parentCompare; - - if (a.type !== b.type) { - return a.type === 'tree' ? -1 : 1; - } - - const nameCompare = collator.compare(a.name, b.name); - if (nameCompare !== 0) return nameCompare; - - return collator.compare(a.path, b.path); - }); -} diff --git a/packages/web/src/features/tools/listTree.txt b/packages/web/src/features/tools/listTree.txt deleted file mode 100644 index 3737ddfd9..000000000 --- a/packages/web/src/features/tools/listTree.txt +++ /dev/null @@ -1,9 +0,0 @@ -Lists files and directories from a repository path. This can be used as a repo tree tool or directory listing tool. Returns a flat list of entries with path metadata and depth relative to the requested path. - -Usage: -- If the repository name is not known, use `list_repos` first to discover the correct name. -- Start with a shallow depth (default: 1) to get a high-level overview, then drill into specific subdirectories as needed. -- Use `path` to scope the listing to a subdirectory rather than fetching the entire tree at once. -- Set `includeFiles: false` to list only directories when you only need the directory structure. -- Set `includeDirectories: false` to list only files when you only need leaf nodes. -- Call this tool in parallel when you need to explore multiple directories simultaneously. diff --git a/packages/web/src/features/tools/logger.ts b/packages/web/src/features/tools/logger.ts deleted file mode 100644 index 2d1bb7dbe..000000000 --- a/packages/web/src/features/tools/logger.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { createLogger } from "@sourcebot/shared"; - -export const logger = createLogger('tool'); diff --git a/packages/web/src/features/tools/readFile.ts b/packages/web/src/features/tools/readFile.ts deleted file mode 100644 index a24b83816..000000000 --- a/packages/web/src/features/tools/readFile.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { z } from "zod"; -import { isServiceError } from "@/lib/utils"; -import { getFileSource } from "@/features/git"; -import { ToolDefinition } from "./types"; -import { logger } from "./logger"; -import description from "./readFile.txt"; -import { CodeHostType } from "@sourcebot/db"; -import { getRepoInfoByName } from "@/actions"; - -// NOTE: if you change these values, update readFile.txt to match. -const READ_FILES_MAX_LINES = 500; -const MAX_LINE_LENGTH = 2000; -const MAX_LINE_SUFFIX = `... (line truncated to ${MAX_LINE_LENGTH} chars)`; -const MAX_BYTES = 5 * 1024; -const MAX_BYTES_LABEL = `${MAX_BYTES / 1024}KB`; - -const readFileShape = { - path: z.string().describe("The path to the file"), - repo: z.string().describe("The repository to read the file from"), - ref: z.string().describe("Commit SHA, branch or tag name to read the file from. If not provided, uses the default branch.").optional().default('HEAD'), - offset: z.number().int().positive() - .optional() - .describe("Line number to start reading from (1-indexed). Omit to start from the beginning."), - limit: z.number().int().positive() - .optional() - .describe(`Maximum number of lines to read (max: ${READ_FILES_MAX_LINES}). Omit to read up to ${READ_FILES_MAX_LINES} lines.`), -}; - -export type ReadFileRepoInfo = { - name: string; - displayName: string; - codeHostType: CodeHostType; -}; - -export type ReadFileMetadata = { - path: string; - repo: string; - repoInfo: ReadFileRepoInfo; - startLine: number; - endLine: number; - isTruncated: boolean; - ref: string; -}; - -export const readFileDefinition: ToolDefinition<"read_file", typeof readFileShape, ReadFileMetadata> = { - name: "read_file", - title: "Read file", - isReadOnly: true, - isIdempotent: true, - description, - inputSchema: z.object(readFileShape), - execute: async ({ path, repo, ref = 'HEAD', offset, limit }, context) => { - logger.debug('read_file', { path, repo, ref, offset, limit }); - - const fileSource = await getFileSource({ - path, - repo, - ref, - }, { source: context.source }); - - if (isServiceError(fileSource)) { - throw new Error(fileSource.message); - } - - const lines = fileSource.source.split('\n'); - const start = (offset ?? 1) - 1; - const end = start + Math.min(limit ?? READ_FILES_MAX_LINES, READ_FILES_MAX_LINES); - - let bytes = 0; - let truncatedByBytes = false; - const slicedLines: string[] = []; - for (const raw of lines.slice(start, end)) { - const line = raw.length > MAX_LINE_LENGTH ? raw.substring(0, MAX_LINE_LENGTH) + MAX_LINE_SUFFIX : raw; - const size = Buffer.byteLength(line, 'utf-8') + (slicedLines.length > 0 ? 1 : 0); - if (bytes + size > MAX_BYTES) { - truncatedByBytes = true; - break; - } - slicedLines.push(line); - bytes += size; - } - - const truncatedByLines = end < lines.length; - const startLine = (offset ?? 1); - const lastReadLine = startLine + slicedLines.length - 1; - const nextOffset = lastReadLine + 1; - - let output = [ - `${fileSource.repo}`, - `${fileSource.path}`, - `${fileSource.externalWebUrl}`, - '\n' - ].join('\n'); - - output += slicedLines.map((line, i) => `${startLine + i}: ${line}`).join('\n'); - - if (truncatedByBytes) { - output += `\n\n(Output capped at ${MAX_BYTES_LABEL}. Showing lines ${startLine}-${lastReadLine} of ${lines.length}. Use offset=${nextOffset} to continue.)`; - } else if (truncatedByLines) { - output += `\n\n(Showing lines ${startLine}-${lastReadLine} of ${lines.length}. Use offset=${nextOffset} to continue.)`; - } else { - output += `\n\n(End of file - ${lines.length} lines total)`; - } - - output += `\n`; - - const repoInfoResult = await getRepoInfoByName(fileSource.repo); - if (isServiceError(repoInfoResult) || !repoInfoResult) { - throw new Error(`Repository "${fileSource.repo}" not found.`); - } - const repoInfo: ReadFileRepoInfo = { - name: repoInfoResult.name, - displayName: repoInfoResult.displayName ?? repoInfoResult.name, - codeHostType: repoInfoResult.codeHostType, - }; - - const metadata: ReadFileMetadata = { - path: fileSource.path, - repo: fileSource.repo, - repoInfo, - startLine, - endLine: lastReadLine, - isTruncated: truncatedByBytes || truncatedByLines, - ref, - }; - - return { - output, - metadata, - sources: [{ - type: 'file', - repo: fileSource.repo, - path: fileSource.path, - name: fileSource.path.split('/').pop() ?? fileSource.path, - revision: ref, - }], - }; - }, -}; diff --git a/packages/web/src/features/tools/readFile.txt b/packages/web/src/features/tools/readFile.txt deleted file mode 100644 index 9e1590bb6..000000000 --- a/packages/web/src/features/tools/readFile.txt +++ /dev/null @@ -1,9 +0,0 @@ -Read the contents of a file in a repository. - -Usage: -- Use offset/limit to read a specific portion of a file, which is strongly preferred for large files when only a specific section is needed. -- Maximum 500 lines per call. Output is also capped at 5KB — if the cap is hit, call again with a larger offset to continue reading. -- Any line longer than 2000 characters is truncated. -- The response content includes the line range read and total line count. If the output was truncated, the next offset to continue reading is also included. -- Call this tool in parallel when you need to read multiple files simultaneously. -- Avoid tiny repeated slices. If you need more context, read a larger window. diff --git a/packages/web/src/features/tools/searchQuery.test.ts b/packages/web/src/features/tools/searchQuery.test.ts deleted file mode 100644 index e60ad03ae..000000000 --- a/packages/web/src/features/tools/searchQuery.test.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { buildGlobSearchQuery, buildGrepSearchQuery } from './searchQuery'; - -describe('buildGrepSearchQuery', () => { - it('preserves spaces and quotes in structured search inputs', () => { - const query = buildGrepSearchQuery({ - pattern: 'call("hello world")', - path: 'src/my dir', - include: 'My Tests/**/*.test.ts', - repo: 'Acme, Platform', - ref: 'feature/my feature', - }); - - expect(query).toEqual({ - and: { - children: [ - { - regexp: { - regexp: 'call("hello world")', - case_sensitive: true, - file_name: false, - content: true, - }, - query: 'regexp', - }, - { - regexp: { - regexp: 'src/my dir', - case_sensitive: true, - file_name: true, - content: false, - }, - query: 'regexp', - }, - { - regexp: { - regexp: 'My Tests\\/((?:[^/]*(?:\\/|$))*)([^/]*)\\.test\\.ts$', - case_sensitive: true, - file_name: true, - content: false, - }, - query: 'regexp', - }, - { - repo_set: { - set: { 'Acme, Platform': true }, - }, - query: 'repo_set', - }, - { - branch: { - pattern: 'feature/my feature', - exact: false, - }, - query: 'branch', - }, - ], - }, - query: 'and', - }); - }); - - it('uses exact selected repository names when no explicit repo is provided', () => { - const query = buildGrepSearchQuery({ - pattern: 'needle', - selectedRepos: ['Repo, One', 'Repo Two'], - }); - - expect(query).toMatchObject({ - and: { - children: [ - { regexp: { regexp: 'needle' } }, - { - repo_set: { - set: { - 'Repo, One': true, - 'Repo Two': true, - }, - }, - }, - ], - }, - }); - }); - - it('keeps a bare content search as a single IR node', () => { - expect(buildGrepSearchQuery({ pattern: 'needle' })).toEqual({ - regexp: { - regexp: 'needle', - case_sensitive: true, - file_name: false, - content: true, - }, - query: 'regexp', - }); - }); -}); - -describe('buildGlobSearchQuery', () => { - it('keeps a glob containing spaces in one file predicate', () => { - const query = buildGlobSearchQuery({ - pattern: 'My Folder/**/*.ts', - path: 'packages/my-dir/[legacy] (copy)+', - }); - - expect(query).toEqual({ - and: { - children: [ - { - regexp: { - regexp: 'My Folder\\/((?:[^/]*(?:\\/|$))*)([^/]*)\\.ts$', - case_sensitive: true, - file_name: true, - content: false, - }, - query: 'regexp', - }, - { - regexp: { - regexp: 'packages/my-dir/\\[legacy\\] \\(copy\\)\\+', - case_sensitive: true, - file_name: true, - content: false, - }, - query: 'regexp', - }, - ], - }, - query: 'and', - }); - }); - - it('preserves the rev:* behavior for searching every branch', () => { - const query = buildGlobSearchQuery({ - pattern: '*.ts', - ref: '*', - }); - - expect(query).toMatchObject({ - and: { - children: [ - { regexp: { file_name: true } }, - { branch: { pattern: '', exact: false } }, - ], - }, - }); - }); -}); diff --git a/packages/web/src/features/tools/searchQuery.ts b/packages/web/src/features/tools/searchQuery.ts deleted file mode 100644 index 4446c3328..000000000 --- a/packages/web/src/features/tools/searchQuery.ts +++ /dev/null @@ -1,128 +0,0 @@ -import globToRegexp from "glob-to-regexp"; -import type { QueryIR } from "@/features/search/ir"; - -type SearchScope = { - repo?: string; - ref?: string; - selectedRepos?: string[]; -}; - -type GrepSearchQuery = SearchScope & { - pattern: string; - path?: string; - include?: string; -}; - -type GlobSearchQuery = SearchScope & { - pattern: string; - path?: string; -}; - -const createRegexpQuery = ({ - regexp, - fileName, - content, -}: { - regexp: string; - fileName: boolean; - content: boolean; -}): QueryIR => ({ - regexp: { - regexp, - case_sensitive: true, - file_name: fileName, - content, - }, - query: "regexp", -}); - -// Keep literal tool inputs compatible with Zoekt's RE2 parser. The generic -// escape-string-regexp package emits hex escapes for some characters. -const escapeRE2Regexp = (value: string): string => value.replace(/[\\.^$|?*+()[\]{}]/g, '\\$&'); - -const globToFileRegexp = (glob: string): string => { - const regexp = globToRegexp(glob, { extended: true, globstar: true }); - return regexp.source.replace(/^\^/, ''); -}; - -const createRepoScopeQuery = ({ repo, selectedRepos }: SearchScope): QueryIR | undefined => { - const repos = repo ? [repo] : selectedRepos; - if (!repos || repos.length === 0) { - return undefined; - } - - return { - repo_set: { - set: Object.fromEntries(repos.map((repoName) => [repoName, true])), - }, - query: "repo_set", - }; -}; - -const createBranchQuery = (ref?: string): QueryIR | undefined => ref ? { - branch: { - pattern: ref === '*' ? '' : ref, - exact: false, - }, - query: "branch", -} : undefined; - -const combineQueries = (queries: Array): QueryIR => { - const children = queries.filter((query): query is QueryIR => query !== undefined); - if (children.length === 1) { - return children[0]; - } - - return { - and: { children }, - query: "and", - }; -}; - -export const buildGrepSearchQuery = ({ - pattern, - path, - include, - repo, - ref, - selectedRepos, -}: GrepSearchQuery): QueryIR => combineQueries([ - createRegexpQuery({ - regexp: pattern, - fileName: false, - content: true, - }), - path ? createRegexpQuery({ - regexp: escapeRE2Regexp(path), - fileName: true, - content: false, - }) : undefined, - include ? createRegexpQuery({ - regexp: globToFileRegexp(include), - fileName: true, - content: false, - }) : undefined, - createRepoScopeQuery({ repo, selectedRepos }), - createBranchQuery(ref), -]); - -export const buildGlobSearchQuery = ({ - pattern, - path, - repo, - ref, - selectedRepos, -}: GlobSearchQuery): QueryIR => combineQueries([ - createRegexpQuery({ - regexp: globToFileRegexp(pattern), - fileName: true, - content: false, - }), - path ? createRegexpQuery({ - regexp: escapeRE2Regexp(path), - fileName: true, - content: false, - }) : undefined, - createRepoScopeQuery({ repo, selectedRepos }), - createBranchQuery(ref), -]); diff --git a/packages/web/src/features/tools/skillToolShared.ts b/packages/web/src/features/tools/skillToolShared.ts deleted file mode 100644 index 5eb312cce..000000000 --- a/packages/web/src/features/tools/skillToolShared.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { env } from "@sourcebot/shared"; -import { ErrorCode } from "@/lib/errorCodes"; -import type { AskSkillAnalyticsSource } from "@/lib/posthogEvents"; -import type { ServiceError } from "@/lib/serviceError"; -import { StatusCodes } from "http-status-codes"; - -// Helpers shared by the skill management tools (create_skill, update_skill, -// list_skills). - -export const toSkillAnalyticsSource = (source: string | undefined): AskSkillAnalyticsSource => - source === 'sourcebot-mcp-server' || source === 'sourcebot-web-client' - ? source - : 'sourcebot-ask-agent'; - -// Repository-scoped access tokens grant access to selected repositories only; -// account-level skill management is outside their documented authorization -// boundary. Every skill tool rejects them in its handler regardless of -// registration-time gating: an MCP session is keyed by its owner, not its -// principal, so a session created with a full credential can later be driven -// by a scoped token for the same user. -export const scopedTokensCannotManageSkills = (): ServiceError => ({ - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS, - message: "Repository-scoped access tokens cannot manage skills.", -}); - -// The settings page supports ?skill= deep links that open the given skill. -export const skillSettingsUrl = (skillId: string): string => - `${env.AUTH_URL.replace(/\/$/, '')}/settings/skills?skill=${encodeURIComponent(skillId)}`; - -/** - * Maps a ServiceError to the tool error both adapters surface to the model. - * Validation, conflict, permission, and entitlement errors keep their - * actionable messages; unexpected failures collapse to a generic message - * (details are already logged server-side by `sew`). - */ -export const toSkillToolError = ( - error: ServiceError, - { notAuthenticatedMessage, fallbackMessage }: { notAuthenticatedMessage: string; fallbackMessage: string }, -): Error => { - if (error.errorCode === ErrorCode.NOT_AUTHENTICATED) { - return new Error(notAuthenticatedMessage); - } - if (error.errorCode === ErrorCode.UNEXPECTED_ERROR) { - return new Error(fallbackMessage); - } - return new Error(error.message); -}; diff --git a/packages/web/src/features/tools/types.ts b/packages/web/src/features/tools/types.ts deleted file mode 100644 index 4be6e4a87..000000000 --- a/packages/web/src/features/tools/types.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { z } from "zod"; - -const fileSourceSchema = z.object({ - type: z.literal('file'), - repo: z.string(), - path: z.string(), - name: z.string(), - revision: z.string(), -}); -export type FileSource = z.infer; - -export const sourceSchema = z.discriminatedUnion('type', [ - fileSourceSchema, -]); -export type Source = z.infer; - -export interface ToolContext { - source?: string; - selectedRepos?: string[]; -} - -export interface ToolDefinition< - TName extends string, - TShape extends z.ZodRawShape, - TMetadata = Record, -> { - name: TName; - title: string; - description: string; - inputSchema: z.ZodObject; - isReadOnly: boolean; - isIdempotent: boolean; - // Whether the tool can destroy or overwrite existing data. Emitted as the - // MCP destructiveHint annotation (which MCP clients default to true for - // non-read-only tools, so additive writes should set this to false). - isDestructive?: boolean; - execute: (input: z.infer>, context: ToolContext) => Promise>; -} - -export interface ToolResult> { - output: string; - metadata: TMetadata; - sources?: Source[]; -} diff --git a/packages/web/src/features/tools/updateSkill.test.ts b/packages/web/src/features/tools/updateSkill.test.ts deleted file mode 100644 index 62173d548..000000000 --- a/packages/web/src/features/tools/updateSkill.test.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from "vitest"; -import { ErrorCode } from "@/lib/errorCodes"; -import { StatusCodes } from "http-status-codes"; - -const mocks = vi.hoisted(() => ({ - authContext: undefined as unknown, - checkAskEntitlement: vi.fn(), - withAuth: vi.fn(), - updateAgentSkillForContext: vi.fn(), -})); - -vi.mock("@sourcebot/shared", () => ({ - createLogger: () => ({ error: vi.fn(), info: vi.fn(), warn: vi.fn(), debug: vi.fn() }), - env: { AUTH_URL: "https://sourcebot.example.com" }, -})); - -vi.mock("@/features/chat/utils.server", () => ({ - checkAskEntitlement: mocks.checkAskEntitlement, -})); - -vi.mock("@/middleware/withAuth", () => ({ - withAuth: mocks.withAuth, -})); - -vi.mock("@/ee/features/chat/skills/skillCreation", () => ({ - updateAgentSkillForContext: mocks.updateAgentSkillForContext, -})); - -const { updateSkillDefinition } = await import("./updateSkill"); - -const updatedSkill = { - id: "skill-1", - scope: "PERSONAL", - slug: "review-pr", - name: "Review PR", - description: "Review a pull request.", - instructions: "Look for correctness issues first.", - enabled: true, - source: null, - createdAt: "2026-01-01T00:00:00.000Z", - updatedAt: "2026-01-02T00:00:00.000Z", -}; - -beforeEach(() => { - vi.clearAllMocks(); - mocks.authContext = { - org: { id: 1 }, - user: { id: "user-1" }, - prisma: {}, - principal: { source: "api_key" }, - }; - mocks.withAuth.mockImplementation(async (callback: (context: unknown) => unknown) => callback(mocks.authContext)); - mocks.checkAskEntitlement.mockResolvedValue(null); - mocks.updateAgentSkillForContext.mockResolvedValue(updatedSkill); -}); - -describe("updateSkillDefinition", () => { - test("has the expected definition flags", () => { - expect(updateSkillDefinition.name).toBe("update_skill"); - expect(updateSkillDefinition.isReadOnly).toBe(false); - expect(updateSkillDefinition.isIdempotent).toBe(true); - expect(updateSkillDefinition.isDestructive).toBe(true); - }); - - test("passes only the provided fields so unspecified fields keep their current values", async () => { - await updateSkillDefinition.execute( - { slug: "Review PR", scope: "personal", name: "Renamed" }, - { source: "sourcebot-ask-agent" }, - ); - - expect(mocks.updateAgentSkillForContext).toHaveBeenCalledWith({ - prisma: {}, - userId: "user-1", - orgId: 1, - // The lookup slug is normalized for forgiveness. - target: { scope: "personal", slug: "review-pr" }, - fields: { name: "Renamed" }, - policy: { sharedManageableBy: "creator", allowSynced: false }, - analytics: { - source: "sourcebot-ask-agent", - entryPoint: "agent_tool", - }, - }); - }); - - test("maps newSlug to the slug field", async () => { - await updateSkillDefinition.execute( - { slug: "review-pr", scope: "shared", newSlug: "review-pr-v2", instructions: "New instructions." }, - { source: "sourcebot-mcp-server" }, - ); - - expect(mocks.updateAgentSkillForContext).toHaveBeenCalledWith(expect.objectContaining({ - target: { scope: "shared", slug: "review-pr" }, - fields: { slug: "review-pr-v2", instructions: "New instructions." }, - analytics: expect.objectContaining({ source: "sourcebot-mcp-server" }), - })); - }); - - test("throws when no skill matches the slug + scope", async () => { - mocks.updateAgentSkillForContext.mockResolvedValue({ - statusCode: StatusCodes.NOT_FOUND, - errorCode: ErrorCode.AGENT_SKILL_NOT_FOUND, - message: "Skill not found.", - }); - - await expect(updateSkillDefinition.execute( - { slug: "ghost", scope: "personal", name: "Renamed" }, - { source: "sourcebot-ask-agent" }, - )).rejects.toThrow("Skill not found."); - }); - - test("throws when the requester is not authenticated", async () => { - mocks.withAuth.mockResolvedValue({ - statusCode: StatusCodes.UNAUTHORIZED, - errorCode: ErrorCode.NOT_AUTHENTICATED, - message: "Not authenticated", - }); - - await expect(updateSkillDefinition.execute( - { slug: "review-pr", scope: "personal", name: "Renamed" }, - { source: "sourcebot-ask-agent" }, - )).rejects.toThrow("Authentication is required to update skills."); - }); - - test("rejects a repository-scoped access token without updating", async () => { - mocks.authContext = { - org: { id: 1 }, - user: { id: "user-1" }, - prisma: {}, - principal: { source: "scoped_access_token" }, - }; - - await expect(updateSkillDefinition.execute( - { slug: "review-pr", scope: "personal", name: "Renamed" }, - { source: "sourcebot-mcp-server" }, - )).rejects.toThrow("Repository-scoped access tokens cannot manage skills."); - expect(mocks.updateAgentSkillForContext).not.toHaveBeenCalled(); - }); - - test("returns the updated skill as JSON output plus UI metadata with the tool's scope", async () => { - const result = await updateSkillDefinition.execute( - { slug: "review-pr", scope: "personal", name: "Review PR" }, - { source: "sourcebot-ask-agent" }, - ); - - const url = "https://sourcebot.example.com/settings/skills?skill=skill-1"; - expect(JSON.parse(result.output)).toEqual({ - id: "skill-1", - slug: "review-pr", - name: "Review PR", - description: "Review a pull request.", - scope: "personal", - enabled: true, - updatedAt: "2026-01-02T00:00:00.000Z", - url, - }); - expect(result.metadata).toEqual({ - id: "skill-1", - slug: "review-pr", - name: "Review PR", - scope: "personal", - url, - }); - }); -}); diff --git a/packages/web/src/features/tools/updateSkill.ts b/packages/web/src/features/tools/updateSkill.ts deleted file mode 100644 index 312e0ce77..000000000 --- a/packages/web/src/features/tools/updateSkill.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { z } from "zod"; -import { checkAskEntitlement } from "@/features/chat/utils.server"; -import { normalizeAgentSkillSlug } from "@/ee/features/chat/skills/types"; -import { updateAgentSkillForContext } from "@/ee/features/chat/skills/skillCreation"; -import { isServiceError } from "@/lib/utils"; -import { sew } from "@/middleware/sew"; -import { withAuth } from "@/middleware/withAuth"; -import { ToolDefinition } from "./types"; -import { logger } from "./logger"; -import { scopedTokensCannotManageSkills, skillSettingsUrl, toSkillToolError, toSkillAnalyticsSource } from "./skillToolShared"; -import description from "./updateSkill.txt"; - -// Same plain-string style as create_skill: the merged result is validated in -// the update core via agentSkillInputSchema. -const updateSkillShape = { - slug: z.string().describe("Current slash command of the skill to update, without the leading '/'."), - scope: z.enum(['personal', 'shared']).describe("Which catalog the skill lives in: 'personal' (your skills) or 'shared' (the organization catalog)."), - name: z.string().optional().describe("New display name, 1-80 characters. Omit to keep the current name."), - newSlug: z.string().optional().describe("New slash command, without the leading '/'. Lowercase letters, numbers, and hyphens; at most 64 characters. Omit to keep the current command."), - description: z.string().optional().describe("New description of when to use the skill, 1-500 characters. Omit to keep the current description."), - instructions: z.string().optional().describe("New markdown instructions, 1-20,000 characters. Omit to keep the current instructions."), -}; - -export type UpdateSkillMetadata = { - id: string; - slug: string; - name: string; - scope: 'personal' | 'shared'; - url: string; -}; - -export const updateSkillDefinition: ToolDefinition<"update_skill", typeof updateSkillShape, UpdateSkillMetadata> = { - name: "update_skill", - title: "Update skill", - isReadOnly: false, - isIdempotent: true, - isDestructive: true, - description, - inputSchema: z.object(updateSkillShape), - execute: async (input, context) => { - logger.debug('update_skill', { slug: input.slug, scope: input.scope }); - - const { slug, scope, name, newSlug, description: newDescription, instructions } = input; - - const result = await sew(() => - withAuth(async ({ org, user, prisma, principal }) => { - if (principal.source === 'scoped_access_token') { - return scopedTokensCannotManageSkills(); - } - - const askError = await checkAskEntitlement(); - if (askError) { - return askError; - } - - return updateAgentSkillForContext({ - prisma, - userId: user.id, - orgId: org.id, - target: { scope, slug: normalizeAgentSkillSlug(slug) }, - fields: { - ...(name !== undefined ? { name } : {}), - ...(newSlug !== undefined ? { slug: newSlug } : {}), - ...(newDescription !== undefined ? { description: newDescription } : {}), - ...(instructions !== undefined ? { instructions } : {}), - }, - policy: { sharedManageableBy: 'creator', allowSynced: false }, - analytics: { - source: toSkillAnalyticsSource(context.source), - entryPoint: 'agent_tool', - }, - }); - })); - - if (isServiceError(result)) { - logger.error('update_skill failed', { serviceError: result }); - throw toSkillToolError(result, { - notAuthenticatedMessage: 'Authentication is required to update skills.', - fallbackMessage: 'Failed to update skill.', - }); - } - - const url = skillSettingsUrl(result.id); - return { - output: JSON.stringify({ - id: result.id, - slug: result.slug, - name: result.name, - description: result.description, - scope, - enabled: result.enabled, - updatedAt: result.updatedAt, - url, - }), - metadata: { - id: result.id, - slug: result.slug, - name: result.name, - scope, - url, - }, - }; - }, -}; diff --git a/packages/web/src/features/tools/updateSkill.txt b/packages/web/src/features/tools/updateSkill.txt deleted file mode 100644 index 8fc650e95..000000000 --- a/packages/web/src/features/tools/updateSkill.txt +++ /dev/null @@ -1,10 +0,0 @@ -Updates an existing agent skill in place. - -Usage: -- ONLY call this tool when the user explicitly asks to change a skill. NEVER rewrite a skill on your own initiative. -- Identify the skill by its current `slug` (without the leading `/`) and `scope` (`personal` or `shared`). Use `list_skills` to discover both. -- All content fields (`name`, `newSlug`, `description`, `instructions`) are optional; omitted fields keep their current values. `newSlug` renames the skill's slash command. -- Personal skills are editable by their owner. Shared skills are editable only by the user who created them, and only while enabled. -- Skills synced from a repository file cannot be edited here; they must be edited in Settings → Skills so they stay linked to their source file. -- This tool never enables/disables a skill and never moves it between the personal and shared catalogs — those actions belong to Settings → Skills. -- Editing a shared skill changes it immediately for everyone in the organization who has adopted it. diff --git a/packages/web/src/features/tools/utils.test.ts b/packages/web/src/features/tools/utils.test.ts deleted file mode 100644 index 56bc0796d..000000000 --- a/packages/web/src/features/tools/utils.test.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { describe, it, expect } from 'vitest'; -import type { z } from 'zod'; -import type { getDiffResponseSchema } from '@/features/git/schemas'; -import { formatDiffAsGitDiff } from './utils'; - -type GetDiffResult = z.infer; - -describe('formatDiffAsGitDiff', () => { - it('should format a simple file change correctly', () => { - const input: GetDiffResult = { - files: [ - { - oldPath: 'file.txt', - newPath: 'file.txt', - hunks: [ - { - oldRange: { start: 1, lines: 3 }, - newRange: { start: 1, lines: 4 }, - heading: undefined, - body: ' context line\n-removed line\n+added line\n context line', - }, - ], - }, - ], - }; - - const expected = `--- a/file.txt -+++ b/file.txt -@@ -1,3 +1,4 @@ - context line --removed line -+added line - context line -`; - - expect(formatDiffAsGitDiff(input)).toBe(expected); - }); - - it('should handle file deletion', () => { - const input: GetDiffResult = { - files: [ - { - oldPath: 'deleted.txt', - newPath: null, - hunks: [ - { - oldRange: { start: 1, lines: 2 }, - newRange: { start: 0, lines: 0 }, - heading: undefined, - body: '-line 1\n-line 2', - }, - ], - }, - ], - }; - - const expected = `--- a/deleted.txt -+++ /dev/null -@@ -1,2 +0,0 @@ --line 1 --line 2 -`; - - expect(formatDiffAsGitDiff(input)).toBe(expected); - }); - - it('should handle file addition', () => { - const input: GetDiffResult = { - files: [ - { - oldPath: null, - newPath: 'new.txt', - hunks: [ - { - oldRange: { start: 0, lines: 0 }, - newRange: { start: 1, lines: 2 }, - heading: undefined, - body: '+line 1\n+line 2', - }, - ], - }, - ], - }; - - const expected = `--- /dev/null -+++ b/new.txt -@@ -0,0 +1,2 @@ -+line 1 -+line 2 -`; - - expect(formatDiffAsGitDiff(input)).toBe(expected); - }); - - it('should include hunk heading when present', () => { - const input: GetDiffResult = { - files: [ - { - oldPath: 'code.ts', - newPath: 'code.ts', - hunks: [ - { - oldRange: { start: 10, lines: 5 }, - newRange: { start: 10, lines: 6 }, - heading: 'function myFunction()', - body: ' function myFunction() {\n+ console.log("new line");\n return true;\n }', - }, - ], - }, - ], - }; - - const expected = `--- a/code.ts -+++ b/code.ts -@@ -10,5 +10,6 @@ function myFunction() - function myFunction() { -+ console.log("new line"); - return true; - } -`; - - expect(formatDiffAsGitDiff(input)).toBe(expected); - }); - - it('should handle multiple files', () => { - const input: GetDiffResult = { - files: [ - { - oldPath: 'file1.txt', - newPath: 'file1.txt', - hunks: [ - { - oldRange: { start: 1, lines: 1 }, - newRange: { start: 1, lines: 2 }, - heading: undefined, - body: ' old\n+new', - }, - ], - }, - { - oldPath: 'file2.txt', - newPath: 'file2.txt', - hunks: [ - { - oldRange: { start: 1, lines: 1 }, - newRange: { start: 1, lines: 1 }, - heading: undefined, - body: ' unchanged', - }, - ], - }, - ], - }; - - const expected = `--- a/file1.txt -+++ b/file1.txt -@@ -1,1 +1,2 @@ - old -+new ---- a/file2.txt -+++ b/file2.txt -@@ -1,1 +1,1 @@ - unchanged -`; - - expect(formatDiffAsGitDiff(input)).toBe(expected); - }); - - it('should handle multiple hunks in a single file', () => { - const input: GetDiffResult = { - files: [ - { - oldPath: 'file.txt', - newPath: 'file.txt', - hunks: [ - { - oldRange: { start: 1, lines: 2 }, - newRange: { start: 1, lines: 2 }, - heading: undefined, - body: ' line 1\n+line 2', - }, - { - oldRange: { start: 10, lines: 2 }, - newRange: { start: 11, lines: 2 }, - heading: undefined, - body: '-line 10\n line 11', - }, - ], - }, - ], - }; - - const expected = `--- a/file.txt -+++ b/file.txt -@@ -1,2 +1,2 @@ - line 1 -+line 2 -@@ -10,2 +11,2 @@ --line 10 - line 11 -`; - - expect(formatDiffAsGitDiff(input)).toBe(expected); - }); -}); diff --git a/packages/web/src/features/tools/utils.ts b/packages/web/src/features/tools/utils.ts deleted file mode 100644 index 0a704dc93..000000000 --- a/packages/web/src/features/tools/utils.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { z } from 'zod'; -import type { getDiffResponseSchema } from '@/features/git/schemas'; - -type DiffResult = z.infer; - -export function formatDiffAsGitDiff(result: DiffResult): string { - let output = ''; - - for (const file of result.files) { - output += file.oldPath ? `--- a/${file.oldPath}\n` : `--- /dev/null\n`; - output += file.newPath ? `+++ b/${file.newPath}\n` : `+++ /dev/null\n`; - - for (const hunk of file.hunks) { - const oldStart = hunk.oldRange.start; - const oldLines = hunk.oldRange.lines; - const newStart = hunk.newRange.start; - const newLines = hunk.newRange.lines; - - output += `@@ -${oldStart},${oldLines} +${newStart},${newLines} @@`; - if (hunk.heading) { - output += ` ${hunk.heading}`; - } - output += '\n'; - - output += hunk.body; - if (!hunk.body.endsWith('\n')) { - output += '\n'; - } - } - } - - return output; -} diff --git a/packages/web/src/features/workerApi/README.md b/packages/web/src/features/workerApi/README.md deleted file mode 100644 index 3134c95c9..000000000 --- a/packages/web/src/features/workerApi/README.md +++ /dev/null @@ -1 +0,0 @@ -This folder contains utilities to interact with the internal worker REST api. See packages/backend/api.ts \ No newline at end of file diff --git a/packages/web/src/features/workerApi/actions.ts b/packages/web/src/features/workerApi/actions.ts deleted file mode 100644 index 32676485a..000000000 --- a/packages/web/src/features/workerApi/actions.ts +++ /dev/null @@ -1,45 +0,0 @@ -'use server'; - -import { sew } from "@/middleware/sew"; -import { captureEvent } from "@/lib/posthog"; -import { githubRateLimited, repositoryNotFound, unexpectedError } from "@/lib/serviceError"; -import { withOptionalAuth } from "@/middleware/withAuth"; -import { env } from "@sourcebot/shared"; -import z from "zod"; - -const WORKER_API_URL = env.WORKER_API_URL; - -export const addGithubRepo = async (owner: string, repo: string) => sew(() => - withOptionalAuth(async () => { - const response = await fetch(`${WORKER_API_URL}/api/experimental/add-github-repo`, { - method: 'POST', - body: JSON.stringify({ owner, repo }), - headers: { - 'Content-Type': 'application/json', - }, - }); - - if (!response.ok) { - if (response.status === 404) { - return repositoryNotFound(`${owner}/${repo}`); - } - if (response.status === 429) { - return githubRateLimited(); - } - return unexpectedError('Failed to add GitHub repo'); - } - - await captureEvent('askgh_repo_index_requested', { - owner, - repo, - repoName: `${owner}/${repo}`, - }); - - const data = await response.json(); - const schema = z.object({ - jobId: z.string(), - repoId: z.number(), - }); - return schema.parse(data); - }) -); diff --git a/packages/web/src/hooks/use-mobile.tsx b/packages/web/src/hooks/use-mobile.tsx deleted file mode 100644 index 2b0fe1dfe..000000000 --- a/packages/web/src/hooks/use-mobile.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from "react" - -const MOBILE_BREAKPOINT = 768 - -export function useIsMobile() { - const [isMobile, setIsMobile] = React.useState(undefined) - - React.useEffect(() => { - const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) - const onChange = () => { - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) - } - mql.addEventListener("change", onChange) - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) - return () => mql.removeEventListener("change", onChange) - }, []) - - return !!isMobile -} diff --git a/packages/web/src/hooks/useBrowserNotification.ts b/packages/web/src/hooks/useBrowserNotification.ts deleted file mode 100644 index 2f07c4c67..000000000 --- a/packages/web/src/hooks/useBrowserNotification.ts +++ /dev/null @@ -1,69 +0,0 @@ -'use client'; - -import { useCallback, useEffect, useState } from 'react'; - -type NotificationPermission = 'default' | 'granted' | 'denied'; - -interface NotificationOptions { - title: string; - body?: string; - icon?: string; - onClick?: () => void; -} - -interface UseBrowserNotificationReturn { - permission: NotificationPermission; - isSupported: boolean; - requestPermission: () => Promise; - showNotification: (options: NotificationOptions) => Notification | null; -} - -export function useBrowserNotification(): UseBrowserNotificationReturn { - const isSupported = typeof window !== 'undefined' && 'Notification' in window; - - const [permission, setPermission] = useState(() => { - if (!isSupported) return 'denied'; - return Notification.permission as NotificationPermission; - }); - - // Sync permission state if it changes externally - useEffect(() => { - if (!isSupported) return; - setPermission(Notification.permission as NotificationPermission); - }, [isSupported]); - - const requestPermission = useCallback(async (): Promise => { - if (!isSupported) return 'denied'; - - const result = await Notification.requestPermission(); - setPermission(result as NotificationPermission); - return result as NotificationPermission; - }, [isSupported]); - - const showNotification = useCallback((options: NotificationOptions): Notification | null => { - if (!isSupported || permission !== 'granted') { - return null; - } - - const notification = new Notification(options.title, { - body: options.body, - icon: options.icon, - }); - - if (options.onClick) { - notification.onclick = () => { - options.onClick?.(); - notification.close(); - }; - } - - return notification; - }, [isSupported, permission]); - - return { - permission, - isSupported, - requestPermission, - showNotification, - }; -} diff --git a/packages/web/src/hooks/useCaptureEvent.ts b/packages/web/src/hooks/useCaptureEvent.ts deleted file mode 100644 index 70652afbe..000000000 --- a/packages/web/src/hooks/useCaptureEvent.ts +++ /dev/null @@ -1,26 +0,0 @@ -'use client'; - -import { CaptureOptions } from "posthog-js"; -import posthog from "posthog-js"; -import { PosthogEvent, PosthogEventMap } from "../lib/posthogEvents"; - -export function captureEvent(event: E, properties: PosthogEventMap[E], options?: CaptureOptions) { - if(!options) { - options = {}; - } - options.send_instantly = true; - posthog.capture(event, properties, options); -} - -/** - * Captures a distinct action as a event and forwards it to the event service - * (i.e., PostHog). - * - * @returns A callback for capturing events. - * @see: https://posthog.com/docs/libraries/js#capturing-events - */ -const useCaptureEvent = () => { - return captureEvent; -} - -export default useCaptureEvent; \ No newline at end of file diff --git a/packages/web/src/hooks/useClickListener.ts b/packages/web/src/hooks/useClickListener.ts deleted file mode 100644 index 3df25035a..000000000 --- a/packages/web/src/hooks/useClickListener.ts +++ /dev/null @@ -1,24 +0,0 @@ -'use client'; - -import { useEffect } from "react"; - -export const useClickListener = (elementSelector: string, onClick: (elementClicked: boolean) => void) => { - useEffect(() => { - const handleClick = (event: MouseEvent) => { - const element = document.querySelector(elementSelector); - - if (element) { - const isElementClicked = element.contains(event.target as Node); - onClick(isElementClicked); - } - }; - - document.addEventListener('click', handleClick); - - return () => { - document.removeEventListener('click', handleClick); - }; - }, [onClick, elementSelector]); - - return null; -} \ No newline at end of file diff --git a/packages/web/src/hooks/useCodeMirrorHighlighter.ts b/packages/web/src/hooks/useCodeMirrorHighlighter.ts deleted file mode 100644 index 0c0b944fb..000000000 --- a/packages/web/src/hooks/useCodeMirrorHighlighter.ts +++ /dev/null @@ -1,86 +0,0 @@ -'use client'; - -import { useMemo } from "react"; -import { tags as t, tagHighlighter } from '@lezer/highlight'; - -export const useCodeMirrorHighlighter = () => { - return useMemo(() => { - return tagHighlighter([ - // Keywords (if, for, class, etc.) - { tag: t.keyword, class: 'text-editor-tag-keyword' }, - - // Names, identifiers, properties - { tag: [t.name, t.deleted, t.character, t.propertyName, t.macroName, t.variableName], class: 'text-editor-tag-name' }, - - // Functions and variable definitions - { tag: [t.function(t.variableName), t.definition(t.variableName)], class: 'text-editor-tag-function' }, - { tag: t.local(t.variableName), class: 'text-editor-tag-variable-local' }, - - // Property definitions - { tag: [t.definition(t.name), t.separator, t.definition(t.propertyName)], class: 'text-editor-tag-definition' }, - - // Labels - { tag: [t.labelName], class: 'text-editor-tag-label' }, - - // Constants and standards - { tag: [t.color, t.constant(t.name), t.standard(t.name)], class: 'text-editor-tag-constant' }, - - // Braces and brackets - { tag: [t.brace], class: 'text-editor-tag-brace' }, - { tag: [t.squareBracket], class: 'text-editor-tag-bracket-square' }, - { tag: [t.angleBracket], class: 'text-editor-tag-bracket-angle' }, - - // Types and classes - { tag: [t.typeName, t.namespace], class: 'text-editor-tag-type' }, - { tag: [t.className], class: 'text-editor-tag-tag' }, - - // Numbers and annotations - { tag: [t.number, t.changed, t.modifier, t.self], class: 'text-editor-tag-number' }, - { tag: [t.annotation], class: 'text-editor-tag-annotation-special' }, - - // Operators - { tag: [t.operator, t.operatorKeyword], class: 'text-editor-tag-operator' }, - - // HTML/XML tags and attributes - { tag: [t.tagName], class: 'text-editor-tag-tag' }, - { tag: [t.attributeName], class: 'text-editor-tag-attribute' }, - - // Strings and quotes - { tag: [t.string], class: 'text-editor-tag-string' }, - { tag: [t.quote], class: 'text-editor-tag-quote' }, - { tag: [t.processingInstruction, t.inserted], class: 'text-editor-tag-processing' }, - - // Special string content - { tag: [t.url, t.escape, t.special(t.string)], class: 'text-editor-tag-string' }, - { tag: [t.regexp], class: 'text-editor-tag-constant' }, - - // Links - { tag: t.link, class: 'text-editor-tag-link underline' }, - - // Meta and comments - { tag: [t.meta], class: 'text-editor-tag-meta' }, - { tag: [t.comment], class: 'text-editor-tag-comment italic' }, - - // Text formatting - { tag: t.strong, class: 'text-editor-tag-emphasis font-bold' }, - { tag: t.emphasis, class: 'text-editor-tag-emphasis italic' }, - { tag: t.strikethrough, class: 'text-editor-tag-emphasis line-through' }, - - // Headings - { tag: t.heading, class: 'text-editor-tag-heading font-bold' }, - { tag: t.special(t.heading1), class: 'text-editor-tag-heading font-bold' }, - { tag: t.heading1, class: 'text-editor-tag-heading font-bold' }, - { tag: [t.heading2, t.heading3, t.heading4], class: 'text-editor-tag-heading font-bold' }, - { tag: [t.heading5, t.heading6], class: 'text-editor-tag-heading' }, - - // Atoms and booleans - { tag: [t.atom, t.bool, t.special(t.variableName)], class: 'text-editor-tag-atom' }, - - // Content separator - { tag: [t.contentSeparator], class: 'text-editor-tag-separator' }, - - // Invalid syntax - { tag: t.invalid, class: 'text-editor-tag-invalid' } - ]); - }, []); -} diff --git a/packages/web/src/hooks/useCodeMirrorLanguageExtension.ts b/packages/web/src/hooks/useCodeMirrorLanguageExtension.ts deleted file mode 100644 index b77ca3216..000000000 --- a/packages/web/src/hooks/useCodeMirrorLanguageExtension.ts +++ /dev/null @@ -1,18 +0,0 @@ -'use client'; - -import { EditorView } from "@codemirror/view"; -import { useExtensionWithDependency } from "./useExtensionWithDependency"; -import { getCodemirrorLanguage } from "@/lib/codemirrorLanguage"; - -export const useCodeMirrorLanguageExtension = (linguistLanguage: string, view: EditorView | undefined) => { - const extension = useExtensionWithDependency( - view ?? null, - () => { - const codemirrorLanguage = getCodemirrorLanguage(linguistLanguage); - return codemirrorLanguage ? codemirrorLanguage : []; - }, - [linguistLanguage] - ); - - return extension; -} diff --git a/packages/web/src/hooks/useCodeMirrorTheme.ts b/packages/web/src/hooks/useCodeMirrorTheme.ts deleted file mode 100644 index 6bbe8f077..000000000 --- a/packages/web/src/hooks/useCodeMirrorTheme.ts +++ /dev/null @@ -1,154 +0,0 @@ -'use client'; - -import { useMemo } from "react"; -import { useThemeNormalized } from "./useThemeNormalized"; -import { - useCodeMirrorHighlighter, -} from "./useCodeMirrorHighlighter"; -import { EditorView } from "@codemirror/view"; -import { syntaxHighlighting } from "@codemirror/language"; -import type { StyleSpec } from 'style-mod'; -import { Extension } from "@codemirror/state"; -import tailwind from "@/tailwind"; - -export const useCodeMirrorTheme = () => { - const { theme } = useThemeNormalized(); - const highlightStyle = useCodeMirrorHighlighter(); - - const cmTheme = useMemo(() => { - const { - background, - foreground, - caret, - selection, - selectionMatch, - gutterBackground, - gutterForeground, - gutterBorder, - gutterActiveForeground, - lineHighlight, - } = tailwind.theme.colors.editor; - - return [ - createThemeExtension({ - theme: theme === 'dark' ? 'dark' : 'light', - settings: { - background, - foreground, - caret, - selection, - selectionMatch, - gutterBackground, - gutterForeground, - gutterBorder, - gutterActiveForeground, - lineHighlight, - fontFamily: tailwind.theme.fontFamily.editor, - fontSize: tailwind.theme.fontSize.editor, - } - }), - syntaxHighlighting(highlightStyle) - ] - }, [highlightStyle, theme]); - - return cmTheme; -} - - -// @see: https://github.com/uiwjs/react-codemirror/blob/e365f7d1f8a0ec2cd88455b7a248f6338c859cc7/themes/theme/src/index.tsx -const createThemeExtension = ({ theme, settings = {} }: CreateThemeOptions): Extension => { - const themeOptions: Record = { - '.cm-gutters': {}, - }; - const baseStyle: StyleSpec = {}; - if (settings.background) { - baseStyle.backgroundColor = settings.background; - } - if (settings.backgroundImage) { - baseStyle.backgroundImage = settings.backgroundImage; - } - if (settings.foreground) { - baseStyle.color = settings.foreground; - } - if (settings.fontSize) { - baseStyle.fontSize = settings.fontSize; - } - if (settings.background || settings.foreground) { - themeOptions['&'] = baseStyle; - } - - if (settings.fontFamily) { - themeOptions['&.cm-editor .cm-scroller'] = { - fontFamily: settings.fontFamily, - }; - } - if (settings.gutterBackground) { - themeOptions['.cm-gutters'].backgroundColor = settings.gutterBackground; - } - if (settings.gutterForeground) { - themeOptions['.cm-gutters'].color = settings.gutterForeground; - } - if (settings.gutterBorder) { - themeOptions['.cm-gutters'].borderRightColor = settings.gutterBorder; - } - - if (settings.caret) { - themeOptions['.cm-content'] = { - caretColor: settings.caret, - }; - themeOptions['.cm-cursor, .cm-dropCursor'] = { - borderLeftColor: settings.caret, - }; - } - - const activeLineGutterStyle: StyleSpec = {}; - if (settings.gutterActiveForeground) { - activeLineGutterStyle.color = settings.gutterActiveForeground; - } - if (settings.lineHighlight) { - themeOptions['.cm-activeLine'] = { - backgroundColor: settings.lineHighlight, - }; - activeLineGutterStyle.backgroundColor = settings.lineHighlight; - } - themeOptions['.cm-activeLineGutter'] = activeLineGutterStyle; - - if (settings.selection) { - themeOptions[ - '&.cm-focused .cm-selectionBackground, & .cm-line::selection, & .cm-selectionLayer .cm-selectionBackground, .cm-content ::selection' - ] = { - background: settings.selection + ' !important', - }; - } - if (settings.selectionMatch) { - themeOptions['& .cm-selectionMatch'] = { - backgroundColor: settings.selectionMatch, - }; - } - const themeExtension = EditorView.theme(themeOptions, { - dark: theme === 'dark', - }); - - return themeExtension; -}; - -interface CreateThemeOptions { - theme: 'light' | 'dark'; - settings: Settings; -} - -interface Settings { - background?: string; - backgroundImage?: string; - foreground?: string; - caret?: string; - selection?: string; - selectionMatch?: string; - lineHighlight?: string; - gutterBackground?: string; - gutterForeground?: string; - gutterActiveForeground?: string; - gutterBorder?: string; - fontFamily?: string; - fontSize?: StyleSpec['fontSize']; -} \ No newline at end of file diff --git a/packages/web/src/hooks/useExtensionWithDependency.ts b/packages/web/src/hooks/useExtensionWithDependency.ts deleted file mode 100644 index f9aca9b76..000000000 --- a/packages/web/src/hooks/useExtensionWithDependency.ts +++ /dev/null @@ -1,40 +0,0 @@ -'use client'; - -import { Compartment, Extension } from "@codemirror/state"; -import { EditorView } from "@codemirror/view"; -import { useEffect, useMemo } from "react"; - -/** - * @see https://thetrevorharmon.com/blog/codemirror-and-react/ - */ -export function useExtensionWithDependency( - view: EditorView | null, - extensionFactory: () => Extension, - deps: unknown[], -) { - const compartment = useMemo(() => new Compartment(), []); - // extensionFactory is intentionally excluded from deps — it only computes the - // initial value. Subsequent updates are handled by compartment.reconfigure() in - // the effect below, keeping the returned extension reference stable across renders. - // eslint-disable-next-line react-hooks/exhaustive-deps - const extension = useMemo(() => compartment.of(extensionFactory()), [compartment]); - - useEffect(() => { - if (view) { - try { - view.dispatch({ - effects: compartment.reconfigure(extensionFactory()), - }); - - // @note: we were getting "RangeError: Position X is out of range for changeset of length Y" errors - // spuriously for some reason. This is a dirty hack to prevent codemirror from crashing the app - // in those cases. - } catch (error) { - console.error(error); - } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, deps); - - return extension; -} \ No newline at end of file diff --git a/packages/web/src/hooks/useHomeView.ts b/packages/web/src/hooks/useHomeView.ts deleted file mode 100644 index 62969e2ba..000000000 --- a/packages/web/src/hooks/useHomeView.ts +++ /dev/null @@ -1,38 +0,0 @@ -'use client'; - -import { useCallback, useState } from "react"; -import { HOME_VIEW_COOKIE_NAME } from "@/lib/constants"; - -export type HomeView = "search" | "ask"; - -const COOKIE_NAME = HOME_VIEW_COOKIE_NAME; - -function getHomeViewFromCookie(defaultHomeView: HomeView): HomeView { - if (typeof document === "undefined") { - return defaultHomeView; - } - const cookies = document.cookie.split(';').map(c => c.trim()); - const cookie = cookies.find(c => c.startsWith(`${COOKIE_NAME}=`)); - const value = cookie?.substring(`${COOKIE_NAME}=`.length) as HomeView | undefined; - return value ?? defaultHomeView; -} - -function setHomeViewCookie(value: HomeView) { - if (typeof document === "undefined") { - return; - } - const expires = new Date(); - expires.setFullYear(expires.getFullYear() + 1); - document.cookie = `${COOKIE_NAME}=${value}; expires=${expires.toUTCString()}; path=/; SameSite=Lax`; -} - -export const useHomeView = (defaultHomeView: HomeView): [HomeView, (value: HomeView) => void] => { - const [homeView, setHomeViewState] = useState(() => getHomeViewFromCookie(defaultHomeView)); - - const setHomeView = useCallback((value: HomeView) => { - setHomeViewState(value); - setHomeViewCookie(value); - }, []); - - return [homeView, setHomeView]; -}; diff --git a/packages/web/src/hooks/useIsMac.ts b/packages/web/src/hooks/useIsMac.ts deleted file mode 100644 index 075d97670..000000000 --- a/packages/web/src/hooks/useIsMac.ts +++ /dev/null @@ -1,13 +0,0 @@ -'use client'; - -import { useState, useEffect } from 'react'; - -export function useIsMac(): boolean { - const [isMac, setIsMac] = useState(false); - - useEffect(() => { - setIsMac(/Mac OS X/.test(navigator.userAgent)); - }, []); - - return isMac; -} diff --git a/packages/web/src/hooks/useKeymapExtension.ts b/packages/web/src/hooks/useKeymapExtension.ts deleted file mode 100644 index 3898f173e..000000000 --- a/packages/web/src/hooks/useKeymapExtension.ts +++ /dev/null @@ -1,26 +0,0 @@ -'use client'; - -import { EditorView, keymap } from "@uiw/react-codemirror"; -import { useExtensionWithDependency } from "./useExtensionWithDependency"; -import { useKeymapType } from "./useKeymapType"; -import { defaultKeymap } from "@codemirror/commands"; -import { vim } from "@replit/codemirror-vim"; - -export const useKeymapExtension = (view: EditorView | undefined) => { - const [keymapType] = useKeymapType(); - - const extension = useExtensionWithDependency( - view ?? null, - () => { - switch (keymapType) { - case "default": - return keymap.of(defaultKeymap); - case "vim": - return vim(); - } - }, - [keymapType] - ); - - return extension; -} \ No newline at end of file diff --git a/packages/web/src/hooks/useKeymapType.ts b/packages/web/src/hooks/useKeymapType.ts deleted file mode 100644 index 4042e1f8c..000000000 --- a/packages/web/src/hooks/useKeymapType.ts +++ /dev/null @@ -1,9 +0,0 @@ -'use client'; - -import { KeymapType } from "@/lib/types"; -import { useLocalStorage } from "usehooks-ts"; - -export const useKeymapType = (): [KeymapType, (keymapType: KeymapType) => void] => { - const [keymapType, setKeymapType] = useLocalStorage("keymapType", "default", { initializeWithValue: false }); - return [ keymapType, setKeymapType ]; -} \ No newline at end of file diff --git a/packages/web/src/hooks/useNonEmptyQueryParam.ts b/packages/web/src/hooks/useNonEmptyQueryParam.ts deleted file mode 100644 index 0f21ebf6a..000000000 --- a/packages/web/src/hooks/useNonEmptyQueryParam.ts +++ /dev/null @@ -1,33 +0,0 @@ -'use client'; - -import { useSearchParams } from "next/navigation"; -import { useMemo } from "react"; - -/** - * Helper hook that returns the value of a query parameter if it is: - * a) defined, and - * b) non-empty - * - * otherwise it returns undefined. - * - * For example, let's assume we are calling `useNonEmptyQueryParam('bar')`: - * - `/foo?bar=hello` -> `hello` - * - `/foo?bar=` -> `undefined` - * - `/foo` -> `undefined` - */ -export const useNonEmptyQueryParam = (param: string) => { - const searchParams = useSearchParams(); - const paramValue = useMemo(() => { - return getSearchParam(param, searchParams); - }, [param, searchParams]); - - return paramValue; -}; - -/** - * @see useNonEmptyQueryParam - */ -export const getSearchParam = (param: string, searchParams: URLSearchParams | null) => { - const paramValue = searchParams?.get(param) ?? undefined; - return (paramValue !== undefined && paramValue.length > 0) ? paramValue : undefined; -} \ No newline at end of file diff --git a/packages/web/src/hooks/useSearchHistory.ts b/packages/web/src/hooks/useSearchHistory.ts deleted file mode 100644 index 2deb6974b..000000000 --- a/packages/web/src/hooks/useSearchHistory.ts +++ /dev/null @@ -1,24 +0,0 @@ -'use client'; - -import { useMemo } from "react"; -import { useLocalStorage } from "usehooks-ts"; - -type Search = { - query: string; - date: string; -} - -export const useSearchHistory = () => { - const [_searchHistory, setSearchHistory] = useLocalStorage("searchHistory", []); - - const searchHistory = useMemo(() => { - return _searchHistory.toSorted((a, b) => { - return new Date(b.date).getTime() - new Date(a.date).getTime(); - }); - }, [_searchHistory]); - - return { - searchHistory, - setSearchHistory, - } -} \ No newline at end of file diff --git a/packages/web/src/hooks/useThemeNormalized.ts b/packages/web/src/hooks/useThemeNormalized.ts deleted file mode 100644 index 9feb9926d..000000000 --- a/packages/web/src/hooks/useThemeNormalized.ts +++ /dev/null @@ -1,22 +0,0 @@ -'use client'; - -import { useTheme as useThemeBase } from "next-themes"; -import { useMemo } from "react"; - -export const useThemeNormalized = (defaultTheme: "light" | "dark" = "light") => { - const { theme: _theme, systemTheme, setTheme } = useThemeBase(); - - const theme = useMemo(() => { - if (_theme === "system") { - return systemTheme ?? defaultTheme; - } - - return _theme ?? defaultTheme; - }, [_theme, systemTheme, defaultTheme]); - - return { - theme, - systemTheme, - setTheme, - }; -} \ No newline at end of file diff --git a/packages/web/src/httpMetrics.integration.test.ts b/packages/web/src/httpMetrics.integration.test.ts deleted file mode 100644 index 10c7029ad..000000000 --- a/packages/web/src/httpMetrics.integration.test.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { afterAll, describe, expect, it } from 'vitest'; -import { createServer, Server } from 'node:http'; -import { initRouteTable, startHttpMetrics } from './httpMetrics'; -import { registry } from './promClient'; - -const app = createServer((_req, res) => { - res.writeHead(200); - res.end('ok'); -}); - -// Stands in for the real metrics server: requests to it must not be recorded, -// since the diagnostics channels are process-wide and would otherwise make -// every scrape observe itself. -const metricsServer = createServer((_req, res) => { - res.writeHead(200); - res.end('# metrics'); -}); - -const listen = (server: Server): Promise => { - return new Promise(resolve => { - server.listen(0, () => resolve((server.address() as { port: number }).port)); - }); -}; - -afterAll(() => { - app.close(); - metricsServer.close(); -}); - -const countLines = (output: string): string[] => { - return output.split('\n').filter(line => line.startsWith('http_request_duration_seconds_count')); -}; - -describe('httpMetrics', () => { - it('records durations per route pattern and ignores the metrics port', async () => { - // The table is injected rather than read from disk so the test doesn't - // depend on a prior `next build` having produced routes-manifest.json. - initRouteTable({ - staticRoutes: [{ page: '/api/health' }], - dynamicRoutes: [{ page: '/browse/[...path]', regex: '^/browse/(.+?)(?:/)?$' }], - rewrites: { - afterFiles: [{ source: '/api/mcp', regex: '^/api/mcp(?:/)?$' }], - }, - }); - - // Both servers take an ephemeral port, then the metrics port is published - // to env before subscribing, so the test never depends on a fixed port. - const metricsPort = await listen(metricsServer); - const appPort = await listen(app); - process.env.WEB_METRICS_PORT = String(metricsPort); - - startHttpMetrics(); - - await fetch(`http://127.0.0.1:${appPort}/api/health`); - await fetch(`http://127.0.0.1:${appPort}/browse/github.com/a/b/-/blob/x.ts`); - await fetch(`http://127.0.0.1:${appPort}/browse/github.com/c/d/-/blob/y.ts`); - await fetch(`http://127.0.0.1:${appPort}/api/mcp`); - await fetch(`http://127.0.0.1:${metricsPort}/metrics`); - - // The finish channel fires after the response is flushed to the client. - await new Promise(resolve => setTimeout(resolve, 100)); - - const metrics = await registry.metrics(); - const counts = countLines(metrics); - - expect(counts.some(line => line.includes('route="/api/health"'))).toBe(true); - expect(counts.some(line => line.includes('route="/api/mcp"'))).toBe(true); - expect(counts.some(line => line.includes('status="200"'))).toBe(true); - - // Two distinct file paths must collapse to the single route-pattern series. - const browse = counts.filter(line => line.includes('route="/browse/[...path]"')); - expect(browse).toHaveLength(1); - expect(browse[0].trim().endsWith('2')).toBe(true); - - // Keep enough resolution to distinguish the long-tail stalls this - // metric is intended to expose rather than collapsing them into +Inf. - for (const upperBound of [15, 20, 30, 60]) { - expect(metrics).toContain(`le="${upperBound}"`); - } - - // The scrape of the metrics port must not be recorded. Asserted on the - // total observation count rather than on the absence of a `/metrics` - // label: `/metrics` is not a known route, so it would land in `other` - // and an absent-label check would pass even with the filter removed. - const total = counts.reduce((sum, line) => sum + Number(line.trim().split(' ').pop()), 0); - expect(total).toBe(4); - expect(counts.some(line => line.includes('route="other"'))).toBe(false); - }); -}); diff --git a/packages/web/src/httpMetrics.test.ts b/packages/web/src/httpMetrics.test.ts deleted file mode 100644 index a594a0c42..000000000 --- a/packages/web/src/httpMetrics.test.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { buildRouteTable, initRouteTable, normalizeRoute } from './httpMetrics'; - -// Mirrors the shape and ordering of the real .next/routes-manifest.json: -// dynamic routes are listed in Next's resolution priority, with catch-alls -// after specific routes and the root catch-all last. -const table = buildRouteTable({ - staticRoutes: [ - { page: '/' }, - { page: '/search' }, - { page: '/repos' }, - { page: '/api/health' }, - { page: '/api/commits' }, - ], - dynamicRoutes: [ - { page: '/api/auth/[...nextauth]', regex: '^/api/auth/(.+?)(?:/)?$' }, - { page: '/api/repos/[repoId]/image', regex: '^/api/repos/([^/]+?)/image(?:/)?$' }, - { page: '/api/[...slug]', regex: '^/api/(.+?)(?:/)?$' }, - { page: '/browse/[...path]', regex: '^/browse/(.+?)(?:/)?$' }, - { page: '/settings/[...slug]', regex: '^/settings/(.+?)(?:/)?$' }, - { page: '/[...slug]', regex: '^/(.+?)(?:/)?$' }, - ], - rewrites: { - afterFiles: [ - { source: '/ingest/:path*', regex: '^/ingest(?:/(.+?))?(?:/)?$' }, - { source: '/.well-known/oauth-authorization-server', regex: '^/\\.well-known/oauth-authorization-server(?:/)?$' }, - { source: '/.well-known/oauth-protected-resource/:path*', regex: '^/\\.well-known/oauth-protected-resource(?:/(.+?))?(?:/)?$' }, - { source: '/register', regex: '^/register(?:/)?$' }, - { source: '/api/mcp', regex: '^/api/mcp(?:/)?$' }, - { source: '/scim/v2/:path*', regex: '^/scim/v2(?:/(.+?))?(?:/)?$' }, - ], - }, -}); - -const maxLabels = table.staticPages.size - + table.dynamicRoutes.length - + table.beforeFilesRewrites.length - + table.afterFilesRewrites.length - + table.fallbackRewrites.length - + 2; // + '/_next', 'other' - -describe('normalizeRoute', () => { - it('discards a previously loaded table when initialization fails', () => { - expect(initRouteTable({ - staticRoutes: [{ page: '/api/health' }], - dynamicRoutes: [], - })).toBe(true); - expect(normalizeRoute('/api/health')).toBe('/api/health'); - - expect(initRouteTable({ - staticRoutes: [], - dynamicRoutes: [{ page: '/broken', regex: '[' }], - })).toBe(false); - expect(normalizeRoute('/api/health')).toBe('other'); - }); - - it('maps the root path', () => { - expect(normalizeRoute('/', table)).toBe('/'); - expect(normalizeRoute('', table)).toBe('/'); - }); - - it('matches static routes exactly', () => { - expect(normalizeRoute('/api/health', table)).toBe('/api/health'); - expect(normalizeRoute('/search', table)).toBe('/search'); - }); - - it('labels dynamic routes with their route pattern', () => { - expect(normalizeRoute('/api/auth/callback/github', table)).toBe('/api/auth/[...nextauth]'); - expect(normalizeRoute('/api/repos/42/image', table)).toBe('/api/repos/[repoId]/image'); - expect(normalizeRoute('/settings/connections/42', table)).toBe('/settings/[...slug]'); - }); - - it('respects manifest ordering: specific routes win over catch-alls', () => { - // /api/auth/... must hit [...nextauth], not the /api/[...slug] catch-all. - expect(normalizeRoute('/api/auth/session', table)).toBe('/api/auth/[...nextauth]'); - // Unknown API paths fall through to the catch-all that actually serves them. - expect(normalizeRoute('/api/not-a-real-route', table)).toBe('/api/[...slug]'); - }); - - it('labels rewritten paths with their public source pattern', () => { - expect(normalizeRoute('/api/mcp', table)).toBe('/api/mcp'); - expect(normalizeRoute('/scim/v2/Users/42', table)).toBe('/scim/v2/:path*'); - expect(normalizeRoute('/.well-known/oauth-authorization-server', table)) - .toBe('/.well-known/oauth-authorization-server'); - expect(normalizeRoute('/.well-known/oauth-protected-resource/api/mcp', table)) - .toBe('/.well-known/oauth-protected-resource/:path*'); - expect(normalizeRoute('/register', table)).toBe('/register'); - expect(normalizeRoute('/ingest/events', table)).toBe('/ingest/:path*'); - }); - - it('matches rewrites in Next routing order', () => { - const precedenceTable = buildRouteTable({ - staticRoutes: [ - { page: '/docs' }, - { page: '/api/health' }, - ], - dynamicRoutes: [ - { page: '/api/[...slug]', regex: '^/api/(.+?)(?:/)?$' }, - { page: '/browse/[...path]', regex: '^/browse/(.+?)(?:/)?$' }, - ], - rewrites: { - beforeFiles: [{ source: '/docs/:path*', regex: '^/docs(?:/(.+?))?(?:/)?$' }], - afterFiles: [{ source: '/api/:path*', regex: '^/api/(.+?)(?:/)?$' }], - fallback: [{ source: '/:path*', regex: '^/(.+?)(?:/)?$' }], - }, - }); - - expect(normalizeRoute('/docs', precedenceTable)).toBe('/docs/:path*'); - expect(normalizeRoute('/api/health', precedenceTable)).toBe('/api/health'); - expect(normalizeRoute('/api/mcp', precedenceTable)).toBe('/api/:path*'); - expect(normalizeRoute('/browse/org/repo', precedenceTable)).toBe('/browse/[...path]'); - expect(normalizeRoute('/unmatched', precedenceTable)).toBe('/:path*'); - }); - - it('collapses unbounded repository and file paths to one label', () => { - const a = normalizeRoute('/browse/github.com/org/repo/-/blob/src/index.ts', table); - const b = normalizeRoute('/browse/github.com/other/repo/-/blob/lib/other.ts', table); - - expect(a).toBe('/browse/[...path]'); - expect(b).toBe(a); - }); - - it('is unaffected by trailing or duplicate slashes', () => { - expect(normalizeRoute('/search/', table)).toBe('/search'); - expect(normalizeRoute('//search//', table)).toBe('/search'); - expect(normalizeRoute('/api/health/', table)).toBe('/api/health'); - }); - - it('labels asset requests /_next without consulting the table', () => { - expect(normalizeRoute('/_next/static/chunks/main.js', table)).toBe('/_next'); - expect(normalizeRoute('/_next/image', undefined)).toBe('/_next'); - }); - - it('reports everything as other when no table is loaded', () => { - expect(normalizeRoute('/api/health', undefined)).toBe('other'); - expect(normalizeRoute('/search', undefined)).toBe('other'); - }); - - describe('cardinality bounding', () => { - it('routes scanner traffic to catch-alls, not new labels', () => { - expect(normalizeRoute('/wp-admin', table)).toBe('/[...slug]'); - expect(normalizeRoute('/.env', table)).toBe('/[...slug]'); - expect(normalizeRoute('/api/12345', table)).toBe('/api/[...slug]'); - }); - - it('reports unmatched paths as other when there is no root catch-all', () => { - const noCatchAll = buildRouteTable({ - staticRoutes: [{ page: '/search' }], - dynamicRoutes: [{ page: '/api/[...slug]', regex: '^/api/(.+?)(?:/)?$' }], - }); - - expect(normalizeRoute('/wp-admin', noCatchAll)).toBe('other'); - expect(normalizeRoute('/api/anything', noCatchAll)).toBe('/api/[...slug]'); - }); - - it('stays bounded under scanner traffic', () => { - const hostile: string[] = []; - for (let i = 0; i < 1000; i++) { - hostile.push(`/scan-${i}`); - hostile.push(`/api/scan-${i}`); - hostile.push(`/${i}/${i}/${i}`); - } - - const labels = new Set(hostile.map(p => normalizeRoute(p, table))); - - // 3,000 distinct hostile paths produce exactly the two catch-all labels. - expect(labels).toEqual(new Set(['/[...slug]', '/api/[...slug]'])); - }); - - it('never exceeds the table-derived bound for any input', () => { - const paths = [ - '/', '/search', '/repos', '/browse/a/b/c', '/api/health', - '/api/commits', '/api/auth/session', '/_next/static/x.js', - '/api/mcp', '/scim/v2/Users/42', '/ingest/events', - '/wp-admin', '/api/bogus', '/random', '/..%2f', '/a/b/c/d/e', - ]; - for (let i = 0; i < 500; i++) { - paths.push(`/junk${i}`, `/api/junk${i}`); - } - - const labels = new Set(paths.map(p => normalizeRoute(p, table))); - - expect(labels.size).toBeLessThanOrEqual(maxLabels); - expect(labels).toContain('/api/health'); - }); - }); -}); diff --git a/packages/web/src/httpMetrics.ts b/packages/web/src/httpMetrics.ts deleted file mode 100644 index 6d8adc0ba..000000000 --- a/packages/web/src/httpMetrics.ts +++ /dev/null @@ -1,230 +0,0 @@ -import { createLogger, env } from '@sourcebot/shared'; -import { subscribe } from 'node:diagnostics_channel'; -import { readFileSync } from 'node:fs'; -import type { IncomingMessage, ServerResponse } from 'node:http'; -import path from 'node:path'; -import { httpRequestDuration } from './promClient'; - -const logger = createLogger('web-http-metrics'); - -interface RoutesManifest { - staticRoutes: { page: string }[]; - dynamicRoutes: { page: string; regex: string }[]; - rewrites?: { - beforeFiles?: { source: string; regex: string }[]; - afterFiles?: { source: string; regex: string }[]; - fallback?: { source: string; regex: string }[]; - }; -} - -interface RewriteRoute { - source: string; - regex: RegExp; -} - -interface RouteTable { - staticPages: Set; - dynamicRoutes: { page: string; regex: RegExp }[]; - beforeFilesRewrites: RewriteRoute[]; - afterFilesRewrites: RewriteRoute[]; - fallbackRewrites: RewriteRoute[]; -} - -const OTHER_ROUTE = 'other'; - -const matchRewrite = (pathname: string, rewrites: RewriteRoute[]): string | undefined => { - return rewrites.find(rewrite => rewrite.regex.test(pathname))?.source; -}; - -/** - * Builds a route matcher from Next's routes-manifest. The manifest lists every - * defined route with a matching regex, ordered by Next's own resolution - * priority (specific routes before catch-alls), so first-match-wins here - * agrees with how the server actually routes the request. - */ -export const buildRouteTable = (manifest: RoutesManifest): RouteTable => { - const buildRewrites = (rewrites: { source: string; regex: string }[] | undefined): RewriteRoute[] => { - return (rewrites ?? []).map(rewrite => ({ - source: rewrite.source, - regex: new RegExp(rewrite.regex), - })); - }; - - return { - staticPages: new Set(manifest.staticRoutes.map(route => route.page)), - dynamicRoutes: manifest.dynamicRoutes.map(route => ({ - page: route.page, - regex: new RegExp(route.regex), - })), - beforeFilesRewrites: buildRewrites(manifest.rewrites?.beforeFiles), - afterFilesRewrites: buildRewrites(manifest.rewrites?.afterFiles), - fallbackRewrites: buildRewrites(manifest.rewrites?.fallback), - }; -}; - -let routeTable: RouteTable | undefined; - -/** - * Loads the route table from the build's routes-manifest. Next's standalone - * server chdirs to the app directory on boot, so the manifest sits at - * `.next/routes-manifest.json` relative to cwd. - * - * Deriving routes from the manifest (rather than a hardcoded list) keeps the - * label set in sync with the app automatically: new routes appear at build - * time, and the label is the route or rewrite pattern itself - * (`/browse/[...path]`), so cardinality is bounded by the number of defined - * routes and rewrites no matter what gets requested. - */ -export const initRouteTable = (manifest?: RoutesManifest): boolean => { - try { - const resolved = manifest ?? (JSON.parse( - readFileSync(path.join(process.cwd(), '.next', 'routes-manifest.json'), 'utf-8'), - ) as RoutesManifest); - routeTable = buildRouteTable(resolved); - const rewriteCount = routeTable.beforeFilesRewrites.length - + routeTable.afterFilesRewrites.length - + routeTable.fallbackRewrites.length; - logger.info( - `Route table loaded: ${routeTable.staticPages.size} static, ${routeTable.dynamicRoutes.length} dynamic, ${rewriteCount} rewrite routes.`, - ); - return true; - } catch (error) { - // Fail closed: without a table every request is labelled `other`, which - // loses granularity but can never grow the label set. - routeTable = undefined; - logger.error(`Failed to load routes-manifest; all routes will be reported as '${OTHER_ROUTE}': ${error}`); - return false; - } -}; - -/** - * Maps a request path to its route pattern. The raw path can't be used as a - * label: repository and file paths are unbounded, so `/browse/...` would mint - * a new time series for every file anyone views, and unknown paths (scanners, - * bots) would grow the set without limit. Matching against the app's own - * routes bounds the label set to the number of defined routes and rewrite - * sources plus `/_next` and `other`. - */ -export const normalizeRoute = (pathname: string, table: RouteTable | undefined = routeTable): string => { - const segments = pathname.split('/').filter(segment => segment.length > 0); - if (segments.length === 0) { - return '/'; - } - - // Asset requests are real traffic but not manifest routes. - if (segments[0] === '_next') { - return '/_next'; - } - - if (!table) { - return OTHER_ROUTE; - } - - const canonical = `/${segments.join('/')}`; - - // Preserve Next's routing order. Rewrite source patterns are the stable, - // public-facing route labels; resolving destinations here would require - // duplicating Next's parameter interpolation and rewrite chaining. - const beforeFilesRewrite = matchRewrite(canonical, table.beforeFilesRewrites); - if (beforeFilesRewrite) { - return beforeFilesRewrite; - } - - if (table.staticPages.has(canonical)) { - return canonical; - } - - const afterFilesRewrite = matchRewrite(canonical, table.afterFilesRewrites); - if (afterFilesRewrite) { - return afterFilesRewrite; - } - - for (const route of table.dynamicRoutes) { - if (route.regex.test(canonical)) { - return route.page; - } - } - - const fallbackRewrite = matchRewrite(canonical, table.fallbackRewrites); - if (fallbackRewrite) { - return fallbackRewrite; - } - - return OTHER_ROUTE; -}; - -interface RequestStartMessage { - response?: ServerResponse; - socket?: { localPort?: number }; -} - -interface ResponseFinishMessage { - request?: IncomingMessage; - response?: ServerResponse; -} - -const startTimes = new WeakMap(); -let subscribed = false; - -/** - * Records request durations by subscribing to Node's built-in HTTP diagnostics - * channels. Next.js owns the server instance in a standalone build, so there's - * no request pipeline to wrap; these channels observe every request without - * patching anything. - * - * Requests to the metrics port are skipped — the channels are process-wide, so - * without that filter every scrape would record itself. - */ -export const startHttpMetrics = (): void => { - if (subscribed) { - return; - } - subscribed = true; - - if (!routeTable) { - initRouteTable(); - } - - const metricsPort = Number(env.WEB_METRICS_PORT); - - subscribe('http.server.request.start', (message) => { - try { - const { response, socket } = message as RequestStartMessage; - if (!response || socket?.localPort === metricsPort) { - return; - } - startTimes.set(response, performance.now()); - } catch (error) { - logger.debug(`Failed to record request start: ${error}`); - } - }); - - subscribe('http.server.response.finish', (message) => { - try { - const { request, response } = message as ResponseFinishMessage; - if (!request || !response) { - return; - } - - const startedAt = startTimes.get(response); - if (startedAt === undefined) { - return; - } - startTimes.delete(response); - - const pathname = (request.url ?? '/').split('?')[0]; - httpRequestDuration.observe( - { - method: request.method ?? 'UNKNOWN', - route: normalizeRoute(pathname), - status: response.statusCode, - }, - (performance.now() - startedAt) / 1000, - ); - } catch (error) { - logger.debug(`Failed to record request duration: ${error}`); - } - }); - - logger.info('HTTP request duration metrics enabled.'); -}; diff --git a/packages/web/src/initialize.test.ts b/packages/web/src/initialize.test.ts deleted file mode 100644 index 1b839ba41..000000000 --- a/packages/web/src/initialize.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - captureException: vi.fn(), - logger: { - error: vi.fn(), - warn: vi.fn(), - info: vi.fn(), - debug: vi.fn(), - }, - startChangelogPollingJob: vi.fn(), - startServicePingCronJob: vi.fn(), - syncWithLighthouse: vi.fn(), - warmModelCapabilitiesCatalog: vi.fn(), -})); - -vi.mock('@/prisma', () => ({ - __unsafePrisma: {}, -})); - -vi.mock('@/features/billing/servicePing', () => ({ - startServicePingCronJob: mocks.startServicePingCronJob, - syncWithLighthouse: mocks.syncWithLighthouse, -})); - -vi.mock('@/features/changelog/pollChangelog', () => ({ - startChangelogPollingJob: mocks.startChangelogPollingJob, -})); - -vi.mock('@sourcebot/shared', () => ({ - createLogger: () => mocks.logger, - env: {}, -})); - -vi.mock('./lib/constants', () => ({ - SINGLE_TENANT_ORG_ID: 1, -})); - -vi.mock('@/features/chat/utils.server', () => ({ - warmModelCapabilitiesCatalog: mocks.warmModelCapabilitiesCatalog, -})); - -vi.mock('@sentry/nextjs', () => ({ - captureException: mocks.captureException, -})); - -import { initialize } from './initialize'; - -describe('initialize', () => { - beforeEach(() => { - vi.clearAllMocks(); - mocks.syncWithLighthouse.mockResolvedValue(undefined); - }); - - test('refreshes the license before starting background jobs', async () => { - await initialize(); - - expect(mocks.syncWithLighthouse).toHaveBeenCalledWith(1); - expect(mocks.syncWithLighthouse.mock.invocationCallOrder[0]) - .toBeLessThan(mocks.startServicePingCronJob.mock.invocationCallOrder[0]!); - expect(mocks.startServicePingCronJob).toHaveBeenCalledOnce(); - expect(mocks.startChangelogPollingJob).toHaveBeenCalledOnce(); - expect(mocks.warmModelCapabilitiesCatalog).toHaveBeenCalledOnce(); - }); - - test('logs and reports a failed license refresh without blocking startup', async () => { - const error = new Error('Lighthouse unavailable'); - mocks.syncWithLighthouse.mockRejectedValue(error); - - await expect(initialize()).resolves.toBeUndefined(); - - expect(mocks.logger.error).toHaveBeenCalledWith( - 'Startup Lighthouse sync failed: Lighthouse unavailable', - ); - expect(mocks.captureException).toHaveBeenCalledWith(error); - expect(mocks.startServicePingCronJob).toHaveBeenCalledOnce(); - expect(mocks.startChangelogPollingJob).toHaveBeenCalledOnce(); - expect(mocks.warmModelCapabilitiesCatalog).toHaveBeenCalledOnce(); - }); -}); diff --git a/packages/web/src/initialize.ts b/packages/web/src/initialize.ts deleted file mode 100644 index 95acd33be..000000000 --- a/packages/web/src/initialize.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { __unsafePrisma } from "@/prisma"; -import { startServicePingCronJob, syncWithLighthouse } from '@/features/billing/servicePing'; -import { startChangelogPollingJob } from '@/features/changelog/pollChangelog'; -import { createLogger, env } from "@sourcebot/shared"; -import { SINGLE_TENANT_ORG_ID } from './lib/constants'; -import { warmModelCapabilitiesCatalog } from '@/features/chat/utils.server'; -import * as Sentry from '@sentry/nextjs'; - -const logger = createLogger('web-initialize'); - -const syncDeprecatedEnvVars = async () => { - // Sync member approval setting from env var (only if explicitly set) - if (env.REQUIRE_APPROVAL_NEW_MEMBERS !== undefined) { - const requireApprovalNewMembers = env.REQUIRE_APPROVAL_NEW_MEMBERS === 'true'; - const org = await __unsafePrisma.org.findUnique({ where: { id: SINGLE_TENANT_ORG_ID } }); - if (org && org.memberApprovalRequired !== requireApprovalNewMembers) { - await __unsafePrisma.org.update({ - where: { id: org.id }, - data: { memberApprovalRequired: requireApprovalNewMembers }, - }); - logger.info(`Member approval requirement set to ${requireApprovalNewMembers} via REQUIRE_APPROVAL_NEW_MEMBERS environment variable`); - } - } - - // Sync credentials (email + password) login setting from the (deprecated) env var (only if explicitly set) - if (env.AUTH_CREDENTIALS_LOGIN_ENABLED !== undefined) { - const isCredentialsLoginEnabled = env.AUTH_CREDENTIALS_LOGIN_ENABLED === 'true'; - const org = await __unsafePrisma.org.findUnique({ where: { id: SINGLE_TENANT_ORG_ID } }); - if (org && org.isCredentialsLoginEnabled !== isCredentialsLoginEnabled) { - await __unsafePrisma.org.update({ - where: { id: org.id }, - data: { isCredentialsLoginEnabled }, - }); - logger.info(`Credentials login set to ${isCredentialsLoginEnabled} via AUTH_CREDENTIALS_LOGIN_ENABLED environment variable`); - } - } - - // Sync email code login setting from the (deprecated) env var (only if explicitly set) - if (env.AUTH_EMAIL_CODE_LOGIN_ENABLED !== undefined) { - const isEmailCodeLoginEnabled = env.AUTH_EMAIL_CODE_LOGIN_ENABLED === 'true'; - const org = await __unsafePrisma.org.findUnique({ where: { id: SINGLE_TENANT_ORG_ID } }); - if (org && org.isEmailCodeLoginEnabled !== isEmailCodeLoginEnabled) { - await __unsafePrisma.org.update({ - where: { id: org.id }, - data: { isEmailCodeLoginEnabled }, - }); - logger.info(`Email code login set to ${isEmailCodeLoginEnabled} via AUTH_EMAIL_CODE_LOGIN_ENABLED environment variable`); - } - } - - // Sync anonymous access setting from the (deprecated) env var (only if explicitly set) - if (env.FORCE_ENABLE_ANONYMOUS_ACCESS !== undefined) { - const isAnonymousAccessEnabled = env.FORCE_ENABLE_ANONYMOUS_ACCESS === 'true'; - const org = await __unsafePrisma.org.findUnique({ where: { id: SINGLE_TENANT_ORG_ID } }); - if (org && org.isAnonymousAccessEnabled !== isAnonymousAccessEnabled) { - await __unsafePrisma.org.update({ - where: { id: org.id }, - data: { isAnonymousAccessEnabled }, - }); - logger.info(`Anonymous access set to ${isAnonymousAccessEnabled} via FORCE_ENABLE_ANONYMOUS_ACCESS environment variable`); - } - } -} - -export const initialize = async (): Promise => { - await syncDeprecatedEnvVars(); - - try { - await syncWithLighthouse(SINGLE_TENANT_ORG_ID); - } catch (error) { - logger.error(`Startup Lighthouse sync failed: ${error instanceof Error ? error.message : String(error)}`); - Sentry.captureException(error); - } - - startServicePingCronJob(); - startChangelogPollingJob(); - warmModelCapabilitiesCatalog(); -}; diff --git a/packages/web/src/instrumentation-client.ts b/packages/web/src/instrumentation-client.ts deleted file mode 100644 index 7bcbc385f..000000000 --- a/packages/web/src/instrumentation-client.ts +++ /dev/null @@ -1,30 +0,0 @@ -// This file configures the initialization of Sentry on the client. -// The config you add here will be used whenever a users loads a page in their browser. -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ -// -// Must be named `instrumentation-client.ts`. Next.js loads this file itself, whereas -// `sentry.client.config.ts` is only picked up by @sentry/nextjs' webpack plugin, -// which never runs since `next build` defaults to Turbopack. - -import * as Sentry from "@sentry/nextjs"; - -if (!!process.env.NEXT_PUBLIC_SENTRY_WEBAPP_DSN && !!process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT) { - Sentry.init({ - dsn: process.env.NEXT_PUBLIC_SENTRY_WEBAPP_DSN, - environment: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT, - integrations: [ - Sentry.browserProfilingIntegration(), - ], - tracesSampleRate: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT === 'development' ? 1.0 : 0.1, - // Evaluated once per `Sentry.init()`, i.e. once per page load. - profileSessionSampleRate: 1.0, - // Profile only while a sampled root span is active, rather than continuously. - profileLifecycle: 'trace', - }); -} else { - console.debug("[client] Sentry was not initialized"); -} - -// Instruments App Router client-side navigations as spans. Next.js only reads this -// export from `instrumentation-client.ts`. A no-op when Sentry is uninitialized. -export const onRouterTransitionStart = Sentry.captureRouterTransitionStart; diff --git a/packages/web/src/instrumentation.ts b/packages/web/src/instrumentation.ts deleted file mode 100644 index 52720b490..000000000 --- a/packages/web/src/instrumentation.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as Sentry from '@sentry/nextjs'; -import type { ServerResponse } from 'node:http'; - -export async function register() { - if (process.env.NEXT_RUNTIME === 'nodejs') { - await import('./sentry.server.config'); - } - - if (process.env.NEXT_RUNTIME === 'edge') { - await import('./sentry.edge.config'); - } - - if (process.env.NEXT_RUNTIME === 'nodejs') { - // Proxied rewrites (`/ingest/*` for PostHog, the `/monitoring` Sentry - // tunnel) legitimately attach 11 `close` listeners to each response: 9 - // from Next's rewrite proxy plus 2 from Sentry. That crosses Node's - // default limit of 10 and logs a MaxListenersExceededWarning on every - // such request, even though the listeners are released with the - // response. The request start channel fires before Next handles the - // request, and scoping the raise to responses keeps the warning - // meaningful for every other emitter. This can be removed once Next - // trims its proxy listeners. - // @see: https://github.com/vercel/next.js/issues/97757 - const { subscribe } = await import('node:diagnostics_channel'); - subscribe('http.server.request.start', (message) => { - (message as { response?: ServerResponse }).response?.setMaxListeners(20); - }); - - const { startMetricsServer } = await import('./metricsServer'); - startMetricsServer(); - - const { startHttpMetrics } = await import('./httpMetrics'); - startHttpMetrics(); - } - - if (process.env.NEXT_RUNTIME === 'nodejs') { - const { initialize } = await import('./initialize'); - await initialize(); - } -} - -export const onRequestError = Sentry.captureRequestError; diff --git a/packages/web/src/lib/anonymousId.ts b/packages/web/src/lib/anonymousId.ts deleted file mode 100644 index 0a97e312a..000000000 --- a/packages/web/src/lib/anonymousId.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { cookies } from 'next/headers'; -import { v4 as uuidv4 } from 'uuid'; - -const ANONYMOUS_ID_COOKIE_NAME = 'sb.anonymous-id'; -const COOKIE_MAX_AGE = 60 * 60 * 24 * 365; // 1 year in seconds - -/** - * Gets the anonymous session ID from the cookie, or creates one if it doesn't exist. - * This is used to track ownership of chats created by anonymous (non-authenticated) users. - */ -export const getOrCreateAnonymousId = async (): Promise => { - const cookieStore = await cookies(); - const existingId = cookieStore.get(ANONYMOUS_ID_COOKIE_NAME)?.value; - - if (existingId) { - return existingId; - } - - const newId = uuidv4(); - cookieStore.set(ANONYMOUS_ID_COOKIE_NAME, newId, { - httpOnly: true, - secure: process.env.NODE_ENV === 'production', - sameSite: 'lax', - maxAge: COOKIE_MAX_AGE, - path: '/', - }); - - return newId; -}; - -/** - * Gets the anonymous session ID from the cookie if it exists. - * Returns undefined if no anonymous ID has been set. - */ -export const getAnonymousId = async (): Promise => { - const cookieStore = await cookies(); - return cookieStore.get(ANONYMOUS_ID_COOKIE_NAME)?.value; -}; diff --git a/packages/web/src/lib/apiHandler.test.ts b/packages/web/src/lib/apiHandler.test.ts deleted file mode 100644 index 681f64cdb..000000000 --- a/packages/web/src/lib/apiHandler.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { describe, expect, test, vi } from 'vitest'; -import { NextRequest } from 'next/server'; -import { apiHandler } from './apiHandler'; -import { getCurrentRequest } from './requestContext'; - -vi.mock('./posthog', () => ({ - captureEvent: vi.fn(), -})); - -describe('apiHandler', () => { - test('stores the current request while the handler runs', async () => { - const request = new NextRequest('https://sourcebot.example.com/api/test', { - method: 'POST', - }); - - const handler = apiHandler(async (_request: NextRequest) => { - expect(getCurrentRequest()).toBe(request); - await Promise.resolve(); - expect(getCurrentRequest()).toBe(request); - - return new Response(null, { status: 204 }); - }); - - const response = await handler(request); - - expect(response.status).toBe(204); - expect(getCurrentRequest()).toBeUndefined(); - }); -}); diff --git a/packages/web/src/lib/apiHandler.ts b/packages/web/src/lib/apiHandler.ts deleted file mode 100644 index 5d36d8d14..000000000 --- a/packages/web/src/lib/apiHandler.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { NextRequest } from 'next/server'; -import { captureEvent } from './posthog'; -import { runWithRequestContext } from './requestContext'; - -interface ApiHandlerConfig { - /** - * Whether to track this API request in PostHog. - * @default true - */ - track?: boolean; -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type AnyHandler = (...args: any[]) => Promise | Response; - -/** - * Creates an API route handler with automatic request tracking. - * - * @example - * // Simple handler - * export const GET = apiHandler(async (request) => { - * return Response.json({ data: 'hello' }); - * }); - * - * @example - * // Handler with route params - * export const GET = apiHandler(async (request, { params }) => { - * const { id } = await params; - * return Response.json({ id }); - * }); - * - * @example - * // Disable tracking (for health checks, etc.) - * export const GET = apiHandler(async () => { - * return Response.json({ status: 'ok' }); - * }, { track: false }); - */ -export function apiHandler( - handler: H, - config: ApiHandlerConfig = {} -): H { - const { track = true } = config; - - const wrappedHandler = async (request: NextRequest, ...rest: unknown[]) => - runWithRequestContext(request, async () => { - if (track) { - const path = request.nextUrl.pathname; - const method = request.method; - const source = request.headers.get('X-Sourcebot-Client-Source') ?? 'unknown'; - - // Fire and forget - don't await to avoid blocking the request - captureEvent('api_request', { path, method, source }); - } - - // Call the original handler with all arguments - return handler(request, ...rest); - }); - - return wrappedHandler as H; -} diff --git a/packages/web/src/lib/bullmqClient.ts b/packages/web/src/lib/bullmqClient.ts deleted file mode 100644 index a891bf4bd..000000000 --- a/packages/web/src/lib/bullmqClient.ts +++ /dev/null @@ -1,11 +0,0 @@ -import 'server-only'; - -import { BullMQClient } from '@sourcebot/shared'; -import { getRedisClient } from './redis'; - -let client: BullMQClient | undefined; - -export function getBullMQClient() { - client ??= new BullMQClient(getRedisClient()); - return client; -} diff --git a/packages/web/src/lib/codeHighlight.ts b/packages/web/src/lib/codeHighlight.ts deleted file mode 100644 index 8fbcc7b8c..000000000 --- a/packages/web/src/lib/codeHighlight.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { Parser } from '@lezer/common'; -import { LanguageDescription, StreamLanguage } from '@codemirror/language'; -import { Highlighter, highlightTree } from '@lezer/highlight'; -import { languages as builtinLanguages } from '@codemirror/language-data'; - -const plainTextLanguage = StreamLanguage.define({ - token(stream) { - stream.next(); - return null; - }, -}); - -export const getCodeParserByLanguageName = async (languageName: string): Promise => { - if (!languageName) { - return plainTextLanguage.parser; - } - const found = LanguageDescription.matchLanguageName(builtinLanguages, languageName, true); - if (!found) { - return plainTextLanguage.parser; - } - if (!found.support) { - await found.load(); - } - return found.support ? found.support.language.parser : plainTextLanguage.parser; -}; - -export const getCodeParserByFilename = async (filename: string): Promise => { - const found = LanguageDescription.matchFilename(builtinLanguages, filename); - if (!found) { - return plainTextLanguage.parser; - } - if (!found.support) { - await found.load(); - } - return found.support ? found.support.language.parser : plainTextLanguage.parser; -}; - -export async function highlightCode( - languageName: string, - input: string, - highlighter: Highlighter, - highlightRanges: { from: number; to: number }[] = [], - callback: ( - text: string, - style: string | null, - from: number, - to: number, - ) => Output, -): Promise { - const parser = await getCodeParserByLanguageName(languageName); - - const convertRangeToHighlightedSubranges = ( - from: number, - to: number, - classes: string | null, - cb: (from: number, to: number, classes: string | null) => void, - ) => { - type HighlightRange = { - from: number; - to: number; - isHighlighted: boolean; - }; - - const highlightClasses = classes - ? `${classes} searchMatch-selected` - : 'searchMatch-selected'; - - let currentRange: HighlightRange | null = null; - for (let i = from; i < to; i++) { - const isHighlighted = isIndexHighlighted(i, highlightRanges); - - if (currentRange) { - if (currentRange.isHighlighted === isHighlighted) { - currentRange.to = i + 1; - } else { - cb( - currentRange.from, - currentRange.to, - currentRange.isHighlighted ? highlightClasses : classes, - ); - - currentRange = { from: i, to: i + 1, isHighlighted }; - } - } else { - currentRange = { from: i, to: i + 1, isHighlighted }; - } - } - - if (currentRange) { - cb( - currentRange.from, - currentRange.to, - currentRange.isHighlighted ? highlightClasses : classes, - ); - } - }; - - const tree = parser.parse(input); - const output: Array = []; - - let pos = 0; - highlightTree(tree, highlighter, (from, to, classes) => { - // `highlightTree` only calls this callback when at least one style/class - // is applied to the text (i.e., `classes` is not empty). This means that - // any unstyled regions will be skipped (e.g., whitespace, `=`. `;`. etc). - // This check ensures that we process these unstyled regions as well. - // @see: https://discuss.codemirror.net/t/static-highlighting-using-cm-v6/3420/2 - if (from > pos) { - convertRangeToHighlightedSubranges(pos, from, null, (from, to, classes) => { - output.push(callback(input.slice(from, to), classes, from, to)); - }); - } - - convertRangeToHighlightedSubranges(from, to, classes, (from, to, classes) => { - output.push(callback(input.slice(from, to), classes, from, to)); - }); - - pos = to; - }); - - if (pos !== tree.length) { - convertRangeToHighlightedSubranges(pos, tree.length, null, (from, to, classes) => { - output.push(callback(input.slice(from, to), classes, from, to)); - }); - } - return output; -} - -const isIndexHighlighted = (index: number, ranges: { from: number; to: number }[]) => { - return ranges.some((range) => index >= range.from && index < range.to); -}; diff --git a/packages/web/src/lib/codemirrorLanguage.ts b/packages/web/src/lib/codemirrorLanguage.ts deleted file mode 100644 index 74ee60723..000000000 --- a/packages/web/src/lib/codemirrorLanguage.ts +++ /dev/null @@ -1,231 +0,0 @@ -import { StreamLanguage, LanguageSupport } from "@codemirror/language"; - -// CodeMirror 6 languages -import { brainfuck } from "codemirror-lang-brainfuck"; // 3rd party -import { css } from "@codemirror/lang-css"; -import { cpp } from "@codemirror/lang-cpp"; -import { dot } from "@viz-js/lang-dot"; // 3rd party -import { csharp } from "@replit/codemirror-lang-csharp"; // 3rd party -import { elixir } from "codemirror-lang-elixir"; // 3rd party -import { go } from "@codemirror/lang-go"; -import { graphqlLanguageSupport } from "cm6-graphql"; // 3rd party -import { handlebarsLanguage } from "@xiechao/codemirror-lang-handlebars" -import { hcl } from "codemirror-lang-hcl"; // 3rd party -import { html } from "@codemirror/lang-html"; -import { j } from "codemirror-lang-j"; // 3rd party -import { java } from "@codemirror/lang-java"; -import { javascript } from "@codemirror/lang-javascript"; -import { jq } from "codemirror-lang-jq"; // 3rd party -import { json } from "@codemirror/lang-json"; -import { jsonc } from "@shopify/lang-jsonc"; // 3rd party -import { less } from "@codemirror/lang-less"; -import { liquid } from "@codemirror/lang-liquid"; -import { makefile } from "codemirror-lang-makefile"; // 3rd party -import { markdown } from "@codemirror/lang-markdown"; -import { mermaid } from "codemirror-lang-mermaid"; // 3rd party -import { nix } from "@replit/codemirror-lang-nix" // 3rd party -// import { perl } from "codemirror-lang-perl"; // 3rd party (not working?) -import { php } from "@codemirror/lang-php"; -import { prolog } from "codemirror-lang-prolog"; // 3rd party (comments are broken) -import { python } from "@codemirror/lang-python"; -// import { r } from "codemirror-lang-r" // 3rd party (not working?) -import { rust } from "@codemirror/lang-rust"; -import { sass } from "@codemirror/lang-sass"; -import { solidity } from "@replit/codemirror-lang-solidity"; // 3rd party -import { sparql } from "codemirror-lang-sparql"; // 3rd party -import { spreadsheet } from "codemirror-lang-spreadsheet"; // 3rd party -import { sql } from "@codemirror/lang-sql"; -import { svelte } from "@replit/codemirror-lang-svelte"; // 3rd party -import { tcl } from "@sourcebot/codemirror-lang-tcl"; -import { twig } from "@ssddanbrown/codemirror-lang-twig"; // 3rd party -import { vue } from "@codemirror/lang-vue"; -import { wast } from "@codemirror/lang-wast"; -import { wgsl } from "@iizukak/codemirror-lang-wgsl"; // 3rd party -import { xml } from "@codemirror/lang-xml" -import { yaml } from "@codemirror/lang-yaml"; -import { zig } from "codemirror-lang-zig"; // 3rd party - -// Legacy CodeMirror 5 modes -// https://codemirror.net/5/mode/ -import { apl } from "@codemirror/legacy-modes/mode/apl"; -// import { asn1 } from "@codemirror/legacy-modes/mode/asn1"; // this seems to be broken -import { ceylon } from "@codemirror/legacy-modes/mode/clike"; -import { clojure } from "@codemirror/legacy-modes/mode/clojure"; -import { cmake } from "@codemirror/legacy-modes/mode/cmake"; -import { cobol } from "@codemirror/legacy-modes/mode/cobol"; -import { coffeeScript } from "@codemirror/legacy-modes/mode/coffeescript"; -import { commonLisp } from "@codemirror/legacy-modes/mode/commonlisp"; -import { crystal } from "@codemirror/legacy-modes/mode/crystal"; -import { cypher } from "@codemirror/legacy-modes/mode/cypher"; -import { d } from "@codemirror/legacy-modes/mode/d"; -import { dart } from "@codemirror/legacy-modes/mode/clike"; -// import { django } from "@codemirror/legacy-modes/mode/django"; // not present anymore -import { dockerFile } from "@codemirror/legacy-modes/mode/dockerfile"; -import { diff } from "@codemirror/legacy-modes/mode/diff"; -import { elm } from "@codemirror/legacy-modes/mode/elm"; -import { erlang } from "@codemirror/legacy-modes/mode/erlang"; -import { fortran } from "@codemirror/legacy-modes/mode/fortran"; -import { gherkin } from "@codemirror/legacy-modes/mode/gherkin"; -import { groovy } from "@codemirror/legacy-modes/mode/groovy"; -import { haskell } from "@codemirror/legacy-modes/mode/haskell"; -import { idl } from "@codemirror/legacy-modes/mode/idl"; -import { jinja2 } from "@codemirror/legacy-modes/mode/jinja2"; -import { julia } from "@codemirror/legacy-modes/mode/julia"; -import { kotlin } from "@codemirror/legacy-modes/mode/clike"; -import { liveScript } from "@codemirror/legacy-modes/mode/livescript"; -import { lua } from "@codemirror/legacy-modes/mode/lua"; -import { nesC } from "@codemirror/legacy-modes/mode/clike"; -import { nginx } from "@codemirror/legacy-modes/mode/nginx"; -import { objectiveC } from "@codemirror/legacy-modes/mode/clike"; -import { objectiveCpp } from "@codemirror/legacy-modes/mode/clike"; -import { octave } from "@codemirror/legacy-modes/mode/octave"; -import { pascal } from "@codemirror/legacy-modes/mode/pascal"; -import { perl } from "@codemirror/legacy-modes/mode/perl"; -import { powerShell } from "@codemirror/legacy-modes/mode/powershell"; -import { protobuf } from "@codemirror/legacy-modes/mode/protobuf"; -import { pug } from "@codemirror/legacy-modes/mode/pug"; -import { puppet } from "@codemirror/legacy-modes/mode/puppet"; -import { r } from "@codemirror/legacy-modes/mode/r"; -import { rpmSpec } from "@codemirror/legacy-modes/mode/rpm"; -import { ruby } from "@codemirror/legacy-modes/mode/ruby"; -import { scala } from "@codemirror/legacy-modes/mode/clike"; -import { scheme } from "@codemirror/legacy-modes/mode/scheme"; -import { shader } from "@codemirror/legacy-modes/mode/clike"; -import { shell } from "@codemirror/legacy-modes/mode/shell"; -import { squirrel } from "@codemirror/legacy-modes/mode/clike"; -import { swift } from "@codemirror/legacy-modes/mode/swift"; -import { textile } from "@codemirror/legacy-modes/mode/textile"; -import { stex } from "@codemirror/legacy-modes/mode/stex"; -import { toml } from "@codemirror/legacy-modes/mode/toml"; -import { turtle } from "@codemirror/legacy-modes/mode/turtle"; -// import { twig } from "@codemirror/legacy-modes/mode/twig"; // not present anymore -import { vb } from "@codemirror/legacy-modes/mode/vb"; -import { vbScript } from "@codemirror/legacy-modes/mode/vbscript"; -import { velocity } from "@codemirror/legacy-modes/mode/velocity"; -import { verilog } from "@codemirror/legacy-modes/mode/verilog"; -import { vhdl } from "@codemirror/legacy-modes/mode/vhdl"; -// import { wast } from "@codemirror/legacy-modes/mode/wast"; // available in CodeMirror 6 -import { webIDL } from "@codemirror/legacy-modes/mode/webidl"; -import { xQuery } from "@codemirror/legacy-modes/mode/xquery"; -import { languageMetadataMap } from "@/lib/languageMetadata"; - - -export type CodeMirrorLanguageKey = keyof typeof codemirrorLanguageMap; - -export const getCodemirrorLanguage = (linguistLanguage: string): StreamLanguage | LanguageSupport | null => { - if (languageMetadataMap[linguistLanguage]?.codemirrorLanguage) { - const codemirrorLanguage = languageMetadataMap[linguistLanguage].codemirrorLanguage; - if (codemirrorLanguageMap[codemirrorLanguage]) { - return codemirrorLanguageMap[codemirrorLanguage]; - } - } - return null; -} - -export const codemirrorLanguageMap = { - // CodeMirror 6 languages - "brainfuck": brainfuck(), - "css": css(), - "c": cpp(), - "c#": csharp(), - "dot": dot(), - "elixir": elixir(), - "go": go(), - "graphql": graphqlLanguageSupport(), - "handlebars": new LanguageSupport(handlebarsLanguage), - "hcl": hcl(), - "html": html(), - "j": j(), - "java": java(), - "jsx": javascript({ jsx: true, typescript: false }), - "jq": jq(), - "json": json(), - "jsonc": jsonc(), - "less": less(), - "liquid": liquid(), - "makefile": makefile(), - "markdown": markdown(), - "mermaid": mermaid(), // not recognized by linguist/enry - "nix": nix(), - // "perl": perl(), // not working - use codemirror 5 mode - "php": php(), - "prolog": prolog(), - "python": python(), - // "r": r(), // not working - use codemirror 5 mode - "rust": rust(), - "sass": sass(), - "solidity": solidity, - "sparql": sparql(), - "spreadsheet": spreadsheet(), - "sql": sql(), - "svelte": svelte(), - "tcl": tcl(), - "tsx": javascript({ jsx: true, typescript: true }), - "twig": twig(), - "typescript": javascript({ jsx: false, typescript: true }), - "vue": vue(), - "wast": wast(), - "wgsl": wgsl(), - "xml": xml(), - "yaml": yaml(), - "zig": zig(), - "basic": StreamLanguage.define(vb), - // Legacy CodeMirror 5 modes - "apl": StreamLanguage.define(apl), - "ceylon": StreamLanguage.define(ceylon), - "clojure": StreamLanguage.define(clojure), - "cmake": StreamLanguage.define(cmake), - "cobol": StreamLanguage.define(cobol), - "coffeescript": StreamLanguage.define(coffeeScript), - "common lisp": StreamLanguage.define(commonLisp), - "crystal": StreamLanguage.define(crystal), - "cypher": StreamLanguage.define(cypher), - "d": StreamLanguage.define(d), - "dart": StreamLanguage.define(dart), - "dockerfile": StreamLanguage.define(dockerFile), - "diff": StreamLanguage.define(diff), - "elm": StreamLanguage.define(elm), - "erlang": StreamLanguage.define(erlang), - "fortran": StreamLanguage.define(fortran), - "gherkin": StreamLanguage.define(gherkin), - "groovy": StreamLanguage.define(groovy), - "haskell": StreamLanguage.define(haskell), - "idl": StreamLanguage.define(idl), - "jinja2": StreamLanguage.define(jinja2), - "julia": StreamLanguage.define(julia), - "kotlin": StreamLanguage.define(kotlin), - "livescript": StreamLanguage.define(liveScript), - "lua": StreamLanguage.define(lua), - "nesc": StreamLanguage.define(nesC), - "nginx": StreamLanguage.define(nginx), - "objective-c": StreamLanguage.define(objectiveC), - "objective-c++": StreamLanguage.define(objectiveCpp), - "octave": StreamLanguage.define(octave), - "pascal": StreamLanguage.define(pascal), - "perl": StreamLanguage.define(perl), - "powershell": StreamLanguage.define(powerShell), - "protobuf": StreamLanguage.define(protobuf), - "pug": StreamLanguage.define(pug), - "puppet": StreamLanguage.define(puppet), - "r": StreamLanguage.define(r), - "rpm spec": StreamLanguage.define(rpmSpec), - "ruby": StreamLanguage.define(ruby), - "scala": StreamLanguage.define(scala), - "scheme": StreamLanguage.define(scheme), - "shader": StreamLanguage.define(shader), - "shell": StreamLanguage.define(shell), - "squirrel": StreamLanguage.define(squirrel), - "swift": StreamLanguage.define(swift), - "textile": StreamLanguage.define(textile), - "stex": StreamLanguage.define(stex), - "toml": StreamLanguage.define(toml), - "turtle": StreamLanguage.define(turtle), - "vb": StreamLanguage.define(vb), - "vbscript": StreamLanguage.define(vbScript), - "velocity": StreamLanguage.define(velocity), - "verilog": StreamLanguage.define(verilog), - "vhdl": StreamLanguage.define(vhdl), - // "wast": StreamLanguage.define(wast), // available in CodeMirror 6 - "webidl": StreamLanguage.define(webIDL), - "xquery": StreamLanguage.define(xQuery), -}; diff --git a/packages/web/src/lib/constants.ts b/packages/web/src/lib/constants.ts deleted file mode 100644 index 17cac4f8a..000000000 --- a/packages/web/src/lib/constants.ts +++ /dev/null @@ -1,10 +0,0 @@ -export const MOBILE_UNSUPPORTED_SPLASH_SCREEN_DISMISSED_COOKIE_NAME = 'sb.mobile-unsupported-splash-screen-dismissed'; -export const OPTIONAL_PROVIDERS_LINK_SKIPPED_COOKIE_NAME = 'sb.optional-providers-link-skipped'; -export const HOME_VIEW_COOKIE_NAME = 'sb.home-view'; - -export const SINGLE_TENANT_ORG_ID = 1; -export const SINGLE_TENANT_ORG_NAME = 'default'; - -export { SOURCEBOT_SUPPORT_EMAIL } from "@sourcebot/shared/client"; - -export const OFFERINGS_DOCS_LINK = "https://sourcebot.dev/pricing" \ No newline at end of file diff --git a/packages/web/src/lib/encryptedPrismaAdapter.test.ts b/packages/web/src/lib/encryptedPrismaAdapter.test.ts deleted file mode 100644 index 286d61760..000000000 --- a/packages/web/src/lib/encryptedPrismaAdapter.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; - -const mocks = vi.hoisted(() => ({ - removeAccountPermissionSyncScheduler: vi.fn(), -})); - -vi.mock('@auth/prisma-adapter', () => ({ - PrismaAdapter: () => ({}), -})); -vi.mock('@sourcebot/shared', () => ({ - encryptOAuthToken: (value: unknown) => value, - getIdentityProviderConfig: vi.fn(), -})); -vi.mock('@/ee/features/permissionSync/accountPermissionSyncQueue.server', () => ({ - removeAccountPermissionSyncScheduler: - mocks.removeAccountPermissionSyncScheduler, -})); - -const { EncryptedPrismaAdapter } = await import('./encryptedPrismaAdapter'); - -beforeEach(() => { - vi.clearAllMocks(); - mocks.removeAccountPermissionSyncScheduler.mockResolvedValue(true); -}); - -describe('EncryptedPrismaAdapter.unlinkAccount', () => { - test('removes the scheduler before deleting the account', async () => { - const findUnique = vi.fn().mockResolvedValue({ id: 'account-1' }); - const deleteAccount = vi.fn().mockResolvedValue({}); - const adapter = EncryptedPrismaAdapter({ - account: { - delete: deleteAccount, - findUnique, - }, - } as never); - - await adapter.unlinkAccount?.({ - provider: 'github', - providerAccountId: 'github-user-1', - }); - - const where = { - providerId_providerAccountId: { - providerId: 'github', - providerAccountId: 'github-user-1', - }, - }; - expect(findUnique).toHaveBeenCalledWith({ - where, - select: { id: true }, - }); - expect(mocks.removeAccountPermissionSyncScheduler).toHaveBeenCalledWith( - 'account-1', - ); - expect(deleteAccount).toHaveBeenCalledWith({ where }); - expect( - mocks.removeAccountPermissionSyncScheduler.mock.invocationCallOrder[0], - ).toBeLessThan(deleteAccount.mock.invocationCallOrder[0]); - }); - - test('does not delete the account when scheduler removal fails', async () => { - const deleteAccount = vi.fn(); - const adapter = EncryptedPrismaAdapter({ - account: { - delete: deleteAccount, - findUnique: vi.fn().mockResolvedValue({ id: 'account-1' }), - }, - } as never); - mocks.removeAccountPermissionSyncScheduler.mockRejectedValue( - new Error('Redis unavailable'), - ); - - await expect(adapter.unlinkAccount?.({ - provider: 'github', - providerAccountId: 'github-user-1', - })).rejects.toThrow('Redis unavailable'); - expect(deleteAccount).not.toHaveBeenCalled(); - }); -}); diff --git a/packages/web/src/lib/encryptedPrismaAdapter.ts b/packages/web/src/lib/encryptedPrismaAdapter.ts deleted file mode 100644 index b9a813ff9..000000000 --- a/packages/web/src/lib/encryptedPrismaAdapter.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { PrismaAdapter } from "@auth/prisma-adapter"; -import type { Adapter, AdapterAccount, AdapterUser } from "next-auth/adapters"; -import { PrismaClient } from "@sourcebot/db"; -import { encryptOAuthToken, getIdentityProviderConfig } from "@sourcebot/shared"; -import { removeAccountPermissionSyncScheduler } from "@/ee/features/permissionSync/accountPermissionSyncQueue.server"; - -/** - * Encrypts OAuth tokens in account data before database storage - */ -function encryptAccountTokens(account: AdapterAccount): AdapterAccount { - return { - ...account, - access_token: encryptOAuthToken(account.access_token), - refresh_token: encryptOAuthToken(account.refresh_token), - id_token: encryptOAuthToken(account.id_token), - }; -} - -/** - * Encrypted Prisma adapter that: - * 1. Encrypts OAuth tokens in account data before persisting them. - * 2. Remaps the auth.js `provider` field onto our `providerId` / - * `providerType` columns so the same provider type (e.g., github) - * can be configured as multiple distinct instances. - */ -export function EncryptedPrismaAdapter(prisma: PrismaClient): Adapter { - const baseAdapter = PrismaAdapter(prisma); - - return { - ...baseAdapter, - async linkAccount(account: AdapterAccount) { - const idpConfig = await getIdentityProviderConfig(account.provider); - if (!idpConfig) { - throw new Error(`Failed to link account for user id ${account.userId}. No provider config found for account with type ${account.provider}`); - } - - const { provider, ...rest } = encryptAccountTokens(account); - await prisma.account.create({ - data: { - ...rest, - providerId: provider, - providerType: idpConfig.provider, - }, - }); - return account; - }, - async getUserByAccount({ provider, providerAccountId }) { - const account = await prisma.account.findUnique({ - where: { - providerId_providerAccountId: { - providerId: provider, - providerAccountId, - }, - }, - include: { user: true }, - }); - // Cast to AdapterUser to satisfy next-auth's adapter return type; - // the base PrismaAdapter returns the user row directly, and we mirror it. - return (account?.user ?? null) as AdapterUser | null; - }, - async unlinkAccount({ provider, providerAccountId }) { - const where = { - providerId_providerAccountId: { - providerId: provider, - providerAccountId, - }, - }; - const account = await prisma.account.findUnique({ - where, - select: { - id: true, - }, - }); - - if (account) { - await removeAccountPermissionSyncScheduler(account.id); - } - - await prisma.account.delete({ - where, - }); - }, - }; -} - -/** - * Encrypts OAuth tokens in account data (for manual account updates in signIn event) - */ -export function encryptAccountData(data: { - access_token?: string | null; - refresh_token?: string | null; - id_token?: string | null; - expires_at?: number | null; - token_type?: string | null; - scope?: string | null; - issuerUrl?: string | null; - tokenRefreshErrorMessage?: string | null; -}) { - return { - ...data, - access_token: encryptOAuthToken(data.access_token), - refresh_token: encryptOAuthToken(data.refresh_token), - id_token: encryptOAuthToken(data.id_token), - }; -} diff --git a/packages/web/src/lib/entitlements.test.ts b/packages/web/src/lib/entitlements.test.ts deleted file mode 100644 index 0ac391ab1..000000000 --- a/packages/web/src/lib/entitlements.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { describe, test, expect, vi, beforeEach } from 'vitest'; -import { MOCK_ORG, prisma } from '../__mocks__/prisma'; -import { isAnonymousAccessEnabled } from './entitlements'; - -const mocks = vi.hoisted(() => ({ - isAnonymousAccessAvailable: vi.fn<(license: unknown) => boolean>(() => true), - env: {} as Record, -})); - -vi.mock('@/prisma', async () => { - const actual = await vi.importActual('@/__mocks__/prisma'); - return { ...actual }; -}); - -vi.mock('server-only', () => ({ - default: vi.fn(), -})); - -vi.mock('@sourcebot/shared', () => ({ - _isAnonymousAccessAvailable: mocks.isAnonymousAccessAvailable, - _hasEntitlement: vi.fn(), - _getEntitlements: vi.fn(), - env: mocks.env, - createLogger: vi.fn(() => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - })), -})); - -beforeEach(() => { - vi.clearAllMocks(); - mocks.isAnonymousAccessAvailable.mockReturnValue(true); - Object.keys(mocks.env).forEach(key => delete mocks.env[key]); -}); - -describe('isAnonymousAccessEnabled', () => { - test('returns false when anonymous access is not available', async () => { - mocks.isAnonymousAccessAvailable.mockReturnValue(false); - - expect(await isAnonymousAccessEnabled()).toBe(false); - }); - - test('returns true when FORCE_ENABLE_ANONYMOUS_ACCESS is true, regardless of the org setting', async () => { - mocks.env.FORCE_ENABLE_ANONYMOUS_ACCESS = 'true'; - prisma.org.findUnique.mockResolvedValue({ ...MOCK_ORG, isAnonymousAccessEnabled: false }); - - expect(await isAnonymousAccessEnabled()).toBe(true); - }); - - test('returns false when FORCE_ENABLE_ANONYMOUS_ACCESS is true but not available', async () => { - mocks.isAnonymousAccessAvailable.mockReturnValue(false); - mocks.env.FORCE_ENABLE_ANONYMOUS_ACCESS = 'true'; - - expect(await isAnonymousAccessEnabled()).toBe(false); - }); - - test('returns false when org is missing', async () => { - prisma.org.findUnique.mockResolvedValue(null); - - expect(await isAnonymousAccessEnabled()).toBe(false); - }); - - test('returns false when org.isAnonymousAccessEnabled is false', async () => { - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - isAnonymousAccessEnabled: false, - }); - - expect(await isAnonymousAccessEnabled()).toBe(false); - }); - - test('returns true when org.isAnonymousAccessEnabled is true', async () => { - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - isAnonymousAccessEnabled: true, - }); - - expect(await isAnonymousAccessEnabled()).toBe(true); - }); - - test('returns false when FORCE_ENABLE_ANONYMOUS_ACCESS is "false", overriding the org setting', async () => { - mocks.env.FORCE_ENABLE_ANONYMOUS_ACCESS = 'false'; - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - isAnonymousAccessEnabled: true, - }); - - expect(await isAnonymousAccessEnabled()).toBe(false); - }); -}); diff --git a/packages/web/src/lib/entitlements.ts b/packages/web/src/lib/entitlements.ts deleted file mode 100644 index 4ae7f8eb4..000000000 --- a/packages/web/src/lib/entitlements.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - _getEntitlements, - _hasEntitlement, - _isAnonymousAccessAvailable, - _isValidLicenseActive, - createLogger, - Entitlement, - env, -} from "@sourcebot/shared"; -import { __unsafePrisma } from "@/prisma"; -import { SINGLE_TENANT_ORG_ID } from "./constants"; -import { cache } from 'react'; - -const logger = createLogger('entitlements'); - -const getSingleTenantLicense = cache(async () => { - try { - return await __unsafePrisma.license.findUnique({ - where: { - orgId: SINGLE_TENANT_ORG_ID, - }, - }); - } catch (err) { - logger.error('Failed to fetch single-tenant license', err); - return null; - } -}); - -export const getEntitlements = async () => { - const license = await getSingleTenantLicense(); - return _getEntitlements(license); -} - -export const hasEntitlement = async (entitlement: Entitlement) => { - const license = await getSingleTenantLicense(); - return _hasEntitlement(entitlement, license); -} - -export const isAnonymousAccessAvailable = async () => { - const license = await getSingleTenantLicense(); - return _isAnonymousAccessAvailable(license); -} - -export const isAnonymousAccessEnabled = async () => { - if (!await isAnonymousAccessAvailable()) { - return false; - } - - if (env.FORCE_ENABLE_ANONYMOUS_ACCESS !== undefined) { - return env.FORCE_ENABLE_ANONYMOUS_ACCESS === 'true'; - } - - const org = await __unsafePrisma.org.findUnique({ - where: { id: SINGLE_TENANT_ORG_ID }, - }); - - if (!org) { - return false; - } - - return org.isAnonymousAccessEnabled; -} - -export const isValidLicenseActive = async () => { - const license = await getSingleTenantLicense(); - return _isValidLicenseActive(license); -} \ No newline at end of file diff --git a/packages/web/src/lib/errorCodes.ts b/packages/web/src/lib/errorCodes.ts deleted file mode 100644 index b55053d3f..000000000 --- a/packages/web/src/lib/errorCodes.ts +++ /dev/null @@ -1,55 +0,0 @@ - -export enum ErrorCode { - UNEXPECTED_ERROR = 'UNEXPECTED_ERROR', - MISSING_REQUIRED_QUERY_PARAMETER = 'MISSING_REQUIRED_QUERY_PARAMETER', - REPOSITORY_NOT_FOUND = 'REPOSITORY_NOT_FOUND', - GITHUB_RATE_LIMITED = 'GITHUB_RATE_LIMITED', - FILE_NOT_FOUND = 'FILE_NOT_FOUND', - INVALID_REQUEST_BODY = 'INVALID_REQUEST_BODY', - INVALID_RESPONSE_BODY = 'INVALID_RESPONSE_BODY', - INVALID_QUERY_PARAMS = 'INVALID_QUERY_PARAMS', - NOT_AUTHENTICATED = 'NOT_AUTHENTICATED', - NOT_FOUND = 'NOT_FOUND', - USER_NOT_FOUND = 'USER_NOT_FOUND', - ORG_NOT_FOUND = 'ORG_NOT_FOUND', - CONNECTION_SYNC_ALREADY_SCHEDULED = 'CONNECTION_SYNC_ALREADY_SCHEDULED', - ORG_DOMAIN_ALREADY_EXISTS = 'ORG_DOMAIN_ALREADY_EXISTS', - INVALID_CREDENTIALS = 'INVALID_CREDENTIALS', - INSUFFICIENT_PERMISSIONS = 'INSUFFICIENT_PERMISSIONS', - CONNECTION_NOT_FAILED = 'CONNECTION_NOT_FAILED', - CONNECTION_ALREADY_EXISTS = 'CONNECTION_ALREADY_EXISTS', - INVALID_INVITE = 'INVALID_INVITE', - INVALID_INVITE_LINK = 'INVALID_INVITE_LINK', - INVITE_LINK_NOT_ENABLED = 'INVITE_LINK_NOT_ENABLED', - SECRET_ALREADY_EXISTS = 'SECRET_ALREADY_EXISTS', - ACTION_DISALLOWED_IN_TENANCY_MODE = 'ACTION_DISALLOWED_IN_TENANCY_MODE', - SEARCH_CONTEXT_NOT_FOUND = 'SEARCH_CONTEXT_NOT_FOUND', - MISSING_ORG_DOMAIN_HEADER = 'MISSING_ORG_DOMAIN_HEADER', - ORG_SEAT_COUNT_REACHED = 'ORG_SEAT_COUNT_REACHED', - CONNECTION_CONFIG_PATH_SET = 'CONNECTION_CONFIG_PATH_SET', - INVALID_ORG_METADATA = 'INVALID_ORG_METADATA', - API_KEY_ALREADY_EXISTS = 'API_KEY_ALREADY_EXISTS', - API_KEY_NOT_FOUND = 'API_KEY_NOT_FOUND', - INVALID_API_KEY = 'INVALID_API_KEY', - INVALID_REPOSITORY_SCOPE = 'INVALID_REPOSITORY_SCOPE', - SCOPED_ACCESS_TOKEN_NOT_FOUND = 'SCOPED_ACCESS_TOKEN_NOT_FOUND', - FAILED_TO_PARSE_QUERY = 'FAILED_TO_PARSE_QUERY', - INVALID_GIT_REF = 'INVALID_GIT_REF', - LAST_OWNER_CANNOT_BE_DEMOTED = 'LAST_OWNER_CANNOT_BE_DEMOTED', - LAST_OWNER_CANNOT_BE_REMOVED = 'LAST_OWNER_CANNOT_BE_REMOVED', - MEMBER_SUSPENDED = 'MEMBER_SUSPENDED', - API_KEY_USAGE_DISABLED = 'API_KEY_USAGE_DISABLED', - OAUTH_INSUFFICIENT_SCOPE = 'OAUTH_INSUFFICIENT_SCOPE', - MCP_SERVER_ALREADY_EXISTS = 'MCP_SERVER_ALREADY_EXISTS', - MCP_SERVER_NOT_FOUND = 'MCP_SERVER_NOT_FOUND', - LIGHTHOUSE_UNREACHABLE = 'LIGHTHOUSE_UNREACHABLE', - EMAIL_LOGIN_CONTROLLED_BY_ENV = 'EMAIL_LOGIN_CONTROLLED_BY_ENV', - EMAIL_LOGIN_CANNOT_BE_DISABLED = 'EMAIL_LOGIN_CANNOT_BE_DISABLED', - EMAIL_CODE_LOGIN_CONTROLLED_BY_ENV = 'EMAIL_CODE_LOGIN_CONTROLLED_BY_ENV', - EMAIL_CODE_LOGIN_CANNOT_BE_DISABLED = 'EMAIL_CODE_LOGIN_CANNOT_BE_DISABLED', - MEMBER_APPROVAL_CONTROLLED_BY_ENV = 'MEMBER_APPROVAL_CONTROLLED_BY_ENV', - ANONYMOUS_ACCESS_CONTROLLED_BY_ENV = 'ANONYMOUS_ACCESS_CONTROLLED_BY_ENV', - MEMBERSHIP_MANAGED_BY_IDP = 'MEMBERSHIP_MANAGED_BY_IDP', - AGENT_SKILL_ALREADY_EXISTS = 'AGENT_SKILL_ALREADY_EXISTS', - AGENT_SKILL_NOT_FOUND = 'AGENT_SKILL_NOT_FOUND', -} diff --git a/packages/web/src/lib/extensions/gutterWidthExtension.ts b/packages/web/src/lib/extensions/gutterWidthExtension.ts deleted file mode 100644 index 37cc07167..000000000 --- a/packages/web/src/lib/extensions/gutterWidthExtension.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { EditorView, ViewPlugin, ViewUpdate } from "@codemirror/view" - -/** - * Measures the width of the gutter and stores it in the plugin instance. - */ -export const gutterWidthExtension = ViewPlugin.fromClass(class { - width: number = 0; - - constructor (view: EditorView) { - this.measureWidth(view); - } - - update = (update: ViewUpdate) => { - if (update.geometryChanged) { - this.measureWidth(update.view); - } - } - - measureWidth = (view: EditorView) => { - const gutter = view.scrollDOM.querySelector('.cm-gutters') as HTMLElement; - if (gutter) { - this.width = gutter.offsetWidth; - } - } -}); diff --git a/packages/web/src/lib/extensions/searchResultHighlightExtension.ts b/packages/web/src/lib/extensions/searchResultHighlightExtension.ts deleted file mode 100644 index f9496aaf6..000000000 --- a/packages/web/src/lib/extensions/searchResultHighlightExtension.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { EditorSelection, Extension, StateEffect, StateField, Text, Transaction } from "@codemirror/state"; -import { Decoration, DecorationSet, EditorView } from "@codemirror/view"; -import { SourceRange } from "@/features/search"; - -const setMatchState = StateEffect.define<{ - selectedMatchIndex: number, - ranges: SourceRange[], -}>(); - -const convertToCodeMirrorRange = (range: SourceRange, document: Text) => { - const { start, end } = range; - const from = document.line(start.lineNumber).from + start.column - 1; - const to = document.line(end.lineNumber).from + end.column - 1; - return { from, to }; -} - - -const matchHighlighter = StateField.define({ - create () { - return Decoration.none; - }, - update (highlights: DecorationSet, transaction: Transaction) { - highlights = highlights.map(transaction.changes); - - for (const effect of transaction.effects) { - if (effect.is(setMatchState)) { - const { ranges, selectedMatchIndex } = effect.value; - - const decorations = ranges - .sort((a, b) => { - return a.start.byteOffset - b.start.byteOffset; - }) - .map((range, index) => { - const { from, to } = convertToCodeMirrorRange(range, transaction.newDoc); - const mark = index === selectedMatchIndex ? selectedMatchMark : matchMark; - if (from < to) { - return mark.range(from, to); - } - - return undefined; - }) - .filter((decoration) => decoration !== undefined); - - highlights = Decoration.set(decorations, /* sort = */ true); - } - } - - return highlights; - }, - provide: (field) => EditorView.decorations.from(field), -}); - -const matchMark = Decoration.mark({ - class: "searchMatch" -}); -const selectedMatchMark = Decoration.mark({ - class: "searchMatch-selected" -}); - -export const highlightRanges = (selectedMatchIndex: number, ranges: SourceRange[], view: EditorView) => { - const setState = setMatchState.of({ - selectedMatchIndex, - ranges, - }); - - const effects = [] - effects.push(setState); - - if (selectedMatchIndex >= 0 && selectedMatchIndex < ranges.length) { - const { from, to } = convertToCodeMirrorRange(ranges[selectedMatchIndex], view.state.doc); - const selection = EditorSelection.range(from, to); - effects.push(EditorView.scrollIntoView(selection, { - y: "start", - })); - }; - - view.dispatch({ effects }); -} - -export const searchResultHighlightExtension = (): Extension => { - return [ - matchHighlighter, - ] -} diff --git a/packages/web/src/lib/gitattributes.test.ts b/packages/web/src/lib/gitattributes.test.ts deleted file mode 100644 index ea0e5464d..000000000 --- a/packages/web/src/lib/gitattributes.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { describe, expect, test } from 'vitest'; -import { parseGitAttributes, resolveLanguageFromGitAttributes } from './gitattributes'; - -describe('resolveLanguageFromGitAttributes', () => { - test('a pattern without a slash matches files in any directory', () => { - const attrs = parseGitAttributes('*.h linguist-language=C\n'); - - expect(resolveLanguageFromGitAttributes('foo.h', attrs)).toBe('C'); - expect(resolveLanguageFromGitAttributes('src/include/foo.h', attrs)).toBe('C'); - }); - - test('a pattern with a leading slash is anchored to the repository root', () => { - const attrs = parseGitAttributes('/config.in linguist-language=Makefile\n'); - - expect(resolveLanguageFromGitAttributes('config.in', attrs)).toBe('Makefile'); - expect(resolveLanguageFromGitAttributes('sub/config.in', attrs)).toBeUndefined(); - }); - - test('a pattern with an inner slash is matched relative to the repository root', () => { - const attrs = parseGitAttributes('docs/*.txt linguist-language=Markdown\n'); - - expect(resolveLanguageFromGitAttributes('docs/intro.txt', attrs)).toBe('Markdown'); - expect(resolveLanguageFromGitAttributes('./docs/intro.txt', attrs)).toBe('Markdown'); - expect(resolveLanguageFromGitAttributes('./docs/./intro.txt', attrs)).toBe('Markdown'); - expect(resolveLanguageFromGitAttributes('other/docs/intro.txt', attrs)).toBeUndefined(); - }); - - test('the last matching rule wins', () => { - const attrs = parseGitAttributes('*.inc linguist-language=PHP\nlegacy/*.inc linguist-language=Pascal\n'); - - expect(resolveLanguageFromGitAttributes('src/a.inc', attrs)).toBe('PHP'); - expect(resolveLanguageFromGitAttributes('legacy/a.inc', attrs)).toBe('Pascal'); - }); - - test('dotfiles match slashless patterns', () => { - const attrs = parseGitAttributes('*.conf linguist-language=TOML\n'); - - expect(resolveLanguageFromGitAttributes('src/.config.conf', attrs)).toBe('TOML'); - }); - - test.each(['-linguist-language', '!linguist-language'])('%s clears the previous language override', (reset) => { - const attrs = parseGitAttributes(`*.inc linguist-language=PHP\nlegacy/*.inc ${reset}\n`); - - expect(resolveLanguageFromGitAttributes('legacy/a.inc', attrs)).toBeUndefined(); - }); - - test('a later language value replaces a reset', () => { - const attrs = parseGitAttributes( - '*.inc linguist-language=PHP\nlegacy/*.inc -linguist-language\nlegacy/special.inc linguist-language=Pascal\n', - ); - - expect(resolveLanguageFromGitAttributes('legacy/special.inc', attrs)).toBe('Pascal'); - }); -}); diff --git a/packages/web/src/lib/gitattributes.ts b/packages/web/src/lib/gitattributes.ts deleted file mode 100644 index 0e0f6d9bb..000000000 --- a/packages/web/src/lib/gitattributes.ts +++ /dev/null @@ -1,89 +0,0 @@ -import micromatch from 'micromatch'; - -// GitAttributes holds parsed .gitattributes rules for overriding language detection. -export interface GitAttributes { - rules: GitAttributeRule[]; -} - -interface GitAttributeRule { - pattern: string; - attrs: Record; -} - -// parseGitAttributes parses the content of a .gitattributes file. -// Each non-comment, non-empty line has the form: pattern attr1 attr2=value ... -// Attributes can be: -// - "linguist-vendored" (set/true), "-linguist-vendored" (unset/false) -// - "linguist-language=Go" -// - etc. -export function parseGitAttributes(content: string): GitAttributes { - const rules: GitAttributeRule[] = []; - - for (const raw of content.split('\n')) { - const line = raw.trim(); - if (line === '' || line.startsWith('#')) { - continue; - } - - const fields = line.split(/\s+/); - if (fields.length < 2) { - continue; - } - - const pattern = fields[0]; - const attrs: Record = {}; - - for (const field of fields.slice(1)) { - if (field.startsWith('!')) { - // !attr means unspecified (reset to default) - attrs[field.slice(1)] = 'unspecified'; - } else if (field.startsWith('-')) { - // -attr means unset (false) - attrs[field.slice(1)] = 'false'; - } else { - const eqIdx = field.indexOf('='); - if (eqIdx !== -1) { - // attr=value - attrs[field.slice(0, eqIdx)] = field.slice(eqIdx + 1); - } else { - // attr alone means set (true) - attrs[field] = 'true'; - } - } - } - - rules.push({ pattern, attrs }); - } - - return { rules }; -} - -// matchesGitAttributesPattern applies gitattributes pattern rules: a pattern -// without a slash matches the file name at any depth, and any other pattern -// is matched against the full path from the repository root. -// @see https://git-scm.com/docs/gitattributes#_description -function matchesGitAttributesPattern(filePath: string, pattern: string): boolean { - const normalizedFilePath = filePath - .split('/') - .filter((pathSegment) => pathSegment !== '.') - .join('/'); - if (!pattern.includes('/')) { - const fileName = normalizedFilePath.slice(normalizedFilePath.lastIndexOf('/') + 1); - return micromatch.isMatch(fileName, pattern, { dot: true }); - } - return micromatch.isMatch(normalizedFilePath, pattern.replace(/^\//, ''), { dot: true }); -} - -// resolveLanguageFromGitAttributes returns the linguist-language override for -// the given file path based on the parsed .gitattributes rules, or undefined -// if no rule matches. Last matching rule wins, consistent with gitattributes semantics. -export function resolveLanguageFromGitAttributes(filePath: string, gitAttributes: GitAttributes): string | undefined { - let language: string | undefined; - for (const rule of gitAttributes.rules) { - const languageAttribute = rule.attrs['linguist-language']; - if (matchesGitAttributesPattern(filePath, rule.pattern) && languageAttribute !== undefined) { - language = languageAttribute === 'false' || languageAttribute === 'unspecified' ? undefined : languageAttribute; - } - } - return language; -} diff --git a/packages/web/src/lib/identityProviders.ts b/packages/web/src/lib/identityProviders.ts deleted file mode 100644 index e28cb33aa..000000000 --- a/packages/web/src/lib/identityProviders.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { getProviders } from "@/auth"; - -export interface IdentityProviderMetadata { - /** Unique instance id (e.g., 'github', 'gitlab-corp') — used for `signIn(id)`. */ - id: string; - /** Provider type (e.g., 'github', 'gitlab') — used to pick icons / event names. */ - type: string; - /** Optional admin-supplied display name from config; overrides type-derived defaults in the UI. */ - displayName?: string; - purpose: "sso" | "account_linking"; - required: boolean; -} - -export const getIdentityProviderMetadata = async (): Promise => { - const providers = await getProviders(); - return providers.map((provider) => { - return { - id: provider.id, - type: provider.type, - displayName: provider.displayName, - purpose: provider.purpose, - required: provider.required ?? false, - }; - }); -}; \ No newline at end of file diff --git a/packages/web/src/lib/languageDetection.ts b/packages/web/src/lib/languageDetection.ts deleted file mode 100644 index df9377864..000000000 --- a/packages/web/src/lib/languageDetection.ts +++ /dev/null @@ -1,63 +0,0 @@ -import * as linguistLanguages from 'linguist-languages'; -import path from 'path'; - -// Override map for extensions that are ambiguous in linguist-languages. -// These are extensions where linguist maps to multiple languages, but one -// is overwhelmingly more common in practice. -const ambiguousExtensionOverrides: Record = { - '.cs': 'C#', // Not Smalltalk - '.fs': 'F#', // Not Forth, GLSL, or Filterscript - '.html': 'HTML', // Not Ecmarkup - '.json': 'JSON', // Not OASv2-json, OASv3-json - '.md': 'Markdown', // Not GCC Machine Description - '.rs': 'Rust', // Not RenderScript (deprecated) - '.tsx': 'TSX', // Not XML - '.ts': 'TypeScript', // Not XML - '.txt': 'Text', // Not Adblock Filter List, Vim Help File - '.yaml': 'YAML', // Not MiniYAML, OASv2-yaml, OASv3-yaml - '.yml': 'YAML', - '.bas': 'BASIC' -}; - -const extensionToLanguage = new Map(); - -for (const [languageName, languageData] of Object.entries(linguistLanguages)) { - if ('extensions' in languageData && languageData.extensions) { - for (const ext of languageData.extensions) { - const normalizedExt = ext.toLowerCase(); - if (!extensionToLanguage.has(normalizedExt)) { - extensionToLanguage.set(normalizedExt, languageName); - } - } - } - if ('filenames' in languageData && languageData.filenames) { - for (const filename of languageData.filenames) { - if (!extensionToLanguage.has(filename)) { - extensionToLanguage.set(filename, languageName); - } - } - } -} - -export const detectLanguageFromFilename = (filename: string): string => { - const basename = path.basename(filename); - - // Check for exact filename match (e.g., Makefile, Dockerfile) - if (extensionToLanguage.has(basename)) { - return extensionToLanguage.get(basename)!; - } - - // Check for extension match - const ext = path.extname(filename).toLowerCase(); - - // Check override map first for ambiguous extensions - if (ext && ext in ambiguousExtensionOverrides) { - return ambiguousExtensionOverrides[ext]; - } - - if (ext && extensionToLanguage.has(ext)) { - return extensionToLanguage.get(ext)!; - } - - return ''; -}; diff --git a/packages/web/src/lib/languageMetadata.ts b/packages/web/src/lib/languageMetadata.ts deleted file mode 100644 index 6797587f7..000000000 --- a/packages/web/src/lib/languageMetadata.ts +++ /dev/null @@ -1,3007 +0,0 @@ -import { CodeMirrorLanguageKey } from "@/lib/codemirrorLanguage"; - -type LanguageMetadataMap = { [key: string]: LanguageMetadata }; - -type LanguageMetadata = { - iconify: string | null; - codemirrorLanguage: CodeMirrorLanguageKey | null; -}; - -// Languages: -// https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml -// Icons: -// https://icon-sets.iconify.design/?&list=icons -export const languageMetadataMap: LanguageMetadataMap = { - "1C Enterprise": { - "iconify": null, - "codemirrorLanguage": null, - }, - "2-Dimensional Array": { - "iconify": null, - "codemirrorLanguage": null, - }, - "4D": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ABAP": { - "iconify": "file-icons:abap", - "codemirrorLanguage": null, - }, - "ABAP CDS": { - "iconify": "file-icons:abap", - "codemirrorLanguage": null, - }, - "ABNF": { - "iconify": null, - "codemirrorLanguage": null, - }, - "AGS Script": { - "iconify": "vscode-icons:file-type-c3", - "codemirrorLanguage": "c", - }, - "AIDL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "AL": { - "iconify": "vscode-icons:file-type-al", - "codemirrorLanguage": null, - }, - "AMPL": { - "iconify": "file-icons:ampl", - "codemirrorLanguage": null, - }, - "ANTLR": { - "iconify": "vscode-icons:file-type-antlr", - "codemirrorLanguage": null, - }, - "API Blueprint": { - "iconify": "vscode-icons:file-type-apib", - "codemirrorLanguage": null, - }, - "APL": { - "iconify": "vscode-icons:file-type-apl", - "codemirrorLanguage": "apl", - }, - "ASL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ASN.1": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ASP.NET": { - "iconify": "vscode-icons:file-type-asp", - "codemirrorLanguage": null, - }, - "ATS": { - "iconify": "vscode-icons:file-type-ats", - "codemirrorLanguage": null, - }, - "ActionScript": { - "iconify": "vscode-icons:file-type-actionscript", - "codemirrorLanguage": null, - }, - "Ada": { - "iconify": "vscode-icons:file-type-ada", - "codemirrorLanguage": null, - }, - "Adblock Filter List": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Adobe Font Metrics": { - "iconify": "simple-icons:adobefonts", - "codemirrorLanguage": null, - }, - "Agda": { - "iconify": "file-icons:agda", - "codemirrorLanguage": null, - }, - "Alloy": { - "iconify": "file-icons:alloy", - "codemirrorLanguage": null, - }, - "Alpine Abuild": { - "iconify": "file-icons:alpine-linux", - "codemirrorLanguage": "shell", - }, - "Altium Designer": { - "iconify": "simple-icons:altiumdesigner", - "codemirrorLanguage": null, - }, - "AngelScript": { - "iconify": "file-icons:angelscript", - "codemirrorLanguage": "c", - }, - "Ant Build System": { - "iconify": "file-icons:apache-ant", - "codemirrorLanguage": "xml", - }, - "Antlers": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ApacheConf": { - "iconify": "vscode-icons:file-type-apache", - "codemirrorLanguage": null, - }, - "Apex": { - "iconify": "vscode-icons:file-type-java", - "codemirrorLanguage": "java", - }, - "Apollo Guidance Computer": { - "iconify": "file-icons:assembly-generic", - "codemirrorLanguage": null, - }, - "AppleScript": { - "iconify": "vscode-icons:file-type-applescript", - "codemirrorLanguage": null, - }, - "Arc": { - "iconify": null, - "codemirrorLanguage": null, - }, - "AsciiDoc": { - "iconify": "vscode-icons:file-type-asciidoc", - "codemirrorLanguage": null, - }, - "AspectJ": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Assembly": { - "iconify": "file-icons:assembly-generic", - "codemirrorLanguage": null, - }, - "Astro": { - "iconify": "vscode-icons:file-type-astro", - "codemirrorLanguage": "tsx", - }, - "Asymptote": { - "iconify": "file-icons:asymptote", - "codemirrorLanguage": "kotlin", - }, - "Augeas": { - "iconify": "file-icons:augeas", - "codemirrorLanguage": null, - }, - "AutoHotkey": { - "iconify": "file-icons:autohotkey", - "codemirrorLanguage": null, - }, - "AutoIt": { - "iconify": "file-icons:autoit", - "codemirrorLanguage": null, - }, - "Avro IDL": { - "iconify": "vscode-icons:file-type-apache", - "codemirrorLanguage": null, - }, - "Awk": { - "iconify": "vscode-icons:file-type-awk", - "codemirrorLanguage": null, - }, - "B4X": { - "iconify": null, - "codemirrorLanguage": "vb", - }, - "BASIC": { - "iconify": "devicon:visualbasic", - "codemirrorLanguage": 'basic', - }, - "BQN": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Ballerina": { - "iconify": "vscode-icons:file-type-ballerina", - "codemirrorLanguage": null, - }, - "Batchfile": { - "iconify": "vscode-icons:file-type-bat", - "codemirrorLanguage": null, - }, - "Beef": { - "iconify": null, - "codemirrorLanguage": "c#", - }, - "Befunge": { - "iconify": "vscode-icons:file-type-befunge", - "codemirrorLanguage": null, - }, - "Berry": { - "iconify": null, - "codemirrorLanguage": null, - }, - "BibTeX": { - "iconify": "file-icons:bibtex", - "codemirrorLanguage": "stex", - }, - "Bicep": { - "iconify": "vscode-icons:file-type-bicep", - "codemirrorLanguage": null, - }, - "Bikeshed": { - "iconify": "file-icons:bikeshed", - "codemirrorLanguage": null, - }, - "Bison": { - "iconify": "file-icons:bison", - "codemirrorLanguage": null, - }, - "BitBake": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Blade": { - "iconify": "vscode-icons:file-type-blade", - "codemirrorLanguage": null, - }, - "BlitzBasic": { - "iconify": "vscode-icons:file-type-blitzbasic", - "codemirrorLanguage": null, - }, - "BlitzMax": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Bluespec": { - "iconify": "file-icons:bluespec", - "codemirrorLanguage": "verilog", - }, - "Bluespec BH": { - "iconify": "file-icons:bluespec", - "codemirrorLanguage": "haskell", - }, - "Boo": { - "iconify": "file-icons:boo", - "codemirrorLanguage": null, - }, - "Boogie": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Brainfuck": { - "iconify": "file-icons:brainfuck", - "codemirrorLanguage": "brainfuck", - }, - "BrighterScript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Brightscript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Browserslist": { - "iconify": "file-icons:browserslist", - "codemirrorLanguage": null, - }, - "C": { - "iconify": "vscode-icons:file-type-c", - "codemirrorLanguage": "c", - }, - "C#": { - "iconify": "vscode-icons:file-type-csharp", - "codemirrorLanguage": "c#", - }, - "C++": { - "iconify": "vscode-icons:file-type-cpp", - "codemirrorLanguage": "c", - }, - "C-ObjDump": { - "iconify": null, - "codemirrorLanguage": null, - }, - "C2hs Haskell": { - "iconify": "vscode-icons:file-type-haskell", - "codemirrorLanguage": "haskell", - }, - "CAP CDS": { - "iconify": null, - "codemirrorLanguage": null, - }, - "CIL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "CLIPS": { - "iconify": "file-icons:clips", - "codemirrorLanguage": null, - }, - "CMake": { - "iconify": "vscode-icons:file-type-cmake", - "codemirrorLanguage": "cmake", - }, - "COBOL": { - "iconify": "vscode-icons:file-type-cobol", - "codemirrorLanguage": "cobol", - }, - "CODEOWNERS": { - "iconify": "vscode-icons:file-type-codeowners", - "codemirrorLanguage": null, - }, - "COLLADA": { - "iconify": null, - "codemirrorLanguage": "xml", - }, - "CSON": { - "iconify": "file-icons:config-coffeescript", - "codemirrorLanguage": "coffeescript", - }, - "CSS": { - "iconify": "vscode-icons:file-type-css", - "codemirrorLanguage": "css", - }, - "CSV": { - "iconify": "vscode-icons:file-type-excel", - "codemirrorLanguage": "spreadsheet", - }, - "CUE": { - "iconify": null, - "codemirrorLanguage": null, - }, - "CWeb": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Cabal Config": { - "iconify": "vscode-icons:file-type-cabal", - "codemirrorLanguage": "haskell", - }, - "Caddyfile": { - "iconify": "vscode-icons:file-type-caddy", - "codemirrorLanguage": null, - }, - "Cadence": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Cairo": { - "iconify": "file-icons:cairo", - "codemirrorLanguage": null, - }, - "Cairo Zero": { - "iconify": "file-icons:cairo", - "codemirrorLanguage": null, - }, - "CameLIGO": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Cap'n Proto": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Carbon": { - "iconify": "devicon:carbon", - "codemirrorLanguage": null, - }, - "CartoCSS": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Ceylon": { - "iconify": "vscode-icons:file-type-ceylon", - "codemirrorLanguage": "ceylon", - }, - "Chapel": { - "iconify": "file-icons:chapel", - "codemirrorLanguage": null, - }, - "Charity": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Checksums": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ChucK": { - "iconify": "file-icons:chuck", - "codemirrorLanguage": "java", - }, - "Circom": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Cirru": { - "iconify": "file-icons:cirru", - "codemirrorLanguage": null, - }, - "Clarion": { - "iconify": "file-icons:clarion", - "codemirrorLanguage": null, - }, - "Clarity": { - "iconify": "devicon:clarity", - "codemirrorLanguage": "common lisp", - }, - "Classic ASP": { - "iconify": "vscode-icons:file-type-asp", - "codemirrorLanguage": null, - }, - "Clean": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Click": { - "iconify": "file-icons:click", - "codemirrorLanguage": null, - }, - "Clojure": { - "iconify": "vscode-icons:file-type-clojure", - "codemirrorLanguage": "clojure", - }, - "Closure Templates": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Cloud Firestore Security Rules": { - "iconify": null, - "codemirrorLanguage": null, - }, - "CoNLL-U": { - "iconify": null, - "codemirrorLanguage": null, - }, - "CodeQL": { - "iconify": "vscode-icons:file-type-codeql", - "codemirrorLanguage": null, - }, - "CoffeeScript": { - "iconify": "vscode-icons:file-type-coffeescript", - "codemirrorLanguage": "coffeescript", - }, - "ColdFusion": { - "iconify": "file-icons:coldfusion", - "codemirrorLanguage": null, - }, - "ColdFusion CFC": { - "iconify": "file-icons:coldfusion", - "codemirrorLanguage": null, - }, - "Common Lisp": { - "iconify": "file-icons:common-lisp", - "codemirrorLanguage": "common lisp", - }, - "Common Workflow Language": { - "iconify": "file-icons:cwl", - "codemirrorLanguage": "yaml", - }, - "Component Pascal": { - "iconify": "file-icons:component-pascal", - "codemirrorLanguage": "pascal", - }, - "Cool": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Coq": { - "iconify": "file-icons:coq", - "codemirrorLanguage": null, - }, - "Cpp-ObjDump": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Creole": { - "iconify": "file-icons:creole", - "codemirrorLanguage": null, - }, - "Crystal": { - "iconify": "vscode-icons:file-type-crystal", - "codemirrorLanguage": "crystal", - }, - "Csound": { - "iconify": "file-icons:csound", - "codemirrorLanguage": null, - }, - "Csound Document": { - "iconify": "file-icons:csound", - "codemirrorLanguage": null, - }, - "Csound Score": { - "iconify": "file-icons:csound", - "codemirrorLanguage": null, - }, - "Cuda": { - "iconify": "vscode-icons:file-type-cuda", - "codemirrorLanguage": "shader", - }, - "Cue Sheet": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Curry": { - "iconify": "file-icons:curry", - "codemirrorLanguage": "haskell", - }, - "Cycript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Cylc": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Cypher": { - "iconify": null, - "codemirrorLanguage": "cypher", - }, - "Cython": { - "iconify": "file-icons:cython", - "codemirrorLanguage": "python", - }, - "D": { - "iconify": "vscode-icons:file-type-dlang", - "codemirrorLanguage": "d", - }, - "D-ObjDump": { - "iconify": "vscode-icons:file-type-dlang", - "codemirrorLanguage": null, - }, - "D2": { - "iconify": null, - "codemirrorLanguage": null, - }, - "DIGITAL Command Language": { - "iconify": null, - "codemirrorLanguage": null, - }, - "DM": { - "iconify": null, - "codemirrorLanguage": null, - }, - "DNS Zone": { - "iconify": null, - "codemirrorLanguage": null, - }, - "DTrace": { - "iconify": null, - "codemirrorLanguage": "c", - }, - "Dafny": { - "iconify": "file-icons:dafny", - "codemirrorLanguage": null, - }, - "Darcs Patch": { - "iconify": "file-icons:darcs-patch", - "codemirrorLanguage": null, - }, - "Dart": { - "iconify": "vscode-icons:file-type-dartlang", - "codemirrorLanguage": "dart", - }, - "DataWeave": { - "iconify": "file-icons:dataweave", - "codemirrorLanguage": null, - }, - "Debian Package Control File": { - "iconify": "vscode-icons:file-type-debian", - "codemirrorLanguage": null, - }, - "DenizenScript": { - "iconify": null, - "codemirrorLanguage": "yaml", - }, - "Dhall": { - "iconify": "vscode-icons:file-type-dhall", - "codemirrorLanguage": "haskell", - }, - "Diff": { - "iconify": "vscode-icons:file-type-diff", - "codemirrorLanguage": "diff", - }, - "DirectX 3D File": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Dockerfile": { - "iconify": "vscode-icons:file-type-docker", - "codemirrorLanguage": "dockerfile", - }, - "Dogescript": { - "iconify": "file-icons:dogescript", - "codemirrorLanguage": null, - }, - "Dotenv": { - "iconify": "vscode-icons:file-type-dotenv", - "codemirrorLanguage": null, - }, - "Dune": { - "iconify": null, - "codemirrorLanguage": "common lisp", - }, - "Dylan": { - "iconify": "vscode-icons:file-type-dylan", - "codemirrorLanguage": null, - }, - "E": { - "iconify": null, - "codemirrorLanguage": null, - }, - "E-mail": { - "iconify": null, - "codemirrorLanguage": null, - }, - "EBNF": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ECL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ECLiPSe": { - "iconify": "devicon:eclipse", - "codemirrorLanguage": null, - }, - "EJS": { - "iconify": "vscode-icons:file-type-ejs", - "codemirrorLanguage": null, - }, - "EQ": { - "iconify": "file-icons:eq", - "codemirrorLanguage": "c#", - }, - "Eagle": { - "iconify": "file-icons:eagle", - "codemirrorLanguage": "xml", - }, - "Earthly": { - "iconify": "vscode-icons:file-type-earthly", - "codemirrorLanguage": null, - }, - "Easybuild": { - "iconify": "file-icons:easybuild", - "codemirrorLanguage": "python", - }, - "Ecere Projects": { - "iconify": "file-icons:ecere", - "codemirrorLanguage": "jsx", - }, - "Ecmarkup": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Edge": { - "iconify": "file-icons:edge", - "codemirrorLanguage": null, - }, - "EdgeQL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "EditorConfig": { - "iconify": "file-icons:editorconfig", - "codemirrorLanguage": null, - }, - "Edje Data Collection": { - "iconify": null, - "codemirrorLanguage": "c", - }, - "Eiffel": { - "iconify": "file-icons:eiffel", - "codemirrorLanguage": null, - }, - "Elixir": { - "iconify": "vscode-icons:file-type-elixir", - "codemirrorLanguage": "elixir", - }, - "Elm": { - "iconify": "vscode-icons:file-type-elm", - "codemirrorLanguage": "elm", - }, - "Elvish": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Elvish Transcript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Emacs Lisp": { - "iconify": "file-icons:emacs", - "codemirrorLanguage": "common lisp", - }, - "EmberScript": { - "iconify": "file-icons:emberscript", - "codemirrorLanguage": null, - }, - "Erlang": { - "iconify": "vscode-icons:file-type-erlang", - "codemirrorLanguage": "erlang", - }, - "Euphoria": { - "iconify": null, - "codemirrorLanguage": null, - }, - "F#": { - "iconify": "vscode-icons:file-type-fsharp", - "codemirrorLanguage": null, - }, - "F*": { - "iconify": null, - "codemirrorLanguage": null, - }, - "FIGlet Font": { - "iconify": null, - "codemirrorLanguage": null, - }, - "FIRRTL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "FLUX": { - "iconify": "file-icons:flux", - "codemirrorLanguage": null, - }, - "Factor": { - "iconify": "file-icons:factor", - "codemirrorLanguage": null, - }, - "Fancy": { - "iconify": "file-icons:fancy", - "codemirrorLanguage": null, - }, - "Fantom": { - "iconify": "file-icons:fantom", - "codemirrorLanguage": null, - }, - "Faust": { - "iconify": "file-icons:faust", - "codemirrorLanguage": null, - }, - "Fennel": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Filebench WML": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Filterscript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Fluent": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Formatted": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Forth": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Fortran": { - "iconify": "vscode-icons:file-type-fortran", - "codemirrorLanguage": "fortran", - }, - "Fortran Free Form": { - "iconify": "vscode-icons:file-type-fortran", - "codemirrorLanguage": "fortran", - }, - "FreeBASIC": { - "iconify": null, - "codemirrorLanguage": "vb", - }, - "FreeMarker": { - "iconify": "vscode-icons:file-type-freemarker", - "codemirrorLanguage": null, - }, - "Frege": { - "iconify": "file-icons:frege", - "codemirrorLanguage": "haskell", - }, - "Futhark": { - "iconify": "file-icons:futhark", - "codemirrorLanguage": null, - }, - "G-code": { - "iconify": "vscode-icons:file-type-gcode", - "codemirrorLanguage": null, - }, - "GAML": { - "iconify": null, - "codemirrorLanguage": null, - }, - "GAMS": { - "iconify": "file-icons:gams", - "codemirrorLanguage": null, - }, - "GAP": { - "iconify": "file-icons:gap", - "codemirrorLanguage": null, - }, - "GCC Machine Description": { - "iconify": "devicon:gcc", - "codemirrorLanguage": "common lisp", - }, - "GDB": { - "iconify": "file-icons:gdb", - "codemirrorLanguage": null, - }, - "GDScript": { - "iconify": "file-icons:gdb", - "codemirrorLanguage": null, - }, - "GEDCOM": { - "iconify": null, - "codemirrorLanguage": null, - }, - "GLSL": { - "iconify": "vscode-icons:file-type-glsl", - "codemirrorLanguage": "shader", - }, - "GN": { - "iconify": "vscode-icons:file-type-python", - "codemirrorLanguage": "python", - }, - "GSC": { - "iconify": null, - "codemirrorLanguage": "c", - }, - "Game Maker Language": { - "iconify": null, - "codemirrorLanguage": "c", - }, - "Gemfile.lock": { - "iconify": "file-icons:rubygems", - "codemirrorLanguage": null, - }, - "Gemini": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Genero 4gl": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Genero per": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Genie": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Genshi": { - "iconify": "file-icons:genshi", - "codemirrorLanguage": "xml", - }, - "Gentoo Ebuild": { - "iconify": "file-icons:gentoo", - "codemirrorLanguage": "shell", - }, - "Gentoo Eclass": { - "iconify": "file-icons:gentoo", - "codemirrorLanguage": "shell", - }, - "Gerber Image": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Gettext Catalog": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Gherkin": { - "iconify": null, - "codemirrorLanguage": "gherkin", - }, - "Git Attributes": { - "iconify": "vscode-icons:file-type-git", - "codemirrorLanguage": "shell", - }, - "Git Config": { - "iconify": "vscode-icons:file-type-git", - "codemirrorLanguage": null, - }, - "Git Revision List": { - "iconify": "vscode-icons:file-type-git", - "codemirrorLanguage": null, - }, - "Gleam": { - "iconify": "vscode-icons:file-type-gleam", - "codemirrorLanguage": null, - }, - "Glimmer JS": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Glimmer TS": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Glyph": { - "iconify": "file-icons:glyphs", - "codemirrorLanguage": null, - }, - "Glyph Bitmap Distribution Format": { - "iconify": "file-icons:glyphs", - "codemirrorLanguage": null, - }, - "Gnuplot": { - "iconify": "vscode-icons:file-type-gnuplot", - "codemirrorLanguage": null, - }, - "Go": { - "iconify": "vscode-icons:file-type-go", - "codemirrorLanguage": "go", - }, - "Go Checksums": { - "iconify": "vscode-icons:file-type-go", - "codemirrorLanguage": null, - }, - "Go Module": { - "iconify": "vscode-icons:file-type-go", - "codemirrorLanguage": null, - }, - "Go Workspace": { - "iconify": "vscode-icons:file-type-go", - "codemirrorLanguage": null, - }, - "Godot Resource": { - "iconify": "vscode-icons:file-type-godot", - "codemirrorLanguage": null, - }, - "Golo": { - "iconify": "file-icons:golo", - "codemirrorLanguage": null, - }, - "Gosu": { - "iconify": "file-icons:gosu", - "codemirrorLanguage": null, - }, - "Grace": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Gradle": { - "iconify": "vscode-icons:file-type-gradle", - "codemirrorLanguage": null, - }, - "Gradle Kotlin DSL": { - "iconify": "vscode-icons:file-type-gradle", - "codemirrorLanguage": null, - }, - "Grammatical Framework": { - "iconify": null, - "codemirrorLanguage": "haskell", - }, - "Graph Modeling Language": { - "iconify": null, - "codemirrorLanguage": null, - }, - "GraphQL": { - "iconify": "vscode-icons:file-type-graphql", - "codemirrorLanguage": "graphql", - }, - "Graphviz (DOT)": { - "iconify": "file-icons:graphviz", - "codemirrorLanguage": "dot", - }, - "Groovy": { - "iconify": "vscode-icons:file-type-groovy", - "codemirrorLanguage": "groovy", - }, - "Groovy Server Pages": { - "iconify": "vscode-icons:file-type-groovy", - "codemirrorLanguage": null, - }, - "HAProxy": { - "iconify": null, - "codemirrorLanguage": null, - }, - "HCL": { - "iconify": "simple-icons:hcl", - "codemirrorLanguage": "hcl", - }, - "HLSL": { - "iconify": "vscode-icons:file-type-hlsl", - "codemirrorLanguage": null, - }, - "HOCON": { - "iconify": null, - "codemirrorLanguage": null, - }, - "HTML": { - "iconify": "vscode-icons:file-type-html", - "codemirrorLanguage": "html", - }, - "HTML+ECR": { - "iconify": "vscode-icons:file-type-html", - "codemirrorLanguage": "html", - }, - "HTML+EEX": { - "iconify": "vscode-icons:file-type-html", - "codemirrorLanguage": "html", - }, - "HTML+ERB": { - "iconify": "vscode-icons:file-type-html", - "codemirrorLanguage": "html", - }, - "HTML+PHP": { - "iconify": "vscode-icons:file-type-html", - "codemirrorLanguage": "html", - }, - "HTML+Razor": { - "iconify": "vscode-icons:file-type-html", - "codemirrorLanguage": "html", - }, - "HTTP": { - "iconify": "vscode-icons:file-type-http", - "codemirrorLanguage": null, - }, - "HXML": { - "iconify": null, - "codemirrorLanguage": "xml", - }, - "Hack": { - "iconify": "file-icons:hack", - "codemirrorLanguage": "php", - }, - "Haml": { - "iconify": "vscode-icons:file-type-haml", - "codemirrorLanguage": null, - }, - "Handlebars": { - "iconify": "vscode-icons:file-type-handlebars", - "codemirrorLanguage": "handlebars", - }, - "Harbour": { - "iconify": "vscode-icons:file-type-harbour", - "codemirrorLanguage": null, - }, - "Hare": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Haskell": { - "iconify": "vscode-icons:file-type-haskell", - "codemirrorLanguage": "haskell", - }, - "Haxe": { - "iconify": "vscode-icons:file-type-haxe", - "codemirrorLanguage": null, - }, - "HiveQL": { - "iconify": "vscode-icons:file-type-apache", - "codemirrorLanguage": "sql", - }, - "HolyC": { - "iconify": "file-icons:templeos", - "codemirrorLanguage": "c", - }, - "Hosts File": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Hy": { - "iconify": "vscode-icons:file-type-hy", - "codemirrorLanguage": null, - }, - "HyPhy": { - "iconify": null, - "codemirrorLanguage": null, - }, - "IDL": { - "iconify": "file-icons:idl", - "codemirrorLanguage": "idl", - }, - "IGOR Pro": { - "iconify": "file-icons:igor-pro", - "codemirrorLanguage": null, - }, - "INI": { - "iconify": "vscode-icons:file-type-ini", - "codemirrorLanguage": null, - }, - "IRC log": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Idris": { - "iconify": "vscode-icons:file-type-idris", - "codemirrorLanguage": null, - }, - "Ignore List": { - "iconify": "vscode-icons:file-type-git", - "codemirrorLanguage": "shell", - }, - "ImageJ Macro": { - "iconify": "simple-icons:imagej", - "codemirrorLanguage": null, - }, - "Imba": { - "iconify": "file-icons:imba", - "codemirrorLanguage": null, - }, - "Inform 7": { - "iconify": "file-icons:inform7", - "codemirrorLanguage": null, - }, - "Ink": { - "iconify": "vscode-icons:file-type-ink", - "codemirrorLanguage": null, - }, - "Inno Setup": { - "iconify": "vscode-icons:file-type-innosetup", - "codemirrorLanguage": null, - }, - "Io": { - "iconify": "vscode-icons:file-type-io", - "codemirrorLanguage": null, - }, - "Ioke": { - "iconify": "file-icons:ioke", - "codemirrorLanguage": null, - }, - "Isabelle": { - "iconify": "file-icons:isabelle", - "codemirrorLanguage": null, - }, - "Isabelle ROOT": { - "iconify": "file-icons:isabelle", - "codemirrorLanguage": null, - }, - "J": { - "iconify": "noto-v1:letter-j", - "codemirrorLanguage": "j", - }, - "JAR Manifest": { - "iconify": "vscode-icons:file-type-java", - "codemirrorLanguage": null, - }, - "JCL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "JFlex": { - "iconify": null, - "codemirrorLanguage": null, - }, - "JSON": { - "iconify": "vscode-icons:file-type-json", - "codemirrorLanguage": "json", - }, - "JSON with Comments": { - "iconify": "vscode-icons:file-type-json", - "codemirrorLanguage": "jsonc", - }, - "JSON5": { - "iconify": "vscode-icons:file-type-json5", - "codemirrorLanguage": "json", - }, - "JSONLD": { - "iconify": "vscode-icons:file-type-json", - "codemirrorLanguage": "json", - }, - "JSONiq": { - "iconify": "vscode-icons:file-type-json", - "codemirrorLanguage": "json", - }, - "Janet": { - "iconify": "vscode-icons:file-type-janet", - "codemirrorLanguage": "scheme", - }, - "Jasmin": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Java": { - "iconify": "vscode-icons:file-type-java", - "codemirrorLanguage": "java", - }, - "Java Properties": { - "iconify": "vscode-icons:file-type-java", - "codemirrorLanguage": "xml", - }, - "Java Server Pages": { - "iconify": "vscode-icons:file-type-java", - "codemirrorLanguage": null, - }, - "Java Template Engine": { - "iconify": "vscode-icons:file-type-java", - "codemirrorLanguage": null, - }, - "JavaScript": { - "iconify": "vscode-icons:file-type-js", - "codemirrorLanguage": "jsx", - }, - "JavaScript+ERB": { - "iconify": "vscode-icons:file-type-js", - "codemirrorLanguage": "jsx", - }, - "Jest Snapshot": { - "iconify": "vscode-icons:file-type-jest-snapshot", - "codemirrorLanguage": null, - }, - "JetBrains MPS": { - "iconify": "logos:jetbrains-icon", - "codemirrorLanguage": "xml", - }, - "Jinja": { - "iconify": "vscode-icons:file-type-jinja", - "codemirrorLanguage": "jinja2", - }, - "Jison": { - "iconify": "file-icons:jison", - "codemirrorLanguage": null, - }, - "Jison Lex": { - "iconify": "file-icons:jison", - "codemirrorLanguage": null, - }, - "Jolie": { - "iconify": "file-icons:jolie", - "codemirrorLanguage": null, - }, - "Jsonnet": { - "iconify": "vscode-icons:file-type-jsonnet", - "codemirrorLanguage": null, - }, - "Julia": { - "iconify": "vscode-icons:file-type-julia", - "codemirrorLanguage": "julia", - }, - "Julia REPL": { - "iconify": "vscode-icons:file-type-julia", - "codemirrorLanguage": null, - }, - "Jupyter Notebook": { - "iconify": "vscode-icons:file-type-jupyter", - "codemirrorLanguage": "json", - }, - "Just": { - "iconify": null, - "codemirrorLanguage": null, - }, - "KRL": { - "iconify": "file-icons:krl", - "codemirrorLanguage": null, - }, - "Kaitai Struct": { - "iconify": "file-icons:kaitai", - "codemirrorLanguage": "yaml", - }, - "KakouneScript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "KerboScript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "KiCad Layout": { - "iconify": "file-icons:kicad", - "codemirrorLanguage": "common lisp", - }, - "KiCad Legacy Layout": { - "iconify": "file-icons:kicad", - "codemirrorLanguage": null, - }, - "KiCad Schematic": { - "iconify": "file-icons:kicad", - "codemirrorLanguage": null, - }, - "Kickstart": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Kit": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Kotlin": { - "iconify": "vscode-icons:file-type-kotlin", - "codemirrorLanguage": "kotlin", - }, - "Kusto": { - "iconify": "vscode-icons:file-type-kusto", - "codemirrorLanguage": null, - }, - "LFE": { - "iconify": "file-icons:lfe", - "codemirrorLanguage": "common lisp", - }, - "LLVM": { - "iconify": "file-icons:llvm", - "codemirrorLanguage": null, - }, - "LOLCODE": { - "iconify": "vscode-icons:file-type-lolcode", - "codemirrorLanguage": null, - }, - "LSL": { - "iconify": "vscode-icons:file-type-lsl", - "codemirrorLanguage": null, - }, - "LTspice Symbol": { - "iconify": "simple-icons:ltspice", - "codemirrorLanguage": null, - }, - "LabVIEW": { - "iconify": "file-icons:labview", - "codemirrorLanguage": "xml", - }, - "Lark": { - "iconify": "file-icons:lark", - "codemirrorLanguage": null, - }, - "Lasso": { - "iconify": "file-icons:lasso", - "codemirrorLanguage": null, - }, - "Latte": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Lean": { - "iconify": "file-icons:lean", - "codemirrorLanguage": null, - }, - "Lean 4": { - "iconify": "file-icons:lean", - "codemirrorLanguage": null, - }, - "Less": { - "iconify": "vscode-icons:file-type-less", - "codemirrorLanguage": "less", - }, - "Lex": { - "iconify": "vscode-icons:file-type-lex", - "codemirrorLanguage": null, - }, - "LigoLANG": { - "iconify": null, - "codemirrorLanguage": "pascal", - }, - "LilyPond": { - "iconify": "vscode-icons:file-type-lilypond", - "codemirrorLanguage": null, - }, - "Limbo": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Linker Script": { - "iconify": "vscode-icons:file-type-text", - "codemirrorLanguage": null, - }, - "Linux Kernel Module": { - "iconify": "devicon:linux", - "codemirrorLanguage": null, - }, - "Liquid": { - "iconify": "vscode-icons:file-type-liquid", - "codemirrorLanguage": "liquid", - }, - "Literate Agda": { - "iconify": "file-icons:agda", - "codemirrorLanguage": null, - }, - "Literate CoffeeScript": { - "iconify": "vscode-icons:file-type-coffeescript", - "codemirrorLanguage": null, - }, - "Literate Haskell": { - "iconify": "vscode-icons:file-type-haskell", - "codemirrorLanguage": "haskell", - }, - "LiveCode Script": { - "iconify": null, - "codemirrorLanguage": null, - }, - "LiveScript": { - "iconify": "vscode-icons:file-type-livescript", - "codemirrorLanguage": "livescript", - }, - "Logos": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Logtalk": { - "iconify": "file-icons:logtalk", - "codemirrorLanguage": null, - }, - "LookML": { - "iconify": "file-icons:lookml", - "codemirrorLanguage": "yaml", - }, - "LoomScript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Lua": { - "iconify": "vscode-icons:file-type-lua", - "codemirrorLanguage": "lua", - }, - "Luau": { - "iconify": "vscode-icons:file-type-luau", - "codemirrorLanguage": "lua", - }, - "M": { - "iconify": null, - "codemirrorLanguage": null, - }, - "M4": { - "iconify": null, - "codemirrorLanguage": null, - }, - "M4Sugar": { - "iconify": null, - "codemirrorLanguage": null, - }, - "MATLAB": { - "iconify": "vscode-icons:file-type-matlab", - "codemirrorLanguage": "octave", - }, - "MAXScript": { - "iconify": "vscode-icons:file-type-maxscript", - "codemirrorLanguage": null, - }, - "MDX": { - "iconify": "vscode-icons:file-type-mdx", - "codemirrorLanguage": null, - }, - "MLIR": { - "iconify": null, - "codemirrorLanguage": null, - }, - "MQL4": { - "iconify": null, - "codemirrorLanguage": null, - }, - "MQL5": { - "iconify": null, - "codemirrorLanguage": null, - }, - "MTML": { - "iconify": null, - "codemirrorLanguage": null, - }, - "MUF": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Macaulay2": { - "iconify": "file-icons:macaulay2", - "codemirrorLanguage": null, - }, - "Makefile": { - "iconify": "vscode-icons:file-type-makefile", - "codemirrorLanguage": "makefile", - }, - "Mako": { - "iconify": "file-icons:mako", - "codemirrorLanguage": null, - }, - "Markdown": { - "iconify": "vscode-icons:file-type-markdown", - "codemirrorLanguage": "markdown", - }, - "Marko": { - "iconify": "vscode-icons:file-type-marko", - "codemirrorLanguage": null, - }, - "Mask": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Mathematica": { - "iconify": "file-icons:mathematica", - "codemirrorLanguage": null, - }, - "Maven POM": { - "iconify": "vscode-icons:file-type-maven", - "codemirrorLanguage": "xml", - }, - "Max": { - "iconify": "file-icons:max", - "codemirrorLanguage": null, - }, - "Mercury": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Mermaid": { - "iconify": "vscode-icons:file-type-mermaid", - "codemirrorLanguage": "mermaid", - }, - "Meson": { - "iconify": "vscode-icons:file-type-meson", - "codemirrorLanguage": null, - }, - "Metal": { - "iconify": "file-icons:metal", - "codemirrorLanguage": "c", - }, - "Microsoft Developer Studio Project": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Microsoft Visual Studio Solution": { - "iconify": null, - "codemirrorLanguage": null, - }, - "MiniD": { - "iconify": null, - "codemirrorLanguage": null, - }, - "MiniYAML": { - "iconify": "vscode-icons:file-type-yaml", - "codemirrorLanguage": "yaml", - }, - "Mint": { - "iconify": "file-icons:mint", - "codemirrorLanguage": null, - }, - "Mirah": { - "iconify": "file-icons:mirah", - "codemirrorLanguage": "ruby", - }, - "Modelica": { - "iconify": "file-icons:modelica", - "codemirrorLanguage": null, - }, - "Modula-2": { - "iconify": "file-icons:modula-2", - "codemirrorLanguage": null, - }, - "Modula-3": { - "iconify": "file-icons:modula-3", - "codemirrorLanguage": null, - }, - "Module Management System": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Mojo": { - "iconify": "vscode-icons:file-type-mojo", - "codemirrorLanguage": "python", - }, - "Monkey": { - "iconify": "file-icons:monkey", - "codemirrorLanguage": null, - }, - "Monkey C": { - "iconify": "file-icons:monkey", - "codemirrorLanguage": "c", - }, - "Moocode": { - "iconify": null, - "codemirrorLanguage": null, - }, - "MoonBit": { - "iconify": null, - "codemirrorLanguage": null, - }, - "MoonScript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Motoko": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Motorola 68K Assembly": { - "iconify": "file-icons:assembly-motorola", - "codemirrorLanguage": null, - }, - "Move": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Muse": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Mustache": { - "iconify": "vscode-icons:file-type-mustache", - "codemirrorLanguage": null, - }, - "Myghty": { - "iconify": null, - "codemirrorLanguage": null, - }, - "NASL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "NCL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "NEON": { - "iconify": "file-icons:neon", - "codemirrorLanguage": null, - }, - "NL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "NMODL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "NPM Config": { - "iconify": "vscode-icons:file-type-npm", - "codemirrorLanguage": null, - }, - "NSIS": { - "iconify": "file-icons:nsis", - "codemirrorLanguage": null, - }, - "NWScript": { - "iconify": "file-icons:nwscript", - "codemirrorLanguage": "c", - }, - "Nasal": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Nearley": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Nemerle": { - "iconify": "file-icons:nemerle", - "codemirrorLanguage": null, - }, - "NetLinx": { - "iconify": "file-icons:netlinx", - "codemirrorLanguage": null, - }, - "NetLinx+ERB": { - "iconify": "file-icons:netlinx", - "codemirrorLanguage": null, - }, - "NetLogo": { - "iconify": "file-icons:netlogo", - "codemirrorLanguage": "common lisp", - }, - "NewLisp": { - "iconify": "file-icons:lisp", - "codemirrorLanguage": "common lisp", - }, - "Nextflow": { - "iconify": "vscode-icons:file-type-nextflow", - "codemirrorLanguage": null, - }, - "Nginx": { - "iconify": "vscode-icons:file-type-nginx", - "codemirrorLanguage": "nginx", - }, - "Nim": { - "iconify": "vscode-icons:file-type-nim", - "codemirrorLanguage": null, - }, - "Ninja": { - "iconify": "vscode-icons:file-type-ninja", - "codemirrorLanguage": null, - }, - "Nit": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Nix": { - "iconify": "vscode-icons:file-type-nix", - "codemirrorLanguage": "nix", - }, - "Noir": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Nu": { - "iconify": null, - "codemirrorLanguage": "scheme", - }, - "NumPy": { - "iconify": "vscode-icons:file-type-numpy", - "codemirrorLanguage": "python", - }, - "Nunjucks": { - "iconify": "vscode-icons:file-type-nunjucks", - "codemirrorLanguage": null, - }, - "Nushell": { - "iconify": "vscode-icons:file-type-shell", - "codemirrorLanguage": "shell", - }, - "OASv2-json": { - "iconify": "vscode-icons:file-type-json", - "codemirrorLanguage": "json", - }, - "OASv2-yaml": { - "iconify": "vscode-icons:file-type-yaml", - "codemirrorLanguage": "yaml", - }, - "OASv3-json": { - "iconify": "vscode-icons:file-type-json", - "codemirrorLanguage": "json", - }, - "OASv3-yaml": { - "iconify": "vscode-icons:file-type-yaml", - "codemirrorLanguage": "yaml", - }, - "OCaml": { - "iconify": "vscode-icons:file-type-ocaml", - "codemirrorLanguage": null, - }, - "Oberon": { - "iconify": "file-icons:oberon", - "codemirrorLanguage": null, - }, - "ObjDump": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Object Data Instance Notation": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ObjectScript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Objective-C": { - "iconify": "vscode-icons:file-type-objectivec", - "codemirrorLanguage": "objective-c", - }, - "Objective-C++": { - "iconify": "vscode-icons:file-type-objectivecpp", - "codemirrorLanguage": "objective-c++", - }, - "Objective-J": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Odin": { - "iconify": "file-icons:odin", - "codemirrorLanguage": null, - }, - "Omgrofl": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Opa": { - "iconify": "file-icons:opa", - "codemirrorLanguage": null, - }, - "Opal": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Open Policy Agent": { - "iconify": "file-icons:openpolicyagent", - "codemirrorLanguage": null, - }, - "OpenAPI Specification v2": { - "iconify": "file-icons:openapi", - "codemirrorLanguage": null, - }, - "OpenAPI Specification v3": { - "iconify": "file-icons:openapi", - "codemirrorLanguage": null, - }, - "OpenCL": { - "iconify": "vscode-icons:file-type-opencl", - "codemirrorLanguage": "c", - }, - "OpenEdge ABL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "OpenQASM": { - "iconify": null, - "codemirrorLanguage": null, - }, - "OpenRC runscript": { - "iconify": null, - "codemirrorLanguage": "shell", - }, - "OpenSCAD": { - "iconify": "vscode-icons:file-type-openscad", - "codemirrorLanguage": null, - }, - "OpenStep Property List": { - "iconify": null, - "codemirrorLanguage": null, - }, - "OpenType Feature File": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Option List": { - "iconify": null, - "codemirrorLanguage": "shell", - }, - "Org": { - "iconify": "vscode-icons:file-type-org", - "codemirrorLanguage": null, - }, - "Ox": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Oxygene": { - "iconify": "file-icons:oxygene", - "codemirrorLanguage": null, - }, - "Oz": { - "iconify": "file-icons:oz", - "codemirrorLanguage": null, - }, - "P4": { - "iconify": "file-icons:p4", - "codemirrorLanguage": null, - }, - "PDDL": { - "iconify": "vscode-icons:file-type-pddl", - "codemirrorLanguage": null, - }, - "PEG.js": { - "iconify": "file-icons:pegjs", - "codemirrorLanguage": null, - }, - "PHP": { - "iconify": "vscode-icons:file-type-php", - "codemirrorLanguage": "php", - }, - "PLSQL": { - "iconify": "vscode-icons:file-type-plsql", - "codemirrorLanguage": "sql", - }, - "PLpgSQL": { - "iconify": null, - "codemirrorLanguage": "sql", - }, - "POV-Ray SDL": { - "iconify": "file-icons:pov-ray", - "codemirrorLanguage": null, - }, - "Pact": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Pan": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Papyrus": { - "iconify": "file-icons:papyrus", - "codemirrorLanguage": null, - }, - "Parrot": { - "iconify": "file-icons:parrot", - "codemirrorLanguage": null, - }, - "Parrot Assembly": { - "iconify": "file-icons:assembly-generic", - "codemirrorLanguage": null, - }, - "Parrot Internal Representation": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Pascal": { - "iconify": "file-icons:pascal", - "codemirrorLanguage": "pascal", - }, - "Pawn": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Pep8": { - "iconify": "vscode-icons:file-type-python", - "codemirrorLanguage": null, - }, - "Perl": { - "iconify": "vscode-icons:file-type-perl", - "codemirrorLanguage": "perl", - }, - "Pic": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Pickle": { - "iconify": "file-icons:pickle", - "codemirrorLanguage": null, - }, - "PicoLisp": { - "iconify": "file-icons:picolisp", - "codemirrorLanguage": "common lisp", - }, - "PigLatin": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Pike": { - "iconify": "file-icons:pike", - "codemirrorLanguage": null, - }, - "Pip Requirements": { - "iconify": "vscode-icons:file-type-pip", - "codemirrorLanguage": null, - }, - "Pkl": { - "iconify": null, - "codemirrorLanguage": null, - }, - "PlantUML": { - "iconify": "vscode-icons:file-type-plantuml", - "codemirrorLanguage": null, - }, - "Pod": { - "iconify": "vscode-icons:file-type-perl", - "codemirrorLanguage": "perl", - }, - "Pod 6": { - "iconify": "vscode-icons:file-type-perl", - "codemirrorLanguage": "perl", - }, - "PogoScript": { - "iconify": "file-icons:pogoscript", - "codemirrorLanguage": null, - }, - "Polar": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Pony": { - "iconify": "vscode-icons:file-type-pony", - "codemirrorLanguage": null, - }, - "Portugol": { - "iconify": null, - "codemirrorLanguage": null, - }, - "PostCSS": { - "iconify": "vscode-icons:file-type-postcss", - "codemirrorLanguage": null, - }, - "PostScript": { - "iconify": "file-icons:postscript", - "codemirrorLanguage": null, - }, - "PowerBuilder": { - "iconify": "file-icons:powerbuilder", - "codemirrorLanguage": null, - }, - "PowerShell": { - "iconify": "vscode-icons:file-type-powershell", - "codemirrorLanguage": "powershell", - }, - "Praat": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Prisma": { - "iconify": "vscode-icons:file-type-prisma", - "codemirrorLanguage": null, - }, - "Processing": { - "iconify": "vscode-icons:file-type-processinglang", - "codemirrorLanguage": null, - }, - "Procfile": { - "iconify": "vscode-icons:file-type-procfile", - "codemirrorLanguage": null, - }, - "Proguard": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Prolog": { - "iconify": "vscode-icons:file-type-prolog", - "codemirrorLanguage": "prolog", - }, - "Promela": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Propeller Spin": { - "iconify": "file-icons:propeller", - "codemirrorLanguage": null, - }, - "Protocol Buffer": { - "iconify": "vscode-icons:file-type-protobuf", - "codemirrorLanguage": "protobuf", - }, - "Protocol Buffer Text Format": { - "iconify": "vscode-icons:file-type-protobuf", - "codemirrorLanguage": null, - }, - "Public Key": { - "iconify": "vscode-icons:file-type-key", - "codemirrorLanguage": null, - }, - "Pug": { - "iconify": "vscode-icons:file-type-pug", - "codemirrorLanguage": "pug", - }, - "Puppet": { - "iconify": "vscode-icons:file-type-puppet", - "codemirrorLanguage": "puppet", - }, - "Pure Data": { - "iconify": null, - "codemirrorLanguage": null, - }, - "PureBasic": { - "iconify": "file-icons:purebasic", - "codemirrorLanguage": null, - }, - "PureScript": { - "iconify": "vscode-icons:file-type-purescript", - "codemirrorLanguage": "haskell", - }, - "Pyret": { - "iconify": "vscode-icons:file-type-pyret", - "codemirrorLanguage": "python", - }, - "Python": { - "iconify": "vscode-icons:file-type-python", - "codemirrorLanguage": "python", - }, - "Python console": { - "iconify": "vscode-icons:file-type-python", - "codemirrorLanguage": null, - }, - "Python traceback": { - "iconify": "vscode-icons:file-type-python", - "codemirrorLanguage": null, - }, - "Q#": { - "iconify": "vscode-icons:file-type-qsharp", - "codemirrorLanguage": null, - }, - "QML": { - "iconify": "vscode-icons:file-type-qml", - "codemirrorLanguage": null, - }, - "QMake": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Qt Script": { - "iconify": "file-icons:qt", - "codemirrorLanguage": null, - }, - "Quake": { - "iconify": null, - "codemirrorLanguage": null, - }, - "QuickBASIC": { - "iconify": null, - "codemirrorLanguage": "vb", - }, - "R": { - "iconify": "vscode-icons:file-type-r", - "codemirrorLanguage": "r", - }, - "RAML": { - "iconify": "vscode-icons:file-type-raml", - "codemirrorLanguage": null, - }, - "RBS": { - "iconify": null, - "codemirrorLanguage": "ruby", - }, - "RDoc": { - "iconify": "file-icons:rdoc", - "codemirrorLanguage": null, - }, - "REALbasic": { - "iconify": "file-icons:realbasic", - "codemirrorLanguage": null, - }, - "REXX": { - "iconify": "vscode-icons:file-type-rexx", - "codemirrorLanguage": null, - }, - "RMarkdown": { - "iconify": "file-icons:rmarkdown", - "codemirrorLanguage": null, - }, - "RON": { - "iconify": "vscode-icons:file-type-ron", - "codemirrorLanguage": null, - }, - "RPC": { - "iconify": null, - "codemirrorLanguage": null, - }, - "RPGLE": { - "iconify": null, - "codemirrorLanguage": null, - }, - "RPM Spec": { - "iconify": "devicon:redhat-wordmark", - "codemirrorLanguage": "rpm spec", - }, - "RUNOFF": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Racket": { - "iconify": "vscode-icons:file-type-racket", - "codemirrorLanguage": "common lisp", - }, - "Ragel": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Raku": { - "iconify": "vscode-icons:file-type-raku", - "codemirrorLanguage": "perl", - }, - "Rascal": { - "iconify": "file-icons:rascal", - "codemirrorLanguage": null, - }, - "Raw token data": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ReScript": { - "iconify": "vscode-icons:file-type-rescript", - "codemirrorLanguage": null, - }, - "Readline Config": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Reason": { - "iconify": "vscode-icons:file-type-reason", - "codemirrorLanguage": null, - }, - "ReasonLIGO": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Rebol": { - "iconify": "file-icons:rebol", - "codemirrorLanguage": null, - }, - "Record Jar": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Red": { - "iconify": "file-icons:red", - "codemirrorLanguage": null, - }, - "Redcode": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Redirect Rules": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Regular Expression": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Ren'Py": { - "iconify": "devicon:renpy", - "codemirrorLanguage": "python", - }, - "RenderScript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Rez": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Rich Text Format": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Ring": { - "iconify": "file-icons:ring", - "codemirrorLanguage": null, - }, - "Riot": { - "iconify": "vscode-icons:file-type-riot", - "codemirrorLanguage": null, - }, - "RobotFramework": { - "iconify": "vscode-icons:file-type-robotframework", - "codemirrorLanguage": null, - }, - "Roc": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Roff": { - "iconify": "file-icons:manpage", - "codemirrorLanguage": null, - }, - "Roff Manpage": { - "iconify": "file-icons:manpage", - "codemirrorLanguage": null, - }, - "Rouge": { - "iconify": null, - "codemirrorLanguage": "clojure", - }, - "RouterOS Script": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Ruby": { - "iconify": "vscode-icons:file-type-ruby", - "codemirrorLanguage": "ruby", - }, - "Rust": { - "iconify": "vscode-icons:file-type-rust", - "codemirrorLanguage": "rust", - }, - "SAS": { - "iconify": "vscode-icons:file-type-sas", - "codemirrorLanguage": null, - }, - "SCSS": { - "iconify": "vscode-icons:file-type-scss", - "codemirrorLanguage": null, - }, - "SELinux Policy": { - "iconify": "devicon:linux", - "codemirrorLanguage": null, - }, - "SMT": { - "iconify": null, - "codemirrorLanguage": null, - }, - "SPARQL": { - "iconify": "vscode-icons:file-type-sparql", - "codemirrorLanguage": "sparql", - }, - "SQF": { - "iconify": "vscode-icons:file-type-sqf", - "codemirrorLanguage": null, - }, - "SQL": { - "iconify": "vscode-icons:file-type-sql", - "codemirrorLanguage": "sql", - }, - "SQLPL": { - "iconify": null, - "codemirrorLanguage": "sql", - }, - "SRecode Template": { - "iconify": null, - "codemirrorLanguage": "common lisp", - }, - "SSH Config": { - "iconify": null, - "codemirrorLanguage": null, - }, - "STAR": { - "iconify": null, - "codemirrorLanguage": null, - }, - "STL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "STON": { - "iconify": null, - "codemirrorLanguage": null, - }, - "SVG": { - "iconify": "vscode-icons:file-type-svg", - "codemirrorLanguage": "xml", - }, - "SWIG": { - "iconify": "vscode-icons:file-type-swig", - "codemirrorLanguage": "c", - }, - "Sage": { - "iconify": "file-icons:sage", - "codemirrorLanguage": "python", - }, - "SaltStack": { - "iconify": "vscode-icons:file-type-saltstack", - "codemirrorLanguage": null, - }, - "Sass": { - "iconify": "vscode-icons:file-type-sass", - "codemirrorLanguage": "sass", - }, - "Scala": { - "iconify": "vscode-icons:file-type-scala", - "codemirrorLanguage": "scala", - }, - "Scaml": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Scenic": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Scheme": { - "iconify": "file-icons:scheme", - "codemirrorLanguage": "scheme", - }, - "Scilab": { - "iconify": "vscode-icons:file-type-scilab", - "codemirrorLanguage": null, - }, - "Self": { - "iconify": "file-icons:self", - "codemirrorLanguage": null, - }, - "ShaderLab": { - "iconify": "vscode-icons:file-type-shaderlab", - "codemirrorLanguage": null, - }, - "Shell": { - "iconify": "vscode-icons:file-type-shell", - "codemirrorLanguage": "shell", - }, - "ShellCheck Config": { - "iconify": "file-icons:shellcheck", - "codemirrorLanguage": null, - }, - "ShellSession": { - "iconify": "vscode-icons:file-type-shell", - "codemirrorLanguage": "shell", - }, - "Shen": { - "iconify": "file-icons:shen", - "codemirrorLanguage": null, - }, - "Sieve": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Simple File Verification": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Singularity": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Slash": { - "iconify": "file-icons:slash", - "codemirrorLanguage": null, - }, - "Slice": { - "iconify": "vscode-icons:file-type-slice", - "codemirrorLanguage": null, - }, - "Slim": { - "iconify": "vscode-icons:file-type-slim", - "codemirrorLanguage": null, - }, - "Slint": { - "iconify": "vscode-icons:file-type-slint", - "codemirrorLanguage": null, - }, - "SmPL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Smali": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Smalltalk": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Smarty": { - "iconify": "vscode-icons:file-type-smarty", - "codemirrorLanguage": null, - }, - "Smithy": { - "iconify": null, - "codemirrorLanguage": "c", - }, - "Snakemake": { - "iconify": "vscode-icons:file-type-snakemake", - "codemirrorLanguage": "python", - }, - "Solidity": { - "iconify": "vscode-icons:file-type-solidity", - "codemirrorLanguage": "solidity", - }, - "Soong": { - "iconify": null, - "codemirrorLanguage": null, - }, - "SourcePawn": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Spline Font Database": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Squirrel": { - "iconify": "vscode-icons:file-type-squirrel", - "codemirrorLanguage": "squirrel", - }, - "Stan": { - "iconify": "vscode-icons:file-type-stan", - "codemirrorLanguage": null, - }, - "Standard ML": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Starlark": { - "iconify": "vscode-icons:file-type-bazel", - "codemirrorLanguage": "python", - }, - "Stata": { - "iconify": "vscode-icons:file-type-stata", - "codemirrorLanguage": null, - }, - "StringTemplate": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Stylus": { - "iconify": "vscode-icons:file-type-stylus", - "codemirrorLanguage": null, - }, - "SubRip Text": { - "iconify": null, - "codemirrorLanguage": null, - }, - "SugarSS": { - "iconify": null, - "codemirrorLanguage": null, - }, - "SuperCollider": { - "iconify": "file-icons:supercollider", - "codemirrorLanguage": null, - }, - "Svelte": { - "iconify": "vscode-icons:file-type-svelte", - "codemirrorLanguage": "svelte", - }, - "Sway": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Sweave": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Swift": { - "iconify": "vscode-icons:file-type-swift", - "codemirrorLanguage": "swift", - }, - "SystemVerilog": { - "iconify": "vscode-icons:file-type-systemverilog", - "codemirrorLanguage": "verilog", - }, - "TI Program": { - "iconify": null, - "codemirrorLanguage": null, - }, - "TL-Verilog": { - "iconify": "vscode-icons:file-type-verilog", - "codemirrorLanguage": "verilog", - }, - "TLA": { - "iconify": "file-icons:tla", - "codemirrorLanguage": null, - }, - "TOML": { - "iconify": "vscode-icons:file-type-toml", - "codemirrorLanguage": "toml", - }, - "TSPLIB data": { - "iconify": null, - "codemirrorLanguage": null, - }, - "TSQL": { - "iconify": null, - "codemirrorLanguage": "sql", - }, - "TSV": { - "iconify": null, - "codemirrorLanguage": null, - }, - "TSX": { - "iconify": "vscode-icons:file-type-reactts", - "codemirrorLanguage": "tsx", - }, - "TXL": { - "iconify": "file-icons:txl", - "codemirrorLanguage": null, - }, - "Tact": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Talon": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Tcl": { - "iconify": "vscode-icons:file-type-tcl", - "codemirrorLanguage": "tcl", - }, - "Tcsh": { - "iconify": null, - "codemirrorLanguage": "shell", - }, - "TeX": { - "iconify": "vscode-icons:file-type-tex", - "codemirrorLanguage": "stex", - }, - "Tea": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Terra": { - "iconify": null, - "codemirrorLanguage": "lua", - }, - "Terraform Template": { - "iconify": "vscode-icons:file-type-terraform", - "codemirrorLanguage": "ruby", - }, - "Texinfo": { - "iconify": "vscode-icons:file-type-tex", - "codemirrorLanguage": null, - }, - "Text": { - "iconify": "vscode-icons:file-type-text", - "codemirrorLanguage": null, - }, - "TextGrid": { - "iconify": null, - "codemirrorLanguage": null, - }, - "TextMate Properties": { - "iconify": "file-icons:textmate", - "codemirrorLanguage": null, - }, - "Textile": { - "iconify": "vscode-icons:file-type-textile", - "codemirrorLanguage": "textile", - }, - "Thrift": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Toit": { - "iconify": "vscode-icons:file-type-toit", - "codemirrorLanguage": null, - }, - "Turing": { - "iconify": "file-icons:turing", - "codemirrorLanguage": null, - }, - "Turtle": { - "iconify": null, - "codemirrorLanguage": "turtle", - }, - "Twig": { - "iconify": "vscode-icons:file-type-twig", - "codemirrorLanguage": "twig", - }, - "Type Language": { - "iconify": null, - "codemirrorLanguage": null, - }, - "TypeScript": { - "iconify": "vscode-icons:file-type-typescript", - "codemirrorLanguage": "typescript", - }, - "TypeSpec": { - "iconify": "vscode-icons:file-type-typescript", - "codemirrorLanguage": "typescript", - }, - "Typst": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Unified Parallel C": { - "iconify": "vscode-icons:file-type-c", - "codemirrorLanguage": "c", - }, - "Unity3D Asset": { - "iconify": "devicon:unity", - "codemirrorLanguage": null, - }, - "Unix Assembly": { - "iconify": "file-icons:assembly-generic", - "codemirrorLanguage": null, - }, - "Uno": { - "iconify": "file-icons:uno", - "codemirrorLanguage": "c#", - }, - "UnrealScript": { - "iconify": "file-icons:unrealscript", - "codemirrorLanguage": "java", - }, - "UrWeb": { - "iconify": "file-icons:urweb", - "codemirrorLanguage": null, - }, - "V": { - "iconify": null, - "codemirrorLanguage": null, - }, - "VBA": { - "iconify": "vscode-icons:file-type-vba", - "codemirrorLanguage": "vb", - }, - "VBScript": { - "iconify": "vscode-icons:file-type-vb", - "codemirrorLanguage": "vbscript", - }, - "VCL": { - "iconify": "file-icons:vcl", - "codemirrorLanguage": null, - }, - "VHDL": { - "iconify": "vscode-icons:file-type-vhdl", - "codemirrorLanguage": "vhdl", - }, - "Vala": { - "iconify": "vscode-icons:file-type-vala", - "codemirrorLanguage": null, - }, - "Valve Data Format": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Velocity Template Language": { - "iconify": "vscode-icons:file-type-velocity", - "codemirrorLanguage": "velocity", - }, - "Verilog": { - "iconify": "vscode-icons:file-type-verilog", - "codemirrorLanguage": "verilog", - }, - "Vim Help File": { - "iconify": "vscode-icons:file-type-vim", - "codemirrorLanguage": null, - }, - "Vim Script": { - "iconify": "vscode-icons:file-type-vim", - "codemirrorLanguage": null, - }, - "Vim Snippet": { - "iconify": "vscode-icons:file-type-vim", - "codemirrorLanguage": null, - }, - "Visual Basic .NET": { - "iconify": "vscode-icons:file-type-vbproj", - "codemirrorLanguage": "vb", - }, - "Visual Basic 6.0": { - "iconify": "vscode-icons:file-type-vbproj", - "codemirrorLanguage": "vb", - }, - "Volt": { - "iconify": "vscode-icons:file-type-volt", - "codemirrorLanguage": null, - }, - "Vue": { - "iconify": "vscode-icons:file-type-vue", - "codemirrorLanguage": "vue", - }, - "Vyper": { - "iconify": "vscode-icons:file-type-vyper", - "codemirrorLanguage": null, - }, - "WDL": { - "iconify": "file-icons:wdl", - "codemirrorLanguage": null, - }, - "WGSL": { - "iconify": "vscode-icons:file-type-wgsl", - "codemirrorLanguage": "wgsl", - }, - "Wavefront Material": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Wavefront Object": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Web Ontology Language": { - "iconify": null, - "codemirrorLanguage": "xml", - }, - "WebAssembly": { - "iconify": "file-icons:webassembly", - "codemirrorLanguage": "wast", - }, - "WebAssembly Interface Type": { - "iconify": "file-icons:webassembly", - "codemirrorLanguage": "webidl", - }, - "WebIDL": { - "iconify": null, - "codemirrorLanguage": "webidl", - }, - "WebVTT": { - "iconify": "file-icons:webvtt", - "codemirrorLanguage": null, - }, - "Wget Config": { - "iconify": "file-icons:wget", - "codemirrorLanguage": null, - }, - "Whiley": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Wikitext": { - "iconify": "vscode-icons:file-type-wikitext", - "codemirrorLanguage": null, - }, - "Win32 Message File": { - "iconify": "devicon:windows8", - "codemirrorLanguage": null, - }, - "Windows Registry Entries": { - "iconify": "devicon:windows8", - "codemirrorLanguage": null, - }, - "Witcher Script": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Wollok": { - "iconify": null, - "codemirrorLanguage": null, - }, - "World of Warcraft Addon Data": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Wren": { - "iconify": null, - "codemirrorLanguage": null, - }, - "X BitMap": { - "iconify": null, - "codemirrorLanguage": "c", - }, - "X Font Directory Index": { - "iconify": null, - "codemirrorLanguage": null, - }, - "X PixMap": { - "iconify": null, - "codemirrorLanguage": null, - }, - "X10": { - "iconify": "file-icons:x10", - "codemirrorLanguage": null, - }, - "XC": { - "iconify": null, - "codemirrorLanguage": "c", - }, - "XCompose": { - "iconify": null, - "codemirrorLanguage": null, - }, - "XML": { - "iconify": "vscode-icons:file-type-xml", - "codemirrorLanguage": "xml", - }, - "XML Property List": { - "iconify": "vscode-icons:file-type-xml", - "codemirrorLanguage": "xml", - }, - "XPages": { - "iconify": "file-icons:xpages", - "codemirrorLanguage": "xml", - }, - "XProc": { - "iconify": "xml", - "codemirrorLanguage": "xml", - }, - "XQuery": { - "iconify": "vscode-icons:file-type-xquery", - "codemirrorLanguage": "xquery", - }, - "XS": { - "iconify": null, - "codemirrorLanguage": "c", - }, - "XSLT": { - "iconify": "vscode-icons:file-type-excel", - "codemirrorLanguage": "xml", - }, - "Xojo": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Xonsh": { - "iconify": "emojione-monotone:spiral-shell", - "codemirrorLanguage": "python", - }, - "Xtend": { - "iconify": "file-icons:xtend", - "codemirrorLanguage": null, - }, - "YAML": { - "iconify": "vscode-icons:file-type-yaml", - "codemirrorLanguage": "yaml", - }, - "YANG": { - "iconify": "vscode-icons:file-type-yang", - "codemirrorLanguage": null, - }, - "YARA": { - "iconify": "file-icons:yara", - "codemirrorLanguage": null, - }, - "YASnippet": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Yacc": { - "iconify": "vscode-icons:file-type-yacc", - "codemirrorLanguage": null, - }, - "Yul": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ZAP": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ZIL": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Zeek": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ZenScript": { - "iconify": null, - "codemirrorLanguage": null, - }, - "Zephir": { - "iconify": "file-icons:zephir", - "codemirrorLanguage": null, - }, - "Zig": { - "iconify": "vscode-icons:file-type-zig", - "codemirrorLanguage": "zig", - }, - "Zimpl": { - "iconify": null, - "codemirrorLanguage": null, - }, - "cURL Config": { - "iconify": "file-icons:curl", - "codemirrorLanguage": null, - }, - "crontab": { - "iconify": "eos-icons:cronjob", - "codemirrorLanguage": "tcl", - }, - "desktop": { - "iconify": null, - "codemirrorLanguage": null, - }, - "dircolors": { - "iconify": null, - "codemirrorLanguage": null, - }, - "eC": { - "iconify": "file-icons:ec", - "codemirrorLanguage": null, - }, - "edn": { - "iconify": null, - "codemirrorLanguage": "clojure", - }, - "fish": { - "iconify": null, - "codemirrorLanguage": null, - }, - "hoon": { - "iconify": null, - "codemirrorLanguage": null, - }, - "iCalendar": { - "iconify": null, - "codemirrorLanguage": null, - }, - "jq": { - "iconify": null, - "codemirrorLanguage": "jq", - }, - "kvlang": { - "iconify": null, - "codemirrorLanguage": null, - }, - "mIRC Script": { - "iconify": "file-icons:mirc", - "codemirrorLanguage": null, - }, - "mcfunction": { - "iconify": null, - "codemirrorLanguage": null, - }, - "mupad": { - "iconify": "file-icons:mupad", - "codemirrorLanguage": null, - }, - "nanorc": { - "iconify": null, - "codemirrorLanguage": null, - }, - "nesC": { - "iconify": null, - "codemirrorLanguage": "nesc", - }, - "omnetpp-msg": { - "iconify": null, - "codemirrorLanguage": null, - }, - "omnetpp-ned": { - "iconify": null, - "codemirrorLanguage": null, - }, - "ooc": { - "iconify": "file-icons:ooc", - "codemirrorLanguage": null, - }, - "q": { - "iconify": null, - "codemirrorLanguage": null, - }, - "reStructuredText": { - "iconify": "file-icons:restructuredtext", - "codemirrorLanguage": null, - }, - "robots.txt": { - "iconify": "vscode-icons:file-type-text", - "codemirrorLanguage": null, - }, - "sed": { - "iconify": null, - "codemirrorLanguage": null, - }, - "templ": { - "iconify": "vscode-icons:file-type-templ", - "codemirrorLanguage": null, - }, - "vCard": { - "iconify": null, - "codemirrorLanguage": null, - }, - "wisp": { - "iconify": null, - "codemirrorLanguage": "clojure", - }, - "xBase": { - "iconify": null, - "codemirrorLanguage": null, - }, -}; diff --git a/packages/web/src/lib/pagination.ts b/packages/web/src/lib/pagination.ts deleted file mode 100644 index d9e72b23a..000000000 --- a/packages/web/src/lib/pagination.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { NextRequest } from "next/server"; - -export interface PaginationParams { - page: number; - perPage: number; - totalCount: number; - extraParams?: Record; -} - -/** - * Build RFC 5988 Link header value - * @see https://datatracker.ietf.org/doc/html/rfc5988 - */ -export const buildLinkHeader = (request: NextRequest, params: PaginationParams): string | null => { - const { page, perPage, totalCount, extraParams } = params; - const totalPages = Math.ceil(totalCount / perPage); - - if (totalPages <= 1) return null; - - const buildUrl = (targetPage: number): string => { - const url = new URL(request.url); - url.search = ''; - url.searchParams.set('page', targetPage.toString()); - url.searchParams.set('perPage', perPage.toString()); - if (extraParams) { - for (const [key, value] of Object.entries(extraParams)) { - url.searchParams.set(key, value); - } - } - return url.toString(); - }; - - const links: string[] = []; - links.push(`<${buildUrl(1)}>; rel="first"`); - if (page > 1) links.push(`<${buildUrl(page - 1)}>; rel="prev"`); - if (page < totalPages) links.push(`<${buildUrl(page + 1)}>; rel="next"`); - links.push(`<${buildUrl(totalPages)}>; rel="last"`); - - return links.join(', '); -}; diff --git a/packages/web/src/lib/posthog.ts b/packages/web/src/lib/posthog.ts deleted file mode 100644 index cb9401691..000000000 --- a/packages/web/src/lib/posthog.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { PostHog } from 'posthog-node' -import { createLogger, env, SOURCEBOT_VERSION } from '@sourcebot/shared' -import { RequestCookies } from 'next/dist/compiled/@edge-runtime/cookies'; -import * as Sentry from "@sentry/nextjs"; -import { PosthogEvent, PosthogEventMap } from './posthogEvents'; -import { cookies, headers } from 'next/headers'; -import { getAuthenticatedUser } from '@/middleware/withAuth'; - -const logger = createLogger('posthog'); - -/** - * @note: This is a subset of the properties stored in the - * ph_phc__posthog cookie. - */ -export type PostHogCookie = { - distinct_id: string; - $user_state?: 'anonymous' | 'identified'; -} - -const isPostHogCookie = (cookie: unknown): cookie is PostHogCookie => { - return typeof cookie === 'object' && - cookie !== null && - 'distinct_id' in cookie; -} - -/** -* Attempts to retrieve the PostHog cookie from the given cookie store, returning -* undefined if the cookie is not found or is invalid. -*/ -const getPostHogCookie = (cookieStore: Pick): PostHogCookie | undefined => { - const phCookieKey = `ph_${env.POSTHOG_PAPIK}_posthog`; - const cookie = cookieStore.get(phCookieKey); - - if (!cookie) { - return undefined; - } - - const parsedCookie = (() => { - try { - return JSON.parse(cookie.value); - } catch (e) { - Sentry.captureException(e); - return null; - } - })(); - - if (isPostHogCookie(parsedCookie)) { - return parsedCookie; - } - - return undefined; -} - -/** - * Attempts to retrieve the distinct id of the current user, along with whether - * that id corresponds to an *identified* user (as opposed to an anonymous one). - */ -export const tryGetPostHogDistinctId = async (): Promise<{ - distinctId: string | undefined; - isIdentified: boolean; -}> => { - // First, attempt to retrieve the distinct id from the PostHog cookie - // (set by the client-side PostHog SDK). This preserves identity - // continuity between client-side and server-side events. - const cookieStore = await cookies(); - const cookie = getPostHogCookie(cookieStore); - if (cookie) { - return { - distinctId: cookie.distinct_id, - isIdentified: cookie.$user_state === 'identified', - }; - } - - // Fall back to the authenticated user's ID. This covers all auth - // methods: session cookies, OAuth Bearer tokens, and API keys. - const authResult = await getAuthenticatedUser(); - if (authResult?.user.id) { - return { distinctId: authResult.user.id, isIdentified: true }; - } - - return { distinctId: undefined, isIdentified: false }; -} - -export const createPostHogClient = async () => { - const posthog = new PostHog(env.POSTHOG_PAPIK, { - host: 'https://us.i.posthog.com', - flushAt: 1, - flushInterval: 0 - }); - - return posthog; -} - -export async function captureEvent(event: E, properties: PosthogEventMap[E]) { - try { - if (env.SOURCEBOT_TELEMETRY_DISABLED === 'true') { - return; - } - - const { distinctId, isIdentified } = await tryGetPostHogDistinctId(); - const posthog = await createPostHogClient(); - - const headersList = await headers(); - const host = headersList.get("host") ?? undefined; - - posthog.capture({ - event, - properties: { - ...properties, - sourcebot_version: SOURCEBOT_VERSION, - install_id: env.SOURCEBOT_INSTALL_ID, - $host: host, - // Mirror the client's `identified_only` setting: only identified - // users get a person profile. Anonymous requests (logged-out - // visitors and unauthenticated API calls) are sent as personless - // events so we don't create a person profile per request and - // inflate person counts/billing. - // @see: https://posthog.com/handbook/engineering/person-processing#personless-mode-anonymous-events - ...(isIdentified ? {} : { $process_person_profile: false }), - }, - // @note: Key anonymous events to the install id so they - // collapse to a single identity instead of a brand-new one - // on every call. - distinctId: distinctId ?? env.SOURCEBOT_INSTALL_ID, - groups: { company: env.SOURCEBOT_INSTALL_ID }, - }); - } catch (error) { - logger.error('Failed to capture PostHog event:', error); - } -} \ No newline at end of file diff --git a/packages/web/src/lib/posthogEvents.ts b/packages/web/src/lib/posthogEvents.ts deleted file mode 100644 index ae1685383..000000000 --- a/packages/web/src/lib/posthogEvents.ts +++ /dev/null @@ -1,610 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-object-type */ - -export type UpsellSource = - 'sidebar' | - 'analytics_settings' | - 'chat_box' | - 'chat' | - 'chats' | - 'onboard' | - 'license_settings' | - 'mcp_settings' | - 'sso_settings' | - 'scim_settings' | - 'chat_connectors'; - -export type SourcebotWebClientSource = 'sourcebot-web-client'; -export type AskMcpAnalyticsSource = SourcebotWebClientSource | 'sourcebot-ask-agent'; -export type McpConnectorEntryPoint = 'chat' | 'account_settings' | 'workspace_settings' | 'unknown'; -export type McpConnectorAuthMode = 'dynamic' | 'static'; -export type AskSkillScope = 'personal' | 'shared'; -export type AskSkillAnalyticsSource = SourcebotWebClientSource | 'sourcebot-ask-agent' | 'sourcebot-mcp-server'; -export type AskSkillEntryPoint = - 'skills_settings' | - 'account_ask_agent_settings' | - 'workspace_ask_agent_settings' | - 'chat_box' | - 'agent_tool' | - 'unknown'; -export type AskSkillCreationMethod = 'manual' | 'local_markdown' | 'repository'; -export type AskSkillChangedField = 'name' | 'command' | 'description' | 'instructions'; -export type AskSkillActorRelationship = 'creator' | 'owner' | 'member'; - -export type PosthogEventMap = { - search_finished: { - contentBytesLoaded: number, - indexBytesLoaded: number, - crashes: number, - /** @deprecated: use timeToFirstSearchResultMs and timeToSearchCompletionMs instead */ - durationMs: number, - timeToFirstSearchResultMs: number, - timeToSearchCompletionMs: number, - fileCount: number, - shardFilesConsidered: number, - filesConsidered: number, - filesLoaded: number, - filesSkipped: number, - shardsScanned: number, - shardsSkipped: number, - shardsSkippedFilter: number, - matchCount: number, - actualMatchCount: number, - ngramMatches: number, - ngramLookups: number, - wait: number, - matchTreeConstruction: number, - matchTreeSearch: number, - regexpsConsidered: number, - flushReason: string, - fileLanguages: string[], - isSearchExhaustive: boolean, - isBranchFilteringEnabled: boolean, - }, - //////////////////////////////////////////////////////////////// - wa_trial_nav_pressed: {}, - wa_trial_nav_subscription_fetch_fail: { - errorCode: string, - }, - ////////////////////////////////////////////////////////////////// - wa_config_editor_quick_action_pressed: { - name: string, - type: string, - }, - ////////////////////////////////////////////////////////////////// - wa_billing_email_updated_success: {}, - wa_billing_email_updated_fail: { - errorCode: string, - }, - wa_manage_subscription_button_create_portal_session_success: {}, - wa_manage_subscription_button_create_portal_session_fail: { - errorCode: string, - }, - ////////////////////////////////////////////////////////////////// - wa_invite_member_card_invite_success: { - num_emails: number, - }, - wa_invite_member_card_invite_fail: { - errorCode: string, - num_emails: number, - }, - wa_invite_member_card_invite_cancel: { - num_emails: number, - }, - ////////////////////////////////////////////////////////////////// - wa_members_list_remove_member_success: {}, - wa_members_list_remove_member_fail: { - errorCode: string, - }, - wa_members_list_transfer_ownership_success: {}, - wa_members_list_transfer_ownership_fail: { - errorCode: string, - }, - wa_members_list_promote_to_owner_success: {}, - wa_members_list_promote_to_owner_fail: { - errorCode: string, - }, - wa_members_list_demote_to_member_success: {}, - wa_members_list_demote_to_member_fail: { - errorCode: string, - }, - wa_members_list_leave_org_success: {}, - wa_members_list_leave_org_fail: { - errorCode: string, - }, - ////////////////////////////////////////////////////////////////// - wa_invites_list_cancel_invite_success: {}, - wa_invites_list_cancel_invite_fail: { - errorCode: string, - }, - wa_invites_list_copy_invite_link_success: {}, - wa_invites_list_copy_invite_link_fail: {}, - wa_invites_list_copy_email_success: {}, - wa_invites_list_copy_email_fail: {}, - ////////////////////////////////////////////////////////////////// - wa_upsell_dialog_viewed: { - source: UpsellSource, - }, - wa_upsell_checkout_started: { - source: UpsellSource, - requestTrial: boolean, - interval: 'month' | 'year', - returnPath: string, - quantity: number, - }, - wa_onboard_trial_step_viewed: { - isTrialEligible: boolean, - }, - wa_onboard_trial_step_skipped: { - isTrialEligible: boolean, - }, - ////////////////////////////////////////////////////////////////// - wa_login_with_github: {}, - wa_login_with_google: {}, - wa_login_with_gitlab: {}, - wa_login_with_okta: {}, - wa_login_with_keycloak: {}, - wa_login_with_microsoft_entra_id: {}, - wa_login_with_jumpcloud: {}, - wa_login_with_idira: {}, - wa_login_with_magic_link: {}, - wa_login_with_credentials: {}, - ////////////////////////////////////////////////////////////////// - wa_mobile_unsupported_splash_screen_dismissed: {}, - wa_mobile_unsupported_splash_screen_displayed: {}, - ////////////////////////////////////////////////////////////////// - wa_login_verify_page_no_email: {}, - ////////////////////////////////////////////////////////////////// - wa_org_name_updated_success: {}, - wa_org_name_updated_fail: { - errorCode: string, - }, - ////////////////////////////////////////////////////////////////// - wa_org_domain_updated_success: {}, - wa_org_domain_updated_fail: { - errorCode: string, - }, - ////////////////////////////////////////////////////////////////// - wa_security_page_click: {}, - ////////////////////////////////////////////////////////////////// - wa_demo_try_card_pressed: {}, - wa_share_link_created: {}, - ////////////////////////////////////////////////////////////////// - $pageview: { - $current_url: string, - }, - ////////////////////////////////////////////////////////////////// - wa_requests_list_approve_request_success: {}, - wa_requests_list_approve_request_fail: { - errorCode: string, - }, - ////////////////////////////////////////////////////////////////// - wa_requests_list_reject_request_success: {}, - wa_requests_list_reject_request_fail: { - errorCode: string, - }, - ////////////////////////////////////////////////////////////////// - wa_api_key_created: {}, - wa_api_key_creation_fail: {}, - ////////////////////////////////////////////////////////////////// - wa_chat_feedback_submitted: { - feedback: 'like' | 'dislike', - chatId: string, - messageId: string, - }, - ask_thread_created: { - chatId: string, - isAnonymous: boolean, - source?: string, - }, - ask_message_sent: { - chatId: string, - messageCount: number, - selectedReposCount: number, - source?: string, - /** - * The configured AI provider type (e.g. 'anthropic', 'openai') and - * model ID for the language model used to handle this message. - */ - modelProvider: string, - model: string, - hasAskMcpServersAvailable: boolean, - askMcpConnectedServerCount: number, - askMcpEnabledServerCount: number, - askMcpDisabledServerCount: number, - /** - * @note this field will only be populated when - * the EXPERIMENT_ASK_GH_ENABLED environment variable - * is set to true. - */ - selectedRepos?: string[], - }, - chat_attachment_uploaded: { - source: string, - mediaType: string, - sizeBytes: number, - }, - chat_attachment_degraded: { - chatId: string, - source: string, - droppedImageCount: number, - modelProvider: string, - model: string, - }, - ask_mcp_turn_completed: { - chatId: string, - source?: SourcebotWebClientSource, - traceId?: string, - askMcpUsed: boolean, - askMcpToolCallCount: number, - askMcpToolSuccessCount: number, - askMcpToolFailureCount: number, - askMcpApprovalRequestedCount: number, - askMcpApprovalDeniedCount: number, - askMcpFailedServerCount: number, - durationMs: number, - }, - ask_mcp_tool_call_completed: { - chatId?: string, - traceId?: string, - source: AskMcpAnalyticsSource, - serverId: string, - serverUrl: string, - toolName: string, - success: boolean, - durationMs: number, - failureReason?: string, - }, - // Fired when an agent skill is invoked, either automatically by the model - // (activationMethod: 'auto', via the load_skill tool) or manually by the - // user (activationMethod: 'manual', via a slash command). Multi-source, so - // no wa_ prefix; source identifies the origin. - ask_skill_invoked: { - chatId?: string, - traceId?: string, - source: string, - activationMethod: 'auto' | 'manual', - skillIdHash?: string, - scope?: AskSkillScope, - isSynced?: boolean, - success: boolean, - failureReason?: string, - durationMs?: number, - }, - ask_skill_turn_completed: { - chatId: string, - traceId?: string, - source?: SourcebotWebClientSource, - availableSkillCount: number, - manualInvocationCount: number, - autoInvocationCount: number, - successfulInvocationCount: number, - failedInvocationCount: number, - uniqueSkillCount: number, - durationMs: number, - }, - ask_skill_created: { - source: AskSkillAnalyticsSource, - entryPoint: AskSkillEntryPoint, - scope: AskSkillScope, - creationMethod: AskSkillCreationMethod, - isSynced: boolean, - skillIdHash?: string, - success: boolean, - failureReason?: string, - }, - ask_skill_updated: { - source: AskSkillAnalyticsSource, - entryPoint: AskSkillEntryPoint, - scope: AskSkillScope, - isSynced: boolean, - skillIdHash?: string, - changedFieldTypes: AskSkillChangedField[], - success: boolean, - failureReason?: string, - }, - ask_skill_deleted: { - source: SourcebotWebClientSource, - entryPoint: AskSkillEntryPoint, - scope: AskSkillScope, - isSynced: boolean, - skillIdHash?: string, - actorRelationship: AskSkillActorRelationship, - success: boolean, - failureReason?: string, - }, - ask_skill_shared: { - source: SourcebotWebClientSource, - entryPoint: AskSkillEntryPoint, - isSynced: boolean, - skillIdHash?: string, - permissionSyncEnabled: boolean, - requiredRepoAccessWarning: boolean, - success: boolean, - failureReason?: string, - }, - ask_skill_made_personal: { - source: SourcebotWebClientSource, - entryPoint: AskSkillEntryPoint, - isSynced: boolean, - wasAutoEnrolled: boolean, - skillIdHash?: string, - actorRelationship: AskSkillActorRelationship, - success: boolean, - failureReason?: string, - }, - ask_skill_adoption_changed: { - source: SourcebotWebClientSource, - entryPoint: AskSkillEntryPoint, - action: 'adopted' | 'removed', - isSynced: boolean, - autoEnrolled: boolean, - skillIdHash?: string, - success: boolean, - failureReason?: string, - }, - ask_skill_auto_enrollment_changed: { - source: SourcebotWebClientSource, - entryPoint: AskSkillEntryPoint, - enabled: boolean, - isSynced: boolean, - skillIdHash?: string, - success: boolean, - failureReason?: string, - }, - ask_skill_command_selected: { - source: SourcebotWebClientSource, - entryPoint: 'chat_box', - scope: AskSkillScope, - isSynced: boolean, - suggestionIndex: number, - visibleSuggestionCount: number, - }, - ask_skill_import_completed: { - source: SourcebotWebClientSource, - entryPoint: AskSkillEntryPoint, - method: Exclude, - isSynced: boolean, - hasFrontmatter?: boolean, - hasDescription?: boolean, - success: boolean, - failureReason?: string, - }, - ask_skill_source_refresh_completed: { - source: SourcebotWebClientSource, - entryPoint: AskSkillEntryPoint, - scope: AskSkillScope, - skillIdHash?: string, - success: boolean, - failureReason?: string, - }, - ask_skills_page_viewed: { - source: SourcebotWebClientSource, - entryPoint: 'skills_settings', - personalSkillCount: number, - sharedSkillCount: number, - visibleSharedSkillCount: number, - adoptedSharedSkillCount: number, - syncedSkillCount: number, - isOwner: boolean, - permissionSyncEnabled: boolean, - }, - ask_workspace_skills_manager_viewed: { - source: SourcebotWebClientSource, - entryPoint: 'workspace_ask_agent_settings', - sharedSkillCount: number, - syncedSharedSkillCount: number, - manualSharedSkillCount: number, - autoEnrolledSkillCount: number, - }, - ask_mcp_connector_added: { - source: SourcebotWebClientSource, - entryPoint: 'workspace_settings', - serverId: string, - serverUrl: string, - authMode: McpConnectorAuthMode, - }, - ask_mcp_connector_removed: { - source: SourcebotWebClientSource, - entryPoint: 'workspace_settings', - serverId: string, - serverUrl: string, - authMode: McpConnectorAuthMode, - }, - ask_mcp_connector_connection_started: { - source: SourcebotWebClientSource, - entryPoint: McpConnectorEntryPoint, - serverId: string, - serverUrl: string, - authMode: McpConnectorAuthMode, - }, - ask_mcp_connector_connection_completed: { - source: SourcebotWebClientSource, - entryPoint: McpConnectorEntryPoint, - serverId: string, - serverUrl: string, - authMode: McpConnectorAuthMode, - alreadyAuthorized: boolean, - }, - ask_mcp_connector_connection_failed: { - source: SourcebotWebClientSource, - entryPoint: McpConnectorEntryPoint, - serverId?: string, - serverUrl?: string, - authMode?: McpConnectorAuthMode, - failureReason: string, - }, - ask_mcp_connector_disconnected: { - source: SourcebotWebClientSource, - entryPoint: McpConnectorEntryPoint, - serverId: string, - serverUrl: string, - authMode: McpConnectorAuthMode, - }, - tool_used: { - toolName: string, - source: string, - success: boolean, - }, - wa_chat_share_dialog_opened: { - chatId: string, - currentVisibility: 'PUBLIC' | 'PRIVATE', - }, - wa_chat_visibility_changed: { - chatId: string, - fromVisibility: 'PUBLIC' | 'PRIVATE', - toVisibility: 'PUBLIC' | 'PRIVATE', - }, - wa_chat_link_copied: { - chatId: string, - visibility: 'PUBLIC' | 'PRIVATE', - }, - wa_chat_users_invited: { - chatId: string, - numUsersInvited: number, - }, - wa_chat_user_removed: { - chatId: string, - }, - wa_shared_chat_viewed: { - chatId: string, - visibility: 'PUBLIC' | 'PRIVATE', - viewerType: 'authenticated' | 'anonymous', - accessType: 'public_link' | 'direct_invite', - }, - wa_chat_sign_in_banner_displayed: { - chatId: string, - }, - wa_chat_sign_in_banner_dismissed: { - chatId: string, - }, - wa_chat_sign_in_banner_clicked: { - chatId: string, - }, - wa_anonymous_chats_claimed: { - claimedCount: number, - }, - wa_chat_duplicated: { - chatId: string, - }, - wa_chat_renamed: { - chatId: string, - }, - wa_chat_deleted: { - chatId: string, - }, - wa_chat_details_card_toggled: { - chatId: string, - isExpanded: boolean, - }, - wa_chat_copy_answer_pressed: { - chatId: string, - }, - wa_chat_toc_toggled: { - chatId: string, - isExpanded: boolean, - }, - wa_chat_diagram_rendered: { - chatId: string, - diagramId: string, - outcome: 'success' | 'error', - /** Mermaid diagram type (e.g. 'flowchart', 'sequenceDiagram'), if detectable. */ - diagramType?: string, - }, - wa_chat_diagram_fullscreen_opened: { - chatId: string, - diagramId: string, - }, - wa_chat_diagram_copied: { - chatId: string, - diagramId: string, - format: 'link' | 'source' | 'image', - }, - wa_chat_diagram_exported: { - chatId: string, - diagramId: string, - format: 'svg' | 'png', - }, - wa_chat_diagram_panned: { - chatId: string, - diagramId: string, - }, - wa_chat_diagram_reference_clicked: { - chatId: string, - diagramId: string, - }, - wa_user_created: { - userId: string, - }, - ////////////////////////////////////////////////////////////////// - wa_askgh_login_wall_prompted: {}, - wa_publicsaas_cs_login_wall_prompted: {}, - ////////////////////////////////////////////////////////////////// - askgh_repo_index_requested: { - owner: string, - repo: string, - repoName: string, - }, - ////////////////////////////////////////////////////////////////// - wa_demo_docs_link_pressed: {}, - wa_search_assist_opened: {}, - wa_search_assist_query_generated: {}, - wa_search_assist_generate_failed: {}, - wa_search_assist_example_clicked: { - example: string, - }, - ////////////////////////////////////////////////////////////////// - wa_demo_search_example_card_pressed: { - exampleTitle: string, - exampleUrl: string, - }, - ////////////////////////////////////////////////////////////////// - wa_github_star_toast_displayed: {}, - wa_github_star_toast_clicked: {}, - ////////////////////////////////////////////////////////////////// - wa_goto_definition_pressed: { - source: 'chat' | 'browse' | 'preview', - }, - wa_find_references_pressed: { - source: 'chat' | 'browse' | 'preview', - }, - wa_symbol_hover_popup_definitions_loaded: { - durationMs: number, - }, - wa_explore_menu_reference_clicked: {}, - wa_explore_menu_references_loaded: { - durationMs: number, - // Whether or not the user is searching all repositories. - isGlobalSearchEnabled: boolean, - }, - wa_explore_menu_definitions_loaded: { - durationMs: number, - // Whether or not the user is searching all repositories. - isGlobalSearchEnabled: boolean, - }, - ////////////////////////////////////////////////////////////////// - wa_file_tree_loaded: { - durationMs: number, - }, - ////////////////////////////////////////////////////////////////// - wa_repo_not_found_for_zoekt_file: {}, - ////////////////////////////////////////////////////////////////// - api_request: { - path: string; - source: string; - method: string; - }, - ////////////////////////////////////////////////////////////////// - wa_oauth_consent_viewed: { - clientId: string, - clientName: string, - }, - wa_oauth_authorization_approved: { - clientId: string, - clientName: string, - }, - wa_oauth_authorization_denied: { - clientId: string, - clientName: string, - }, -} -export type PosthogEvent = keyof PosthogEventMap; diff --git a/packages/web/src/lib/prismaErrors.ts b/packages/web/src/lib/prismaErrors.ts deleted file mode 100644 index 7eae687e3..000000000 --- a/packages/web/src/lib/prismaErrors.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Prisma } from "@sourcebot/db"; - -// @see https://www.prisma.io/docs/orm/reference/error-reference#error-codes -const isKnownRequestError = ( - error: unknown, - code: string, -): error is Prisma.PrismaClientKnownRequestError => - error instanceof Prisma.PrismaClientKnownRequestError && error.code === code; - -/** - * P2002: a unique constraint was violated (e.g. inserting a duplicate row). - */ -export const isUniqueConstraintError = (error: unknown) => - isKnownRequestError(error, "P2002"); - -/** - * P2025: an operation failed because the record it depends on was not found - * (e.g. updating or deleting a row that no longer exists). - */ -export const isRecordNotFoundError = (error: unknown) => - isKnownRequestError(error, "P2025"); diff --git a/packages/web/src/lib/redis.ts b/packages/web/src/lib/redis.ts deleted file mode 100644 index 2f6a1020f..000000000 --- a/packages/web/src/lib/redis.ts +++ /dev/null @@ -1,16 +0,0 @@ -import 'server-only'; - -import { createRedisClient } from '@sourcebot/shared'; - -let redis: ReturnType | undefined; - -const REDIS_REQUEST_TIMEOUT_MS = 5000; - -export function getRedisClient() { - redis ??= createRedisClient({ - commandTimeout: REDIS_REQUEST_TIMEOUT_MS, - connectTimeout: REDIS_REQUEST_TIMEOUT_MS, - maxRetriesPerRequest: 1, - }); - return redis; -} diff --git a/packages/web/src/lib/requestContext.ts b/packages/web/src/lib/requestContext.ts deleted file mode 100644 index b9412a52d..000000000 --- a/packages/web/src/lib/requestContext.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { AsyncLocalStorage } from 'node:async_hooks'; -import type { NextRequest } from 'next/server'; - -const requestStorage = new AsyncLocalStorage(); - -export function runWithRequestContext(request: NextRequest, fn: () => T): T { - return requestStorage.run(request, fn); -} - -export function getCurrentRequest(): NextRequest | undefined { - return requestStorage.getStore(); -} diff --git a/packages/web/src/lib/schemas.ts b/packages/web/src/lib/schemas.ts deleted file mode 100644 index 110b276f9..000000000 --- a/packages/web/src/lib/schemas.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { z } from "zod"; -import { CodeHostType } from "@sourcebot/db"; - -export const repositoryQuerySchema = z.object({ - codeHostType: z.nativeEnum(CodeHostType), - repoId: z.number(), - repoName: z.string(), - webUrl: z.string(), - repoDisplayName: z.string().optional(), - externalWebUrl: z.string().optional(), - imageUrl: z.string().optional(), - indexedAt: z.coerce.date().optional(), - pushedAt: z.coerce.date().optional(), - defaultBranch: z.string().optional(), - isFork: z.boolean(), - isArchived: z.boolean(), -}); - -export const searchContextQuerySchema = z.object({ - id: z.number(), - name: z.string(), - description: z.string().optional(), - repoNames: z.array(z.string()), -}); - -export const verifyCredentialsRequestSchema = z.object({ - email: z.string().email(), - password: z.string().min(8), -}); - -export const getVersionResponseSchema = z.object({ - version: z.string(), -}); - -export const listReposQueryParamsSchema = z.object({ - page: z.coerce.number().int().positive().default(1), - perPage: z.coerce.number().int().positive().max(100).default(30), - sort: z.enum(['name', 'pushed']).default('name'), - direction: z.enum(['asc', 'desc']).default('asc'), - query: z.string().optional(), - connectionId: z.coerce.number().int().positive().optional() - .describe('Filter repositories to those associated with this connection ID. IDs are returned by GET /api/connections.'), -}); - -export const listReposResponseSchema = repositoryQuerySchema.array(); diff --git a/packages/web/src/lib/sentryUser.test.ts b/packages/web/src/lib/sentryUser.test.ts deleted file mode 100644 index b2122bed5..000000000 --- a/packages/web/src/lib/sentryUser.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { beforeEach, describe, expect, test, vi } from 'vitest'; - -const setUser = vi.fn(); - -vi.mock('@sentry/nextjs', () => ({ - setUser, -})); - -const { setSentryUser } = await import('./sentryUser'); - -describe('setSentryUser', () => { - beforeEach(() => { - setUser.mockClear(); - }); - - test('associates errors with the user id without PII by default', () => { - setSentryUser({ - id: 'user-1', - email: 'user@example.com', - name: 'Example User', - }, false); - - expect(setUser).toHaveBeenCalledWith({ id: 'user-1' }); - }); - - test('includes user details when PII collection is enabled', () => { - setSentryUser({ - id: 'user-1', - email: 'user@example.com', - name: 'Example User', - }, true); - - expect(setUser).toHaveBeenCalledWith({ - id: 'user-1', - email: 'user@example.com', - username: 'Example User', - }); - }); - - test('clears the user for unauthenticated requests', () => { - setSentryUser(null, true); - - expect(setUser).toHaveBeenCalledWith(null); - }); -}); diff --git a/packages/web/src/lib/sentryUser.ts b/packages/web/src/lib/sentryUser.ts deleted file mode 100644 index fd719d44d..000000000 --- a/packages/web/src/lib/sentryUser.ts +++ /dev/null @@ -1,27 +0,0 @@ -import * as Sentry from "@sentry/nextjs"; - -type SentryUser = { - id: string; - email?: string | null; - name?: string | null; -}; - -/** - * Associates subsequent Sentry events with the current user, including their - * email and name only when PII collection is enabled. If Sentry is not - * configured, this is effectively a no-op and does not send any data. - */ -export function setSentryUser(user: SentryUser | null, isPiiEnabled: boolean) { - if (!user) { - Sentry.setUser(null); - return; - } - - Sentry.setUser({ - id: user.id, - ...(isPiiEnabled ? { - email: user.email ?? undefined, - username: user.name ?? undefined, - } : {}), - }); -} diff --git a/packages/web/src/lib/serviceError.ts b/packages/web/src/lib/serviceError.ts deleted file mode 100644 index 5e7483926..000000000 --- a/packages/web/src/lib/serviceError.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { StatusCodes } from "http-status-codes"; -import { ErrorCode } from "./errorCodes"; -import { z, ZodError } from "zod"; - -export const serviceErrorSchema = z.object({ - statusCode: z.number(), - errorCode: z.string(), - message: z.string(), -}); - -export type ServiceError = z.infer; - -/** - * Useful for throwing errors and handling them in error boundaries. - */ -export class ServiceErrorException extends Error { - constructor(public readonly serviceError: ServiceError) { - super(JSON.stringify(serviceError)); - } -} - -export const serviceErrorResponse = ({ statusCode, errorCode, message }: ServiceError) => { - return Response.json({ - statusCode, - errorCode, - message, - }, { - status: statusCode, - }); -} - -export const missingQueryParam = (name: string): ServiceError => { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.MISSING_REQUIRED_QUERY_PARAMETER, - message: `Missing required query parameter: ${name}`, - }; -} - -export const requestBodySchemaValidationError = (error: ZodError): ServiceError => { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_REQUEST_BODY, - message: `Schema validation failed with: ${error.message}`, - }; -} - -export const queryParamsSchemaValidationError = (error: ZodError): ServiceError => { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_QUERY_PARAMS, - message: `Query params validation failed with: ${error.message}`, - }; -} - -export const fileNotFound = (fileName: string, repository: string): ServiceError => { - return { - statusCode: StatusCodes.NOT_FOUND, - errorCode: ErrorCode.FILE_NOT_FOUND, - message: `File "${fileName}" not found in repository "${repository}"`, - }; -} - -export const unexpectedError = (message: string): ServiceError => { - return { - statusCode: StatusCodes.INTERNAL_SERVER_ERROR, - errorCode: ErrorCode.UNEXPECTED_ERROR, - message: `Unexpected error: ${message}`, - }; -} - -export const lighthouseUnreachable = (url: string, error: unknown): ServiceError => { - const detail = error instanceof Error ? error.message : String(error); - return { - statusCode: StatusCodes.SERVICE_UNAVAILABLE, - errorCode: ErrorCode.LIGHTHOUSE_UNREACHABLE, - message: `Could not reach the Sourcebot licensing service at ${url}. ` - + `Verify this host has outbound network access to it, then try again. Details: ${detail}`, - }; -} - -export const notAuthenticated = (): ServiceError => { - return { - statusCode: StatusCodes.UNAUTHORIZED, - errorCode: ErrorCode.NOT_AUTHENTICATED, - message: "Not authenticated", - } -} - -export const insufficientOAuthScope = (requiredScopes: readonly string[]): ServiceError => { - return { - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.OAUTH_INSUFFICIENT_SCOPE, - message: `OAuth access token is missing required scope${requiredScopes.length === 1 ? '' : 's'}: ${requiredScopes.join(' ')}`, - }; -} - -export const notFound = (message?: string): ServiceError => { - return { - statusCode: StatusCodes.NOT_FOUND, - errorCode: ErrorCode.NOT_FOUND, - message: message ?? "Not found", - } -} - -export const repositoryNotFound = (repository: string): ServiceError => { - return { - statusCode: StatusCodes.NOT_FOUND, - errorCode: ErrorCode.REPOSITORY_NOT_FOUND, - message: `Repository "${repository}" was not found`, - } -} - -export const githubRateLimited = (): ServiceError => { - return { - statusCode: StatusCodes.TOO_MANY_REQUESTS, - errorCode: ErrorCode.GITHUB_RATE_LIMITED, - message: 'GitHub is temporarily rate limiting requests. Please try again later.', - } -} - -export const userNotFound = (): ServiceError => { - return { - statusCode: StatusCodes.NOT_FOUND, - errorCode: ErrorCode.USER_NOT_FOUND, - message: "User not found", - } -} - -export const orgNotFound = (): ServiceError => { - return { - statusCode: StatusCodes.NOT_FOUND, - errorCode: ErrorCode.ORG_NOT_FOUND, - message: "Organization not found", - } -} - -export const invalidGitRef = (ref: string): ServiceError => { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_GIT_REF, - message: `Invalid git reference: "${ref}". Git refs cannot start with '-'.`, - }; -} - -export const unresolvedGitRef = (ref: string): ServiceError => { - return { - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.INVALID_GIT_REF, - message: `Git reference "${ref}" could not be resolved.`, - }; -} diff --git a/packages/web/src/lib/types.ts b/packages/web/src/lib/types.ts deleted file mode 100644 index 5acee75c6..000000000 --- a/packages/web/src/lib/types.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { z } from "zod"; -import { getVersionResponseSchema, listReposQueryParamsSchema, listReposResponseSchema, repositoryQuerySchema, searchContextQuerySchema } from "./schemas"; - -export type KeymapType = "default" | "vim"; - -export type GetVersionResponse = z.infer; - -export enum SearchQueryParams { - query = "query", - matches = "matches", - isRegexEnabled = "isRegexEnabled", - isCaseSensitivityEnabled = "isCaseSensitivityEnabled", -} - -export type ApiKeyPayload = { - apiKey: string; - domain: string; -}; - -export type NewsItem = { - unique_id: string; - header: string; - sub_header: string; - url: string; - read?: boolean; -} - -export type RepositoryQuery = z.infer; -export type SearchContextQuery = z.infer; -export type ListReposResponse = z.infer; -export type ListReposQueryParams = z.infer; diff --git a/packages/web/src/lib/utils.test.ts b/packages/web/src/lib/utils.test.ts deleted file mode 100644 index 1aad40e0a..000000000 --- a/packages/web/src/lib/utils.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { afterEach, describe, expect, test, vi } from 'vitest'; -import { measure, measureSync } from './utils'; - -describe('performance measurement utilities', () => { - afterEach(() => { - vi.restoreAllMocks(); - }); - - test('measureSync preserves timeline entries without relying on the measure return value', () => { - vi.spyOn(performance, 'now') - .mockReturnValueOnce(100) - .mockReturnValueOnce(112.5); - const markSpy = vi.spyOn(performance, 'mark'); - const measureSpy = vi.spyOn(performance, 'measure') - .mockImplementation(() => undefined as unknown as PerformanceMeasure); - - const result = measureSync(() => 'result', 'sync-operation', false); - - expect(result).toEqual({ - data: 'result', - durationMs: 12.5, - }); - expect(markSpy).toHaveBeenNthCalledWith(1, 'sync-operation.start'); - expect(markSpy).toHaveBeenNthCalledWith(2, 'sync-operation.end'); - expect(measureSpy).toHaveBeenCalledWith( - 'sync-operation', - 'sync-operation.start', - 'sync-operation.end', - ); - }); - - test('measure preserves timeline entries without relying on the measure return value', async () => { - vi.spyOn(performance, 'now') - .mockReturnValueOnce(50) - .mockReturnValueOnce(75); - const markSpy = vi.spyOn(performance, 'mark'); - const measureSpy = vi.spyOn(performance, 'measure') - .mockImplementation(() => undefined as unknown as PerformanceMeasure); - - const result = await measure(async () => 'result', 'async-operation', false); - - expect(result).toEqual({ - data: 'result', - durationMs: 25, - }); - expect(markSpy).toHaveBeenNthCalledWith(1, 'async-operation.start'); - expect(markSpy).toHaveBeenNthCalledWith(2, 'async-operation.end'); - expect(measureSpy).toHaveBeenCalledWith( - 'async-operation', - 'async-operation.start', - 'async-operation.end', - ); - }); - - test('ignores performance timeline instrumentation failures', () => { - vi.spyOn(performance, 'now') - .mockReturnValueOnce(10) - .mockReturnValueOnce(15); - vi.spyOn(performance, 'mark').mockImplementation(() => { - throw new Error('Performance timeline unavailable'); - }); - vi.spyOn(performance, 'measure').mockImplementation(() => { - throw new Error('Performance timeline unavailable'); - }); - - expect(measureSync(() => 'result', 'operation', false)).toEqual({ - data: 'result', - durationMs: 5, - }); - }); - - test('measure ignores performance timeline instrumentation failures', async () => { - vi.spyOn(performance, 'now') - .mockReturnValueOnce(20) - .mockReturnValueOnce(27.5); - vi.spyOn(performance, 'mark').mockImplementation(() => { - throw new Error('Performance timeline unavailable'); - }); - vi.spyOn(performance, 'measure').mockImplementation(() => { - throw new Error('Performance timeline unavailable'); - }); - - await expect(measure(async () => 'async result', 'async-operation', false)).resolves.toEqual({ - data: 'async result', - durationMs: 7.5, - }); - }); -}); diff --git a/packages/web/src/lib/utils.ts b/packages/web/src/lib/utils.ts deleted file mode 100644 index d51e217a3..000000000 --- a/packages/web/src/lib/utils.ts +++ /dev/null @@ -1,687 +0,0 @@ -import { type ClassValue, clsx } from "clsx" -import { twMerge } from "tailwind-merge" -import githubLogo from "@/public/github.svg"; -import azuredevopsLogo from "@/public/azuredevops.svg"; -import gitlabLogo from "@/public/gitlab.svg"; -import giteaLogo from "@/public/gitea.svg"; -import gerritLogo from "@/public/gerrit.svg"; -import bitbucketLogo from "@/public/bitbucket.svg"; -import gitLogo from "@/public/git.svg"; -import googleLogo from "@/public/google.svg"; -import oktaLogo from "@/public/okta.svg"; -import keycloakLogo from "@/public/keycloak.svg"; -import microsoftLogo from "@/public/microsoft_entra.svg"; -import authentikLogo from "@/public/authentik.svg"; -import jumpcloudLogo from "@/public/jumpcloud.svg"; -import idiraLogo from "@/public/idira.svg"; -import { ServiceError } from "./serviceError"; -import { ConnectionType } from "@sourcebot/db"; -import { CodeHostType } from "@sourcebot/db"; - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) -} - -/** - * If `ref` starts with a 40-character hex SHA, truncate the SHA portion to - * 7 characters and preserve any trailing operator suffix (e.g. `^`, `~1`). - * Returns the input unchanged for symbolic refs (branches, tags, etc.). - */ -export function truncateSha(ref: string): string { - const match = ref.match(/^([0-9a-f]{40})(.*)$/i); - if (match) { - return match[1].slice(0, 7) + match[2]; - } - return ref; -} - -/** - * Creates an invite link URL from the base URL and invite ID - * @param baseUrl The base URL of the application - * @param inviteLinkId The invite link ID - * @returns The complete invite link URL or null if no inviteLinkId - */ -export const createInviteLink = (baseUrl: string, inviteLinkId?: string | null): string | null => { - return inviteLinkId ? `${baseUrl}/invite?id=${inviteLinkId}` : null; -} - -/** - * Adds a list of (potentially undefined) query parameters to a path. - * - * @param path The path to add the query parameters to. - * @param queryParams A list of key-value pairs (key=param name, value=param value) to add to the path. - * @returns The path with the query parameters added. - */ -export const createPathWithQueryParams = (path: string, ...queryParams: [string, string | null][]) => { - // Filter out undefined values - - queryParams = queryParams.filter(([_key, value]) => value !== null); - - if (queryParams.length === 0) { - return path; - } - - const queryString = queryParams.map(([key, value]) => `${encodeURIComponent(key)}=${encodeRFC3986URIComponent(value ?? '')}`).join('&'); - return `${path}?${queryString}`; -} - -// @see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent#encoding_for_rfc3986 -const encodeRFC3986URIComponent = (str: string) => { - return encodeURIComponent(str).replace( - /[!'()*]/g, - (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`, - ); - } - -type AuthProviderInfo = { - id: string; - name: string; - displayName: string; - icon: { src: string; className?: string } | null; -} - -export const getAuthProviderInfo = (providerType: string): AuthProviderInfo => { - switch (providerType) { - case "github": - return { - id: "github", - name: "GitHub", - displayName: "GitHub", - icon: { - src: githubLogo, - className: "dark:invert", - }, - }; - case "gitlab": - return { - id: "gitlab", - name: "GitLab", - displayName: "GitLab", - icon: { - src: gitlabLogo, - }, - }; - case "google": - return { - id: "google", - name: "Google", - displayName: "Google", - icon: { - src: googleLogo, - }, - }; - case "okta": - return { - id: "okta", - name: "Okta", - displayName: "Okta", - icon: { - src: oktaLogo, - className: "dark:invert", - }, - }; - case "keycloak": - return { - id: "keycloak", - name: "Keycloak", - displayName: "Keycloak", - icon: { - src: keycloakLogo, - }, - }; - case "microsoft-entra-id": - return { - id: "microsoft-entra-id", - name: "Microsoft Entra ID", - displayName: "Microsoft Entra ID", - icon: { - src: microsoftLogo, - }, - }; - case "authentik": - return { - id: "authentik", - name: "Authentik", - displayName: "Authentik", - icon: { - src: authentikLogo, - }, - } - case "jumpcloud": - return { - id: "jumpcloud", - name: "JumpCloud", - displayName: "JumpCloud", - icon: { - src: jumpcloudLogo, - }, - }; - case "idira": - return { - id: "idira", - name: "Idira", - displayName: "Idira", - icon: { - src: idiraLogo, - }, - }; - case "credentials": - return { - id: "credentials", - name: "Credentials", - displayName: "Email & Password", - icon: null, // No icon needed for credentials - }; - case "nodemailer": - return { - id: "nodemailer", - name: "Email", - displayName: "Email Code", - icon: null, // No icon needed for email - }; - case "bitbucket-cloud": - return { - id: "bitbucket-cloud", - name: "Bitbucket Cloud", - displayName: "Bitbucket Cloud", - icon: { - src: bitbucketLogo, - }, - }; - case "bitbucket-server": - return { - id: "bitbucket-server", - name: "Bitbucket Server", - displayName: "Bitbucket Server", - icon: { - src: bitbucketLogo, - }, - }; - default: - return { - id: providerType, - name: providerType, - displayName: providerType.charAt(0).toUpperCase() + providerType.slice(1), - icon: null, - }; - } -}; - -type CodeHostInfo = { - type: CodeHostType; - displayName: string; - codeHostName: string; - externalWebUrl?: string; - icon: string; - iconClassName?: string; -} - -export const getCodeHostInfoForRepo = (repo: { - codeHostType: CodeHostType, - name: string, - displayName?: string, - externalWebUrl?: string, -}): CodeHostInfo => { - const { codeHostType, name, displayName, externalWebUrl } = repo; - - switch (codeHostType) { - case 'github': { - const { src, className } = getCodeHostIcon('github')!; - return { - type: "github", - displayName: displayName ?? name, - codeHostName: "GitHub", - externalWebUrl, - icon: src, - iconClassName: className, - } - } - case 'gitlab': { - const { src, className } = getCodeHostIcon('gitlab')!; - return { - type: "gitlab", - displayName: displayName ?? name, - codeHostName: "GitLab", - externalWebUrl, - icon: src, - iconClassName: className, - } - } - case 'azuredevops': { - const { src, className } = getCodeHostIcon('azuredevops')!; - return { - type: "azuredevops", - displayName: displayName ?? name, - codeHostName: "Azure DevOps", - externalWebUrl, - icon: src, - iconClassName: className, - } - } - case 'gitea': { - const { src, className } = getCodeHostIcon('gitea')!; - return { - type: "gitea", - displayName: displayName ?? name, - codeHostName: "Gitea", - externalWebUrl, - icon: src, - iconClassName: className, - } - } - case 'gerrit': { - const { src, className } = getCodeHostIcon('gerrit')!; - return { - type: "gerrit", - displayName: displayName ?? name, - codeHostName: "Gerrit", - externalWebUrl, - icon: src, - iconClassName: className, - } - } - case "bitbucketServer": { - const { src, className } = getCodeHostIcon('bitbucketServer')!; - return { - type: "bitbucketServer", - displayName: displayName ?? name, - codeHostName: "Bitbucket Server", - externalWebUrl, - icon: src, - iconClassName: className, - } - } - case "bitbucketCloud": { - const { src, className } = getCodeHostIcon('bitbucketCloud')!; - return { - type: "bitbucketCloud", - displayName: displayName ?? name, - codeHostName: "Bitbucket Cloud", - externalWebUrl, - icon: src, - iconClassName: className, - } - } - case "genericGitHost": { - const { src, className } = getCodeHostIcon('genericGitHost')!; - return { - type: "genericGitHost", - displayName: displayName ?? name, - codeHostName: "Git Host", - externalWebUrl, - icon: src, - iconClassName: className, - } - } - } -} - -export const getCodeHostIcon = (codeHostType: CodeHostType | ConnectionType): { src: string, className?: string } => { - switch (codeHostType) { - case "github": - return { - src: githubLogo, - className: "dark:invert", - }; - case "gitlab": - return { - src: gitlabLogo, - }; - case "gitea": - return { - src: giteaLogo, - } - case "gerrit": - return { - src: gerritLogo, - } - case "bitbucket": - case "bitbucketCloud": - case "bitbucketServer": - return { - src: bitbucketLogo, - } - case "azuredevops": - return { - src: azuredevopsLogo, - } - case "git": - case "genericGitHost": - return { - src: gitLogo, - } - } -} - -export const getCodeHostCommitUrl = ({ - webUrl, - codeHostType, - commitHash, -}: { - webUrl?: string | null, - codeHostType: CodeHostType, - commitHash: string, -}) => { - if (!webUrl) { - return undefined; - } - - switch (codeHostType) { - case 'github': - return `${webUrl}/commit/${commitHash}`; - case 'gitlab': - return `${webUrl}/-/commit/${commitHash}`; - case 'gitea': - return `${webUrl}/commit/${commitHash}`; - case 'azuredevops': - return `${webUrl}/commit/${commitHash}`; - case 'bitbucketCloud': - return `${webUrl}/commits/${commitHash}`; - case 'bitbucketServer': - return `${webUrl}/commits/${commitHash}`; - case 'gerrit': - return `${webUrl}/+/${commitHash}`; - case 'genericGitHost': - return undefined; - } -} - -export const getCodeHostBrowseAtBranchUrl = ({ - webUrl, - codeHostType, - branchName: _branchName, -}: { - webUrl?: string | null, - codeHostType: CodeHostType, - branchName: string, -}) => { - if (!webUrl) { - return undefined; - } - - const branchName = _branchName.replace(/^refs\/(heads|tags)\//, ''); - - switch (codeHostType) { - case 'github': - return `${webUrl}/tree/${branchName}`; - case 'gitlab': - return `${webUrl}/-/tree/${branchName}`; - case 'gitea': - return `${webUrl}/src/branch/${branchName}`; - case 'azuredevops': - return `${webUrl}?branch=${branchName}`; - case 'bitbucketCloud': - return `${webUrl}?at=${branchName}`; - case 'bitbucketServer': - return `${webUrl}?at=${branchName}`; - case 'gerrit': - return `${webUrl}/+/${branchName}`; - case 'genericGitHost': - return undefined; - } -} - -export const getCodeHostBrowseFileAtBranchUrl = ({ - webUrl, - codeHostType, - branchName: _branchName, - filePath, -}: { - webUrl?: string | null, - codeHostType: CodeHostType, - branchName: string, - filePath: string, -}) => { - if (!webUrl) { - return undefined; - } - - const branchName = _branchName.replace(/^refs\/(heads|tags)\//, ''); - - switch (codeHostType) { - case 'github': - return `${webUrl}/blob/${branchName}/${filePath}`; - case 'gitlab': - return `${webUrl}/-/blob/${branchName}/${filePath}`; - case 'gitea': - return `${webUrl}/src/branch/${branchName}/${filePath}`; - case 'azuredevops': - return `${webUrl}?path=${filePath}&version=${branchName}`; - case 'bitbucketCloud': - return `${webUrl}/src/${branchName}/${filePath}`; - case 'bitbucketServer': - return `${webUrl}/browse/${filePath}?at=${branchName}`; - case 'gerrit': - return `${webUrl}/+/${branchName}/${filePath}`; - case 'genericGitHost': - return undefined; - - } -} - -export const isServiceError = (data: unknown): data is ServiceError => { - return typeof data === 'object' && - data !== null && - 'statusCode' in data && - 'errorCode' in data && - 'message' in data; -} - -export const getFormattedDate = (date: Date) => { - const now = new Date(); - const diffMinutes = (now.getTime() - date.getTime()) / (1000 * 60); - const isFuture = diffMinutes < 0; - - // Use absolute values for calculations - const minutes = Math.abs(diffMinutes); - const hours = minutes / 60; - const days = hours / 24; - const months = days / 30; - - const formatTime = (value: number, unit: 'minute' | 'hour' | 'day' | 'month', isFuture: boolean) => { - const roundedValue = Math.floor(value); - const pluralUnit = roundedValue === 1 ? unit : `${unit}s`; - - if (isFuture) { - return `In ${roundedValue} ${pluralUnit}`; - } else { - return `${roundedValue} ${pluralUnit} ago`; - } - } - - if (minutes < 1) { - return 'just now'; - } else if (minutes < 60) { - return formatTime(minutes, 'minute', isFuture); - } else if (hours < 24) { - return formatTime(hours, 'hour', isFuture); - } else if (days < 30) { - return formatTime(days, 'day', isFuture); - } else { - return formatTime(months, 'month', isFuture); - } -} - -/** - * Converts a number to a string - */ -export const getShortenedNumberDisplayString = (number: number, fractionDigits: number = 1) => { - if (number < 1000) { - return number.toString(); - } else if (number < 1000000) { - return `${(number / 1000).toFixed(fractionDigits)}k`; - } else { - return `${(number / 1000000).toFixed(fractionDigits)}m`; - } -} - -/** - * Formats a Stripe currency amount for display. - * - * Stripe reports amounts in the currency's smallest unit (cents for USD, - * yen for JPY, fils for BHD, etc). The divisor is derived from the - * currency's fraction digits rather than hard-coded, so zero-decimal and - * three-decimal currencies render correctly. - * - * By default the currency's natural number of decimal places is shown. - * Pass `minimumFractionDigits: 0` to suppress trailing zeros on whole - * amounts (e.g. "$10" instead of "$10.00"). - */ -export const formatCurrency = ( - amountSmallestUnit: number, - currency: string, - options: { minimumFractionDigits?: number } = {}, -): string => { - const formatter = new Intl.NumberFormat('en-US', { - style: 'currency', - currency: currency.toUpperCase(), - ...(options.minimumFractionDigits !== undefined && { - minimumFractionDigits: options.minimumFractionDigits, - }), - }); - const fractionDigits = formatter.resolvedOptions().maximumFractionDigits ?? 2; - return formatter.format(amountSmallestUnit / Math.pow(10, fractionDigits)); -} - -const recordPerformanceMark = (markName: string) => { - try { - performance.mark(markName); - } catch { - // Performance timeline instrumentation must not break the measured operation. - } -} - -const recordPerformanceMeasure = (measureName: string, startMark: string, endMark: string) => { - try { - performance.measure(measureName, startMark, endMark); - } catch { - // Performance timeline instrumentation must not break the measured operation. - } -} - -export const measureSync = (cb: () => T, measureName: string, outputLog: boolean = true) => { - const startMark = `${measureName}.start`; - const endMark = `${measureName}.end`; - - recordPerformanceMark(startMark); - const startTime = performance.now(); - const data = cb(); - const endTime = performance.now(); - recordPerformanceMark(endMark); - - recordPerformanceMeasure(measureName, startMark, endMark); - const durationMs = endTime - startTime; - if (outputLog) { - console.debug(`[${measureName}] took ${durationMs}ms`); - } - - return { - data, - durationMs - } -} - -export const measure = async (cb: () => Promise, measureName: string, outputLog: boolean = true) => { - const startMark = `${measureName}.start`; - const endMark = `${measureName}.end`; - - recordPerformanceMark(startMark); - const startTime = performance.now(); - const data = await cb(); - const endTime = performance.now(); - recordPerformanceMark(endMark); - - recordPerformanceMeasure(measureName, startMark, endMark); - const durationMs = endTime - startTime; - if (outputLog) { - console.debug(`[${measureName}] took ${durationMs}ms`); - } - - return { - data, - durationMs - } -} - -/** - * Unwraps a promise that could return a ServiceError, throwing an error if it does. - * This is useful for calling server actions in a useQuery hook since it allows us - * to take advantage of error handling behavior built into react-query. - * - * @param promise The promise to unwrap. - * @returns The data from the promise. - */ -export const unwrapServiceError = async (promise: Promise): Promise => { - const data = await promise; - if (isServiceError(data)) { - throw new Error(data.message); - } - - return data; -} - -export const getRepoImageSrc = (imageUrl: string | undefined, repoId: number): string | undefined => { - if (!imageUrl) return undefined; - - try { - const url = new URL(imageUrl); - - // List of known public instances that don't require authentication - const publicHostnames = [ - 'github.com', - 'avatars.githubusercontent.com', - 'gitea.com', - 'bitbucket.org', - ]; - - const isPublicInstance = publicHostnames.includes(url.hostname); - - if (isPublicInstance) { - return imageUrl; - } else { - // Use the proxied route for self-hosted instances - return `/api/repos/${repoId}/image`; - } - } catch { - // If URL parsing fails, use the original URL - return imageUrl; - } -}; - -export const isHttpError = (error: unknown, status: number): boolean => { - return error !== null - && typeof error === 'object' - && 'status' in error - && error.status === status; -} - -const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); - -// Retry only on transient failures: network errors, 5xx responses, and the -// two 4xx codes that are known to be retry-safe (408 Request Timeout, 429 -// Too Many Requests). Other 4xx responses are deterministic client errors -// and should be surfaced to the caller immediately. -const isRetryableStatus = (status: number): boolean => - status >= 500 || status === 408 || status === 429; - -export const fetchWithRetry = async ( - input: RequestInfo | URL, - init?: RequestInit, - { retries = 3, backoffMs = 1000 }: { retries?: number; backoffMs?: number } = {}, -): Promise => { - for (let attempt = 0; attempt <= retries; attempt++) { - try { - const response = await fetch(input, init); - if (response.ok || !isRetryableStatus(response.status) || attempt === retries) { - return response; - } - } catch (error) { - if (attempt === retries) { - throw error; - } - } - await sleep(backoffMs * Math.pow(2, attempt)); - } - // Unreachable, but TypeScript needs it - throw new Error('fetchWithRetry: exhausted retries'); -} diff --git a/packages/web/src/metricsServer.ts b/packages/web/src/metricsServer.ts deleted file mode 100644 index 4755bbed6..000000000 --- a/packages/web/src/metricsServer.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { createLogger, env } from '@sourcebot/shared'; -import { createServer, Server } from 'node:http'; -import { registry } from './promClient'; - -const logger = createLogger('web-metrics-server'); - -/** - * Serves the web process' Prometheus metrics on its own port, rather than as a - * Next.js route, so that scraping doesn't pass through the app's middleware or - * get exposed publicly through the ingress. - */ -export const startMetricsServer = (): Server | undefined => { - // Guard against a missing port: `listen(undefined)` binds a random one, which - // would leave the scrape target silently broken instead of loudly absent. - const port = Number(env.WEB_METRICS_PORT); - if (!Number.isInteger(port) || port <= 0) { - logger.error(`Invalid WEB_METRICS_PORT '${env.WEB_METRICS_PORT}'; metrics server not started.`); - return undefined; - } - - const server = createServer(async (req, res) => { - if (req.url !== '/metrics') { - res.writeHead(404); - res.end(); - return; - } - - try { - const metrics = await registry.metrics(); - res.writeHead(200, { 'Content-Type': registry.contentType }); - res.end(metrics); - } catch (error) { - logger.error(`Failed to collect metrics: ${error}`); - res.writeHead(500); - res.end(); - } - }); - - // Metrics must never take down the web server, so swallow listen failures - // (a port collision, most likely) instead of letting the 'error' event throw. - server.on('error', (error) => { - logger.error(`Metrics server error: ${error}`); - }); - - server.listen(port, () => { - logger.info(`Web metrics server listening on port ${port}`); - }); - - return server; -}; diff --git a/packages/web/src/middleware/authenticatedPage.tsx b/packages/web/src/middleware/authenticatedPage.tsx deleted file mode 100644 index 515f79523..000000000 --- a/packages/web/src/middleware/authenticatedPage.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { withAuth, withOptionalAuth } from "./withAuth"; -import { isServiceError } from "@/lib/utils"; -import { Org, OrgRole, PrismaClient, UserWithAccounts } from "@sourcebot/db"; -import { redirect } from "next/navigation"; - -type RequiredPageAuthContext = { - user: UserWithAccounts; - org: Org; - role: OrgRole; - prisma: PrismaClient; -} - -type OptionalPageAuthContext = - | RequiredPageAuthContext - | { user?: UserWithAccounts; org: Org; role?: undefined; prisma: PrismaClient }; - -type RequiredAuthOptions = { - allowAnonymous?: false; - minRole?: OrgRole; - redirectTo?: string; -} - -export type OptionalAuthOptions = { - allowAnonymous: true; - minRole?: never; - redirectTo?: never; -} - -type AuthenticatedPageOptions = RequiredAuthOptions | OptionalAuthOptions; - -type AuthContextFor = - O extends { allowAnonymous: true } ? OptionalPageAuthContext : RequiredPageAuthContext; - -const ROLE_PRECEDENCE: Record = { - [OrgRole.MEMBER]: 1, - [OrgRole.OWNER]: 2, -}; - -/** - * HOC that wraps a page component with auth. The page receives the - * auth context as its first argument, and the original page props - * as its second. - * - * The auth context type narrows based on the options: - * - Default: `user` and `role` are always defined - * - `{ allowAnonymous: true }`: may be anonymous (no `user`) or authenticated without a - * membership (no `role`). Invariant: `role` defined implies `user` defined. - * - * @example - * // Required auth (user is always defined) - * export default authenticatedPage(async ({ org, prisma }) => { - * const repos = await prisma.repo.findMany({ ... }); - * return ; - * }); - * - * @example - * // With role gating - * export default authenticatedPage(async ({ org }) => { - * return ; - * }, { minRole: OrgRole.OWNER, redirectTo: '/settings' }); - * - * @example - * // Anonymous access allowed (user may be undefined) - * export default authenticatedPage(async ({ user, prisma }) => { - * return ; - * }, { allowAnonymous: true }); - */ -export function authenticatedPage< - P extends Record = Record, - O extends AuthenticatedPageOptions = RequiredAuthOptions, ->( - fn: (auth: AuthContextFor, props: P) => Promise, - opts?: O, -) { - return async (props: P) => { - if (opts && 'allowAnonymous' in opts && opts.allowAnonymous) { - const result = await withOptionalAuth(async (ctx) => ctx); - - if (isServiceError(result)) { - redirect('/login'); - } - - return fn(result as AuthContextFor, props); - } else { - const result = await withAuth(async (ctx) => ctx); - - if (isServiceError(result)) { - redirect('/login'); - } - - const requiredOpts = opts as RequiredAuthOptions | undefined; - if (requiredOpts?.minRole) { - if (ROLE_PRECEDENCE[result.role] < ROLE_PRECEDENCE[requiredOpts.minRole]) { - redirect(requiredOpts.redirectTo ?? '/'); - } - } - - return fn(result as AuthContextFor, props); - } - }; -} diff --git a/packages/web/src/middleware/sew.ts b/packages/web/src/middleware/sew.ts deleted file mode 100644 index 8f48859f9..000000000 --- a/packages/web/src/middleware/sew.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ServiceError, ServiceErrorException, unexpectedError } from "@/lib/serviceError"; -import { createLogger } from "@sourcebot/shared"; -import * as Sentry from "@sentry/nextjs"; - -const logger = createLogger('sew'); - - -/** - * "Service Error Wrapper". - * - * Captures any thrown exceptions, logs them to the console and Sentry, - * and returns a generic unexpected service error. - */ -export const sew = async (fn: () => Promise): Promise => { - try { - return await fn(); - } catch (e) { - Sentry.captureException(e); - logger.error(e); - - if (e instanceof ServiceErrorException) { - return e.serviceError; - } - - return unexpectedError(`An unexpected error occurred. Please try again later.`); - } -}; diff --git a/packages/web/src/middleware/withAuth.test.ts b/packages/web/src/middleware/withAuth.test.ts deleted file mode 100644 index ea8af9264..000000000 --- a/packages/web/src/middleware/withAuth.test.ts +++ /dev/null @@ -1,1960 +0,0 @@ -import { expect, test, vi, beforeEach, describe } from 'vitest'; -import { Session } from 'next-auth'; -import { NextRequest } from 'next/server'; -import { notAuthenticated } from '../lib/serviceError'; -import { getAuthContext, getAuthenticatedUser, withAuth, withOptionalAuth } from './withAuth'; -import { MOCK_API_KEY, MOCK_OAUTH_TOKEN, MOCK_ORG, MOCK_USER_WITH_ACCOUNTS, prisma } from '../__mocks__/prisma'; -import { OrgRole } from '@sourcebot/db'; -import { ErrorCode } from '../lib/errorCodes'; -import { StatusCodes } from 'http-status-codes'; -import { userScopedPrismaClientExtension } from '@/prisma'; -import { runWithRequestContext } from '@/lib/requestContext'; - -const TEST_OAUTH_SCOPE = 'read'; - -const mocks = vi.hoisted(() => { - return { - // Defaults to a empty session. - auth: vi.fn(async (): Promise => null), - headers: vi.fn(async (): Promise => new Headers()), - hasEntitlement: vi.fn((_entitlement: string) => false), - isAnonymousAccessAvailable: vi.fn(() => false), - syncWithLighthouse: vi.fn(async (_orgId: number) => undefined), - getSeatCap: vi.fn(() => undefined as number | undefined), - setSentryUser: vi.fn(), - env: {} as Record, - } -}); - -vi.mock('../auth', () => ({ - auth: mocks.auth, -})); - -vi.mock('@/lib/sentryUser', () => ({ - setSentryUser: mocks.setSentryUser, -})); - -vi.mock('next/headers', () => ({ - headers: mocks.headers, -})); - -vi.mock('@/prisma', async () => { - // @see: https://github.com/prisma/prisma/discussions/20244#discussioncomment-7976447 - const actual = await vi.importActual('@/__mocks__/prisma'); - return { - ...actual, - }; -}); - -vi.mock('server-only', () => ({ - default: vi.fn(), -})); - -vi.mock('@/features/billing/servicePing', () => ({ - syncWithLighthouse: mocks.syncWithLighthouse, -})); - -vi.mock('@sourcebot/shared', () => ({ - _hasEntitlement: mocks.hasEntitlement, - _getEntitlements: vi.fn(() => []), - _isAnonymousAccessAvailable: mocks.isAnonymousAccessAvailable, - hashSecret: vi.fn((secret: string) => secret), - OAUTH_ACCESS_TOKEN_PREFIX: 'sboa_', - API_KEY_PREFIX: 'sbk_', - LEGACY_API_KEY_PREFIX: 'sourcebot-', - SCOPED_ACCESS_TOKEN_PREFIX: 'sbst_', - env: mocks.env, - getSeatCap: mocks.getSeatCap, - createLogger: vi.fn(() => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - })), -})); - -// Test utility to set the mock session -const setMockSession = (session: Session | null) => { - mocks.auth.mockResolvedValue(session); -}; - -const setMockHeaders = (headers: Headers) => { - mocks.headers.mockResolvedValue(headers); -}; - -const SUSPENDED_AT = new Date('2026-01-01T00:00:00.000Z'); - -const createMockScopedAccessToken = ({ - expiresAt = new Date('2099-01-01T00:00:00.000Z'), - orgId = MOCK_ORG.id, - repositoryIds = [11, 22], -}: { - expiresAt?: Date; - orgId?: number; - repositoryIds?: number[]; -} = {}) => ({ - id: 'scoped-token-id', - hash: 'scopedtoken', - createdAt: new Date('2026-01-01T00:00:00.000Z'), - expiresAt, - lastUsedAt: null, - createdById: MOCK_USER_WITH_ACCOUNTS.id, - orgId, - createdBy: MOCK_USER_WITH_ACCOUNTS, - repos: repositoryIds.map((repoId) => ({ repoId })), -}); - -// Helper to create mock session objects -const createMockSession = (overrides: Partial = {}): Session => ({ - user: { - id: 'test-user-id', - email: 'test@example.com', - name: 'Test User', - image: null, - ...overrides.user, - }, - expires: '2099-01-01T00:00:00.000Z', - ...overrides, -}); - - -beforeEach(() => { - vi.clearAllMocks(); - vi.mocked(userScopedPrismaClientExtension).mockReset(); - mocks.auth.mockResolvedValue(null); - mocks.headers.mockResolvedValue(new Headers()); - mocks.hasEntitlement.mockImplementation( - (entitlement: string) => entitlement === 'scoped-access-tokens', - ); - mocks.isAnonymousAccessAvailable.mockReturnValue(false); - // getAuthContext fires `prisma.user.update().catch(...)` and - // `prisma.userToOrg.updateMany().catch(...)` to bump lastActiveAt; without a - // default, the reset mock returns undefined and the .catch chain throws. - prisma.user.update.mockResolvedValue(MOCK_USER_WITH_ACCOUNTS); - prisma.userToOrg.updateMany.mockResolvedValue({ count: 0 }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (prisma.$transaction as any).mockImplementation(async (cb: any) => cb(prisma)); - mocks.getSeatCap.mockReturnValue(undefined); - // Reset env flags between tests - Object.keys(mocks.env).forEach(key => delete mocks.env[key]); -}); - -describe('getAuthenticatedUser', () => { - test('should return a user object if a valid session is present', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - const result = await getAuthenticatedUser(); - expect(result).not.toBeUndefined(); - expect(result?.user.id).toBe(userId); - expect(result?.principal.source).toBe('session'); - }); - - test('should return a user object if a valid api key is present', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - const result = await getAuthenticatedUser(); - expect(result).not.toBeUndefined(); - expect(result?.user.id).toBe(userId); - expect(result?.principal.source).toBe('api_key'); - expect(prisma.apiKey.update).toHaveBeenCalledWith({ - where: { - hash: 'apikey', - }, - data: { - lastUsedAt: expect.any(Date), - }, - }); - }); - - test('should return a user object if a valid api key with the new sbk_ prefix is present', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sbk_apikey' })); - const result = await getAuthenticatedUser(); - expect(result).not.toBeUndefined(); - expect(result?.user.id).toBe(userId); - expect(result?.principal.source).toBe('api_key'); - expect(prisma.apiKey.update).toHaveBeenCalledWith({ - where: { hash: 'apikey' }, - data: { lastUsedAt: expect.any(Date) }, - }); - }); - - test('should return a user object if a valid Bearer token is present', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - - setMockHeaders(new Headers({ 'Authorization': 'Bearer sourcebot-apikey' })); - const result = await getAuthenticatedUser(); - expect(result).not.toBeUndefined(); - expect(result?.user.id).toBe(userId); - expect(result?.principal.source).toBe('api_key'); - expect(prisma.apiKey.update).toHaveBeenCalledWith({ - where: { - hash: 'apikey', - }, - data: { - lastUsedAt: expect.any(Date), - }, - }); - }); - - describe('scoped access token Bearer authentication', () => { - test('should return undefined before token lookup without the entitlement', async () => { - prisma.scopedAccessToken.findUnique.mockResolvedValue(createMockScopedAccessToken()); - mocks.hasEntitlement.mockReturnValue(false); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sbst_scopedtoken' })); - - const result = await getAuthenticatedUser(); - - expect(result).toBeUndefined(); - expect(mocks.hasEntitlement.mock.calls[0]?.[0]).toBe('scoped-access-tokens'); - expect(prisma.scopedAccessToken.findUnique).not.toHaveBeenCalled(); - expect(prisma.scopedAccessToken.update).not.toHaveBeenCalled(); - expect(prisma.apiKey.findUnique).not.toHaveBeenCalled(); - }); - - test('should return the token creator and scoped access token principal for a valid token', async () => { - const scopedAccessToken = createMockScopedAccessToken(); - prisma.scopedAccessToken.findUnique.mockResolvedValue(scopedAccessToken); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sbst_scopedtoken' })); - - const result = await getAuthenticatedUser(); - - expect(prisma.scopedAccessToken.findUnique).toHaveBeenCalledWith({ - where: { hash: 'scopedtoken' }, - include: { - createdBy: { - include: { accounts: true }, - }, - repos: { - select: { repoId: true }, - }, - }, - }); - expect(result).toStrictEqual({ - user: MOCK_USER_WITH_ACCOUNTS, - principal: { - source: 'scoped_access_token', - credentialId: scopedAccessToken.id, - orgId: scopedAccessToken.orgId, - repositoryIds: [11, 22], - expiresAt: scopedAccessToken.expiresAt, - }, - }); - expect(prisma.scopedAccessToken.update).toHaveBeenCalledWith({ - where: { hash: 'scopedtoken' }, - data: { lastUsedAt: expect.any(Date) }, - }); - expect(prisma.apiKey.findUnique).not.toHaveBeenCalled(); - }); - - test('should preserve an empty repository scope', async () => { - const scopedAccessToken = createMockScopedAccessToken({ repositoryIds: [] }); - prisma.scopedAccessToken.findUnique.mockResolvedValue(scopedAccessToken); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sbst_scopedtoken' })); - - const result = await getAuthenticatedUser(); - - expect(result?.principal).toMatchObject({ - source: 'scoped_access_token', - repositoryIds: [], - }); - }); - - test('should return undefined for an expired token', async () => { - prisma.scopedAccessToken.findUnique.mockResolvedValue(createMockScopedAccessToken({ - expiresAt: new Date('2020-01-01T00:00:00.000Z'), - })); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sbst_scopedtoken' })); - - const result = await getAuthenticatedUser(); - - expect(result).toBeUndefined(); - expect(prisma.scopedAccessToken.update).not.toHaveBeenCalled(); - expect(prisma.apiKey.findUnique).not.toHaveBeenCalled(); - }); - - test('should return undefined for a revoked token', async () => { - prisma.scopedAccessToken.findUnique.mockResolvedValue(null); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sbst_scopedtoken' })); - - const result = await getAuthenticatedUser(); - - expect(result).toBeUndefined(); - expect(prisma.scopedAccessToken.update).not.toHaveBeenCalled(); - expect(prisma.apiKey.findUnique).not.toHaveBeenCalled(); - }); - - test('should return undefined for a token without a secret', async () => { - setMockHeaders(new Headers({ 'Authorization': 'Bearer sbst_' })); - - const result = await getAuthenticatedUser(); - - expect(result).toBeUndefined(); - expect(prisma.scopedAccessToken.findUnique).not.toHaveBeenCalled(); - expect(prisma.apiKey.findUnique).not.toHaveBeenCalled(); - }); - }); - - test('should use the current request context when no request is passed', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - - const request = new NextRequest('https://sourcebot.example.com/api/test', { - headers: { - Authorization: 'Bearer sourcebot-apikey', - }, - }); - - const result = await runWithRequestContext(request, () => getAuthenticatedUser()); - - expect(result).not.toBeUndefined(); - expect(result?.user.id).toBe(userId); - expect(result?.principal.source).toBe('api_key'); - expect(mocks.headers).not.toHaveBeenCalled(); - expect(prisma.apiKey.update).toHaveBeenCalledWith({ - where: { - hash: 'apikey', - }, - data: { - lastUsedAt: expect.any(Date), - }, - }); - }); - - test('should return undefined if a Bearer token is present but the API key does not exist', async () => { - prisma.apiKey.findUnique.mockResolvedValue(null); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sourcebot-apikey' })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - }); - - test('should return a user object if a valid OAuth Bearer token is present', async () => { - mocks.hasEntitlement.mockReturnValue(true); - prisma.oAuthToken.findUnique.mockResolvedValue(MOCK_OAUTH_TOKEN); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' })); - const result = await getAuthenticatedUser(); - expect(result).not.toBeUndefined(); - expect(result?.user.id).toBe(MOCK_USER_WITH_ACCOUNTS.id); - expect(result?.principal.source).toBe('oauth'); - }); - - test('should return parsed scopes for a valid OAuth Bearer token', async () => { - mocks.hasEntitlement.mockReturnValue(true); - prisma.oAuthToken.findUnique.mockResolvedValue({ - ...MOCK_OAUTH_TOKEN, - scope: `${TEST_OAUTH_SCOPE} other ${TEST_OAUTH_SCOPE}`, - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' })); - const result = await getAuthenticatedUser(); - expect(result?.principal).toEqual({ - source: 'oauth', - oauthScopes: [TEST_OAUTH_SCOPE, 'other'], - }); - }); - - test('should update lastUsedAt when an OAuth Bearer token is used', async () => { - mocks.hasEntitlement.mockReturnValue(true); - prisma.oAuthToken.findUnique.mockResolvedValue(MOCK_OAUTH_TOKEN); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' })); - await getAuthenticatedUser(); - expect(prisma.oAuthToken.update).toHaveBeenCalledWith({ - where: { hash: 'oauthtoken' }, - data: { lastUsedAt: expect.any(Date) }, - }); - }); - - test('should return undefined if an OAuth Bearer token is present but the deployment does not have the oauth entitlement', async () => { - mocks.hasEntitlement.mockReturnValue(false); - prisma.oAuthToken.findUnique.mockResolvedValue(MOCK_OAUTH_TOKEN); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - expect(prisma.oAuthToken.findUnique).not.toHaveBeenCalled(); - }); - - test('should return undefined if an OAuth Bearer token is present but the token does not exist', async () => { - mocks.hasEntitlement.mockReturnValue(true); - prisma.oAuthToken.findUnique.mockResolvedValue(null); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - expect(prisma.oAuthToken.findUnique).toHaveBeenCalled(); - }); - - test('should return undefined if an OAuth Bearer token is present but the token is expired', async () => { - mocks.hasEntitlement.mockReturnValue(true); - prisma.oAuthToken.findUnique.mockResolvedValue({ - ...MOCK_OAUTH_TOKEN, - expiresAt: new Date(Date.now() - 1000), // expired 1 second ago - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - expect(prisma.oAuthToken.findUnique).toHaveBeenCalled(); - }); - - test('should not check API key when a sboa_ Bearer token is present', async () => { - mocks.hasEntitlement.mockReturnValue(true); - prisma.oAuthToken.findUnique.mockResolvedValue(MOCK_OAUTH_TOKEN); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' })); - await getAuthenticatedUser(); - expect(prisma.apiKey.findUnique).not.toHaveBeenCalled(); - }); - - test('should reject a DPoP-bound OAuth token presented as Bearer', async () => { - mocks.hasEntitlement.mockReturnValue(true); - prisma.oAuthToken.findUnique.mockResolvedValue({ - ...MOCK_OAUTH_TOKEN, - dpopJkt: 'dpop-thumbprint', - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - expect(prisma.oAuthToken.update).not.toHaveBeenCalled(); - }); - - test('should reject an unbound OAuth token presented with the DPoP scheme', async () => { - mocks.hasEntitlement.mockReturnValue(true); - prisma.oAuthToken.findUnique.mockResolvedValue(MOCK_OAUTH_TOKEN); - setMockHeaders(new Headers({ 'Authorization': 'DPoP sboa_oauthtoken' })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - expect(prisma.oAuthToken.update).not.toHaveBeenCalled(); - }); - - test('should return undefined if a Bearer token is present but the user is not found', async () => { - prisma.user.findUnique.mockResolvedValue(null); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: 'test-user-id', - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sourcebot-apikey' })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - }); - - test('should return undefined if no session or api key is present', async () => { - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - }); - - test('should return undefined if a api key does not exist', async () => { - prisma.apiKey.findUnique.mockResolvedValue(null); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - }); - - test('should return undefined if a api key is present but is invalid', async () => { - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'different-hash', - createdById: 'test-user-id', - }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - }); - - test('should return undefined if a valid session is present but the user is not found', async () => { - prisma.user.findUnique.mockResolvedValue(null); - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - }); - - test('should return undefined if a valid api key is present but the user is not found', async () => { - prisma.user.findUnique.mockResolvedValue(null); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: 'test-user-id', - }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - const user = await getAuthenticatedUser(); - expect(user).toBeUndefined(); - }); -}); - -describe('getAuthContext', () => { - test('does not record activity or activate a pending membership when activity recording is disabled', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue(MOCK_ORG); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - setMockSession(createMockSession({ user: { id: userId } })); - - const authContext = await getAuthContext({ recordActivity: false }); - - expect(authContext).toMatchObject({ - user: { id: userId }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - }); - expect(prisma.user.update).not.toHaveBeenCalled(); - expect(prisma.userToOrg.updateMany).not.toHaveBeenCalled(); - expect(prisma.$transaction).not.toHaveBeenCalled(); - expect(mocks.syncWithLighthouse).not.toHaveBeenCalled(); - }); - - test('should pass scoped access token repository IDs to the Prisma extension', async () => { - const scopedAccessToken = createMockScopedAccessToken(); - prisma.scopedAccessToken.findUnique.mockResolvedValue(scopedAccessToken); - prisma.org.findUnique.mockResolvedValue(MOCK_ORG); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: scopedAccessToken.createdBy.id, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: new Date(), - role: OrgRole.MEMBER, - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sbst_scopedtoken' })); - - const authContext = await getAuthContext(); - - expect(userScopedPrismaClientExtension).toHaveBeenCalledWith( - scopedAccessToken.createdBy, - [11, 22], - ); - expect(authContext).toMatchObject({ - user: scopedAccessToken.createdBy, - org: MOCK_ORG, - role: OrgRole.MEMBER, - principal: { - source: 'scoped_access_token', - credentialId: scopedAccessToken.id, - orgId: MOCK_ORG.id, - repositoryIds: [11, 22], - expiresAt: scopedAccessToken.expiresAt, - }, - }); - }); - - test('should reject a scoped access token issued for a different organization', async () => { - prisma.scopedAccessToken.findUnique.mockResolvedValue(createMockScopedAccessToken({ - orgId: MOCK_ORG.id + 1, - })); - prisma.org.findUnique.mockResolvedValue(MOCK_ORG); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sbst_scopedtoken' })); - - const authContext = await getAuthContext(); - - expect(authContext).toStrictEqual(notAuthenticated()); - expect(prisma.userToOrg.findUnique).not.toHaveBeenCalled(); - expect(userScopedPrismaClientExtension).not.toHaveBeenCalled(); - }); - - test('sets the Sentry user for direct callers', async () => { - const userId = 'test-user-id'; - const user = { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }; - prisma.user.findUnique.mockResolvedValue(user); - prisma.org.findUnique.mockResolvedValue(MOCK_ORG); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: new Date(), - role: OrgRole.MEMBER, - }); - mocks.env.SOURCEBOT_TELEMETRY_PII_COLLECTION_ENABLED = 'true'; - setMockSession(createMockSession({ user: { id: userId } })); - - await getAuthContext(); - - expect(mocks.setSentryUser).toHaveBeenCalledWith(user, true); - }); - - test('clears the Sentry user for unauthenticated direct callers', async () => { - prisma.org.findUnique.mockResolvedValue(MOCK_ORG); - - await getAuthContext(); - - expect(mocks.setSentryUser).toHaveBeenCalledWith(null, false); - }); - - test('should return a auth context object if a valid session is present and the user is a member of the organization', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - const authContext = await getAuthContext(); - expect(authContext).not.toBeUndefined(); - expect(authContext).toStrictEqual({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - prisma: undefined, - principal: { source: 'session' }, - }); - }); - - test('should sync with Lighthouse when a pending member becomes active for the first time', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.userToOrg.updateMany.mockResolvedValue({ count: 1 }); - - setMockSession(createMockSession({ user: { id: userId } })); - await getAuthContext(); - - expect(prisma.userToOrg.updateMany).toHaveBeenCalledWith({ - where: { - orgId: MOCK_ORG.id, - userId, - suspendedAt: null, - lastActiveAt: null, - }, - data: { lastActiveAt: expect.any(Date) }, - }); - expect(mocks.syncWithLighthouse).toHaveBeenCalledWith(MOCK_ORG.id); - }); - - test('should activate a pending member when the org has an available seat', async () => { - const userId = 'test-user-id'; - mocks.getSeatCap.mockReturnValue(2); - prisma.userToOrg.count.mockResolvedValue(1); - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.userToOrg.updateMany.mockResolvedValue({ count: 1 }); - - setMockSession(createMockSession({ user: { id: userId } })); - const cb = vi.fn(); - const result = await withAuth(cb); - - expect(result).toBeUndefined(); - expect(cb).toHaveBeenCalledWith(expect.objectContaining({ - user: expect.objectContaining({ id: userId }), - org: MOCK_ORG, - role: OrgRole.MEMBER, - })); - expect(prisma.userToOrg.count).toHaveBeenCalledWith({ - where: { - orgId: MOCK_ORG.id, - suspendedAt: null, - lastActiveAt: { not: null }, - }, - }); - expect(mocks.syncWithLighthouse).toHaveBeenCalledWith(MOCK_ORG.id); - }); - - test('should return a seat-limit service error when a pending member logs in at capacity', async () => { - const userId = 'test-user-id'; - mocks.getSeatCap.mockReturnValue(1); - prisma.userToOrg.count.mockResolvedValue(1); - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - - setMockSession(createMockSession({ user: { id: userId } })); - const cb = vi.fn(); - const result = await withAuth(cb); - - expect(cb).not.toHaveBeenCalled(); - expect(result).toStrictEqual({ - statusCode: StatusCodes.BAD_REQUEST, - errorCode: ErrorCode.ORG_SEAT_COUNT_REACHED, - message: 'Organization is at max capacity', - }); - expect(prisma.userToOrg.updateMany).not.toHaveBeenCalled(); - expect(mocks.syncWithLighthouse).not.toHaveBeenCalled(); - }); - - test('should not sync with Lighthouse when another request already marked the member active', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.userToOrg.updateMany.mockResolvedValue({ count: 0 }); - - setMockSession(createMockSession({ user: { id: userId } })); - await getAuthContext(); - await Promise.resolve(); - - expect(mocks.syncWithLighthouse).not.toHaveBeenCalled(); - }); - - test('should not block an already-active member when the org is at capacity', async () => { - const userId = 'test-user-id'; - mocks.getSeatCap.mockReturnValue(1); - prisma.userToOrg.count.mockResolvedValue(1); - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: new Date('2026-01-01T00:00:00.000Z'), - role: OrgRole.MEMBER, - }); - - setMockSession(createMockSession({ user: { id: userId } })); - const cb = vi.fn(); - const result = await withAuth(cb); - - expect(result).toBeUndefined(); - expect(cb).toHaveBeenCalledWith(expect.objectContaining({ - user: expect.objectContaining({ id: userId }), - org: MOCK_ORG, - role: OrgRole.MEMBER, - })); - expect(prisma.$transaction).not.toHaveBeenCalled(); - }); - - test('should return a auth context object if a valid session is present and the user is a member of the organization with OWNER role', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.OWNER, - }); - - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - const authContext = await getAuthContext(); - expect(authContext).not.toBeUndefined(); - expect(authContext).toStrictEqual({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.OWNER, - prisma: undefined, - principal: { source: 'session' }, - }); - }); - - test('should return a auth context object if a valid session is present and the user is not a member of the organization. The role should be undefined.', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue(null); - - setMockSession(createMockSession({ user: { id: userId } })); - const authContext = await getAuthContext(); - expect(authContext).not.toBeUndefined(); - expect(authContext).toStrictEqual({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - prisma: undefined, - principal: { source: 'session' }, - }); - }); - - test('should return a auth context object if no auth session is present. The role and user should be undefined.', async () => { - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue(null); - - const authContext = await getAuthContext(); - expect(authContext).not.toBeUndefined(); - expect(authContext).toStrictEqual({ - user: undefined, - org: MOCK_ORG, - prisma: undefined, - principal: undefined, - }); - }); - - test('should not grant a role when the membership is suspended, even though the membership row exists', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: SUSPENDED_AT, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.OWNER, - }); - - setMockSession(createMockSession({ user: { id: userId } })); - const authContext = await getAuthContext(); - expect(authContext).toStrictEqual({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - prisma: undefined, - principal: { source: 'session' }, - }); - expect(prisma.userToOrg.updateMany).not.toHaveBeenCalled(); - }); - - test('should not grant a role to a suspended member authenticating via API key (API-key auth bypasses the JWT sessionVersion logout, so this gate is what denies them)', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: SUSPENDED_AT, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - - const authContext = await getAuthContext(); - expect(authContext).toStrictEqual({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - prisma: undefined, - principal: { source: 'api_key' }, - }); - expect(mocks.setSentryUser).toHaveBeenCalledWith( - expect.objectContaining({ id: userId }), - false, - ); - }); - - describe('DISABLE_API_KEY_USAGE_FOR_NON_OWNER_USERS', () => { - test('should return a 403 service error when flag is enabled and a non-owner authenticates via api key', async () => { - mocks.env.DISABLE_API_KEY_USAGE_FOR_NON_OWNER_USERS = 'true'; - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ ...MOCK_USER_WITH_ACCOUNTS, id: userId }); - prisma.org.findUnique.mockResolvedValue({ ...MOCK_ORG }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - - const authContext = await getAuthContext(); - expect(authContext).toStrictEqual({ - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.API_KEY_USAGE_DISABLED, - message: 'API key usage is disabled for non-admin users.', - }); - }); - - test('should allow an owner to authenticate via api key when flag is enabled', async () => { - mocks.env.DISABLE_API_KEY_USAGE_FOR_NON_OWNER_USERS = 'true'; - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ ...MOCK_USER_WITH_ACCOUNTS, id: userId }); - prisma.org.findUnique.mockResolvedValue({ ...MOCK_ORG }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.OWNER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - - const authContext = await getAuthContext(); - expect(authContext).toStrictEqual({ - user: { ...MOCK_USER_WITH_ACCOUNTS, id: userId }, - org: MOCK_ORG, - role: OrgRole.OWNER, - prisma: undefined, - principal: { source: 'api_key' }, - }); - }); - - test('should allow a non-owner to authenticate via session when flag is enabled', async () => { - mocks.env.DISABLE_API_KEY_USAGE_FOR_NON_OWNER_USERS = 'true'; - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ ...MOCK_USER_WITH_ACCOUNTS, id: userId }); - prisma.org.findUnique.mockResolvedValue({ ...MOCK_ORG }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - setMockSession(createMockSession({ user: { id: userId } })); - - const authContext = await getAuthContext(); - expect(authContext).toStrictEqual({ - user: { ...MOCK_USER_WITH_ACCOUNTS, id: userId }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - prisma: undefined, - principal: { source: 'session' }, - }); - }); - }); - - describe('requiredOAuthScopes', () => { - test('should allow OAuth bearer tokens that contain the required scope', async () => { - const userId = 'test-user-id'; - mocks.hasEntitlement.mockReturnValue(true); - const oauthToken = { - ...MOCK_OAUTH_TOKEN, - user: { ...MOCK_USER_WITH_ACCOUNTS, id: userId }, - scope: TEST_OAUTH_SCOPE, - }; - prisma.oAuthToken.findUnique.mockResolvedValue(oauthToken); - prisma.org.findUnique.mockResolvedValue({ ...MOCK_ORG }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - role: OrgRole.MEMBER, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' })); - - const authContext = await getAuthContext({ requiredOAuthScopes: [TEST_OAUTH_SCOPE] }); - - expect(authContext).toMatchObject({ - user: { id: userId }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - }); - }); - - test('should return a 403 service error when an OAuth bearer token is missing the required scope', async () => { - const userId = 'test-user-id'; - mocks.hasEntitlement.mockReturnValue(true); - const oauthToken = { - ...MOCK_OAUTH_TOKEN, - user: { ...MOCK_USER_WITH_ACCOUNTS, id: userId }, - scope: 'other', - }; - prisma.oAuthToken.findUnique.mockResolvedValue(oauthToken); - prisma.org.findUnique.mockResolvedValue({ ...MOCK_ORG }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - role: OrgRole.MEMBER, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sboa_oauthtoken' })); - - const authContext = await getAuthContext({ requiredOAuthScopes: [TEST_OAUTH_SCOPE] }); - - expect(authContext).toStrictEqual({ - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.OAUTH_INSUFFICIENT_SCOPE, - message: `OAuth access token is missing required scope: ${TEST_OAUTH_SCOPE}`, - }); - }); - - test('should not apply OAuth scope requirements to API keys', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ ...MOCK_USER_WITH_ACCOUNTS, id: userId }); - prisma.org.findUnique.mockResolvedValue({ ...MOCK_ORG }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - role: OrgRole.MEMBER, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - }); - prisma.apiKey.findUnique.mockResolvedValue({ ...MOCK_API_KEY, hash: 'apikey', createdById: userId }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - - const authContext = await getAuthContext({ requiredOAuthScopes: [TEST_OAUTH_SCOPE] }); - - expect(authContext).toMatchObject({ - user: { id: userId }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - }); - }); - }); -}); - -describe('withAuth', () => { - describe('requiredAuthSource', () => { - test('should call the callback when the authentication source matches', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ ...MOCK_ORG }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - const cb = vi.fn(async () => 'allowed'); - - const result = await withAuth(cb, { requiredAuthSource: 'api_key' }); - - expect(result).toBe('allowed'); - expect(cb).toHaveBeenCalledOnce(); - }); - - test('should return forbidden when the authentication source does not match', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ ...MOCK_ORG }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - setMockSession(createMockSession({ user: { id: userId } })); - const cb = vi.fn(async () => 'allowed'); - - const result = await withAuth(cb, { requiredAuthSource: 'api_key' }); - - expect(result).toStrictEqual({ - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS, - message: 'This operation cannot be performed with the current authentication method.', - }); - expect(cb).not.toHaveBeenCalled(); - }); - - test('should return forbidden when a scoped access token is used for an API-key-only operation', async () => { - const scopedAccessToken = createMockScopedAccessToken(); - prisma.scopedAccessToken.findUnique.mockResolvedValue(scopedAccessToken); - prisma.org.findUnique.mockResolvedValue(MOCK_ORG); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: scopedAccessToken.createdBy.id, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: new Date(), - role: OrgRole.MEMBER, - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sbst_scopedtoken' })); - const cb = vi.fn(async () => 'allowed'); - - const result = await withAuth(cb, { requiredAuthSource: 'api_key' }); - - expect(result).toStrictEqual({ - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS, - message: 'This operation cannot be performed with the current authentication method.', - }); - expect(cb).not.toHaveBeenCalled(); - expect(userScopedPrismaClientExtension).not.toHaveBeenCalled(); - }); - - test('should return unauthenticated when no authentication source is present', async () => { - prisma.org.findUnique.mockResolvedValue({ ...MOCK_ORG }); - const cb = vi.fn(async () => 'allowed'); - - const result = await withAuth(cb, { requiredAuthSource: 'api_key' }); - - expect(result).toStrictEqual(notAuthenticated()); - expect(cb).not.toHaveBeenCalled(); - }); - }); - - test('should pass the scoped prisma client from $extends to the callback', async () => { - const userId = 'test-user-id'; - const user = { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }; - const extension = { query: { userMcpServer: {} } }; - const scopedPrisma = { scoped: true }; - - prisma.user.findUnique.mockResolvedValue(user); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - vi.mocked(userScopedPrismaClientExtension).mockResolvedValue(extension as never); - prisma.$extends.mockReturnValue(scopedPrisma as never); - setMockSession(createMockSession({ user: { id: userId } })); - - const cb = vi.fn(); - await withAuth(cb); - - expect(userScopedPrismaClientExtension).toHaveBeenCalledWith(user, undefined); - expect(prisma.$extends).toHaveBeenCalledWith(extension); - expect(cb).toHaveBeenCalledWith(expect.objectContaining({ - prisma: scopedPrisma, - principal: { source: 'session' }, - })); - }); - - test('should call the callback with the auth context object if a valid session is present and the user is a member of the organization', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - - const cb = vi.fn(); - const result = await withAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should call the callback with the auth context object if a valid session is present and the user is a member of the organization with OWNER role', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.OWNER, - }); - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - - const cb = vi.fn(); - const result = await withAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.OWNER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should call the callback with the auth context object if a valid session is present and the user is a member of the organization (api key)', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - - const cb = vi.fn(); - const result = await withAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should call the callback with the auth context object if a valid session is present and the user is a member of the organization with OWNER role (api key)', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.OWNER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - - const cb = vi.fn(); - const result = await withAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.OWNER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should call the callback with the auth context object if a valid Bearer token is present and the user is a member of the organization', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sourcebot-apikey' })); - - const cb = vi.fn(); - const result = await withAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should call the callback with the auth context object if a valid Bearer token is present and the user is a member of the organization with OWNER role', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.OWNER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sourcebot-apikey' })); - - const cb = vi.fn(); - const result = await withAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.OWNER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should return a service error if the user is a member of the organization but does not have a valid session', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - setMockSession(null); - - const cb = vi.fn(); - const result = await withAuth(cb); - expect(cb).not.toHaveBeenCalled(); - expect(result).toStrictEqual(notAuthenticated()); - }); - - test('should return a service error if the user is not a member of the organization', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - // user is not a member of the organization - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - - const cb = vi.fn(); - const result = await withAuth(cb); - expect(cb).not.toHaveBeenCalled(); - expect(result).toStrictEqual(notAuthenticated()); - }); - - test('should return a service error when the membership is suspended, even with a valid session', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: SUSPENDED_AT, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.OWNER, - }); - setMockSession(createMockSession({ user: { id: userId } })); - - const cb = vi.fn(); - const result = await withAuth(cb); - expect(cb).not.toHaveBeenCalled(); - expect(result).toStrictEqual(notAuthenticated()); - }); - - test('should deny a suspended member authenticating via API key', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: SUSPENDED_AT, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - - const cb = vi.fn(); - const result = await withAuth(cb); - expect(cb).not.toHaveBeenCalled(); - expect(result).toStrictEqual(notAuthenticated()); - }); -}); - -describe('withOptionalAuth', () => { - test('should call the callback with the auth context object if a valid session is present and the user is a member of the organization', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should call the callback with the auth context object if a valid session is present and the user is a member of the organization with OWNER role', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.OWNER, - }); - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.OWNER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should call the callback with the auth context object if a valid session is present and the user is a member of the organization (api key)', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should call the callback with the auth context object if a valid session is present and the user is a member of the organization with OWNER role (api key)', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.OWNER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'X-Sourcebot-Api-Key': 'sourcebot-apikey' })); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.OWNER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should call the callback with the auth context object if a valid Bearer token is present and the user is a member of the organization', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sourcebot-apikey' })); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.MEMBER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should call the callback with the auth context object if a valid Bearer token is present and the user is a member of the organization with OWNER role', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.OWNER, - }); - prisma.apiKey.findUnique.mockResolvedValue({ - ...MOCK_API_KEY, - hash: 'apikey', - createdById: userId, - }); - setMockHeaders(new Headers({ 'Authorization': 'Bearer sourcebot-apikey' })); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: MOCK_ORG, - role: OrgRole.OWNER, - principal: expect.any(Object), - }); - expect(result).toEqual(undefined); - }); - - test('should return a service error if the user is a member of the organization but does not have a valid session', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - prisma.userToOrg.findUnique.mockResolvedValue({ - joinedAt: new Date(), - userId: userId, - orgId: MOCK_ORG.id, - suspendedAt: null, - scimExternalId: null, - lastActiveAt: null, - role: OrgRole.MEMBER, - }); - setMockSession(null); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).not.toHaveBeenCalled(); - expect(result).toStrictEqual(notAuthenticated()); - }); - - test('should return a service error if the user is not a member of the organization', async () => { - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - }); - // user is not a member of the organization - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).not.toHaveBeenCalled(); - expect(result).toStrictEqual(notAuthenticated()); - }); - - test('should call the callback with the auth context object if the user is not a member of the organization and anonymous access is available', async () => { - mocks.isAnonymousAccessAvailable.mockReturnValue(true); - - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - isAnonymousAccessEnabled: true, - }); - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).toHaveBeenCalledWith({ - user: { - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }, - org: { - ...MOCK_ORG, - isAnonymousAccessEnabled: true, - }, - prisma: undefined, - principal: { source: 'session' }, - }); - expect(result).toEqual(undefined); - }); - - test('should return a service error when anonymousAccessEnabled is true but anonymous access is not available', async () => { - mocks.isAnonymousAccessAvailable.mockReturnValue(false); - - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - isAnonymousAccessEnabled: true, - }); - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).not.toHaveBeenCalled(); - expect(result).toStrictEqual(notAuthenticated()); - }); - - test('should return a service error when anonymous access is available but anonymousAccessEnabled is false', async () => { - mocks.isAnonymousAccessAvailable.mockReturnValue(true); - - const userId = 'test-user-id'; - prisma.user.findUnique.mockResolvedValue({ - ...MOCK_USER_WITH_ACCOUNTS, - id: userId, - }); - prisma.org.findUnique.mockResolvedValue({ - ...MOCK_ORG, - isAnonymousAccessEnabled: false, - }); - setMockSession(createMockSession({ user: { id: 'test-user-id' } })); - - const cb = vi.fn(); - const result = await withOptionalAuth(cb); - expect(cb).not.toHaveBeenCalled(); - expect(result).toStrictEqual(notAuthenticated()); - }); -}); diff --git a/packages/web/src/middleware/withAuth.ts b/packages/web/src/middleware/withAuth.ts deleted file mode 100644 index 6ab5dc550..000000000 --- a/packages/web/src/middleware/withAuth.ts +++ /dev/null @@ -1,482 +0,0 @@ -import { __unsafePrisma, userScopedPrismaClientExtension } from "@/prisma"; -import { hashSecret, OAUTH_ACCESS_TOKEN_PREFIX, API_KEY_PREFIX, LEGACY_API_KEY_PREFIX, SCOPED_ACCESS_TOKEN_PREFIX, env } from "@sourcebot/shared"; -import { ApiKey, Org, OrgRole, PrismaClient, UserToOrg, UserWithAccounts } from "@sourcebot/db"; -import { headers } from "next/headers"; -import { auth } from "../auth"; -import { insufficientOAuthScope, notAuthenticated, notFound, ServiceError } from "../lib/serviceError"; -import { SINGLE_TENANT_ORG_ID } from "../lib/constants"; -import { StatusCodes } from "http-status-codes"; -import { ErrorCode } from "../lib/errorCodes"; -import { isServiceError } from "../lib/utils"; -import { hasEntitlement, isAnonymousAccessEnabled } from "@/lib/entitlements"; -import { activatePendingMembership } from "@/features/membership/membership.service"; -import { hasRequiredOAuthScopes, parseOAuthScopeString } from "@/ee/features/oauth/utils"; -import { DPOP_AUTH_SCHEME, DPOP_PROOF_HEADER, verifyDpopProof } from "@/ee/features/oauth/dpop"; -import { getCurrentRequest } from "@/lib/requestContext"; -import { setSentryUser } from "@/lib/sentryUser"; - -const LAST_ACTIVE_AT_THRESHOLD_MS = 5 * 60 * 1000; - -type RequiredAuthContext = { - user: UserWithAccounts; - role: OrgRole; - org: Org; - prisma: PrismaClient; - principal: AuthPrincipal; -}; - -type OptionalAuthContext = - | RequiredAuthContext - | { - user?: UserWithAccounts; - role?: undefined; - org: Org; - prisma: PrismaClient; - principal?: AuthPrincipal; - }; - -export type AuthPrincipal = - | { source: 'session' } - | { source: 'oauth'; oauthScopes: string[] } - | { source: 'api_key' } - | { - source: 'scoped_access_token'; - credentialId: string; - orgId: number; - repositoryIds: number[]; - expiresAt: Date; - }; - -export type AuthSource = AuthPrincipal['source']; - -export type AuthResult = { - user: UserWithAccounts; - principal: AuthPrincipal; -}; - -type AuthOptions = { - requiredOAuthScopes?: readonly string[]; - requiredAuthSource?: AuthSource; - /** Whether this request should update user activity and activate a pending membership. Defaults to true. */ - recordActivity?: boolean; -}; - -export const withAuth = async (fn: (params: RequiredAuthContext) => Promise, options: AuthOptions = {}) => { - const authContext = await getAuthContext(options); - - if (isServiceError(authContext)) { - return authContext; - } - - const { user, org, role, prisma, principal } = authContext; - - if (!user || !role || !principal) { - return notAuthenticated(); - } - - return fn({ user, org, role, prisma, principal }); -}; - -export const withOptionalAuth = async (fn: (params: OptionalAuthContext) => Promise, options: AuthOptions = {}) => { - const authContext = await getAuthContext(options); - if (isServiceError(authContext)) { - return authContext; - } - - if ( - (!authContext.user || !authContext.role) && - !(await isAnonymousAccessEnabled()) - ) { - return notAuthenticated(); - } - - return fn(authContext); -}; - -export const getAuthContext = async (options: AuthOptions = {}): Promise => { - const { - requiredOAuthScopes, - requiredAuthSource, - recordActivity = true, - } = options; - const authResult = await getAuthenticatedUser(); - const user = authResult?.user; - - setSentryUser( - user ?? null, - env.SOURCEBOT_TELEMETRY_PII_COLLECTION_ENABLED === 'true', - ); - - const org = await __unsafePrisma.org.findUnique({ - where: { - id: SINGLE_TENANT_ORG_ID, - } - }); - - if (!org) { - return notFound("Organization not found"); - } - - if ( - authResult?.principal.source === 'scoped_access_token' && - authResult.principal.orgId !== org.id - ) { - return notAuthenticated(); - } - - const membership = user ? await __unsafePrisma.userToOrg.findUnique({ - where: { - orgId_userId: { - orgId: org.id, - userId: user.id, - }, - }, - }) : null; - - // A suspended membership is treated as if the user is not a member: they get - // no role and are denied by `withAuth`. This is also the only gate for - // API-key auth, which bypasses the JWT `sessionVersion` logout check. - const role = (membership && membership.suspendedAt == null) ? membership.role : undefined; - - if ( - env.DISABLE_API_KEY_USAGE_FOR_NON_OWNER_USERS === 'true' && - authResult?.principal.source === 'api_key' && - role !== OrgRole.OWNER - ) { - return { - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.API_KEY_USAGE_DISABLED, - message: "API key usage is disabled for non-admin users.", - } satisfies ServiceError; - } - - if ( - authResult && - requiredAuthSource && - authResult.principal.source !== requiredAuthSource - ) { - return { - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS, - message: "This operation cannot be performed with the current authentication method.", - } satisfies ServiceError; - } - - if ( - authResult?.principal.source === 'oauth' && - requiredOAuthScopes?.length && - !hasRequiredOAuthScopes(authResult.principal.oauthScopes, requiredOAuthScopes) - ) { - return insufficientOAuthScope(requiredOAuthScopes); - } - - const repositoryIds = authResult?.principal.source === 'scoped_access_token' - ? authResult.principal.repositoryIds - : undefined; - const prisma = __unsafePrisma.$extends( - await userScopedPrismaClientExtension(user, repositoryIds), - ) as PrismaClient; - - if (recordActivity) { - if (user) { - updateUserLastActiveAt(user); - } - - // If the user is currently in a "pending" - // state, then we need to activate them. - if ( - membership && - membership.suspendedAt === null && - membership.lastActiveAt === null - ) { - const result = await activatePendingMembership(membership); - if (isServiceError(result)) { - return result; - } - } - - if (membership) { - updateMembershipLastActiveAt(membership); - } - } - - if (user && role && authResult) { - return { user, org, role, prisma, principal: authResult.principal }; - } - return { user, org, prisma, principal: authResult?.principal }; -}; - -const updateUserLastActiveAt = (user: UserWithAccounts) => { - const now = Date.now(); - if ( - user.lastActiveAt && - (now - user.lastActiveAt.getTime()) < LAST_ACTIVE_AT_THRESHOLD_MS - ) { - return; - } - - // Fired without a await to avoid blocking. - void __unsafePrisma.user - .update({ - where: { id: user.id }, - data: { lastActiveAt: new Date(now) }, - }) - .catch(() => { /* updaing the lastActiveAt is best effort. */ }); -}; - -const updateMembershipLastActiveAt = (membership: UserToOrg) => { - if (membership.suspendedAt != null) { - return; - } - - const now = Date.now(); - if ( - membership.lastActiveAt && - (now - membership.lastActiveAt.getTime()) < LAST_ACTIVE_AT_THRESHOLD_MS - ) { - return; - } - - // Fired without a await to avoid blocking; this is only a freshness refresh - // for already-active memberships, not seat admission. - void __unsafePrisma.userToOrg - .updateMany({ - where: { - orgId: membership.orgId, - userId: membership.userId, - }, - data: { lastActiveAt: new Date(now) }, - }) - .catch(() => { /* updating the lastActiveAt is best effort. */ }); -}; - -export const getAuthenticatedUser = async (): Promise => { - // First, check if we have a valid JWT session. - const session = await auth(); - if (session) { - const userId = session.user.id; - const user = await __unsafePrisma.user.findUnique({ - where: { - id: userId, - }, - include: { - accounts: true, - } - }); - - return user ? { user, principal: { source: 'session' } } : undefined; - } - - const currentRequest = getCurrentRequest(); - const requestHeaders = currentRequest?.headers ?? await headers(); - - // If not, check for a Bearer token in the Authorization header. - const authorizationHeader = requestHeaders.get("Authorization") ?? undefined; - const authorization = parseAuthorizationHeader(authorizationHeader); - if (authorization && (authorization.scheme === 'Bearer' || authorization.scheme === DPOP_AUTH_SCHEME)) { - const bearerToken = authorization.token; - - // OAuth access token - if (bearerToken.startsWith(OAUTH_ACCESS_TOKEN_PREFIX)) { - if (!await hasEntitlement('oauth')) { - return undefined; - } - - const secret = bearerToken.slice(OAUTH_ACCESS_TOKEN_PREFIX.length); - const hash = hashSecret(secret); - const oauthToken = await __unsafePrisma.oAuthToken.findUnique({ - where: { hash }, - include: { user: { include: { accounts: true } } }, - }); - if (oauthToken && oauthToken.expiresAt > new Date()) { - if (!oauthToken.dpopJkt && authorization.scheme === DPOP_AUTH_SCHEME) { - return undefined; - } - - if (oauthToken.dpopJkt) { - if (authorization.scheme !== DPOP_AUTH_SCHEME || !currentRequest) { - return undefined; - } - - const proofResult = await verifyDpopProof({ - request: currentRequest, - proof: requestHeaders.get(DPOP_PROOF_HEADER), - expectedJkt: oauthToken.dpopJkt, - accessToken: bearerToken, - requireAccessTokenHash: true, - }); - - if (!proofResult.ok) { - return undefined; - } - } - - await __unsafePrisma.oAuthToken.update({ - where: { hash }, - data: { lastUsedAt: new Date() }, - }); - return { - user: oauthToken.user, - principal: { - source: 'oauth', - oauthScopes: parseOAuthScopeString(oauthToken.scope), - }, - }; - } - } - - if (authorization.scheme !== 'Bearer') { - return undefined; - } - - if (bearerToken.startsWith(SCOPED_ACCESS_TOKEN_PREFIX)) { - if (!await hasEntitlement('scoped-access-tokens')) { - return undefined; - } - - const secret = bearerToken.slice(SCOPED_ACCESS_TOKEN_PREFIX.length); - if (!secret) { - return undefined; - } - - const hash = hashSecret(secret); - const scopedAccessToken = await __unsafePrisma.scopedAccessToken.findUnique({ - where: { hash }, - include: { - createdBy: { - include: { accounts: true }, - }, - repos: { - select: { repoId: true }, - }, - }, - }); - - if (!scopedAccessToken || scopedAccessToken.expiresAt <= new Date()) { - return undefined; - } - - await __unsafePrisma.scopedAccessToken.update({ - where: { hash }, - data: { lastUsedAt: new Date() }, - }); - - return { - user: scopedAccessToken.createdBy, - principal: { - source: 'scoped_access_token', - credentialId: scopedAccessToken.id, - orgId: scopedAccessToken.orgId, - repositoryIds: scopedAccessToken.repos.map(({ repoId }) => repoId), - expiresAt: scopedAccessToken.expiresAt, - }, - }; - } - - // API key Bearer token (sourcebot-) - const apiKey = await getVerifiedApiObject(bearerToken); - if (apiKey) { - const user = await __unsafePrisma.user.findUnique({ - where: { id: apiKey.createdById }, - include: { accounts: true }, - }); - if (user) { - await __unsafePrisma.apiKey.update({ - where: { hash: apiKey.hash }, - data: { lastUsedAt: new Date() }, - }); - return { user, principal: { source: 'api_key' } }; - } - } - } - - // If not, check if we have a valid API key. - const apiKeyString = requestHeaders.get("X-Sourcebot-Api-Key") ?? undefined; - if (apiKeyString) { - const apiKey = await getVerifiedApiObject(apiKeyString); - if (!apiKey) { - return undefined; - } - - // Attempt to find the user associated with this api key. - const user = await __unsafePrisma.user.findUnique({ - where: { - id: apiKey.createdById, - }, - include: { - accounts: true, - } - }); - - if (!user) { - return undefined; - } - - // Update the last used at timestamp for this api key. - await __unsafePrisma.apiKey.update({ - where: { - hash: apiKey.hash, - }, - data: { - lastUsedAt: new Date(), - }, - }); - - return { user, principal: { source: 'api_key' } }; - } - - return undefined; -} - -function parseAuthorizationHeader(authorizationHeader: string | undefined): { scheme: string; token: string } | undefined { - const match = authorizationHeader?.match(/^(\S+)\s+(.+)$/); - if (!match) { - return undefined; - } - - const scheme = match[1].toLowerCase(); - if (scheme === 'bearer') { - return { scheme: 'Bearer', token: match[2] }; - } - - if (scheme === 'dpop') { - return { scheme: DPOP_AUTH_SCHEME, token: match[2] }; - } - - return { scheme: match[1], token: match[2] }; -} - -/** - * Returns an API key object if the API key string is valid, otherwise returns undefined. - * Supports both the current prefix (sbk_) and the legacy prefix (sourcebot-). - */ -export const getVerifiedApiObject = async (apiKeyString: string): Promise => { - let secret: string; - - if (apiKeyString.startsWith(API_KEY_PREFIX)) { - secret = apiKeyString.slice(API_KEY_PREFIX.length); - if (!secret) { - return undefined; - } - } else if (apiKeyString.startsWith(LEGACY_API_KEY_PREFIX)) { - secret = apiKeyString.slice(LEGACY_API_KEY_PREFIX.length); - if (!secret) { - return undefined; - } - } else { - return undefined; - } - - const hash = hashSecret(secret); - const apiKey = await __unsafePrisma.apiKey.findUnique({ - where: { - hash, - }, - }); - - if (!apiKey) { - return undefined; - } - - return apiKey; -} diff --git a/packages/web/src/middleware/withMinimumOrgRole.ts b/packages/web/src/middleware/withMinimumOrgRole.ts deleted file mode 100644 index 26f180066..000000000 --- a/packages/web/src/middleware/withMinimumOrgRole.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ErrorCode } from "@/lib/errorCodes"; -import { ServiceError } from "@/lib/serviceError"; -import { OrgRole } from "@sourcebot/db"; -import { StatusCodes } from "http-status-codes"; - -export const withMinimumOrgRole = async ( - userRole: OrgRole, - minRequiredRole: OrgRole = OrgRole.MEMBER, - fn: () => Promise -): Promise => { - - const getAuthorizationPrecedence = (role: OrgRole): number => { - switch (role) { - case OrgRole.MEMBER: - return 1; - case OrgRole.OWNER: - return 2; - } - }; - - if (getAuthorizationPrecedence(userRole) < getAuthorizationPrecedence(minRequiredRole)) { - return { - statusCode: StatusCodes.FORBIDDEN, - errorCode: ErrorCode.INSUFFICIENT_PERMISSIONS, - message: "You do not have sufficient permissions to perform this action.", - } satisfies ServiceError; - } - - return fn(); -}; diff --git a/packages/web/src/openapi/publicApiDocument.ts b/packages/web/src/openapi/publicApiDocument.ts deleted file mode 100644 index 8c07ee274..000000000 --- a/packages/web/src/openapi/publicApiDocument.ts +++ /dev/null @@ -1,661 +0,0 @@ -import { OpenApiGeneratorV3, OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; -import type { ComponentsObject, SchemaObject, SecuritySchemeObject } from 'openapi3-ts/oas30'; -import { type ZodTypeAny } from 'zod'; -import z from 'zod'; -import { - publicEeAuditQuerySchema, - publicEeAuditResponseSchema, - publicCreateScopedAccessTokenRequestSchema, - publicCreateScopedAccessTokenResponseSchema, - publicEeDeleteUserResponseSchema, - publicEeUserSchema, - publicEeUsersResponseSchema, - publicFileBlameRequestSchema, - publicFileBlameResponseSchema, - publicFileSourceRequestSchema, - publicFileSourceResponseSchema, - publicFindSymbolsRequestSchema, - publicFindSymbolsResponseSchema, - publicGetDiffRequestSchema, - publicGetDiffResponseSchema, - publicGetTreeRequestSchema, - publicHealthResponseSchema, - publicCommitDetailSchema, - publicGetCommitQuerySchema, - publicListCommitAuthorsQuerySchema, - publicListCommitAuthorsResponseSchema, - publicListCommitsQuerySchema, - publicListCommitsResponseSchema, - publicListConnectionsResponseSchema, - publicListReposQueryParamsSchema, - publicListReposResponseSchema, - publicSearchRequestSchema, - publicSearchResponseSchema, - publicServiceErrorSchema, - publicVersionResponseSchema, -} from './publicApiSchemas.js'; -import dedent from 'dedent'; - -const searchTag = { name: 'Search & Navigation', description: 'Code search and symbol navigation endpoints.' }; -const connectionsTag = { name: 'Connections', description: 'Code host connection metadata.' }; -const reposTag = { name: 'Repositories', description: 'Repository listing and metadata endpoints.' }; -const gitTag = { name: 'Git', description: 'Git history, diff, and file content endpoints.' }; -const systemTag = { name: 'System', description: 'System health and version endpoints.' }; -const eeTag = { name: 'Enterprise (EE)', description: 'Enterprise endpoints for user management and audit logging.' }; -const scopedAccessTokensTag = { name: 'Scoped Access Tokens', description: 'Mint and revoke short-lived credentials restricted to specific repositories.' }; - -const EE_LICENSE_KEY_NOTE = dedent` - -This API is only available with an active Sourcebot license. [More information](/docs/activating-a-subscription). - -`; - -const SCOPED_ACCESS_TOKEN_ENTITLEMENT_INFO = dedent` - -The scoped access token APIs require a custom entitlement. To request access, contact [team@sourcebot.dev](mailto:team@sourcebot.dev). - -`; - -const publicFileTreeNodeSchema: SchemaObject = { - type: 'object', - properties: { - type: { type: 'string' }, - path: { type: 'string' }, - name: { type: 'string' }, - children: { - type: 'array', - items: { $ref: '#/components/schemas/PublicFileTreeNode' }, - }, - }, - required: ['type', 'path', 'name', 'children'], - additionalProperties: false, -}; - -const publicGetTreeResponseSchema: SchemaObject = { - type: 'object', - properties: { - tree: { $ref: '#/components/schemas/PublicFileTreeNode' }, - }, - required: ['tree'], - additionalProperties: false, -}; - -const securitySchemeNames = { - bearerToken: 'bearerToken', - apiKeyHeader: 'apiKeyHeader', -} as const; - -const securitySchemes: Record = { - [securitySchemeNames.bearerToken]: { - type: 'http', - scheme: 'bearer', - description: 'Bearer authentication header of the form `Bearer `. The token may be a Sourcebot API key, OAuth access token, or scoped access token, subject to endpoint requirements.', - }, - [securitySchemeNames.apiKeyHeader]: { - type: 'apiKey', - in: 'header', - name: 'X-Sourcebot-Api-Key', - description: 'Header of the form `X-Sourcebot-Api-Key: `, where `` is your API key.', - }, -}; - -function jsonContent(schema: ZodTypeAny | SchemaObject) { - return { - 'application/json': { - schema, - }, - }; -} - -function errorJson(description: string) { - return { - description, - content: jsonContent(publicServiceErrorSchema), - }; -} - -export function createPublicOpenApiDocument(version: string) { - const registry = new OpenAPIRegistry(); - - registry.registerPath({ - method: 'post', - path: '/api/search', - operationId: 'search', - tags: [searchTag.name], - summary: 'Search code', - description: 'Executes a blocking code search and returns all matching file chunks.', - request: { - body: { - required: true, - content: jsonContent(publicSearchRequestSchema), - }, - }, - responses: { - 200: { - description: 'Search results.', - content: jsonContent(publicSearchResponseSchema), - }, - 400: errorJson('Invalid request body.'), - 500: errorJson('Unexpected search failure.'), - }, - 'x-mint': { - content: dedent` - ## Usage - - The \`query\` field supports literal, regexp, and symbol searches with filters for repository, file, language, branch, and more. See the [search syntax reference](https://docs.sourcebot.dev/docs/features/search/syntax-reference) for the full query language. - `, - }, - }); - - registry.registerPath({ - method: 'get', - path: '/api/repos', - operationId: 'listRepositories', - tags: [reposTag.name], - summary: 'List repositories', - description: 'Returns a paginated list of repositories indexed by this Sourcebot instance.', - request: { - query: publicListReposQueryParamsSchema, - }, - responses: { - 200: { - description: 'Paginated repository list.', - headers: { - 'X-Total-Count': { - description: 'Total number of repositories matching the query across all pages.', - schema: { - type: 'integer', - example: 137, - }, - }, - Link: { - description: 'Pagination links formatted per RFC 8288. Includes `rel=\"next\"`, `rel=\"prev\"`, `rel=\"first\"`, and `rel=\"last\"` when applicable.', - schema: { - type: 'string', - example: '; rel="next", ; rel="last"', - }, - }, - }, - content: jsonContent(publicListReposResponseSchema), - }, - 400: errorJson('Invalid query parameters.'), - 500: errorJson('Unexpected repository listing failure.'), - }, - }); - - registry.registerPath({ - method: 'get', - path: '/api/connections', - operationId: 'listConnections', - tags: [connectionsTag.name], - summary: 'List connections', - description: 'Returns unique code host connections associated with at least one repository visible to the caller. Connection configuration and credentials are never included.', - responses: { - 200: { - description: 'Connections associated with visible repositories.', - content: jsonContent(publicListConnectionsResponseSchema), - }, - 401: errorJson('Authentication is required when anonymous access is disabled.'), - 500: errorJson('Unexpected connection listing failure.'), - }, - }); - - registry.registerPath({ - method: 'get', - path: '/api/version', - operationId: 'getVersion', - tags: [systemTag.name], - summary: 'Get Sourcebot version', - description: 'Returns the currently running Sourcebot version string.', - responses: { - 200: { - description: 'Current Sourcebot version.', - content: jsonContent(publicVersionResponseSchema), - }, - }, - }); - - registry.registerPath({ - method: 'get', - path: '/api/health', - operationId: 'getHealth', - tags: [systemTag.name], - summary: 'Health check', - responses: { - 200: { - description: 'Service is healthy.', - content: jsonContent(publicHealthResponseSchema), - }, - }, - }); - - registry.registerPath({ - method: 'get', - path: '/api/source', - operationId: 'getFileSource', - tags: [gitTag.name], - summary: 'Get file contents', - description: 'Returns the raw source content of a file at a given repository path and optional git ref.', - request: { - query: publicFileSourceRequestSchema, - }, - responses: { - 200: { - description: 'File source and metadata.', - content: jsonContent(publicFileSourceResponseSchema), - }, - 400: errorJson('Invalid query parameters or git ref.'), - 404: errorJson('Repository or file not found.'), - 500: errorJson('Unexpected file retrieval failure.'), - }, - }); - - registry.registerPath({ - method: 'get', - path: '/api/blame', - operationId: 'getFileBlame', - tags: [gitTag.name], - summary: 'Get file blame', - description: dedent` - Returns blame information for a file at a given repository path and optional git ref. - - The response is split into two parts: - - \`ranges\`: contiguous, non-overlapping line ranges, each attributed to a single commit. Ordered by \`startLine\`. - - \`commits\`: commit metadata (hash, date, message, author, optional \`previous\` pointer for walking back through history) keyed by hash, deduplicated across ranges. - - Whole-file renames are followed automatically. Cross-file line moves and copies are not. - `, - request: { - query: publicFileBlameRequestSchema, - }, - responses: { - 200: { - description: 'Blame ranges and deduplicated commit metadata.', - content: jsonContent(publicFileBlameResponseSchema), - }, - 400: errorJson('Invalid query parameters or git ref.'), - 404: errorJson('Repository or file not found.'), - 500: errorJson('Unexpected blame retrieval failure.'), - }, - }); - - registry.registerPath({ - method: 'post', - path: '/api/tree', - operationId: 'getFileTree', - tags: [gitTag.name], - summary: 'Get a file tree', - description: 'Returns the file tree for a repository at a given revision.', - request: { - body: { - required: true, - content: jsonContent(publicGetTreeRequestSchema), - }, - }, - responses: { - 200: { - description: 'File tree for the requested repository revision.', - content: jsonContent(publicGetTreeResponseSchema), - }, - 400: errorJson('Invalid request body or git ref.'), - 404: errorJson('Repository or path not found.'), - 500: errorJson('Unexpected tree retrieval failure.'), - }, - }); - - - registry.registerPath({ - method: 'get', - path: '/api/diff', - operationId: 'getDiff', - tags: [gitTag.name], - summary: 'Get diff between two commits', - description: 'Returns a structured diff between two git refs using a two-dot comparison. See [git-diff](https://git-scm.com/docs/git-diff) for details.', - request: { - query: publicGetDiffRequestSchema, - }, - responses: { - 200: { - description: 'Structured diff between the two refs.', - content: jsonContent(publicGetDiffResponseSchema), - }, - 400: errorJson('Invalid query parameters or git ref.'), - 404: errorJson('Repository not found.'), - 500: errorJson('Unexpected diff failure.'), - }, - }); - - registry.registerPath({ - method: 'post', - path: '/api/find_definitions', - operationId: 'findDefinitions', - tags: [searchTag.name], - summary: 'Find symbol definitions', - description: 'Returns all locations in the codebase where the given symbol is defined.', - request: { - body: { - required: true, - content: jsonContent(publicFindSymbolsRequestSchema), - }, - }, - responses: { - 200: { - description: 'Symbol definition locations.', - content: jsonContent(publicFindSymbolsResponseSchema), - }, - 400: errorJson('Invalid request body.'), - 500: errorJson('Unexpected failure.'), - }, - }); - - registry.registerPath({ - method: 'post', - path: '/api/find_references', - operationId: 'findReferences', - tags: [searchTag.name], - summary: 'Find symbol references', - description: 'Returns all locations in the codebase where the given symbol is referenced.', - request: { - body: { - required: true, - content: jsonContent(publicFindSymbolsRequestSchema), - }, - }, - responses: { - 200: { - description: 'Symbol reference locations.', - content: jsonContent(publicFindSymbolsResponseSchema), - }, - 400: errorJson('Invalid request body.'), - 500: errorJson('Unexpected failure.'), - }, - }); - - registry.registerPath({ - method: 'get', - path: '/api/commits', - operationId: 'listCommits', - tags: [gitTag.name], - summary: 'List commits', - description: 'Returns a paginated list of commits for a repository.', - request: { - query: publicListCommitsQuerySchema, - }, - responses: { - 200: { - description: 'Paginated commit list.', - headers: { - 'X-Total-Count': { - description: 'Total number of commits matching the query across all pages.', - schema: { type: 'integer' }, - }, - Link: { - description: 'Pagination links formatted per RFC 8288.', - schema: { type: 'string' }, - }, - }, - content: jsonContent(publicListCommitsResponseSchema), - }, - 400: errorJson('Invalid query parameters.'), - 404: errorJson('Repository not found.'), - 500: errorJson('Unexpected failure.'), - }, - }); - - registry.registerPath({ - method: 'get', - path: '/api/commit', - operationId: 'getCommit', - tags: [gitTag.name], - summary: 'Get commit details', - description: 'Returns details for a single commit, including parent commit SHAs.', - request: { - query: publicGetCommitQuerySchema, - }, - responses: { - 200: { - description: 'Commit details.', - content: jsonContent(publicCommitDetailSchema), - }, - 400: errorJson('Invalid query parameters or git ref.'), - 404: errorJson('Repository or revision not found.'), - 500: errorJson('Unexpected failure.'), - }, - }); - - registry.registerPath({ - method: 'get', - path: '/api/commits/authors', - operationId: 'listCommitAuthors', - tags: [gitTag.name], - summary: 'List commit authors', - description: 'Returns a paginated list of unique authors who committed in a repository, sorted by commit count descending. Optionally scoped to a file path.', - request: { - query: publicListCommitAuthorsQuerySchema, - }, - responses: { - 200: { - description: 'Paginated commit author list.', - headers: { - 'X-Total-Count': { - description: 'Total number of unique authors matching the query across all pages.', - schema: { type: 'integer' }, - }, - Link: { - description: 'Pagination links formatted per RFC 8288.', - schema: { type: 'string' }, - }, - }, - content: jsonContent(publicListCommitAuthorsResponseSchema), - }, - 400: errorJson('Invalid query parameters or git ref.'), - 404: errorJson('Repository not found.'), - 500: errorJson('Unexpected failure.'), - }, - }); - - // EE: Scoped Access Tokens - registry.registerPath({ - method: 'post', - path: '/api/ee/scoped_access_token', - operationId: 'createScopedAccessToken', - tags: [scopedAccessTokensTag.name], - summary: 'Create a scoped access token', - description: dedent` - Creates an opaque bearer token that expires exactly one hour after issuance and is restricted to the requested repositories. - `, - security: [ - { [securitySchemeNames.bearerToken]: [] }, - { [securitySchemeNames.apiKeyHeader]: [] }, - ], - request: { - body: { - required: true, - content: jsonContent(publicCreateScopedAccessTokenRequestSchema), - }, - }, - responses: { - 201: { - description: 'Scoped access token created. The opaque token value is returned only in this response.', - content: jsonContent(publicCreateScopedAccessTokenResponseSchema), - }, - 400: errorJson('Invalid request body or repository scope.'), - 401: errorJson('Missing or invalid authentication.'), - 403: errorJson('The current authentication method is not an API key, or the API-key owner is not permitted to perform this operation.'), - 500: errorJson('Unexpected token creation failure.'), - }, - 'x-mint': { - content: SCOPED_ACCESS_TOKEN_ENTITLEMENT_INFO, - }, - }); - - registry.registerPath({ - method: 'delete', - path: '/api/ee/scoped_access_token/{id}', - operationId: 'revokeScopedAccessToken', - tags: [scopedAccessTokensTag.name], - summary: 'Revoke a scoped access token', - description: 'Immediately revokes a scoped access token created by the authenticated API-key owner.', - security: [ - { [securitySchemeNames.bearerToken]: [] }, - { [securitySchemeNames.apiKeyHeader]: [] }, - ], - request: { - params: z.object({ - id: z.string().describe('Identifier returned when the scoped access token was created.'), - }), - }, - responses: { - 204: { - description: 'Scoped access token revoked.', - }, - 401: errorJson('Missing or invalid authentication.'), - 403: errorJson('The current authentication method is not an API key, or the API-key owner is not permitted to perform this operation.'), - 404: errorJson('Scoped access token not found.'), - 500: errorJson('Unexpected token revocation failure.'), - }, - 'x-mint': { - content: SCOPED_ACCESS_TOKEN_ENTITLEMENT_INFO, - }, - }); - - // EE: User Management - registry.registerPath({ - method: 'get', - path: '/api/ee/user', - operationId: 'getUser', - tags: [eeTag.name], - summary: 'Get a user', - description: 'Fetches details for a single organization member by `userId`. Only organization owners can access this endpoint.', - request: { - query: z.object({ - userId: z.string().describe('The ID of the user to retrieve.'), - }), - }, - responses: { - 200: { - description: 'User details.', - content: jsonContent(publicEeUserSchema), - }, - 400: errorJson('Missing userId parameter.'), - 403: errorJson('Insufficient permissions or entitlement not enabled.'), - 404: errorJson('User is not a member of this organization.'), - 500: errorJson('Unexpected failure.'), - }, - 'x-mint': { - content: EE_LICENSE_KEY_NOTE, - }, - }); - - registry.registerPath({ - method: 'delete', - path: '/api/ee/user', - operationId: 'deleteUser', - tags: [eeTag.name], - summary: 'Remove a user from the organization', - description: 'Removes a user from the organization, revoking their access and their sessions. Only organization owners can access this endpoint.', - request: { - query: z.object({ - userId: z.string().describe('The ID of the user to remove.'), - }), - }, - responses: { - 200: { - description: 'User removed successfully.', - content: jsonContent(publicEeDeleteUserResponseSchema), - }, - 400: errorJson('Missing userId parameter.'), - 403: errorJson('Insufficient permissions, the last active owner cannot be removed, or SCIM provisioning is enabled (membership is managed through your identity provider).'), - 404: errorJson('User is not a member of this organization.'), - 500: errorJson('Unexpected failure.'), - }, - 'x-mint': { - content: EE_LICENSE_KEY_NOTE, - }, - }); - - registry.registerPath({ - method: 'get', - path: '/api/ee/users', - operationId: 'listUsers', - tags: [eeTag.name], - summary: 'List users', - description: 'Returns all members of the organization. Only organization owners can access this endpoint.', - responses: { - 200: { - description: 'List of organization members.', - content: jsonContent(publicEeUsersResponseSchema), - }, - 403: errorJson('Insufficient permissions or entitlement not enabled.'), - 500: errorJson('Unexpected failure.'), - }, - 'x-mint': { - content: EE_LICENSE_KEY_NOTE, - }, - }); - - // EE: Audit - registry.registerPath({ - method: 'get', - path: '/api/ee/audit', - operationId: 'listAuditRecords', - tags: [eeTag.name], - summary: 'List audit records', - description: 'Returns a paginated list of audit log entries. Only organization owners can access this endpoint.', - request: { - query: publicEeAuditQuerySchema, - }, - responses: { - 200: { - description: 'Paginated audit log.', - headers: { - 'X-Total-Count': { - description: 'Total number of audit records matching the query across all pages.', - schema: { type: 'integer' }, - }, - Link: { - description: 'Pagination links formatted per RFC 8288.', - schema: { type: 'string' }, - }, - }, - content: jsonContent(publicEeAuditResponseSchema), - }, - 400: errorJson('Invalid query parameters.'), - 403: errorJson('Insufficient permissions or entitlement not enabled.'), - 500: errorJson('Unexpected failure.'), - }, - 'x-mint': { - content: EE_LICENSE_KEY_NOTE, - }, - }); - - const generator = new OpenApiGeneratorV3(registry.definitions); - - const document = generator.generateDocument({ - openapi: '3.0.3', - info: { - title: 'Sourcebot Public API', - version, - description: 'OpenAPI description for the public Sourcebot REST endpoints used for search, repository listing, and file browsing. Authentication is instance-dependent: API keys are the standard integration mechanism, OAuth bearer tokens are EE-only, and some instances may allow anonymous access.', - }, - tags: [searchTag, connectionsTag, reposTag, gitTag, scopedAccessTokensTag, systemTag, eeTag], - security: [ - { [securitySchemeNames.bearerToken]: [] }, - { [securitySchemeNames.apiKeyHeader]: [] }, - {}, - ], - }); - - const components: ComponentsObject = document.components ?? {}; - components.schemas = { - ...(components.schemas ?? {}), - PublicFileTreeNode: publicFileTreeNodeSchema, - }; - components.securitySchemes = { - ...(components.securitySchemes ?? {}), - ...securitySchemes, - }; - document.components = components; - - return document; -} diff --git a/packages/web/src/openapi/publicApiSchemas.ts b/packages/web/src/openapi/publicApiSchemas.ts deleted file mode 100644 index 3a375d529..000000000 --- a/packages/web/src/openapi/publicApiSchemas.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; -import { ConnectionType } from '@sourcebot/db'; -import z from 'zod'; -import { - findRelatedSymbolsRequestSchema, - findRelatedSymbolsResponseSchema, -} from '../features/codeNav/types.js'; -import { - commitAuthorSchema, - commitDetailSchema, - commitSchema, - fileBlameRequestSchema, - fileBlameResponseSchema, - fileSourceRequestSchema, - fileSourceResponseSchema, - getCommitQueryParamsSchema, - getDiffRequestSchema, - getDiffResponseSchema, - getTreeRequestSchema, - listCommitAuthorsQueryParamsSchema, - listCommitsQueryParamsSchema, -} from '../features/git/schemas.js'; -import { - searchRequestSchema, - searchResponseSchema, -} from '../features/search/types.js'; -import { serviceErrorSchema } from '../lib/serviceError.js'; -import { getVersionResponseSchema, listReposQueryParamsSchema, listReposResponseSchema } from '../lib/schemas.js'; - -let hasExtendedZod = false; - -if (!hasExtendedZod) { - extendZodWithOpenApi(z); - hasExtendedZod = true; -} - -export const publicServiceErrorSchema = serviceErrorSchema.openapi('PublicApiServiceError', { - description: 'Structured error response returned by Sourcebot public API endpoints.', -}); - -export const publicSearchRequestSchema = searchRequestSchema.openapi('PublicSearchRequest'); -export const publicSearchResponseSchema = searchResponseSchema.openapi('PublicSearchResponse'); -export const publicGetTreeRequestSchema = getTreeRequestSchema.openapi('PublicGetTreeRequest'); -export const publicFileSourceRequestSchema = fileSourceRequestSchema.openapi('PublicFileSourceRequest'); -export const publicFileSourceResponseSchema = fileSourceResponseSchema.openapi('PublicFileSourceResponse'); -export const publicFileBlameRequestSchema = fileBlameRequestSchema.openapi('PublicFileBlameRequest'); -export const publicFileBlameResponseSchema = fileBlameResponseSchema.openapi('PublicFileBlameResponse'); -export const publicVersionResponseSchema = getVersionResponseSchema.openapi('PublicVersionResponse'); -export const publicListConnectionsResponseSchema = z.array(z.object({ - id: z.number().int(), - name: z.string(), - connectionType: z.nativeEnum(ConnectionType), -})).openapi('PublicListConnectionsResponse'); -export const publicListReposQueryParamsSchema = listReposQueryParamsSchema.openapi('PublicListReposQuery'); -export const publicListReposResponseSchema = listReposResponseSchema.openapi('PublicListReposResponse'); -export const publicGetDiffRequestSchema = getDiffRequestSchema.openapi('PublicGetDiffRequest'); -export const publicGetDiffResponseSchema = getDiffResponseSchema.openapi('PublicGetDiffResponse'); -export const publicFindSymbolsRequestSchema = findRelatedSymbolsRequestSchema.openapi('PublicFindSymbolsRequest'); -export const publicFindSymbolsResponseSchema = findRelatedSymbolsResponseSchema.openapi('PublicFindSymbolsResponse'); -export const publicListCommitsQuerySchema = listCommitsQueryParamsSchema.openapi('PublicListCommitsQuery'); -export const publicCommitSchema = commitSchema.openapi('PublicCommit'); -export const publicListCommitsResponseSchema = z.array(publicCommitSchema).openapi('PublicListCommitsResponse'); -export const publicGetCommitQuerySchema = getCommitQueryParamsSchema.openapi('PublicGetCommitQuery'); -export const publicCommitDetailSchema = commitDetailSchema.openapi('PublicCommitDetail'); -export const publicListCommitAuthorsQuerySchema = listCommitAuthorsQueryParamsSchema.openapi('PublicListCommitAuthorsQuery'); -export const publicCommitAuthorSchema = commitAuthorSchema.openapi('PublicCommitAuthor'); -export const publicListCommitAuthorsResponseSchema = z.array(publicCommitAuthorSchema).openapi('PublicListCommitAuthorsResponse'); - -export const publicHealthResponseSchema = z.object({ - status: z.enum(['ok']), -}).openapi('PublicHealthResponse'); - -// EE: User Management -export const publicEeUserSchema = z.object({ - id: z.string(), - name: z.string().nullable(), - email: z.string(), - role: z.enum(['OWNER', 'MEMBER']), - suspendedAt: z.string().datetime().nullable(), - createdAt: z.string().datetime(), - updatedAt: z.string().datetime(), - lastActivityAt: z.string().datetime().nullable(), -}).openapi('PublicEeUser'); - -export const publicEeUsersResponseSchema = z.array(publicEeUserSchema).openapi('PublicEeUsersResponse'); - -export const publicEeDeleteUserResponseSchema = z.object({ - success: z.boolean(), - message: z.string(), -}).openapi('PublicEeDeleteUserResponse'); - -// EE: Audit -export const publicEeAuditQuerySchema = z.object({ - since: z.string().datetime().optional().describe('Return records at or after this timestamp (ISO 8601).'), - until: z.string().datetime().optional().describe('Return records at or before this timestamp (ISO 8601).'), - page: z.coerce.number().int().positive().default(1), - perPage: z.coerce.number().int().positive().max(100).default(50), -}).openapi('PublicEeAuditQuery'); - -export const publicEeAuditRecordSchema = z.object({ - id: z.string(), - timestamp: z.string().datetime(), - action: z.string().describe('The audited action (e.g. `user.read`, `user.delete`, `audit.fetch`).'), - actorId: z.string(), - actorType: z.string(), - targetId: z.string(), - targetType: z.string(), - sourcebotVersion: z.string(), - metadata: z.record(z.unknown()).nullable(), - orgId: z.number(), -}).openapi('PublicEeAuditRecord'); - -export const publicEeAuditResponseSchema = z.array(publicEeAuditRecordSchema).openapi('PublicEeAuditResponse'); - -// EE: Scoped Access Tokens -export const publicCreateScopedAccessTokenRequestSchema = z.object({ - repoIds: z.array(z.number().int().positive()).min(1) - .describe('Repository IDs to bind to the token. Every ID must identify a repository accessible to the API-key owner.'), -}).strict().openapi('PublicCreateScopedAccessTokenRequest'); - -export const publicCreateScopedAccessTokenResponseSchema = z.object({ - id: z.string().describe('Identifier used to revoke the token.'), - token: z.string().regex(/^sbst_/) - .describe('Opaque bearer token. This value is returned only when the token is created.'), - createdAt: z.string().datetime(), - expiresAt: z.string().datetime(), - repoIds: z.array(z.number().int().positive()).min(1), -}).openapi('PublicCreateScopedAccessTokenResponse'); diff --git a/packages/web/src/prisma.test.ts b/packages/web/src/prisma.test.ts deleted file mode 100644 index b66307d59..000000000 --- a/packages/web/src/prisma.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import type { UserWithAccounts } from '@sourcebot/db'; -import { describe, expect, test, vi } from 'vitest'; - -vi.mock('server-only', () => ({ - default: vi.fn(), -})); - -vi.mock('@sourcebot/shared', () => ({ - env: { NODE_ENV: 'test' }, - getDBConnectionString: () => undefined, -})); - -vi.mock('@/features/mcp/prismaScope', () => ({ - getMcpPrismaQueryExtension: () => ({}), -})); - -const { - getEffectiveRepoPermissionFilter, - getRepoPermissionFilterForUser, - intersectRepoWhere, -} = await import('./prisma'); - -const user = { accounts: [] } as unknown as UserWithAccounts; - -describe('getEffectiveRepoPermissionFilter', () => { - test('does not filter repositories when neither permission syncing nor a token scope applies', () => { - expect(getEffectiveRepoPermissionFilter({ - user, - hasPermissionSyncing: false, - })).toBeUndefined(); - }); - - test('enforces a token repository scope when permission syncing is disabled', () => { - expect(getEffectiveRepoPermissionFilter({ - user, - hasPermissionSyncing: false, - repositoryIds: [11, 22], - })).toEqual({ - id: { in: [11, 22] }, - }); - }); - - test('intersects current user permissions with the token repository scope', () => { - expect(getEffectiveRepoPermissionFilter({ - user, - hasPermissionSyncing: true, - repositoryIds: [11, 22], - })).toEqual({ - AND: [ - getRepoPermissionFilterForUser(user), - { id: { in: [11, 22] } }, - ], - }); - }); - - test('preserves an empty token scope as a match-nothing filter', () => { - expect(getEffectiveRepoPermissionFilter({ - user, - hasPermissionSyncing: false, - repositoryIds: [], - })).toEqual({ - id: { in: [] }, - }); - }); -}); - -describe('intersectRepoWhere', () => { - test('combines the caller filter and permission filter while preserving top-level fields', () => { - expect(intersectRepoWhere( - { OR: [{ name: 'repo-a' }, { name: 'repo-b' }] }, - { id: { in: [11] } }, - )).toEqual({ - OR: [{ name: 'repo-a' }, { name: 'repo-b' }], - AND: [{ id: { in: [11] } }], - }); - }); - - test('preserves a unique identifier at the top level for findUnique operations', () => { - expect(intersectRepoWhere( - { id: 147 }, - { id: { in: [11, 147] } }, - )).toEqual({ - id: 147, - AND: [{ id: { in: [11, 147] } }], - }); - }); - - test('preserves existing AND filters', () => { - expect(intersectRepoWhere( - { - id: 147, - AND: [{ name: 'github.com/airbnb/MaxScale' }], - }, - { id: { in: [11, 147] } }, - )).toEqual({ - id: 147, - AND: [ - { name: 'github.com/airbnb/MaxScale' }, - { id: { in: [11, 147] } }, - ], - }); - }); -}); diff --git a/packages/web/src/prisma.ts b/packages/web/src/prisma.ts deleted file mode 100644 index 971322c6a..000000000 --- a/packages/web/src/prisma.ts +++ /dev/null @@ -1,242 +0,0 @@ -import 'server-only'; -import { env, getDBConnectionString } from "@sourcebot/shared"; -import { Prisma, PrismaClient, UserWithAccounts } from "@sourcebot/db"; -import { getMcpPrismaQueryExtension } from "@/features/mcp/prismaScope"; - -// @see: https://authjs.dev/getting-started/adapters/prisma -const globalForPrisma = globalThis as unknown as { prisma: PrismaClient } - -const dbConnectionString = getDBConnectionString(); - -// @NOTE: In almost all cases, the userScopedPrismaClientExtension should be used -// (since actions & queries are scoped to a particular user). There are some exceptions -// (e.g., in initialize.ts). -export const __unsafePrisma = globalForPrisma.prisma || new PrismaClient({ - // @note: this code is evaluated at build time, and will throw exceptions if these env vars are not set. - // Here we explicitly check if the DATABASE_URL or the individual database variables are set, and only - ...(dbConnectionString !== undefined ? { - datasources: { - db: { - url: dbConnectionString, - }, - } - } : {}), -}) -if (env.NODE_ENV !== "production") globalForPrisma.prisma = __unsafePrisma - -/** - * Creates a prisma client extension that scopes queries to striclty information - * a given user should be able to access. - */ -export const userScopedPrismaClientExtension = async ( - user?: UserWithAccounts, - repositoryIds?: readonly number[], -) => { - const hasPermissionSyncing = env.PERMISSION_SYNC_ENABLED === 'true'; - const repoPermissionFilter = getEffectiveRepoPermissionFilter({ - user, - hasPermissionSyncing, - repositoryIds, - }); - - return Prisma.defineExtension( - (prisma) => { - return prisma.$extends({ - query: { - ...getMcpPrismaQueryExtension(user), - ...(repoPermissionFilter ? { - repo: { - async $allOperations({ args, query }) { - const argsWithWhere = args as Record & { - where?: Prisma.RepoWhereInput; - } - - argsWithWhere.where = intersectRepoWhere( - argsWithWhere.where, - repoPermissionFilter, - ); - - return query(args); - } - }, - searchContext: { - async $allOperations({ args, query }) { - injectRepoPermissionFilterIntoRelation( - args as Record, - repoPermissionFilter, - ); - - return query(args); - } - } - } : {}) - } - }) - }) -} - -export const intersectRepoWhere = ( - where: Prisma.RepoWhereInput | undefined, - repoPermissionFilter: Prisma.RepoWhereInput, -): Prisma.RepoWhereInput => { - if (!where) { - return repoPermissionFilter; - } - - const { AND: existingAnd, ...topLevelWhere } = where; - const existingAndFilters = existingAnd === undefined - ? [] - : Array.isArray(existingAnd) - ? existingAnd - : [existingAnd]; - - return { - ...topLevelWhere, - AND: [...existingAndFilters, repoPermissionFilter], - }; -}; - -export const getEffectiveRepoPermissionFilter = ({ - user, - hasPermissionSyncing, - repositoryIds, -}: { - user?: UserWithAccounts; - hasPermissionSyncing: boolean; - repositoryIds?: readonly number[]; -}): Prisma.RepoWhereInput | undefined => { - const filters: Prisma.RepoWhereInput[] = []; - - if (hasPermissionSyncing) { - filters.push(getRepoPermissionFilterForUser(user)); - } - if (repositoryIds) { - filters.push({ - id: { - in: [...repositoryIds], - }, - }); - } - - if (filters.length === 0) { - return undefined; - } - if (filters.length === 1) { - return filters[0]; - } - return { AND: filters }; -}; - -/** - * Injects a `Repo` permission filter into a nested `repos` relation referenced - * by an operation's `include` or `select` clause. Mutates `args` in place, - * normalizing `repos: true` into `repos: { where: }` and ANDing the - * filter onto any existing `where`. - */ -const injectRepoPermissionFilterIntoRelation = ( - args: Record, - filter: Prisma.RepoWhereInput, -) => { - for (const key of ['include', 'select'] as const) { - const clause = args[key]; - if (!clause || typeof clause !== 'object') { - continue; - } - - const clauseRecord = clause as Record; - const repos = clauseRecord.repos; - - // `repos` is either absent or explicitly excluded - nothing to filter. - if (repos === undefined || repos === false) { - continue; - } - - // Normalize `repos: true` into an object so we can attach a `where`. - const reposArgs = (repos === true ? {} : { ...(repos as Record) }) as { - where?: Prisma.RepoWhereInput; - }; - - reposArgs.where = reposArgs.where - ? { AND: [reposArgs.where, filter] } - : filter; - - clauseRecord.repos = reposArgs; - } -}; - -/** - * Returns a filter for repositories that the user has access to. - */ -export const getRepoPermissionFilterForUser = (user?: UserWithAccounts): Prisma.RepoWhereInput => { - // Collect the issuer URLs from the user's linked accounts. - // Used to grant access to public repos on connections with enforcePermissionsForPublicRepos: true. - const linkedAccountIssuerUrls = (user?.accounts ?? []) - .map(account => account.issuerUrl) - .filter((url): url is string => url !== null && url !== undefined); - - // One of the following conditions must be met in order - // for the user to be able to have access to the repo: - return { - OR: [ - // 1. The repo is explicitly permitted to the user - // via the permittedAccounts relation. - ...((user && user.accounts.length > 0) ? [ - { - permittedAccounts: { - some: { - accountId: { - in: user.accounts.map(account => account.id), - } - } - } - }, - ] : []), - // 2. The `enforcePermissions` flag is *not* set to `true` on any - // of the repo's connections. - { - AND: [ - { connections: { some: {} } }, // guard against vacuous truthiness - { - NOT: { - connections: { - some: { - connection: { - enforcePermissions: true, - } - } - } - } - } - ] - }, - // 3. The repo is public and either: - // - a. The `enforcePermissionsForPublicRepos` flag is *not* set to `true` - // on any of the repo's connections. - // - b. The user has a account linked to the same code host as the repo. - { - AND: [ - { isPublic: true }, - { connections: { some: {} } }, // guard against vacuous truthiness - { - OR: [ - { - NOT: { - connections: { - some: { - connection: { enforcePermissionsForPublicRepos: true } - } - } - } - }, - ...(linkedAccountIssuerUrls.length > 0 ? [{ - external_codeHostUrl: { - in: linkedAccountIssuerUrls - } - }] : []), - ] - } - ] - }, - ] - } -} diff --git a/packages/web/src/promClient.test.ts b/packages/web/src/promClient.test.ts deleted file mode 100644 index eb571555a..000000000 --- a/packages/web/src/promClient.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { registry } from './promClient'; - -const metricNames = (output: string): Set => { - return new Set( - output - .split('\n') - .filter(line => line.length > 0 && !line.startsWith('#')) - .map(line => line.split(/[ {]/)[0]) - ); -}; - -describe('web promClient', () => { - it('exposes the metrics needed to diagnose heap pressure', async () => { - const names = metricNames(await registry.metrics()); - - expect(names).toContain('nodejs_heap_size_limit_bytes'); - expect(names).toContain('nodejs_heap_size_used_bytes'); - expect(names).toContain('nodejs_eventloop_lag_p99_seconds'); - }); - - it('registers the gc duration histogram', () => { - // Asserted via the registry rather than the rendered output: the histogram - // emits no series until a garbage collection has actually been observed. - expect(registry.getSingleMetric('nodejs_gc_duration_seconds')).toBeDefined(); - }); - - it('reports a plausible heap size limit', async () => { - const output = await registry.metrics(); - const line = output.split('\n').find(l => l.startsWith('nodejs_heap_size_limit_bytes ')); - - expect(line).toBeDefined(); - - const limit = Number(line!.split(' ')[1]); - expect(Number.isFinite(limit)).toBe(true); - // Any real V8 heap limit is well above 100MB and well below 100GB. - expect(limit).toBeGreaterThan(100 * 1024 * 1024); - expect(limit).toBeLessThan(100 * 1024 * 1024 * 1024); - }); - - it('can be collected repeatedly', async () => { - const first = await registry.metrics(); - const second = await registry.metrics(); - - expect(metricNames(first)).toEqual(metricNames(second)); - }); -}); diff --git a/packages/web/src/promClient.ts b/packages/web/src/promClient.ts deleted file mode 100644 index a651a2a22..000000000 --- a/packages/web/src/promClient.ts +++ /dev/null @@ -1,29 +0,0 @@ -import client, { Gauge, Histogram, Registry } from 'prom-client'; -import { getHeapStatistics } from 'node:v8'; - -export const registry = new Registry(); - -export const httpRequestDuration = new Histogram({ - name: 'http_request_duration_seconds', - help: 'Duration of HTTP requests handled by the web server, in seconds', - labelNames: ['method', 'route', 'status'], - buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 15, 20, 30, 60], -}); -registry.registerMetric(httpRequestDuration); - -// `collectDefaultMetrics` reports heap usage but not the ceiling it's measured -// against, and usage alone can't distinguish "busy" from "out of room". Without -// the limit there's no way to tell whether V8 is doing cheap incremental -// collections or is pinned at its ceiling running full mark-compacts. -const heapSizeLimit = new Gauge({ - name: 'nodejs_heap_size_limit_bytes', - help: 'V8 heap size limit in bytes', - collect() { - this.set(getHeapStatistics().heap_size_limit); - }, -}); -registry.registerMetric(heapSizeLimit); - -client.collectDefaultMetrics({ - register: registry, -}); diff --git a/packages/web/src/proto/google/protobuf/Duration.ts b/packages/web/src/proto/google/protobuf/Duration.ts deleted file mode 100644 index f24c347f3..000000000 --- a/packages/web/src/proto/google/protobuf/Duration.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Original file: null - -import type { Long } from '@grpc/proto-loader'; - -export interface Duration { - 'seconds'?: (number | string | Long); - 'nanos'?: (number); -} - -export interface Duration__Output { - 'seconds': (number); - 'nanos': (number); -} diff --git a/packages/web/src/proto/google/protobuf/Timestamp.ts b/packages/web/src/proto/google/protobuf/Timestamp.ts deleted file mode 100644 index 154167e2c..000000000 --- a/packages/web/src/proto/google/protobuf/Timestamp.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Original file: null - -import type { Long } from '@grpc/proto-loader'; - -export interface Timestamp { - 'seconds'?: (number | string | Long); - 'nanos'?: (number); -} - -export interface Timestamp__Output { - 'seconds': (number); - 'nanos': (number); -} diff --git a/packages/web/src/proto/query.ts b/packages/web/src/proto/query.ts deleted file mode 100644 index e9e6c4f5c..000000000 --- a/packages/web/src/proto/query.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type * as grpc from '@grpc/grpc-js'; -import type { MessageTypeDefinition } from '@grpc/proto-loader'; - -import type { And as _zoekt_webserver_v1_And, And__Output as _zoekt_webserver_v1_And__Output } from './zoekt/webserver/v1/And'; -import type { Boost as _zoekt_webserver_v1_Boost, Boost__Output as _zoekt_webserver_v1_Boost__Output } from './zoekt/webserver/v1/Boost'; -import type { Branch as _zoekt_webserver_v1_Branch, Branch__Output as _zoekt_webserver_v1_Branch__Output } from './zoekt/webserver/v1/Branch'; -import type { BranchRepos as _zoekt_webserver_v1_BranchRepos, BranchRepos__Output as _zoekt_webserver_v1_BranchRepos__Output } from './zoekt/webserver/v1/BranchRepos'; -import type { BranchesRepos as _zoekt_webserver_v1_BranchesRepos, BranchesRepos__Output as _zoekt_webserver_v1_BranchesRepos__Output } from './zoekt/webserver/v1/BranchesRepos'; -import type { FileNameSet as _zoekt_webserver_v1_FileNameSet, FileNameSet__Output as _zoekt_webserver_v1_FileNameSet__Output } from './zoekt/webserver/v1/FileNameSet'; -import type { Language as _zoekt_webserver_v1_Language, Language__Output as _zoekt_webserver_v1_Language__Output } from './zoekt/webserver/v1/Language'; -import type { Meta as _zoekt_webserver_v1_Meta, Meta__Output as _zoekt_webserver_v1_Meta__Output } from './zoekt/webserver/v1/Meta'; -import type { Not as _zoekt_webserver_v1_Not, Not__Output as _zoekt_webserver_v1_Not__Output } from './zoekt/webserver/v1/Not'; -import type { Or as _zoekt_webserver_v1_Or, Or__Output as _zoekt_webserver_v1_Or__Output } from './zoekt/webserver/v1/Or'; -import type { Q as _zoekt_webserver_v1_Q, Q__Output as _zoekt_webserver_v1_Q__Output } from './zoekt/webserver/v1/Q'; -import type { RawConfig as _zoekt_webserver_v1_RawConfig, RawConfig__Output as _zoekt_webserver_v1_RawConfig__Output } from './zoekt/webserver/v1/RawConfig'; -import type { Regexp as _zoekt_webserver_v1_Regexp, Regexp__Output as _zoekt_webserver_v1_Regexp__Output } from './zoekt/webserver/v1/Regexp'; -import type { Repo as _zoekt_webserver_v1_Repo, Repo__Output as _zoekt_webserver_v1_Repo__Output } from './zoekt/webserver/v1/Repo'; -import type { RepoIds as _zoekt_webserver_v1_RepoIds, RepoIds__Output as _zoekt_webserver_v1_RepoIds__Output } from './zoekt/webserver/v1/RepoIds'; -import type { RepoRegexp as _zoekt_webserver_v1_RepoRegexp, RepoRegexp__Output as _zoekt_webserver_v1_RepoRegexp__Output } from './zoekt/webserver/v1/RepoRegexp'; -import type { RepoSet as _zoekt_webserver_v1_RepoSet, RepoSet__Output as _zoekt_webserver_v1_RepoSet__Output } from './zoekt/webserver/v1/RepoSet'; -import type { Substring as _zoekt_webserver_v1_Substring, Substring__Output as _zoekt_webserver_v1_Substring__Output } from './zoekt/webserver/v1/Substring'; -import type { Symbol as _zoekt_webserver_v1_Symbol, Symbol__Output as _zoekt_webserver_v1_Symbol__Output } from './zoekt/webserver/v1/Symbol'; -import type { Type as _zoekt_webserver_v1_Type, Type__Output as _zoekt_webserver_v1_Type__Output } from './zoekt/webserver/v1/Type'; - -type SubtypeConstructor any, Subtype> = { - new(...args: ConstructorParameters): Subtype; -}; - -export interface ProtoGrpcType { - zoekt: { - webserver: { - v1: { - And: MessageTypeDefinition<_zoekt_webserver_v1_And, _zoekt_webserver_v1_And__Output> - Boost: MessageTypeDefinition<_zoekt_webserver_v1_Boost, _zoekt_webserver_v1_Boost__Output> - Branch: MessageTypeDefinition<_zoekt_webserver_v1_Branch, _zoekt_webserver_v1_Branch__Output> - BranchRepos: MessageTypeDefinition<_zoekt_webserver_v1_BranchRepos, _zoekt_webserver_v1_BranchRepos__Output> - BranchesRepos: MessageTypeDefinition<_zoekt_webserver_v1_BranchesRepos, _zoekt_webserver_v1_BranchesRepos__Output> - FileNameSet: MessageTypeDefinition<_zoekt_webserver_v1_FileNameSet, _zoekt_webserver_v1_FileNameSet__Output> - Language: MessageTypeDefinition<_zoekt_webserver_v1_Language, _zoekt_webserver_v1_Language__Output> - Meta: MessageTypeDefinition<_zoekt_webserver_v1_Meta, _zoekt_webserver_v1_Meta__Output> - Not: MessageTypeDefinition<_zoekt_webserver_v1_Not, _zoekt_webserver_v1_Not__Output> - Or: MessageTypeDefinition<_zoekt_webserver_v1_Or, _zoekt_webserver_v1_Or__Output> - Q: MessageTypeDefinition<_zoekt_webserver_v1_Q, _zoekt_webserver_v1_Q__Output> - RawConfig: MessageTypeDefinition<_zoekt_webserver_v1_RawConfig, _zoekt_webserver_v1_RawConfig__Output> - Regexp: MessageTypeDefinition<_zoekt_webserver_v1_Regexp, _zoekt_webserver_v1_Regexp__Output> - Repo: MessageTypeDefinition<_zoekt_webserver_v1_Repo, _zoekt_webserver_v1_Repo__Output> - RepoIds: MessageTypeDefinition<_zoekt_webserver_v1_RepoIds, _zoekt_webserver_v1_RepoIds__Output> - RepoRegexp: MessageTypeDefinition<_zoekt_webserver_v1_RepoRegexp, _zoekt_webserver_v1_RepoRegexp__Output> - RepoSet: MessageTypeDefinition<_zoekt_webserver_v1_RepoSet, _zoekt_webserver_v1_RepoSet__Output> - Substring: MessageTypeDefinition<_zoekt_webserver_v1_Substring, _zoekt_webserver_v1_Substring__Output> - Symbol: MessageTypeDefinition<_zoekt_webserver_v1_Symbol, _zoekt_webserver_v1_Symbol__Output> - Type: MessageTypeDefinition<_zoekt_webserver_v1_Type, _zoekt_webserver_v1_Type__Output> - } - } - } -} - diff --git a/packages/web/src/proto/webserver.ts b/packages/web/src/proto/webserver.ts deleted file mode 100644 index a85e9c8e9..000000000 --- a/packages/web/src/proto/webserver.ts +++ /dev/null @@ -1,114 +0,0 @@ -import type * as grpc from '@grpc/grpc-js'; -import type { EnumTypeDefinition, MessageTypeDefinition } from '@grpc/proto-loader'; - -import type { Duration as _google_protobuf_Duration, Duration__Output as _google_protobuf_Duration__Output } from './google/protobuf/Duration'; -import type { Timestamp as _google_protobuf_Timestamp, Timestamp__Output as _google_protobuf_Timestamp__Output } from './google/protobuf/Timestamp'; -import type { And as _zoekt_webserver_v1_And, And__Output as _zoekt_webserver_v1_And__Output } from './zoekt/webserver/v1/And'; -import type { Boost as _zoekt_webserver_v1_Boost, Boost__Output as _zoekt_webserver_v1_Boost__Output } from './zoekt/webserver/v1/Boost'; -import type { Branch as _zoekt_webserver_v1_Branch, Branch__Output as _zoekt_webserver_v1_Branch__Output } from './zoekt/webserver/v1/Branch'; -import type { BranchRepos as _zoekt_webserver_v1_BranchRepos, BranchRepos__Output as _zoekt_webserver_v1_BranchRepos__Output } from './zoekt/webserver/v1/BranchRepos'; -import type { BranchesRepos as _zoekt_webserver_v1_BranchesRepos, BranchesRepos__Output as _zoekt_webserver_v1_BranchesRepos__Output } from './zoekt/webserver/v1/BranchesRepos'; -import type { ChunkMatch as _zoekt_webserver_v1_ChunkMatch, ChunkMatch__Output as _zoekt_webserver_v1_ChunkMatch__Output } from './zoekt/webserver/v1/ChunkMatch'; -import type { FileMatch as _zoekt_webserver_v1_FileMatch, FileMatch__Output as _zoekt_webserver_v1_FileMatch__Output } from './zoekt/webserver/v1/FileMatch'; -import type { FileNameSet as _zoekt_webserver_v1_FileNameSet, FileNameSet__Output as _zoekt_webserver_v1_FileNameSet__Output } from './zoekt/webserver/v1/FileNameSet'; -import type { IndexMetadata as _zoekt_webserver_v1_IndexMetadata, IndexMetadata__Output as _zoekt_webserver_v1_IndexMetadata__Output } from './zoekt/webserver/v1/IndexMetadata'; -import type { Language as _zoekt_webserver_v1_Language, Language__Output as _zoekt_webserver_v1_Language__Output } from './zoekt/webserver/v1/Language'; -import type { LineFragmentMatch as _zoekt_webserver_v1_LineFragmentMatch, LineFragmentMatch__Output as _zoekt_webserver_v1_LineFragmentMatch__Output } from './zoekt/webserver/v1/LineFragmentMatch'; -import type { LineMatch as _zoekt_webserver_v1_LineMatch, LineMatch__Output as _zoekt_webserver_v1_LineMatch__Output } from './zoekt/webserver/v1/LineMatch'; -import type { ListOptions as _zoekt_webserver_v1_ListOptions, ListOptions__Output as _zoekt_webserver_v1_ListOptions__Output } from './zoekt/webserver/v1/ListOptions'; -import type { ListRequest as _zoekt_webserver_v1_ListRequest, ListRequest__Output as _zoekt_webserver_v1_ListRequest__Output } from './zoekt/webserver/v1/ListRequest'; -import type { ListResponse as _zoekt_webserver_v1_ListResponse, ListResponse__Output as _zoekt_webserver_v1_ListResponse__Output } from './zoekt/webserver/v1/ListResponse'; -import type { Location as _zoekt_webserver_v1_Location, Location__Output as _zoekt_webserver_v1_Location__Output } from './zoekt/webserver/v1/Location'; -import type { Meta as _zoekt_webserver_v1_Meta, Meta__Output as _zoekt_webserver_v1_Meta__Output } from './zoekt/webserver/v1/Meta'; -import type { MinimalRepoListEntry as _zoekt_webserver_v1_MinimalRepoListEntry, MinimalRepoListEntry__Output as _zoekt_webserver_v1_MinimalRepoListEntry__Output } from './zoekt/webserver/v1/MinimalRepoListEntry'; -import type { Not as _zoekt_webserver_v1_Not, Not__Output as _zoekt_webserver_v1_Not__Output } from './zoekt/webserver/v1/Not'; -import type { Or as _zoekt_webserver_v1_Or, Or__Output as _zoekt_webserver_v1_Or__Output } from './zoekt/webserver/v1/Or'; -import type { Progress as _zoekt_webserver_v1_Progress, Progress__Output as _zoekt_webserver_v1_Progress__Output } from './zoekt/webserver/v1/Progress'; -import type { Q as _zoekt_webserver_v1_Q, Q__Output as _zoekt_webserver_v1_Q__Output } from './zoekt/webserver/v1/Q'; -import type { Range as _zoekt_webserver_v1_Range, Range__Output as _zoekt_webserver_v1_Range__Output } from './zoekt/webserver/v1/Range'; -import type { RawConfig as _zoekt_webserver_v1_RawConfig, RawConfig__Output as _zoekt_webserver_v1_RawConfig__Output } from './zoekt/webserver/v1/RawConfig'; -import type { Regexp as _zoekt_webserver_v1_Regexp, Regexp__Output as _zoekt_webserver_v1_Regexp__Output } from './zoekt/webserver/v1/Regexp'; -import type { Repo as _zoekt_webserver_v1_Repo, Repo__Output as _zoekt_webserver_v1_Repo__Output } from './zoekt/webserver/v1/Repo'; -import type { RepoIds as _zoekt_webserver_v1_RepoIds, RepoIds__Output as _zoekt_webserver_v1_RepoIds__Output } from './zoekt/webserver/v1/RepoIds'; -import type { RepoListEntry as _zoekt_webserver_v1_RepoListEntry, RepoListEntry__Output as _zoekt_webserver_v1_RepoListEntry__Output } from './zoekt/webserver/v1/RepoListEntry'; -import type { RepoRegexp as _zoekt_webserver_v1_RepoRegexp, RepoRegexp__Output as _zoekt_webserver_v1_RepoRegexp__Output } from './zoekt/webserver/v1/RepoRegexp'; -import type { RepoSet as _zoekt_webserver_v1_RepoSet, RepoSet__Output as _zoekt_webserver_v1_RepoSet__Output } from './zoekt/webserver/v1/RepoSet'; -import type { RepoStats as _zoekt_webserver_v1_RepoStats, RepoStats__Output as _zoekt_webserver_v1_RepoStats__Output } from './zoekt/webserver/v1/RepoStats'; -import type { Repository as _zoekt_webserver_v1_Repository, Repository__Output as _zoekt_webserver_v1_Repository__Output } from './zoekt/webserver/v1/Repository'; -import type { RepositoryBranch as _zoekt_webserver_v1_RepositoryBranch, RepositoryBranch__Output as _zoekt_webserver_v1_RepositoryBranch__Output } from './zoekt/webserver/v1/RepositoryBranch'; -import type { SearchOptions as _zoekt_webserver_v1_SearchOptions, SearchOptions__Output as _zoekt_webserver_v1_SearchOptions__Output } from './zoekt/webserver/v1/SearchOptions'; -import type { SearchRequest as _zoekt_webserver_v1_SearchRequest, SearchRequest__Output as _zoekt_webserver_v1_SearchRequest__Output } from './zoekt/webserver/v1/SearchRequest'; -import type { SearchResponse as _zoekt_webserver_v1_SearchResponse, SearchResponse__Output as _zoekt_webserver_v1_SearchResponse__Output } from './zoekt/webserver/v1/SearchResponse'; -import type { Stats as _zoekt_webserver_v1_Stats, Stats__Output as _zoekt_webserver_v1_Stats__Output } from './zoekt/webserver/v1/Stats'; -import type { StreamSearchRequest as _zoekt_webserver_v1_StreamSearchRequest, StreamSearchRequest__Output as _zoekt_webserver_v1_StreamSearchRequest__Output } from './zoekt/webserver/v1/StreamSearchRequest'; -import type { StreamSearchResponse as _zoekt_webserver_v1_StreamSearchResponse, StreamSearchResponse__Output as _zoekt_webserver_v1_StreamSearchResponse__Output } from './zoekt/webserver/v1/StreamSearchResponse'; -import type { Substring as _zoekt_webserver_v1_Substring, Substring__Output as _zoekt_webserver_v1_Substring__Output } from './zoekt/webserver/v1/Substring'; -import type { Symbol as _zoekt_webserver_v1_Symbol, Symbol__Output as _zoekt_webserver_v1_Symbol__Output } from './zoekt/webserver/v1/Symbol'; -import type { SymbolInfo as _zoekt_webserver_v1_SymbolInfo, SymbolInfo__Output as _zoekt_webserver_v1_SymbolInfo__Output } from './zoekt/webserver/v1/SymbolInfo'; -import type { Type as _zoekt_webserver_v1_Type, Type__Output as _zoekt_webserver_v1_Type__Output } from './zoekt/webserver/v1/Type'; -import type { WebserverServiceClient as _zoekt_webserver_v1_WebserverServiceClient, WebserverServiceDefinition as _zoekt_webserver_v1_WebserverServiceDefinition } from './zoekt/webserver/v1/WebserverService'; - -type SubtypeConstructor any, Subtype> = { - new(...args: ConstructorParameters): Subtype; -}; - -export interface ProtoGrpcType { - google: { - protobuf: { - Duration: MessageTypeDefinition<_google_protobuf_Duration, _google_protobuf_Duration__Output> - Timestamp: MessageTypeDefinition<_google_protobuf_Timestamp, _google_protobuf_Timestamp__Output> - } - } - zoekt: { - webserver: { - v1: { - And: MessageTypeDefinition<_zoekt_webserver_v1_And, _zoekt_webserver_v1_And__Output> - Boost: MessageTypeDefinition<_zoekt_webserver_v1_Boost, _zoekt_webserver_v1_Boost__Output> - Branch: MessageTypeDefinition<_zoekt_webserver_v1_Branch, _zoekt_webserver_v1_Branch__Output> - BranchRepos: MessageTypeDefinition<_zoekt_webserver_v1_BranchRepos, _zoekt_webserver_v1_BranchRepos__Output> - BranchesRepos: MessageTypeDefinition<_zoekt_webserver_v1_BranchesRepos, _zoekt_webserver_v1_BranchesRepos__Output> - ChunkMatch: MessageTypeDefinition<_zoekt_webserver_v1_ChunkMatch, _zoekt_webserver_v1_ChunkMatch__Output> - FileMatch: MessageTypeDefinition<_zoekt_webserver_v1_FileMatch, _zoekt_webserver_v1_FileMatch__Output> - FileNameSet: MessageTypeDefinition<_zoekt_webserver_v1_FileNameSet, _zoekt_webserver_v1_FileNameSet__Output> - FlushReason: EnumTypeDefinition - IndexMetadata: MessageTypeDefinition<_zoekt_webserver_v1_IndexMetadata, _zoekt_webserver_v1_IndexMetadata__Output> - Language: MessageTypeDefinition<_zoekt_webserver_v1_Language, _zoekt_webserver_v1_Language__Output> - LineFragmentMatch: MessageTypeDefinition<_zoekt_webserver_v1_LineFragmentMatch, _zoekt_webserver_v1_LineFragmentMatch__Output> - LineMatch: MessageTypeDefinition<_zoekt_webserver_v1_LineMatch, _zoekt_webserver_v1_LineMatch__Output> - ListOptions: MessageTypeDefinition<_zoekt_webserver_v1_ListOptions, _zoekt_webserver_v1_ListOptions__Output> - ListRequest: MessageTypeDefinition<_zoekt_webserver_v1_ListRequest, _zoekt_webserver_v1_ListRequest__Output> - ListResponse: MessageTypeDefinition<_zoekt_webserver_v1_ListResponse, _zoekt_webserver_v1_ListResponse__Output> - Location: MessageTypeDefinition<_zoekt_webserver_v1_Location, _zoekt_webserver_v1_Location__Output> - Meta: MessageTypeDefinition<_zoekt_webserver_v1_Meta, _zoekt_webserver_v1_Meta__Output> - MinimalRepoListEntry: MessageTypeDefinition<_zoekt_webserver_v1_MinimalRepoListEntry, _zoekt_webserver_v1_MinimalRepoListEntry__Output> - Not: MessageTypeDefinition<_zoekt_webserver_v1_Not, _zoekt_webserver_v1_Not__Output> - Or: MessageTypeDefinition<_zoekt_webserver_v1_Or, _zoekt_webserver_v1_Or__Output> - Progress: MessageTypeDefinition<_zoekt_webserver_v1_Progress, _zoekt_webserver_v1_Progress__Output> - Q: MessageTypeDefinition<_zoekt_webserver_v1_Q, _zoekt_webserver_v1_Q__Output> - Range: MessageTypeDefinition<_zoekt_webserver_v1_Range, _zoekt_webserver_v1_Range__Output> - RawConfig: MessageTypeDefinition<_zoekt_webserver_v1_RawConfig, _zoekt_webserver_v1_RawConfig__Output> - Regexp: MessageTypeDefinition<_zoekt_webserver_v1_Regexp, _zoekt_webserver_v1_Regexp__Output> - Repo: MessageTypeDefinition<_zoekt_webserver_v1_Repo, _zoekt_webserver_v1_Repo__Output> - RepoIds: MessageTypeDefinition<_zoekt_webserver_v1_RepoIds, _zoekt_webserver_v1_RepoIds__Output> - RepoListEntry: MessageTypeDefinition<_zoekt_webserver_v1_RepoListEntry, _zoekt_webserver_v1_RepoListEntry__Output> - RepoRegexp: MessageTypeDefinition<_zoekt_webserver_v1_RepoRegexp, _zoekt_webserver_v1_RepoRegexp__Output> - RepoSet: MessageTypeDefinition<_zoekt_webserver_v1_RepoSet, _zoekt_webserver_v1_RepoSet__Output> - RepoStats: MessageTypeDefinition<_zoekt_webserver_v1_RepoStats, _zoekt_webserver_v1_RepoStats__Output> - Repository: MessageTypeDefinition<_zoekt_webserver_v1_Repository, _zoekt_webserver_v1_Repository__Output> - RepositoryBranch: MessageTypeDefinition<_zoekt_webserver_v1_RepositoryBranch, _zoekt_webserver_v1_RepositoryBranch__Output> - SearchOptions: MessageTypeDefinition<_zoekt_webserver_v1_SearchOptions, _zoekt_webserver_v1_SearchOptions__Output> - SearchRequest: MessageTypeDefinition<_zoekt_webserver_v1_SearchRequest, _zoekt_webserver_v1_SearchRequest__Output> - SearchResponse: MessageTypeDefinition<_zoekt_webserver_v1_SearchResponse, _zoekt_webserver_v1_SearchResponse__Output> - Stats: MessageTypeDefinition<_zoekt_webserver_v1_Stats, _zoekt_webserver_v1_Stats__Output> - StreamSearchRequest: MessageTypeDefinition<_zoekt_webserver_v1_StreamSearchRequest, _zoekt_webserver_v1_StreamSearchRequest__Output> - StreamSearchResponse: MessageTypeDefinition<_zoekt_webserver_v1_StreamSearchResponse, _zoekt_webserver_v1_StreamSearchResponse__Output> - Substring: MessageTypeDefinition<_zoekt_webserver_v1_Substring, _zoekt_webserver_v1_Substring__Output> - Symbol: MessageTypeDefinition<_zoekt_webserver_v1_Symbol, _zoekt_webserver_v1_Symbol__Output> - SymbolInfo: MessageTypeDefinition<_zoekt_webserver_v1_SymbolInfo, _zoekt_webserver_v1_SymbolInfo__Output> - Type: MessageTypeDefinition<_zoekt_webserver_v1_Type, _zoekt_webserver_v1_Type__Output> - WebserverService: SubtypeConstructor & { service: _zoekt_webserver_v1_WebserverServiceDefinition } - } - } - } -} - diff --git a/packages/web/src/proto/zoekt/webserver/v1/And.ts b/packages/web/src/proto/zoekt/webserver/v1/And.ts deleted file mode 100644 index 61fff3c43..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/And.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - -import type { Q as _zoekt_webserver_v1_Q, Q__Output as _zoekt_webserver_v1_Q__Output } from '../../../zoekt/webserver/v1/Q'; - -/** - * And is matched when all its children are. - */ -export interface And { - 'children'?: (_zoekt_webserver_v1_Q)[]; -} - -/** - * And is matched when all its children are. - */ -export interface And__Output { - 'children': (_zoekt_webserver_v1_Q__Output)[]; -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Boost.ts b/packages/web/src/proto/zoekt/webserver/v1/Boost.ts deleted file mode 100644 index d5f03a808..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Boost.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - -import type { Q as _zoekt_webserver_v1_Q, Q__Output as _zoekt_webserver_v1_Q__Output } from '../../../zoekt/webserver/v1/Q'; - -/** - * Boost multiplies the score of its child by the boost factor. - */ -export interface Boost { - 'child'?: (_zoekt_webserver_v1_Q | null); - 'boost'?: (number | string); -} - -/** - * Boost multiplies the score of its child by the boost factor. - */ -export interface Boost__Output { - 'child': (_zoekt_webserver_v1_Q__Output | null); - 'boost': (number); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Branch.ts b/packages/web/src/proto/zoekt/webserver/v1/Branch.ts deleted file mode 100644 index 6b7afce8d..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Branch.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -/** - * Branch limits search to a specific branch. - */ -export interface Branch { - 'pattern'?: (string); - /** - * exact is true if we want to Pattern to equal branch. - */ - 'exact'?: (boolean); -} - -/** - * Branch limits search to a specific branch. - */ -export interface Branch__Output { - 'pattern': (string); - /** - * exact is true if we want to Pattern to equal branch. - */ - 'exact': (boolean); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/BranchRepos.ts b/packages/web/src/proto/zoekt/webserver/v1/BranchRepos.ts deleted file mode 100644 index 7badc6d18..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/BranchRepos.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -/** - * BranchRepos is a (branch, sourcegraph repo ids bitmap) tuple. It is a - * Sourcegraph addition. - */ -export interface BranchRepos { - 'branch'?: (string); - /** - * a serialized roaring bitmap of the target repo ids - */ - 'repos'?: (Buffer | Uint8Array | string); -} - -/** - * BranchRepos is a (branch, sourcegraph repo ids bitmap) tuple. It is a - * Sourcegraph addition. - */ -export interface BranchRepos__Output { - 'branch': (string); - /** - * a serialized roaring bitmap of the target repo ids - */ - 'repos': (Buffer); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/BranchesRepos.ts b/packages/web/src/proto/zoekt/webserver/v1/BranchesRepos.ts deleted file mode 100644 index b22b5a086..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/BranchesRepos.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - -import type { BranchRepos as _zoekt_webserver_v1_BranchRepos, BranchRepos__Output as _zoekt_webserver_v1_BranchRepos__Output } from '../../../zoekt/webserver/v1/BranchRepos'; - -/** - * BranchesRepos is a slice of BranchRepos to match. - */ -export interface BranchesRepos { - 'list'?: (_zoekt_webserver_v1_BranchRepos)[]; -} - -/** - * BranchesRepos is a slice of BranchRepos to match. - */ -export interface BranchesRepos__Output { - 'list': (_zoekt_webserver_v1_BranchRepos__Output)[]; -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/ChunkMatch.ts b/packages/web/src/proto/zoekt/webserver/v1/ChunkMatch.ts deleted file mode 100644 index 66d47099b..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/ChunkMatch.ts +++ /dev/null @@ -1,67 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { Location as _zoekt_webserver_v1_Location, Location__Output as _zoekt_webserver_v1_Location__Output } from '../../../zoekt/webserver/v1/Location'; -import type { Range as _zoekt_webserver_v1_Range, Range__Output as _zoekt_webserver_v1_Range__Output } from '../../../zoekt/webserver/v1/Range'; -import type { SymbolInfo as _zoekt_webserver_v1_SymbolInfo, SymbolInfo__Output as _zoekt_webserver_v1_SymbolInfo__Output } from '../../../zoekt/webserver/v1/SymbolInfo'; - -export interface ChunkMatch { - /** - * A contiguous range of complete lines that fully contains Ranges. - */ - 'content'?: (Buffer | Uint8Array | string); - /** - * The location (inclusive) of the beginning of content - * relative to the beginning of the file. It will always be at the - * beginning of a line (Column will always be 1). - */ - 'content_start'?: (_zoekt_webserver_v1_Location | null); - /** - * True if this match is a match on the file name, in - * which case Content will contain the file name. - */ - 'file_name'?: (boolean); - /** - * A set of matching ranges within this chunk. Each range is relative - * to the beginning of the file (not the beginning of Content). - */ - 'ranges'?: (_zoekt_webserver_v1_Range)[]; - /** - * The symbol information associated with Ranges. If it is non-nil, - * its length will equal that of Ranges. Any of its elements may be nil. - */ - 'symbol_info'?: (_zoekt_webserver_v1_SymbolInfo)[]; - 'score'?: (number | string); - 'debug_score'?: (string); - 'best_line_match'?: (number); -} - -export interface ChunkMatch__Output { - /** - * A contiguous range of complete lines that fully contains Ranges. - */ - 'content': (Buffer); - /** - * The location (inclusive) of the beginning of content - * relative to the beginning of the file. It will always be at the - * beginning of a line (Column will always be 1). - */ - 'content_start': (_zoekt_webserver_v1_Location__Output | null); - /** - * True if this match is a match on the file name, in - * which case Content will contain the file name. - */ - 'file_name': (boolean); - /** - * A set of matching ranges within this chunk. Each range is relative - * to the beginning of the file (not the beginning of Content). - */ - 'ranges': (_zoekt_webserver_v1_Range__Output)[]; - /** - * The symbol information associated with Ranges. If it is non-nil, - * its length will equal that of Ranges. Any of its elements may be nil. - */ - 'symbol_info': (_zoekt_webserver_v1_SymbolInfo__Output)[]; - 'score': (number); - 'debug_score': (string); - 'best_line_match': (number); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/FileMatch.ts b/packages/web/src/proto/zoekt/webserver/v1/FileMatch.ts deleted file mode 100644 index 7150fbc5b..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/FileMatch.ts +++ /dev/null @@ -1,132 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { LineMatch as _zoekt_webserver_v1_LineMatch, LineMatch__Output as _zoekt_webserver_v1_LineMatch__Output } from '../../../zoekt/webserver/v1/LineMatch'; -import type { ChunkMatch as _zoekt_webserver_v1_ChunkMatch, ChunkMatch__Output as _zoekt_webserver_v1_ChunkMatch__Output } from '../../../zoekt/webserver/v1/ChunkMatch'; - -/** - * FileMatch contains all the matches within a file. - */ -export interface FileMatch { - /** - * Ranking; the higher, the better. - */ - 'score'?: (number | string); - /** - * For debugging. Needs DebugScore set, but public so tests in - * other packages can print some diagnostics. - */ - 'debug'?: (string); - /** - * The repository-relative path to the file. - * 🚨 Warning: file_name might not be a valid UTF-8 string. - */ - 'file_name'?: (Buffer | Uint8Array | string); - /** - * Repository is the globally unique name of the repo of the - * match - */ - 'repository'?: (string); - 'branches'?: (string)[]; - /** - * One of line_matches or chunk_matches will be returned depending on whether - * the SearchOptions.ChunkMatches is set. - */ - 'line_matches'?: (_zoekt_webserver_v1_LineMatch)[]; - 'chunk_matches'?: (_zoekt_webserver_v1_ChunkMatch)[]; - /** - * repository_id is a Sourcegraph extension. This is the ID of Repository in - * Sourcegraph. - */ - 'repository_id'?: (number); - 'repository_priority'?: (number | string); - /** - * Only set if requested - */ - 'content'?: (Buffer | Uint8Array | string); - /** - * Checksum of the content. - */ - 'checksum'?: (Buffer | Uint8Array | string); - /** - * Detected language of the result. - */ - 'language'?: (string); - /** - * sub_repository_name is the globally unique name of the repo, - * if it came from a subrepository - */ - 'sub_repository_name'?: (string); - /** - * sub_repository_path holds the prefix where the subrepository - * was mounted. - */ - 'sub_repository_path'?: (string); - /** - * Commit SHA1 (hex) of the (sub)repo holding the file. - */ - 'version'?: (string); -} - -/** - * FileMatch contains all the matches within a file. - */ -export interface FileMatch__Output { - /** - * Ranking; the higher, the better. - */ - 'score': (number); - /** - * For debugging. Needs DebugScore set, but public so tests in - * other packages can print some diagnostics. - */ - 'debug': (string); - /** - * The repository-relative path to the file. - * 🚨 Warning: file_name might not be a valid UTF-8 string. - */ - 'file_name': (Buffer); - /** - * Repository is the globally unique name of the repo of the - * match - */ - 'repository': (string); - 'branches': (string)[]; - /** - * One of line_matches or chunk_matches will be returned depending on whether - * the SearchOptions.ChunkMatches is set. - */ - 'line_matches': (_zoekt_webserver_v1_LineMatch__Output)[]; - 'chunk_matches': (_zoekt_webserver_v1_ChunkMatch__Output)[]; - /** - * repository_id is a Sourcegraph extension. This is the ID of Repository in - * Sourcegraph. - */ - 'repository_id': (number); - 'repository_priority': (number); - /** - * Only set if requested - */ - 'content': (Buffer); - /** - * Checksum of the content. - */ - 'checksum': (Buffer); - /** - * Detected language of the result. - */ - 'language': (string); - /** - * sub_repository_name is the globally unique name of the repo, - * if it came from a subrepository - */ - 'sub_repository_name': (string); - /** - * sub_repository_path holds the prefix where the subrepository - * was mounted. - */ - 'sub_repository_path': (string); - /** - * Commit SHA1 (hex) of the (sub)repo holding the file. - */ - 'version': (string); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/FileNameSet.ts b/packages/web/src/proto/zoekt/webserver/v1/FileNameSet.ts deleted file mode 100644 index 38aea627d..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/FileNameSet.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -/** - * FileNameSet is a list of file names to match. - */ -export interface FileNameSet { - 'set'?: (string)[]; -} - -/** - * FileNameSet is a list of file names to match. - */ -export interface FileNameSet__Output { - 'set': (string)[]; -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/FlushReason.ts b/packages/web/src/proto/zoekt/webserver/v1/FlushReason.ts deleted file mode 100644 index 2cdad17d7..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/FlushReason.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -export const FlushReason = { - FLUSH_REASON_UNKNOWN_UNSPECIFIED: 'FLUSH_REASON_UNKNOWN_UNSPECIFIED', - FLUSH_REASON_TIMER_EXPIRED: 'FLUSH_REASON_TIMER_EXPIRED', - FLUSH_REASON_FINAL_FLUSH: 'FLUSH_REASON_FINAL_FLUSH', - FLUSH_REASON_MAX_SIZE: 'FLUSH_REASON_MAX_SIZE', -} as const; - -export type FlushReason = - | 'FLUSH_REASON_UNKNOWN_UNSPECIFIED' - | 0 - | 'FLUSH_REASON_TIMER_EXPIRED' - | 1 - | 'FLUSH_REASON_FINAL_FLUSH' - | 2 - | 'FLUSH_REASON_MAX_SIZE' - | 3 - -export type FlushReason__Output = typeof FlushReason[keyof typeof FlushReason] diff --git a/packages/web/src/proto/zoekt/webserver/v1/IndexMetadata.ts b/packages/web/src/proto/zoekt/webserver/v1/IndexMetadata.ts deleted file mode 100644 index 3de1dbf68..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/IndexMetadata.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { Timestamp as _google_protobuf_Timestamp, Timestamp__Output as _google_protobuf_Timestamp__Output } from '../../../google/protobuf/Timestamp'; -import type { Long } from '@grpc/proto-loader'; - -export interface IndexMetadata { - 'index_format_version'?: (number | string | Long); - 'index_feature_version'?: (number | string | Long); - 'index_min_reader_version'?: (number | string | Long); - 'index_time'?: (_google_protobuf_Timestamp | null); - 'plain_ascii'?: (boolean); - 'language_map'?: ({[key: string]: number}); - 'zoekt_version'?: (string); - 'id'?: (string); -} - -export interface IndexMetadata__Output { - 'index_format_version': (number); - 'index_feature_version': (number); - 'index_min_reader_version': (number); - 'index_time': (_google_protobuf_Timestamp__Output | null); - 'plain_ascii': (boolean); - 'language_map': ({[key: string]: number}); - 'zoekt_version': (string); - 'id': (string); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Language.ts b/packages/web/src/proto/zoekt/webserver/v1/Language.ts deleted file mode 100644 index 4f2a9e6bd..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Language.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -export interface Language { - 'language'?: (string); -} - -export interface Language__Output { - 'language': (string); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/LineFragmentMatch.ts b/packages/web/src/proto/zoekt/webserver/v1/LineFragmentMatch.ts deleted file mode 100644 index 7c21fa20e..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/LineFragmentMatch.ts +++ /dev/null @@ -1,38 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { SymbolInfo as _zoekt_webserver_v1_SymbolInfo, SymbolInfo__Output as _zoekt_webserver_v1_SymbolInfo__Output } from '../../../zoekt/webserver/v1/SymbolInfo'; -import type { Long } from '@grpc/proto-loader'; - -export interface LineFragmentMatch { - /** - * Offset within the line, in bytes. - */ - 'line_offset'?: (number | string | Long); - /** - * Offset from file start, in bytes. - */ - 'offset'?: (number); - /** - * Number bytes that match. - */ - 'match_length'?: (number | string | Long); - 'symbol_info'?: (_zoekt_webserver_v1_SymbolInfo | null); - '_symbol_info'?: "symbol_info"; -} - -export interface LineFragmentMatch__Output { - /** - * Offset within the line, in bytes. - */ - 'line_offset': (number); - /** - * Offset from file start, in bytes. - */ - 'offset': (number); - /** - * Number bytes that match. - */ - 'match_length': (number); - 'symbol_info'?: (_zoekt_webserver_v1_SymbolInfo__Output | null); - '_symbol_info'?: "symbol_info"; -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/LineMatch.ts b/packages/web/src/proto/zoekt/webserver/v1/LineMatch.ts deleted file mode 100644 index f58361bdf..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/LineMatch.ts +++ /dev/null @@ -1,50 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { LineFragmentMatch as _zoekt_webserver_v1_LineFragmentMatch, LineFragmentMatch__Output as _zoekt_webserver_v1_LineFragmentMatch__Output } from '../../../zoekt/webserver/v1/LineFragmentMatch'; -import type { Long } from '@grpc/proto-loader'; - -export interface LineMatch { - 'line'?: (Buffer | Uint8Array | string); - 'line_start'?: (number | string | Long); - 'line_end'?: (number | string | Long); - 'line_number'?: (number | string | Long); - /** - * before and after are only set when SearchOptions.NumContextLines is > 0 - */ - 'before'?: (Buffer | Uint8Array | string); - 'after'?: (Buffer | Uint8Array | string); - /** - * If set, this was a match on the filename. - */ - 'file_name'?: (boolean); - /** - * The higher the better. Only ranks the quality of the match - * within the file, does not take rank of file into account - */ - 'score'?: (number | string); - 'debug_score'?: (string); - 'line_fragments'?: (_zoekt_webserver_v1_LineFragmentMatch)[]; -} - -export interface LineMatch__Output { - 'line': (Buffer); - 'line_start': (number); - 'line_end': (number); - 'line_number': (number); - /** - * before and after are only set when SearchOptions.NumContextLines is > 0 - */ - 'before': (Buffer); - 'after': (Buffer); - /** - * If set, this was a match on the filename. - */ - 'file_name': (boolean); - /** - * The higher the better. Only ranks the quality of the match - * within the file, does not take rank of file into account - */ - 'score': (number); - 'debug_score': (string); - 'line_fragments': (_zoekt_webserver_v1_LineFragmentMatch__Output)[]; -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/ListOptions.ts b/packages/web/src/proto/zoekt/webserver/v1/ListOptions.ts deleted file mode 100644 index 1b1784384..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/ListOptions.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - - -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -export const _zoekt_webserver_v1_ListOptions_RepoListField = { - REPO_LIST_FIELD_UNKNOWN_UNSPECIFIED: 'REPO_LIST_FIELD_UNKNOWN_UNSPECIFIED', - REPO_LIST_FIELD_REPOS: 'REPO_LIST_FIELD_REPOS', - REPO_LIST_FIELD_REPOS_MAP: 'REPO_LIST_FIELD_REPOS_MAP', -} as const; - -export type _zoekt_webserver_v1_ListOptions_RepoListField = - | 'REPO_LIST_FIELD_UNKNOWN_UNSPECIFIED' - | 0 - | 'REPO_LIST_FIELD_REPOS' - | 1 - | 'REPO_LIST_FIELD_REPOS_MAP' - | 3 - -export type _zoekt_webserver_v1_ListOptions_RepoListField__Output = typeof _zoekt_webserver_v1_ListOptions_RepoListField[keyof typeof _zoekt_webserver_v1_ListOptions_RepoListField] - -export interface ListOptions { - /** - * Field decides which field to populate in RepoList response. - */ - 'field'?: (_zoekt_webserver_v1_ListOptions_RepoListField); -} - -export interface ListOptions__Output { - /** - * Field decides which field to populate in RepoList response. - */ - 'field': (_zoekt_webserver_v1_ListOptions_RepoListField__Output); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/ListRequest.ts b/packages/web/src/proto/zoekt/webserver/v1/ListRequest.ts deleted file mode 100644 index 90fd117f9..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/ListRequest.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { Q as _zoekt_webserver_v1_Q, Q__Output as _zoekt_webserver_v1_Q__Output } from '../../../zoekt/webserver/v1/Q'; -import type { ListOptions as _zoekt_webserver_v1_ListOptions, ListOptions__Output as _zoekt_webserver_v1_ListOptions__Output } from '../../../zoekt/webserver/v1/ListOptions'; - -export interface ListRequest { - 'query'?: (_zoekt_webserver_v1_Q | null); - 'opts'?: (_zoekt_webserver_v1_ListOptions | null); -} - -export interface ListRequest__Output { - 'query': (_zoekt_webserver_v1_Q__Output | null); - 'opts': (_zoekt_webserver_v1_ListOptions__Output | null); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/ListResponse.ts b/packages/web/src/proto/zoekt/webserver/v1/ListResponse.ts deleted file mode 100644 index 909ca2213..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/ListResponse.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { RepoListEntry as _zoekt_webserver_v1_RepoListEntry, RepoListEntry__Output as _zoekt_webserver_v1_RepoListEntry__Output } from '../../../zoekt/webserver/v1/RepoListEntry'; -import type { MinimalRepoListEntry as _zoekt_webserver_v1_MinimalRepoListEntry, MinimalRepoListEntry__Output as _zoekt_webserver_v1_MinimalRepoListEntry__Output } from '../../../zoekt/webserver/v1/MinimalRepoListEntry'; -import type { RepoStats as _zoekt_webserver_v1_RepoStats, RepoStats__Output as _zoekt_webserver_v1_RepoStats__Output } from '../../../zoekt/webserver/v1/RepoStats'; -import type { Long } from '@grpc/proto-loader'; - -export interface ListResponse { - /** - * Returned when ListOptions.Field is RepoListFieldRepos. - */ - 'repos'?: (_zoekt_webserver_v1_RepoListEntry)[]; - /** - * ReposMap is set when ListOptions.Field is RepoListFieldReposMap. - */ - 'repos_map'?: ({[key: number]: _zoekt_webserver_v1_MinimalRepoListEntry}); - 'crashes'?: (number | string | Long); - /** - * Stats response to a List request. - * This is the aggregate RepoStats of all repos matching the input query. - */ - 'stats'?: (_zoekt_webserver_v1_RepoStats | null); -} - -export interface ListResponse__Output { - /** - * Returned when ListOptions.Field is RepoListFieldRepos. - */ - 'repos': (_zoekt_webserver_v1_RepoListEntry__Output)[]; - /** - * ReposMap is set when ListOptions.Field is RepoListFieldReposMap. - */ - 'repos_map': ({[key: number]: _zoekt_webserver_v1_MinimalRepoListEntry__Output}); - 'crashes': (number); - /** - * Stats response to a List request. - * This is the aggregate RepoStats of all repos matching the input query. - */ - 'stats': (_zoekt_webserver_v1_RepoStats__Output | null); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Location.ts b/packages/web/src/proto/zoekt/webserver/v1/Location.ts deleted file mode 100644 index 8f840a7be..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Location.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - - -export interface Location { - /** - * 0-based byte offset from the beginning of the file - */ - 'byte_offset'?: (number); - /** - * 1-based line number from the beginning of the file - */ - 'line_number'?: (number); - /** - * 1-based column number (in runes) from the beginning of line - */ - 'column'?: (number); -} - -export interface Location__Output { - /** - * 0-based byte offset from the beginning of the file - */ - 'byte_offset': (number); - /** - * 1-based line number from the beginning of the file - */ - 'line_number': (number); - /** - * 1-based column number (in runes) from the beginning of line - */ - 'column': (number); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Meta.ts b/packages/web/src/proto/zoekt/webserver/v1/Meta.ts deleted file mode 100644 index fc4755342..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Meta.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -/** - * Meta allows filtering results by repo metadata. - */ -export interface Meta { - 'key'?: (string); - 'value'?: (string); -} - -/** - * Meta allows filtering results by repo metadata. - */ -export interface Meta__Output { - 'key': (string); - 'value': (string); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/MinimalRepoListEntry.ts b/packages/web/src/proto/zoekt/webserver/v1/MinimalRepoListEntry.ts deleted file mode 100644 index ba3618886..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/MinimalRepoListEntry.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { RepositoryBranch as _zoekt_webserver_v1_RepositoryBranch, RepositoryBranch__Output as _zoekt_webserver_v1_RepositoryBranch__Output } from '../../../zoekt/webserver/v1/RepositoryBranch'; -import type { Long } from '@grpc/proto-loader'; - -export interface MinimalRepoListEntry { - 'has_symbols'?: (boolean); - 'branches'?: (_zoekt_webserver_v1_RepositoryBranch)[]; - 'index_time_unix'?: (number | string | Long); -} - -export interface MinimalRepoListEntry__Output { - 'has_symbols': (boolean); - 'branches': (_zoekt_webserver_v1_RepositoryBranch__Output)[]; - 'index_time_unix': (number); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Not.ts b/packages/web/src/proto/zoekt/webserver/v1/Not.ts deleted file mode 100644 index 6f7e43b70..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Not.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - -import type { Q as _zoekt_webserver_v1_Q, Q__Output as _zoekt_webserver_v1_Q__Output } from '../../../zoekt/webserver/v1/Q'; - -/** - * Not inverts the meaning of its child. - */ -export interface Not { - 'child'?: (_zoekt_webserver_v1_Q | null); -} - -/** - * Not inverts the meaning of its child. - */ -export interface Not__Output { - 'child': (_zoekt_webserver_v1_Q__Output | null); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Or.ts b/packages/web/src/proto/zoekt/webserver/v1/Or.ts deleted file mode 100644 index 0e3e5974b..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Or.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - -import type { Q as _zoekt_webserver_v1_Q, Q__Output as _zoekt_webserver_v1_Q__Output } from '../../../zoekt/webserver/v1/Q'; - -/** - * Or is matched when any of its children is matched. - */ -export interface Or { - 'children'?: (_zoekt_webserver_v1_Q)[]; -} - -/** - * Or is matched when any of its children is matched. - */ -export interface Or__Output { - 'children': (_zoekt_webserver_v1_Q__Output)[]; -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Progress.ts b/packages/web/src/proto/zoekt/webserver/v1/Progress.ts deleted file mode 100644 index 1d3f36b24..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Progress.ts +++ /dev/null @@ -1,42 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - - -/** - * Progress contains information about the global progress of the running search query. - * This is used by the frontend to reorder results and emit them when stable. - * Sourcegraph specific: this is used when querying multiple zoekt-webserver instances. - */ -export interface Progress { - /** - * Priority of the shard that was searched. - */ - 'priority'?: (number | string); - /** - * max_pending_priority is the maximum priority of pending result that is being searched in parallel. - * This is used to reorder results when the result set is known to be stable-- that is, when a result's - * Priority is greater than the max(MaxPendingPriority) from the latest results of each backend, it can be returned to the user. - * - * max_pending_priority decreases monotonically in each SearchResult. - */ - 'max_pending_priority'?: (number | string); -} - -/** - * Progress contains information about the global progress of the running search query. - * This is used by the frontend to reorder results and emit them when stable. - * Sourcegraph specific: this is used when querying multiple zoekt-webserver instances. - */ -export interface Progress__Output { - /** - * Priority of the shard that was searched. - */ - 'priority': (number); - /** - * max_pending_priority is the maximum priority of pending result that is being searched in parallel. - * This is used to reorder results when the result set is known to be stable-- that is, when a result's - * Priority is greater than the max(MaxPendingPriority) from the latest results of each backend, it can be returned to the user. - * - * max_pending_priority decreases monotonically in each SearchResult. - */ - 'max_pending_priority': (number); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Q.ts b/packages/web/src/proto/zoekt/webserver/v1/Q.ts deleted file mode 100644 index 110ebffc7..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Q.ts +++ /dev/null @@ -1,66 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - -import type { RawConfig as _zoekt_webserver_v1_RawConfig, RawConfig__Output as _zoekt_webserver_v1_RawConfig__Output } from '../../../zoekt/webserver/v1/RawConfig'; -import type { Regexp as _zoekt_webserver_v1_Regexp, Regexp__Output as _zoekt_webserver_v1_Regexp__Output } from '../../../zoekt/webserver/v1/Regexp'; -import type { Symbol as _zoekt_webserver_v1_Symbol, Symbol__Output as _zoekt_webserver_v1_Symbol__Output } from '../../../zoekt/webserver/v1/Symbol'; -import type { Language as _zoekt_webserver_v1_Language, Language__Output as _zoekt_webserver_v1_Language__Output } from '../../../zoekt/webserver/v1/Language'; -import type { Repo as _zoekt_webserver_v1_Repo, Repo__Output as _zoekt_webserver_v1_Repo__Output } from '../../../zoekt/webserver/v1/Repo'; -import type { RepoRegexp as _zoekt_webserver_v1_RepoRegexp, RepoRegexp__Output as _zoekt_webserver_v1_RepoRegexp__Output } from '../../../zoekt/webserver/v1/RepoRegexp'; -import type { BranchesRepos as _zoekt_webserver_v1_BranchesRepos, BranchesRepos__Output as _zoekt_webserver_v1_BranchesRepos__Output } from '../../../zoekt/webserver/v1/BranchesRepos'; -import type { RepoIds as _zoekt_webserver_v1_RepoIds, RepoIds__Output as _zoekt_webserver_v1_RepoIds__Output } from '../../../zoekt/webserver/v1/RepoIds'; -import type { RepoSet as _zoekt_webserver_v1_RepoSet, RepoSet__Output as _zoekt_webserver_v1_RepoSet__Output } from '../../../zoekt/webserver/v1/RepoSet'; -import type { FileNameSet as _zoekt_webserver_v1_FileNameSet, FileNameSet__Output as _zoekt_webserver_v1_FileNameSet__Output } from '../../../zoekt/webserver/v1/FileNameSet'; -import type { Type as _zoekt_webserver_v1_Type, Type__Output as _zoekt_webserver_v1_Type__Output } from '../../../zoekt/webserver/v1/Type'; -import type { Substring as _zoekt_webserver_v1_Substring, Substring__Output as _zoekt_webserver_v1_Substring__Output } from '../../../zoekt/webserver/v1/Substring'; -import type { And as _zoekt_webserver_v1_And, And__Output as _zoekt_webserver_v1_And__Output } from '../../../zoekt/webserver/v1/And'; -import type { Or as _zoekt_webserver_v1_Or, Or__Output as _zoekt_webserver_v1_Or__Output } from '../../../zoekt/webserver/v1/Or'; -import type { Not as _zoekt_webserver_v1_Not, Not__Output as _zoekt_webserver_v1_Not__Output } from '../../../zoekt/webserver/v1/Not'; -import type { Branch as _zoekt_webserver_v1_Branch, Branch__Output as _zoekt_webserver_v1_Branch__Output } from '../../../zoekt/webserver/v1/Branch'; -import type { Boost as _zoekt_webserver_v1_Boost, Boost__Output as _zoekt_webserver_v1_Boost__Output } from '../../../zoekt/webserver/v1/Boost'; -import type { Meta as _zoekt_webserver_v1_Meta, Meta__Output as _zoekt_webserver_v1_Meta__Output } from '../../../zoekt/webserver/v1/Meta'; - -export interface Q { - 'raw_config'?: (_zoekt_webserver_v1_RawConfig | null); - 'regexp'?: (_zoekt_webserver_v1_Regexp | null); - 'symbol'?: (_zoekt_webserver_v1_Symbol | null); - 'language'?: (_zoekt_webserver_v1_Language | null); - 'const'?: (boolean); - 'repo'?: (_zoekt_webserver_v1_Repo | null); - 'repo_regexp'?: (_zoekt_webserver_v1_RepoRegexp | null); - 'branches_repos'?: (_zoekt_webserver_v1_BranchesRepos | null); - 'repo_ids'?: (_zoekt_webserver_v1_RepoIds | null); - 'repo_set'?: (_zoekt_webserver_v1_RepoSet | null); - 'file_name_set'?: (_zoekt_webserver_v1_FileNameSet | null); - 'type'?: (_zoekt_webserver_v1_Type | null); - 'substring'?: (_zoekt_webserver_v1_Substring | null); - 'and'?: (_zoekt_webserver_v1_And | null); - 'or'?: (_zoekt_webserver_v1_Or | null); - 'not'?: (_zoekt_webserver_v1_Not | null); - 'branch'?: (_zoekt_webserver_v1_Branch | null); - 'boost'?: (_zoekt_webserver_v1_Boost | null); - 'meta'?: (_zoekt_webserver_v1_Meta | null); - 'query'?: "raw_config"|"regexp"|"symbol"|"language"|"const"|"repo"|"repo_regexp"|"branches_repos"|"repo_ids"|"repo_set"|"file_name_set"|"type"|"substring"|"and"|"or"|"not"|"branch"|"boost"|"meta"; -} - -export interface Q__Output { - 'raw_config'?: (_zoekt_webserver_v1_RawConfig__Output | null); - 'regexp'?: (_zoekt_webserver_v1_Regexp__Output | null); - 'symbol'?: (_zoekt_webserver_v1_Symbol__Output | null); - 'language'?: (_zoekt_webserver_v1_Language__Output | null); - 'const'?: (boolean); - 'repo'?: (_zoekt_webserver_v1_Repo__Output | null); - 'repo_regexp'?: (_zoekt_webserver_v1_RepoRegexp__Output | null); - 'branches_repos'?: (_zoekt_webserver_v1_BranchesRepos__Output | null); - 'repo_ids'?: (_zoekt_webserver_v1_RepoIds__Output | null); - 'repo_set'?: (_zoekt_webserver_v1_RepoSet__Output | null); - 'file_name_set'?: (_zoekt_webserver_v1_FileNameSet__Output | null); - 'type'?: (_zoekt_webserver_v1_Type__Output | null); - 'substring'?: (_zoekt_webserver_v1_Substring__Output | null); - 'and'?: (_zoekt_webserver_v1_And__Output | null); - 'or'?: (_zoekt_webserver_v1_Or__Output | null); - 'not'?: (_zoekt_webserver_v1_Not__Output | null); - 'branch'?: (_zoekt_webserver_v1_Branch__Output | null); - 'boost'?: (_zoekt_webserver_v1_Boost__Output | null); - 'meta'?: (_zoekt_webserver_v1_Meta__Output | null); - 'query'?: "raw_config"|"regexp"|"symbol"|"language"|"const"|"repo"|"repo_regexp"|"branches_repos"|"repo_ids"|"repo_set"|"file_name_set"|"type"|"substring"|"and"|"or"|"not"|"branch"|"boost"|"meta"; -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Range.ts b/packages/web/src/proto/zoekt/webserver/v1/Range.ts deleted file mode 100644 index a6e69d3d8..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Range.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { Location as _zoekt_webserver_v1_Location, Location__Output as _zoekt_webserver_v1_Location__Output } from '../../../zoekt/webserver/v1/Location'; - -export interface Range { - /** - * The inclusive beginning of the range. - */ - 'start'?: (_zoekt_webserver_v1_Location | null); - /** - * The exclusive end of the range. - */ - 'end'?: (_zoekt_webserver_v1_Location | null); -} - -export interface Range__Output { - /** - * The inclusive beginning of the range. - */ - 'start': (_zoekt_webserver_v1_Location__Output | null); - /** - * The exclusive end of the range. - */ - 'end': (_zoekt_webserver_v1_Location__Output | null); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/RawConfig.ts b/packages/web/src/proto/zoekt/webserver/v1/RawConfig.ts deleted file mode 100644 index 6379dbbe7..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/RawConfig.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - -export const _zoekt_webserver_v1_RawConfig_Flag = { - FLAG_UNKNOWN_UNSPECIFIED: 'FLAG_UNKNOWN_UNSPECIFIED', - FLAG_ONLY_PUBLIC: 'FLAG_ONLY_PUBLIC', - FLAG_ONLY_PRIVATE: 'FLAG_ONLY_PRIVATE', - FLAG_ONLY_FORKS: 'FLAG_ONLY_FORKS', - FLAG_NO_FORKS: 'FLAG_NO_FORKS', - FLAG_ONLY_ARCHIVED: 'FLAG_ONLY_ARCHIVED', - FLAG_NO_ARCHIVED: 'FLAG_NO_ARCHIVED', -} as const; - -export type _zoekt_webserver_v1_RawConfig_Flag = - | 'FLAG_UNKNOWN_UNSPECIFIED' - | 0 - | 'FLAG_ONLY_PUBLIC' - | 1 - | 'FLAG_ONLY_PRIVATE' - | 2 - | 'FLAG_ONLY_FORKS' - | 4 - | 'FLAG_NO_FORKS' - | 8 - | 'FLAG_ONLY_ARCHIVED' - | 16 - | 'FLAG_NO_ARCHIVED' - | 32 - -export type _zoekt_webserver_v1_RawConfig_Flag__Output = typeof _zoekt_webserver_v1_RawConfig_Flag[keyof typeof _zoekt_webserver_v1_RawConfig_Flag] - -/** - * RawConfig filters repositories based on their encoded RawConfig map. - */ -export interface RawConfig { - 'flags'?: (_zoekt_webserver_v1_RawConfig_Flag)[]; -} - -/** - * RawConfig filters repositories based on their encoded RawConfig map. - */ -export interface RawConfig__Output { - 'flags': (_zoekt_webserver_v1_RawConfig_Flag__Output)[]; -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Regexp.ts b/packages/web/src/proto/zoekt/webserver/v1/Regexp.ts deleted file mode 100644 index 67582b031..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Regexp.ts +++ /dev/null @@ -1,22 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -/** - * Regexp is a query looking for regular expressions matches. - */ -export interface Regexp { - 'regexp'?: (string); - 'file_name'?: (boolean); - 'content'?: (boolean); - 'case_sensitive'?: (boolean); -} - -/** - * Regexp is a query looking for regular expressions matches. - */ -export interface Regexp__Output { - 'regexp': (string); - 'file_name': (boolean); - 'content': (boolean); - 'case_sensitive': (boolean); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Repo.ts b/packages/web/src/proto/zoekt/webserver/v1/Repo.ts deleted file mode 100644 index a10958831..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Repo.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -export interface Repo { - 'regexp'?: (string); -} - -export interface Repo__Output { - 'regexp': (string); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/RepoIds.ts b/packages/web/src/proto/zoekt/webserver/v1/RepoIds.ts deleted file mode 100644 index 7ba23d27d..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/RepoIds.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -/** - * Similar to BranchRepos but will be used to match only by repoid and - * therefore matches all branches - */ -export interface RepoIds { - /** - * a serialized roaring bitmap of the target repo ids - */ - 'repos'?: (Buffer | Uint8Array | string); -} - -/** - * Similar to BranchRepos but will be used to match only by repoid and - * therefore matches all branches - */ -export interface RepoIds__Output { - /** - * a serialized roaring bitmap of the target repo ids - */ - 'repos': (Buffer); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/RepoListEntry.ts b/packages/web/src/proto/zoekt/webserver/v1/RepoListEntry.ts deleted file mode 100644 index a216311df..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/RepoListEntry.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { Repository as _zoekt_webserver_v1_Repository, Repository__Output as _zoekt_webserver_v1_Repository__Output } from '../../../zoekt/webserver/v1/Repository'; -import type { IndexMetadata as _zoekt_webserver_v1_IndexMetadata, IndexMetadata__Output as _zoekt_webserver_v1_IndexMetadata__Output } from '../../../zoekt/webserver/v1/IndexMetadata'; -import type { RepoStats as _zoekt_webserver_v1_RepoStats, RepoStats__Output as _zoekt_webserver_v1_RepoStats__Output } from '../../../zoekt/webserver/v1/RepoStats'; - -export interface RepoListEntry { - 'repository'?: (_zoekt_webserver_v1_Repository | null); - 'index_metadata'?: (_zoekt_webserver_v1_IndexMetadata | null); - 'stats'?: (_zoekt_webserver_v1_RepoStats | null); -} - -export interface RepoListEntry__Output { - 'repository': (_zoekt_webserver_v1_Repository__Output | null); - 'index_metadata': (_zoekt_webserver_v1_IndexMetadata__Output | null); - 'stats': (_zoekt_webserver_v1_RepoStats__Output | null); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/RepoRegexp.ts b/packages/web/src/proto/zoekt/webserver/v1/RepoRegexp.ts deleted file mode 100644 index 1ee2da099..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/RepoRegexp.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -export interface RepoRegexp { - 'regexp'?: (string); -} - -export interface RepoRegexp__Output { - 'regexp': (string); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/RepoSet.ts b/packages/web/src/proto/zoekt/webserver/v1/RepoSet.ts deleted file mode 100644 index 3638f1dca..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/RepoSet.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -/** - * RepoSet is a list of repos to match. - */ -export interface RepoSet { - 'set'?: ({[key: string]: boolean}); -} - -/** - * RepoSet is a list of repos to match. - */ -export interface RepoSet__Output { - 'set': ({[key: string]: boolean}); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/RepoStats.ts b/packages/web/src/proto/zoekt/webserver/v1/RepoStats.ts deleted file mode 100644 index db507c230..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/RepoStats.ts +++ /dev/null @@ -1,97 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { Long } from '@grpc/proto-loader'; - -/** - * RepoStats is a collection of statistics for a set of repositories. - */ -export interface RepoStats { - /** - * repos is used for aggregrating the number of repositories. - */ - 'repos'?: (number | string | Long); - /** - * shards is the total number of search shards. - */ - 'shards'?: (number | string | Long); - /** - * documents holds the number of documents or files. - */ - 'documents'?: (number | string | Long); - /** - * index_bytes is the amount of RAM used for index overhead. - */ - 'index_bytes'?: (number | string | Long); - /** - * content_bytes is the amount of RAM used for raw content. - */ - 'content_bytes'?: (number | string | Long); - /** - * new_lines_count is the number of newlines "\n" that appear in the zoekt - * indexed documents. This is not exactly the same as line count, since it - * will not include lines not terminated by "\n" (eg a file with no "\n", or - * a final line without "\n"). Note: Zoekt deduplicates documents across - * branches, so if a path has the same contents on multiple branches, there - * is only one document for it. As such that document's newlines is only - * counted once. See DefaultBranchNewLinesCount and AllBranchesNewLinesCount - * for counts which do not deduplicate. - */ - 'new_lines_count'?: (number | string | Long); - /** - * default_branch_new_lines_count is the number of newlines "\n" in the default - * branch. - */ - 'default_branch_new_lines_count'?: (number | string | Long); - /** - * other_branches_new_lines_count is the number of newlines "\n" in all branches - * except the default branch. - */ - 'other_branches_new_lines_count'?: (number | string | Long); -} - -/** - * RepoStats is a collection of statistics for a set of repositories. - */ -export interface RepoStats__Output { - /** - * repos is used for aggregrating the number of repositories. - */ - 'repos': (number); - /** - * shards is the total number of search shards. - */ - 'shards': (number); - /** - * documents holds the number of documents or files. - */ - 'documents': (number); - /** - * index_bytes is the amount of RAM used for index overhead. - */ - 'index_bytes': (number); - /** - * content_bytes is the amount of RAM used for raw content. - */ - 'content_bytes': (number); - /** - * new_lines_count is the number of newlines "\n" that appear in the zoekt - * indexed documents. This is not exactly the same as line count, since it - * will not include lines not terminated by "\n" (eg a file with no "\n", or - * a final line without "\n"). Note: Zoekt deduplicates documents across - * branches, so if a path has the same contents on multiple branches, there - * is only one document for it. As such that document's newlines is only - * counted once. See DefaultBranchNewLinesCount and AllBranchesNewLinesCount - * for counts which do not deduplicate. - */ - 'new_lines_count': (number); - /** - * default_branch_new_lines_count is the number of newlines "\n" in the default - * branch. - */ - 'default_branch_new_lines_count': (number); - /** - * other_branches_new_lines_count is the number of newlines "\n" in all branches - * except the default branch. - */ - 'other_branches_new_lines_count': (number); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Repository.ts b/packages/web/src/proto/zoekt/webserver/v1/Repository.ts deleted file mode 100644 index c18172720..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Repository.ts +++ /dev/null @@ -1,192 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { RepositoryBranch as _zoekt_webserver_v1_RepositoryBranch, RepositoryBranch__Output as _zoekt_webserver_v1_RepositoryBranch__Output } from '../../../zoekt/webserver/v1/RepositoryBranch'; -import type { Repository as _zoekt_webserver_v1_Repository, Repository__Output as _zoekt_webserver_v1_Repository__Output } from '../../../zoekt/webserver/v1/Repository'; -import type { Timestamp as _google_protobuf_Timestamp, Timestamp__Output as _google_protobuf_Timestamp__Output } from '../../../google/protobuf/Timestamp'; -import type { Long } from '@grpc/proto-loader'; - -export interface Repository { - /** - * Sourcegraph's repository ID - */ - 'id'?: (number); - /** - * The repository name - */ - 'name'?: (string); - /** - * The repository URL. - */ - 'url'?: (string); - /** - * The physical source where this repo came from, eg. full - * path to the zip filename or git repository directory. This - * will not be exposed in the UI, but can be used to detect - * orphaned index shards. - */ - 'source'?: (string); - /** - * The branches indexed in this repo. - */ - 'branches'?: (_zoekt_webserver_v1_RepositoryBranch)[]; - /** - * Nil if this is not the super project. - */ - 'sub_repo_map'?: ({[key: string]: _zoekt_webserver_v1_Repository}); - /** - * URL template to link to the commit of a branch - */ - 'commit_url_template'?: (string); - /** - * The repository URL for getting to a file. Has access to - * {{.Version}}, {{.Path}} - */ - 'file_url_template'?: (string); - /** - * The URL fragment to add to a file URL for line numbers. has - * access to {{.LineNumber}}. The fragment should include the - * separator, generally '#' or ';'. - */ - 'line_fragment_template'?: (string); - /** - * Perf optimization: priority is set when we load the shard. It corresponds to - * the value of "priority" stored in RawConfig. - */ - 'priority'?: (number | string); - /** - * All zoekt.* configuration settings. - */ - 'raw_config'?: ({[key: string]: string}); - /** - * Importance of the repository, bigger is more important - */ - 'rank'?: (number); - /** - * index_options is a hash of the options used to create the index for the - * repo. - */ - 'index_options'?: (string); - /** - * has_symbols is true if this repository has indexed ctags - * output. Sourcegraph specific: This field is more appropriate for - * IndexMetadata. However, we store it here since the Sourcegraph frontend - * can read this structure but not IndexMetadata. - */ - 'has_symbols'?: (boolean); - /** - * tombstone is true if we are not allowed to search this repo. - */ - 'tombstone'?: (boolean); - /** - * latest_commit_date is the date of the latest commit among all indexed Branches. - * The date might be time.Time's 0-value if the repository was last indexed - * before this field was added. - */ - 'latest_commit_date'?: (_google_protobuf_Timestamp | null); - /** - * file_tombstones is a set of file paths that should be ignored across all branches - * in this shard. - */ - 'file_tombstones'?: (string)[]; - /** - * tenant_id is the tenant ID of the repository. - */ - 'tenant_id'?: (number | string | Long); - /** - * Additional metadata about the repository. - */ - 'metadata'?: ({[key: string]: string}); -} - -export interface Repository__Output { - /** - * Sourcegraph's repository ID - */ - 'id': (number); - /** - * The repository name - */ - 'name': (string); - /** - * The repository URL. - */ - 'url': (string); - /** - * The physical source where this repo came from, eg. full - * path to the zip filename or git repository directory. This - * will not be exposed in the UI, but can be used to detect - * orphaned index shards. - */ - 'source': (string); - /** - * The branches indexed in this repo. - */ - 'branches': (_zoekt_webserver_v1_RepositoryBranch__Output)[]; - /** - * Nil if this is not the super project. - */ - 'sub_repo_map': ({[key: string]: _zoekt_webserver_v1_Repository__Output}); - /** - * URL template to link to the commit of a branch - */ - 'commit_url_template': (string); - /** - * The repository URL for getting to a file. Has access to - * {{.Version}}, {{.Path}} - */ - 'file_url_template': (string); - /** - * The URL fragment to add to a file URL for line numbers. has - * access to {{.LineNumber}}. The fragment should include the - * separator, generally '#' or ';'. - */ - 'line_fragment_template': (string); - /** - * Perf optimization: priority is set when we load the shard. It corresponds to - * the value of "priority" stored in RawConfig. - */ - 'priority': (number); - /** - * All zoekt.* configuration settings. - */ - 'raw_config': ({[key: string]: string}); - /** - * Importance of the repository, bigger is more important - */ - 'rank': (number); - /** - * index_options is a hash of the options used to create the index for the - * repo. - */ - 'index_options': (string); - /** - * has_symbols is true if this repository has indexed ctags - * output. Sourcegraph specific: This field is more appropriate for - * IndexMetadata. However, we store it here since the Sourcegraph frontend - * can read this structure but not IndexMetadata. - */ - 'has_symbols': (boolean); - /** - * tombstone is true if we are not allowed to search this repo. - */ - 'tombstone': (boolean); - /** - * latest_commit_date is the date of the latest commit among all indexed Branches. - * The date might be time.Time's 0-value if the repository was last indexed - * before this field was added. - */ - 'latest_commit_date': (_google_protobuf_Timestamp__Output | null); - /** - * file_tombstones is a set of file paths that should be ignored across all branches - * in this shard. - */ - 'file_tombstones': (string)[]; - /** - * tenant_id is the tenant ID of the repository. - */ - 'tenant_id': (number); - /** - * Additional metadata about the repository. - */ - 'metadata': ({[key: string]: string}); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/RepositoryBranch.ts b/packages/web/src/proto/zoekt/webserver/v1/RepositoryBranch.ts deleted file mode 100644 index d18ee9554..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/RepositoryBranch.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - - -/** - * RepositoryBranch describes an indexed branch, which is a name - * combined with a version. - */ -export interface RepositoryBranch { - 'name'?: (string); - 'version'?: (string); -} - -/** - * RepositoryBranch describes an indexed branch, which is a name - * combined with a version. - */ -export interface RepositoryBranch__Output { - 'name': (string); - 'version': (string); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/SearchOptions.ts b/packages/web/src/proto/zoekt/webserver/v1/SearchOptions.ts deleted file mode 100644 index a3fea5a21..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/SearchOptions.ts +++ /dev/null @@ -1,156 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { Duration as _google_protobuf_Duration, Duration__Output as _google_protobuf_Duration__Output } from '../../../google/protobuf/Duration'; -import type { Long } from '@grpc/proto-loader'; - -export interface SearchOptions { - /** - * Return an upper-bound estimate of eligible documents in - * stats.ShardFilesConsidered. - */ - 'estimate_doc_count'?: (boolean); - /** - * Return the whole file. - */ - 'whole'?: (boolean); - /** - * Maximum number of matches: skip all processing an index - * shard after we found this many non-overlapping matches. - */ - 'shard_max_match_count'?: (number | string | Long); - /** - * Maximum number of matches: stop looking for more matches - * once we have this many matches across shards. - */ - 'total_max_match_count'?: (number | string | Long); - /** - * Maximum number of matches: skip processing documents for a repository in - * a shard once we have found ShardRepoMaxMatchCount. - * - * A compound shard may contain multiple repositories. This will most often - * be set to 1 to find all repositories containing a result. - */ - 'shard_repo_max_match_count'?: (number | string | Long); - /** - * Abort the search after this much time has passed. - */ - 'max_wall_time'?: (_google_protobuf_Duration | null); - /** - * FlushWallTime if non-zero will stop streaming behaviour at first and - * instead will collate and sort results. At FlushWallTime the results will - * be sent and then the behaviour will revert to the normal streaming. - */ - 'flush_wall_time'?: (_google_protobuf_Duration | null); - /** - * Truncates the number of documents (i.e. files) after collating and - * sorting the results. - */ - 'max_doc_display_count'?: (number | string | Long); - /** - * If set to a number greater than zero then up to this many number - * of context lines will be added before and after each matched line. - * Note that the included context lines might contain matches and - * it's up to the consumer of the result to remove those lines. - */ - 'num_context_lines'?: (number | string | Long); - /** - * If true, ChunkMatches will be returned in each FileMatch rather than LineMatches - * EXPERIMENTAL: the behavior of this flag may be changed in future versions. - */ - 'chunk_matches'?: (boolean); - /** - * Trace turns on opentracing for this request if true and if the Jaeger address was provided as - * a command-line flag - */ - 'trace'?: (boolean); - /** - * If set, the search results will contain debug information for scoring. - */ - 'debug_score'?: (boolean); - /** - * EXPERIMENTAL. If true, use text search scoring instead of the default scoring formula. - * Currently, this treats each match in a file as a term and computes an approximation to BM25. - * When enabled, all other scoring signals are ignored, including document ranks. - */ - 'use_bm25_scoring'?: (boolean); - /** - * Truncates the number of matchs after collating and sorting the results. - */ - 'max_match_display_count'?: (number | string | Long); -} - -export interface SearchOptions__Output { - /** - * Return an upper-bound estimate of eligible documents in - * stats.ShardFilesConsidered. - */ - 'estimate_doc_count': (boolean); - /** - * Return the whole file. - */ - 'whole': (boolean); - /** - * Maximum number of matches: skip all processing an index - * shard after we found this many non-overlapping matches. - */ - 'shard_max_match_count': (number); - /** - * Maximum number of matches: stop looking for more matches - * once we have this many matches across shards. - */ - 'total_max_match_count': (number); - /** - * Maximum number of matches: skip processing documents for a repository in - * a shard once we have found ShardRepoMaxMatchCount. - * - * A compound shard may contain multiple repositories. This will most often - * be set to 1 to find all repositories containing a result. - */ - 'shard_repo_max_match_count': (number); - /** - * Abort the search after this much time has passed. - */ - 'max_wall_time': (_google_protobuf_Duration__Output | null); - /** - * FlushWallTime if non-zero will stop streaming behaviour at first and - * instead will collate and sort results. At FlushWallTime the results will - * be sent and then the behaviour will revert to the normal streaming. - */ - 'flush_wall_time': (_google_protobuf_Duration__Output | null); - /** - * Truncates the number of documents (i.e. files) after collating and - * sorting the results. - */ - 'max_doc_display_count': (number); - /** - * If set to a number greater than zero then up to this many number - * of context lines will be added before and after each matched line. - * Note that the included context lines might contain matches and - * it's up to the consumer of the result to remove those lines. - */ - 'num_context_lines': (number); - /** - * If true, ChunkMatches will be returned in each FileMatch rather than LineMatches - * EXPERIMENTAL: the behavior of this flag may be changed in future versions. - */ - 'chunk_matches': (boolean); - /** - * Trace turns on opentracing for this request if true and if the Jaeger address was provided as - * a command-line flag - */ - 'trace': (boolean); - /** - * If set, the search results will contain debug information for scoring. - */ - 'debug_score': (boolean); - /** - * EXPERIMENTAL. If true, use text search scoring instead of the default scoring formula. - * Currently, this treats each match in a file as a term and computes an approximation to BM25. - * When enabled, all other scoring signals are ignored, including document ranks. - */ - 'use_bm25_scoring': (boolean); - /** - * Truncates the number of matchs after collating and sorting the results. - */ - 'max_match_display_count': (number); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/SearchRequest.ts b/packages/web/src/proto/zoekt/webserver/v1/SearchRequest.ts deleted file mode 100644 index 39a9fe3cc..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/SearchRequest.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { Q as _zoekt_webserver_v1_Q, Q__Output as _zoekt_webserver_v1_Q__Output } from '../../../zoekt/webserver/v1/Q'; -import type { SearchOptions as _zoekt_webserver_v1_SearchOptions, SearchOptions__Output as _zoekt_webserver_v1_SearchOptions__Output } from '../../../zoekt/webserver/v1/SearchOptions'; - -export interface SearchRequest { - 'query'?: (_zoekt_webserver_v1_Q | null); - 'opts'?: (_zoekt_webserver_v1_SearchOptions | null); -} - -export interface SearchRequest__Output { - 'query': (_zoekt_webserver_v1_Q__Output | null); - 'opts': (_zoekt_webserver_v1_SearchOptions__Output | null); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/SearchResponse.ts b/packages/web/src/proto/zoekt/webserver/v1/SearchResponse.ts deleted file mode 100644 index 51a64177c..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/SearchResponse.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { Stats as _zoekt_webserver_v1_Stats, Stats__Output as _zoekt_webserver_v1_Stats__Output } from '../../../zoekt/webserver/v1/Stats'; -import type { Progress as _zoekt_webserver_v1_Progress, Progress__Output as _zoekt_webserver_v1_Progress__Output } from '../../../zoekt/webserver/v1/Progress'; -import type { FileMatch as _zoekt_webserver_v1_FileMatch, FileMatch__Output as _zoekt_webserver_v1_FileMatch__Output } from '../../../zoekt/webserver/v1/FileMatch'; - -export interface SearchResponse { - 'stats'?: (_zoekt_webserver_v1_Stats | null); - 'progress'?: (_zoekt_webserver_v1_Progress | null); - 'files'?: (_zoekt_webserver_v1_FileMatch)[]; -} - -export interface SearchResponse__Output { - 'stats': (_zoekt_webserver_v1_Stats__Output | null); - 'progress': (_zoekt_webserver_v1_Progress__Output | null); - 'files': (_zoekt_webserver_v1_FileMatch__Output)[]; -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Stats.ts b/packages/web/src/proto/zoekt/webserver/v1/Stats.ts deleted file mode 100644 index 348eea642..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Stats.ts +++ /dev/null @@ -1,181 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { Duration as _google_protobuf_Duration, Duration__Output as _google_protobuf_Duration__Output } from '../../../google/protobuf/Duration'; -import type { FlushReason as _zoekt_webserver_v1_FlushReason, FlushReason__Output as _zoekt_webserver_v1_FlushReason__Output } from '../../../zoekt/webserver/v1/FlushReason'; -import type { Long } from '@grpc/proto-loader'; - -export interface Stats { - /** - * Amount of I/O for reading contents. - */ - 'content_bytes_loaded'?: (number | string | Long); - /** - * Amount of I/O for reading from index. - */ - 'index_bytes_loaded'?: (number | string | Long); - /** - * Number of search shards that had a crash. - */ - 'crashes'?: (number | string | Long); - /** - * Wall clock time for this search - */ - 'duration'?: (_google_protobuf_Duration | null); - /** - * Number of files containing a match. - */ - 'file_count'?: (number | string | Long); - /** - * Number of files in shards that we considered. - */ - 'shard_files_considered'?: (number | string | Long); - /** - * Files that we evaluated. Equivalent to files for which all - * atom matches (including negations) evaluated to true. - */ - 'files_considered'?: (number | string | Long); - /** - * Files for which we loaded file content to verify substring matches - */ - 'files_loaded'?: (number | string | Long); - /** - * Candidate files whose contents weren't examined because we - * gathered enough matches. - */ - 'files_skipped'?: (number | string | Long); - /** - * Shards that we scanned to find matches. - */ - 'shards_scanned'?: (number | string | Long); - /** - * Shards that we did not process because a query was canceled. - */ - 'shards_skipped'?: (number | string | Long); - /** - * Shards that we did not process because the query was rejected by the - * ngram filter indicating it had no matches. - */ - 'shards_skipped_filter'?: (number | string | Long); - /** - * Number of non-overlapping matches - */ - 'match_count'?: (number | string | Long); - /** - * Number of candidate matches as a result of searching ngrams. - */ - 'ngram_matches'?: (number | string | Long); - /** - * Wall clock time for queued search. - */ - 'wait'?: (_google_protobuf_Duration | null); - /** - * Number of times regexp was called on files that we evaluated. - */ - 'regexps_considered'?: (number | string | Long); - /** - * FlushReason explains why results were flushed. - */ - 'flush_reason'?: (_zoekt_webserver_v1_FlushReason); - /** - * NgramLookups is the number of times we accessed an ngram in the index. - */ - 'ngram_lookups'?: (number | string | Long); - /** - * Aggregate wall clock time spent constructing and pruning the match tree. - * This accounts for time such as lookups in the trigram index. - */ - 'match_tree_construction'?: (_google_protobuf_Duration | null); - /** - * Aggregate wall clock time spent searching the match tree. This accounts - * for the bulk of search work done looking for matches. - */ - 'match_tree_search'?: (_google_protobuf_Duration | null); -} - -export interface Stats__Output { - /** - * Amount of I/O for reading contents. - */ - 'content_bytes_loaded': (number); - /** - * Amount of I/O for reading from index. - */ - 'index_bytes_loaded': (number); - /** - * Number of search shards that had a crash. - */ - 'crashes': (number); - /** - * Wall clock time for this search - */ - 'duration': (_google_protobuf_Duration__Output | null); - /** - * Number of files containing a match. - */ - 'file_count': (number); - /** - * Number of files in shards that we considered. - */ - 'shard_files_considered': (number); - /** - * Files that we evaluated. Equivalent to files for which all - * atom matches (including negations) evaluated to true. - */ - 'files_considered': (number); - /** - * Files for which we loaded file content to verify substring matches - */ - 'files_loaded': (number); - /** - * Candidate files whose contents weren't examined because we - * gathered enough matches. - */ - 'files_skipped': (number); - /** - * Shards that we scanned to find matches. - */ - 'shards_scanned': (number); - /** - * Shards that we did not process because a query was canceled. - */ - 'shards_skipped': (number); - /** - * Shards that we did not process because the query was rejected by the - * ngram filter indicating it had no matches. - */ - 'shards_skipped_filter': (number); - /** - * Number of non-overlapping matches - */ - 'match_count': (number); - /** - * Number of candidate matches as a result of searching ngrams. - */ - 'ngram_matches': (number); - /** - * Wall clock time for queued search. - */ - 'wait': (_google_protobuf_Duration__Output | null); - /** - * Number of times regexp was called on files that we evaluated. - */ - 'regexps_considered': (number); - /** - * FlushReason explains why results were flushed. - */ - 'flush_reason': (_zoekt_webserver_v1_FlushReason__Output); - /** - * NgramLookups is the number of times we accessed an ngram in the index. - */ - 'ngram_lookups': (number); - /** - * Aggregate wall clock time spent constructing and pruning the match tree. - * This accounts for time such as lookups in the trigram index. - */ - 'match_tree_construction': (_google_protobuf_Duration__Output | null); - /** - * Aggregate wall clock time spent searching the match tree. This accounts - * for the bulk of search work done looking for matches. - */ - 'match_tree_search': (_google_protobuf_Duration__Output | null); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/StreamSearchRequest.ts b/packages/web/src/proto/zoekt/webserver/v1/StreamSearchRequest.ts deleted file mode 100644 index 219e34773..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/StreamSearchRequest.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { SearchRequest as _zoekt_webserver_v1_SearchRequest, SearchRequest__Output as _zoekt_webserver_v1_SearchRequest__Output } from '../../../zoekt/webserver/v1/SearchRequest'; - -export interface StreamSearchRequest { - 'request'?: (_zoekt_webserver_v1_SearchRequest | null); -} - -export interface StreamSearchRequest__Output { - 'request': (_zoekt_webserver_v1_SearchRequest__Output | null); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/StreamSearchResponse.ts b/packages/web/src/proto/zoekt/webserver/v1/StreamSearchResponse.ts deleted file mode 100644 index 7b9276ee3..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/StreamSearchResponse.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type { SearchResponse as _zoekt_webserver_v1_SearchResponse, SearchResponse__Output as _zoekt_webserver_v1_SearchResponse__Output } from '../../../zoekt/webserver/v1/SearchResponse'; - -export interface StreamSearchResponse { - 'response_chunk'?: (_zoekt_webserver_v1_SearchResponse | null); -} - -export interface StreamSearchResponse__Output { - 'response_chunk': (_zoekt_webserver_v1_SearchResponse__Output | null); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Substring.ts b/packages/web/src/proto/zoekt/webserver/v1/Substring.ts deleted file mode 100644 index 07520aa32..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Substring.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - - -export interface Substring { - 'pattern'?: (string); - 'case_sensitive'?: (boolean); - /** - * Match only filename - */ - 'file_name'?: (boolean); - /** - * Match only content - */ - 'content'?: (boolean); -} - -export interface Substring__Output { - 'pattern': (string); - 'case_sensitive': (boolean); - /** - * Match only filename - */ - 'file_name': (boolean); - /** - * Match only content - */ - 'content': (boolean); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Symbol.ts b/packages/web/src/proto/zoekt/webserver/v1/Symbol.ts deleted file mode 100644 index 7ccf5c71d..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Symbol.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - -import type { Q as _zoekt_webserver_v1_Q, Q__Output as _zoekt_webserver_v1_Q__Output } from '../../../zoekt/webserver/v1/Q'; - -export interface Symbol { - 'expr'?: (_zoekt_webserver_v1_Q | null); -} - -export interface Symbol__Output { - 'expr': (_zoekt_webserver_v1_Q__Output | null); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/SymbolInfo.ts b/packages/web/src/proto/zoekt/webserver/v1/SymbolInfo.ts deleted file mode 100644 index 5622d50fe..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/SymbolInfo.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - - -export interface SymbolInfo { - 'sym'?: (string); - 'kind'?: (string); - 'parent'?: (string); - 'parent_kind'?: (string); -} - -export interface SymbolInfo__Output { - 'sym': (string); - 'kind': (string); - 'parent': (string); - 'parent_kind': (string); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/Type.ts b/packages/web/src/proto/zoekt/webserver/v1/Type.ts deleted file mode 100644 index 6f0163d33..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/Type.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - -import type { Q as _zoekt_webserver_v1_Q, Q__Output as _zoekt_webserver_v1_Q__Output } from '../../../zoekt/webserver/v1/Q'; - -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/query.proto - -export const _zoekt_webserver_v1_Type_Kind = { - KIND_UNKNOWN_UNSPECIFIED: 'KIND_UNKNOWN_UNSPECIFIED', - KIND_FILE_MATCH: 'KIND_FILE_MATCH', - KIND_FILE_NAME: 'KIND_FILE_NAME', - KIND_REPO: 'KIND_REPO', -} as const; - -export type _zoekt_webserver_v1_Type_Kind = - | 'KIND_UNKNOWN_UNSPECIFIED' - | 0 - | 'KIND_FILE_MATCH' - | 1 - | 'KIND_FILE_NAME' - | 2 - | 'KIND_REPO' - | 3 - -export type _zoekt_webserver_v1_Type_Kind__Output = typeof _zoekt_webserver_v1_Type_Kind[keyof typeof _zoekt_webserver_v1_Type_Kind] - -/** - * Type changes the result type returned. - */ -export interface Type { - 'child'?: (_zoekt_webserver_v1_Q | null); - /** - * TODO: type constants - */ - 'type'?: (_zoekt_webserver_v1_Type_Kind); -} - -/** - * Type changes the result type returned. - */ -export interface Type__Output { - 'child': (_zoekt_webserver_v1_Q__Output | null); - /** - * TODO: type constants - */ - 'type': (_zoekt_webserver_v1_Type_Kind__Output); -} diff --git a/packages/web/src/proto/zoekt/webserver/v1/WebserverService.ts b/packages/web/src/proto/zoekt/webserver/v1/WebserverService.ts deleted file mode 100644 index c7c80eab5..000000000 --- a/packages/web/src/proto/zoekt/webserver/v1/WebserverService.ts +++ /dev/null @@ -1,63 +0,0 @@ -// Original file: ../../vendor/zoekt/grpc/protos/zoekt/webserver/v1/webserver.proto - -import type * as grpc from '@grpc/grpc-js' -import type { MethodDefinition } from '@grpc/proto-loader' -import type { ListRequest as _zoekt_webserver_v1_ListRequest, ListRequest__Output as _zoekt_webserver_v1_ListRequest__Output } from '../../../zoekt/webserver/v1/ListRequest'; -import type { ListResponse as _zoekt_webserver_v1_ListResponse, ListResponse__Output as _zoekt_webserver_v1_ListResponse__Output } from '../../../zoekt/webserver/v1/ListResponse'; -import type { SearchRequest as _zoekt_webserver_v1_SearchRequest, SearchRequest__Output as _zoekt_webserver_v1_SearchRequest__Output } from '../../../zoekt/webserver/v1/SearchRequest'; -import type { SearchResponse as _zoekt_webserver_v1_SearchResponse, SearchResponse__Output as _zoekt_webserver_v1_SearchResponse__Output } from '../../../zoekt/webserver/v1/SearchResponse'; -import type { StreamSearchRequest as _zoekt_webserver_v1_StreamSearchRequest, StreamSearchRequest__Output as _zoekt_webserver_v1_StreamSearchRequest__Output } from '../../../zoekt/webserver/v1/StreamSearchRequest'; -import type { StreamSearchResponse as _zoekt_webserver_v1_StreamSearchResponse, StreamSearchResponse__Output as _zoekt_webserver_v1_StreamSearchResponse__Output } from '../../../zoekt/webserver/v1/StreamSearchResponse'; - -export interface WebserverServiceClient extends grpc.Client { - /** - * List lists repositories. The query `q` can only contain - * query.Repo atoms. - */ - List(argument: _zoekt_webserver_v1_ListRequest, metadata: grpc.Metadata, options: grpc.CallOptions, callback: grpc.requestCallback<_zoekt_webserver_v1_ListResponse__Output>): grpc.ClientUnaryCall; - List(argument: _zoekt_webserver_v1_ListRequest, metadata: grpc.Metadata, callback: grpc.requestCallback<_zoekt_webserver_v1_ListResponse__Output>): grpc.ClientUnaryCall; - List(argument: _zoekt_webserver_v1_ListRequest, options: grpc.CallOptions, callback: grpc.requestCallback<_zoekt_webserver_v1_ListResponse__Output>): grpc.ClientUnaryCall; - List(argument: _zoekt_webserver_v1_ListRequest, callback: grpc.requestCallback<_zoekt_webserver_v1_ListResponse__Output>): grpc.ClientUnaryCall; - /** - * List lists repositories. The query `q` can only contain - * query.Repo atoms. - */ - list(argument: _zoekt_webserver_v1_ListRequest, metadata: grpc.Metadata, options: grpc.CallOptions, callback: grpc.requestCallback<_zoekt_webserver_v1_ListResponse__Output>): grpc.ClientUnaryCall; - list(argument: _zoekt_webserver_v1_ListRequest, metadata: grpc.Metadata, callback: grpc.requestCallback<_zoekt_webserver_v1_ListResponse__Output>): grpc.ClientUnaryCall; - list(argument: _zoekt_webserver_v1_ListRequest, options: grpc.CallOptions, callback: grpc.requestCallback<_zoekt_webserver_v1_ListResponse__Output>): grpc.ClientUnaryCall; - list(argument: _zoekt_webserver_v1_ListRequest, callback: grpc.requestCallback<_zoekt_webserver_v1_ListResponse__Output>): grpc.ClientUnaryCall; - - Search(argument: _zoekt_webserver_v1_SearchRequest, metadata: grpc.Metadata, options: grpc.CallOptions, callback: grpc.requestCallback<_zoekt_webserver_v1_SearchResponse__Output>): grpc.ClientUnaryCall; - Search(argument: _zoekt_webserver_v1_SearchRequest, metadata: grpc.Metadata, callback: grpc.requestCallback<_zoekt_webserver_v1_SearchResponse__Output>): grpc.ClientUnaryCall; - Search(argument: _zoekt_webserver_v1_SearchRequest, options: grpc.CallOptions, callback: grpc.requestCallback<_zoekt_webserver_v1_SearchResponse__Output>): grpc.ClientUnaryCall; - Search(argument: _zoekt_webserver_v1_SearchRequest, callback: grpc.requestCallback<_zoekt_webserver_v1_SearchResponse__Output>): grpc.ClientUnaryCall; - search(argument: _zoekt_webserver_v1_SearchRequest, metadata: grpc.Metadata, options: grpc.CallOptions, callback: grpc.requestCallback<_zoekt_webserver_v1_SearchResponse__Output>): grpc.ClientUnaryCall; - search(argument: _zoekt_webserver_v1_SearchRequest, metadata: grpc.Metadata, callback: grpc.requestCallback<_zoekt_webserver_v1_SearchResponse__Output>): grpc.ClientUnaryCall; - search(argument: _zoekt_webserver_v1_SearchRequest, options: grpc.CallOptions, callback: grpc.requestCallback<_zoekt_webserver_v1_SearchResponse__Output>): grpc.ClientUnaryCall; - search(argument: _zoekt_webserver_v1_SearchRequest, callback: grpc.requestCallback<_zoekt_webserver_v1_SearchResponse__Output>): grpc.ClientUnaryCall; - - StreamSearch(argument: _zoekt_webserver_v1_StreamSearchRequest, metadata: grpc.Metadata, options?: grpc.CallOptions): grpc.ClientReadableStream<_zoekt_webserver_v1_StreamSearchResponse__Output>; - StreamSearch(argument: _zoekt_webserver_v1_StreamSearchRequest, options?: grpc.CallOptions): grpc.ClientReadableStream<_zoekt_webserver_v1_StreamSearchResponse__Output>; - streamSearch(argument: _zoekt_webserver_v1_StreamSearchRequest, metadata: grpc.Metadata, options?: grpc.CallOptions): grpc.ClientReadableStream<_zoekt_webserver_v1_StreamSearchResponse__Output>; - streamSearch(argument: _zoekt_webserver_v1_StreamSearchRequest, options?: grpc.CallOptions): grpc.ClientReadableStream<_zoekt_webserver_v1_StreamSearchResponse__Output>; - -} - -export interface WebserverServiceHandlers extends grpc.UntypedServiceImplementation { - /** - * List lists repositories. The query `q` can only contain - * query.Repo atoms. - */ - List: grpc.handleUnaryCall<_zoekt_webserver_v1_ListRequest__Output, _zoekt_webserver_v1_ListResponse>; - - Search: grpc.handleUnaryCall<_zoekt_webserver_v1_SearchRequest__Output, _zoekt_webserver_v1_SearchResponse>; - - StreamSearch: grpc.handleServerStreamingCall<_zoekt_webserver_v1_StreamSearchRequest__Output, _zoekt_webserver_v1_StreamSearchResponse>; - -} - -export interface WebserverServiceDefinition extends grpc.ServiceDefinition { - List: MethodDefinition<_zoekt_webserver_v1_ListRequest, _zoekt_webserver_v1_ListResponse, _zoekt_webserver_v1_ListRequest__Output, _zoekt_webserver_v1_ListResponse__Output> - Search: MethodDefinition<_zoekt_webserver_v1_SearchRequest, _zoekt_webserver_v1_SearchResponse, _zoekt_webserver_v1_SearchRequest__Output, _zoekt_webserver_v1_SearchResponse__Output> - StreamSearch: MethodDefinition<_zoekt_webserver_v1_StreamSearchRequest, _zoekt_webserver_v1_StreamSearchResponse, _zoekt_webserver_v1_StreamSearchRequest__Output, _zoekt_webserver_v1_StreamSearchResponse__Output> -} diff --git a/packages/web/src/proxy.ts b/packages/web/src/proxy.ts deleted file mode 100644 index 0b07a5198..000000000 --- a/packages/web/src/proxy.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { StatusCodes } from 'http-status-codes'; -import { NextResponse } from 'next/server' -import type { NextRequest } from 'next/server' - -/** - * As part of our original SaaS effort in April 2025, we introduced - * multi-tenancy into Sourcebot as part of v3.0.0. Organizations - * (or tenants) were assigned a domain suffix that would be appended - * as the root part of the URL (e.g., `https://sourcebot.dev/org-a/...`) - * allowing us to identify what the current organization context was. - * For self-hosted instances, multi-tenancy was irrelevant, and so the - * domain suffix was simple `~` for the single-tenant org. - * - * In v4.0.0, we scrapped multi-tenancy, but we were left with the - * `~` in the URL pathname. In v4.16.8, we removed the org domain - * prefix from the URL pathname and shifted all routes to be served - * at the root domain. - * - * The following proxy middleware is used to redirect URLs that were - * created between v3.0.0 and v4.16.8 to the new canonical URL structure. - * For example, `https://sourcebot.dev/~/invite/123` would be redirected - * to `https://sourcebot.dev/invite/123`. - * - * See: https://github.com/sourcebot-dev/sourcebot/pull/1076 - */ -export async function proxy(request: NextRequest) { - const url = request.nextUrl.clone(); - - if (url.pathname.startsWith('/~/')) { - url.pathname = url.pathname.replace(/^\/~/, ''); - return NextResponse.redirect(url, StatusCodes.MOVED_PERMANENTLY); - } - - if (url.pathname === '/~') { - url.pathname = '/'; - return NextResponse.redirect(url, StatusCodes.MOVED_PERMANENTLY); - } - - return NextResponse.next(); -} diff --git a/packages/web/src/sentry.edge.config.ts b/packages/web/src/sentry.edge.config.ts deleted file mode 100644 index 44f03a63d..000000000 --- a/packages/web/src/sentry.edge.config.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file configures the initialization of Sentry for edge features (middleware, edge routes, and so on). -// The config you add here will be used whenever one of the edge features is loaded. -// Note that this config is unrelated to the Vercel Edge Runtime and is also required when running locally. -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -import * as Sentry from "@sentry/nextjs"; - -const isTracingEnabled = process.env.SENTRY_TRACING_ENABLED === 'true'; - -if (!!process.env.NEXT_PUBLIC_SENTRY_WEBAPP_DSN && !!process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT) { - Sentry.init({ - dsn: process.env.NEXT_PUBLIC_SENTRY_WEBAPP_DSN, - environment: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT, - - ...(isTracingEnabled ? { - tracesSampleRate: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT === 'development' ? 1.0 : 0.1, - } : {}), - - // Setting this option to true will print useful information to the console while you're setting up Sentry. - debug: false, - }); -} else { - console.debug("[edge] Sentry was not initialized"); -} diff --git a/packages/web/src/sentry.server.config.ts b/packages/web/src/sentry.server.config.ts deleted file mode 100644 index bb21c644d..000000000 --- a/packages/web/src/sentry.server.config.ts +++ /dev/null @@ -1,32 +0,0 @@ -// This file configures the initialization of Sentry on the server. -// The config you add here will be used whenever the server handles a request. -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -import * as Sentry from "@sentry/nextjs"; -import { nodeProfilingIntegration } from "@sentry/profiling-node"; -import { createLogger } from "@sourcebot/shared"; - -const logger = createLogger('sentry-server-config'); -const isTracingEnabled = process.env.SENTRY_TRACING_ENABLED === 'true'; -const isProfilingEnabled = isTracingEnabled && process.env.SENTRY_PROFILING_ENABLED === 'true'; - -if (!!process.env.NEXT_PUBLIC_SENTRY_WEBAPP_DSN && !!process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT) { - Sentry.init({ - dsn: process.env.NEXT_PUBLIC_SENTRY_WEBAPP_DSN, - environment: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT, - ...(isTracingEnabled ? { - tracesSampleRate: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT === 'development' ? 1.0 : 0.1, - } : {}), - ...(isProfilingEnabled ? { - integrations: [ - nodeProfilingIntegration(), - ], - // Evaluated once per `Sentry.init()`, i.e. once per server process. - profileSessionSampleRate: 1.0, - // Profile only while a sampled root span is active, rather than continuously. - profileLifecycle: 'trace' as const, - } : {}), - }); -} else { - logger.debug("[server] Sentry was not initialized"); -} diff --git a/packages/web/src/tailwind.ts b/packages/web/src/tailwind.ts deleted file mode 100644 index aafe77704..000000000 --- a/packages/web/src/tailwind.ts +++ /dev/null @@ -1,5 +0,0 @@ -import resolveConfig from 'tailwindcss/resolveConfig'; -import tailwindConfig from '../tailwind.config'; - -const tailwind = resolveConfig(tailwindConfig); -export default tailwind; \ No newline at end of file diff --git a/packages/web/tailwind.config.ts b/packages/web/tailwind.config.ts deleted file mode 100644 index 1bd0cf32c..000000000 --- a/packages/web/tailwind.config.ts +++ /dev/null @@ -1,169 +0,0 @@ -import type { Config } from "tailwindcss" - -const config = { - darkMode: ["class"], - content: [ - './pages/**/*.{ts,tsx}', - './components/**/*.{ts,tsx}', - './app/**/*.{ts,tsx}', - './src/**/*.{ts,tsx}', - ], - prefix: "", - theme: { - container: { - center: true, - padding: '2rem', - screens: { - '2xl': '1400px' - } - }, - extend: { - colors: { - border: 'var(--border)', - input: 'var(--input)', - ring: 'var(--ring)', - background: 'var(--background)', - backgroundSecondary: 'var(--background-secondary)', - foreground: 'var(--foreground)', - primary: { - DEFAULT: 'var(--primary)', - foreground: 'var(--primary-foreground)' - }, - secondary: { - DEFAULT: 'var(--secondary)', - foreground: 'var(--secondary-foreground)' - }, - destructive: { - DEFAULT: 'var(--destructive)', - foreground: 'var(--destructive-foreground)' - }, - muted: { - DEFAULT: 'var(--muted)', - foreground: 'var(--muted-foreground)', - accent: 'var(--muted-accent)' - }, - accent: { - DEFAULT: 'var(--accent)', - foreground: 'var(--accent-foreground)' - }, - popover: { - DEFAULT: 'var(--popover)', - foreground: 'var(--popover-foreground)' - }, - card: { - DEFAULT: 'var(--card)', - foreground: 'var(--card-foreground)' - }, - highlight: 'var(--highlight)', - link: 'var(--link)', - shell: 'var(--shell)', - sidebar: { - DEFAULT: 'var(--sidebar-background)', - foreground: 'var(--sidebar-foreground)', - primary: 'var(--sidebar-primary)', - 'primary-foreground': 'var(--sidebar-primary-foreground)', - accent: 'var(--sidebar-accent)', - 'accent-foreground': 'var(--sidebar-accent-foreground)', - border: 'var(--sidebar-border)', - ring: 'var(--sidebar-ring)' - }, - warning: 'var(--warning)', - error: 'var(--error)', - editor: { - background: 'var(--editor-background)', - foreground: 'var(--editor-foreground)', - caret: 'var(--editor-caret)', - selection: 'var(--editor-selection)', - selectionMatch: 'var(--editor-selection-match)', - gutterBackground: 'var(--editor-gutter-background)', - gutterForeground: 'var(--editor-gutter-foreground)', - gutterBorder: 'var(--editor-gutter-border)', - gutterActiveForeground: 'var(--editor-gutter-active-foreground)', - lineHighlight: 'var(--editor-line-highlight)', - tag: { - keyword: 'var(--editor-tag-keyword)', - name: 'var(--editor-tag-name)', - function: 'var(--editor-tag-function)', - label: 'var(--editor-tag-label)', - constant: 'var(--editor-tag-constant)', - definition: 'var(--editor-tag-definition)', - brace: 'var(--editor-tag-brace)', - type: 'var(--editor-tag-type)', - operator: 'var(--editor-tag-operator)', - tag: 'var(--editor-tag-tag)', - 'bracket-square': 'var(--editor-tag-bracket-square)', - 'bracket-angle': 'var(--editor-tag-bracket-angle)', - attribute: 'var(--editor-tag-attribute)', - string: 'var(--editor-tag-string)', - link: 'var(--editor-tag-link)', - meta: 'var(--editor-tag-meta)', - comment: 'var(--editor-tag-comment)', - emphasis: 'var(--editor-tag-emphasis)', - heading: 'var(--editor-tag-heading)', - atom: 'var(--editor-tag-atom)', - processing: 'var(--editor-tag-processing)', - separator: 'var(--editor-tag-separator)', - invalid: 'var(--editor-tag-invalid)', - quote: 'var(--editor-tag-quote)', - 'annotation-special': 'var(--editor-tag-annotation-special)', - number: 'var(--editor-tag-number)', - regexp: 'var(--editor-tag-regexp)', - 'variable-local': 'var(--editor-tag-variable-local)' - } - }, - chat: { - reference: 'var(--chat-reference)', - 'reference-hover': 'var(--chat-reference-hover)', - 'reference-selected': 'var(--chat-reference-selected)', - 'reference-selected-border': 'var(--chat-reference-selected-border)' - } - }, - fontSize: { - editor: 'var(--editor-font-size)' - }, - fontFamily: { - editor: 'var(--editor-font-family)' - }, - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)' - }, - keyframes: { - 'accordion-down': { - from: { - height: '0' - }, - to: { - height: 'var(--radix-accordion-content-height)' - } - }, - 'accordion-up': { - from: { - height: 'var(--radix-accordion-content-height)' - }, - to: { - height: '0' - } - } - }, - animation: { - 'accordion-down': 'accordion-down 0.2s ease-out', - 'accordion-up': 'accordion-up 0.2s ease-out', - 'spin-slow': 'spin 1.5s linear infinite', - 'bounce-slow': 'bounce 1.5s linear infinite', - 'ping-slow': 'ping 1.5s cubic-bezier(0, 0, 0.2, 1) infinite' - } - } - }, - plugins: [ - // eslint-disable-next-line @typescript-eslint/no-require-imports - require("tailwindcss-animate"), - // eslint-disable-next-line @typescript-eslint/no-require-imports - require('@tailwindcss/typography'), - // eslint-disable-next-line @typescript-eslint/no-require-imports - require('@tailwindcss/container-queries'), - ], -} satisfies Config - -export default config \ No newline at end of file diff --git a/packages/web/tools/decryptJWE.ts b/packages/web/tools/decryptJWE.ts deleted file mode 100644 index a66f8e1d1..000000000 --- a/packages/web/tools/decryptJWE.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { decode } from 'next-auth/jwt'; - -const secret = process.env.AUTH_SECRET; -const token = process.argv[2]; -// Salt is the cookie name used by next-auth (used in key derivation) -const salt = process.argv[3] || 'authjs.session-token'; - -if (!secret) { - console.error('AUTH_SECRET environment variable is required'); - process.exit(1); -} - -if (!token) { - console.error('Usage: yarn tool:decrypt-jwe [cookie-name]'); - console.error(' cookie-name defaults to "authjs.session-token"'); - console.error(' use "__Secure-authjs.session-token" for secure cookies (HTTPS)'); - process.exit(1); -} - -async function decryptJWE() { - const decoded = await decode({ - token, - secret: secret!, - salt, - }); - console.log(JSON.stringify(decoded, null, 2)); -} - -decryptJWE().catch(err => { - console.error('Failed to decrypt JWE:', err.message); - process.exit(1); -}); \ No newline at end of file diff --git a/packages/web/tools/eslint-plugin-local/index.mjs b/packages/web/tools/eslint-plugin-local/index.mjs deleted file mode 100644 index 903889b67..000000000 --- a/packages/web/tools/eslint-plugin-local/index.mjs +++ /dev/null @@ -1,12 +0,0 @@ -import requireAuthWrapper from './rules/requireAuthWrapper.mjs'; - -const plugin = { - meta: { - name: 'eslint-plugin-authz-local', - }, - rules: { - 'require-auth-wrapper': requireAuthWrapper, - }, -}; - -export default plugin; diff --git a/packages/web/tools/eslint-plugin-local/rules/requireAuthWrapper.mjs b/packages/web/tools/eslint-plugin-local/rules/requireAuthWrapper.mjs deleted file mode 100644 index 13f6073dc..000000000 --- a/packages/web/tools/eslint-plugin-local/rules/requireAuthWrapper.mjs +++ /dev/null @@ -1,251 +0,0 @@ -// ESLint rule: authz/require-auth-wrapper -// -// Flags API route handlers and server-action exports that don't textually -// reference one of the recognized auth wrappers (`withAuth(` or -// `withOptionalAuth(`) inside the exported function body. This is a -// boundary-only check — it does not trace through helper functions. If a -// handler legitimately delegates auth into a helper, suppress with: -// -// // eslint-disable-next-line authz/require-auth-wrapper -- -// -// `withMinimumOrgRole` is intentionally NOT recognized — it nests inside -// `withAuth` and means nothing on its own. - -const HTTP_METHODS = new Set(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS']); -const AUTH_PATTERN = /\b(?:withAuth|withOptionalAuth)\s*\(/; -const USE_SERVER = 'use server'; - -const isStringLiteral = (node) => - node?.type === 'Literal' && typeof node.value === 'string'; - -const isUseServerDirective = (stmt) => - stmt?.type === 'ExpressionStatement' && - isStringLiteral(stmt.expression) && - stmt.expression.value === USE_SERVER; - -const hasUseServerInDirectivePrologue = (statements) => { - if (!statements) { - return false; - } - for (const stmt of statements) { - if (isUseServerDirective(stmt)) { - return true; - } - const isDirective = - stmt.type === 'ExpressionStatement' && isStringLiteral(stmt.expression); - if (!isDirective) { - return false; - } - } - return false; -}; - -const getFunctionBody = (node) => { - if (!node) { - return null; - } - if ( - node.type === 'FunctionExpression' || - node.type === 'ArrowFunctionExpression' || - node.type === 'FunctionDeclaration' - ) { - return node.body; - } - return null; -}; - -/** @type {import('eslint').Rule.RuleModule} */ -const rule = { - meta: { - type: 'problem', - docs: { - description: - 'Require an auth wrapper (withAuth / withOptionalAuth) on API route handlers and server actions', - }, - schema: [], - messages: { - missingWrapperRoute: - 'Route handler "{{ name }}" must call withAuth() or withOptionalAuth() in its body. ' + - 'withMinimumOrgRole alone is not sufficient. If this endpoint is intentionally public, ' + - 'suppress with: // eslint-disable-next-line authz/require-auth-wrapper -- . ' + - 'Example: export const GET = apiHandler(async (req) => withAuth(async ({ user, prisma }) => { ... }));', - missingWrapperAction: - 'Server action "{{ name }}" must call withAuth() or withOptionalAuth() in its body. ' + - 'If this action is intentionally public, suppress with: ' + - '// eslint-disable-next-line authz/require-auth-wrapper -- . ' + - 'Example: export const foo = async () => sew(() => withAuth(async ({ user }) => { ... }));', - }, - }, - - create(context) { - const filename = - (typeof context.filename === 'string' ? context.filename : null) ?? - (typeof context.getFilename === 'function' ? context.getFilename() : ''); - const sourceCode = context.sourceCode ?? context.getSourceCode(); - - const normalized = filename.replace(/\\/g, '/'); - const isRouteFile = /\/app\/api\/.*\/route\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(normalized); - - const program = sourceCode.ast; - const fileLevelUseServer = hasUseServerInDirectivePrologue(program.body); - - // Bail early on files that can't possibly host a route or action. - if ( - !isRouteFile && - !fileLevelUseServer && - !sourceCode.text.includes(USE_SERVER) - ) { - return {}; - } - - const functionLevelUseServer = (fnBody) => { - if (!fnBody || fnBody.type !== 'BlockStatement') { - return false; - } - return hasUseServerInDirectivePrologue(fnBody.body); - }; - - // Resolve a local name (used by `export { handler as GET }`) to the text - // of its initializer / declaration so we can grep it for the wrapper. - const findLocalDeclarationText = (localName) => { - for (const stmt of program.body) { - if (stmt.type === 'VariableDeclaration') { - for (const decl of stmt.declarations) { - if (decl.id.type === 'Identifier' && decl.id.name === localName && decl.init) { - return sourceCode.getText(decl.init); - } - } - } else if ( - stmt.type === 'FunctionDeclaration' && - stmt.id?.name === localName - ) { - return sourceCode.getText(stmt); - } else if ( - stmt.type === 'ExportNamedDeclaration' && - stmt.declaration?.type === 'VariableDeclaration' - ) { - for (const decl of stmt.declaration.declarations) { - if (decl.id.type === 'Identifier' && decl.id.name === localName && decl.init) { - return sourceCode.getText(decl.init); - } - } - } else if ( - stmt.type === 'ExportNamedDeclaration' && - stmt.declaration?.type === 'FunctionDeclaration' && - stmt.declaration.id?.name === localName - ) { - return sourceCode.getText(stmt.declaration); - } - } - return null; - }; - - const reportIfMissing = (reportNode, name, bodyText, kind) => { - if (bodyText && AUTH_PATTERN.test(bodyText)) { - return; - } - context.report({ - node: reportNode, - messageId: kind === 'route' ? 'missingWrapperRoute' : 'missingWrapperAction', - data: { name }, - }); - }; - - const classifyExport = (name, valueNode) => { - if (isRouteFile && HTTP_METHODS.has(name)) { - return 'route'; - } - if (fileLevelUseServer) { - return 'action'; - } - const body = getFunctionBody(valueNode); - if (body && functionLevelUseServer(body)) { - return 'action'; - } - return null; - }; - - return { - ExportNamedDeclaration(node) { - // export const X = ..., export async function X() {} - if (node.declaration?.type === 'VariableDeclaration') { - for (const declarator of node.declaration.declarations) { - if (declarator.id.type === 'Identifier') { - const name = declarator.id.name; - const kind = classifyExport(name, declarator.init); - if (!kind) { - continue; - } - const text = declarator.init - ? sourceCode.getText(declarator.init) - : ''; - reportIfMissing(node, name, text, kind); - } else if (declarator.id.type === 'ObjectPattern') { - // export const { GET, POST } = handlers; - const initText = declarator.init - ? sourceCode.getText(declarator.init) - : ''; - for (const prop of declarator.id.properties) { - if ( - prop.type !== 'Property' || - prop.key.type !== 'Identifier' - ) { - continue; - } - const name = prop.key.name; - const kind = classifyExport(name, declarator.init); - if (!kind) { - continue; - } - reportIfMissing(node, name, initText, kind); - } - } - } - return; - } - - if (node.declaration?.type === 'FunctionDeclaration') { - const id = node.declaration.id; - if (!id) { - return; - } - const kind = classifyExport(id.name, node.declaration); - if (!kind) { - return; - } - const text = sourceCode.getText(node.declaration); - reportIfMissing(node, id.name, text, kind); - return; - } - - // export { handler as GET, ... } - if (node.specifiers?.length && !node.source) { - for (const specifier of node.specifiers) { - if (specifier.type !== 'ExportSpecifier') { - continue; - } - const exportedName = - specifier.exported.type === 'Identifier' - ? specifier.exported.name - : null; - const localName = - specifier.local.type === 'Identifier' - ? specifier.local.name - : null; - if (!exportedName || !localName) { - continue; - } - const kind = classifyExport(exportedName, null); - if (!kind) { - continue; - } - const localText = findLocalDeclarationText(localName) ?? ''; - reportIfMissing(specifier, exportedName, localText, kind); - } - } - }, - }; - }, -}; - -export default rule; diff --git a/packages/web/tools/eslint-plugin-local/rules/requireAuthWrapper.test.mjs b/packages/web/tools/eslint-plugin-local/rules/requireAuthWrapper.test.mjs deleted file mode 100644 index 46c5d01ec..000000000 --- a/packages/web/tools/eslint-plugin-local/rules/requireAuthWrapper.test.mjs +++ /dev/null @@ -1,193 +0,0 @@ -import { describe, it } from 'vitest'; -import { RuleTester } from 'eslint'; -import tsParser from '@typescript-eslint/parser'; -import rule from './requireAuthWrapper.mjs'; - -const ROUTE_FILE = '/repo/packages/web/src/app/api/something/route.ts'; -const ACTION_FILE = '/repo/packages/web/src/features/example/actions.ts'; -const PLAIN_TS_FILE = '/repo/packages/web/src/lib/utils.ts'; - -const ruleTester = new RuleTester({ - languageOptions: { - parser: tsParser, - ecmaVersion: 2022, - sourceType: 'module', - }, -}); - -describe('authz/require-auth-wrapper', () => { - it('runs the rule against fixtures', () => { - ruleTester.run('require-auth-wrapper', rule, { - valid: [ - // 1. Route handler with withAuth → pass - { - filename: ROUTE_FILE, - code: ` - import { withAuth } from '@/middleware/withAuth'; - export const GET = async () => { - return withAuth(async ({ user }) => ({ id: user.id })); - }; - `, - }, - // 2. Route handler with withOptionalAuth → pass - { - filename: ROUTE_FILE, - code: ` - import { withOptionalAuth } from '@/middleware/withAuth'; - export const POST = async (req) => { - return withOptionalAuth(async ({ org }) => ({ orgId: org.id })); - }; - `, - }, - // 5. Route handler with allowlist comment → pass - // RuleTester prefixes the rule ID with `rule-to-test/`; in real - // usage the directive would be `authz/require-auth-wrapper`. - { - filename: ROUTE_FILE, - code: ` - // eslint-disable-next-line rule-to-test/require-auth-wrapper -- public health check - export const GET = async () => new Response('ok'); - `, - }, - // 6. Server action with withAuth → pass - { - filename: ACTION_FILE, - code: ` - 'use server'; - import { withAuth } from '@/middleware/withAuth'; - export const doThing = async () => withAuth(async ({ user }) => user.id); - `, - }, - // 8. Non-route, non-action TS file → not checked - { - filename: PLAIN_TS_FILE, - code: ` - export const helper = () => 42; - export function noop() { return null; } - `, - }, - // Per-function 'use server' WITH withAuth → pass - { - filename: PLAIN_TS_FILE, - code: ` - import { withAuth } from '@/middleware/withAuth'; - export const action = async () => { - 'use server'; - return withAuth(async ({ user }) => user.id); - }; - `, - }, - // Route handler wrapped in apiHandler with nested withAuth → pass - { - filename: ROUTE_FILE, - code: ` - import { apiHandler } from '@/lib/apiHandler'; - import { withAuth } from '@/middleware/withAuth'; - export const PATCH = apiHandler(async (req) => - withAuth(async ({ prisma }) => prisma.user.findMany()) - ); - `, - }, - // 'use server' file with a const that is not exported and is not a function → not flagged - { - filename: ACTION_FILE, - code: ` - 'use server'; - const PRIVATE_CONSTANT = 'foo'; - export const myAction = async () => { - const { withAuth } = await import('@/middleware/withAuth'); - return withAuth(async () => null); - }; - `, - }, - ], - invalid: [ - // 3. Route handler with neither → fail - { - filename: ROUTE_FILE, - code: ` - export const GET = async () => new Response('hello'); - `, - errors: [{ messageId: 'missingWrapperRoute', data: { name: 'GET' } }], - }, - // 4. Route handler with only withMinimumOrgRole (no withAuth) → fail - { - filename: ROUTE_FILE, - code: ` - import { withMinimumOrgRole } from '@/middleware/withMinimumOrgRole'; - export const DELETE = async ({ role }) => - withMinimumOrgRole(role, 'OWNER', async () => null); - `, - errors: [{ messageId: 'missingWrapperRoute', data: { name: 'DELETE' } }], - }, - // 7. Server action without withAuth → fail - { - filename: ACTION_FILE, - code: ` - 'use server'; - export const leakyAction = async () => { - return { everything: 'about everyone' }; - }; - `, - errors: [{ messageId: 'missingWrapperAction', data: { name: 'leakyAction' } }], - }, - // Per-function 'use server' without withAuth → fail - { - filename: PLAIN_TS_FILE, - code: ` - export const action = async () => { - 'use server'; - return { data: 'leak' }; - }; - `, - errors: [{ messageId: 'missingWrapperAction', data: { name: 'action' } }], - }, - // export const { GET, POST } = handlers — both flagged - { - filename: ROUTE_FILE, - code: ` - import { handlers } from '@/auth'; - export const { GET, POST } = handlers; - `, - errors: [ - { messageId: 'missingWrapperRoute', data: { name: 'GET' } }, - { messageId: 'missingWrapperRoute', data: { name: 'POST' } }, - ], - }, - // export { handler as GET, handler as POST } — both flagged when local does not call withAuth - { - filename: ROUTE_FILE, - code: ` - const handler = () => new Response(null, { status: 404 }); - export { handler as GET, handler as POST }; - `, - errors: [ - { messageId: 'missingWrapperRoute', data: { name: 'GET' } }, - { messageId: 'missingWrapperRoute', data: { name: 'POST' } }, - ], - }, - // exported function declaration in a 'use server' file → fail - { - filename: ACTION_FILE, - code: ` - 'use server'; - export async function fetchSecret() { - return 'secret'; - } - `, - errors: [{ messageId: 'missingWrapperAction', data: { name: 'fetchSecret' } }], - }, - // withAuth appears outside the export body (sibling helper) → fail - { - filename: ROUTE_FILE, - code: ` - import { withAuth } from '@/middleware/withAuth'; - const _unused = () => withAuth(async () => null); - export const GET = async () => new Response('leak'); - `, - errors: [{ messageId: 'missingWrapperRoute', data: { name: 'GET' } }], - }, - ], - }); - }); -}); diff --git a/packages/web/tools/generateOpenApi.ts b/packages/web/tools/generateOpenApi.ts deleted file mode 100644 index d71497a18..000000000 --- a/packages/web/tools/generateOpenApi.ts +++ /dev/null @@ -1,24 +0,0 @@ -import fs from 'node:fs/promises'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { SOURCEBOT_VERSION } from '../../shared/src/version.js'; -import { createPublicOpenApiDocument } from '../src/openapi/publicApiDocument.js'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const repoRoot = path.resolve(__dirname, '../../..'); -const outputPath = path.join(repoRoot, 'docs', 'api-reference', 'sourcebot-public.openapi.json'); - -async function main() { - const document = createPublicOpenApiDocument(SOURCEBOT_VERSION); - - await fs.mkdir(path.dirname(outputPath), { recursive: true }); - await fs.writeFile(outputPath, `${JSON.stringify(document, null, 2)}\n`, 'utf8'); - - process.stdout.write(`Wrote OpenAPI spec to ${outputPath}\n`); -} - -main().catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/packages/web/tools/globToRegexpPlayground.ts b/packages/web/tools/globToRegexpPlayground.ts deleted file mode 100644 index a3c2ce9f9..000000000 --- a/packages/web/tools/globToRegexpPlayground.ts +++ /dev/null @@ -1,111 +0,0 @@ -import globToRegexp from 'glob-to-regexp'; -import escapeStringRegexp from 'escape-string-regexp'; - -// ------------------------------------------------------- -// Playground for building Sourcebot/zoekt search queries -// from grep-style (pattern, path, include) inputs. -// -// Run with: yarn workspace @sourcebot/web tsx tools/globToRegexpPlayground.ts -// ------------------------------------------------------- - -interface SearchInput { - pattern: string; // content search term or regex - path?: string; // directory prefix, e.g. "packages/web/src" - include?: string; // glob for filenames, e.g. "*.ts" or "**/*.{ts,tsx}" -} - -function globToFileRegexp(glob: string): string { - const re = globToRegexp(glob, { extended: true, globstar: true }); - // Strip ^ anchor — Sourcebot file paths include the full repo-relative path, - // so the pattern shouldn't be anchored to the start. - return re.source.replace(/^\^/, ''); -} - -function buildRipgrepCommand({ pattern, path, include }: SearchInput): string { - const parts = ['rg', `"${pattern.replace(/"/g, '\\"')}"`]; - if (path) parts.push(path); - if (include) parts.push(`--glob "${include}"`); - return parts.join(' '); -} - -function buildZoektQuery({ pattern, path, include }: SearchInput): string { - const parts: string[] = [`"${pattern.replace(/"/g, '\\"')}"`]; - - if (path) { - parts.push(`file:${escapeStringRegexp(path)}`); - } - - if (include) { - parts.push(`file:${globToFileRegexp(include)}`); - } - - return parts.join(' '); -} - -// ------------------------------------------------------- -// Examples -// ------------------------------------------------------- - -const examples: SearchInput[] = [ - // Broad content search, no file scoping - { pattern: 'isServiceError' }, - - // Scoped to a directory - { pattern: 'isServiceError', path: 'packages/web/src' }, - - // Scoped to a file type - { pattern: 'isServiceError', include: '*.ts' }, - - // Scoped to both - { pattern: 'isServiceError', path: 'packages/web/src', include: '*.ts' }, - - // Multiple extensions via glob - { pattern: 'useQuery', include: '**/*.{ts,tsx}' }, - - // Test files only - { pattern: 'expect\\(', include: '*.test.ts' }, - - // Specific subdirectory + extension - { pattern: 'withAuth', path: 'packages/web/src/app', include: '**/*.ts' }, - - // Next.js route group — parens in path are regex special chars - { pattern: 'withAuth', path: 'packages/web/src/app/api/(server)', include: '**/*.ts' }, - - // Next.js dynamic segment — brackets in path are regex special chars - { pattern: 'withOptionalAuth', path: 'packages/web/src/app/[domain]', include: '**/*.ts' }, - - // Pattern with spaces — must be quoted in zoekt query - { pattern: 'Starting scheduler', include: '**/*.ts' }, - - // Literal phrase in a txt file - { pattern: String.raw`"hello world"`, include: '**/*.txt' }, - - // Pattern with a quote character - { pattern: 'from "@/lib', include: '**/*.ts' }, - - // Pattern with a backslash — needs double-escaping in zoekt quoted terms - { pattern: String.raw`C:\\\\Windows\\\\System32`, include: '**/*.ts' }, -]; - -function truncate(str: string, width: number): string { - return str.length > width ? str.slice(0, width - 3) + '...' : str.padEnd(width); -} - -const col1 = 70; -const col2 = 75; -console.log(truncate('input', col1) + truncate('ripgrep', col2) + 'zoekt query'); -console.log('-'.repeat(col1 + col2 + 50)); - -function prettyPrint(example: SearchInput): string { - const fields = Object.entries(example) - .map(([k, v]) => `${k}: '${v}'`) - .join(', '); - return `{ ${fields} }`; -} - -for (const example of examples) { - const input = prettyPrint(example); - const rg = buildRipgrepCommand(example); - const zoekt = buildZoektQuery(example); - console.log(truncate(input, col1) + rg.padEnd(col2) + zoekt); -} diff --git a/packages/web/tools/oauthFlow.ts b/packages/web/tools/oauthFlow.ts deleted file mode 100644 index fc593a17c..000000000 --- a/packages/web/tools/oauthFlow.ts +++ /dev/null @@ -1,496 +0,0 @@ -import { createHash, randomBytes } from 'crypto'; -import { createServer, type ServerResponse } from 'http'; -import { spawn } from 'child_process'; - -type Options = { - baseUrl: string; - scopes: string[]; - resource: string | null; - callbackHost: string; - callbackPort: number; - clientId?: string; - clientName: string; - openBrowser: boolean; - timeoutMs: number; - tokenOnly: boolean; -}; - -type TokenResponse = { - access_token?: string; - refresh_token?: string; - token_type?: string; - expires_in?: number; - scope?: string; - error?: string; - error_description?: string; - [key: string]: unknown; -}; - -const DEFAULT_BASE_URL = process.env.AUTH_URL || 'http://localhost:3000'; -const DEFAULT_CALLBACK_HOST = '127.0.0.1'; -const DEFAULT_CALLBACK_PORT = 53682; -const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; - -function usage(): string { - return [ - 'Usage: yarn workspace @sourcebot/web tool:oauth-flow [options]', - '', - 'Options:', - ` --base-url Sourcebot URL. Defaults to AUTH_URL or ${DEFAULT_BASE_URL}`, - ' --scope OAuth scope to request. Can be repeated.', - ' --scopes Space-delimited OAuth scopes to request.', - ' --resource Resource parameter. Defaults to /api/mcp.', - ' --no-resource Do not send a resource parameter.', - ` --callback-host Callback host. Defaults to ${DEFAULT_CALLBACK_HOST}.`, - ` --port Callback port. Defaults to ${DEFAULT_CALLBACK_PORT}. Use 0 for random.`, - ' --client-id Use an existing OAuth client instead of dynamic registration.', - ' --client-name Dynamic client name. Defaults to "Sourcebot OAuth CLI".', - ' --no-open Print the authorization URL without opening a browser.', - ' --timeout-ms Callback wait timeout.', - ' --token-only Print only the access token.', - ' --help Show this help text.', - '', - 'Examples:', - ' yarn workspace @sourcebot/web tool:oauth-flow --scope mcp:read', - ' yarn workspace @sourcebot/web tool:oauth-flow --scopes "mcp:read mcp:ask" --token-only', - ' yarn workspace @sourcebot/web tool:oauth-flow --base-url http://localhost:3000 --no-open', - ].join('\n'); -} - -function parseArgs(argv: string[]): Options { - const options: Options = { - baseUrl: stripTrailingSlash(DEFAULT_BASE_URL), - scopes: [], - resource: 'default', - callbackHost: DEFAULT_CALLBACK_HOST, - callbackPort: DEFAULT_CALLBACK_PORT, - clientName: 'Sourcebot OAuth CLI', - openBrowser: true, - timeoutMs: DEFAULT_TIMEOUT_MS, - tokenOnly: false, - } as Options; - - for (let i = 0; i < argv.length; i++) { - const arg = argv[i]; - const next = () => { - const value = argv[++i]; - if (!value) { - throw new Error(`Missing value for ${arg}`); - } - return value; - }; - - switch (arg) { - case '--base-url': - options.baseUrl = stripTrailingSlash(next()); - break; - case '--scope': - options.scopes.push(next()); - break; - case '--scopes': - options.scopes.push(...splitScopes(next())); - break; - case '--resource': - options.resource = next(); - break; - case '--no-resource': - options.resource = null; - break; - case '--callback-host': - options.callbackHost = next(); - break; - case '--port': - options.callbackPort = parseInteger(next(), '--port'); - break; - case '--client-id': - options.clientId = next(); - break; - case '--client-name': - options.clientName = next(); - break; - case '--no-open': - options.openBrowser = false; - break; - case '--timeout-ms': - options.timeoutMs = parseInteger(next(), '--timeout-ms'); - break; - case '--token-only': - options.tokenOnly = true; - break; - case '--help': - case '-h': - console.log(usage()); - process.exit(0); - default: - throw new Error(`Unknown argument: ${arg}\n\n${usage()}`); - } - } - - options.scopes = [...new Set(options.scopes.map((scope) => scope.trim()).filter(Boolean))]; - if (options.resource === 'default') { - options.resource = `${options.baseUrl}/api/mcp`; - } - - return options; -} - -function splitScopes(value: string): string[] { - return value.split(/\s+/).map((scope) => scope.trim()).filter(Boolean); -} - -function parseInteger(value: string, flag: string): number { - const parsed = Number.parseInt(value, 10); - if (!Number.isFinite(parsed) || parsed < 0) { - throw new Error(`${flag} must be a non-negative integer.`); - } - return parsed; -} - -function stripTrailingSlash(value: string): string { - return value.replace(/\/$/, ''); -} - -function base64UrlSha256(value: string): string { - return createHash('sha256').update(value).digest('base64url'); -} - -function randomUrlSafeString(bytes = 32): string { - return randomBytes(bytes).toString('base64url'); -} - -async function registerClient({ - baseUrl, - clientName, - redirectUri, -}: { - baseUrl: string; - clientName: string; - redirectUri: string; -}): Promise { - const response = await fetch(`${baseUrl}/api/ee/oauth/register`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - client_name: clientName, - redirect_uris: [redirectUri], - }), - }); - - const body = await readJson(response); - if (!response.ok) { - throw new Error(`Dynamic client registration failed (${response.status}): ${JSON.stringify(body)}`); - } - - const clientId = body.client_id; - if (typeof clientId !== 'string') { - throw new Error(`Dynamic client registration response did not include client_id: ${JSON.stringify(body)}`); - } - - return clientId; -} - -function startCallbackServer({ - host, - port, - expectedState, - timeoutMs, -}: { - host: string; - port: number; - expectedState: string; - timeoutMs: number; -}): Promise<{ redirectUri: string; codePromise: Promise; close: () => Promise }> { - let settled = false; - let resolveCode: (code: string) => void; - let rejectCode: (error: Error) => void; - const codePromise = new Promise((resolve, reject) => { - resolveCode = resolve; - rejectCode = reject; - }); - - const settleSuccess = (code: string, response: ServerResponse) => { - if (settled) { - return; - } - settled = true; - clearTimeout(timeout); - resolveCode(code); - writeHtml(response, 200, 'Authorization complete. You can close this tab and return to the terminal.'); - }; - - const settleError = (error: Error, response?: ServerResponse) => { - if (settled) { - return; - } - settled = true; - clearTimeout(timeout); - rejectCode(error); - if (response) { - writeHtml(response, 400, 'Authorization failed. You can close this tab and return to the terminal.'); - } - }; - - const server = createServer((request, response) => { - const requestUrl = new URL(request.url ?? '/', `http://${request.headers.host ?? `${host}:${port}`}`); - if (requestUrl.pathname !== '/callback') { - response.writeHead(404, { 'Content-Type': 'text/plain' }); - response.end('Not found'); - return; - } - - const error = requestUrl.searchParams.get('error'); - const errorDescription = requestUrl.searchParams.get('error_description'); - if (error) { - const message = errorDescription ? `${error}: ${errorDescription}` : error; - settleError(new Error(`Authorization failed: ${message}`), response); - return; - } - - const state = requestUrl.searchParams.get('state'); - if (state !== expectedState) { - settleError(new Error('Authorization callback state did not match.'), response); - return; - } - - const code = requestUrl.searchParams.get('code'); - if (!code) { - settleError(new Error('Authorization callback did not include a code.'), response); - return; - } - - settleSuccess(code, response); - }); - - const timeout = setTimeout(() => { - settleError(new Error(`Timed out after ${timeoutMs}ms waiting for OAuth callback.`)); - void closeServer(server); - }, timeoutMs); - - return new Promise((resolve, reject) => { - server.once('error', reject); - server.listen(port, host, () => { - server.off('error', reject); - const address = server.address(); - const actualPort = typeof address === 'object' && address ? address.port : port; - resolve({ - redirectUri: `http://${host}:${actualPort}/callback`, - codePromise: codePromise.finally(() => closeServer(server)), - close: () => closeServer(server), - }); - }); - }); -} - -function writeHtml(response: ServerResponse, status: number, message: string): void { - response.writeHead(status, { 'Content-Type': 'text/html; charset=utf-8' }); - response.end(`Sourcebot OAuth

${escapeHtml(message)}

`); -} - -function escapeHtml(value: string): string { - return value - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, '''); -} - -async function exchangeCode({ - baseUrl, - clientId, - redirectUri, - code, - codeVerifier, - resource, -}: { - baseUrl: string; - clientId: string; - redirectUri: string; - code: string; - codeVerifier: string; - resource: string | null; -}): Promise { - const formData = new URLSearchParams({ - grant_type: 'authorization_code', - client_id: clientId, - redirect_uri: redirectUri, - code, - code_verifier: codeVerifier, - }); - - if (resource) { - formData.set('resource', resource); - } - - const response = await fetch(`${baseUrl}/api/ee/oauth/token`, { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - }, - body: formData, - }); - - const body = await readJson(response) as TokenResponse; - if (!response.ok) { - throw new Error(`Token exchange failed (${response.status}): ${JSON.stringify(body)}`); - } - - return body; -} - -async function readJson(response: Response): Promise> { - const text = await response.text(); - if (!text) { - return {}; - } - - try { - return JSON.parse(text) as Record; - } catch { - throw new Error(`Expected JSON response from ${response.url}, got: ${text}`); - } -} - -function buildAuthorizeUrl({ - baseUrl, - clientId, - redirectUri, - codeChallenge, - state, - scopes, - resource, -}: { - baseUrl: string; - clientId: string; - redirectUri: string; - codeChallenge: string; - state: string; - scopes: string[]; - resource: string | null; -}): string { - const authorizeUrl = new URL(`${baseUrl}/oauth/authorize`); - authorizeUrl.searchParams.set('client_id', clientId); - authorizeUrl.searchParams.set('redirect_uri', redirectUri); - authorizeUrl.searchParams.set('response_type', 'code'); - authorizeUrl.searchParams.set('code_challenge', codeChallenge); - authorizeUrl.searchParams.set('code_challenge_method', 'S256'); - authorizeUrl.searchParams.set('state', state); - - if (scopes.length > 0) { - authorizeUrl.searchParams.set('scope', scopes.join(' ')); - } - - if (resource) { - authorizeUrl.searchParams.set('resource', resource); - } - - return authorizeUrl.toString(); -} - -function openBrowser(url: string): void { - const command = process.platform === 'darwin' - ? 'open' - : process.platform === 'win32' - ? 'cmd' - : 'xdg-open'; - const args = process.platform === 'win32' - ? ['/c', 'start', '', url] - : [url]; - - const child = spawn(command, args, { - detached: true, - stdio: 'ignore', - }); - child.unref(); -} - -async function closeServer(server: ReturnType): Promise { - if (!server.listening) { - return; - } - - await new Promise((resolve, reject) => { - server.close((error) => { - if (error) { - reject(error); - return; - } - resolve(); - }); - }); -} - -async function main(): Promise { - const options = parseArgs(process.argv.slice(2)); - const state = randomUrlSafeString(24); - const codeVerifier = randomUrlSafeString(32); - const codeChallenge = base64UrlSha256(codeVerifier); - - const callbackServer = await startCallbackServer({ - host: options.callbackHost, - port: options.callbackPort, - expectedState: state, - timeoutMs: options.timeoutMs, - }); - - try { - const clientId = options.clientId ?? await registerClient({ - baseUrl: options.baseUrl, - clientName: options.clientName, - redirectUri: callbackServer.redirectUri, - }); - - const authorizeUrl = buildAuthorizeUrl({ - baseUrl: options.baseUrl, - clientId, - redirectUri: callbackServer.redirectUri, - codeChallenge, - state, - scopes: options.scopes, - resource: options.resource, - }); - - console.error(`Registered client: ${clientId}`); - console.error(`Redirect URI: ${callbackServer.redirectUri}`); - console.error(`Scopes: ${options.scopes.length > 0 ? options.scopes.join(' ') : '(none requested)'}`); - console.error(`Resource: ${options.resource ?? '(none requested)'}`); - console.error(`Authorization URL:\n${authorizeUrl}\n`); - - if (options.openBrowser) { - openBrowser(authorizeUrl); - console.error('Opened authorization URL in your browser.'); - } - - console.error('Waiting for OAuth callback...'); - const code = await callbackServer.codePromise; - console.error('Received authorization code. Exchanging for token...'); - - const tokenResponse = await exchangeCode({ - baseUrl: options.baseUrl, - clientId, - redirectUri: callbackServer.redirectUri, - code, - codeVerifier, - resource: options.resource, - }); - - if (options.tokenOnly) { - if (!tokenResponse.access_token) { - throw new Error(`Token response did not include access_token: ${JSON.stringify(tokenResponse)}`); - } - console.log(tokenResponse.access_token); - return; - } - - console.log(JSON.stringify(tokenResponse, null, 2)); - } finally { - await callbackServer.close(); - } -} - -main().catch((error) => { - console.error(error instanceof Error ? error.message : error); - process.exit(1); -}); diff --git a/packages/web/tools/provisionScimUsers.ts b/packages/web/tools/provisionScimUsers.ts deleted file mode 100644 index c53d522b5..000000000 --- a/packages/web/tools/provisionScimUsers.ts +++ /dev/null @@ -1,324 +0,0 @@ -type Args = { - baseUrl?: string; - token?: string; - count: number; - concurrency: number; - start: number; - prefix: string; - domain: string; - externalIdPrefix: string; - active: boolean; - timeoutMs: number; - progressEvery: number; - dryRun: boolean; - allowFailures: boolean; -}; - -type Result = { - index: number; - email: string; - ok: boolean; - status?: number; - body?: string; - error?: string; -}; - -const DEFAULT_COUNT = 5_000; -const DEFAULT_CONCURRENCY = 25; -const DEFAULT_TIMEOUT_MS = 30_000; - -const usage = `Usage: - yarn tool:scim-provision --base-url http://localhost:3000/scim/v2 --token [options] - -Environment fallbacks: - SCIM_BASE_URL, SCIM_TOKEN - -Options: - --count Users to provision. Default: ${DEFAULT_COUNT} - --concurrency Concurrent POST requests. Default: ${DEFAULT_CONCURRENCY} - --start First numeric suffix. Default: 1 - --prefix Email/display-name prefix. Default: scim-load- - --domain Email domain. Default: example.com - --external-id-prefix External ID prefix. Default: same as --prefix - --active SCIM active value. Default: true - --timeout-ms Per-request timeout. Default: ${DEFAULT_TIMEOUT_MS} - --progress-every Log progress every N users. Default: 100 - --dry-run Print the first payload and exit without sending - --allow-failures Exit 0 even when some requests fail - --help Show this help -`; - -const parsePositiveInt = (value: string | undefined, name: string): number => { - const parsed = Number(value); - if (!Number.isInteger(parsed) || parsed <= 0) { - throw new Error(`${name} must be a positive integer`); - } - return parsed; -}; - -const parseBoolean = (value: string | undefined, name: string): boolean => { - if (value === "true") { - return true; - } - if (value === "false") { - return false; - } - throw new Error(`${name} must be true or false`); -}; - -const takeValue = (argv: string[], index: number, name: string): string => { - const value = argv[index + 1]; - if (!value || value.startsWith("--")) { - throw new Error(`${name} requires a value`); - } - return value; -}; - -const parseArgs = (): Args => { - const runId = new Date().toISOString().replace(/[-:.TZ]/g, "").slice(0, 14); - const args: Args = { - baseUrl: process.env.SCIM_BASE_URL, - token: process.env.SCIM_TOKEN, - count: DEFAULT_COUNT, - concurrency: DEFAULT_CONCURRENCY, - start: 1, - prefix: `scim-load-${runId}`, - domain: "example.com", - externalIdPrefix: "", - active: true, - timeoutMs: DEFAULT_TIMEOUT_MS, - progressEvery: 100, - dryRun: false, - allowFailures: false, - }; - - const argv = process.argv.slice(2); - for (let i = 0; i < argv.length; i++) { - const arg = argv[i]; - switch (arg) { - case "--help": - case "-h": - process.stdout.write(usage); - process.exit(0); - case "--base-url": - args.baseUrl = takeValue(argv, i, arg); - i++; - break; - case "--token": - args.token = takeValue(argv, i, arg); - i++; - break; - case "--count": - args.count = parsePositiveInt(takeValue(argv, i, arg), arg); - i++; - break; - case "--concurrency": - args.concurrency = parsePositiveInt(takeValue(argv, i, arg), arg); - i++; - break; - case "--start": - args.start = parsePositiveInt(takeValue(argv, i, arg), arg); - i++; - break; - case "--prefix": - args.prefix = takeValue(argv, i, arg); - i++; - break; - case "--domain": - args.domain = takeValue(argv, i, arg); - i++; - break; - case "--external-id-prefix": - args.externalIdPrefix = takeValue(argv, i, arg); - i++; - break; - case "--active": - args.active = parseBoolean(takeValue(argv, i, arg), arg); - i++; - break; - case "--timeout-ms": - args.timeoutMs = parsePositiveInt(takeValue(argv, i, arg), arg); - i++; - break; - case "--progress-every": - args.progressEvery = parsePositiveInt(takeValue(argv, i, arg), arg); - i++; - break; - case "--dry-run": - args.dryRun = true; - break; - case "--allow-failures": - args.allowFailures = true; - break; - default: - throw new Error(`Unknown option: ${arg}`); - } - } - - args.externalIdPrefix ||= args.prefix; - - if (!args.baseUrl) { - throw new Error("--base-url or SCIM_BASE_URL is required"); - } - if (!args.token && !args.dryRun) { - throw new Error("--token or SCIM_TOKEN is required"); - } - - return args; -}; - -const buildScimUser = (args: Args, index: number) => { - const suffix = String(index).padStart(String(args.start + args.count - 1).length, "0"); - const email = `${args.prefix}-${suffix}@${args.domain}`.toLowerCase(); - const displayName = `${args.prefix} ${suffix}`; - - return { - email, - payload: { - schemas: ["urn:ietf:params:scim:schemas:core:2.0:User"], - userName: email, - externalId: `${args.externalIdPrefix}-${suffix}`, - name: { - givenName: args.prefix, - familyName: suffix, - formatted: displayName, - }, - displayName, - emails: [ - { - value: email, - primary: true, - type: "work", - }, - ], - active: args.active, - }, - }; -}; - -const readResponseBody = async (response: Response): Promise => { - const text = await response.text().catch(() => ""); - if (text.length <= 500) { - return text; - } - return `${text.slice(0, 500)}...`; -}; - -const provisionUser = async (args: Args, index: number, usersUrl: string): Promise => { - const { email, payload } = buildScimUser(args, index); - const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), args.timeoutMs); - - try { - const response = await fetch(usersUrl, { - method: "POST", - headers: { - "Authorization": `Bearer ${args.token}`, - "Content-Type": "application/scim+json", - "Accept": "application/scim+json", - }, - body: JSON.stringify(payload), - signal: controller.signal, - }); - - const body = await readResponseBody(response); - return { - index, - email, - ok: response.ok, - status: response.status, - body: response.ok ? undefined : body, - }; - } catch (error) { - return { - index, - email, - ok: false, - error: error instanceof Error ? error.message : String(error), - }; - } finally { - clearTimeout(timeout); - } -}; - -const runPool = async (args: Args, usersUrl: string): Promise => { - const results: Result[] = []; - let nextIndex = args.start; - let completed = 0; - const endExclusive = args.start + args.count; - - const worker = async () => { - while (true) { - const index = nextIndex; - nextIndex++; - if (index >= endExclusive) { - return; - } - - const result = await provisionUser(args, index, usersUrl); - results.push(result); - completed++; - - if (completed % args.progressEvery === 0 || completed === args.count) { - const failed = results.filter((r) => !r.ok).length; - process.stdout.write(`Provisioned ${completed}/${args.count} users (${failed} failed)\n`); - } - } - }; - - await Promise.all(Array.from({ length: Math.min(args.concurrency, args.count) }, () => worker())); - return results.sort((a, b) => a.index - b.index); -}; - -const summarize = (results: Result[]) => { - const statusCounts = new Map(); - for (const result of results) { - const key = result.ok ? String(result.status) : result.status ? String(result.status) : "request-error"; - statusCounts.set(key, (statusCounts.get(key) ?? 0) + 1); - } - - const failed = results.filter((result) => !result.ok); - process.stdout.write("\nSummary\n"); - process.stdout.write(` Total: ${results.length}\n`); - process.stdout.write(` Successful: ${results.length - failed.length}\n`); - process.stdout.write(` Failed: ${failed.length}\n`); - process.stdout.write(` Statuses: ${Array.from(statusCounts.entries()).map(([status, count]) => `${status}=${count}`).join(", ")}\n`); - - if (failed.length > 0) { - process.stdout.write("\nFirst failures\n"); - for (const failure of failed.slice(0, 10)) { - process.stdout.write(` [${failure.index}] ${failure.email}: ${failure.status ?? "request-error"} ${failure.error ?? failure.body ?? ""}\n`); - } - } -}; - -const main = async () => { - const args = parseArgs(); - const usersUrl = `${args.baseUrl!.replace(/\/$/, "")}/Users`; - const firstUser = buildScimUser(args, args.start); - - if (args.dryRun) { - process.stdout.write(`POST ${usersUrl}\n`); - process.stdout.write(`${JSON.stringify(firstUser.payload, null, 2)}\n`); - return; - } - - process.stdout.write(`Provisioning ${args.count} SCIM users to ${usersUrl}\n`); - process.stdout.write(`Prefix: ${args.prefix}, domain: ${args.domain}, concurrency: ${args.concurrency}, active: ${args.active}\n`); - - const startedAt = Date.now(); - const results = await runPool(args, usersUrl); - summarize(results); - - const durationSeconds = (Date.now() - startedAt) / 1000; - process.stdout.write(`Duration: ${durationSeconds.toFixed(1)}s (${(results.length / durationSeconds).toFixed(1)} users/s)\n`); - - if (!args.allowFailures && results.some((result) => !result.ok)) { - process.exit(1); - } -}; - -main().catch((error) => { - console.error(error instanceof Error ? error.message : error); - process.exit(1); -}); diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json deleted file mode 100644 index 3f0e7534b..000000000 --- a/packages/web/tsconfig.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "compilerOptions": { - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "react-jsx", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": [ - "./src/*" - ], - "@/public/*": [ - "./public/*" - ], - "@sourcebot/schemas/v3/*": [ - "../schemas/src/v3/*" - ], - "@sourcebot/schemas/v2/*": [ - "../schemas/src/v2/*" - ] - }, - "target": "ES2017" - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - ".next/dev/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/packages/web/types.d.ts b/packages/web/types.d.ts deleted file mode 100644 index bceb5175d..000000000 --- a/packages/web/types.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.txt' { - const content: string; - export default content; -} diff --git a/packages/web/vitest.config.mts b/packages/web/vitest.config.mts deleted file mode 100644 index af4db3fc6..000000000 --- a/packages/web/vitest.config.mts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'vitest/config' -import tsconfigPaths from 'vite-tsconfig-paths' - -export default defineConfig({ - plugins: [tsconfigPaths()], - test: { - environment: 'jsdom', - watch: false, - }, -}) \ No newline at end of file diff --git a/prefix-output.sh b/prefix-output.sh deleted file mode 100644 index 7cd3f8200..000000000 --- a/prefix-output.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -# @see : https://github.com/Supervisor/supervisor/issues/553#issuecomment-1353523182 - -# Check if structured logging is enabled -if [ "${SOURCEBOT_STRUCTURED_LOGGING_ENABLED}" = "true" ]; then - # Don't prefix output, just execute the command directly - exec "$@" -else - # Apply prefix to output - exec 1> >( perl -ne '$| = 1; print "['"${SUPERVISOR_PROCESS_NAME}"'] | $_"' >&1) - exec 2> >( perl -ne '$| = 1; print "['"${SUPERVISOR_PROCESS_NAME}"'] | $_"' >&2) - - exec "$@" -fi \ No newline at end of file diff --git a/public.pem b/public.pem deleted file mode 100644 index 99e9836ef..000000000 --- a/public.pem +++ /dev/null @@ -1,3 +0,0 @@ ------BEGIN PUBLIC KEY----- -MCowBQYDK2VwAyEAJ8fwB3wMcuNPput/El4bK2F8vt/algcGxC6MiJqrT+c= ------END PUBLIC KEY----- diff --git a/scripts/fetchLicenses.mjs b/scripts/fetchLicenses.mjs deleted file mode 100644 index f09d85b77..000000000 --- a/scripts/fetchLicenses.mjs +++ /dev/null @@ -1,204 +0,0 @@ -#!/usr/bin/env node - -/** - * Parses yarn.lock and fetches license information for all external dependencies. - * - * It works by: - * 1. Parsing the yarn.lock file to extract external (non-workspace) packages - * 2. Fetching license info from the npm registry for each unique package+version - * 3. Writing the results to a JSON file - * - * Usage: - * node scripts/fetchLicenses.mjs - * node scripts/fetchLicenses.mjs --output custom-output.json - */ - -import * as fs from "fs"; -import * as path from "path"; - -const NPM_REGISTRY = "https://registry.npmjs.org"; -const CONCURRENCY = 10; -const OUTPUT_DEFAULT = "oss-licenses.json"; -const LICENSE_MAP_PATH = path.join(path.dirname(new URL(import.meta.url).pathname), "npmLicenseMap.json"); - -function loadLicenseMap() { - if (!fs.existsSync(LICENSE_MAP_PATH)) { - return {}; - } - return JSON.parse(fs.readFileSync(LICENSE_MAP_PATH, "utf-8")); -} - -function deepEqual(a, b) { - return JSON.stringify(a) === JSON.stringify(b); -} - -function applyLicenseMap(results, licenseMap) { - let overrideCount = 0; - for (const result of results) { - const mapping = licenseMap[result.name]; - if (!mapping) continue; - if (deepEqual(result.license, mapping.old)) { - result.license = mapping.new; - overrideCount++; - } - } - return overrideCount; -} - -function parseYarnLock(lockfilePath) { - const content = fs.readFileSync(lockfilePath, "utf-8"); - const lines = content.split("\n"); - - const packages = []; - let currentEntry = null; - - for (const line of lines) { - // New top-level entry (package descriptor line starts with a quote at column 0) - if (line.startsWith('"') && line.endsWith(":")) { - currentEntry = { descriptor: line.slice(0, -1), resolution: null, linkType: null }; - continue; - } - - if (!currentEntry) continue; - - const trimmed = line.trimStart(); - - if (trimmed.startsWith("resolution:")) { - // e.g. resolution: "@ai-sdk/anthropic@npm:3.0.50" - const match = trimmed.match(/resolution:\s*"(.+)"/); - if (match) { - currentEntry.resolution = match[1]; - } - } else if (trimmed.startsWith("linkType:")) { - const match = trimmed.match(/linkType:\s*(\w+)/); - if (match) { - currentEntry.linkType = match[1]; - } - } - - // When we have both resolution and linkType, the entry is complete enough - if (currentEntry.resolution && currentEntry.linkType) { - if (currentEntry.linkType === "hard") { - packages.push(currentEntry.resolution); - } - currentEntry = null; - } - } - - return packages; -} - -function parseResolution(resolution) { - // resolution format: "@npm:" - const match = resolution.match(/^(.+)@npm:(.+)$/); - if (!match) return null; - return { name: match[1], version: match[2] }; -} - -async function fetchLicense(name, version) { - const url = `${NPM_REGISTRY}/${encodeURIComponent(name).replace("%40", "@")}/${version}`; - try { - const response = await fetch(url); - if (!response.ok) { - return { name, version, license: "UNKNOWN", error: `HTTP ${response.status}` }; - } - const data = await response.json(); - const license = data.license || "UNKNOWN"; - const repository = data.repository?.url || data.repository || null; - const homepage = data.homepage || null; - return { name, version, license, repository, homepage }; - } catch (err) { - return { name, version, license: "UNKNOWN", error: err.message }; - } -} - -async function processInBatches(items, batchSize, fn) { - const results = []; - for (let i = 0; i < items.length; i += batchSize) { - const batch = items.slice(i, i + batchSize); - const batchResults = await Promise.all(batch.map(fn)); - results.push(...batchResults); - - if (i + batchSize < items.length) { - process.stdout.write(`\r Fetched ${results.length}/${items.length} packages...`); - } - } - process.stdout.write(`\r Fetched ${results.length}/${items.length} packages...\n`); - return results; -} - -async function main() { - const args = process.argv.slice(2); - const outputIdx = args.indexOf("--output"); - const outputFile = outputIdx !== -1 && args[outputIdx + 1] - ? args[outputIdx + 1] - : OUTPUT_DEFAULT; - - const lockfilePath = path.join(process.cwd(), "yarn.lock"); - if (!fs.existsSync(lockfilePath)) { - console.error("yarn.lock not found in current directory. Run `yarn install` first."); - process.exit(1); - } - - console.log("1. Parsing yarn.lock..."); - const resolutions = parseYarnLock(lockfilePath); - console.log(` Found ${resolutions.length} external package entries`); - - // Deduplicate by name+version - const uniquePackages = new Map(); - for (const resolution of resolutions) { - const parsed = parseResolution(resolution); - if (!parsed) continue; - const key = `${parsed.name}@${parsed.version}`; - if (!uniquePackages.has(key)) { - uniquePackages.set(key, parsed); - } - } - - const packages = Array.from(uniquePackages.values()); - console.log(` ${packages.length} unique packages after deduplication`); - - console.log("\n2. Fetching license information from npm registry..."); - const results = await processInBatches(packages, CONCURRENCY, (pkg) => - fetchLicense(pkg.name, pkg.version) - ); - - // Apply license overrides from npmLicenseMap.json - const licenseMap = loadLicenseMap(); - const overrideCount = applyLicenseMap(results, licenseMap); - if (overrideCount > 0) { - console.log(`\n Applied ${overrideCount} license override(s) from npmLicenseMap.json`); - } - - // Sort by package name for stable output - results.sort((a, b) => a.name.localeCompare(b.name) || a.version.localeCompare(b.version)); - - const output = { - generatedAt: new Date().toISOString(), - totalPackages: results.length, - packages: results, - }; - - const outputPath = path.join(process.cwd(), outputFile); - fs.writeFileSync(outputPath, JSON.stringify(output, null, 2) + "\n"); - console.log(`\n3. Results written to ${outputFile}`); - - // Print summary - const licenseCounts = {}; - for (const r of results) { - const lic = r.license || "UNKNOWN"; - const licStr = typeof lic === "object" ? JSON.stringify(lic) : lic; - licenseCounts[licStr] = (licenseCounts[licStr] || 0) + 1; - } - - console.log("\nLicense summary:"); - const sorted = Object.entries(licenseCounts).sort((a, b) => b[1] - a[1]); - for (const [license, count] of sorted) { - console.log(` ${license}: ${count}`); - } -} - -main().catch((error) => { - console.error("Error:", error.message); - process.exit(1); -}); diff --git a/scripts/licenseAuditPrompt.txt b/scripts/licenseAuditPrompt.txt deleted file mode 100644 index 177ffbc74..000000000 --- a/scripts/licenseAuditPrompt.txt +++ /dev/null @@ -1,68 +0,0 @@ -You are a license compliance auditor. Your job is to review the OSS dependency -licenses in this repository and produce a structured audit result. - -## Steps - -1. Read the file `oss-licenses.json` in the repo root. - -2. Identify every package whose `license` field is: - - `"UNKNOWN"` - - A non-standard SPDX string (e.g., `"SEE LICENSE IN LICENSE"`, `"UNLICENSED"`, - `"SEE LICENSE IN ..."`, or any value that is not a recognized SPDX identifier) - - An object instead of a string (e.g., `{"type":"MIT","url":"..."}`) - -3. For each such package, try to resolve the actual license: - - Use WebFetch to visit `https://www.npmjs.com/package/` and look - for license information on the npm page. - - If the npm page is inconclusive, check the package's `repository` or `homepage` - URL (from oss-licenses.json) via WebFetch to find a LICENSE file. - - If the license field is an object like `{"type":"MIT","url":"..."}`, extract the - `type` field as the resolved license. - -4. Identify all copyleft-licensed packages. Classify them as: - - **Strong copyleft**: GPL-2.0, GPL-3.0, AGPL-1.0, AGPL-3.0, SSPL-1.0, EUPL-1.1, - EUPL-1.2, CPAL-1.0, OSL-3.0 (and any `-only` or `-or-later` variants) - - **Weak copyleft**: LGPL-2.0, LGPL-2.1, LGPL-3.0, MPL-2.0, CC-BY-SA-3.0, - CC-BY-SA-4.0 (and any `-only` or `-or-later` variants) - -5. Write a file called `license-audit-result.json` in the repo root with this structure: - ```json - { - "status": "PASS or FAIL", - "failReasons": ["list of reasons if FAIL, empty array if PASS"], - "summary": { - "totalPackages": 0, - "resolvedCount": 0, - "unresolvedCount": 0, - "strongCopyleftCount": 0, - "weakCopyleftCount": 0 - }, - "resolved": [ - { "name": "pkg-name", "version": "1.0.0", "originalLicense": "...", "resolvedLicense": "MIT", "source": "npm page / GitHub repo / extracted from object" } - ], - "unresolved": [ - { "name": "pkg-name", "version": "1.0.0", "license": "UNKNOWN", "reason": "why it could not be resolved" } - ], - "copyleft": { - "strong": [ - { "name": "pkg-name", "version": "1.0.0", "license": "GPL-3.0" } - ], - "weak": [ - { "name": "pkg-name", "version": "1.0.0", "license": "MPL-2.0" } - ] - } - } - ``` - -6. Set `status` to `"FAIL"` if `unresolvedCount > 0` OR `strongCopyleftCount > 0`. - Otherwise set it to `"PASS"`. - -7. If the status is FAIL, populate `failReasons` with human-readable explanations, e.g.: - - "2 packages have unresolvable licenses: pkg-a, pkg-b" - - "1 package uses strong copyleft license: pkg-c (GPL-3.0)" - -## Important Notes -- Do NOT modify any source files. Only write `license-audit-result.json`. -- Be thorough: check every non-standard license, not just a sample. -- If a package's license object has a `type` field, that counts as resolved. -- Weak copyleft licenses (LGPL, MPL) are flagged but do NOT cause a FAIL. diff --git a/scripts/npmLicenseMap.json b/scripts/npmLicenseMap.json deleted file mode 100644 index 829d04fa0..000000000 --- a/scripts/npmLicenseMap.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "@react-grab/cli": { "old": "UNKNOWN", "new": "MIT" }, - "@react-grab/mcp": { "old": "UNKNOWN", "new": "MIT" }, - "element-source": { "old": "UNKNOWN", "new": "MIT" } -} diff --git a/scripts/runLicenseAudit.sh b/scripts/runLicenseAudit.sh deleted file mode 100755 index 4e5a03d94..000000000 --- a/scripts/runLicenseAudit.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -cd "$REPO_ROOT" - -echo "=== License Audit ===" -echo "" - -# Step 1: Fetch licenses -echo "1. Fetching licenses from npm registry..." -node scripts/fetchLicenses.mjs -echo "" - -# Step 2: Summarize licenses -echo "2. Summarizing licenses..." -node scripts/summarizeLicenses.mjs -echo "" - -# Step 3: Run Claude audit -echo "3. Running Claude license audit..." -if ! command -v claude &> /dev/null; then - echo "Error: 'claude' CLI is not installed. Install it with: npm install -g @anthropic-ai/claude-code" - exit 1 -fi - -PROMPT_FILE="$SCRIPT_DIR/licenseAuditPrompt.txt" -if [ ! -f "$PROMPT_FILE" ]; then - echo "Error: Prompt file not found at $PROMPT_FILE" - exit 1 -fi - -claude --dangerously-skip-permissions -p "$(cat "$PROMPT_FILE")" \ - --allowedTools "Bash,Read,Write,Glob,Grep,WebFetch" -echo "" - -# Step 4: Validate result -echo "4. Validating audit result..." -if [ ! -f license-audit-result.json ]; then - echo "Error: license-audit-result.json was not created by the audit step" - exit 1 -fi - -STATUS=$(node -e "const r = require('./license-audit-result.json'); console.log(r.status)") -UNRESOLVED=$(node -e "const r = require('./license-audit-result.json'); console.log(r.summary.unresolvedCount)") -STRONG=$(node -e "const r = require('./license-audit-result.json'); console.log(r.summary.strongCopyleftCount)") -WEAK=$(node -e "const r = require('./license-audit-result.json'); console.log(r.summary.weakCopyleftCount)") -RESOLVED=$(node -e "const r = require('./license-audit-result.json'); console.log(r.summary.resolvedCount)") - -echo "" -echo "== License Audit Result: $STATUS ==" -echo "" -echo " Resolved: $RESOLVED" -echo " Unresolved: $UNRESOLVED" -echo " Strong copyleft: $STRONG" -echo " Weak copyleft: $WEAK" - -if [ "$STATUS" = "FAIL" ]; then - echo "" - echo "FAIL reasons:" - node -e "const r = require('./license-audit-result.json'); r.failReasons.forEach(r => console.log(' - ' + r))" - exit 1 -fi - -echo "" -echo "License audit passed." diff --git a/scripts/summarizeLicenses.mjs b/scripts/summarizeLicenses.mjs deleted file mode 100644 index 27ab96154..000000000 --- a/scripts/summarizeLicenses.mjs +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env node - -/** - * Reads oss-licenses.json and produces a summary of license usage. - * - * Usage: - * node scripts/summarizeLicenses.mjs - * node scripts/summarizeLicenses.mjs --input custom-input.json --output custom-output.json - */ - -import * as fs from "fs"; -import * as path from "path"; - -const INPUT_DEFAULT = "oss-licenses.json"; -const OUTPUT_DEFAULT = "oss-license-summary.json"; - -function main() { - const args = process.argv.slice(2); - const inputIdx = args.indexOf("--input"); - const outputIdx = args.indexOf("--output"); - const inputFile = inputIdx !== -1 && args[inputIdx + 1] ? args[inputIdx + 1] : INPUT_DEFAULT; - const outputFile = outputIdx !== -1 && args[outputIdx + 1] ? args[outputIdx + 1] : OUTPUT_DEFAULT; - - const inputPath = path.join(process.cwd(), inputFile); - if (!fs.existsSync(inputPath)) { - console.error(`${inputFile} not found. Run \`node scripts/fetchLicenses.mjs\` first.`); - process.exit(1); - } - - const data = JSON.parse(fs.readFileSync(inputPath, "utf-8")); - const packages = data.packages || []; - - // Count by license - const licenseCounts = {}; - for (const pkg of packages) { - const license = typeof pkg.license === "object" - ? JSON.stringify(pkg.license) - : (pkg.license || "UNKNOWN"); - licenseCounts[license] = (licenseCounts[license] || 0) + 1; - } - - // Sort descending by count - const sorted = Object.entries(licenseCounts) - .sort((a, b) => b[1] - a[1]) - .map(([license, count]) => ({ license, count })); - - const summary = { - generatedAt: new Date().toISOString(), - sourcedFrom: inputFile, - totalPackages: packages.length, - totalLicenseTypes: sorted.length, - licenses: sorted, - }; - - const outputPath = path.join(process.cwd(), outputFile); - fs.writeFileSync(outputPath, JSON.stringify(summary, null, 2) + "\n"); - - console.log(`License summary (${packages.length} packages, ${sorted.length} license types):\n`); - for (const { license, count } of sorted) { - console.log(` ${count} ${license}`); - } - console.log(`\nWritten to ${outputFile}`); -} - -main(); diff --git a/skills/codebase-guide.md b/skills/codebase-guide.md deleted file mode 100644 index 67366ab05..000000000 --- a/skills/codebase-guide.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -name: Codebase Guide -command: codebase-guide -description: Orientation for answering questions about the Sourcebot codebase. Covers the package map and entry points (indexing, search, Ask, auth), team terminology (connections vs connectors, lighthouse, core vs ee), and gotchas where a cold read of the code misleads. Load this before answering any question about how Sourcebot works or where something lives. ---- - -Background knowledge for answering questions about the Sourcebot codebase. Use the map to start from the right entry points, the glossary to use terms the way the team does, and the traps to avoid confidently wrong answers. - -## The map - -Sourcebot is a Yarn 4 monorepo. Application code lives under `packages/`, and the search engine (zoekt, a Go trigram-based code search engine) is vendored under `vendor/zoekt` with binaries built into `bin/`. - -| Package | What it is | -|---|---| -| `packages/web` | The Next.js app: all UI, API routes, auth, and the Ask agent. Core features in `src/features/`, enterprise features in `src/ee/features/`. | -| `packages/backend` | The worker (also called "the backend"): an Express + BullMQ job processor that syncs connections, clones repos, and drives zoekt indexing. | -| `packages/db` | Prisma schema, migrations, and client. | -| `packages/schemas` | Generated types/validators for the declarative config file (source JSON schemas live in `schemas/` at the repo root). | -| `packages/queryLanguage` | Parser for the search query language. | -| `packages/shared` | Cross-package utilities: entitlements, logger, env handling. | -| `packages/setupWizard` | The `setup-sourcebot` CLI installer published to npm. | - -Local services and ports: web on 3000, backend worker on 3060, zoekt webserver on 6070, Postgres 5432 and Redis 6379 via `docker-compose-dev.yml`. - -Entry points for the major flows: - -- **Indexing pipeline** (all in `packages/backend/src`): `connectionManager.ts` syncs connections against code-host APIs (per-host logic in `github.ts`, `gitlab.ts`, `bitbucket.ts`, `gitea.ts`, `gerrit.ts`, `azuredevops.ts`), `repoCompileUtils.ts` compiles connection results into Repo rows, and `repoIndexManager.ts` + `zoekt.ts` clone/fetch and index them into zoekt shards. The zoekt webserver serves the shards. -- **Search path**: the web app queries zoekt over gRPC from `packages/web/src/features/search/zoektSearcher.ts` (address from `ZOEKT_WEBSERVER_URL`). -- **Ask Sourcebot**: the agent loop is `packages/web/src/ee/features/chat/agent.ts`. MCP connectors are under `ee/features/chat/mcp/`. Note the chat code is split: `src/features/chat/` holds shared types and UI, `src/ee/features/chat/` holds the agent itself. -- **Auth**: NextAuth configuration in `packages/web/src/features/auth`. Server actions and API routes are gated by `withAuth`/`withOptionalAuth` (`src/middleware/`), which provide a user-scoped Prisma client that enforces repository visibility. Answers about "who can see what" should route through that scoping, not raw Prisma. -- **Permission syncing** (EE, `packages/backend/src/ee/`): `repoPermissionSyncer.ts` and `accountPermissionSyncer.ts` mirror code-host permissions into Sourcebot. - -## Glossary - -- **Connection** — a code-host sync configuration (GitHub, GitLab, Bitbucket, ...) declared in the config file. Connections are synced by the backend and produce repos. Completely unrelated to connectors. -- **Connector** — an MCP integration that plugs an external tool (Jira, Slack, Linear, ...) into Ask Sourcebot. Lives under `packages/web/src/ee/features/chat/mcp/`. One letter away from "connection", entirely different concept. -- **Lighthouse** — Sourcebot's internal licensing and telemetry service (a separate deployment; client code under `packages/web/src/ee/features/lighthouse/`). It is NOT Google Lighthouse, and questions about license validation route here. -- **Zoekt** — the vendored code search engine. "Shards" are its on-disk index files. -- **Core vs EE** — a licensing boundary, not an architectural one. Any folder named `ee/` is under the Sourcebot Enterprise License; everything else is FSL. EE features are gated at runtime by entitlements (`packages/shared/src/entitlements.ts`). -- **Search contexts** — named groupings of repos used to scope searches (EE). -- **Skills** — reusable instruction sets for Ask Sourcebot (like this one), invoked via slash command or loaded automatically by the agent. -- **Service ping** — the periodic telemetry heartbeat an instance sends, including deployment stats. - -## Traps: where a cold read of the code misleads - -- **`packages/web/src/proxy.ts` IS the middleware.** Next.js 16 renamed the `middleware.ts` convention to `proxy.ts`. There is no `middleware.ts`, and `proxy.ts` is not dead code — request-level logic lives there. -- **`AUTH_EE_*` environment variables are gone.** Since v5.0.2, identity providers (GitHub, GitLab, Google, Okta, Keycloak, Entra) are configured only via the config file. Old issues, docs, and code comments referencing `AUTH_EE_*` are obsolete. -- **v5 removed the embedded Postgres and Redis** from the Docker image. Deployments must provide external `DATABASE_URL` and `REDIS_URL`. Any pre-v5 guidance about the all-in-one container is outdated. -- **Secrets are no longer auto-generated.** Since v5, `AUTH_SECRET` and `SOURCEBOT_ENCRYPTION_KEY` must be set explicitly; Sourcebot no longer writes them to the data volume. -- **Ask Sourcebot and MCP are EE since v5.** They were relicensed from core; don't describe them as community features. -- **Membership states are derived, not stored.** Active/pending/suspended come from `suspendedAt`/`lastActiveAt` on `UserToOrg` — use the predicates in `packages/web/src/features/membership/utils.ts` rather than reasoning about a status column that doesn't exist. -- **Local symbol search requires universal-ctags exactly v6.1.0.** Newer versions are incompatible with zoekt; when local symbol search silently returns nothing, the ctags version (and `CTAGS_COMMAND`) is the first thing to check. - -## Answering style - -When answering questions about this codebase, cite concrete file paths (preferably the entry points above) so answers are verifiable, and explicitly flag when a question touches one of the traps — that context is usually the part the asker is missing. diff --git a/supervisord.conf b/supervisord.conf deleted file mode 100644 index 8d813004e..000000000 --- a/supervisord.conf +++ /dev/null @@ -1,35 +0,0 @@ -[supervisord] -nodaemon=true -logfile=/dev/null -logfile_maxbytes=0 - -[program:zoekt] -command=./prefix-output.sh zoekt-webserver -index %(ENV_DATA_CACHE_DIR)s/index -rpc -priority=10 -autostart=true -autorestart=true -startretries=3 -stdout_logfile=/dev/fd/1 -stdout_logfile_maxbytes=0 -redirect_stderr=true - -[program:web] -command=./prefix-output.sh node packages/web/server.js -environment=NODE_OPTIONS="--max-old-space-size-percentage=50" -priority=20 -autostart=true -autorestart=true -startretries=3 -stdout_logfile=/dev/fd/1 -stdout_logfile_maxbytes=0 -redirect_stderr=true - -[program:backend] -command=./prefix-output.sh node packages/backend/dist/index.js -priority=20 -autostart=true -autorestart=true -startretries=3 -stdout_logfile=/dev/fd/1 -stdout_logfile_maxbytes=0 -redirect_stderr=true diff --git a/trivy.yaml b/trivy.yaml deleted file mode 100644 index 9e1b7a8f4..000000000 --- a/trivy.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# Docs: https://aquasecurity.github.io/trivy/latest/docs/references/configuration/config-file/ - -scan: - scanners: - - vuln - - pkg-types: - - os - - library - -severity: - - CRITICAL - - HIGH - - MEDIUM - -vulnerability: - ignore-unfixed: true \ No newline at end of file diff --git a/vendor/zoekt b/vendor/zoekt deleted file mode 160000 index b762b16dd..000000000 --- a/vendor/zoekt +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b762b16dde4bee0eaae3faa56c7e195c8e2ad341 diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 048361f9a..000000000 --- a/yarn.lock +++ /dev/null @@ -1,23947 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@ai-sdk/amazon-bedrock@npm:^4.0.94": - version: 4.0.94 - resolution: "@ai-sdk/amazon-bedrock@npm:4.0.94" - dependencies: - "@ai-sdk/anthropic": "npm:3.0.70" - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - "@smithy/eventstream-codec": "npm:^4.0.1" - "@smithy/util-utf8": "npm:^4.0.0" - aws4fetch: "npm:^1.0.20" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/7bf9c8ffc9b8dc3f20bcdede0d5f7df86598d1e7c9e8ff4b4d2196c725cacb00354a85df35bbf8757261073574fff464ac6017a3d488ed439d54927aea7d1d41 - languageName: node - linkType: hard - -"@ai-sdk/anthropic@npm:3.0.70, @ai-sdk/anthropic@npm:^3.0.70": - version: 3.0.70 - resolution: "@ai-sdk/anthropic@npm:3.0.70" - dependencies: - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/2a0c7aa08d38fddde06c482ca02717bbcece6b4f45e0d65ddea8592c0722a1c9db8850a42941683bd7185f99fd3e350c7c6d3e2eb8cdb74d9bd70f7581bb7164 - languageName: node - linkType: hard - -"@ai-sdk/azure@npm:^3.0.54": - version: 3.0.54 - resolution: "@ai-sdk/azure@npm:3.0.54" - dependencies: - "@ai-sdk/openai": "npm:3.0.53" - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/6ab87a454152165e9a4a96518ebc17725aaaf67e10dac908def2b1b9137fe46f78ef4c2a65dce01ac30b7320f918466521814ebad1310c00659aff6567a0e86d - languageName: node - linkType: hard - -"@ai-sdk/deepseek@npm:^2.0.29": - version: 2.0.29 - resolution: "@ai-sdk/deepseek@npm:2.0.29" - dependencies: - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/4ddf9683a0c5f7b1201af0cab24a5d1339e080fb6eaddf1fffab07ad9fe7f9ce95be1a9388b2b06a40f83f6ef642fe8b007b995a32d882d34e2b590c8932d054 - languageName: node - linkType: hard - -"@ai-sdk/gateway@npm:3.0.103": - version: 3.0.103 - resolution: "@ai-sdk/gateway@npm:3.0.103" - dependencies: - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - "@vercel/oidc": "npm:3.1.0" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/d6a4acc2c8dac64a1259d6d02487f3eef6d0a1a2f6922a7046c15bd8f82d3aa47fd8c082e1d480dab95773514933d305b5ec179dca33e9cb5f832852ccf0079c - languageName: node - linkType: hard - -"@ai-sdk/google-vertex@npm:^4.0.111": - version: 4.0.111 - resolution: "@ai-sdk/google-vertex@npm:4.0.111" - dependencies: - "@ai-sdk/anthropic": "npm:3.0.70" - "@ai-sdk/google": "npm:3.0.64" - "@ai-sdk/openai-compatible": "npm:2.0.41" - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - google-auth-library: "npm:^10.5.0" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/274b56736686a3286123fa2ffcfcd6a07054c7f0c221e03dc94992cd9c630b0a6278aa27e0adcd824793203e2dd8a5f24d70b31508421138653a2aa2ef8511d1 - languageName: node - linkType: hard - -"@ai-sdk/google@npm:3.0.64, @ai-sdk/google@npm:^3.0.64": - version: 3.0.64 - resolution: "@ai-sdk/google@npm:3.0.64" - dependencies: - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/d85f1142021dc984fd174a6d0fdbed39e07235348db1cf423edbe3adddda2033e59939b797b7bd540bb2f40a6b6704e27f924cf18698ab17712aa961504eeec6 - languageName: node - linkType: hard - -"@ai-sdk/mcp@npm:^2.0.0-beta.11": - version: 2.0.0-beta.11 - resolution: "@ai-sdk/mcp@npm:2.0.0-beta.11" - dependencies: - "@ai-sdk/provider": "npm:4.0.0-beta.5" - "@ai-sdk/provider-utils": "npm:5.0.0-beta.7" - pkce-challenge: "npm:^5.0.0" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/efcc9b9f5f8b20b78b2d0ee6d83b34466b2ec456c3b40b5b8b10af226e7d3f6144f964d87a20c5fc54c24b21f3610cb75cc246c30833b99fb501438a206c9933 - languageName: node - linkType: hard - -"@ai-sdk/mistral@npm:^3.0.30": - version: 3.0.30 - resolution: "@ai-sdk/mistral@npm:3.0.30" - dependencies: - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/f0aaef64ffecc31173eff895b5410311807ffbbdc87b7811dd294e8f65887b8c161915b4276e6eb9451614acd0bb322bbf1f93e2f6c9e76715cda0a8f9f8d325 - languageName: node - linkType: hard - -"@ai-sdk/openai-compatible@npm:2.0.41, @ai-sdk/openai-compatible@npm:^2.0.41": - version: 2.0.41 - resolution: "@ai-sdk/openai-compatible@npm:2.0.41" - dependencies: - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/3f91ad098edfedff46d9fa14b015fa46e235cc460cfdf45f1fb3f5114baa625684436770993aa7b969dbbf5f835a640e062c75cbf3ae72bd746ce6a37f2636f2 - languageName: node - linkType: hard - -"@ai-sdk/openai@npm:3.0.53, @ai-sdk/openai@npm:^3.0.53": - version: 3.0.53 - resolution: "@ai-sdk/openai@npm:3.0.53" - dependencies: - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/36b815de9916006d27432fadf4d071cfab1fc89958ebba2ca881ac63101fc378010fefec85837ffaef3e4a95fe1815399e635d9bb9ac9c0e3c8f8a46e2204b15 - languageName: node - linkType: hard - -"@ai-sdk/provider-utils@npm:4.0.23": - version: 4.0.23 - resolution: "@ai-sdk/provider-utils@npm:4.0.23" - dependencies: - "@ai-sdk/provider": "npm:3.0.8" - "@standard-schema/spec": "npm:^1.1.0" - eventsource-parser: "npm:^3.0.6" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/06e0aaf95eef47617d87709f78e321c87d26663bae16e68e9776a4bced8d78823d4c1514ac5e5e7dcb74f24a2e37152bc6b6eb1e31c9f0f77e54a020993c276a - languageName: node - linkType: hard - -"@ai-sdk/provider-utils@npm:5.0.0-beta.7": - version: 5.0.0-beta.7 - resolution: "@ai-sdk/provider-utils@npm:5.0.0-beta.7" - dependencies: - "@ai-sdk/provider": "npm:4.0.0-beta.5" - "@standard-schema/spec": "npm:^1.1.0" - eventsource-parser: "npm:^3.0.6" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/440825f7b599da6a0bd830c905f9ba4f21defcf7068bc98154ea38158c1134b049cb2815047013668f48b679a23de1d3c19eb072a65115dc860070168104c99e - languageName: node - linkType: hard - -"@ai-sdk/provider@npm:3.0.8": - version: 3.0.8 - resolution: "@ai-sdk/provider@npm:3.0.8" - dependencies: - json-schema: "npm:^0.4.0" - checksum: 10c0/c68637c0139a6ce8af17bac1d7d539f531860026237c5c971dcecda2daa8b1e42d8c05e1e664ece60c15edb325c0253fd5b091ee54d32f870a750a493acbb0b7 - languageName: node - linkType: hard - -"@ai-sdk/provider@npm:4.0.0-beta.5": - version: 4.0.0-beta.5 - resolution: "@ai-sdk/provider@npm:4.0.0-beta.5" - dependencies: - json-schema: "npm:^0.4.0" - checksum: 10c0/886f5892268cc3425130c9b019a9eb1e2acdb5efd05d920b05d1ac1ab49603393d8e509e6e0a3c46dee533a411a51a2af2c6fa0a173b41130f5175a615add7fb - languageName: node - linkType: hard - -"@ai-sdk/react@npm:^3.0.169": - version: 3.0.169 - resolution: "@ai-sdk/react@npm:3.0.169" - dependencies: - "@ai-sdk/provider-utils": "npm:4.0.23" - ai: "npm:6.0.167" - swr: "npm:^2.2.5" - throttleit: "npm:2.1.0" - peerDependencies: - react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 - checksum: 10c0/801d73e63f4cae23f12e9ed3bc7229779262843428979c2c4b40791b64c5293ed4cdaa247d165d3eeca622bd695ccd3e2f576fb36e83ce26aac03123fbaf3414 - languageName: node - linkType: hard - -"@ai-sdk/xai@npm:^3.0.83": - version: 3.0.83 - resolution: "@ai-sdk/xai@npm:3.0.83" - dependencies: - "@ai-sdk/openai-compatible": "npm:2.0.41" - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/e69d8ea04f48ff4eb6bf282c8878450f2ec7fe69ca4d662e9ed701d670fc0a5c323f13b0f40aded634e3267c62811b04c16fe4525cc837a33bc4083418596685 - languageName: node - linkType: hard - -"@alloc/quick-lru@npm:^5.2.0": - version: 5.2.0 - resolution: "@alloc/quick-lru@npm:5.2.0" - checksum: 10c0/7b878c48b9d25277d0e1a9b8b2f2312a314af806b4129dc902f2bc29ab09b58236e53964689feec187b28c80d2203aff03829754773a707a8a5987f1b7682d92 - languageName: node - linkType: hard - -"@antfu/install-pkg@npm:^1.1.0": - version: 1.1.0 - resolution: "@antfu/install-pkg@npm:1.1.0" - dependencies: - package-manager-detector: "npm:^1.3.0" - tinyexec: "npm:^1.0.1" - checksum: 10c0/140d5994c76fd3d0e824c88f1ce91b3370e8066a8bc2f5729ae133bf768caa239f7915e29c78f239b7ead253113ace51293e95127fafe2b786b88eb615b3be47 - languageName: node - linkType: hard - -"@antfu/ni@npm:^0.23.0": - version: 0.23.2 - resolution: "@antfu/ni@npm:0.23.2" - bin: - na: bin/na.mjs - nci: bin/nci.mjs - ni: bin/ni.mjs - nlx: bin/nlx.mjs - nr: bin/nr.mjs - nu: bin/nu.mjs - nun: bin/nun.mjs - checksum: 10c0/d953ce8ef5e94d7ad503573769442988320b4f343519c278c47f6210cb37141e8f281ad42cf8bcac0e592df96eb5be903b0273585185fd47fb47933e13aaae50 - languageName: node - linkType: hard - -"@anthropic-ai/sdk@npm:^0.104.0": - version: 0.104.0 - resolution: "@anthropic-ai/sdk@npm:0.104.0" - dependencies: - json-schema-to-ts: "npm:^3.1.1" - standardwebhooks: "npm:^1.0.0" - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - peerDependenciesMeta: - zod: - optional: true - bin: - anthropic-ai-sdk: bin/cli - checksum: 10c0/d73197e0fccea3a8a957a895d4fc637bd95ea2ef5a812dce5e48056b06cb044f837bafdbb0c6a4b154e149b352807b5ef43df05f51ffe6f27832a440e1b07569 - languageName: node - linkType: hard - -"@anthropic-ai/sdk@npm:^0.78.0": - version: 0.78.0 - resolution: "@anthropic-ai/sdk@npm:0.78.0" - dependencies: - json-schema-to-ts: "npm:^3.1.1" - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - peerDependenciesMeta: - zod: - optional: true - bin: - anthropic-ai-sdk: bin/cli - checksum: 10c0/a43c83047d0f6ac8d50938e8a07aee27b8891cf51011fcbdb07159996762f262734e4839df00e57f713e25c8c740424939e13c91e6b3f5b12879b9cde1d9c835 - languageName: node - linkType: hard - -"@apidevtools/json-schema-ref-parser@npm:^11.5.5, @apidevtools/json-schema-ref-parser@npm:^11.7.3": - version: 11.9.3 - resolution: "@apidevtools/json-schema-ref-parser@npm:11.9.3" - dependencies: - "@jsdevtools/ono": "npm:^7.1.3" - "@types/json-schema": "npm:^7.0.15" - js-yaml: "npm:^4.1.0" - checksum: 10c0/5745813b3d964279f387677b7a903ba6634cdeaf879ff3a331a694392cbc923763f398506df190be114f2574b8b570baab3e367c2194bb35f50147ff6cf27d7a - languageName: node - linkType: hard - -"@apm-js-collab/code-transformer-bundler-plugins@npm:^0.7.3": - version: 0.7.4 - resolution: "@apm-js-collab/code-transformer-bundler-plugins@npm:0.7.4" - dependencies: - "@apm-js-collab/code-transformer": "npm:^0.18.1" - es-module-lexer: "npm:^2.1.0" - magic-string: "npm:^0.30.21" - module-details-from-path: "npm:^1.0.4" - checksum: 10c0/3764761b37f7c502ec943da0bcc1901866758bd3e2899875285f424eeb5d2788b27e51dca09a706397fdf3d5286ecc7adf9b6d61ea34bd4e32a551832330c34f - languageName: node - linkType: hard - -"@apm-js-collab/code-transformer@npm:^0.18.0, @apm-js-collab/code-transformer@npm:^0.18.1": - version: 0.18.1 - resolution: "@apm-js-collab/code-transformer@npm:0.18.1" - dependencies: - "@types/estree": "npm:^1.0.8" - astring: "npm:^1.9.0" - esquery: "npm:^1.7.0" - meriyah: "npm:^6.1.4" - semifies: "npm:^1.0.0" - source-map: "npm:^0.6.0" - bin: - code-transformer: cli.js - checksum: 10c0/253ba76f7efec39a337327e5f23029ab5a8c5b3e3db4e1c41b97636b8e842372c285301f7a3e3a19d344eb9a680091926f6f38e06bdd6233f33a958777094322 - languageName: node - linkType: hard - -"@apm-js-collab/tracing-hooks@npm:^0.13.0": - version: 0.13.0 - resolution: "@apm-js-collab/tracing-hooks@npm:0.13.0" - dependencies: - "@apm-js-collab/code-transformer": "npm:^0.18.0" - debug: "npm:^4.4.1" - module-details-from-path: "npm:^1.0.4" - checksum: 10c0/2891fc52b8aa2b68d59674f40f1340ce71ac68f6aff07394146565a5afcc10d99b8efe2d05af1346c188d440fcbb53c9d48eb017012417109740207e8a85e390 - languageName: node - linkType: hard - -"@asamuzakjp/css-color@npm:^3.1.1": - version: 3.1.1 - resolution: "@asamuzakjp/css-color@npm:3.1.1" - dependencies: - "@csstools/css-calc": "npm:^2.1.2" - "@csstools/css-color-parser": "npm:^3.0.8" - "@csstools/css-parser-algorithms": "npm:^3.0.4" - "@csstools/css-tokenizer": "npm:^3.0.3" - lru-cache: "npm:^10.4.3" - checksum: 10c0/4abb010fd29de8acae8571eba738468c22cb45a1f77647df3c59a80f1c83d83d728cae3ebbf99e5c73f2517761abaaffbe5e4176fc46b5f9bf60f1478463b51e - languageName: node - linkType: hard - -"@asteasolutions/zod-to-openapi@npm:7.3.4": - version: 7.3.4 - resolution: "@asteasolutions/zod-to-openapi@npm:7.3.4" - dependencies: - openapi3-ts: "npm:^4.1.2" - peerDependencies: - zod: ^3.20.2 - checksum: 10c0/e94f63adce051f11b0ff417865c00973c8596a7c32917b05ba38c8c4a006bd325825fd8d0278b34af70836a7321f732bd6df8ce4c4e70cb11ac6c5cace7cfe5c - languageName: node - linkType: hard - -"@auth/core@npm:0.41.3": - version: 0.41.3 - resolution: "@auth/core@npm:0.41.3" - dependencies: - "@panva/hkdf": "npm:^1.2.1" - jose: "npm:^6.0.6" - oauth4webapi: "npm:^3.3.0" - preact: "npm:10.24.3" - preact-render-to-string: "npm:6.5.11" - peerDependencies: - "@simplewebauthn/browser": ^9.0.1 - "@simplewebauthn/server": ^9.0.2 - nodemailer: ^7.0.7 || ^8.0.5 - peerDependenciesMeta: - "@simplewebauthn/browser": - optional: true - "@simplewebauthn/server": - optional: true - nodemailer: - optional: true - checksum: 10c0/efc089fe70102a66f5ba717b49412b56f58d367800d64640092567830a5a211b35f887e00339d614963803990954ad610bd3626697673ba9f9e92b78c2c25ff0 - languageName: node - linkType: hard - -"@auth/prisma-adapter@npm:^2.11.3": - version: 2.11.3 - resolution: "@auth/prisma-adapter@npm:2.11.3" - dependencies: - "@auth/core": "npm:0.41.3" - peerDependencies: - "@prisma/client": ">=2.26.0 || >=3 || >=4 || >=5 || >=6" - checksum: 10c0/812647c27c38c081d0fe3300c685079a744675afa57fdaa4a7f17759c8868c7b6b971c91f00e7969671b239924f561653e243af711a99dd5c6df94bf9bad9395 - languageName: node - linkType: hard - -"@aws-crypto/crc32@npm:5.2.0": - version: 5.2.0 - resolution: "@aws-crypto/crc32@npm:5.2.0" - dependencies: - "@aws-crypto/util": "npm:^5.2.0" - "@aws-sdk/types": "npm:^3.222.0" - tslib: "npm:^2.6.2" - checksum: 10c0/eab9581d3363af5ea498ae0e72de792f54d8890360e14a9d8261b7b5c55ebe080279fb2556e07994d785341cdaa99ab0b1ccf137832b53b5904cd6928f2b094b - languageName: node - linkType: hard - -"@aws-crypto/sha256-browser@npm:5.2.0": - version: 5.2.0 - resolution: "@aws-crypto/sha256-browser@npm:5.2.0" - dependencies: - "@aws-crypto/sha256-js": "npm:^5.2.0" - "@aws-crypto/supports-web-crypto": "npm:^5.2.0" - "@aws-crypto/util": "npm:^5.2.0" - "@aws-sdk/types": "npm:^3.222.0" - "@aws-sdk/util-locate-window": "npm:^3.0.0" - "@smithy/util-utf8": "npm:^2.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/05f6d256794df800fe9aef5f52f2ac7415f7f3117d461f85a6aecaa4e29e91527b6fd503681a17136fa89e9dd3d916e9c7e4cfb5eba222875cb6c077bdc1d00d - languageName: node - linkType: hard - -"@aws-crypto/sha256-js@npm:5.2.0, @aws-crypto/sha256-js@npm:^5.2.0": - version: 5.2.0 - resolution: "@aws-crypto/sha256-js@npm:5.2.0" - dependencies: - "@aws-crypto/util": "npm:^5.2.0" - "@aws-sdk/types": "npm:^3.222.0" - tslib: "npm:^2.6.2" - checksum: 10c0/6c48701f8336341bb104dfde3d0050c89c288051f6b5e9bdfeb8091cf3ffc86efcd5c9e6ff2a4a134406b019c07aca9db608128f8d9267c952578a3108db9fd1 - languageName: node - linkType: hard - -"@aws-crypto/supports-web-crypto@npm:^5.2.0": - version: 5.2.0 - resolution: "@aws-crypto/supports-web-crypto@npm:5.2.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/4d2118e29d68ca3f5947f1e37ce1fbb3239a0c569cc938cdc8ab8390d595609b5caf51a07c9e0535105b17bf5c52ea256fed705a07e9681118120ab64ee73af2 - languageName: node - linkType: hard - -"@aws-crypto/util@npm:^5.2.0": - version: 5.2.0 - resolution: "@aws-crypto/util@npm:5.2.0" - dependencies: - "@aws-sdk/types": "npm:^3.222.0" - "@smithy/util-utf8": "npm:^2.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/0362d4c197b1fd64b423966945130207d1fe23e1bb2878a18e361f7743c8d339dad3f8729895a29aa34fff6a86c65f281cf5167c4bf253f21627ae80b6dd2951 - languageName: node - linkType: hard - -"@aws-sdk/client-cognito-identity@npm:3.1036.0": - version: 3.1036.0 - resolution: "@aws-sdk/client-cognito-identity@npm:3.1036.0" - dependencies: - "@aws-crypto/sha256-browser": "npm:5.2.0" - "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/credential-provider-node": "npm:^3.972.36" - "@aws-sdk/middleware-host-header": "npm:^3.972.10" - "@aws-sdk/middleware-logger": "npm:^3.972.10" - "@aws-sdk/middleware-recursion-detection": "npm:^3.972.11" - "@aws-sdk/middleware-user-agent": "npm:^3.972.35" - "@aws-sdk/region-config-resolver": "npm:^3.972.13" - "@aws-sdk/types": "npm:^3.973.8" - "@aws-sdk/util-endpoints": "npm:^3.996.8" - "@aws-sdk/util-user-agent-browser": "npm:^3.972.10" - "@aws-sdk/util-user-agent-node": "npm:^3.973.21" - "@smithy/config-resolver": "npm:^4.4.17" - "@smithy/core": "npm:^3.23.17" - "@smithy/fetch-http-handler": "npm:^5.3.17" - "@smithy/hash-node": "npm:^4.2.14" - "@smithy/invalid-dependency": "npm:^4.2.14" - "@smithy/middleware-content-length": "npm:^4.2.14" - "@smithy/middleware-endpoint": "npm:^4.4.32" - "@smithy/middleware-retry": "npm:^4.5.5" - "@smithy/middleware-serde": "npm:^4.2.20" - "@smithy/middleware-stack": "npm:^4.2.14" - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/node-http-handler": "npm:^4.6.1" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/smithy-client": "npm:^4.12.13" - "@smithy/types": "npm:^4.14.1" - "@smithy/url-parser": "npm:^4.2.14" - "@smithy/util-base64": "npm:^4.3.2" - "@smithy/util-body-length-browser": "npm:^4.2.2" - "@smithy/util-body-length-node": "npm:^4.2.3" - "@smithy/util-defaults-mode-browser": "npm:^4.3.49" - "@smithy/util-defaults-mode-node": "npm:^4.2.54" - "@smithy/util-endpoints": "npm:^3.4.2" - "@smithy/util-middleware": "npm:^4.2.14" - "@smithy/util-retry": "npm:^4.3.4" - "@smithy/util-utf8": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/032cb6f4d342480c6dfa67e3021a448131182a1b5b23763ba11ef7584e95d93737bcfd2d938e11276588915a6e3e3a26d9e6fb2fa8197fc606f6d1a7c6bfc58c - languageName: node - linkType: hard - -"@aws-sdk/core@npm:^3.974.5": - version: 3.974.5 - resolution: "@aws-sdk/core@npm:3.974.5" - dependencies: - "@aws-sdk/types": "npm:^3.973.8" - "@aws-sdk/xml-builder": "npm:^3.972.19" - "@smithy/core": "npm:^3.23.17" - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/signature-v4": "npm:^5.3.14" - "@smithy/smithy-client": "npm:^4.12.13" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-base64": "npm:^4.3.2" - "@smithy/util-middleware": "npm:^4.2.14" - "@smithy/util-retry": "npm:^4.3.4" - "@smithy/util-utf8": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/29adc8c7dd8eca8e85bd2a768e569f52760131d5aeffaea98a669dc326c7e37cba6530366a7d60e5b5f36975a1ced287fe7ac0e889c050a3b3a38969ffb53f26 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-cognito-identity@npm:^3.972.28": - version: 3.972.28 - resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.972.28" - dependencies: - "@aws-sdk/nested-clients": "npm:^3.997.3" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/95eb672d35acf5d5c44c3577bb1350047e468af16458255e5b5eb7f0dac7785dce0d9fedea78614a71322f245afaf472bd684e58221709d1e3ce29bef7839b00 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-env@npm:^3.972.31": - version: 3.972.31 - resolution: "@aws-sdk/credential-provider-env@npm:3.972.31" - dependencies: - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/ebffed49e5688de32c7a1f149a0e306b85f2f6b1705ab6bfb21e8a9e470de8c9e8f0ea8ee9b0dfc89b90086ae47d5d7470b6a4d438276576b1d79cbd90736a63 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-http@npm:^3.972.33": - version: 3.972.33 - resolution: "@aws-sdk/credential-provider-http@npm:3.972.33" - dependencies: - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/fetch-http-handler": "npm:^5.3.17" - "@smithy/node-http-handler": "npm:^4.6.1" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/smithy-client": "npm:^4.12.13" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-stream": "npm:^4.5.25" - tslib: "npm:^2.6.2" - checksum: 10c0/c2682171be61dd255506936f3a0efd4214e5a2a6299da08cc265a525be896ef02b18f6b8cf42262899bc8d9cbd470e0ab81bf13dc370cc34fbc934a7d7f0a553 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-ini@npm:^3.972.35": - version: 3.972.35 - resolution: "@aws-sdk/credential-provider-ini@npm:3.972.35" - dependencies: - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/credential-provider-env": "npm:^3.972.31" - "@aws-sdk/credential-provider-http": "npm:^3.972.33" - "@aws-sdk/credential-provider-login": "npm:^3.972.35" - "@aws-sdk/credential-provider-process": "npm:^3.972.31" - "@aws-sdk/credential-provider-sso": "npm:^3.972.35" - "@aws-sdk/credential-provider-web-identity": "npm:^3.972.35" - "@aws-sdk/nested-clients": "npm:^3.997.3" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/credential-provider-imds": "npm:^4.2.14" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/shared-ini-file-loader": "npm:^4.4.9" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/2a75a906aa94d975aa9f2ce92d691ba239d3e0253b06ab60d1aea89b098cbe97a2d1ee3de1d2ac2e5e6e4a171f1e28fb9dee39d529fc2a1e5e524b5b59d55ed0 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-login@npm:^3.972.35": - version: 3.972.35 - resolution: "@aws-sdk/credential-provider-login@npm:3.972.35" - dependencies: - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/nested-clients": "npm:^3.997.3" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/shared-ini-file-loader": "npm:^4.4.9" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/bab29212a3d9b7cc8fd70e0cc769ba2c462258e8e8754dbf550e5326d2bdab4177fa0250fc4073cf20dcaa897c61660a35028a071b6617fa31fafaf9c099b00a - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-node@npm:^3.972.36": - version: 3.972.36 - resolution: "@aws-sdk/credential-provider-node@npm:3.972.36" - dependencies: - "@aws-sdk/credential-provider-env": "npm:^3.972.31" - "@aws-sdk/credential-provider-http": "npm:^3.972.33" - "@aws-sdk/credential-provider-ini": "npm:^3.972.35" - "@aws-sdk/credential-provider-process": "npm:^3.972.31" - "@aws-sdk/credential-provider-sso": "npm:^3.972.35" - "@aws-sdk/credential-provider-web-identity": "npm:^3.972.35" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/credential-provider-imds": "npm:^4.2.14" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/shared-ini-file-loader": "npm:^4.4.9" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/2c6c9502a84e45da5eb48dc38b46fb3608f0b58facd011e11584d64415a6b1daac1ad1414b98420321cd4237dee40519305e961a83766fb96f4659d72ba7067c - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-process@npm:^3.972.31": - version: 3.972.31 - resolution: "@aws-sdk/credential-provider-process@npm:3.972.31" - dependencies: - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/shared-ini-file-loader": "npm:^4.4.9" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/63499d4b05983dfb5478d2a3875aeb1f4e4b5d61168fbd836e270388e9605a7e353b95e099323f4b40035bd85f0f9dc233b741033ea189c7ecf3aa39f5df98f5 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-sso@npm:^3.972.35": - version: 3.972.35 - resolution: "@aws-sdk/credential-provider-sso@npm:3.972.35" - dependencies: - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/nested-clients": "npm:^3.997.3" - "@aws-sdk/token-providers": "npm:3.1036.0" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/shared-ini-file-loader": "npm:^4.4.9" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/5fbc36c3dc24c16ecb324b9c9ea5756106c7284be1666af72e9d078ccb45db6e5099a323c7d7f70aed78296fca084d647555bbd411d37a73f1d1c88cacfd31d9 - languageName: node - linkType: hard - -"@aws-sdk/credential-provider-web-identity@npm:^3.972.35": - version: 3.972.35 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.972.35" - dependencies: - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/nested-clients": "npm:^3.997.3" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/shared-ini-file-loader": "npm:^4.4.9" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/61e55a0a6f85b8fb78fd2f1295e3cb274ad6c3b244cbdec7def8f4da96ddda00c38cb00269deb4b10fb1b04eeaf91cb8efe7d24e94087daa84e6a932756ad884 - languageName: node - linkType: hard - -"@aws-sdk/credential-providers@npm:^3.1036.0": - version: 3.1036.0 - resolution: "@aws-sdk/credential-providers@npm:3.1036.0" - dependencies: - "@aws-sdk/client-cognito-identity": "npm:3.1036.0" - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/credential-provider-cognito-identity": "npm:^3.972.28" - "@aws-sdk/credential-provider-env": "npm:^3.972.31" - "@aws-sdk/credential-provider-http": "npm:^3.972.33" - "@aws-sdk/credential-provider-ini": "npm:^3.972.35" - "@aws-sdk/credential-provider-login": "npm:^3.972.35" - "@aws-sdk/credential-provider-node": "npm:^3.972.36" - "@aws-sdk/credential-provider-process": "npm:^3.972.31" - "@aws-sdk/credential-provider-sso": "npm:^3.972.35" - "@aws-sdk/credential-provider-web-identity": "npm:^3.972.35" - "@aws-sdk/nested-clients": "npm:^3.997.3" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/config-resolver": "npm:^4.4.17" - "@smithy/core": "npm:^3.23.17" - "@smithy/credential-provider-imds": "npm:^4.2.14" - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/d4690b5f48786d3edd4dea825cc56144326c38456c3637e1b3566a8cbb9883d9ae56cb77830007e6c4154eb35ac4ac2361f69eb7ee5d672ffd35f73fe76b1ea4 - languageName: node - linkType: hard - -"@aws-sdk/middleware-host-header@npm:^3.972.10": - version: 3.972.10 - resolution: "@aws-sdk/middleware-host-header@npm:3.972.10" - dependencies: - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/e631b48f8d8fd40f8977da8d1fc012208f953000dd5645dc0a700c7283af8fafb996c9c1c50e40b8392c402ad98d11e0ddddb949896db5163a7f06e2385e619a - languageName: node - linkType: hard - -"@aws-sdk/middleware-logger@npm:^3.972.10": - version: 3.972.10 - resolution: "@aws-sdk/middleware-logger@npm:3.972.10" - dependencies: - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/a24e0c98b3cf6c9b7960bf8979d2ab8f839fb89294ba8943136d99dbe7370cc45b010460ed7f5bf14ab6ad8e113ccec6387cf1bda655bcbdb58722df21d9b713 - languageName: node - linkType: hard - -"@aws-sdk/middleware-recursion-detection@npm:^3.972.11": - version: 3.972.11 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.972.11" - dependencies: - "@aws-sdk/types": "npm:^3.973.8" - "@aws/lambda-invoke-store": "npm:^0.2.2" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/e52501b00e79e714218897ddec9edd40ecf33fdb43c19b00195c8ed71c8295d0d148f07465465d464f103a23aa535dc1daf60bbb5b95303e330767a5eba78f54 - languageName: node - linkType: hard - -"@aws-sdk/middleware-sdk-s3@npm:^3.972.34": - version: 3.972.34 - resolution: "@aws-sdk/middleware-sdk-s3@npm:3.972.34" - dependencies: - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/types": "npm:^3.973.8" - "@aws-sdk/util-arn-parser": "npm:^3.972.3" - "@smithy/core": "npm:^3.23.17" - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/signature-v4": "npm:^5.3.14" - "@smithy/smithy-client": "npm:^4.12.13" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-config-provider": "npm:^4.2.2" - "@smithy/util-middleware": "npm:^4.2.14" - "@smithy/util-stream": "npm:^4.5.25" - "@smithy/util-utf8": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/608f0e9ce9b121b8c8f06180ef8e4afd24d98f1f10c0454eaba775dc3b33edd8ebebca506960d25006aa5355b1cd4980c3aaf6662370d27c92eb63b76a0ab58b - languageName: node - linkType: hard - -"@aws-sdk/middleware-user-agent@npm:^3.972.35": - version: 3.972.35 - resolution: "@aws-sdk/middleware-user-agent@npm:3.972.35" - dependencies: - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/types": "npm:^3.973.8" - "@aws-sdk/util-endpoints": "npm:^3.996.8" - "@smithy/core": "npm:^3.23.17" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-retry": "npm:^4.3.4" - tslib: "npm:^2.6.2" - checksum: 10c0/8982375e6b7785592465f0707c1f79da87324de1f503a8d8ca5f362e853ebc95083db74a96c4e676ae13e154a576d3eaf859ebb5519825bd521fc5c7b2b3caef - languageName: node - linkType: hard - -"@aws-sdk/nested-clients@npm:^3.997.3": - version: 3.997.3 - resolution: "@aws-sdk/nested-clients@npm:3.997.3" - dependencies: - "@aws-crypto/sha256-browser": "npm:5.2.0" - "@aws-crypto/sha256-js": "npm:5.2.0" - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/middleware-host-header": "npm:^3.972.10" - "@aws-sdk/middleware-logger": "npm:^3.972.10" - "@aws-sdk/middleware-recursion-detection": "npm:^3.972.11" - "@aws-sdk/middleware-user-agent": "npm:^3.972.35" - "@aws-sdk/region-config-resolver": "npm:^3.972.13" - "@aws-sdk/signature-v4-multi-region": "npm:^3.996.22" - "@aws-sdk/types": "npm:^3.973.8" - "@aws-sdk/util-endpoints": "npm:^3.996.8" - "@aws-sdk/util-user-agent-browser": "npm:^3.972.10" - "@aws-sdk/util-user-agent-node": "npm:^3.973.21" - "@smithy/config-resolver": "npm:^4.4.17" - "@smithy/core": "npm:^3.23.17" - "@smithy/fetch-http-handler": "npm:^5.3.17" - "@smithy/hash-node": "npm:^4.2.14" - "@smithy/invalid-dependency": "npm:^4.2.14" - "@smithy/middleware-content-length": "npm:^4.2.14" - "@smithy/middleware-endpoint": "npm:^4.4.32" - "@smithy/middleware-retry": "npm:^4.5.5" - "@smithy/middleware-serde": "npm:^4.2.20" - "@smithy/middleware-stack": "npm:^4.2.14" - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/node-http-handler": "npm:^4.6.1" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/smithy-client": "npm:^4.12.13" - "@smithy/types": "npm:^4.14.1" - "@smithy/url-parser": "npm:^4.2.14" - "@smithy/util-base64": "npm:^4.3.2" - "@smithy/util-body-length-browser": "npm:^4.2.2" - "@smithy/util-body-length-node": "npm:^4.2.3" - "@smithy/util-defaults-mode-browser": "npm:^4.3.49" - "@smithy/util-defaults-mode-node": "npm:^4.2.54" - "@smithy/util-endpoints": "npm:^3.4.2" - "@smithy/util-middleware": "npm:^4.2.14" - "@smithy/util-retry": "npm:^4.3.4" - "@smithy/util-utf8": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/7dd2601bcc1ffe851b3dd1c9d3ff5127ce164a0761c39efe69a5176ffff6e4a2e680cc28bbe881a6dfd0b54f934c6bbbf5edbb0d99b51384dfd4ed99aff14da9 - languageName: node - linkType: hard - -"@aws-sdk/region-config-resolver@npm:^3.972.13": - version: 3.972.13 - resolution: "@aws-sdk/region-config-resolver@npm:3.972.13" - dependencies: - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/config-resolver": "npm:^4.4.17" - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/8cc3e5433ccf9ec4efb6d12ccd924701cfd6fb018124c9e5106486da10402ea1b83b0855353dae5e0f31ad2c7b6d962ac832350a5cdbeda59a30231525fd1118 - languageName: node - linkType: hard - -"@aws-sdk/signature-v4-multi-region@npm:^3.996.22": - version: 3.996.22 - resolution: "@aws-sdk/signature-v4-multi-region@npm:3.996.22" - dependencies: - "@aws-sdk/middleware-sdk-s3": "npm:^3.972.34" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/signature-v4": "npm:^5.3.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/b49eb74c510064059f150ad3a8bfa017db3e6945dccb2af487bb2dbf5d0764db65a25f441ad8b1583cdc8cc1a76f5e8e531f121697a5c581171c25b5713ea2b3 - languageName: node - linkType: hard - -"@aws-sdk/token-providers@npm:3.1036.0": - version: 3.1036.0 - resolution: "@aws-sdk/token-providers@npm:3.1036.0" - dependencies: - "@aws-sdk/core": "npm:^3.974.5" - "@aws-sdk/nested-clients": "npm:^3.997.3" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/shared-ini-file-loader": "npm:^4.4.9" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/e2c66516d76858a2f98fe4d67584c32408f4071fcc83c8a79cf6566874fc2918043bc4cc28a6ac916dca32f78c9c34ec237e04838b7ecb8d56fac8a024e8a1f7 - languageName: node - linkType: hard - -"@aws-sdk/types@npm:^3.222.0": - version: 3.821.0 - resolution: "@aws-sdk/types@npm:3.821.0" - dependencies: - "@smithy/types": "npm:^4.3.1" - tslib: "npm:^2.6.2" - checksum: 10c0/6202b2c0db1dd5ee78e6dc45c51f8b19deff0ee400dd5a7a15d089cc5493a2db6a6e0553ff32742e8bc810d428b36599534e14c1b466695550aef1b1d87f043d - languageName: node - linkType: hard - -"@aws-sdk/types@npm:^3.973.8": - version: 3.973.8 - resolution: "@aws-sdk/types@npm:3.973.8" - dependencies: - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/4823579e7dd0f6dcce9e9fea9630091eb46e3596bc468614a072f682b1eab6f048854ccf5e9398459ada175c13dfc636ffa8c1d3aa655cf6f22447f9c1a02f7f - languageName: node - linkType: hard - -"@aws-sdk/util-arn-parser@npm:^3.972.3": - version: 3.972.3 - resolution: "@aws-sdk/util-arn-parser@npm:3.972.3" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/75c94dcd5d99a60375ce3474b0ee4f1ca17abdcd46ffbf34ce9d2e15238d77903c8993dddd46f1f328a7989c5aaec0c7dfef8b3eaa3e1125bea777399cfc46f2 - languageName: node - linkType: hard - -"@aws-sdk/util-endpoints@npm:^3.996.8": - version: 3.996.8 - resolution: "@aws-sdk/util-endpoints@npm:3.996.8" - dependencies: - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/types": "npm:^4.14.1" - "@smithy/url-parser": "npm:^4.2.14" - "@smithy/util-endpoints": "npm:^3.4.2" - tslib: "npm:^2.6.2" - checksum: 10c0/66f17e85357ab8e265ab7d1c9a69a064ad3bea99420c786be9ef1f92bc71dca22d328bbceeaf6c64b4a3c37161b78318a3e4a424bf247dcb211d7ae29344db2f - languageName: node - linkType: hard - -"@aws-sdk/util-locate-window@npm:^3.0.0": - version: 3.873.0 - resolution: "@aws-sdk/util-locate-window@npm:3.873.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/b72af4921c5f036bd9aeb1b7a40d66c6cc317a9b5d6e249ef296bbbb2402f262139df03e21a5300b941d6914d879742911841cf2189c8b63df4fd2f8e0c76cc2 - languageName: node - linkType: hard - -"@aws-sdk/util-user-agent-browser@npm:^3.972.10": - version: 3.972.10 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.972.10" - dependencies: - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/types": "npm:^4.14.1" - bowser: "npm:^2.11.0" - tslib: "npm:^2.6.2" - checksum: 10c0/e139dda2cb51a0a3553c80ec6f89c39cb1292876c116f8449f21a7fdbe39bd7b545ef8ea69a447dd9fa2aa43c99f625ee6a55cbf6d8e6cf2094d0ef00ceb1e36 - languageName: node - linkType: hard - -"@aws-sdk/util-user-agent-node@npm:^3.973.21": - version: 3.973.21 - resolution: "@aws-sdk/util-user-agent-node@npm:3.973.21" - dependencies: - "@aws-sdk/middleware-user-agent": "npm:^3.972.35" - "@aws-sdk/types": "npm:^3.973.8" - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-config-provider": "npm:^4.2.2" - tslib: "npm:^2.6.2" - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - checksum: 10c0/e7479bebbeebbee64923be8ccc414e8c1d6d22c3906bef32335713fcb20d72b7bea78e3b39af66d7ffdf3498fd7057d7f4c3e4d2a5561df4f69a4b3f2dfebf67 - languageName: node - linkType: hard - -"@aws-sdk/xml-builder@npm:^3.972.19": - version: 3.972.19 - resolution: "@aws-sdk/xml-builder@npm:3.972.19" - dependencies: - "@smithy/types": "npm:^4.14.1" - fast-xml-parser: "npm:5.7.1" - tslib: "npm:^2.6.2" - checksum: 10c0/2aff71a4a83107f0452c481ba5e4bd24ac554d81797e66d239cc45f339e7f7a73c39325fa9dcdacb1288ae229d9f3be59880ba1d48bb0d7fa30397b472a9fd68 - languageName: node - linkType: hard - -"@aws/lambda-invoke-store@npm:^0.2.2": - version: 0.2.3 - resolution: "@aws/lambda-invoke-store@npm:0.2.3" - checksum: 10c0/3869a5d2494ff81fba306d603c0f2e36c59f89c4efdffd1105a208a595da77059547209a163b6f0c1b716e9d273ce24f94dcbd5a08bad74b2602d13711b0cb3b - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.10.4": - version: 7.27.1 - resolution: "@babel/code-frame@npm:7.27.1" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.27.1" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.1.1" - checksum: 10c0/5dd9a18baa5fce4741ba729acc3a3272c49c25cb8736c4b18e113099520e7ef7b545a4096a26d600e4416157e63e87d66db46aa3fbf0a5f2286da2705c12da00 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.26.2": - version: 7.26.2 - resolution: "@babel/code-frame@npm:7.26.2" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.28.6": - version: 7.29.0 - resolution: "@babel/code-frame@npm:7.29.0" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.28.5" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.1.1" - checksum: 10c0/d34cc504e7765dfb576a663d97067afb614525806b5cad1a5cc1a7183b916fec8ff57fa233585e3926fd5a9e6b31aae6df91aa81ae9775fb7a28f658d3346f0d - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/code-frame@npm:7.29.7" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.29.7" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.1.1" - checksum: 10c0/169fc2080169a40c1760155eaaaf739bcb882df0bec76a83adbda5493645bc17270a3434b8848c494b1933e96fe1d147370001e3cda09a39f43ae30f08ef2069 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/compat-data@npm:7.29.7" - checksum: 10c0/47913f05e08a45a1c9df38c02b4b49e391005085b489432647a1abe112e5d9c75e3be8ea5972b7f6da4ec5d1339922ceb9ea02b8a25d4ed1cb8636e5261f344e - languageName: node - linkType: hard - -"@babel/core@npm:^7.18.5, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.0": - version: 7.29.7 - resolution: "@babel/core@npm:7.29.7" - dependencies: - "@babel/code-frame": "npm:^7.29.7" - "@babel/generator": "npm:^7.29.7" - "@babel/helper-compilation-targets": "npm:^7.29.7" - "@babel/helper-module-transforms": "npm:^7.29.7" - "@babel/helpers": "npm:^7.29.7" - "@babel/parser": "npm:^7.29.7" - "@babel/template": "npm:^7.29.7" - "@babel/traverse": "npm:^7.29.7" - "@babel/types": "npm:^7.29.7" - "@jridgewell/remapping": "npm:^2.3.5" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/112fb09c24de7a1de64d1de2c31fe65c4e6af4cb2fb6e6d99ea5373e6fc51e75b88581c0efae4c4c68f119a02a988c7106e95011a41530a2fb8ed793c7eaa07b - languageName: node - linkType: hard - -"@babel/generator@npm:^7.26.2, @babel/generator@npm:^7.27.0": - version: 7.29.1 - resolution: "@babel/generator@npm:7.29.1" - dependencies: - "@babel/parser": "npm:^7.29.0" - "@babel/types": "npm:^7.29.0" - "@jridgewell/gen-mapping": "npm:^0.3.12" - "@jridgewell/trace-mapping": "npm:^0.3.28" - jsesc: "npm:^3.0.2" - checksum: 10c0/349086e6876258ef3fb2823030fee0f6c0eb9c3ebe35fc572e16997f8c030d765f636ddc6299edae63e760ea6658f8ee9a2edfa6d6b24c9a80c917916b973551 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/generator@npm:7.29.7" - dependencies: - "@babel/parser": "npm:^7.29.7" - "@babel/types": "npm:^7.29.7" - "@jridgewell/gen-mapping": "npm:^0.3.12" - "@jridgewell/trace-mapping": "npm:^0.3.28" - jsesc: "npm:^3.0.2" - checksum: 10c0/9bf72b01b5bd0ea5b1288a0e37dbd360bff2f2b1ce73342c0d40fb3db2ec3dc004ada5ffa925c5e12939a416eed59e600d562b8ecd938ce0d27dfd0eb6c6c2b7 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-compilation-targets@npm:7.29.7" - dependencies: - "@babel/compat-data": "npm:^7.29.7" - "@babel/helper-validator-option": "npm:^7.29.7" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/4c15fd4c69a0a7047799a28a88460c19cede0a0ee8af994ea169114986f4af48b92c7393a4a3fee0456c11a656eece3448a6ed06354453d6c27cccf17195453b - languageName: node - linkType: hard - -"@babel/helper-globals@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-globals@npm:7.29.7" - checksum: 10c0/f38417c40b1129a1b2b519ca961b9040c8827d1444fd74068702286b91b77089431dc76b6b9d5c1496e5da2a4f3ad329c6946e688ba3fa0d1d0b3d2b4f34f36a - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-module-imports@npm:7.29.7" - dependencies: - "@babel/traverse": "npm:^7.29.7" - "@babel/types": "npm:^7.29.7" - checksum: 10c0/6adf60d97356027413342a092f818d9678c4f5caff716a33e3284b5ae14e47a9e88059d421dde4ee4894691260039a12602c0e7becadc175602194b40dfa345d - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-module-transforms@npm:7.29.7" - dependencies: - "@babel/helper-module-imports": "npm:^7.29.7" - "@babel/helper-validator-identifier": "npm:^7.29.7" - "@babel/traverse": "npm:^7.29.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/ee5a2172c24a42be696836f4b0d947489c9729d8adf5821885cf77d1ad5333e3c447368e9a71f67df1099570490553dccf9f888ef0a92a48aa63cb086bd8c7e1 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-string-parser@npm:7.27.1" - checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-string-parser@npm:7.29.7" - checksum: 10c0/194bc0f1716e396d5ffde56ad6119745fb9557662c98611590e5e454906783a4ccb21ce93056b8eb69a4909044834e45d96e50ac695bbe9e3221648fe033c06c - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-identifier@npm:7.25.9" - checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-validator-identifier@npm:7.27.1" - checksum: 10c0/c558f11c4871d526498e49d07a84752d1800bf72ac0d3dad100309a2eaba24efbf56ea59af5137ff15e3a00280ebe588560534b0e894a4750f8b1411d8f78b84 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/helper-validator-identifier@npm:7.28.5" - checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-validator-identifier@npm:7.29.7" - checksum: 10c0/4795354e7ae0dcafa72de1cd04ec51252dc1498517170beaf019e03effc5b7bf13c6b21a3949a77e07b8125be7f106ed1131350d8ebd4566ae874094a726d62b - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helper-validator-option@npm:7.29.7" - checksum: 10c0/d2a06c6d0ac40ba4a2f219fc2cab249c7a94bacdb2686273b7f9598571c908809b48468ff588915a346e6cc7296f60b581023d1d498b747fed06f779d335c2cc - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/helpers@npm:7.29.7" - dependencies: - "@babel/template": "npm:^7.29.7" - "@babel/types": "npm:^7.29.7" - checksum: 10c0/218e8d10953647c9f44775f5a022b227a182674853b5ea8631889deb7e1a3e4bc870388aaecf59bb8bd92a87f9a96220ed3f70a35bffec6bcf9169ecb67891ac - languageName: node - linkType: hard - -"@babel/parser@npm:7.27.0": - version: 7.27.0 - resolution: "@babel/parser@npm:7.27.0" - dependencies: - "@babel/types": "npm:^7.27.0" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/ba2ed3f41735826546a3ef2a7634a8d10351df221891906e59b29b0a0cd748f9b0e7a6f07576858a9de8e77785aad925c8389ddef146de04ea2842047c9d2859 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.24.4, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/parser@npm:7.29.0" - dependencies: - "@babel/types": "npm:^7.29.0" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/333b2aa761264b91577a74bee86141ef733f9f9f6d4fc52548e4847dc35dfbf821f58c46832c637bfa761a6d9909d6a68f7d1ed59e17e4ffbb958dc510c17b62 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.27.0": - version: 7.28.5 - resolution: "@babel/parser@npm:7.28.5" - dependencies: - "@babel/types": "npm:^7.28.5" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/5bbe48bf2c79594ac02b490a41ffde7ef5aa22a9a88ad6bcc78432a6ba8a9d638d531d868bd1f104633f1f6bba9905746e15185b8276a3756c42b765d131b1ef - languageName: node - linkType: hard - -"@babel/parser@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/parser@npm:7.29.7" - dependencies: - "@babel/types": "npm:^7.29.7" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/65133038f80b54a714d6027cb77cee3f9a6b5c4c6842ce674301e13947cbcbfa8055e63acaf1b84c085d34226a14425b2c2b97b829e0e226d2e8f1299942a51d - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.12.5": - version: 7.28.3 - resolution: "@babel/runtime@npm:7.28.3" - checksum: 10c0/b360f82c2c5114f2a062d4d143d7b4ec690094764853937110585a9497977aed66c102166d0e404766c274e02a50ffb8f6d77fef7251ecf3f607f0e03e6397bc - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.18.6": - version: 7.26.10 - resolution: "@babel/runtime@npm:7.26.10" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/6dc6d88c7908f505c4f7770fb4677dfa61f68f659b943c2be1f2a99cb6680343462867abf2d49822adc435932919b36c77ac60125793e719ea8745f2073d3745 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.18.3": - version: 7.28.6 - resolution: "@babel/runtime@npm:7.28.6" - checksum: 10c0/358cf2429992ac1c466df1a21c1601d595c46930a13c1d4662fde908d44ee78ec3c183aaff513ecb01ef8c55c3624afe0309eeeb34715672dbfadb7feedb2c0d - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": - version: 7.27.6 - resolution: "@babel/runtime@npm:7.27.6" - checksum: 10c0/89726be83f356f511dcdb74d3ea4d873a5f0cf0017d4530cb53aa27380c01ca102d573eff8b8b77815e624b1f8c24e7f0311834ad4fb632c90a770fda00bd4c8 - languageName: node - linkType: hard - -"@babel/template@npm:^7.27.0": - version: 7.28.6 - resolution: "@babel/template@npm:7.28.6" - dependencies: - "@babel/code-frame": "npm:^7.28.6" - "@babel/parser": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10c0/66d87225ed0bc77f888181ae2d97845021838c619944877f7c4398c6748bcf611f216dfd6be74d39016af502bca876e6ce6873db3c49e4ac354c56d34d57e9f5 - languageName: node - linkType: hard - -"@babel/template@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/template@npm:7.29.7" - dependencies: - "@babel/code-frame": "npm:^7.29.7" - "@babel/parser": "npm:^7.29.7" - "@babel/types": "npm:^7.29.7" - checksum: 10c0/8bb7f900dcab0e9e1c5ffbc33ca10e0d26b7b2e2ca804becb73ee771b9c4ed6e2908a4ae4a14c08560febb45d2b6b9a173955e42ad404d05f8b04840a14d9c58 - languageName: node - linkType: hard - -"@babel/traverse@npm:7.27.0": - version: 7.27.0 - resolution: "@babel/traverse@npm:7.27.0" - dependencies: - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.27.0" - "@babel/parser": "npm:^7.27.0" - "@babel/template": "npm:^7.27.0" - "@babel/types": "npm:^7.27.0" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/c7af29781960dacaae51762e8bc6c4b13d6ab4b17312990fbca9fc38e19c4ad7fecaae24b1cf52fb844e8e6cdc76c70ad597f90e496bcb3cc0a1d66b41a0aa5b - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/traverse@npm:7.29.7" - dependencies: - "@babel/code-frame": "npm:^7.29.7" - "@babel/generator": "npm:^7.29.7" - "@babel/helper-globals": "npm:^7.29.7" - "@babel/parser": "npm:^7.29.7" - "@babel/template": "npm:^7.29.7" - "@babel/types": "npm:^7.29.7" - debug: "npm:^4.3.1" - checksum: 10c0/e256a1fbdb956555b76f3c285b1e453f6bedec8b3afb61751d99d933efd11c7d79caf5ddf2493570058a9f7deaa1b48324380d7c1aa1443fd9508becbf56331a - languageName: node - linkType: hard - -"@babel/types@npm:^7.26.0, @babel/types@npm:^7.27.0, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": - version: 7.29.0 - resolution: "@babel/types@npm:7.29.0" - dependencies: - "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.28.5" - checksum: 10c0/23cc3466e83bcbfab8b9bd0edaafdb5d4efdb88b82b3be6728bbade5ba2f0996f84f63b1c5f7a8c0d67efded28300898a5f930b171bb40b311bca2029c4e9b4f - languageName: node - linkType: hard - -"@babel/types@npm:^7.28.5": - version: 7.28.5 - resolution: "@babel/types@npm:7.28.5" - dependencies: - "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.28.5" - checksum: 10c0/a5a483d2100befbf125793640dec26b90b95fd233a94c19573325898a5ce1e52cdfa96e495c7dcc31b5eca5b66ce3e6d4a0f5a4a62daec271455959f208ab08a - languageName: node - linkType: hard - -"@babel/types@npm:^7.29.7": - version: 7.29.7 - resolution: "@babel/types@npm:7.29.7" - dependencies: - "@babel/helper-string-parser": "npm:^7.29.7" - "@babel/helper-validator-identifier": "npm:^7.29.7" - checksum: 10c0/b6623994c69717fa27294f5fa46d59140338e2d86c6c1c13085c84ef7d53086ee357fbf4fe9abe3dd3da75734dc77c4c0df2f90fb29e667558bb3b3fb705e88f - languageName: node - linkType: hard - -"@bprogress/core@npm:^1.3.4": - version: 1.3.4 - resolution: "@bprogress/core@npm:1.3.4" - checksum: 10c0/fae88e83375c5d67b31a7186b6e6fad0f1ef59daee7408c9d6fe150ab3e1b368acfebd1b73ef913567c340803dac96841d81acc05268cdb99118431a26e3f258 - languageName: node - linkType: hard - -"@bprogress/next@npm:^3.2.12": - version: 3.2.12 - resolution: "@bprogress/next@npm:3.2.12" - dependencies: - "@bprogress/core": "npm:^1.3.4" - "@bprogress/react": "npm:^1.2.7" - peerDependencies: - next: ">=13.0.0" - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/8d993202a81125aae9543814d2248ee9e72e395ba570789362dbaaa9f09dd553f21b6a5c510843eb5fcb0eedfd21b0a7499ac0aa8a924a581910fb2531949aec - languageName: node - linkType: hard - -"@bprogress/react@npm:^1.2.7": - version: 1.2.7 - resolution: "@bprogress/react@npm:1.2.7" - dependencies: - "@bprogress/core": "npm:^1.3.4" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/f7683197118ab3a7355dfb8d12e4330ffa543ea4262bc8e04a54fb7a1caf0853e77e9a7648dcb2bba6082e0af1cf6adc5adfba80c63d45f953431e7c7a865419 - languageName: node - linkType: hard - -"@braintree/sanitize-url@npm:^7.1.2": - version: 7.1.2 - resolution: "@braintree/sanitize-url@npm:7.1.2" - checksum: 10c0/62f2aa0cf58626e3880b2dc1025c42064b4639abd157ae4e1c35f4c2f5031e9273772046a423979845069c814e27ff818e8e669280dc53585e6f033d5b7a59cb - languageName: node - linkType: hard - -"@bull-board/api@npm:9.3.1": - version: 9.3.1 - resolution: "@bull-board/api@npm:9.3.1" - dependencies: - redis-info: "npm:^3.1.0" - peerDependencies: - "@bull-board/ui": 9.3.1 - bull: ^4.16.5 - bullmq: ^5.79.2 || ^6.0.0 - peerDependenciesMeta: - bull: - optional: true - bullmq: - optional: true - checksum: 10c0/a08ddd1f03709a75ac3aedc0c525fe5cd50f60a8efec0f26381b7180393eab3b1d0e8e17f2b79c7761320b4ec10ecf987b415fb84f64605f54fafa4e491cb1d9 - languageName: node - linkType: hard - -"@bull-board/express@npm:9.3.1": - version: 9.3.1 - resolution: "@bull-board/express@npm:9.3.1" - dependencies: - "@bull-board/api": "npm:9.3.1" - "@bull-board/ui": "npm:9.3.1" - ejs: "npm:^6.0.1" - express: "npm:^5.2.1" - checksum: 10c0/9231097fa28ba6370e466f03da4d81bedc71abd174aa0c6449cba175fba6d5fa45fdd2dd63e268b6b4f0a320e01089954272933882757e1ba47dc8c18f7aaca2 - languageName: node - linkType: hard - -"@bull-board/metrics@npm:9.3.1": - version: 9.3.1 - resolution: "@bull-board/metrics@npm:9.3.1" - dependencies: - "@bull-board/api": "npm:9.3.1" - peerDependencies: - ioredis: ^5.0.0 || ^6.0.0 - checksum: 10c0/a516900d9216610cf8226f87d961e30b9ac3654bffb978865e4238e66914dae03acbe203f05baabb32f8fc37247e5d04d555896738b9f02674096f926e1be687 - languageName: node - linkType: hard - -"@bull-board/ui@npm:9.3.1": - version: 9.3.1 - resolution: "@bull-board/ui@npm:9.3.1" - dependencies: - "@bull-board/api": "npm:9.3.1" - checksum: 10c0/9249c02ea5532489e4ebadc5e7312b903908cdbcab48ece3f63c45abe63bcb9abf2c12b9da8c58ca70a1e7ed14c08c8f07dc4287c210d67111d7448c5f6635fa - languageName: node - linkType: hard - -"@cfworker/json-schema@npm:^4.0.2": - version: 4.1.1 - resolution: "@cfworker/json-schema@npm:4.1.1" - checksum: 10c0/b5253486d346b7de6feec9c73954f612b11019dacb9023d710a5666df2f5fc145dd88b6b913c88726c6d97e2e258a515fa2cab177f58b18da6bac3738cbc4739 - languageName: node - linkType: hard - -"@chevrotain/types@npm:~11.1.2": - version: 11.1.2 - resolution: "@chevrotain/types@npm:11.1.2" - checksum: 10c0/c0c4679a3d407df34e18d5adfa7ac599b4a2bfddbf68da6e43678b9b3e16ab911de7766b37b9fc466261c3dead3db1b620e2e344f800fa9f0f381720475eda8f - languageName: node - linkType: hard - -"@codemirror/autocomplete@npm:^6.0.0, @codemirror/autocomplete@npm:^6.16.2, @codemirror/autocomplete@npm:^6.3.2, @codemirror/autocomplete@npm:^6.7.1": - version: 6.18.6 - resolution: "@codemirror/autocomplete@npm:6.18.6" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.17.0" - "@lezer/common": "npm:^1.0.0" - checksum: 10c0/65069493978b2af7c600af5020a8873270a8bc9a6820da192bf28b03535f1a0127aa5767eb30d9bfa5d36c61186ee2766925625e8a6c731194e7def0d882fb84 - languageName: node - linkType: hard - -"@codemirror/commands@npm:^6.0.0, @codemirror/commands@npm:^6.1.0, @codemirror/commands@npm:^6.6.0": - version: 6.8.0 - resolution: "@codemirror/commands@npm:6.8.0" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.4.0" - "@codemirror/view": "npm:^6.27.0" - "@lezer/common": "npm:^1.1.0" - checksum: 10c0/689f85a305f96fbe43df888c901411aefc1b937cfc8217f74d8d4d36d8bb343c5a7eae4f153391749d5fd9e49001338e39b898ce39de837d63bc83e2a6d8180d - languageName: node - linkType: hard - -"@codemirror/highlight@npm:^0.19.0": - version: 0.19.8 - resolution: "@codemirror/highlight@npm:0.19.8" - dependencies: - "@codemirror/language": "npm:^0.19.0" - "@codemirror/rangeset": "npm:^0.19.0" - "@codemirror/state": "npm:^0.19.3" - "@codemirror/view": "npm:^0.19.39" - "@lezer/common": "npm:^0.15.0" - style-mod: "npm:^4.0.0" - checksum: 10c0/64ee07946e102962339de7d2b1e10f0eb2588549650f681c63ec58b6c1223ed9ed800097d87d5c52150024b7070ba3a0b2b2e27c8913545f85e17c72c2cfff60 - languageName: node - linkType: hard - -"@codemirror/lang-angular@npm:^0.1.0": - version: 0.1.4 - resolution: "@codemirror/lang-angular@npm:0.1.4" - dependencies: - "@codemirror/lang-html": "npm:^6.0.0" - "@codemirror/lang-javascript": "npm:^6.1.2" - "@codemirror/language": "npm:^6.0.0" - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.3.3" - checksum: 10c0/9d38350dd5e2defc58b9b18eaf50aa183b9cf8be96270845182f2992b51dbf8af78c567aa736bcd494cbf5aea8400b85b36bfd0131948475f9de7c228b9e3415 - languageName: node - linkType: hard - -"@codemirror/lang-cpp@npm:^6.0.0, @codemirror/lang-cpp@npm:^6.0.2": - version: 6.0.2 - resolution: "@codemirror/lang-cpp@npm:6.0.2" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/cpp": "npm:^1.0.0" - checksum: 10c0/afce320324a1536aa9c86f2bd0709d1cfb7e3c5fc5349027e146354cae566319f6d5bfada77067b26b5111bab6c3e747cc818bda926d218e261e208e36185e60 - languageName: node - linkType: hard - -"@codemirror/lang-css@npm:^6.0.0, @codemirror/lang-css@npm:^6.2.0, @codemirror/lang-css@npm:^6.3.0": - version: 6.3.1 - resolution: "@codemirror/lang-css@npm:6.3.1" - dependencies: - "@codemirror/autocomplete": "npm:^6.0.0" - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@lezer/common": "npm:^1.0.2" - "@lezer/css": "npm:^1.1.7" - checksum: 10c0/339387c5a1b90076ae41017e66d7da70dd2aca4e5e4d012c95df33d0f6e740410cf1fb53c4845e3814636d587ce6eff05ebca3173dcfc564a1f646d24f299180 - languageName: node - linkType: hard - -"@codemirror/lang-go@npm:^6.0.0, @codemirror/lang-go@npm:^6.0.1": - version: 6.0.1 - resolution: "@codemirror/lang-go@npm:6.0.1" - dependencies: - "@codemirror/autocomplete": "npm:^6.0.0" - "@codemirror/language": "npm:^6.6.0" - "@codemirror/state": "npm:^6.0.0" - "@lezer/common": "npm:^1.0.0" - "@lezer/go": "npm:^1.0.0" - checksum: 10c0/7bd2a6268859c61745177500b7261a18c1ae1adcb7a1ae2806de9258b67dc3560379a371b7533d456d139f4535ca2b7e591754cafc939335ea659b5739caa0f5 - languageName: node - linkType: hard - -"@codemirror/lang-html@npm:^6.0.0, @codemirror/lang-html@npm:^6.4.7, @codemirror/lang-html@npm:^6.4.9": - version: 6.4.9 - resolution: "@codemirror/lang-html@npm:6.4.9" - dependencies: - "@codemirror/autocomplete": "npm:^6.0.0" - "@codemirror/lang-css": "npm:^6.0.0" - "@codemirror/lang-javascript": "npm:^6.0.0" - "@codemirror/language": "npm:^6.4.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.17.0" - "@lezer/common": "npm:^1.0.0" - "@lezer/css": "npm:^1.1.0" - "@lezer/html": "npm:^1.3.0" - checksum: 10c0/0d6197aa645cc0a9da33789ea30423d4b8320b8e636c8587c7fcf58bdf90ea6934451d84ccbd9dd60dbc7046428204d7c986bd742c2cc459bee7c9653258db70 - languageName: node - linkType: hard - -"@codemirror/lang-java@npm:^6.0.0, @codemirror/lang-java@npm:^6.0.1": - version: 6.0.1 - resolution: "@codemirror/lang-java@npm:6.0.1" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/java": "npm:^1.0.0" - checksum: 10c0/d8526423f8e33019ad9095d5c4a857f5ef5f842f926f37cff4f95a99e7e28e0b27def0098e5ecb4abbafe358854d49232dc143c3a909d34eca5f9cf5c6a355fb - languageName: node - linkType: hard - -"@codemirror/lang-javascript@npm:^6.0.0, @codemirror/lang-javascript@npm:^6.1.2, @codemirror/lang-javascript@npm:^6.2.2": - version: 6.2.3 - resolution: "@codemirror/lang-javascript@npm:6.2.3" - dependencies: - "@codemirror/autocomplete": "npm:^6.0.0" - "@codemirror/language": "npm:^6.6.0" - "@codemirror/lint": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.17.0" - "@lezer/common": "npm:^1.0.0" - "@lezer/javascript": "npm:^1.0.0" - checksum: 10c0/6f7c2563325a4b9ea13aadf92e8d4fa0b4da6b6ea6f623e8a593732b7965b863bf66ca2273202954c70d4f9a2bdc74dcb03bb8100300f4c08d5834afe8f2aede - languageName: node - linkType: hard - -"@codemirror/lang-json@npm:^6.0.0, @codemirror/lang-json@npm:^6.0.1": - version: 6.0.1 - resolution: "@codemirror/lang-json@npm:6.0.1" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/json": "npm:^1.0.0" - checksum: 10c0/c70301ba43d44dbd1ff0ccab6ec6e3fb9825d61d4854b4839441a8144a9c96997acdad16d93199d157308dd80088a5e9f14b66f395c7e79f4dadc6b4e70ce8a8 - languageName: node - linkType: hard - -"@codemirror/lang-less@npm:^6.0.0, @codemirror/lang-less@npm:^6.0.2": - version: 6.0.2 - resolution: "@codemirror/lang-less@npm:6.0.2" - dependencies: - "@codemirror/lang-css": "npm:^6.2.0" - "@codemirror/language": "npm:^6.0.0" - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/af957e8d8cad2e490e0d8376bcd9e44c6c6aee9f413494799c22f09d1df795ac99c3f1d03820bd11bbe1fb1203ad72a27cfd618da922fc8e818314d2aa10b4e1 - languageName: node - linkType: hard - -"@codemirror/lang-liquid@npm:^6.0.0, @codemirror/lang-liquid@npm:^6.2.2": - version: 6.2.3 - resolution: "@codemirror/lang-liquid@npm:6.2.3" - dependencies: - "@codemirror/autocomplete": "npm:^6.0.0" - "@codemirror/lang-html": "npm:^6.0.0" - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.0.0" - "@lezer/common": "npm:^1.0.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.3.1" - checksum: 10c0/4f1a6a2a76974a97d72e07809cfbf33fe4d65b9abd10ca0abf26e4e0f5515262af3ad3acee2c86b8397471aec88de12f2e0bd590715024c9fa36ec1c18645142 - languageName: node - linkType: hard - -"@codemirror/lang-markdown@npm:^6.0.0, @codemirror/lang-markdown@npm:^6.2.5": - version: 6.3.2 - resolution: "@codemirror/lang-markdown@npm:6.3.2" - dependencies: - "@codemirror/autocomplete": "npm:^6.7.1" - "@codemirror/lang-html": "npm:^6.0.0" - "@codemirror/language": "npm:^6.3.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.0.0" - "@lezer/common": "npm:^1.2.1" - "@lezer/markdown": "npm:^1.0.0" - checksum: 10c0/dc1c8449cf320def12d2d9bbcba24a697513431650cc5a97413de9b70fc514521e1a677351f45cc73081ac1ff58812554ba580929a1f722d21ae66233f944499 - languageName: node - linkType: hard - -"@codemirror/lang-php@npm:^6.0.0, @codemirror/lang-php@npm:^6.0.1": - version: 6.0.1 - resolution: "@codemirror/lang-php@npm:6.0.1" - dependencies: - "@codemirror/lang-html": "npm:^6.0.0" - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@lezer/common": "npm:^1.0.0" - "@lezer/php": "npm:^1.0.0" - checksum: 10c0/1dd34674ca0dc8d1d0616efc080ef98cbe998b023d434b24a923369c78e46bad839e8c45d7d2cbe86379b410b328f0aa79a4bccd7739a2bdfd9fd47071a8b521 - languageName: node - linkType: hard - -"@codemirror/lang-python@npm:^6.0.0": - version: 6.2.1 - resolution: "@codemirror/lang-python@npm:6.2.1" - dependencies: - "@codemirror/autocomplete": "npm:^6.3.2" - "@codemirror/language": "npm:^6.8.0" - "@codemirror/state": "npm:^6.0.0" - "@lezer/common": "npm:^1.2.1" - "@lezer/python": "npm:^1.1.4" - checksum: 10c0/6e92ac7e5e6e3162cfbbef40be6314278b9b9ff6f65cfc207a75ec95d84a404b9930913240e1a15e3d18c538f6b243f6a0bba4c3e37fa4e318939dfebc51ebd0 - languageName: node - linkType: hard - -"@codemirror/lang-python@npm:^6.1.6": - version: 6.1.7 - resolution: "@codemirror/lang-python@npm:6.1.7" - dependencies: - "@codemirror/autocomplete": "npm:^6.3.2" - "@codemirror/language": "npm:^6.8.0" - "@codemirror/state": "npm:^6.0.0" - "@lezer/common": "npm:^1.2.1" - "@lezer/python": "npm:^1.1.4" - checksum: 10c0/446c8410ff5e406a9a2f9eecc4468b7059290607d6b1559a6630ccd524f51967b31703c629f123ae57c278a5305ee8687e1b17c3a9bbf89f27d04eb37010cd37 - languageName: node - linkType: hard - -"@codemirror/lang-rust@npm:^6.0.0, @codemirror/lang-rust@npm:^6.0.1": - version: 6.0.1 - resolution: "@codemirror/lang-rust@npm:6.0.1" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/rust": "npm:^1.0.0" - checksum: 10c0/688763c130c973471fadd1932db12e60bffa5e18e0e69c00a415a154e727e141cf4cc554575f193440f80347be039cc4c21e0857bd651db7421633ca4fa612b6 - languageName: node - linkType: hard - -"@codemirror/lang-sass@npm:^6.0.0, @codemirror/lang-sass@npm:^6.0.2": - version: 6.0.2 - resolution: "@codemirror/lang-sass@npm:6.0.2" - dependencies: - "@codemirror/lang-css": "npm:^6.2.0" - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@lezer/common": "npm:^1.0.2" - "@lezer/sass": "npm:^1.0.0" - checksum: 10c0/46b765121dd561598107e96afbc9313201ef661075876afa5cacc485801741f0e8c0d6bb8e6274cf2f586136db9e76898c30dfa1a993deb49bb6321e81d1ef5d - languageName: node - linkType: hard - -"@codemirror/lang-sql@npm:^6.0.0, @codemirror/lang-sql@npm:^6.7.1": - version: 6.8.0 - resolution: "@codemirror/lang-sql@npm:6.8.0" - dependencies: - "@codemirror/autocomplete": "npm:^6.0.0" - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/a2500e4cebf6c074c89338a020332c44094e7a6eead04ad6d7e423173a4f4637a6021fdbf68935a2f23550eb7b1d1d078855b3d3bf84b50ab7ad1ff01a95d463 - languageName: node - linkType: hard - -"@codemirror/lang-vue@npm:^0.1.1, @codemirror/lang-vue@npm:^0.1.3": - version: 0.1.3 - resolution: "@codemirror/lang-vue@npm:0.1.3" - dependencies: - "@codemirror/lang-html": "npm:^6.0.0" - "@codemirror/lang-javascript": "npm:^6.1.2" - "@codemirror/language": "npm:^6.0.0" - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.3.1" - checksum: 10c0/0d00d2899fcf55797c1d096ee74920e8630960343859ec469aec46e900e892b6618be972fe9f70bca133528d244621282dda787294d0a9794e0c65ff0ebeac0a - languageName: node - linkType: hard - -"@codemirror/lang-wast@npm:^6.0.0, @codemirror/lang-wast@npm:^6.0.2": - version: 6.0.2 - resolution: "@codemirror/lang-wast@npm:6.0.2" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/a45bfbcaa2f6737987420da83690a402204f52786f60640555e4382a34db5e26d0a6cb29552d7dc6ec1b47794ae68e8a9703ce6fc4ef46f3f48db9bbf85641eb - languageName: node - linkType: hard - -"@codemirror/lang-xml@npm:^6.0.0, @codemirror/lang-xml@npm:^6.1.0": - version: 6.1.0 - resolution: "@codemirror/lang-xml@npm:6.1.0" - dependencies: - "@codemirror/autocomplete": "npm:^6.0.0" - "@codemirror/language": "npm:^6.4.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.0.0" - "@lezer/common": "npm:^1.0.0" - "@lezer/xml": "npm:^1.0.0" - checksum: 10c0/14fe84cf5c8a43f1772963a0d24df55a0c8c59d253b0927a8409bc4be0e00e9cc26c378ef14879418c02504d087590bb55ccc1d09f393eef7e19852095df538a - languageName: node - linkType: hard - -"@codemirror/lang-yaml@npm:^6.0.0, @codemirror/lang-yaml@npm:^6.1.1, @codemirror/lang-yaml@npm:^6.1.2": - version: 6.1.2 - resolution: "@codemirror/lang-yaml@npm:6.1.2" - dependencies: - "@codemirror/autocomplete": "npm:^6.0.0" - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.2.0" - "@lezer/lr": "npm:^1.0.0" - "@lezer/yaml": "npm:^1.0.0" - checksum: 10c0/fc993c5e24baee0212d587c652ee7633792533c1b1e5b708d5e4f6c29e6164a3563958fd6a3bb402a64f565f7bab7edbda6c8b8cd8bfecfd0b7294f0dcf998a8 - languageName: node - linkType: hard - -"@codemirror/language-data@npm:^6.5.1": - version: 6.5.1 - resolution: "@codemirror/language-data@npm:6.5.1" - dependencies: - "@codemirror/lang-angular": "npm:^0.1.0" - "@codemirror/lang-cpp": "npm:^6.0.0" - "@codemirror/lang-css": "npm:^6.0.0" - "@codemirror/lang-go": "npm:^6.0.0" - "@codemirror/lang-html": "npm:^6.0.0" - "@codemirror/lang-java": "npm:^6.0.0" - "@codemirror/lang-javascript": "npm:^6.0.0" - "@codemirror/lang-json": "npm:^6.0.0" - "@codemirror/lang-less": "npm:^6.0.0" - "@codemirror/lang-liquid": "npm:^6.0.0" - "@codemirror/lang-markdown": "npm:^6.0.0" - "@codemirror/lang-php": "npm:^6.0.0" - "@codemirror/lang-python": "npm:^6.0.0" - "@codemirror/lang-rust": "npm:^6.0.0" - "@codemirror/lang-sass": "npm:^6.0.0" - "@codemirror/lang-sql": "npm:^6.0.0" - "@codemirror/lang-vue": "npm:^0.1.1" - "@codemirror/lang-wast": "npm:^6.0.0" - "@codemirror/lang-xml": "npm:^6.0.0" - "@codemirror/lang-yaml": "npm:^6.0.0" - "@codemirror/language": "npm:^6.0.0" - "@codemirror/legacy-modes": "npm:^6.4.0" - checksum: 10c0/5a5dfeaa5c6fba019c7ff3a380ffb11956607f9bc5556537cb0515a367fb6294628fb36b449641d82f56b2236bccae88d0741469183c71cb7bf80ea7861e8fba - languageName: node - linkType: hard - -"@codemirror/language@npm:6.x, @codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.10.2, @codemirror/language@npm:^6.10.3, @codemirror/language@npm:^6.3.0, @codemirror/language@npm:^6.4.0, @codemirror/language@npm:^6.6.0, @codemirror/language@npm:^6.8.0, @codemirror/language@npm:^6.9.0": - version: 6.11.0 - resolution: "@codemirror/language@npm:6.11.0" - dependencies: - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.23.0" - "@lezer/common": "npm:^1.1.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - style-mod: "npm:^4.0.0" - checksum: 10c0/a8e45ef6dbccc5a7389f277b026412eeecc4ce3dfd806f77f34a8d85df20e257b3b5d0da26c59d9f024e7109542614c62cfa708158da447b0ae97b8fd8476fa9 - languageName: node - linkType: hard - -"@codemirror/language@npm:^0.19.0": - version: 0.19.10 - resolution: "@codemirror/language@npm:0.19.10" - dependencies: - "@codemirror/state": "npm:^0.19.0" - "@codemirror/text": "npm:^0.19.0" - "@codemirror/view": "npm:^0.19.0" - "@lezer/common": "npm:^0.15.5" - "@lezer/lr": "npm:^0.15.0" - checksum: 10c0/aaa1a413fde7913cbe07d5ff66e634a9261214afc76e776d4eb68c7c7f6179988c27d842091bbab28059ff64027f23b492a9d976bf0e5396b1dbecdd9bd9c444 - languageName: node - linkType: hard - -"@codemirror/legacy-modes@npm:^6.4.0": - version: 6.5.1 - resolution: "@codemirror/legacy-modes@npm:6.5.1" - dependencies: - "@codemirror/language": "npm:^6.0.0" - checksum: 10c0/a5fc0c76112f1fe4add414c65876932c24d77126ee4504049fd188abc4e44c5da611beaa46cfe45d5269d6d7b49aefc10c410d457785a39ba3c233f799802cf0 - languageName: node - linkType: hard - -"@codemirror/legacy-modes@npm:^6.4.2": - version: 6.5.0 - resolution: "@codemirror/legacy-modes@npm:6.5.0" - dependencies: - "@codemirror/language": "npm:^6.0.0" - checksum: 10c0/f1d8432e96a0647a22901a065cd074391ca8daf879e92cf87d9fbae15a40777a77fe4fc2076591319d32c47f5793b203a64c1e941de088c317e7ece5d14aa1b8 - languageName: node - linkType: hard - -"@codemirror/lint@npm:^6.0.0": - version: 6.8.4 - resolution: "@codemirror/lint@npm:6.8.4" - dependencies: - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.35.0" - crelt: "npm:^1.0.5" - checksum: 10c0/2614f25c50061b8bea4a430d19b25dca03e3d3059ade0bbc5768d2a1ac1dbc2e653ccc810d951860e6bd9e37031c850f439054c6df6522d533d93984df68bc79 - languageName: node - linkType: hard - -"@codemirror/merge@npm:^6.12.1": - version: 6.12.1 - resolution: "@codemirror/merge@npm:6.12.1" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.17.0" - "@lezer/highlight": "npm:^1.0.0" - style-mod: "npm:^4.1.0" - checksum: 10c0/f031670b570598c46d80f8c55be9eb9c4e8b8ab68cf337b88300af787f5aa9d11a07fc4c8fc6d8a065a181ca1fff8ec45f3ddea3d2fa7856364dc4b2b9c9d325 - languageName: node - linkType: hard - -"@codemirror/rangeset@npm:^0.19.0, @codemirror/rangeset@npm:^0.19.5": - version: 0.19.9 - resolution: "@codemirror/rangeset@npm:0.19.9" - dependencies: - "@codemirror/state": "npm:^0.19.0" - checksum: 10c0/40fc64994f8020f29c224f4f5a5f83b4cb46252f14ec3837258e3fa27228df59fb891d67f0b42bf873b07543f3965b2e6d5a5ea567481792c904b0031b041236 - languageName: node - linkType: hard - -"@codemirror/search@npm:^6.0.0, @codemirror/search@npm:^6.5.6": - version: 6.5.10 - resolution: "@codemirror/search@npm:6.5.10" - dependencies: - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.0.0" - crelt: "npm:^1.0.5" - checksum: 10c0/01806b0a04e6274077bac5de9fc201194147da25ec888dec0186269da9aff089d321a1a09245b4de39148c76b30ba8595a95d42dea6f5913d19c3a0107401d3a - languageName: node - linkType: hard - -"@codemirror/state@npm:^0.19.0, @codemirror/state@npm:^0.19.3": - version: 0.19.9 - resolution: "@codemirror/state@npm:0.19.9" - dependencies: - "@codemirror/text": "npm:^0.19.0" - checksum: 10c0/b2107e86ab31f4ccd81f2c7848761f6cfaefdc5a215bace692917a9352c44662645535593119c75af2c850de6359771c03ebb8b6366986431a11a1195358d7af - languageName: node - linkType: hard - -"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.1, @codemirror/state@npm:^6.4.0, @codemirror/state@npm:^6.4.1, @codemirror/state@npm:^6.5.0": - version: 6.5.2 - resolution: "@codemirror/state@npm:6.5.2" - dependencies: - "@marijn/find-cluster-break": "npm:^1.0.0" - checksum: 10c0/1ef773394e32c077a8cfc1ec6d881aefb1918876f82161748e505c38d143aa1c6893c314cfec91097d28f704ec07b2a6c6b75abd435086208974256dee997282 - languageName: node - linkType: hard - -"@codemirror/text@npm:^0.19.0": - version: 0.19.6 - resolution: "@codemirror/text@npm:0.19.6" - checksum: 10c0/2c7cf96116e704e0126e4105f5a91b5feda1c9b403de47bb40ef9e650af2e38a1ba5d8f8e40725e8756260589e41337d1f815f634307adf5cd6df4bf95b61718 - languageName: node - linkType: hard - -"@codemirror/theme-one-dark@npm:^6.0.0": - version: 6.1.2 - resolution: "@codemirror/theme-one-dark@npm:6.1.2" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.0.0" - "@lezer/highlight": "npm:^1.0.0" - checksum: 10c0/d0d70ce1e03fa7e5d51cc72d8bdef043f30e14a5aee88f4dd71b64e176c3d68629c82390b9cfdab8cc1ac20d35703b65fe9160051fddc873aa67c613d9525a3d - languageName: node - linkType: hard - -"@codemirror/view@npm:^0.19.0, @codemirror/view@npm:^0.19.39": - version: 0.19.48 - resolution: "@codemirror/view@npm:0.19.48" - dependencies: - "@codemirror/rangeset": "npm:^0.19.5" - "@codemirror/state": "npm:^0.19.3" - "@codemirror/text": "npm:^0.19.0" - style-mod: "npm:^4.0.0" - w3c-keyname: "npm:^2.2.4" - checksum: 10c0/360893303540878a616b8db85990d58790ba4f7cceda1dd55383a0d49aa733a5f0a1831f31ec12e8419ebf307cc7b47f9b6fa9ddccaed970bcc37174f72f61c0 - languageName: node - linkType: hard - -"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0, @codemirror/view@npm:^6.33.0, @codemirror/view@npm:^6.35.0": - version: 6.36.4 - resolution: "@codemirror/view@npm:6.36.4" - dependencies: - "@codemirror/state": "npm:^6.5.0" - style-mod: "npm:^4.1.0" - w3c-keyname: "npm:^2.2.4" - checksum: 10c0/6381ddfefba1564f17d4782980c02bb6b5356848ecf683435928a17d166fbd37dfece9db6bbcacf40be81d5e60c473acb1a192c3199f269a8651fdd73da5c2bc - languageName: node - linkType: hard - -"@coderabbitai/bitbucket@npm:^1.1.3": - version: 1.1.3 - resolution: "@coderabbitai/bitbucket@npm:1.1.3" - dependencies: - openapi-fetch: "npm:^0.13.4" - bin: - coderabbitai-bitbucket: dist/main.js - checksum: 10c0/0c034866f8094b9ce68a5292d513fe6226d50b333a0a6ce929542b635a8bcf1d8d5abc7eb1aaf665ebce99e312a192d83b224085843d5641806ca4adc36ab0ff - languageName: node - linkType: hard - -"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": - version: 1.6.0 - resolution: "@colors/colors@npm:1.6.0" - checksum: 10c0/9328a0778a5b0db243af54455b79a69e3fb21122d6c15ef9e9fcc94881d8d17352d8b2b2590f9bdd46fac5c2d6c1636dcfc14358a20c70e22daf89e1a759b629 - languageName: node - linkType: hard - -"@csstools/color-helpers@npm:^5.0.2": - version: 5.0.2 - resolution: "@csstools/color-helpers@npm:5.0.2" - checksum: 10c0/bebaddb28b9eb58b0449edd5d0c0318fa88f3cb079602ee27e88c9118070d666dcc4e09a5aa936aba2fde6ba419922ade07b7b506af97dd7051abd08dfb2959b - languageName: node - linkType: hard - -"@csstools/css-calc@npm:^2.1.2": - version: 2.1.2 - resolution: "@csstools/css-calc@npm:2.1.2" - peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.4 - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/34ced30553968ef5d5f9e00e3b90b48c47480cf130e282e99d57ec9b09f803aab8bc06325683e72a1518b5e7180a3da8b533f1b462062757c21989a53b482e1a - languageName: node - linkType: hard - -"@csstools/css-color-parser@npm:^3.0.8": - version: 3.0.8 - resolution: "@csstools/css-color-parser@npm:3.0.8" - dependencies: - "@csstools/color-helpers": "npm:^5.0.2" - "@csstools/css-calc": "npm:^2.1.2" - peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.4 - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/90722c5a62ca94e9d578ddf59be604a76400b932bd3d4bd23cb1ae9b7ace8fcf83c06995d2b31f96f4afef24a7cefba79beb11ed7ee4999d7ecfec3869368359 - languageName: node - linkType: hard - -"@csstools/css-parser-algorithms@npm:^3.0.4": - version: 3.0.4 - resolution: "@csstools/css-parser-algorithms@npm:3.0.4" - peerDependencies: - "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/d411f07765e14eede17bccc6bd4f90ff303694df09aabfede3fd104b2dfacfd4fe3697cd25ddad14684c850328f3f9420ebfa9f78380892492974db24ae47dbd - languageName: node - linkType: hard - -"@csstools/css-tokenizer@npm:^3.0.3": - version: 3.0.3 - resolution: "@csstools/css-tokenizer@npm:3.0.3" - checksum: 10c0/c31bf410e1244b942e71798e37c54639d040cb59e0121b21712b40015fced2b0fb1ffe588434c5f8923c9cd0017cfc1c1c8f3921abc94c96edf471aac2eba5e5 - languageName: node - linkType: hard - -"@dabh/diagnostics@npm:^2.0.2": - version: 2.0.3 - resolution: "@dabh/diagnostics@npm:2.0.3" - dependencies: - colorspace: "npm:1.1.x" - enabled: "npm:2.0.x" - kuler: "npm:^2.0.0" - checksum: 10c0/a5133df8492802465ed01f2f0a5784585241a1030c362d54a602ed1839816d6c93d71dde05cf2ddb4fd0796238c19774406bd62fa2564b637907b495f52425fe - languageName: node - linkType: hard - -"@date-fns/tz@npm:^1.4.1": - version: 1.4.1 - resolution: "@date-fns/tz@npm:1.4.1" - checksum: 10c0/9033fdc4682fe3d4d147625ce04fa88a8792653594e2de8d5a438c8f3bfc0990ee28fe773f91cac6810b06d818b5b281ae0608752ba8337257d0279ded3f019a - languageName: node - linkType: hard - -"@electric-sql/pglite@npm:0.5.8": - version: 0.5.8 - resolution: "@electric-sql/pglite@npm:0.5.8" - checksum: 10c0/02af377bb73428c1fb4559683dac0a4236d62320d5cda62ad4fc45d662a74fb011f767a161cb52b9160df734066376fc80f0d1506c2bbe9506490753fa12b532 - languageName: node - linkType: hard - -"@emnapi/core@npm:1.10.0": - version: 1.10.0 - resolution: "@emnapi/core@npm:1.10.0" - dependencies: - "@emnapi/wasi-threads": "npm:1.2.1" - tslib: "npm:^2.4.0" - checksum: 10c0/f51d08227857b60632de7714d708124f0e100a1462dde6df8221760939aa3204a73193830371830fac0716f3ccd2129f2cac1b17cd7d7958bc4da9018a296edb - languageName: node - linkType: hard - -"@emnapi/core@npm:^1.3.1": - version: 1.3.1 - resolution: "@emnapi/core@npm:1.3.1" - dependencies: - "@emnapi/wasi-threads": "npm:1.0.1" - tslib: "npm:^2.4.0" - checksum: 10c0/d3be1044ad704e2c486641bc18908523490f28c7d38bd12d9c1d4ce37d39dae6c4aecd2f2eaf44c6e3bd90eaf04e0591acc440b1b038cdf43cce078a355a0ea0 - languageName: node - linkType: hard - -"@emnapi/runtime@npm:1.10.0": - version: 1.10.0 - resolution: "@emnapi/runtime@npm:1.10.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/953f14991d1aefb92ee6f8eb27dea725e484791a53a0cb5f47d9e0087b9a2c929ff2e92adf95af15d6ad456db6300c6b761ebf72b50a875b874a83520b3ba093 - languageName: node - linkType: hard - -"@emnapi/runtime@npm:^1.11.3": - version: 1.11.3 - resolution: "@emnapi/runtime@npm:1.11.3" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/a00f1020fefb9d4145c367f93a9fddb383a00da8ffd7871e20b19659890379b83aeecb9f84d7d0eda5456343f4a09eb05b0acb5153b0d3d889539dedb1ed87c3 - languageName: node - linkType: hard - -"@emnapi/runtime@npm:^1.3.1": - version: 1.3.1 - resolution: "@emnapi/runtime@npm:1.3.1" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/060ffede50f1b619c15083312b80a9e62a5b0c87aa8c1b54854c49766c9d69f8d1d3d87bd963a647071263a320db41b25eaa50b74d6a80dcc763c23dbeaafd6c - languageName: node - linkType: hard - -"@emnapi/wasi-threads@npm:1.0.1": - version: 1.0.1 - resolution: "@emnapi/wasi-threads@npm:1.0.1" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/1e0c8036b8d53e9b07cc9acf021705ef6c86ab6b13e1acda7fffaf541a2d3565072afb92597419173ced9ea14f6bf32fce149106e669b5902b825e8b499e5c6c - languageName: node - linkType: hard - -"@emnapi/wasi-threads@npm:1.2.1": - version: 1.2.1 - resolution: "@emnapi/wasi-threads@npm:1.2.1" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/32fcfa81ab396533b2ec1f4082b1ff779a05d9c836bbbd3f4398405b0e6814c0d9503b7993130e37bc6941dbc1ded49f55e9700ae9ca4e803bab2b5bc5deb331 - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/aix-ppc64@npm:0.28.1" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/android-arm64@npm:0.28.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/android-arm@npm:0.28.1" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/android-x64@npm:0.28.1" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/darwin-arm64@npm:0.28.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/darwin-x64@npm:0.28.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/freebsd-arm64@npm:0.28.1" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/freebsd-x64@npm:0.28.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-arm64@npm:0.28.1" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-arm@npm:0.28.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-ia32@npm:0.28.1" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-loong64@npm:0.28.1" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-mips64el@npm:0.28.1" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-ppc64@npm:0.28.1" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-riscv64@npm:0.28.1" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-s390x@npm:0.28.1" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/linux-x64@npm:0.28.1" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/netbsd-arm64@npm:0.28.1" - conditions: os=netbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/netbsd-x64@npm:0.28.1" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/openbsd-arm64@npm:0.28.1" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/openbsd-x64@npm:0.28.1" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openharmony-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/openharmony-arm64@npm:0.28.1" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/sunos-x64@npm:0.28.1" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/win32-arm64@npm:0.28.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/win32-ia32@npm:0.28.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.28.1": - version: 0.28.1 - resolution: "@esbuild/win32-x64@npm:0.28.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.7.0": - version: 4.7.0 - resolution: "@eslint-community/eslint-utils@npm:4.7.0" - dependencies: - eslint-visitor-keys: "npm:^3.4.3" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/c0f4f2bd73b7b7a9de74b716a664873d08ab71ab439e51befe77d61915af41a81ecec93b408778b3a7856185244c34c2c8ee28912072ec14def84ba2dec70adf - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.8.0, @eslint-community/eslint-utils@npm:^4.9.1": - version: 4.9.1 - resolution: "@eslint-community/eslint-utils@npm:4.9.1" - dependencies: - eslint-visitor-keys: "npm:^3.4.3" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/dc4ab5e3e364ef27e33666b11f4b86e1a6c1d7cbf16f0c6ff87b1619b3562335e9201a3d6ce806221887ff780ec9d828962a290bb910759fd40a674686503f02 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.10.0": - version: 4.12.1 - resolution: "@eslint-community/regexpp@npm:4.12.1" - checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.12.1, @eslint-community/regexpp@npm:^4.12.2": - version: 4.12.2 - resolution: "@eslint-community/regexpp@npm:4.12.2" - checksum: 10c0/fddcbc66851b308478d04e302a4d771d6917a0b3740dc351513c0da9ca2eab8a1adf99f5e0aa7ab8b13fa0df005c81adeee7e63a92f3effd7d367a163b721c2d - languageName: node - linkType: hard - -"@eslint/config-array@npm:^0.21.1": - version: 0.21.1 - resolution: "@eslint/config-array@npm:0.21.1" - dependencies: - "@eslint/object-schema": "npm:^2.1.7" - debug: "npm:^4.3.1" - minimatch: "npm:^3.1.2" - checksum: 10c0/2f657d4edd6ddcb920579b72e7a5b127865d4c3fb4dda24f11d5c4f445a93ca481aebdbd6bf3291c536f5d034458dbcbb298ee3b698bc6c9dd02900fe87eec3c - languageName: node - linkType: hard - -"@eslint/config-helpers@npm:^0.4.2": - version: 0.4.2 - resolution: "@eslint/config-helpers@npm:0.4.2" - dependencies: - "@eslint/core": "npm:^0.17.0" - checksum: 10c0/92efd7a527b2d17eb1a148409d71d80f9ac160b565ac73ee092252e8bf08ecd08670699f46b306b94f13d22e88ac88a612120e7847570dd7cdc72f234d50dcb4 - languageName: node - linkType: hard - -"@eslint/core@npm:^0.17.0": - version: 0.17.0 - resolution: "@eslint/core@npm:0.17.0" - dependencies: - "@types/json-schema": "npm:^7.0.15" - checksum: 10c0/9a580f2246633bc752298e7440dd942ec421860d1946d0801f0423830e67887e4aeba10ab9a23d281727a978eb93d053d1922a587d502942a713607f40ed704e - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^3": - version: 3.3.1 - resolution: "@eslint/eslintrc@npm:3.3.1" - dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^10.0.1" - globals: "npm:^14.0.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10c0/b0e63f3bc5cce4555f791a4e487bf999173fcf27c65e1ab6e7d63634d8a43b33c3693e79f192cbff486d7df1be8ebb2bd2edc6e70ddd486cbfa84a359a3e3b41 - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^3.3.1": - version: 3.3.4 - resolution: "@eslint/eslintrc@npm:3.3.4" - dependencies: - ajv: "npm:^6.14.0" - debug: "npm:^4.3.2" - espree: "npm:^10.0.1" - globals: "npm:^14.0.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.1" - minimatch: "npm:^3.1.3" - strip-json-comments: "npm:^3.1.1" - checksum: 10c0/1fe481a6af03c09be8d92d67e2bbf693b7522b0591934bfb44bd13e297649b13e4ec5e3fc70b02e4497a17c1afbfa22f5bf5efa4fc06a24abace8e5d097fec8c - languageName: node - linkType: hard - -"@eslint/js@npm:9.39.3": - version: 9.39.3 - resolution: "@eslint/js@npm:9.39.3" - checksum: 10c0/df1c70d6681c8daf4a3c86dfac159fcd98a73c4620c4fbe2be6caab1f30a34c7de0ad88ab0e81162376d2cde1a2eed1c32eff5f917ca369870930a51f8e818f1 - languageName: node - linkType: hard - -"@eslint/object-schema@npm:^2.1.7": - version: 2.1.7 - resolution: "@eslint/object-schema@npm:2.1.7" - checksum: 10c0/936b6e499853d1335803f556d526c86f5fe2259ed241bc665000e1d6353828edd913feed43120d150adb75570cae162cf000b5b0dfc9596726761c36b82f4e87 - languageName: node - linkType: hard - -"@eslint/plugin-kit@npm:^0.4.1": - version: 0.4.1 - resolution: "@eslint/plugin-kit@npm:0.4.1" - dependencies: - "@eslint/core": "npm:^0.17.0" - levn: "npm:^0.4.1" - checksum: 10c0/51600f78b798f172a9915dffb295e2ffb44840d583427bc732baf12ecb963eb841b253300e657da91d890f4b323d10a1bd12934bf293e3018d8bb66fdce5217b - languageName: node - linkType: hard - -"@floating-ui/core@npm:^1.6.0": - version: 1.6.9 - resolution: "@floating-ui/core@npm:1.6.9" - dependencies: - "@floating-ui/utils": "npm:^0.2.9" - checksum: 10c0/77debdfc26bc36c6f5ae1f26ab3c15468215738b3f5682af4e1915602fa21ba33ad210273f31c9d2da1c531409929e1afb1138b1608c6b54a0f5853ee84c340d - languageName: node - linkType: hard - -"@floating-ui/dom@npm:^1.0.0": - version: 1.6.13 - resolution: "@floating-ui/dom@npm:1.6.13" - dependencies: - "@floating-ui/core": "npm:^1.6.0" - "@floating-ui/utils": "npm:^0.2.9" - checksum: 10c0/272242d2eb6238ffcee0cb1f3c66e0eafae804d5d7b449db5ecf904bc37d31ad96cf575a9e650b93c1190f64f49a684b1559d10e05ed3ec210628b19116991a9 - languageName: node - linkType: hard - -"@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.1.2": - version: 2.1.2 - resolution: "@floating-ui/react-dom@npm:2.1.2" - dependencies: - "@floating-ui/dom": "npm:^1.0.0" - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: 10c0/e855131c74e68cab505f7f44f92cd4e2efab1c125796db3116c54c0859323adae4bf697bf292ee83ac77b9335a41ad67852193d7aeace90aa2e1c4a640cafa60 - languageName: node - linkType: hard - -"@floating-ui/react@npm:^0.27.2": - version: 0.27.5 - resolution: "@floating-ui/react@npm:0.27.5" - dependencies: - "@floating-ui/react-dom": "npm:^2.1.2" - "@floating-ui/utils": "npm:^0.2.9" - tabbable: "npm:^6.0.0" - peerDependencies: - react: ">=17.0.0" - react-dom: ">=17.0.0" - checksum: 10c0/2da91779fddd3f368bfec0ceeb67b98e7b73f07b27f56f5ae339169de9c4145851ed432469d5dd81b99b9d6a5f0fefbb4ea8c881d2c97dd2dc0a0e96ad0945dd - languageName: node - linkType: hard - -"@floating-ui/utils@npm:^0.2.9": - version: 0.2.9 - resolution: "@floating-ui/utils@npm:0.2.9" - checksum: 10c0/48bbed10f91cb7863a796cc0d0e917c78d11aeb89f98d03fc38d79e7eb792224a79f538ed8a2d5d5584511d4ca6354ef35f1712659fd569868e342df4398ad6f - languageName: node - linkType: hard - -"@gitbeaker/core@npm:^40.6.0": - version: 40.6.0 - resolution: "@gitbeaker/core@npm:40.6.0" - dependencies: - "@gitbeaker/requester-utils": "npm:^40.6.0" - qs: "npm:^6.12.2" - xcase: "npm:^2.0.1" - checksum: 10c0/832e13ad8390b36d52eef9a103d18a9379c91d7616920fd17887f98c67bc93602cbc1b02c151a649c8a665e197dcb5bf243daabc9020e5d6b2324b827722694c - languageName: node - linkType: hard - -"@gitbeaker/requester-utils@npm:^40.6.0": - version: 40.6.0 - resolution: "@gitbeaker/requester-utils@npm:40.6.0" - dependencies: - picomatch-browser: "npm:^2.2.6" - qs: "npm:^6.12.2" - rate-limiter-flexible: "npm:^4.0.1" - xcase: "npm:^2.0.1" - checksum: 10c0/b3c2746062b61ea2612742c2e940cbe9afeed6bee40d06085485dbb238cfb923953db42ec2a61caa5dcc3bccf08d3b540bcf962de2d2c67b5d31a1a93aa19133 - languageName: node - linkType: hard - -"@gitbeaker/rest@npm:^40.5.1": - version: 40.6.0 - resolution: "@gitbeaker/rest@npm:40.6.0" - dependencies: - "@gitbeaker/core": "npm:^40.6.0" - "@gitbeaker/requester-utils": "npm:^40.6.0" - checksum: 10c0/d14ff9b712c829cf3b3198d82e4ad8c9af5c208ba1d31f9be86465f599e02f807ce166972c1473ca0ed792e837a2f6b000892dbdd7d8cbbd32067367f611bfdc - languageName: node - linkType: hard - -"@google-cloud/secret-manager@npm:^6.1.1": - version: 6.1.1 - resolution: "@google-cloud/secret-manager@npm:6.1.1" - dependencies: - google-gax: "npm:^5.0.0" - checksum: 10c0/89554c2205106ad765db2fcfb4202c54b824fce74ccb237c9c38c2e431b20d7f04de09db00f92d68ae217b011667e9bcfa0824199103a4498251a1a4b16f9b9b - languageName: node - linkType: hard - -"@google/genai@npm:^1.43.0": - version: 1.50.1 - resolution: "@google/genai@npm:1.50.1" - dependencies: - google-auth-library: "npm:^10.3.0" - p-retry: "npm:^4.6.2" - protobufjs: "npm:^7.5.4" - ws: "npm:^8.18.0" - peerDependencies: - "@modelcontextprotocol/sdk": ^1.25.2 - peerDependenciesMeta: - "@modelcontextprotocol/sdk": - optional: true - checksum: 10c0/62339112b5de5259f8363812ed7c8204b439c267931a912844ceb3d6f5f50e4d54f056e57b3d48b32e1f7711c19c678d5017f9124e41bba51b3e447b23283e8f - languageName: node - linkType: hard - -"@grpc/grpc-js@npm:^1.12.6, @grpc/grpc-js@npm:^1.14.1": - version: 1.14.6 - resolution: "@grpc/grpc-js@npm:1.14.6" - dependencies: - "@grpc/proto-loader": "npm:^0.8.0" - "@js-sdsl/ordered-map": "npm:^4.4.2" - checksum: 10c0/13aab26913ef9eb7723df5586700c3a32d8cbea1fb6867e7e42fa4748fabb378c302a61da7fcf01493cc8de36c9738db2caaa3eacf2b2e670b4dd79acd891ad3 - languageName: node - linkType: hard - -"@grpc/proto-loader@npm:^0.8.0": - version: 0.8.0 - resolution: "@grpc/proto-loader@npm:0.8.0" - dependencies: - lodash.camelcase: "npm:^4.3.0" - long: "npm:^5.0.0" - protobufjs: "npm:^7.5.3" - yargs: "npm:^17.7.2" - bin: - proto-loader-gen-types: build/bin/proto-loader-gen-types.js - checksum: 10c0/a27da3b85d5d17bab956d536786c717287eae46ca264ea9ec774db90ff571955bae2705809f431b4622fbf3be9951d7c7bbb1360b2015ee88abe1587cf3d6fe0 - languageName: node - linkType: hard - -"@hono/node-server@npm:^2.0.5": - version: 2.0.11 - resolution: "@hono/node-server@npm:2.0.11" - peerDependencies: - hono: ^4 - checksum: 10c0/eedfff2122bcb23b368f4a785c2f8d93ecd653c14ecdbf47422fedeb559fb7201c183b10020c3cc01457d856cdda6868fdc5e8f60c3af1d6c6ddd77291689736 - languageName: node - linkType: hard - -"@hookform/resolvers@npm:^3.9.0": - version: 3.10.0 - resolution: "@hookform/resolvers@npm:3.10.0" - peerDependencies: - react-hook-form: ^7.0.0 - checksum: 10c0/7ee44533b4cdc28c4fa2a94894c735411e5a1f830f4a617c580533321a9b901df0cc8c1e2fad81ad8d55154ebc5cb844cf9c116a3148ffae2bc48758c33cbb8e - languageName: node - linkType: hard - -"@humanfs/core@npm:^0.19.2": - version: 0.19.2 - resolution: "@humanfs/core@npm:0.19.2" - dependencies: - "@humanfs/types": "npm:^0.15.0" - checksum: 10c0/d0a1d52d7b30c27d49475a53072d1510b81c5803e44b342fb8faf3887f1aa27593a1e6dc76a45268e7892d3f4e198146659281f6b6d55eacf3fd5a38bac30c5c - languageName: node - linkType: hard - -"@humanfs/node@npm:^0.16.6": - version: 0.16.8 - resolution: "@humanfs/node@npm:0.16.8" - dependencies: - "@humanfs/core": "npm:^0.19.2" - "@humanfs/types": "npm:^0.15.0" - "@humanwhocodes/retry": "npm:^0.4.0" - checksum: 10c0/56140579db811af4e160b195d45d0f29acf644d192c93fe24c9e594ebf06f19dfc157494a07c84540b8a071c0e4b37209c2362765d31734f4d0be869c2422e25 - languageName: node - linkType: hard - -"@humanfs/types@npm:^0.15.0": - version: 0.15.0 - resolution: "@humanfs/types@npm:0.15.0" - checksum: 10c0/fc26b9a024b0e55f7eaf64036df94345bf5d36d6a41ef80ef38e78f1f7430ce26cf435af736adae58913baae18eac3f38c18739054a3d379102015978eae862e - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 - languageName: node - linkType: hard - -"@humanwhocodes/retry@npm:^0.4.0, @humanwhocodes/retry@npm:^0.4.2": - version: 0.4.3 - resolution: "@humanwhocodes/retry@npm:0.4.3" - checksum: 10c0/3775bb30087d4440b3f7406d5a057777d90e4b9f435af488a4923ef249e93615fb78565a85f173a186a076c7706a81d0d57d563a2624e4de2c5c9c66c486ce42 - languageName: node - linkType: hard - -"@iconify/react@npm:^5.1.0": - version: 5.2.0 - resolution: "@iconify/react@npm:5.2.0" - dependencies: - "@iconify/types": "npm:^2.0.0" - peerDependencies: - react: ">=16" - checksum: 10c0/e63102e6408506058fc8a6a37681a8037bc9796c35ea9d334a8d741d5c0d89e72ce75f5bb6181c42c507d0252018ba5b8a118de87651efe1cc890899dc9f48bd - languageName: node - linkType: hard - -"@iconify/types@npm:^2.0.0": - version: 2.0.0 - resolution: "@iconify/types@npm:2.0.0" - checksum: 10c0/65a3be43500c7ccacf360e136d00e1717f050b7b91da644e94370256ac66f582d59212bdb30d00788aab4fc078262e91c95b805d1808d654b72f6d2072a7e4b2 - languageName: node - linkType: hard - -"@iconify/utils@npm:^3.0.2": - version: 3.1.3 - resolution: "@iconify/utils@npm:3.1.3" - dependencies: - "@antfu/install-pkg": "npm:^1.1.0" - "@iconify/types": "npm:^2.0.0" - import-meta-resolve: "npm:^4.2.0" - checksum: 10c0/6d01196172ef062a9cd0ee299dff3a405221e65057d6cca9ac9fb4bacd7d78168d54b0837b75d5f163038d770a3a7e4449d68ea2fc7a577c01b9ab51bfd53c98 - languageName: node - linkType: hard - -"@iizukak/codemirror-lang-wgsl@npm:^0.3.0": - version: 0.3.0 - resolution: "@iizukak/codemirror-lang-wgsl@npm:0.3.0" - dependencies: - "@codemirror/language": "npm:6.x" - "@lezer/highlight": "npm:1.x" - "@lezer/lr": "npm:^1.x" - codemirror: "npm:6.x" - checksum: 10c0/6534bca27eba5e1c2ed286c88480a3736b17b5b933f2e50ff885c9b16166f8f5b202c2a425908258cec9feee90008304846bfd019468ac4d15fbe9728202eb90 - languageName: node - linkType: hard - -"@img/colour@npm:^1.1.0": - version: 1.1.0 - resolution: "@img/colour@npm:1.1.0" - checksum: 10c0/2ebea2c0bbaee73b99badcefa04e1e71d83f36e5369337d3121dca841f4569533c4e2faddda6d62dd247f0d5cca143711f9446c59bcce81e427ba433a7a94a17 - languageName: node - linkType: hard - -"@img/sharp-darwin-arm64@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-darwin-arm64@npm:0.35.5" - dependencies: - "@img/sharp-libvips-darwin-arm64": "npm:1.3.4" - dependenciesMeta: - "@img/sharp-libvips-darwin-arm64": - optional: true - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@img/sharp-darwin-x64@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-darwin-x64@npm:0.35.5" - dependencies: - "@img/sharp-libvips-darwin-x64": "npm:1.3.4" - dependenciesMeta: - "@img/sharp-libvips-darwin-x64": - optional: true - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@img/sharp-freebsd-wasm32@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-freebsd-wasm32@npm:0.35.5" - dependencies: - "@img/sharp-wasm32": "npm:0.35.5" - conditions: os=freebsd - languageName: node - linkType: hard - -"@img/sharp-libvips-darwin-arm64@npm:1.3.4": - version: 1.3.4 - resolution: "@img/sharp-libvips-darwin-arm64@npm:1.3.4" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@img/sharp-libvips-darwin-x64@npm:1.3.4": - version: 1.3.4 - resolution: "@img/sharp-libvips-darwin-x64@npm:1.3.4" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@img/sharp-libvips-linux-arm64@npm:1.3.4": - version: 1.3.4 - resolution: "@img/sharp-libvips-linux-arm64@npm:1.3.4" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-libvips-linux-arm@npm:1.3.4": - version: 1.3.4 - resolution: "@img/sharp-libvips-linux-arm@npm:1.3.4" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-libvips-linux-ppc64@npm:1.3.4": - version: 1.3.4 - resolution: "@img/sharp-libvips-linux-ppc64@npm:1.3.4" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-libvips-linux-riscv64@npm:1.3.4": - version: 1.3.4 - resolution: "@img/sharp-libvips-linux-riscv64@npm:1.3.4" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-libvips-linux-s390x@npm:1.3.4": - version: 1.3.4 - resolution: "@img/sharp-libvips-linux-s390x@npm:1.3.4" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-libvips-linux-x64@npm:1.3.4": - version: 1.3.4 - resolution: "@img/sharp-libvips-linux-x64@npm:1.3.4" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-libvips-linuxmusl-arm64@npm:1.3.4": - version: 1.3.4 - resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.3.4" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@img/sharp-libvips-linuxmusl-x64@npm:1.3.4": - version: 1.3.4 - resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.3.4" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@img/sharp-linux-arm64@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-linux-arm64@npm:0.35.5" - dependencies: - "@img/sharp-libvips-linux-arm64": "npm:1.3.4" - dependenciesMeta: - "@img/sharp-libvips-linux-arm64": - optional: true - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-linux-arm@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-linux-arm@npm:0.35.5" - dependencies: - "@img/sharp-libvips-linux-arm": "npm:1.3.4" - dependenciesMeta: - "@img/sharp-libvips-linux-arm": - optional: true - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-linux-ppc64@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-linux-ppc64@npm:0.35.5" - dependencies: - "@img/sharp-libvips-linux-ppc64": "npm:1.3.4" - dependenciesMeta: - "@img/sharp-libvips-linux-ppc64": - optional: true - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-linux-riscv64@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-linux-riscv64@npm:0.35.5" - dependencies: - "@img/sharp-libvips-linux-riscv64": "npm:1.3.4" - dependenciesMeta: - "@img/sharp-libvips-linux-riscv64": - optional: true - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-linux-s390x@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-linux-s390x@npm:0.35.5" - dependencies: - "@img/sharp-libvips-linux-s390x": "npm:1.3.4" - dependenciesMeta: - "@img/sharp-libvips-linux-s390x": - optional: true - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-linux-x64@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-linux-x64@npm:0.35.5" - dependencies: - "@img/sharp-libvips-linux-x64": "npm:1.3.4" - dependenciesMeta: - "@img/sharp-libvips-linux-x64": - optional: true - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-linuxmusl-arm64@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-linuxmusl-arm64@npm:0.35.5" - dependencies: - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.3.4" - dependenciesMeta: - "@img/sharp-libvips-linuxmusl-arm64": - optional: true - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@img/sharp-linuxmusl-x64@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-linuxmusl-x64@npm:0.35.5" - dependencies: - "@img/sharp-libvips-linuxmusl-x64": "npm:1.3.4" - dependenciesMeta: - "@img/sharp-libvips-linuxmusl-x64": - optional: true - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@img/sharp-wasm32@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-wasm32@npm:0.35.5" - dependencies: - "@emnapi/runtime": "npm:^1.11.3" - checksum: 10c0/da3f39d733135fde6d8b5009d282e12049f8f6df33ac3e4dc5d98868123842b5c888002ea1647e1824af9b4f9274a28826f35ebf2967b58a7416efd2aeb6299f - languageName: node - linkType: hard - -"@img/sharp-webcontainers-wasm32@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-webcontainers-wasm32@npm:0.35.5" - dependencies: - "@img/sharp-wasm32": "npm:0.35.5" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@img/sharp-win32-arm64@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-win32-arm64@npm:0.35.5" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@img/sharp-win32-ia32@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-win32-ia32@npm:0.35.5" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@img/sharp-win32-x64@npm:0.35.5": - version: 0.35.5 - resolution: "@img/sharp-win32-x64@npm:0.35.5" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@inquirer/ansi@npm:^2.0.5": - version: 2.0.5 - resolution: "@inquirer/ansi@npm:2.0.5" - checksum: 10c0/ad61532e5bb47473e3d987c32d4015499a8ce5f4f86e46467e8e672fc52670beb303905d6b324e453935a61671f59f3b9b1b6a1edbbe1f64085e2bb87735e295 - languageName: node - linkType: hard - -"@inquirer/checkbox@npm:^5.1.5": - version: 5.1.5 - resolution: "@inquirer/checkbox@npm:5.1.5" - dependencies: - "@inquirer/ansi": "npm:^2.0.5" - "@inquirer/core": "npm:^11.1.10" - "@inquirer/figures": "npm:^2.0.5" - "@inquirer/type": "npm:^4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/6cf3bfbc0e39b80b8a37b69e49231c22616877b31b77507a55be5363d14b33e91cd3c1eb4ebf0ba89435ab5ef8204ce634579a23ab7b186ee8c71d54a7c959ee - languageName: node - linkType: hard - -"@inquirer/confirm@npm:^6.0.13": - version: 6.0.13 - resolution: "@inquirer/confirm@npm:6.0.13" - dependencies: - "@inquirer/core": "npm:^11.1.10" - "@inquirer/type": "npm:^4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/59f3c484f405b3ffe2e97a9e4927111d71d317ea84fa14dc0ffd2d7c902f934ad31f48b380765937f5ff85722ece475edcde8a64b8018c21f2ee3e33082cee8b - languageName: node - linkType: hard - -"@inquirer/core@npm:^11.1.10": - version: 11.1.10 - resolution: "@inquirer/core@npm:11.1.10" - dependencies: - "@inquirer/ansi": "npm:^2.0.5" - "@inquirer/figures": "npm:^2.0.5" - "@inquirer/type": "npm:^4.0.5" - cli-width: "npm:^4.1.0" - fast-wrap-ansi: "npm:^0.2.0" - mute-stream: "npm:^3.0.0" - signal-exit: "npm:^4.1.0" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/d1d4081cbb0bd3dc15a3c95c58560a4836079a14161c407bc20f9a1b0fdb93c2228daf61aa60acab7023bc78df1b85875fde94308dcac2c6bd0ffd24b5f05190 - languageName: node - linkType: hard - -"@inquirer/core@npm:^8.1.0": - version: 8.2.4 - resolution: "@inquirer/core@npm:8.2.4" - dependencies: - "@inquirer/figures": "npm:^1.0.3" - "@inquirer/type": "npm:^1.3.3" - "@types/mute-stream": "npm:^0.0.4" - "@types/node": "npm:^20.14.9" - "@types/wrap-ansi": "npm:^3.0.0" - ansi-escapes: "npm:^4.3.2" - cli-spinners: "npm:^2.9.2" - cli-width: "npm:^4.1.0" - mute-stream: "npm:^1.0.0" - picocolors: "npm:^1.0.1" - signal-exit: "npm:^4.1.0" - strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^6.2.0" - checksum: 10c0/3328ea52823a59cad4bf6c36b143c7322a2e1430ae040717e63c94680f246c0d628aed3032a2f6890652dd4b7fdb0fec7e324059b74173ffa78ae2a485939f33 - languageName: node - linkType: hard - -"@inquirer/editor@npm:^5.1.2": - version: 5.1.2 - resolution: "@inquirer/editor@npm:5.1.2" - dependencies: - "@inquirer/core": "npm:^11.1.10" - "@inquirer/external-editor": "npm:^3.0.0" - "@inquirer/type": "npm:^4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/5b24700b8d4339d4b9b5fe5991d4c35843c1977595bfc0ab242e95a2bd8c2463c9039050f3b7821e8f49786926c5b68ba4cb20d6d887292fc0b12ccb03bd3ca2 - languageName: node - linkType: hard - -"@inquirer/expand@npm:^5.0.14": - version: 5.0.14 - resolution: "@inquirer/expand@npm:5.0.14" - dependencies: - "@inquirer/core": "npm:^11.1.10" - "@inquirer/type": "npm:^4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/efdc9a93d57397f415529ed2b969de6fa78c2ab98901a89efd73f1cfc79eba3ea899c621a63a458c530ca4142c89fd61cfeb873384e906f9cc33c022a5a3f5be - languageName: node - linkType: hard - -"@inquirer/external-editor@npm:^3.0.0": - version: 3.0.0 - resolution: "@inquirer/external-editor@npm:3.0.0" - dependencies: - chardet: "npm:^2.1.1" - iconv-lite: "npm:^0.7.2" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/120910c954869c73c54aee825abef6f4c4aa8620cafa831d56b218586b1ee02c12ad0a17b8d701784fb9d33fa8fd63ee155d9c718c90533ff4d8086b99986e1d - languageName: node - linkType: hard - -"@inquirer/figures@npm:^1.0.1, @inquirer/figures@npm:^1.0.3": - version: 1.0.15 - resolution: "@inquirer/figures@npm:1.0.15" - checksum: 10c0/6e39a040d260ae234ae220180b7994ff852673e20be925f8aa95e78c7934d732b018cbb4d0ec39e600a410461bcb93dca771e7de23caa10630d255692e440f69 - languageName: node - linkType: hard - -"@inquirer/figures@npm:^2.0.5": - version: 2.0.5 - resolution: "@inquirer/figures@npm:2.0.5" - checksum: 10c0/139671b88f33f059aec85ed3fdf464999115573350c6dea61141adc1cfd43d14742b6cb68150c2ca9baf5a1bae618f990ed89b4430ae768d415bbd19944c56df - languageName: node - linkType: hard - -"@inquirer/input@npm:^5.0.13": - version: 5.0.13 - resolution: "@inquirer/input@npm:5.0.13" - dependencies: - "@inquirer/core": "npm:^11.1.10" - "@inquirer/type": "npm:^4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/df2d67a6f0a1b4cc22dfdc1e78f833560f613647bd75374d4664601b7947106dd977aceb8440a19a17204b58c11611e6084096eae3eb1873260f1f1d029a8a0a - languageName: node - linkType: hard - -"@inquirer/number@npm:^4.0.13": - version: 4.0.13 - resolution: "@inquirer/number@npm:4.0.13" - dependencies: - "@inquirer/core": "npm:^11.1.10" - "@inquirer/type": "npm:^4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/9185d15c8b0ab820dc0456e7db6f189ae84bf8d5f5bce19398f3a858fca0276e66a53922a4ab118dbae65f1f4f6a29f06f3d34c6436ae9e095a98e9862590e2b - languageName: node - linkType: hard - -"@inquirer/password@npm:^5.0.13": - version: 5.0.13 - resolution: "@inquirer/password@npm:5.0.13" - dependencies: - "@inquirer/ansi": "npm:^2.0.5" - "@inquirer/core": "npm:^11.1.10" - "@inquirer/type": "npm:^4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/e06aa6ae4344e3e37630655c443001bcf4421b1e4821c15987fc747b8d0362d536a52a115d25d02b023bb7091fc88630a65d7b0ac02e15a2f70d933f6a863da3 - languageName: node - linkType: hard - -"@inquirer/prompts@npm:^8.4.3": - version: 8.4.3 - resolution: "@inquirer/prompts@npm:8.4.3" - dependencies: - "@inquirer/checkbox": "npm:^5.1.5" - "@inquirer/confirm": "npm:^6.0.13" - "@inquirer/editor": "npm:^5.1.2" - "@inquirer/expand": "npm:^5.0.14" - "@inquirer/input": "npm:^5.0.13" - "@inquirer/number": "npm:^4.0.13" - "@inquirer/password": "npm:^5.0.13" - "@inquirer/rawlist": "npm:^5.2.9" - "@inquirer/search": "npm:^4.1.9" - "@inquirer/select": "npm:^5.1.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/fd77efb0b12a9293d6533cf332a1af10f69fefa97202c3790c2a7695a06c443ed5d4877d05efe512803e4a98cce0fa46fed9d372149512c2eccbfcf23f1c44bd - languageName: node - linkType: hard - -"@inquirer/rawlist@npm:^5.2.9": - version: 5.2.9 - resolution: "@inquirer/rawlist@npm:5.2.9" - dependencies: - "@inquirer/core": "npm:^11.1.10" - "@inquirer/type": "npm:^4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/10f1a23e5222a932d9965490beb8b37551b2c68dcb281290d8f0099dc0778b49d4ca671ad8b346c802cbff29924faffd01b62dc88f297020e3d1061eb00b7f78 - languageName: node - linkType: hard - -"@inquirer/search@npm:^4.1.9": - version: 4.1.9 - resolution: "@inquirer/search@npm:4.1.9" - dependencies: - "@inquirer/core": "npm:^11.1.10" - "@inquirer/figures": "npm:^2.0.5" - "@inquirer/type": "npm:^4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/0e0cd6f2f312cecfa02f7d5556a7ccf5cbffff442fbdd0828f320e0a0239b63d24db5e31e05ec77d2a969900ad40b2d115f6496b2c9c47561a15dc504298d9dc - languageName: node - linkType: hard - -"@inquirer/select@npm:^5.1.5": - version: 5.1.5 - resolution: "@inquirer/select@npm:5.1.5" - dependencies: - "@inquirer/ansi": "npm:^2.0.5" - "@inquirer/core": "npm:^11.1.10" - "@inquirer/figures": "npm:^2.0.5" - "@inquirer/type": "npm:^4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/871e05266c00151031798dc659acaed3d9c76d0040a25204cbcc99f7104559db1a8bc2a73ee04318a01f06f879a3d7e5986db50f563aeca23ae4cd5e8cff6057 - languageName: node - linkType: hard - -"@inquirer/type@npm:^1.3.1, @inquirer/type@npm:^1.3.3": - version: 1.5.5 - resolution: "@inquirer/type@npm:1.5.5" - dependencies: - mute-stream: "npm:^1.0.0" - checksum: 10c0/4c41736c09ba9426b5a9e44993bdd54e8f532e791518802e33866f233a2a6126a25c1c82c19d1abbf1df627e57b1b957dd3f8318ea96073d8bfc32193943bcb3 - languageName: node - linkType: hard - -"@inquirer/type@npm:^4.0.5": - version: 4.0.5 - resolution: "@inquirer/type@npm:4.0.5" - peerDependencies: - "@types/node": ">=18" - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/390edb0fd1f027f9c8dc26bac28486d38bbde6c19974ef1588ea187f54a2cb58db639ebca31fa81a8fe4a4e84c2f0953ab3f5a6768ba86649368c5e806148a6f - languageName: node - linkType: hard - -"@ioredis/commands@npm:1.10.0": - version: 1.10.0 - resolution: "@ioredis/commands@npm:1.10.0" - checksum: 10c0/baf91e62d0e64ef2b5f7ca4413dc2456fe250e87483beac4a1c8ef1fe5ad0d2fcdeb9b89d4556d8ef6c7455c64a964359d729601fdb06b2f4c76c35dd59afa99 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e - languageName: node - linkType: hard - -"@isaacs/fs-minipass@npm:^4.0.0": - version: 4.0.1 - resolution: "@isaacs/fs-minipass@npm:4.0.1" - dependencies: - minipass: "npm:^7.0.4" - checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.12": - version: 0.3.13 - resolution: "@jridgewell/gen-mapping@npm:0.3.13" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.8 - resolution: "@jridgewell/gen-mapping@npm:0.3.8" - dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a - languageName: node - linkType: hard - -"@jridgewell/remapping@npm:^2.3.5": - version: 2.3.5 - resolution: "@jridgewell/remapping@npm:2.3.5" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/3de494219ffeb2c5c38711d0d7bb128097edf91893090a2dbc8ee0b55d092bb7347b1fd0f478486c5eab010e855c73927b1666f2107516d472d24a73017d1194 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.5.5": - version: 1.5.5 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" - checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.24": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.28": - version: 0.3.31 - resolution: "@jridgewell/trace-mapping@npm:0.3.31" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 - languageName: node - linkType: hard - -"@js-sdsl/ordered-map@npm:^4.4.2": - version: 4.4.2 - resolution: "@js-sdsl/ordered-map@npm:4.4.2" - checksum: 10c0/cc7e15dc4acf6d9ef663757279600bab70533d847dcc1ab01332e9e680bd30b77cdf9ad885cc774276f51d98b05a013571c940e5b360985af5eb798dc1a2ee2b - languageName: node - linkType: hard - -"@jsdevtools/ono@npm:^7.1.3": - version: 7.1.3 - resolution: "@jsdevtools/ono@npm:7.1.3" - checksum: 10c0/a9f7e3e8e3bc315a34959934a5e2f874c423cf4eae64377d3fc9de0400ed9f36cb5fd5ebce3300d2e8f4085f557c4a8b591427a583729a87841fda46e6c216b9 - languageName: node - linkType: hard - -"@juggle/resize-observer@npm:^3.4.0": - version: 3.4.0 - resolution: "@juggle/resize-observer@npm:3.4.0" - checksum: 10c0/12930242357298c6f2ad5d4ec7cf631dfb344ca7c8c830ab7f64e6ac11eb1aae486901d8d880fd08fb1b257800c160a0da3aee1e7ed9adac0ccbb9b7c5d93347 - languageName: node - linkType: hard - -"@kwsites/file-exists@npm:^1.1.1": - version: 1.1.1 - resolution: "@kwsites/file-exists@npm:1.1.1" - dependencies: - debug: "npm:^4.1.1" - checksum: 10c0/39e693239a72ccd8408bb618a0200e4a8d61682057ca7ae2c87668d7e69196e8d7e2c9cde73db6b23b3b0230169a15e5f1bfe086539f4be43e767b2db68e8ee4 - languageName: node - linkType: hard - -"@kwsites/promise-deferred@npm:^1.1.1": - version: 1.1.1 - resolution: "@kwsites/promise-deferred@npm:1.1.1" - checksum: 10c0/ef1ad3f1f50991e3bed352b175986d8b4bc684521698514a2ed63c1d1fc9848843da4f2bc2df961c9b148c94e1c34bf33f0da8a90ba2234e452481f2cc9937b1 - languageName: node - linkType: hard - -"@langchain/core@npm:^1.1.29": - version: 1.1.40 - resolution: "@langchain/core@npm:1.1.40" - dependencies: - "@cfworker/json-schema": "npm:^4.0.2" - "@standard-schema/spec": "npm:^1.1.0" - ansi-styles: "npm:^5.0.0" - camelcase: "npm:6" - decamelize: "npm:1.2.0" - js-tiktoken: "npm:^1.0.12" - langsmith: "npm:>=0.5.0 <1.0.0" - mustache: "npm:^4.2.0" - p-queue: "npm:^6.6.2" - uuid: "npm:^11.1.0" - zod: "npm:^3.25.76 || ^4" - checksum: 10c0/ccc93267bb0ac5943fa4a65bb07cb78d054e131248629224212adb1fc9537e21efda8fb8674df85e7d19c247885c80763396926eedc23416eba246e0a8718ccd - languageName: node - linkType: hard - -"@langchain/langgraph-checkpoint@npm:^1.0.1": - version: 1.0.1 - resolution: "@langchain/langgraph-checkpoint@npm:1.0.1" - dependencies: - uuid: "npm:^10.0.0" - peerDependencies: - "@langchain/core": ^1.0.1 - checksum: 10c0/467d3abe9b2f095e11fae5d2476ef1060fa1a83f08403885e220ed22b4fd35a21939f4e0f02cc56ea60622075b22f9f0ee3c73b02179900c6ece581be486869d - languageName: node - linkType: hard - -"@langchain/langgraph-sdk@npm:~1.8.8": - version: 1.8.8 - resolution: "@langchain/langgraph-sdk@npm:1.8.8" - dependencies: - "@types/json-schema": "npm:^7.0.15" - p-queue: "npm:^9.0.1" - p-retry: "npm:^7.1.1" - uuid: "npm:^13.0.0" - peerDependencies: - "@langchain/core": ^1.1.16 - react: ^18 || ^19 - react-dom: ^18 || ^19 - svelte: ^4.0.0 || ^5.0.0 - vue: ^3.0.0 - peerDependenciesMeta: - "@langchain/core": - optional: true - react: - optional: true - react-dom: - optional: true - svelte: - optional: true - vue: - optional: true - checksum: 10c0/dae1a4a978cf27f17c6047abfd36931695a380e17ba2bd6372626ca265c1558fddf2df7ded1a9f5678e7076aa966b4e8c28ffc65ffac428d0627a595f6fc7df8 - languageName: node - linkType: hard - -"@langchain/langgraph@npm:^1.2.8": - version: 1.2.8 - resolution: "@langchain/langgraph@npm:1.2.8" - dependencies: - "@langchain/langgraph-checkpoint": "npm:^1.0.1" - "@langchain/langgraph-sdk": "npm:~1.8.8" - "@standard-schema/spec": "npm:1.1.0" - uuid: "npm:^10.0.0" - peerDependencies: - "@langchain/core": ^1.1.16 - zod: ^3.25.32 || ^4.2.0 - zod-to-json-schema: ^3.x - peerDependenciesMeta: - zod-to-json-schema: - optional: true - checksum: 10c0/8ce007e9cca18881f6dfd529692fa0d53251991cdf4f5c2a884666dcb38b9fb677635adddca19ed15ff542fc39d7efa569f98e6fcd0692a41dfcdc1ba6bd871c - languageName: node - linkType: hard - -"@lezer/common@npm:1.3.0": - version: 1.3.0 - resolution: "@lezer/common@npm:1.3.0" - checksum: 10c0/e164094920761c2f56c8634d0ae9261ea7c5e6b8202aa08773febc59b8d8284dde5bc7a810c9438e27b978e5ad67d0db03af1ed72924df61b8fa2704acb55deb - languageName: node - linkType: hard - -"@lezer/cpp@npm:^1.0.0": - version: 1.1.3 - resolution: "@lezer/cpp@npm:1.1.3" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/c69024b1fcd57b72bfdfeba8dd8824e47eed1570d3df19c5785b5ed360c59c1fbeb1009b49ae6ef0d9e88ba70ac99df9c00dc00b9b156440b9032d1e8807a5d8 - languageName: node - linkType: hard - -"@lezer/css@npm:^1.1.0, @lezer/css@npm:^1.1.7": - version: 1.1.10 - resolution: "@lezer/css@npm:1.1.10" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/f4e870f1890b8131bf641ac3455e26ba72081b311f62dc6204d0df64228f137b8e5a157ba162b752c03d623e6064cac1fc4b96a7f06f6c20b4415dc66baf8821 - languageName: node - linkType: hard - -"@lezer/generator@npm:^1.8.0": - version: 1.8.0 - resolution: "@lezer/generator@npm:1.8.0" - dependencies: - "@lezer/common": "npm:^1.1.0" - "@lezer/lr": "npm:^1.3.0" - bin: - lezer-generator: src/lezer-generator.cjs - checksum: 10c0/c9dab9a27b6b757544f51b1612842ded77db7322d23cfd175274f89d783e0987b106c0f51e1203af74b7e56ccc567e8efd633aaffa2086cb55bfc1e3ea591fa6 - languageName: node - linkType: hard - -"@lezer/go@npm:^1.0.0": - version: 1.0.0 - resolution: "@lezer/go@npm:1.0.0" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/0a28007d04134f923d6a650da73dfca942bbe6b667351b582c5ef9541aacc6ac9fdb318cc57b560f962d49a85c1b1ddc8dd93caec8e21bfa4224ede40fcfc73d - languageName: node - linkType: hard - -"@lezer/highlight@npm:1.x, @lezer/highlight@npm:^1.0.0, @lezer/highlight@npm:^1.1.3, @lezer/highlight@npm:^1.1.6, @lezer/highlight@npm:^1.2.0, @lezer/highlight@npm:^1.2.1": - version: 1.2.1 - resolution: "@lezer/highlight@npm:1.2.1" - dependencies: - "@lezer/common": "npm:^1.0.0" - checksum: 10c0/51b4c08596a0dfeec6a7b7ed90a7f2743ab42e7e8ff8b89707fd042860e4e133dbd8243639fcaf077305ae6c303aa74e69794015eb16cb34741f5ac6721f283c - languageName: node - linkType: hard - -"@lezer/html@npm:^1.3.0": - version: 1.3.10 - resolution: "@lezer/html@npm:1.3.10" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/a7e782f9e9c5c5ffaa4a6fcf4ea5284e62c8fd3f0d378c86738b57077c002cbb013aeeb8aaae292b9517fea8b959216ce7af053269329962f6df2c7f9c2c8d99 - languageName: node - linkType: hard - -"@lezer/java@npm:^1.0.0": - version: 1.1.3 - resolution: "@lezer/java@npm:1.1.3" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/7bdd908afa1c3e4ef74c638135def151686a991659a1bf62510ea3b90d355cf786bdb153f925785fcc3cfd3010faf69fc98bdc2b177f4832291939724e85bc71 - languageName: node - linkType: hard - -"@lezer/javascript@npm:^1.0.0": - version: 1.4.21 - resolution: "@lezer/javascript@npm:1.4.21" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.1.3" - "@lezer/lr": "npm:^1.3.0" - checksum: 10c0/ddbfee18aa87f6bffd3ac255b96c9e9ab61c9d44adfaba08c538e742e7264ecf6a238d253214d3330420d341a826f193232a9d4454126e75854e2bea2cbb703c - languageName: node - linkType: hard - -"@lezer/json@npm:^1.0.0": - version: 1.0.3 - resolution: "@lezer/json@npm:1.0.3" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/e91c957cc0825e927b55fbcd233d7ee0b39f9c2a89d9475489f394b7eba2b59e5f480d157a12d5cd6ae6f14bc99f9ccd8e8113baad498199ef1b13c49105f546 - languageName: node - linkType: hard - -"@lezer/lr@npm:^0.15.0": - version: 0.15.8 - resolution: "@lezer/lr@npm:0.15.8" - dependencies: - "@lezer/common": "npm:^0.15.0" - checksum: 10c0/5cd5123aca5cb2f268d265b6c21922ba3426ba60b9bbc1df85f4bfeed48097a444c656e642557fa93de8a8eb00d3254f502ce2796ae9edc1d186f14fa540a863 - languageName: node - linkType: hard - -"@lezer/lr@npm:^1.0.0, @lezer/lr@npm:^1.1.0, @lezer/lr@npm:^1.3.0, @lezer/lr@npm:^1.3.1, @lezer/lr@npm:^1.3.10, @lezer/lr@npm:^1.3.3, @lezer/lr@npm:^1.3.7, @lezer/lr@npm:^1.4.0, @lezer/lr@npm:^1.4.2, @lezer/lr@npm:^1.x": - version: 1.4.2 - resolution: "@lezer/lr@npm:1.4.2" - dependencies: - "@lezer/common": "npm:^1.0.0" - checksum: 10c0/22bb5d0d4b33d0de5eb0706b7e5b5f2d20f570e112d9110009bd35b62ff10f2eb4eff8da4cf373dd4ddf5e06a304120b8f039add7ed9997c981c13945d5329cd - languageName: node - linkType: hard - -"@lezer/lr@npm:^1.4.3": - version: 1.4.3 - resolution: "@lezer/lr@npm:1.4.3" - dependencies: - "@lezer/common": "npm:^1.0.0" - checksum: 10c0/3c9fd7eefb0641addfdd0955b4c4014bb8702285c52890b58c937d766320ba2fec8c6b374b46f514079a093c9dd21b6632746a01fed16c250c90d649e5dd12c1 - languageName: node - linkType: hard - -"@lezer/markdown@npm:^1.0.0": - version: 1.4.2 - resolution: "@lezer/markdown@npm:1.4.2" - dependencies: - "@lezer/common": "npm:^1.0.0" - "@lezer/highlight": "npm:^1.0.0" - checksum: 10c0/b3916a50f94cdf382d1742b2b84fc14d4d531351b79c2c1580a451fa8704653aba083ea1ad4ef631faf548a82fe805f617175123ba26384c5aa9388703191dd7 - languageName: node - linkType: hard - -"@lezer/php@npm:^1.0.0": - version: 1.0.2 - resolution: "@lezer/php@npm:1.0.2" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.1.0" - checksum: 10c0/55525c3cc4a769ddbc2af3acc45c088cdbdacdf6491ed5f63e0cadac307b500e004a70c03797ba552c9047083155a0a1a90ef2966d460ba03d1d093bd7abd0d7 - languageName: node - linkType: hard - -"@lezer/python@npm:^1.1.4": - version: 1.1.16 - resolution: "@lezer/python@npm:1.1.16" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/b8d4098aeb292847b57f3b4d5415f5a17f2b2608c17bb2e62451317b0f6296d0ae570d38d45791d44b43cda60cf4bab87864790e6c8f43db8405fa4ea9f4b0d8 - languageName: node - linkType: hard - -"@lezer/rust@npm:^1.0.0": - version: 1.0.2 - resolution: "@lezer/rust@npm:1.0.2" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/f8e1c8afe1bcd3c9eec56f48f62612903e799d48f8c9dcb99ce66977d1f965877946e35730c602459d38356d6b1d8deec1037886c09bcb40d7d1e2c673930eb7 - languageName: node - linkType: hard - -"@lezer/sass@npm:^1.0.0": - version: 1.0.7 - resolution: "@lezer/sass@npm:1.0.7" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/6308873c74e10e2f075945f85068333e1cd95f65743a9bc054456e4f55b0a68563ccdfefa9f372d9c234640eca41455877d6a8d4db9c0a09eea5beb71f065009 - languageName: node - linkType: hard - -"@lezer/xml@npm:^1.0.0, @lezer/xml@npm:^1.0.2": - version: 1.0.6 - resolution: "@lezer/xml@npm:1.0.6" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/10c4fdf72daefe9b531e2aa31f87b23b8252bb116220168b7c394c16f992414e1d6320736b87c3282a5082af4558db0f8f2c3283e92ebaa494e076b8e5e14292 - languageName: node - linkType: hard - -"@lezer/yaml@npm:^1.0.0": - version: 1.0.3 - resolution: "@lezer/yaml@npm:1.0.3" - dependencies: - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.4.0" - checksum: 10c0/cef3d0c0a2c48a7e0f36ccc0af948da9394d17b164dcbaf0187d9b472fd4f628b3107d7a4041045181488f1966a94ae65640c932fc8d3bf8c3597813cfb86ae0 - languageName: node - linkType: hard - -"@logtail/core@npm:^0.5.2": - version: 0.5.2 - resolution: "@logtail/core@npm:0.5.2" - dependencies: - "@logtail/tools": "npm:^0.5.2" - "@logtail/types": "npm:^0.5.2" - serialize-error: "npm:8.1.0" - checksum: 10c0/133c9ec9912ed7599f060656e60cd2b4a18acbbfbe59498bb4450f8acd9fe4bbefd689baae2a928b8507a511e5e6e30e6bbcda1a9b7a1ba8d3d00f52e0a3f54e - languageName: node - linkType: hard - -"@logtail/node@npm:^0.5.2": - version: 0.5.2 - resolution: "@logtail/node@npm:0.5.2" - dependencies: - "@logtail/core": "npm:^0.5.2" - "@logtail/types": "npm:^0.5.2" - "@msgpack/msgpack": "npm:^2.5.1" - "@types/stack-trace": "npm:^0.0.33" - cross-fetch: "npm:^4.0.0" - minimatch: "npm:^9.0.5" - serialize-error: "npm:8.1.0" - stack-trace: "npm:0.0.10" - checksum: 10c0/37db2dfdcbedce94ccce3dc5e8ce18d795a0f8f2c590d2eb1db75e03f7a3f819f10d1b0cc5959f4dcbc58b78ff7b365169e2b988e8a5c1cc9ea5e69c1f842830 - languageName: node - linkType: hard - -"@logtail/tools@npm:^0.5.2": - version: 0.5.2 - resolution: "@logtail/tools@npm:0.5.2" - dependencies: - "@logtail/types": "npm:^0.5.2" - cross-fetch: "npm:^4.0.0" - checksum: 10c0/791f42822170e957881a484b98767f648b20100f6d500ca107ab018ba7fc643e4f72cc451a6d409779963b3edfdeb01ce3081abbec2519c0433776e3a2cad767 - languageName: node - linkType: hard - -"@logtail/types@npm:^0.5.2": - version: 0.5.2 - resolution: "@logtail/types@npm:0.5.2" - checksum: 10c0/c2e31ef9097a0b208741217b2ed7aa16131df3ed27c76cb14a23a4750a33c5d0378411feea3edcab5a18c0f235859e68b7ec2ffbcb64092128f553a48a338807 - languageName: node - linkType: hard - -"@logtail/winston@npm:^0.5.2": - version: 0.5.2 - resolution: "@logtail/winston@npm:0.5.2" - dependencies: - "@logtail/node": "npm:^0.5.2" - "@logtail/types": "npm:^0.5.2" - winston-transport: "npm:^4.3.0" - peerDependencies: - winston: ">=3.2.1" - checksum: 10c0/db14ed53e09474e5387cf45843df3efc0e3f4eb8dd9dfbe8fd2128c73dd58f7b9ddf166ce32dc049ab837cf20f860eed9e93001ef86ee3a71e5a8ac89081385b - languageName: node - linkType: hard - -"@marijn/find-cluster-break@npm:^1.0.0": - version: 1.0.2 - resolution: "@marijn/find-cluster-break@npm:1.0.2" - checksum: 10c0/1a17a60b16083cc5f7ce89d7b7d8aa87ce4099723e3e9e34e229ef2cd8a980e69d481ca8ee90ffedfec5119af1aed581642fb60ed0365e7e90634c81ea6b630f - languageName: node - linkType: hard - -"@medv/finder@npm:^4.0.2": - version: 4.0.2 - resolution: "@medv/finder@npm:4.0.2" - checksum: 10c0/f9b7fec9ad7077a47901a9c4f4fc585b092e8fe8e91f05001c90d1da150cc041822c008fc12726f0458211d5663c82b67243e6e03ca55f3096b5b4feb3ce13e3 - languageName: node - linkType: hard - -"@mermaid-js/parser@npm:^1.2.0": - version: 1.2.0 - resolution: "@mermaid-js/parser@npm:1.2.0" - dependencies: - "@chevrotain/types": "npm:~11.1.2" - checksum: 10c0/907d41167b23160c88f292b0dd79162d2543445ecf1d784ed09747467705666669f818e3ab91e1182da2127720fb40cb707e6fd56e8a445020fd3e7b8b16f013 - languageName: node - linkType: hard - -"@modelcontextprotocol/sdk@npm:^1.25.0, @modelcontextprotocol/sdk@npm:^1.29.0": - version: 1.32.1 - resolution: "@modelcontextprotocol/sdk@npm:1.32.1" - dependencies: - "@hono/node-server": "npm:^1.19.9 || ^2.0.5" - ajv: "npm:^8.17.1" - ajv-formats: "npm:^3.0.1" - content-type: "npm:^1.0.5" - cors: "npm:^2.8.5" - cross-spawn: "npm:^7.0.5" - eventsource: "npm:^3.0.2" - eventsource-parser: "npm:^3.0.0" - express: "npm:^5.2.1" - express-rate-limit: "npm:^8.2.1" - hono: "npm:^4.11.4" - jose: "npm:^6.1.3" - json-schema-typed: "npm:^8.0.2" - pkce-challenge: "npm:^5.0.0" - raw-body: "npm:^3.0.0" - zod: "npm:^3.25 || ^4.0" - zod-to-json-schema: "npm:^3.25.1" - peerDependencies: - "@cfworker/json-schema": ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - "@cfworker/json-schema": - optional: true - zod: - optional: false - checksum: 10c0/8b6c8ff6aa5358aeb316fedfa2094a4241ce12d98a0f818cee42510ec9149fed21fc75244c5f0e8cb453337f243c09fa8a90425cd2533fd481964d8583a1f0c9 - languageName: node - linkType: hard - -"@msgpack/msgpack@npm:^2.5.1": - version: 2.8.0 - resolution: "@msgpack/msgpack@npm:2.8.0" - checksum: 10c0/5964ed3daad9ccf314238da81c91152dc693bca167b2469445c1d3ce0495443612e543d052281061a91ec48ed44a6a49dd3a334b5d0dbe2dc2db6ea6143e5787 - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-darwin-arm64@npm:3.0.4": - version: 3.0.4 - resolution: "@msgpackr-extract/msgpackr-extract-darwin-arm64@npm:3.0.4" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-darwin-x64@npm:3.0.4": - version: 3.0.4 - resolution: "@msgpackr-extract/msgpackr-extract-darwin-x64@npm:3.0.4" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-linux-arm64@npm:3.0.4": - version: 3.0.4 - resolution: "@msgpackr-extract/msgpackr-extract-linux-arm64@npm:3.0.4" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-linux-arm@npm:3.0.4": - version: 3.0.4 - resolution: "@msgpackr-extract/msgpackr-extract-linux-arm@npm:3.0.4" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-linux-x64@npm:3.0.4": - version: 3.0.4 - resolution: "@msgpackr-extract/msgpackr-extract-linux-x64@npm:3.0.4" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@msgpackr-extract/msgpackr-extract-win32-x64@npm:3.0.4": - version: 3.0.4 - resolution: "@msgpackr-extract/msgpackr-extract-win32-x64@npm:3.0.4" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@napi-rs/wasm-runtime@npm:^0.2.7": - version: 0.2.7 - resolution: "@napi-rs/wasm-runtime@npm:0.2.7" - dependencies: - "@emnapi/core": "npm:^1.3.1" - "@emnapi/runtime": "npm:^1.3.1" - "@tybys/wasm-util": "npm:^0.9.0" - checksum: 10c0/04a5edd79144bfa4e821a373fb6d4939f10c578c5f3633b5e67a57d0f5e36a593f595834d26654ea757bba7cd80b6c42d0d1405d6a8460c5d774e8cd5c9548a4 - languageName: node - linkType: hard - -"@napi-rs/wasm-runtime@npm:^1.1.4": - version: 1.1.5 - resolution: "@napi-rs/wasm-runtime@npm:1.1.5" - dependencies: - "@tybys/wasm-util": "npm:^0.10.2" - peerDependencies: - "@emnapi/core": ^1.7.1 - "@emnapi/runtime": ^1.7.1 - checksum: 10c0/727f2b6ae0e68bbe5d39aeb68aa6f183314e9f03dc50bb55a962849535b2db53ecc3fbf1554d8656a54488a608df5a2634670595cf5874dc4af2ee59f817c65d - languageName: node - linkType: hard - -"@next/env@npm:16.3.8": - version: 16.3.8 - resolution: "@next/env@npm:16.3.8" - checksum: 10c0/0955cc2f9bd8828043f38571f054cefbd1d5ba8bfc40603807f7fdf417e8da2c632df5289d34711e32a752a3ef1f7589da75f8a58d536e012c7d106367a70d7d - languageName: node - linkType: hard - -"@next/eslint-plugin-next@npm:16.1.6": - version: 16.1.6 - resolution: "@next/eslint-plugin-next@npm:16.1.6" - dependencies: - fast-glob: "npm:3.3.1" - checksum: 10c0/1498ded3421326738411eb11e794a5ef6aa01daeff0d89a12d05f360984527ccce2cc9588cc11477ee0e4b09a7570a640e7b6ff79ee3eb49c8cf0fc6b105a24b - languageName: node - linkType: hard - -"@next/swc-darwin-arm64@npm:16.3.8": - version: 16.3.8 - resolution: "@next/swc-darwin-arm64@npm:16.3.8" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@next/swc-darwin-x64@npm:16.3.8": - version: 16.3.8 - resolution: "@next/swc-darwin-x64@npm:16.3.8" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@next/swc-linux-arm64-gnu@npm:16.3.8": - version: 16.3.8 - resolution: "@next/swc-linux-arm64-gnu@npm:16.3.8" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@next/swc-linux-arm64-musl@npm:16.3.8": - version: 16.3.8 - resolution: "@next/swc-linux-arm64-musl@npm:16.3.8" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@next/swc-linux-x64-gnu@npm:16.3.8": - version: 16.3.8 - resolution: "@next/swc-linux-x64-gnu@npm:16.3.8" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@next/swc-linux-x64-musl@npm:16.3.8": - version: 16.3.8 - resolution: "@next/swc-linux-x64-musl@npm:16.3.8" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@next/swc-win32-arm64-msvc@npm:16.3.8": - version: 16.3.8 - resolution: "@next/swc-win32-arm64-msvc@npm:16.3.8" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@next/swc-win32-x64-msvc@npm:16.3.8": - version: 16.3.8 - resolution: "@next/swc-win32-x64-msvc@npm:16.3.8" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@nodable/entities@npm:^2.1.0": - version: 2.1.0 - resolution: "@nodable/entities@npm:2.1.0" - checksum: 10c0/5a4cba2b61a5b6c726328b18b1de6d033cae4a658a118644bf31e0bcbda126ea7b69385043dc556cf1ed859b9ca220e82b81b5e5c48ef1b519fb8ec104575dee - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 - languageName: node - linkType: hard - -"@nolyfill/is-core-module@npm:1.0.39": - version: 1.0.39 - resolution: "@nolyfill/is-core-module@npm:1.0.39" - checksum: 10c0/34ab85fdc2e0250879518841f74a30c276bca4f6c3e13526d2d1fe515e1adf6d46c25fcd5989d22ea056d76f7c39210945180b4859fc83b050e2da411aa86289 - languageName: node - linkType: hard - -"@npmcli/agent@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/agent@npm:3.0.0" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/fs@npm:4.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 - languageName: node - linkType: hard - -"@octokit/app@npm:^15.1.6": - version: 15.1.6 - resolution: "@octokit/app@npm:15.1.6" - dependencies: - "@octokit/auth-app": "npm:^7.2.1" - "@octokit/auth-unauthenticated": "npm:^6.1.3" - "@octokit/core": "npm:^6.1.5" - "@octokit/oauth-app": "npm:^7.1.6" - "@octokit/plugin-paginate-rest": "npm:^12.0.0" - "@octokit/types": "npm:^14.0.0" - "@octokit/webhooks": "npm:^13.6.1" - checksum: 10c0/865098127d85cc58adda78c9b86cae58c502410a0d9c23d6eeabe633bc6c5e7d5f8901f243c519a0ce72342a8d08d73f120b32a864a8f6e4eeb3ad33326b6825 - languageName: node - linkType: hard - -"@octokit/app@npm:^16.1.1": - version: 16.1.1 - resolution: "@octokit/app@npm:16.1.1" - dependencies: - "@octokit/auth-app": "npm:^8.1.1" - "@octokit/auth-unauthenticated": "npm:^7.0.2" - "@octokit/core": "npm:^7.0.5" - "@octokit/oauth-app": "npm:^8.0.2" - "@octokit/plugin-paginate-rest": "npm:^13.2.0" - "@octokit/types": "npm:^15.0.0" - "@octokit/webhooks": "npm:^14.0.0" - checksum: 10c0/1989da2151db879e85d0dbe7f1fdfff613a0d00b65eb58b8c08617186726ea9c64061639e6c630d6840772f084468d7cdfd48c001fc7f91313b67cf58a827d81 - languageName: node - linkType: hard - -"@octokit/auth-app@npm:^7.2.1": - version: 7.2.1 - resolution: "@octokit/auth-app@npm:7.2.1" - dependencies: - "@octokit/auth-oauth-app": "npm:^8.1.4" - "@octokit/auth-oauth-user": "npm:^5.1.4" - "@octokit/request": "npm:^9.2.3" - "@octokit/request-error": "npm:^6.1.8" - "@octokit/types": "npm:^14.0.0" - toad-cache: "npm:^3.7.0" - universal-github-app-jwt: "npm:^2.2.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/da8890ad8ae554697a4d58427d7633c8d4d6f7acbfc14e98345b85035cca6773c393f5db5767b455dfc8de9bc5bac4da2d24e443cd48e701de11dd52fa128385 - languageName: node - linkType: hard - -"@octokit/auth-app@npm:^8.1.1": - version: 8.1.1 - resolution: "@octokit/auth-app@npm:8.1.1" - dependencies: - "@octokit/auth-oauth-app": "npm:^9.0.2" - "@octokit/auth-oauth-user": "npm:^6.0.1" - "@octokit/request": "npm:^10.0.5" - "@octokit/request-error": "npm:^7.0.1" - "@octokit/types": "npm:^15.0.0" - toad-cache: "npm:^3.7.0" - universal-github-app-jwt: "npm:^2.2.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/f33d12a5e7339135d013f10ae6e5f6f6f9b94af860df6b300eb158f27c445e626fd08e2d2d8eb39cdab1391918ed244a1e041ebf3c470074f42b8573c52d1dc7 - languageName: node - linkType: hard - -"@octokit/auth-oauth-app@npm:^8.1.3, @octokit/auth-oauth-app@npm:^8.1.4": - version: 8.1.4 - resolution: "@octokit/auth-oauth-app@npm:8.1.4" - dependencies: - "@octokit/auth-oauth-device": "npm:^7.1.5" - "@octokit/auth-oauth-user": "npm:^5.1.4" - "@octokit/request": "npm:^9.2.3" - "@octokit/types": "npm:^14.0.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/2e50711be9ee6c3bf85cf1d58a1d8ae56c36eb894dcfdacabda92b9454b2c49bccc56fb1a989d3e56625885f1ef36278cc01f65c01cde6e3b505b363eac66cc6 - languageName: node - linkType: hard - -"@octokit/auth-oauth-app@npm:^9.0.2": - version: 9.0.2 - resolution: "@octokit/auth-oauth-app@npm:9.0.2" - dependencies: - "@octokit/auth-oauth-device": "npm:^8.0.2" - "@octokit/auth-oauth-user": "npm:^6.0.1" - "@octokit/request": "npm:^10.0.5" - "@octokit/types": "npm:^15.0.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/85f4dc9caad7fa0b963ac33452ad6af3488c0b4b07d2b39b624f1bb8eec4bc5ccf3bfdd379db133439afd437d1389bd4674ba66911d685ebb5cc31c713f04594 - languageName: node - linkType: hard - -"@octokit/auth-oauth-device@npm:^7.1.5": - version: 7.1.5 - resolution: "@octokit/auth-oauth-device@npm:7.1.5" - dependencies: - "@octokit/oauth-methods": "npm:^5.1.5" - "@octokit/request": "npm:^9.2.3" - "@octokit/types": "npm:^14.0.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/f93a67473c58e8b855af15c7300a0937c9d3c6ea898e5e810f2f9762100c6cee22ae52e18c7f926b0e4c6c52573751d4c4ab6294c44116bed2d9fdde5cbdd35d - languageName: node - linkType: hard - -"@octokit/auth-oauth-device@npm:^8.0.2": - version: 8.0.2 - resolution: "@octokit/auth-oauth-device@npm:8.0.2" - dependencies: - "@octokit/oauth-methods": "npm:^6.0.1" - "@octokit/request": "npm:^10.0.5" - "@octokit/types": "npm:^15.0.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/b69b2bda7139b4c49c7ac70f86da53317fcf49e6562fe734ecebef2ce5c8e8f973bf00e6b29e0a45cd88346fc335e73d70c53920b438e73f165590f4fb58864f - languageName: node - linkType: hard - -"@octokit/auth-oauth-user@npm:^5.1.3, @octokit/auth-oauth-user@npm:^5.1.4": - version: 5.1.4 - resolution: "@octokit/auth-oauth-user@npm:5.1.4" - dependencies: - "@octokit/auth-oauth-device": "npm:^7.1.5" - "@octokit/oauth-methods": "npm:^5.1.5" - "@octokit/request": "npm:^9.2.3" - "@octokit/types": "npm:^14.0.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/2bb597b2e50fbd5c03bee3a276efa72b03105aff1d9e243c18a71b72d9fe4ad4b1cee52c2df3e022c4169c7c1d37ab14d05455d5de982528914af965e14b763a - languageName: node - linkType: hard - -"@octokit/auth-oauth-user@npm:^6.0.1": - version: 6.0.1 - resolution: "@octokit/auth-oauth-user@npm:6.0.1" - dependencies: - "@octokit/auth-oauth-device": "npm:^8.0.2" - "@octokit/oauth-methods": "npm:^6.0.1" - "@octokit/request": "npm:^10.0.5" - "@octokit/types": "npm:^15.0.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/8e4c8172be454a46eab05ac5ae1c6cc2984ffee7378f9196d441a53cdba9b722b8f408b9dd4b42fe736cda4144d7a22d2e026888d2ff14c8865e020cb760379a - languageName: node - linkType: hard - -"@octokit/auth-token@npm:^5.0.0": - version: 5.1.2 - resolution: "@octokit/auth-token@npm:5.1.2" - checksum: 10c0/bd4952571d9c559ede1f6ef8f7756900256d19df0180db04da88886a05484c7e6a4397611422e4804465a82addc8c2daa21d0bb4f450403552ee81041a4046d1 - languageName: node - linkType: hard - -"@octokit/auth-token@npm:^6.0.0": - version: 6.0.0 - resolution: "@octokit/auth-token@npm:6.0.0" - checksum: 10c0/32ecc904c5f6f4e5d090bfcc679d70318690c0a0b5040cd9a25811ad9dcd44c33f2cf96b6dbee1cd56cf58fde28fb1819c01b58718aa5c971f79c822357cb5c0 - languageName: node - linkType: hard - -"@octokit/auth-unauthenticated@npm:^6.1.2, @octokit/auth-unauthenticated@npm:^6.1.3": - version: 6.1.3 - resolution: "@octokit/auth-unauthenticated@npm:6.1.3" - dependencies: - "@octokit/request-error": "npm:^6.1.8" - "@octokit/types": "npm:^14.0.0" - checksum: 10c0/60639987fa30e68c4ecd98dd9f1604b3f4368384979cdfa2ab9ea2d0b04c50b42a990e67167cf2a0098205a994b3a80d76b23bb0de4c8c956a898b977f5ce7d0 - languageName: node - linkType: hard - -"@octokit/auth-unauthenticated@npm:^7.0.2": - version: 7.0.2 - resolution: "@octokit/auth-unauthenticated@npm:7.0.2" - dependencies: - "@octokit/request-error": "npm:^7.0.1" - "@octokit/types": "npm:^15.0.0" - checksum: 10c0/07a05683c0451232d1d952e725ad3a4d50dfe5487452f93cfe54b99220b46a5e94a04084b7954738f9d8437f91afce3ab535bc67fa787f711452063baf5f6821 - languageName: node - linkType: hard - -"@octokit/core@npm:^6.1.4": - version: 6.1.4 - resolution: "@octokit/core@npm:6.1.4" - dependencies: - "@octokit/auth-token": "npm:^5.0.0" - "@octokit/graphql": "npm:^8.1.2" - "@octokit/request": "npm:^9.2.1" - "@octokit/request-error": "npm:^6.1.7" - "@octokit/types": "npm:^13.6.2" - before-after-hook: "npm:^3.0.2" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/bcb05e83c54f686ae55bd3793e63a1832f83cbe804586b52c61b0e18942609dcc209af501720de6f2c87dc575047645b074f4cd5822d461e892058ea9654aebc - languageName: node - linkType: hard - -"@octokit/core@npm:^6.1.5": - version: 6.1.5 - resolution: "@octokit/core@npm:6.1.5" - dependencies: - "@octokit/auth-token": "npm:^5.0.0" - "@octokit/graphql": "npm:^8.2.2" - "@octokit/request": "npm:^9.2.3" - "@octokit/request-error": "npm:^6.1.8" - "@octokit/types": "npm:^14.0.0" - before-after-hook: "npm:^3.0.2" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/c89ea754cc33da740fdd69fadb971b4b65c89971bba4e8ad545d3ea7aba79759ee3e195c3b72e7df78f14b8b1d392bddc56e7c385d48b5272319ea6a0246ac7c - languageName: node - linkType: hard - -"@octokit/core@npm:^7.0.5": - version: 7.0.5 - resolution: "@octokit/core@npm:7.0.5" - dependencies: - "@octokit/auth-token": "npm:^6.0.0" - "@octokit/graphql": "npm:^9.0.2" - "@octokit/request": "npm:^10.0.4" - "@octokit/request-error": "npm:^7.0.1" - "@octokit/types": "npm:^15.0.0" - before-after-hook: "npm:^4.0.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/09aeba5f9a6b58c4e7cdd59d883a1b787bc32b17fee3b6c73af47e9b8510dc1aa6e2399274e36106ca27485d4e7b2ffda28af306ad4819fa96cd90caecf15ae7 - languageName: node - linkType: hard - -"@octokit/endpoint@npm:^10.1.3": - version: 10.1.3 - resolution: "@octokit/endpoint@npm:10.1.3" - dependencies: - "@octokit/types": "npm:^13.6.2" - universal-user-agent: "npm:^7.0.2" - checksum: 10c0/096956534efee1f683b4749673c2d1673c6fbe5362b9cce553f9f4b956feaf59bde816594de72f4352f749b862d0b15bc0e2fa7fb0e198deb1fe637b5f4a8bc7 - languageName: node - linkType: hard - -"@octokit/endpoint@npm:^10.1.4": - version: 10.1.4 - resolution: "@octokit/endpoint@npm:10.1.4" - dependencies: - "@octokit/types": "npm:^14.0.0" - universal-user-agent: "npm:^7.0.2" - checksum: 10c0/bf7cca71a05dc4751df658588e32642e59c98768e7509521226b997ea4837e2d16efd35c391231c76d888226f4daf80e6a9f347dee01a69f490253654dada581 - languageName: node - linkType: hard - -"@octokit/endpoint@npm:^11.0.1": - version: 11.0.1 - resolution: "@octokit/endpoint@npm:11.0.1" - dependencies: - "@octokit/types": "npm:^15.0.0" - universal-user-agent: "npm:^7.0.2" - checksum: 10c0/a445c42a4cef357f7a181ac1dc5970db7d6c3bb36c81e10dd4032020873d4ec97402f08ebfa6ea747de8edd255ccf19a57cbb66dc4a05e5cff8c0445e29cd73d - languageName: node - linkType: hard - -"@octokit/graphql@npm:^8.1.2": - version: 8.2.1 - resolution: "@octokit/graphql@npm:8.2.1" - dependencies: - "@octokit/request": "npm:^9.2.2" - "@octokit/types": "npm:^13.8.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/79fe7b50113bef90a32e3b6ee48923cad2afc049aba5c22e44167cf5773e2688a4e953f3ee1e24bee9706ccf7588ae14451933b282f63f1f7d5c95d319df23dd - languageName: node - linkType: hard - -"@octokit/graphql@npm:^8.2.2": - version: 8.2.2 - resolution: "@octokit/graphql@npm:8.2.2" - dependencies: - "@octokit/request": "npm:^9.2.3" - "@octokit/types": "npm:^14.0.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/29cd5af5ed04e416d28798a11907ab861dc73c0af47f8c9c3f4183d81d2e77d88228643825538acc81e7015f78d891f84107929019a673b06a6b38ccea6a24e0 - languageName: node - linkType: hard - -"@octokit/graphql@npm:^9.0.2": - version: 9.0.2 - resolution: "@octokit/graphql@npm:9.0.2" - dependencies: - "@octokit/request": "npm:^10.0.4" - "@octokit/types": "npm:^15.0.0" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/aaba3de627475ac2be24d676be643c85bec089b1d9ef2c3a678fab03a525c0fd9b6c61622d190e84447ecb6aa9271882f8bcce5c278221337fd4be68d36acf10 - languageName: node - linkType: hard - -"@octokit/oauth-app@npm:^7.1.6": - version: 7.1.6 - resolution: "@octokit/oauth-app@npm:7.1.6" - dependencies: - "@octokit/auth-oauth-app": "npm:^8.1.3" - "@octokit/auth-oauth-user": "npm:^5.1.3" - "@octokit/auth-unauthenticated": "npm:^6.1.2" - "@octokit/core": "npm:^6.1.4" - "@octokit/oauth-authorization-url": "npm:^7.1.1" - "@octokit/oauth-methods": "npm:^5.1.4" - "@types/aws-lambda": "npm:^8.10.83" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/75264f6cb9336baf815bb85ea450d69c5d33eb70754065c9c5307b10d0efec2d76bb17c7788346dfb8b5e4ad0205e6df841b9c709eaf077390bba793787841f5 - languageName: node - linkType: hard - -"@octokit/oauth-app@npm:^8.0.2": - version: 8.0.3 - resolution: "@octokit/oauth-app@npm:8.0.3" - dependencies: - "@octokit/auth-oauth-app": "npm:^9.0.2" - "@octokit/auth-oauth-user": "npm:^6.0.1" - "@octokit/auth-unauthenticated": "npm:^7.0.2" - "@octokit/core": "npm:^7.0.5" - "@octokit/oauth-authorization-url": "npm:^8.0.0" - "@octokit/oauth-methods": "npm:^6.0.1" - "@types/aws-lambda": "npm:^8.10.83" - universal-user-agent: "npm:^7.0.0" - checksum: 10c0/7bb064bfe21a6db45b57f8f5e5ecd533e802c0073d293b1c75abf264d9bc0fc952492757ea5af516207af4ec781cf793cb37e8cbbb3a8df691592bc25c364644 - languageName: node - linkType: hard - -"@octokit/oauth-authorization-url@npm:^7.0.0, @octokit/oauth-authorization-url@npm:^7.1.1": - version: 7.1.1 - resolution: "@octokit/oauth-authorization-url@npm:7.1.1" - checksum: 10c0/a2723dde503693d4b0793bc43988d7445bdbd1a4e4994f4e94e635816c87b12a3058609eb5982d91783ddf6cdf663ccdb954b5d05efdc59cb66bc0456d7ba370 - languageName: node - linkType: hard - -"@octokit/oauth-authorization-url@npm:^8.0.0": - version: 8.0.0 - resolution: "@octokit/oauth-authorization-url@npm:8.0.0" - checksum: 10c0/ab4964bebd8d076f945a2f3210a8a0a221a408362569d9fc2f49875ad06e594365f5fd871dac08d820793f687bff50237f7acf40d9d39c5f9de7575b6f4bad93 - languageName: node - linkType: hard - -"@octokit/oauth-methods@npm:^5.1.4, @octokit/oauth-methods@npm:^5.1.5": - version: 5.1.5 - resolution: "@octokit/oauth-methods@npm:5.1.5" - dependencies: - "@octokit/oauth-authorization-url": "npm:^7.0.0" - "@octokit/request": "npm:^9.2.3" - "@octokit/request-error": "npm:^6.1.8" - "@octokit/types": "npm:^14.0.0" - checksum: 10c0/2b1c5f9ef0fcdb2f19fd864303a67bdda296fcb2cc058efc51bf3fbb3cb582475a5532eab05bd7a57277607730fa4a7796431564693fffdb9c4cb2b471484a5c - languageName: node - linkType: hard - -"@octokit/oauth-methods@npm:^6.0.1": - version: 6.0.1 - resolution: "@octokit/oauth-methods@npm:6.0.1" - dependencies: - "@octokit/oauth-authorization-url": "npm:^8.0.0" - "@octokit/request": "npm:^10.0.5" - "@octokit/request-error": "npm:^7.0.1" - "@octokit/types": "npm:^15.0.0" - checksum: 10c0/b9aa6458f8ffdb067552cdc7783038a075401b9b3875c970ca23a29157f75573a18240b1327fb732be30468857abea41761de1f28a50a7c549ff0ced24c9d499 - languageName: node - linkType: hard - -"@octokit/openapi-types@npm:^24.2.0": - version: 24.2.0 - resolution: "@octokit/openapi-types@npm:24.2.0" - checksum: 10c0/8f47918b35e9b7f6109be6f7c8fc3a64ad13a48233112b29e92559e64a564b810eb3ebf81b4cd0af1bb2989d27b9b95cca96e841ec4e23a3f68703cefe62fd9e - languageName: node - linkType: hard - -"@octokit/openapi-types@npm:^25.0.0": - version: 25.0.0 - resolution: "@octokit/openapi-types@npm:25.0.0" - checksum: 10c0/59c9e5998e08cecec155b776c93d8f6f88ab1a812add61cc65f3de8f3744201565545eac308083d18c9fa330a4381a27bcd771a311ac0348d3590a00f333f233 - languageName: node - linkType: hard - -"@octokit/openapi-types@npm:^26.0.0": - version: 26.0.0 - resolution: "@octokit/openapi-types@npm:26.0.0" - checksum: 10c0/671f12c1db70b4bc8c719ec7aa10de034925f4326db0fff22837afcc0b41fd1c015d164673ef5603c5ac787a430c514b821852bfbe6f06edc4a41ad3de342e94 - languageName: node - linkType: hard - -"@octokit/openapi-webhooks-types@npm:11.0.0": - version: 11.0.0 - resolution: "@octokit/openapi-webhooks-types@npm:11.0.0" - checksum: 10c0/cea59ba6b976a242fa4e6bedfab7e6fc3437381557d2c1876ca3aea5f6d4231559a378f9bc35e09593cb2d466afb4a2415be66b960f3e0a38b65b8b9f22ff90e - languageName: node - linkType: hard - -"@octokit/openapi-webhooks-types@npm:12.0.3": - version: 12.0.3 - resolution: "@octokit/openapi-webhooks-types@npm:12.0.3" - checksum: 10c0/1c2429bd939edcf6a6e8db7240a2138a897cd7d6a0922ac083d8ed58868866b036b90888eb22d1b952df75d5741e2df1aa02d38f182c5be83394dc30b24d657d - languageName: node - linkType: hard - -"@octokit/plugin-paginate-graphql@npm:^5.2.4": - version: 5.2.4 - resolution: "@octokit/plugin-paginate-graphql@npm:5.2.4" - peerDependencies: - "@octokit/core": ">=6" - checksum: 10c0/30601cf11d78e5683098d68fbff071a3d20b1e23758f40b1f43fbc93f69b3d0e07f2c9aaaaee113e586af7f604e809ba93702d932b1a4ea65998c7ab39a40a54 - languageName: node - linkType: hard - -"@octokit/plugin-paginate-rest@npm:^11.4.2": - version: 11.6.0 - resolution: "@octokit/plugin-paginate-rest@npm:11.6.0" - dependencies: - "@octokit/types": "npm:^13.10.0" - peerDependencies: - "@octokit/core": ">=6" - checksum: 10c0/f5c8751a1cd08f972a84d0e0534d1f72c178648c64ec2b57f8d924a04b81cc616338e397fb1400c02d7ffda7b6147835cbdbae07a2673f963217d2d59768daaa - languageName: node - linkType: hard - -"@octokit/plugin-paginate-rest@npm:^12.0.0": - version: 12.0.0 - resolution: "@octokit/plugin-paginate-rest@npm:12.0.0" - dependencies: - "@octokit/types": "npm:^14.0.0" - peerDependencies: - "@octokit/core": ">=6" - checksum: 10c0/4ed04e8c111ac8cfb0692f917fe09ff6484b7436f0605c661e8051c6fb281c0260c9b067c1422529b948e53b22221b0f7664e2d10a28dcd9db14465c02c7182f - languageName: node - linkType: hard - -"@octokit/plugin-paginate-rest@npm:^13.2.0": - version: 13.2.1 - resolution: "@octokit/plugin-paginate-rest@npm:13.2.1" - dependencies: - "@octokit/types": "npm:^15.0.1" - peerDependencies: - "@octokit/core": ">=6" - checksum: 10c0/16cd034ee6426f742514d0ca553a2c4355cd68c2eb9211030f3ec2538f4c833d587b3737bb720e34f98be8fae15acb07693d17314350cf067557abb4cb1598fb - languageName: node - linkType: hard - -"@octokit/plugin-request-log@npm:^5.3.1": - version: 5.3.1 - resolution: "@octokit/plugin-request-log@npm:5.3.1" - peerDependencies: - "@octokit/core": ">=6" - checksum: 10c0/2f959934b8285cf39a1d1d0b92ec881b3ae171ae74738225f87b89381afd72a32bc7ea9c04d2dcee74f74ad24c22cce0c5f3e5b4333d531ea67b985e4ee90cb0 - languageName: node - linkType: hard - -"@octokit/plugin-rest-endpoint-methods@npm:^13.3.0": - version: 13.5.0 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:13.5.0" - dependencies: - "@octokit/types": "npm:^13.10.0" - peerDependencies: - "@octokit/core": ">=6" - checksum: 10c0/0dd5fcdc01ac82abeab26fa32fd1c504732918bc70ad8e16924dd4d155dfd4bc8b57f2326c5012276885b9d59be3eb1e8d0b2576f5915a3b3343f26359cdba5e - languageName: node - linkType: hard - -"@octokit/plugin-rest-endpoint-methods@npm:^14.0.0": - version: 14.0.0 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:14.0.0" - dependencies: - "@octokit/types": "npm:^14.0.0" - peerDependencies: - "@octokit/core": ">=6" - checksum: 10c0/c3f26c5277d4aa0c898d8fdbf84326943ea80496e6f60ae34834415384ab629e1e3702d1ed82d40c31a7370edfcb5fa9fe434b0357b302b3be309879bad1d4e6 - languageName: node - linkType: hard - -"@octokit/plugin-retry@npm:^7.2.1": - version: 7.2.1 - resolution: "@octokit/plugin-retry@npm:7.2.1" - dependencies: - "@octokit/request-error": "npm:^6.1.8" - "@octokit/types": "npm:^14.0.0" - bottleneck: "npm:^2.15.3" - peerDependencies: - "@octokit/core": ">=6" - checksum: 10c0/0cac8aa32bfe9612cbaba36f51382c69c882ef7927e1deb4b166fe664959887e952205adbf8b9ff461e0128ac3e1bd807ca58e38041a55ddb3214397584f0406 - languageName: node - linkType: hard - -"@octokit/plugin-throttling@npm:^10.0.0": - version: 10.0.0 - resolution: "@octokit/plugin-throttling@npm:10.0.0" - dependencies: - "@octokit/types": "npm:^14.0.0" - bottleneck: "npm:^2.15.3" - peerDependencies: - "@octokit/core": ^6.1.3 - checksum: 10c0/60294f89bcc03b034fce557dffcb0dba1b02d1fa1834b3b4f542f8635750df4bd23fc143f7c71f802a22a1aaed089c5da77979e6803abe11908b1c91aa1ba419 - languageName: node - linkType: hard - -"@octokit/request-error@npm:^6.1.7": - version: 6.1.7 - resolution: "@octokit/request-error@npm:6.1.7" - dependencies: - "@octokit/types": "npm:^13.6.2" - checksum: 10c0/24bd6f98b1d7b2d4062de34777b4195d3cc4dc40c3187a0321dd588291ec5e13b5760765aacdef3a73796a529d3dec0bfb820780be6ef526a3e774d13566b5b0 - languageName: node - linkType: hard - -"@octokit/request-error@npm:^6.1.8": - version: 6.1.8 - resolution: "@octokit/request-error@npm:6.1.8" - dependencies: - "@octokit/types": "npm:^14.0.0" - checksum: 10c0/02aa5bfebb5b1b9e152558b4a6f4f7dcb149b41538778ffe0fce3395fd0da5c0862311a78e94723435667581b2a58a7cefa458cf7aa19ae2948ae419276f7ee1 - languageName: node - linkType: hard - -"@octokit/request-error@npm:^7.0.0, @octokit/request-error@npm:^7.0.1": - version: 7.0.1 - resolution: "@octokit/request-error@npm:7.0.1" - dependencies: - "@octokit/types": "npm:^15.0.0" - checksum: 10c0/c3f29db87a8d59b8217cbda8cb32be4a553de21ab08bac7ec5909e7c4a4934a32a07575547049fb11a07f0eeec45d0ae5c38295995445adda4ae17b2c66cba85 - languageName: node - linkType: hard - -"@octokit/request@npm:^10.0.4, @octokit/request@npm:^10.0.5": - version: 10.0.5 - resolution: "@octokit/request@npm:10.0.5" - dependencies: - "@octokit/endpoint": "npm:^11.0.1" - "@octokit/request-error": "npm:^7.0.1" - "@octokit/types": "npm:^15.0.0" - fast-content-type-parse: "npm:^3.0.0" - universal-user-agent: "npm:^7.0.2" - checksum: 10c0/66b607ec97280ce2a857826b7c862a48d81fdafe97c7b6b527ce7bf83b0f6eb706ce3df44eafb57c7ed0ee0b5f255db1c1471ed6d9152b8932e6e88feb845bba - languageName: node - linkType: hard - -"@octokit/request@npm:^9.2.1, @octokit/request@npm:^9.2.2": - version: 9.2.2 - resolution: "@octokit/request@npm:9.2.2" - dependencies: - "@octokit/endpoint": "npm:^10.1.3" - "@octokit/request-error": "npm:^6.1.7" - "@octokit/types": "npm:^13.6.2" - fast-content-type-parse: "npm:^2.0.0" - universal-user-agent: "npm:^7.0.2" - checksum: 10c0/14cb523c17ed619c63e52025af9fdc67357b63d113905ec0ccb47badd20926e6f37a17a0620d3a906823b496e3b7efb29ed1e2af658cde5daf3ed3f88b421973 - languageName: node - linkType: hard - -"@octokit/request@npm:^9.2.3": - version: 9.2.3 - resolution: "@octokit/request@npm:9.2.3" - dependencies: - "@octokit/endpoint": "npm:^10.1.4" - "@octokit/request-error": "npm:^6.1.8" - "@octokit/types": "npm:^14.0.0" - fast-content-type-parse: "npm:^2.0.0" - universal-user-agent: "npm:^7.0.2" - checksum: 10c0/96067fc9a5f30f2faa00f08015309930561c3ea0536b543e1c91c475f965eabc81c48fc27d401681ebdb3f6c1acc5d46eaa69163ab98b0faa08be1c02ea5b684 - languageName: node - linkType: hard - -"@octokit/rest@npm:^21.0.2": - version: 21.1.1 - resolution: "@octokit/rest@npm:21.1.1" - dependencies: - "@octokit/core": "npm:^6.1.4" - "@octokit/plugin-paginate-rest": "npm:^11.4.2" - "@octokit/plugin-request-log": "npm:^5.3.1" - "@octokit/plugin-rest-endpoint-methods": "npm:^13.3.0" - checksum: 10c0/59e4fe55942e6f94ff6924934418fbfdee516f6df00889f9417add037c2163b45079a600b6c43449bc824641c9f1b9ac6fe9d3b52a5a1ed3e5e12de697171b78 - languageName: node - linkType: hard - -"@octokit/types@npm:^13.10.0, @octokit/types@npm:^13.6.2, @octokit/types@npm:^13.8.0": - version: 13.10.0 - resolution: "@octokit/types@npm:13.10.0" - dependencies: - "@octokit/openapi-types": "npm:^24.2.0" - checksum: 10c0/f66a401b89d653ec28e5c1529abdb7965752db4d9d40fa54c80e900af4c6bf944af6bd0a83f5b4f1eecb72e3d646899dfb27ffcf272ac243552de7e3b97a038d - languageName: node - linkType: hard - -"@octokit/types@npm:^14.0.0": - version: 14.0.0 - resolution: "@octokit/types@npm:14.0.0" - dependencies: - "@octokit/openapi-types": "npm:^25.0.0" - checksum: 10c0/c82da635fe99f265dbef7bf954d45a23ca7ce9c6fc9a8478c247b5435799e5d0eab3ff42f085785ee0882b2de293cab0ab831b379c66f41d00b78412df850ba4 - languageName: node - linkType: hard - -"@octokit/types@npm:^15.0.0, @octokit/types@npm:^15.0.1": - version: 15.0.1 - resolution: "@octokit/types@npm:15.0.1" - dependencies: - "@octokit/openapi-types": "npm:^26.0.0" - checksum: 10c0/f1f8d8a988c6295d669461082936a4e27d5a021ff870ebb93b8afa8f227f6eb0fb520f98631af31fc56dea0cb84e15df65e736f408cde321693154e4432c575d - languageName: node - linkType: hard - -"@octokit/webhooks-methods@npm:^5.1.1": - version: 5.1.1 - resolution: "@octokit/webhooks-methods@npm:5.1.1" - checksum: 10c0/837aa49dbc7f8bc01448f4eaea32cfb0c1cbfa0b4ac570f7bcda385c71f43e4be05e91a3fb63708448410b27e246570fde42056b6b87d755154d84eff5a6500c - languageName: node - linkType: hard - -"@octokit/webhooks-methods@npm:^6.0.0": - version: 6.0.0 - resolution: "@octokit/webhooks-methods@npm:6.0.0" - checksum: 10c0/7f10740e838d65c78e859bb041499cca69df7831e9f633ee70a46ca8e53d0844f2c84500df204453d171c8c3c0f8eb8b68716ee1d5c95e3cf5d09690f32e13e1 - languageName: node - linkType: hard - -"@octokit/webhooks@npm:^13.6.1": - version: 13.8.2 - resolution: "@octokit/webhooks@npm:13.8.2" - dependencies: - "@octokit/openapi-webhooks-types": "npm:11.0.0" - "@octokit/request-error": "npm:^6.1.7" - "@octokit/webhooks-methods": "npm:^5.1.1" - checksum: 10c0/5053ab9cff8afe4cd6e7d7a41af3f1b0c0ccc5058482577aa82bb8e5003f3002896c68bd59d7da363204c2d6baa4cca73ed684bb7a5a9286ca4b43172cd1fe9e - languageName: node - linkType: hard - -"@octokit/webhooks@npm:^14.0.0": - version: 14.1.3 - resolution: "@octokit/webhooks@npm:14.1.3" - dependencies: - "@octokit/openapi-webhooks-types": "npm:12.0.3" - "@octokit/request-error": "npm:^7.0.0" - "@octokit/webhooks-methods": "npm:^6.0.0" - checksum: 10c0/7f423700784cb769f15303353154e841f66e031289a25ce44852883121ad9752f0b9ea06bde1388ff38310f64208b6de748e2c24ccd9f3021f708e5e9c6ecfac - languageName: node - linkType: hard - -"@openrouter/ai-sdk-provider@npm:^2.2.3": - version: 2.2.3 - resolution: "@openrouter/ai-sdk-provider@npm:2.2.3" - peerDependencies: - ai: ^6.0.0 - zod: ^3.25.0 || ^4.0.0 - checksum: 10c0/d3b6cb9a8bc4df4c22ccbff13932ef25b3999b74abe9aa38d0d9de9e7ae6f69f4b0b6129c9ad13a0f901f068d4e67b7e8ce69a5cf63187bdb4c85608e359f149 - languageName: node - linkType: hard - -"@opentelemetry/api-logs@npm:0.203.0, @opentelemetry/api-logs@npm:^0.203.0": - version: 0.203.0 - resolution: "@opentelemetry/api-logs@npm:0.203.0" - dependencies: - "@opentelemetry/api": "npm:^1.3.0" - checksum: 10c0/e7a0a0ff46aaeb62192a99f45ef4889222e4fea09be25cab6fea811afc2df95c02ea050b2c98dfc0fc5a6ec6a623d87096af2751fdf91ddbb3afcab61b5325da - languageName: node - linkType: hard - -"@opentelemetry/api-logs@npm:0.208.0, @opentelemetry/api-logs@npm:^0.208.0": - version: 0.208.0 - resolution: "@opentelemetry/api-logs@npm:0.208.0" - dependencies: - "@opentelemetry/api": "npm:^1.3.0" - checksum: 10c0/dc1fbee6219df4166509f43b74ea936bb18b6d594565b0bcf56b654a1c958b50d6046b8739dc36c98149fe890c02150ff3814e963f5ea439a07ff3c562555b99 - languageName: node - linkType: hard - -"@opentelemetry/api-logs@npm:0.220.0": - version: 0.220.0 - resolution: "@opentelemetry/api-logs@npm:0.220.0" - dependencies: - "@opentelemetry/api": "npm:^1.3.0" - checksum: 10c0/0189cb2e610b64f75509724721b8b3ed31869a21a94254106330647eccc2a56dc13024a2aa93f4e07e1758b0af8f21952e65b4d7b3bbe9dc380f03810253ede6 - languageName: node - linkType: hard - -"@opentelemetry/api@npm:1.9.0, @opentelemetry/api@npm:^1.3.0, @opentelemetry/api@npm:^1.4.0, @opentelemetry/api@npm:^1.9.0": - version: 1.9.0 - resolution: "@opentelemetry/api@npm:1.9.0" - checksum: 10c0/9aae2fe6e8a3a3eeb6c1fdef78e1939cf05a0f37f8a4fae4d6bf2e09eb1e06f966ece85805626e01ba5fab48072b94f19b835449e58b6d26720ee19a58298add - languageName: node - linkType: hard - -"@opentelemetry/api@npm:^1.9.1": - version: 1.9.1 - resolution: "@opentelemetry/api@npm:1.9.1" - checksum: 10c0/c608485fc8b5a91e1f7e05e843b45b509307456b31cd2ad365933d90813e40ebfedf179f1451c762037e82d7c76aa8500e95d2da3609f640a1206cde5322cd14 - languageName: node - linkType: hard - -"@opentelemetry/core@npm:^2.8.0": - version: 2.8.0 - resolution: "@opentelemetry/core@npm:2.8.0" - dependencies: - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.10.0" - checksum: 10c0/35b8a464b359a0699fcbcea8c11a883f0f634ee7638719b89fa0c0cbbaaa38c57db22e9ac19ffb15ce18014751dc7db11a26d7fb6ad6259f89a26bdc4d167e4b - languageName: node - linkType: hard - -"@opentelemetry/exporter-logs-otlp-http@npm:^0.208.0": - version: 0.208.0 - resolution: "@opentelemetry/exporter-logs-otlp-http@npm:0.208.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.208.0" - "@opentelemetry/core": "npm:2.2.0" - "@opentelemetry/otlp-exporter-base": "npm:0.208.0" - "@opentelemetry/otlp-transformer": "npm:0.208.0" - "@opentelemetry/sdk-logs": "npm:0.208.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10c0/2b8c649e04bfc7c86ebc49de4afb19ccd2562ebfc15ac30f1689787d9b014392f6d936f43b494729d9723de0588276027f742ba825834c74d8a08cd366c284ab - languageName: node - linkType: hard - -"@opentelemetry/instrumentation@npm:^0.203.0": - version: 0.203.0 - resolution: "@opentelemetry/instrumentation@npm:0.203.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.203.0" - import-in-the-middle: "npm:^1.8.1" - require-in-the-middle: "npm:^7.1.1" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10c0/b9de27ea7b42c54b1d0dab15dac62d4fc71c781bb6a48e90fa4ce8ce97be1b78e1fa9f05f58c39f68ca0e4a5590b8538d04209482f6b0632958926f7e80a28c1 - languageName: node - linkType: hard - -"@opentelemetry/instrumentation@npm:^0.220.0": - version: 0.220.0 - resolution: "@opentelemetry/instrumentation@npm:0.220.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.220.0" - import-in-the-middle: "npm:^3.0.0" - require-in-the-middle: "npm:^8.0.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10c0/4328e7a4c1be13b1aea9d266984bbc5cb1417aa2f95bc60f9b81596504cc6cd95f66f7dbb7bcda13cbdb2b3d1f1b8701d794c8a3f4b46544d1b5d4bfafbf7390 - languageName: node - linkType: hard - -"@opentelemetry/otlp-exporter-base@npm:0.208.0": - version: 0.208.0 - resolution: "@opentelemetry/otlp-exporter-base@npm:0.208.0" - dependencies: - "@opentelemetry/core": "npm:2.2.0" - "@opentelemetry/otlp-transformer": "npm:0.208.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10c0/c2b2014da16e2a2be0ebe525b1a62b3e64e286fc9c2575444e4c75bbe0060a83762172180dc7a97cdaaaa8c6765076073edea30340459fc1820cd43468ff98b0 - languageName: node - linkType: hard - -"@opentelemetry/otlp-transformer@npm:0.208.0": - version: 0.208.0 - resolution: "@opentelemetry/otlp-transformer@npm:0.208.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.208.0" - "@opentelemetry/core": "npm:2.2.0" - "@opentelemetry/resources": "npm:2.2.0" - "@opentelemetry/sdk-logs": "npm:0.208.0" - "@opentelemetry/sdk-metrics": "npm:2.2.0" - "@opentelemetry/sdk-trace-base": "npm:2.2.0" - protobufjs: "npm:^7.3.0" - peerDependencies: - "@opentelemetry/api": ^1.3.0 - checksum: 10c0/70c04b2a52f0b2f8aece25ad21401c32ed3136ccd6e82b767d570a24d5456a5ded206ed4cc60ebc09eac08a4aa9c03bc8dcbf10730e491f1af3e7768c361ac12 - languageName: node - linkType: hard - -"@opentelemetry/resources@npm:2.5.1": - version: 2.5.1 - resolution: "@opentelemetry/resources@npm:2.5.1" - dependencies: - "@opentelemetry/core": "npm:2.5.1" - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.10.0" - checksum: 10c0/c336d5066fa7457272bcffb5a9826f090e1e07c2a70c5976942cf2bb188be685842658982a0f323ddfc1d6fbc364f123b6b0e433e230b023aefd88ec60062ba4 - languageName: node - linkType: hard - -"@opentelemetry/sdk-logs@npm:0.208.0, @opentelemetry/sdk-logs@npm:^0.208.0": - version: 0.208.0 - resolution: "@opentelemetry/sdk-logs@npm:0.208.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.208.0" - "@opentelemetry/core": "npm:2.2.0" - "@opentelemetry/resources": "npm:2.2.0" - peerDependencies: - "@opentelemetry/api": ">=1.4.0 <1.10.0" - checksum: 10c0/a167ee7d2818e435ff7480836461f94543e4e39f0e8e8013d462c635def9b960dcf1a29e5536743946b51ef13b764f518d9edb511e89bc1e8995acc96f54241f - languageName: node - linkType: hard - -"@opentelemetry/sdk-logs@npm:^0.203.0": - version: 0.203.0 - resolution: "@opentelemetry/sdk-logs@npm:0.203.0" - dependencies: - "@opentelemetry/api-logs": "npm:0.203.0" - "@opentelemetry/core": "npm:2.0.1" - "@opentelemetry/resources": "npm:2.0.1" - peerDependencies: - "@opentelemetry/api": ">=1.4.0 <1.10.0" - checksum: 10c0/02dd9d9969628f05f71ae1d149f1aa6d1fee2dad607923a68a1cfc923e94b046dcc0e18e85e865324e3bda0cee7a5a0ba9fa0d57e4e95fa672be103e2ce60270 - languageName: node - linkType: hard - -"@opentelemetry/sdk-metrics@npm:2.2.0": - version: 2.2.0 - resolution: "@opentelemetry/sdk-metrics@npm:2.2.0" - dependencies: - "@opentelemetry/core": "npm:2.2.0" - "@opentelemetry/resources": "npm:2.2.0" - peerDependencies: - "@opentelemetry/api": ">=1.9.0 <1.10.0" - checksum: 10c0/a2668f9ef937123552a5ab96ec23675931ae7d3223ec7a31c8aac95fbbfb0b03a54a873f17f2356b04db7031421e7e3d7e3bf9d96d9069a0b97c680a2c158bc4 - languageName: node - linkType: hard - -"@opentelemetry/sdk-trace-base@npm:2.2.0": - version: 2.2.0 - resolution: "@opentelemetry/sdk-trace-base@npm:2.2.0" - dependencies: - "@opentelemetry/core": "npm:2.2.0" - "@opentelemetry/resources": "npm:2.2.0" - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.10.0" - checksum: 10c0/a67715b71d7253cd61ea79954f56491796ac7a660d03d5381fd81defd4546042bb465b27e1b6eee4b1ed32c00305a5349a16d04fd44314c9a1d371a0a638107a - languageName: node - linkType: hard - -"@opentelemetry/sdk-trace-base@npm:^2.9.0": - version: 2.10.0 - resolution: "@opentelemetry/sdk-trace-base@npm:2.10.0" - dependencies: - "@opentelemetry/core": "npm:2.10.0" - "@opentelemetry/resources": "npm:2.10.0" - "@opentelemetry/sdk-trace": "npm:2.10.0" - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.10.0" - checksum: 10c0/181768e44a69141958538f1d30f0ea2d58e6ebfb4dcbf044eb4afd4cc64be1856d540460f46efd8b8ab24195f411ab964b150ee4c363c9bcd71c08c119ba1441 - languageName: node - linkType: hard - -"@opentelemetry/sdk-trace@npm:2.10.0": - version: 2.10.0 - resolution: "@opentelemetry/sdk-trace@npm:2.10.0" - dependencies: - "@opentelemetry/core": "npm:2.10.0" - "@opentelemetry/resources": "npm:2.10.0" - "@opentelemetry/semantic-conventions": "npm:^1.29.0" - peerDependencies: - "@opentelemetry/api": ">=1.3.0 <1.10.0" - checksum: 10c0/8f22a90d197cc6eec8dc3b5a6f81aa7118726052ebcad44948d1e9b146ec897c710f449c73dbda3ce7c580aca17c8c84976928048bb3e1e1428a229b931ede2e - languageName: node - linkType: hard - -"@opentelemetry/semantic-conventions@npm:^1.29.0": - version: 1.36.0 - resolution: "@opentelemetry/semantic-conventions@npm:1.36.0" - checksum: 10c0/edc8a6fe3ec4fc0c67ba3a92b86fb3dcc78fe1eb4f19838d8013c3232b9868540a034dd25cfe0afdd5eae752c5f0e9f42272ff46da144a2d5b35c644478e1c62 - languageName: node - linkType: hard - -"@oxc-project/types@npm:=0.133.0": - version: 0.133.0 - resolution: "@oxc-project/types@npm:0.133.0" - checksum: 10c0/70c57ba58644f7ec217b670c301801f4d06995f4ccdba6b2bd106ea3e5ee49d616573e6ef8d55530b87571a960696543687f3850e87ad173d3f88965c30cdd63 - languageName: node - linkType: hard - -"@panva/hkdf@npm:^1.2.1": - version: 1.2.1 - resolution: "@panva/hkdf@npm:1.2.1" - checksum: 10c0/1fabdec9bd2c19b8e88a3fa6fd0c25e25823c5000d9efdf4b6dfe32e9f370f8b9603cf776d120d160bec15fba17e079974cc34f0f52cebb24602cd832dfde19c - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd - languageName: node - linkType: hard - -"@posthog/ai@npm:^7.18.7": - version: 7.18.7 - resolution: "@posthog/ai@npm:7.18.7" - dependencies: - "@anthropic-ai/sdk": "npm:^0.78.0" - "@google/genai": "npm:^1.43.0" - "@langchain/core": "npm:^1.1.29" - "@posthog/core": "npm:1.29.2" - langchain: "npm:^1.2.28" - openai: "npm:^6.25.0" - uuid: "npm:^11.1.0" - zod: "npm:^4.1.13" - peerDependencies: - "@ai-sdk/provider": ^2.0.0 || ^3.0.0 - "@openai/agents": ^0.8.0 - "@opentelemetry/api": ^1.9.0 - "@opentelemetry/exporter-trace-otlp-http": ">=0.200.0 <1.0.0" - "@opentelemetry/sdk-trace-base": ^2.0.0 - posthog-node: ^5.0.0 - peerDependenciesMeta: - "@ai-sdk/provider": - optional: true - "@openai/agents": - optional: true - "@opentelemetry/api": - optional: true - "@opentelemetry/exporter-trace-otlp-http": - optional: true - "@opentelemetry/sdk-trace-base": - optional: true - checksum: 10c0/c5b34327b26e3ba9af842043f19f1fe980b8da2c081fb0583569632ac173cf17111d6bfe529cfdfa9756d623756fef8caed7b61f12c5d16af0422d0b1e704b9e - languageName: node - linkType: hard - -"@posthog/core@npm:1.25.2": - version: 1.25.2 - resolution: "@posthog/core@npm:1.25.2" - checksum: 10c0/a462328aa50303417abe0c87a0e4a4760b2e836b74cc582449e0480f2f04b832d1d51ade883c4d7fde2bf7e820646a050577b3a9339dd534de4ddd5cadd4bd15 - languageName: node - linkType: hard - -"@posthog/core@npm:1.29.2": - version: 1.29.2 - resolution: "@posthog/core@npm:1.29.2" - dependencies: - "@posthog/types": "npm:1.373.5" - checksum: 10c0/eb598df780c90838d1fad7f135e0c6d3a3a505182902778543b5e10d0588057b032c618baf45cb58bb19efb80b0dcd88af9f328886524a3d99bafde90b59e02f - languageName: node - linkType: hard - -"@posthog/core@npm:^1.48.11": - version: 1.48.11 - resolution: "@posthog/core@npm:1.48.11" - dependencies: - "@posthog/types": "npm:^1.405.3" - checksum: 10c0/1b76c88eca0186ae0c84398a982c40b5088f4158f1a21e5d469a7e3e896ae5d47b328c390070c5e4ecd8243ba700307ce154c7c99ce6fcd515158c9564f9c519 - languageName: node - linkType: hard - -"@posthog/core@npm:^1.53.1": - version: 1.53.2 - resolution: "@posthog/core@npm:1.53.2" - dependencies: - "@posthog/types": "npm:^1.411.1" - checksum: 10c0/63248d839b140887dd7d4af81096909f9920a566f09bec945806c3ece7a8d047c3644569cee8962f100decf6b60a42188016319dd11ec87458eddbf7bcb5fd3a - languageName: node - linkType: hard - -"@posthog/types@npm:1.369.0": - version: 1.369.0 - resolution: "@posthog/types@npm:1.369.0" - checksum: 10c0/dcb3de271b87ea5faa7562a79f201c4de74b045bb6182fdf880176b2059674f6e408905c791e49ccef2e742615a63fd793ce04a7ca94fad853b43d00b099abcc - languageName: node - linkType: hard - -"@posthog/types@npm:1.373.5": - version: 1.373.5 - resolution: "@posthog/types@npm:1.373.5" - checksum: 10c0/5627050abb167a9b6b8c419be5f6b1933ad32107154eaff58c4c8f54b3e97ee3a41444bbb64db726fdc80d0ca15e644ab74d5c9890f517be0e3060a5e40bdcd9 - languageName: node - linkType: hard - -"@posthog/types@npm:^1.405.3": - version: 1.406.1 - resolution: "@posthog/types@npm:1.406.1" - checksum: 10c0/f0a1a7a3b3cd9f97ace07356137accb43e7a71f0a8b4a6f15b203975e2238d79a6d1e6aa251cdba867c45b4124c4a84a231ee5d3a7e4b87df874e869ffde6f36 - languageName: node - linkType: hard - -"@posthog/types@npm:^1.411.1": - version: 1.411.1 - resolution: "@posthog/types@npm:1.411.1" - checksum: 10c0/fd4cf6bd38abea89ff37fc2af8f329373ba6da8bfc99a1743f69f665428d43bcf6be5c3ef01196292e7b14f928df0b0de64ec3e401576ca15632c21b3b1b1703 - languageName: node - linkType: hard - -"@preact/signals-core@npm:^1.7.0": - version: 1.14.0 - resolution: "@preact/signals-core@npm:1.14.0" - checksum: 10c0/b9d39899bd24fae59c8b1a70d940dedb8f952d2e530b3cdc52c79de2df1f096b347fce6a52ed6cfd6f98dfe710741abe9f509ee746789023ff1dbde90152016d - languageName: node - linkType: hard - -"@preact/signals@npm:^1.3.1": - version: 1.3.4 - resolution: "@preact/signals@npm:1.3.4" - dependencies: - "@preact/signals-core": "npm:^1.7.0" - peerDependencies: - preact: 10.x - checksum: 10c0/57f90c1e1d797c1417d7dbeb492eb43b6cdd7a9bb153d66d4e87519d8f3621e3ee0740895a125f5f45eb593b6da9edd5cc501eb6428fbb837497ce8a620a8303 - languageName: node - linkType: hard - -"@prisma/client@npm:6.2.1": - version: 6.2.1 - resolution: "@prisma/client@npm:6.2.1" - peerDependencies: - prisma: "*" - peerDependenciesMeta: - prisma: - optional: true - checksum: 10c0/d6313da2408f2034bfcda1fa3500e6e9fdf13b8ca68d0f31804d6e540e9fedfd4c556bd2258488e5928fa383e5e3a43aa6469c819f8f8bed6250ef983feee5f6 - languageName: node - linkType: hard - -"@prisma/config@npm:6.5.0": - version: 6.5.0 - resolution: "@prisma/config@npm:6.5.0" - dependencies: - esbuild: "npm:>=0.12 <1" - esbuild-register: "npm:3.6.0" - checksum: 10c0/6096e946aa8787cd216a9661ab12641776cfc21c2142f25b2fa3a199042a761de3fbfeca0bf0e8acd77f4913e8ecb1cea37a04ecf51a4a110f06c17963665b7c - languageName: node - linkType: hard - -"@prisma/debug@npm:6.5.0": - version: 6.5.0 - resolution: "@prisma/debug@npm:6.5.0" - checksum: 10c0/e33ba5750642c3ecf73844df7b8d7a1b35bd45601e6449bd6fdd56df7bf5a1c09f3b034594b2cd150aae86e822b6de5f29fae5681a0c94c38b1e393ce439e923 - languageName: node - linkType: hard - -"@prisma/engines-version@npm:6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60": - version: 6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60 - resolution: "@prisma/engines-version@npm:6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60" - checksum: 10c0/92792c7f4ece28bfb3f6be14c8d3c625bc201a802ab9c71cf5b04e7e1fef827c75e73f63258c3ae5e63658eec97306d172b8104e5ee4e73583e7cb586479d724 - languageName: node - linkType: hard - -"@prisma/engines@npm:6.5.0": - version: 6.5.0 - resolution: "@prisma/engines@npm:6.5.0" - dependencies: - "@prisma/debug": "npm:6.5.0" - "@prisma/engines-version": "npm:6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60" - "@prisma/fetch-engine": "npm:6.5.0" - "@prisma/get-platform": "npm:6.5.0" - checksum: 10c0/61cc51e28f403a9540183d7276e3f4e191daa854005642f80747f122f4d99e322d036b112da5ab0be77938198b5298138243c72d9d56e6841066b808a6c73f93 - languageName: node - linkType: hard - -"@prisma/fetch-engine@npm:6.5.0": - version: 6.5.0 - resolution: "@prisma/fetch-engine@npm:6.5.0" - dependencies: - "@prisma/debug": "npm:6.5.0" - "@prisma/engines-version": "npm:6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60" - "@prisma/get-platform": "npm:6.5.0" - checksum: 10c0/4f26fb07fd183f9a975674b29f976d94fe0301a4fd0571b85b3f6995127ce70d0a65e84a821daef95f4053ae3a02b0cc9535e1e113d363f70d3f606eca587df5 - languageName: node - linkType: hard - -"@prisma/get-platform@npm:6.5.0": - version: 6.5.0 - resolution: "@prisma/get-platform@npm:6.5.0" - dependencies: - "@prisma/debug": "npm:6.5.0" - checksum: 10c0/45033d8c20a19d6e0329ff15901606a53be9f43c843ddfd99848c8ac388b12e1b65c202e95a1d5cdc7da4bfee77ed3795ba3c7e0b1d1fa6380c9a253e1bedfd2 - languageName: node - linkType: hard - -"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": - version: 1.1.2 - resolution: "@protobufjs/aspromise@npm:1.1.2" - checksum: 10c0/a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f - languageName: node - linkType: hard - -"@protobufjs/base64@npm:^1.1.2": - version: 1.1.2 - resolution: "@protobufjs/base64@npm:1.1.2" - checksum: 10c0/eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6 - languageName: node - linkType: hard - -"@protobufjs/codegen@npm:^2.0.5": - version: 2.0.5 - resolution: "@protobufjs/codegen@npm:2.0.5" - checksum: 10c0/1b8a2ae56ee60a56e9d205cd4b6072a1503c5069b8ebb905710f974ff0098a0d0700641c137e0a8d98dedf14423156a106a9433695cbf52574810f55000fdcab - languageName: node - linkType: hard - -"@protobufjs/eventemitter@npm:^1.1.1": - version: 1.1.1 - resolution: "@protobufjs/eventemitter@npm:1.1.1" - checksum: 10c0/8e06193d4629c5e7c09d4f8c2ddba8fc4dfa739f0149f33a1d901568d35bb7b8b5277a4e8452baf3bdd0b302fd599cf255d193267aa93a0a4747e23cd073c4ac - languageName: node - linkType: hard - -"@protobufjs/fetch@npm:^1.1.1": - version: 1.1.1 - resolution: "@protobufjs/fetch@npm:1.1.1" - dependencies: - "@protobufjs/aspromise": "npm:^1.1.1" - checksum: 10c0/a497ff5433854e8577f0427983ea39b9113b49a8120f94515291d763327061d2c3013e60e24ea436d091dafae01a0f6eb1867e3b1616045d96a31d8b3c646ed4 - languageName: node - linkType: hard - -"@protobufjs/float@npm:^1.0.2": - version: 1.0.2 - resolution: "@protobufjs/float@npm:1.0.2" - checksum: 10c0/18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069 - languageName: node - linkType: hard - -"@protobufjs/path@npm:^1.1.2": - version: 1.1.2 - resolution: "@protobufjs/path@npm:1.1.2" - checksum: 10c0/cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4 - languageName: node - linkType: hard - -"@protobufjs/pool@npm:^1.1.0": - version: 1.1.0 - resolution: "@protobufjs/pool@npm:1.1.0" - checksum: 10c0/eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038 - languageName: node - linkType: hard - -"@protobufjs/utf8@npm:^1.1.1": - version: 1.1.1 - resolution: "@protobufjs/utf8@npm:1.1.1" - checksum: 10c0/641fc145f00626405e8984b6e90b9edcbcc072ffc82d0647ca3176e09c730b2d022f988e65f011a7a17e2e4d77cde7733643aa10d8ac2bfa30f134dbcad553fd - languageName: node - linkType: hard - -"@radix-ui/number@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/number@npm:1.1.0" - checksum: 10c0/a48e34d5ff1484de1b7cf5d7317fefc831d49e96a2229f300fd37b657bd8cfb59c922830c00ec02838ab21de3b299a523474592e4f30882153412ed47edce6a4 - languageName: node - linkType: hard - -"@radix-ui/primitive@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/primitive@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - checksum: 10c0/912216455537db3ca77f3e7f70174fb2b454fbd4a37a0acb7cfadad9ab6131abdfb787472242574460a3c301edf45738340cc84f6717982710082840fde7d916 - languageName: node - linkType: hard - -"@radix-ui/primitive@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/primitive@npm:1.1.1" - checksum: 10c0/6457bd8d1aa4ecb948e5d2a2484fc570698b2ab472db6d915a8f1eec04823f80423efa60b5ba840f0693bec2ca380333cc5f3b52586b40f407d9f572f9261f8d - languageName: node - linkType: hard - -"@radix-ui/primitive@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/primitive@npm:1.1.2" - checksum: 10c0/5e2d2528d2fe37c16865e77b0beaac2b415a817ad13d8178db6e8187b2a092672568a64ee0041510abfde3034490a5cadd3057049bb15789020c06892047597c - languageName: node - linkType: hard - -"@radix-ui/primitive@npm:1.1.3": - version: 1.1.3 - resolution: "@radix-ui/primitive@npm:1.1.3" - checksum: 10c0/88860165ee7066fa2c179f32ffcd3ee6d527d9dcdc0e8be85e9cb0e2c84834be8e3c1a976c74ba44b193f709544e12f54455d892b28e32f0708d89deda6b9f1d - languageName: node - linkType: hard - -"@radix-ui/react-accordion@npm:^1.2.11": - version: 1.2.11 - resolution: "@radix-ui/react-accordion@npm:1.2.11" - dependencies: - "@radix-ui/primitive": "npm:1.1.2" - "@radix-ui/react-collapsible": "npm:1.1.11" - "@radix-ui/react-collection": "npm:1.1.7" - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-direction": "npm:1.1.1" - "@radix-ui/react-id": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-controllable-state": "npm:1.2.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/40c5f09380c86e61d8c24ec596be4099cf4b26533f7de7c7f1da8c2e558dfaca93298011484e0697cb9b7fd9949b21c755d67dbc649accec877c02aac3b48a36 - languageName: node - linkType: hard - -"@radix-ui/react-alert-dialog@npm:^1.1.5": - version: 1.1.6 - resolution: "@radix-ui/react-alert-dialog@npm:1.1.6" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-dialog": "npm:1.1.6" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-slot": "npm:1.1.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/87acd4313b4a2fb1233cc94685aeebf7051de20570cb1f11d1c805a6023582e9d487cbef811569d87e03745c4e4a42f011c0c8aa0998f54899e9c5fc2c778bbb - languageName: node - linkType: hard - -"@radix-ui/react-arrow@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-arrow@npm:1.1.2" - dependencies: - "@radix-ui/react-primitive": "npm:2.0.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/38e1a338da1131f325e417ac456b1b6c16c76aa9da0635916262b4682d4e648226fd37b23348964a8e909c98b4d2293c7c5789be8f243cfe03856e6f0765cf5d - languageName: node - linkType: hard - -"@radix-ui/react-arrow@npm:1.1.7": - version: 1.1.7 - resolution: "@radix-ui/react-arrow@npm:1.1.7" - dependencies: - "@radix-ui/react-primitive": "npm:2.1.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/c3b46766238b3ee2a394d8806a5141432361bf1425110c9f0dcf480bda4ebd304453a53f294b5399c6ee3ccfcae6fd544921fd01ddc379cf5942acdd7168664b - languageName: node - linkType: hard - -"@radix-ui/react-avatar@npm:^1.1.2": - version: 1.1.3 - resolution: "@radix-ui/react-avatar@npm:1.1.3" - dependencies: - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - "@radix-ui/react-use-layout-effect": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/ecf0c2b8477346c087b6a22e2a01b6e2984a0722f0bcef9436f398386735e2ec83fbf20e3740b9e9b23ea5c5a43918cef14e009698dbffe6980e3c2d94aa5e16 - languageName: node - linkType: hard - -"@radix-ui/react-checkbox@npm:^1.3.2": - version: 1.3.2 - resolution: "@radix-ui/react-checkbox@npm:1.3.2" - dependencies: - "@radix-ui/primitive": "npm:1.1.2" - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-presence": "npm:1.1.4" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-controllable-state": "npm:1.2.2" - "@radix-ui/react-use-previous": "npm:1.1.1" - "@radix-ui/react-use-size": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/8be7c06b3a7d3cff099cca1ccaf65258d65d9f10b5bb3a78ff6fc024799ac78befb3dfbb2965900c409a3dcbb99458bd3a9925392299f9f150a4f35eef040c59 - languageName: node - linkType: hard - -"@radix-ui/react-collapsible@npm:1.1.11, @radix-ui/react-collapsible@npm:^1.1.11": - version: 1.1.11 - resolution: "@radix-ui/react-collapsible@npm:1.1.11" - dependencies: - "@radix-ui/primitive": "npm:1.1.2" - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-id": "npm:1.1.1" - "@radix-ui/react-presence": "npm:1.1.4" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-controllable-state": "npm:1.2.2" - "@radix-ui/react-use-layout-effect": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/fa2de539ef06e2b2d18acebb12a34ce1534ca88bd484b7359aac05534d1e551fe83eaafbf60915c00161bb370f0dc9fc303903133510dea0a59fd018155b7db5 - languageName: node - linkType: hard - -"@radix-ui/react-collection@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-collection@npm:1.1.2" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-slot": "npm:1.1.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/8376aa0c0f38efbb45e5c0a2e8724b0ca2ccdab511f5aee4c3eb62a89959b20be0d4dd410b7068bc13d722751cbc88e916e10573784fb26b084c43f930818715 - languageName: node - linkType: hard - -"@radix-ui/react-collection@npm:1.1.7": - version: 1.1.7 - resolution: "@radix-ui/react-collection@npm:1.1.7" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-slot": "npm:1.2.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/fa321a7300095508491f75414f02b243f0c3f179dc0728cfd115e2ea9f6f48f1516532b59f526d9ac81bbab63cd98a052074b4703ec0b9428fac945ebabec5fd - languageName: node - linkType: hard - -"@radix-ui/react-compose-refs@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-compose-refs@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/be06f8dab35b5a1bffa7a5982fb26218ddade1acb751288333e3b89d7b4a7dfb5a6371be83876dac0ec2ebe0866d295e8618b778608e1965342986ea448040ec - languageName: node - linkType: hard - -"@radix-ui/react-compose-refs@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-compose-refs@npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/3e84580024e66e3cc5b9ae79355e787815c1d2a3c7d46e7f47900a29c33751ca24cf4ac8903314957ab1f7788aebe1687e2258641c188cf94653f7ddf8f70627 - languageName: node - linkType: hard - -"@radix-ui/react-compose-refs@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-compose-refs@npm:1.1.2" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/d36a9c589eb75d634b9b139c80f916aadaf8a68a7c1c4b8c6c6b88755af1a92f2e343457042089f04cc3f23073619d08bb65419ced1402e9d4e299576d970771 - languageName: node - linkType: hard - -"@radix-ui/react-context@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-context@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/3de5761b32cc70cd61715527f29d8c699c01ab28c195ced972ccbc7025763a373a68f18c9f948c7a7b922e469fd2df7fee5f7536e3f7bad44ffc06d959359333 - languageName: node - linkType: hard - -"@radix-ui/react-context@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-context@npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/fc4ace9d79d7954c715ade765e06c95d7e1b12a63a536bcbe842fb904f03f88fc5bd6e38d44bd23243d37a270b4c44380fedddaeeae2d274f0b898a20665aba2 - languageName: node - linkType: hard - -"@radix-ui/react-context@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-context@npm:1.1.2" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/cece731f8cc25d494c6589cc681e5c01a93867d895c75889973afa1a255f163c286e390baa7bc028858eaabe9f6b57270d0ca6377356f652c5557c1c7a41ccce - languageName: node - linkType: hard - -"@radix-ui/react-dialog@npm:1.0.5": - version: 1.0.5 - resolution: "@radix-ui/react-dialog@npm:1.0.5" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/primitive": "npm:1.0.1" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-context": "npm:1.0.1" - "@radix-ui/react-dismissable-layer": "npm:1.0.5" - "@radix-ui/react-focus-guards": "npm:1.0.1" - "@radix-ui/react-focus-scope": "npm:1.0.4" - "@radix-ui/react-id": "npm:1.0.1" - "@radix-ui/react-portal": "npm:1.0.4" - "@radix-ui/react-presence": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-slot": "npm:1.0.2" - "@radix-ui/react-use-controllable-state": "npm:1.0.1" - aria-hidden: "npm:^1.1.1" - react-remove-scroll: "npm:2.5.5" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/c5b3069397379e79857a3203f3ead4d12d87736b59899f02a63e620a07dd1e6704e15523926cdf8e39afe1c945a7ff0f2533c5ea5be1e17c3114820300a51133 - languageName: node - linkType: hard - -"@radix-ui/react-dialog@npm:1.1.6": - version: 1.1.6 - resolution: "@radix-ui/react-dialog@npm:1.1.6" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-dismissable-layer": "npm:1.1.5" - "@radix-ui/react-focus-guards": "npm:1.1.1" - "@radix-ui/react-focus-scope": "npm:1.1.2" - "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-portal": "npm:1.1.4" - "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-slot": "npm:1.1.2" - "@radix-ui/react-use-controllable-state": "npm:1.1.0" - aria-hidden: "npm:^1.2.4" - react-remove-scroll: "npm:^2.6.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/98e425549573c5d6fb0fee94ecd40427a8b8897bb2d9bb2a44fe64e484754376ff23b64fcf64e061d42fc774b9627a28cb5b1bb5652e567908dac9a8d8618705 - languageName: node - linkType: hard - -"@radix-ui/react-dialog@npm:^1.1.15": - version: 1.1.15 - resolution: "@radix-ui/react-dialog@npm:1.1.15" - dependencies: - "@radix-ui/primitive": "npm:1.1.3" - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-dismissable-layer": "npm:1.1.11" - "@radix-ui/react-focus-guards": "npm:1.1.3" - "@radix-ui/react-focus-scope": "npm:1.1.7" - "@radix-ui/react-id": "npm:1.1.1" - "@radix-ui/react-portal": "npm:1.1.9" - "@radix-ui/react-presence": "npm:1.1.5" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-slot": "npm:1.2.3" - "@radix-ui/react-use-controllable-state": "npm:1.2.2" - aria-hidden: "npm:^1.2.4" - react-remove-scroll: "npm:^2.6.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/2f2c88e3c281acaea2fd9b96fa82132d59177d3aa5da2e7c045596fd4028e84e44ac52ac28f4f236910605dd7d9338c2858ba44a9ced2af2e3e523abbfd33014 - languageName: node - linkType: hard - -"@radix-ui/react-direction@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-direction@npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/eb07d8cc3ae2388b824e0a11ae0e3b71fb0c49972b506e249cec9f27a5b7ef4305ee668c98b674833c92e842163549a83beb0a197dec1ec65774bdeeb61f932c - languageName: node - linkType: hard - -"@radix-ui/react-direction@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-direction@npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/7a89d9291f846a3105e45f4df98d6b7a08f8d7b30acdcd253005dc9db107ee83cbbebc9e47a9af1e400bcd47697f1511ceab23a399b0da854488fc7220482ac9 - languageName: node - linkType: hard - -"@radix-ui/react-dismissable-layer@npm:1.0.5": - version: 1.0.5 - resolution: "@radix-ui/react-dismissable-layer@npm:1.0.5" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/primitive": "npm:1.0.1" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" - "@radix-ui/react-use-escape-keydown": "npm:1.0.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/7e4308867aecfb07b506330c1964d94a52247ab9453725613cd326762aa13e483423c250f107219c131b0449600eb8d1576ce3159c2b96e8c978f75e46062cb2 - languageName: node - linkType: hard - -"@radix-ui/react-dismissable-layer@npm:1.1.11": - version: 1.1.11 - resolution: "@radix-ui/react-dismissable-layer@npm:1.1.11" - dependencies: - "@radix-ui/primitive": "npm:1.1.3" - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-callback-ref": "npm:1.1.1" - "@radix-ui/react-use-escape-keydown": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/c825572a64073c4d3853702029979f6658770ffd6a98eabc4984e1dee1b226b4078a2a4dc7003f96475b438985e9b21a58e75f51db74dd06848dcae1f2d395dc - languageName: node - linkType: hard - -"@radix-ui/react-dismissable-layer@npm:1.1.5": - version: 1.1.5 - resolution: "@radix-ui/react-dismissable-layer@npm:1.1.5" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - "@radix-ui/react-use-escape-keydown": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/05c5adfcd42a736c456f50bdca25bf7f6b25eef7328e4c05de535fea128328666433a89d68cb1445e039c188d7f1397df6a4a02e2da0970762f2a80fd29b48ea - languageName: node - linkType: hard - -"@radix-ui/react-dropdown-menu@npm:^2.1.1": - version: 2.1.6 - resolution: "@radix-ui/react-dropdown-menu@npm:2.1.6" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-menu": "npm:2.1.6" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-controllable-state": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/1165cc6a7c914b4491f83b7ff2bd84e5c52016f5ee48ae9b841482ed09b349adb294a8269cc69ba5a20fee75400b521843130a490da7e81c39361f63092266ba - languageName: node - linkType: hard - -"@radix-ui/react-focus-guards@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-focus-guards@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/d5fd4e5aa9d9a87c8ad490b3b4992d6f1d9eddf18e56df2a2bcf8744c4332b275d73377fd193df3e6ba0ad9608dc497709beca5c64de2b834d5f5350b3c9a272 - languageName: node - linkType: hard - -"@radix-ui/react-focus-guards@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-focus-guards@npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/2e99750ca593083a530542a185d656b45b100752353a7a193a67566e3c256414a76fa9171d152f8c0167b8d6c1fdf62b2e07750d7af2974bf8ef39eb204aa537 - languageName: node - linkType: hard - -"@radix-ui/react-focus-guards@npm:1.1.3": - version: 1.1.3 - resolution: "@radix-ui/react-focus-guards@npm:1.1.3" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/0bab65eb8d7e4f72f685d63de7fbba2450e3cb15ad6a20a16b42195e9d335c576356f5a47cb58d1ffc115393e46d7b14b12c5d4b10029b0ec090861255866985 - languageName: node - linkType: hard - -"@radix-ui/react-focus-scope@npm:1.0.4": - version: 1.0.4 - resolution: "@radix-ui/react-focus-scope@npm:1.0.4" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-primitive": "npm:1.0.3" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/2fce0bafcab4e16cf4ed7560bda40654223f3d0add6b231e1c607433030c14e6249818b444b7b58ee7a6ff6bbf8e192c9c81d22c3a5c88c2daade9d1f881b5be - languageName: node - linkType: hard - -"@radix-ui/react-focus-scope@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-focus-scope@npm:1.1.2" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/7b93866a9980bc938fc3fcfacfc49467c13144931c9b7a3b5423c0c3817685dc421499d73f58335f6c3c1c0f4fea9c9b7c16aa06a1d30571620787086082bea0 - languageName: node - linkType: hard - -"@radix-ui/react-focus-scope@npm:1.1.7": - version: 1.1.7 - resolution: "@radix-ui/react-focus-scope@npm:1.1.7" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-callback-ref": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/8a6071331bdeeb79b223463de75caf759b8ad19339cab838e537b8dbb2db236891a1f4df252445c854d375d43d9d315dfcce0a6b01553a2984ec372bb8f1300e - languageName: node - linkType: hard - -"@radix-ui/react-hover-card@npm:^1.1.6": - version: 1.1.6 - resolution: "@radix-ui/react-hover-card@npm:1.1.6" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-dismissable-layer": "npm:1.1.5" - "@radix-ui/react-popper": "npm:1.2.2" - "@radix-ui/react-portal": "npm:1.1.4" - "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-controllable-state": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/4cbc9458f9d411ce37f3390d96d3dda1289774c3e996a8ae691429b4eeb02c2c39dcfe6fddb73275babb749d4da537f989dfa3b077de088ad37f3a549a395338 - languageName: node - linkType: hard - -"@radix-ui/react-icons@npm:^1.3.0": - version: 1.3.2 - resolution: "@radix-ui/react-icons@npm:1.3.2" - peerDependencies: - react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc - checksum: 10c0/3a380c7ae47e330ebd8ab4846729a543b4a0be5ecb1e2a7a571f4394728ff7d428b01f6620128051b6b69d63138a0ab8de77af78221ec364fbc5d126acf55b4a - languageName: node - linkType: hard - -"@radix-ui/react-id@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-id@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-use-layout-effect": "npm:1.0.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/e2859ca58bea171c956098ace7ecf615cf9432f58a118b779a14720746b3adcf0351c36c75de131548672d3cd290ca238198acbd33b88dc4706f98312e9317ad - languageName: node - linkType: hard - -"@radix-ui/react-id@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-id@npm:1.1.0" - dependencies: - "@radix-ui/react-use-layout-effect": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/acf13e29e51ee96336837fc0cfecc306328b20b0e0070f6f0f7aa7a621ded4a1ee5537cfad58456f64bae76caa7f8769231e88dc7dc106197347ee433c275a79 - languageName: node - linkType: hard - -"@radix-ui/react-id@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-id@npm:1.1.1" - dependencies: - "@radix-ui/react-use-layout-effect": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/7d12e76818763d592c331277ef62b197e2e64945307e650bd058f0090e5ae48bbd07691b23b7e9e977901ef4eadcb3e2d5eaeb17a13859083384be83fc1292c7 - languageName: node - linkType: hard - -"@radix-ui/react-label@npm:^2.1.0": - version: 2.1.2 - resolution: "@radix-ui/react-label@npm:2.1.2" - dependencies: - "@radix-ui/react-primitive": "npm:2.0.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/c425ea25a67f60142645e6dd7669aa90bd9017e8d99c347736c9c19c44cea52e33224e4d086fd7e4945a7e9baa49335d42a5801d3bead884305515023e3ab31c - languageName: node - linkType: hard - -"@radix-ui/react-menu@npm:2.1.6": - version: 2.1.6 - resolution: "@radix-ui/react-menu@npm:2.1.6" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collection": "npm:1.1.2" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-direction": "npm:1.1.0" - "@radix-ui/react-dismissable-layer": "npm:1.1.5" - "@radix-ui/react-focus-guards": "npm:1.1.1" - "@radix-ui/react-focus-scope": "npm:1.1.2" - "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-popper": "npm:1.2.2" - "@radix-ui/react-portal": "npm:1.1.4" - "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-roving-focus": "npm:1.1.2" - "@radix-ui/react-slot": "npm:1.1.2" - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - aria-hidden: "npm:^1.2.4" - react-remove-scroll: "npm:^2.6.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/0b5420f181e38ec146572f56ebe51a4e7f28663939f8149a246f5d319b79633574fa35a3f3c7c85deb44a6fe31d94af62a34407b1a8e97c1eae99cfca5db40ed - languageName: node - linkType: hard - -"@radix-ui/react-navigation-menu@npm:^1.2.0": - version: 1.2.5 - resolution: "@radix-ui/react-navigation-menu@npm:1.2.5" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collection": "npm:1.1.2" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-direction": "npm:1.1.0" - "@radix-ui/react-dismissable-layer": "npm:1.1.5" - "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - "@radix-ui/react-use-controllable-state": "npm:1.1.0" - "@radix-ui/react-use-layout-effect": "npm:1.1.0" - "@radix-ui/react-use-previous": "npm:1.1.0" - "@radix-ui/react-visually-hidden": "npm:1.1.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/fba44c307cff567eabcf98863ca458ddefa242c0252f1b73dc8e7ead690d431454f55b6db28161f0ee6a19b734cd68d85bc998966bcd90b1d1dc08b01f83e28f - languageName: node - linkType: hard - -"@radix-ui/react-popover@npm:^1.1.6": - version: 1.1.6 - resolution: "@radix-ui/react-popover@npm:1.1.6" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-dismissable-layer": "npm:1.1.5" - "@radix-ui/react-focus-guards": "npm:1.1.1" - "@radix-ui/react-focus-scope": "npm:1.1.2" - "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-popper": "npm:1.2.2" - "@radix-ui/react-portal": "npm:1.1.4" - "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-slot": "npm:1.1.2" - "@radix-ui/react-use-controllable-state": "npm:1.1.0" - aria-hidden: "npm:^1.2.4" - react-remove-scroll: "npm:^2.6.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/63cc2761693193f8c28c43a25d9eea69e4095ba47da11413dfa19436d6116c814851c388ab78f93a3bda0cc88ec4c234bd31d971ade2fcfbc08a0645ccde1d91 - languageName: node - linkType: hard - -"@radix-ui/react-popper@npm:1.2.2": - version: 1.2.2 - resolution: "@radix-ui/react-popper@npm:1.2.2" - dependencies: - "@floating-ui/react-dom": "npm:^2.0.0" - "@radix-ui/react-arrow": "npm:1.1.2" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - "@radix-ui/react-use-layout-effect": "npm:1.1.0" - "@radix-ui/react-use-rect": "npm:1.1.0" - "@radix-ui/react-use-size": "npm:1.1.0" - "@radix-ui/rect": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/556cef98c0fe50bcfaaa4ae2e85af737755c884b78a04b6bdac3682829051ea0a4cf1163fc8bde782e33280613424e2ebb10b8af507da53e1aea08966c13cc86 - languageName: node - linkType: hard - -"@radix-ui/react-popper@npm:1.2.8": - version: 1.2.8 - resolution: "@radix-ui/react-popper@npm:1.2.8" - dependencies: - "@floating-ui/react-dom": "npm:^2.0.0" - "@radix-ui/react-arrow": "npm:1.1.7" - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-callback-ref": "npm:1.1.1" - "@radix-ui/react-use-layout-effect": "npm:1.1.1" - "@radix-ui/react-use-rect": "npm:1.1.1" - "@radix-ui/react-use-size": "npm:1.1.1" - "@radix-ui/rect": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/48e3f13eac3b8c13aca8ded37d74db17e1bb294da8d69f142ab6b8719a06c3f90051668bed64520bf9f3abdd77b382ce7ce209d056bb56137cecc949b69b421c - languageName: node - linkType: hard - -"@radix-ui/react-portal@npm:1.0.4": - version: 1.0.4 - resolution: "@radix-ui/react-portal@npm:1.0.4" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-primitive": "npm:1.0.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/fed32f8148b833fe852fb5e2f859979ffdf2fb9a9ef46583b9b52915d764ad36ba5c958a64e61d23395628ccc09d678229ee94cd112941e8fe2575021f820c29 - languageName: node - linkType: hard - -"@radix-ui/react-portal@npm:1.1.4": - version: 1.1.4 - resolution: "@radix-ui/react-portal@npm:1.1.4" - dependencies: - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-layout-effect": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/e4038eb2f20be10d9754d099d00620f429711919d20c4c630946d9c4941f1c83ef1a3f4110c221c70486e65bc565ebba4ada22a0e7e2d179c039f2a014300793 - languageName: node - linkType: hard - -"@radix-ui/react-portal@npm:1.1.9": - version: 1.1.9 - resolution: "@radix-ui/react-portal@npm:1.1.9" - dependencies: - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-layout-effect": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/45b432497c722720c72c493a29ef6085bc84b50eafe79d48b45c553121b63e94f9cdb77a3a74b9c49126f8feb3feee009fe400d48b7759d3552396356b192cd7 - languageName: node - linkType: hard - -"@radix-ui/react-presence@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-presence@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" - "@radix-ui/react-use-layout-effect": "npm:1.0.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/90780618b265fe794a8f1ddaa5bfd3c71a1127fa79330a14d32722e6265b44452a9dd36efe4e769129d33e57f979f6b8713e2cbf2e2755326aa3b0f337185b6e - languageName: node - linkType: hard - -"@radix-ui/react-presence@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-presence@npm:1.1.2" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-use-layout-effect": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/0c6fa281368636308044df3be4c1f02733094b5e35ba04f26e610dd1c4315a245ffc758e0e176c444742a7a46f4328af1a9d8181e860175ec39338d06525a78d - languageName: node - linkType: hard - -"@radix-ui/react-presence@npm:1.1.4": - version: 1.1.4 - resolution: "@radix-ui/react-presence@npm:1.1.4" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-use-layout-effect": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/8202647139d6f5097b0abcc43dfba471c00b69da95ca336afe3ea23a165e05ca21992f40fc801760fe442f3e064e54e2f2cbcb9ad758c4b07ef6c69a5b6777bd - languageName: node - linkType: hard - -"@radix-ui/react-presence@npm:1.1.5": - version: 1.1.5 - resolution: "@radix-ui/react-presence@npm:1.1.5" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-use-layout-effect": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/d0e61d314250eeaef5369983cb790701d667f51734bafd98cf759072755562018052c594e6cdc5389789f4543cb0a4d98f03ff4e8f37338d6b5bf51a1700c1d1 - languageName: node - linkType: hard - -"@radix-ui/react-primitive@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-primitive@npm:1.0.3" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-slot": "npm:1.0.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/67a66ff8898a5e7739eda228ab6f5ce808858da1dce967014138d87e72b6bbfc93dc1467c706d98d1a2b93bf0b6e09233d1a24d31c78227b078444c1a69c42be - languageName: node - linkType: hard - -"@radix-ui/react-primitive@npm:2.0.2": - version: 2.0.2 - resolution: "@radix-ui/react-primitive@npm:2.0.2" - dependencies: - "@radix-ui/react-slot": "npm:1.1.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/1af7a33a86f8bd2467f2300b1bb6ca9af67cae3950953ba543d2a625c17f341dff05d19056ece7b03e5ced8b9f8de99c74f806710ce0da6b9a000f2af063fffe - languageName: node - linkType: hard - -"@radix-ui/react-primitive@npm:2.1.2": - version: 2.1.2 - resolution: "@radix-ui/react-primitive@npm:2.1.2" - dependencies: - "@radix-ui/react-slot": "npm:1.2.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/0c1b4b5d2f225dc85e02a915b362e38383eb3bd6d150a72cb9183485c066156caad1a9f530202b84a5ad900d365302c0843fdcabb13100808872b3655709099d - languageName: node - linkType: hard - -"@radix-ui/react-primitive@npm:2.1.3": - version: 2.1.3 - resolution: "@radix-ui/react-primitive@npm:2.1.3" - dependencies: - "@radix-ui/react-slot": "npm:1.2.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/fdff9b84913bb4172ef6d3af7442fca5f9bba5f2709cba08950071f819d7057aec3a4a2d9ef44cf9cbfb8014d02573c6884a04cff175895823aaef809ebdb034 - languageName: node - linkType: hard - -"@radix-ui/react-primitive@npm:2.1.4": - version: 2.1.4 - resolution: "@radix-ui/react-primitive@npm:2.1.4" - dependencies: - "@radix-ui/react-slot": "npm:1.2.4" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/90d687b222a25975371ed1f9f08648d75237214b8dec4cbaf09ec9ac951339b17421278f1aff2fb7c5672ba8bd03774a94904efdba73805dd5cc947ce5be8c4a - languageName: node - linkType: hard - -"@radix-ui/react-roving-focus@npm:1.1.11": - version: 1.1.11 - resolution: "@radix-ui/react-roving-focus@npm:1.1.11" - dependencies: - "@radix-ui/primitive": "npm:1.1.3" - "@radix-ui/react-collection": "npm:1.1.7" - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-direction": "npm:1.1.1" - "@radix-ui/react-id": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-callback-ref": "npm:1.1.1" - "@radix-ui/react-use-controllable-state": "npm:1.2.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/2cd43339c36e89a3bf1db8aab34b939113dfbde56bf3a33df2d74757c78c9489b847b1962f1e2441c67e41817d120cb6177943e0f655f47bc1ff8e44fd55b1a2 - languageName: node - linkType: hard - -"@radix-ui/react-roving-focus@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-roving-focus@npm:1.1.2" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collection": "npm:1.1.2" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-direction": "npm:1.1.0" - "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - "@radix-ui/react-use-controllable-state": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/80e378e1156d5b8af14995e908fe2358c8f4757fbf274e30d2ee3c1cedc3a0c7192524df7e3bb1d5011ee9ab8ab7445b60eff06617370e58abcd1ae97e0e40f6 - languageName: node - linkType: hard - -"@radix-ui/react-scroll-area@npm:^1.1.0": - version: 1.2.3 - resolution: "@radix-ui/react-scroll-area@npm:1.2.3" - dependencies: - "@radix-ui/number": "npm:1.1.0" - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-direction": "npm:1.1.0" - "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - "@radix-ui/react-use-layout-effect": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/029b95f0e89cb1ef8b04a237784894587baed87c6e7b57088101820cfaf5d12987a6671a76a6d7d8054a42cbd738b3c44ae110b55b990b144696e2971571bf4b - languageName: node - linkType: hard - -"@radix-ui/react-select@npm:^2.1.6": - version: 2.1.6 - resolution: "@radix-ui/react-select@npm:2.1.6" - dependencies: - "@radix-ui/number": "npm:1.1.0" - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collection": "npm:1.1.2" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-direction": "npm:1.1.0" - "@radix-ui/react-dismissable-layer": "npm:1.1.5" - "@radix-ui/react-focus-guards": "npm:1.1.1" - "@radix-ui/react-focus-scope": "npm:1.1.2" - "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-popper": "npm:1.2.2" - "@radix-ui/react-portal": "npm:1.1.4" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-slot": "npm:1.1.2" - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - "@radix-ui/react-use-controllable-state": "npm:1.1.0" - "@radix-ui/react-use-layout-effect": "npm:1.1.0" - "@radix-ui/react-use-previous": "npm:1.1.0" - "@radix-ui/react-visually-hidden": "npm:1.1.2" - aria-hidden: "npm:^1.2.4" - react-remove-scroll: "npm:^2.6.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/bc953806b861c66f01371502ac7404e1e3c783290e979f9446e89b643bff7f90164ce91126f719e5aec4d9601b9ad0e4e7b7e747bfc0fbfcf7a31aeeac0a484d - languageName: node - linkType: hard - -"@radix-ui/react-separator@npm:^1.1.8": - version: 1.1.8 - resolution: "@radix-ui/react-separator@npm:1.1.8" - dependencies: - "@radix-ui/react-primitive": "npm:2.1.4" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/92e1353f696a22167c90f2c610b440be1fae3c05128287560914f124eef83d74c06ad25431923f3595032e6d89c23d479c95434390f4c0d9d4a68ec8d563ae0c - languageName: node - linkType: hard - -"@radix-ui/react-slot@npm:1.0.2": - version: 1.0.2 - resolution: "@radix-ui/react-slot@npm:1.0.2" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-compose-refs": "npm:1.0.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/3af6ea4891e6fa8091e666802adffe7718b3cd390a10fa9229a5f40f8efded9f3918ea01b046103d93923d41cc32119505ebb6bde76cad07a87b6cf4f2119347 - languageName: node - linkType: hard - -"@radix-ui/react-slot@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-slot@npm:1.1.2" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/81d45091806c52b507cec80b4477e4f31189d76ffcd7845b382eb3a034e6cf1faef71b881612028d5893f7580bf9ab59daa18fbf2792042dccd755c99a18df67 - languageName: node - linkType: hard - -"@radix-ui/react-slot@npm:1.2.2": - version: 1.2.2 - resolution: "@radix-ui/react-slot@npm:1.2.2" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.2" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/74489f5ad11b17444560a1cdd664c01308206ce5cb9fcd46121b45281ece20273948479711411223c1081f709c15409242d51ca6cc57ff81f6335d70e0cbe0b5 - languageName: node - linkType: hard - -"@radix-ui/react-slot@npm:1.2.3": - version: 1.2.3 - resolution: "@radix-ui/react-slot@npm:1.2.3" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.2" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/5913aa0d760f505905779515e4b1f0f71a422350f077cc8d26d1aafe53c97f177fec0e6d7fbbb50d8b5e498aa9df9f707ca75ae3801540c283b26b0136138eef - languageName: node - linkType: hard - -"@radix-ui/react-slot@npm:1.2.4, @radix-ui/react-slot@npm:^1.2.4": - version: 1.2.4 - resolution: "@radix-ui/react-slot@npm:1.2.4" - dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.2" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/8b719bb934f1ae5ac0e37214783085c17c2f1080217caf514c1c6cc3d9ca56c7e19d25470b26da79aa6e605ab36589edaade149b76f5fc0666f1063e2fc0a0dc - languageName: node - linkType: hard - -"@radix-ui/react-switch@npm:^1.2.4": - version: 1.2.4 - resolution: "@radix-ui/react-switch@npm:1.2.4" - dependencies: - "@radix-ui/primitive": "npm:1.1.2" - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.1.2" - "@radix-ui/react-use-controllable-state": "npm:1.2.2" - "@radix-ui/react-use-previous": "npm:1.1.1" - "@radix-ui/react-use-size": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/53f1f985dd0ed7b28b108b8075078912fed1496313f23270f0be3234fedebb5df4b4b33f2cb1a9c5670d48a38200fc4e1f09db2608c3e94d1de61339ac2d2c53 - languageName: node - linkType: hard - -"@radix-ui/react-tabs@npm:^1.1.2": - version: 1.1.3 - resolution: "@radix-ui/react-tabs@npm:1.1.3" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-direction": "npm:1.1.0" - "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-roving-focus": "npm:1.1.2" - "@radix-ui/react-use-controllable-state": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/2f621c43a8e1dd0d54c828f8b4d88414c9114af6b720a650ad9587cc0a7a7536da778f2fe5181a38494cc2956f2b238fbe64790f6daad1d058b34f4acaee520e - languageName: node - linkType: hard - -"@radix-ui/react-toast@npm:^1.2.2": - version: 1.2.6 - resolution: "@radix-ui/react-toast@npm:1.2.6" - dependencies: - "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collection": "npm:1.1.2" - "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-dismissable-layer": "npm:1.1.5" - "@radix-ui/react-portal": "npm:1.1.4" - "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.2" - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - "@radix-ui/react-use-controllable-state": "npm:1.1.0" - "@radix-ui/react-use-layout-effect": "npm:1.1.0" - "@radix-ui/react-visually-hidden": "npm:1.1.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/34334eb835097de9474137bea41a68a5299ab3a2db7f88f4c9007c85ef19b8798f25771a726aed83a76c4f33ce4592b0a84d870d9754e0c2a9e23022fec9721a - languageName: node - linkType: hard - -"@radix-ui/react-toggle-group@npm:^1.1.11": - version: 1.1.11 - resolution: "@radix-ui/react-toggle-group@npm:1.1.11" - dependencies: - "@radix-ui/primitive": "npm:1.1.3" - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-direction": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-roving-focus": "npm:1.1.11" - "@radix-ui/react-toggle": "npm:1.1.10" - "@radix-ui/react-use-controllable-state": "npm:1.2.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/c8cbccda3e25754ed9f3145c67792df2d5d0ee1a910bde6dc07c4577ab508d4b939f145569d4e2af5b17dc4a5c701473380d8695248f8620cf0a372c05b8e958 - languageName: node - linkType: hard - -"@radix-ui/react-toggle@npm:1.1.10, @radix-ui/react-toggle@npm:^1.1.10": - version: 1.1.10 - resolution: "@radix-ui/react-toggle@npm:1.1.10" - dependencies: - "@radix-ui/primitive": "npm:1.1.3" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-controllable-state": "npm:1.2.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/5406cdf5dd7299ae6cfdb4865dc5fd43ca3c475ebcd4e86830bd296d734255b61f749c9bde452ebfaad126033f92dd1112ee9d95982344ffad34491238dcc9b1 - languageName: node - linkType: hard - -"@radix-ui/react-tooltip@npm:^1.2.8": - version: 1.2.8 - resolution: "@radix-ui/react-tooltip@npm:1.2.8" - dependencies: - "@radix-ui/primitive": "npm:1.1.3" - "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-context": "npm:1.1.2" - "@radix-ui/react-dismissable-layer": "npm:1.1.11" - "@radix-ui/react-id": "npm:1.1.1" - "@radix-ui/react-popper": "npm:1.2.8" - "@radix-ui/react-portal": "npm:1.1.9" - "@radix-ui/react-presence": "npm:1.1.5" - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-slot": "npm:1.2.3" - "@radix-ui/react-use-controllable-state": "npm:1.2.2" - "@radix-ui/react-visually-hidden": "npm:1.2.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/de0cbae9c571a00671f160928d819e59502f59be8749f536ab4b180181d9d70aee3925a5b2555f8f32d0bea622bc35f65b70ca7ff0449e4844f891302310cc48 - languageName: node - linkType: hard - -"@radix-ui/react-use-callback-ref@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-callback-ref@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/331b432be1edc960ca148637ae6087220873ee828ceb13bd155926ef8f49e862812de5b379129f6aaefcd11be53715f3237e6caa9a33d9c0abfff43f3ba58938 - languageName: node - linkType: hard - -"@radix-ui/react-use-callback-ref@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-callback-ref@npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/e954863f3baa151faf89ac052a5468b42650efca924417470efd1bd254b411a94c69c30de2fdbb90187b38cb984795978e12e30423dc41e4309d93d53b66d819 - languageName: node - linkType: hard - -"@radix-ui/react-use-callback-ref@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-use-callback-ref@npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/5f6aff8592dea6a7e46589808912aba3fb3b626cf6edd2b14f01638b61dbbe49eeb9f67cd5601f4c15b2fb547b9a7e825f7c4961acd4dd70176c969ae405f8d8 - languageName: node - linkType: hard - -"@radix-ui/react-use-controllable-state@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-controllable-state@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/29b069dbf09e48bca321af6272574ad0fc7283174e7d092731a10663fe00c0e6b4bde5e1b5ea67725fe48dcbe8026e7ff0d69d42891c62cbb9ca408498171fbe - languageName: node - linkType: hard - -"@radix-ui/react-use-controllable-state@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-controllable-state@npm:1.1.0" - dependencies: - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/2af883b5b25822ac226e60a6bfde647c0123a76345052a90219026059b3f7225844b2c13a9a16fba859c1cda5fb3d057f2a04503f71780e607516492db4eb3a1 - languageName: node - linkType: hard - -"@radix-ui/react-use-controllable-state@npm:1.2.2": - version: 1.2.2 - resolution: "@radix-ui/react-use-controllable-state@npm:1.2.2" - dependencies: - "@radix-ui/react-use-effect-event": "npm:0.0.2" - "@radix-ui/react-use-layout-effect": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/f55c4b06e895293aed4b44c9ef26fb24432539f5346fcd6519c7745800535b571058685314e83486a45bf61dc83887e24826490d3068acc317fb0a9010516e63 - languageName: node - linkType: hard - -"@radix-ui/react-use-effect-event@npm:0.0.2": - version: 0.0.2 - resolution: "@radix-ui/react-use-effect-event@npm:0.0.2" - dependencies: - "@radix-ui/react-use-layout-effect": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/e84ff72a3e76c5ae9c94941028bb4b6472f17d4104481b9eab773deab3da640ecea035e54da9d6f4df8d84c18ef6913baf92b7511bee06930dc58bd0c0add417 - languageName: node - linkType: hard - -"@radix-ui/react-use-escape-keydown@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-use-escape-keydown@npm:1.0.3" - dependencies: - "@babel/runtime": "npm:^7.13.10" - "@radix-ui/react-use-callback-ref": "npm:1.0.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/3c94c78902dcb40b60083ee2184614f45c95a189178f52d89323b467bd04bcf5fdb1bc4d43debecd7f0b572c3843c7e04edbcb56f40a4b4b43936fb2770fb8ad - languageName: node - linkType: hard - -"@radix-ui/react-use-escape-keydown@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.0" - dependencies: - "@radix-ui/react-use-callback-ref": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/910fd696e5a0994b0e06b9cb68def8a865f47951a013ec240c77db2a9e1e726105602700ef5e5f01af49f2f18fe0e73164f9a9651021f28538ef8a30d91f3fbb - languageName: node - linkType: hard - -"@radix-ui/react-use-escape-keydown@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.1" - dependencies: - "@radix-ui/react-use-callback-ref": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/bff53be99e940fef1d3c4df7d560e1d9133182e5a98336255d3063327d1d3dd4ec54a95dc5afe15cca4fb6c184f0a956c70de2815578c318cf995a7f9beabaa1 - languageName: node - linkType: hard - -"@radix-ui/react-use-layout-effect@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-layout-effect@npm:1.0.1" - dependencies: - "@babel/runtime": "npm:^7.13.10" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/13cd0c38395c5838bc9a18238020d3bcf67fb340039e6d1cbf438be1b91d64cf6900b78121f3dc9219faeb40dcc7b523ce0f17e4a41631655690e5a30a40886a - languageName: node - linkType: hard - -"@radix-ui/react-use-layout-effect@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-layout-effect@npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/9bf87ece1845c038ed95863cfccf9d75f557c2400d606343bab0ab3192b9806b9840e6aa0a0333fdf3e83cf9982632852192f3e68d7d8367bc8c788dfdf8e62b - languageName: node - linkType: hard - -"@radix-ui/react-use-layout-effect@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-use-layout-effect@npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/9f98fdaba008dfc58050de60a77670b885792df473cf82c1cef8daee919a5dd5a77d270209f5f0b0abfaac78cb1627396e3ff56c81b735be550409426fe8b040 - languageName: node - linkType: hard - -"@radix-ui/react-use-previous@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-previous@npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/9787d24790d4e330715127f2f4db56c4cbed9b0a47f97e11a68582c08a356a53c1ec41c7537382f6fb8d0db25de152770f17430e8eaf0fa59705be97760acbad - languageName: node - linkType: hard - -"@radix-ui/react-use-previous@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-use-previous@npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/52f1089d941491cd59b7f52a5679a14e9381711419a0557ce0f3bc9a4c117078224efec54dcced41a3653a13a386a7b6ec75435d61a273e8b9f5d00235f2b182 - languageName: node - linkType: hard - -"@radix-ui/react-use-rect@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-rect@npm:1.1.0" - dependencies: - "@radix-ui/rect": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/c2e30150ab49e2cec238cda306fd748c3d47fb96dcff69a3b08e1d19108d80bac239d48f1747a25dadca614e3e967267d43b91e60ea59db2befbc7bea913ff84 - languageName: node - linkType: hard - -"@radix-ui/react-use-rect@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-use-rect@npm:1.1.1" - dependencies: - "@radix-ui/rect": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/271711404c05c589c8dbdaa748749e7daf44bcc6bffc9ecd910821c3ebca0ee245616cf5b39653ce690f53f875c3836fd3f36f51ab1c628273b6db599eee4864 - languageName: node - linkType: hard - -"@radix-ui/react-use-size@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-size@npm:1.1.0" - dependencies: - "@radix-ui/react-use-layout-effect": "npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/4c8b89037597fdc1824d009e0c941b510c7c6c30f83024cc02c934edd748886786e7d9f36f57323b02ad29833e7fa7e8974d81969b4ab33d8f41661afa4f30a6 - languageName: node - linkType: hard - -"@radix-ui/react-use-size@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-use-size@npm:1.1.1" - dependencies: - "@radix-ui/react-use-layout-effect": "npm:1.1.1" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/851d09a816f44282e0e9e2147b1b571410174cc048703a50c4fa54d672de994fd1dfff1da9d480ecfd12c77ae8f48d74f01adaf668f074156b8cd0043c6c21d8 - languageName: node - linkType: hard - -"@radix-ui/react-visually-hidden@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-visually-hidden@npm:1.1.2" - dependencies: - "@radix-ui/react-primitive": "npm:2.0.2" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/ea6dc8ec284b32bca6f24809db257394802e14af7c95e4a237af51009fa222c42e3b7a55b3bfc94d753f509086636555058ae8e535be25956c46529abf41b448 - languageName: node - linkType: hard - -"@radix-ui/react-visually-hidden@npm:1.2.3": - version: 1.2.3 - resolution: "@radix-ui/react-visually-hidden@npm:1.2.3" - dependencies: - "@radix-ui/react-primitive": "npm:2.1.3" - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/cf86a37f1cbee50a964056f3dc4f6bb1ee79c76daa321f913aa20ff3e1ccdfafbf2b114d7bb616aeefc7c4b895e6ca898523fdb67710d89bd5d8edb739a0d9b6 - languageName: node - linkType: hard - -"@radix-ui/rect@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/rect@npm:1.1.0" - checksum: 10c0/a26ff7f8708fb5f2f7949baad70a6b2a597d761ee4dd4aadaf1c1a33ea82ea23dfef6ce6366a08310c5d008cdd60b2e626e4ee03fa342bd5f246ddd9d427f6be - languageName: node - linkType: hard - -"@radix-ui/rect@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/rect@npm:1.1.1" - checksum: 10c0/0dac4f0f15691199abe6a0e067821ddd9d0349c0c05f39834e4eafc8403caf724106884035ae91bbc826e10367e6a5672e7bec4d4243860fa7649de246b1f60b - languageName: node - linkType: hard - -"@react-email/body@npm:0.3.0": - version: 0.3.0 - resolution: "@react-email/body@npm:0.3.0" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/81796d310f1c404eab035964cead670902d4de047b088218589a8ad6be1953d6494bbd5d586ec09c871484779bd944fa3637afa232ec1e7850c995e94b642c81 - languageName: node - linkType: hard - -"@react-email/button@npm:0.2.1": - version: 0.2.1 - resolution: "@react-email/button@npm:0.2.1" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/1efbf7f7d34555982b5f6a797aab2f5443a9c135a4a28b87145786a50a1d79ed1fcdaa203d03d72148b9a21e19f2adb05661e0b1fec9a89bb5db18520908b252 - languageName: node - linkType: hard - -"@react-email/code-block@npm:0.2.1": - version: 0.2.1 - resolution: "@react-email/code-block@npm:0.2.1" - dependencies: - prismjs: "npm:^1.30.0" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/aa513e6e1023293f6bb319cb0877b927eccb6bd47dd2cc26a69c9ff8eca2322f7efd8800026fe4a609d65a699953ed48385f53b8039b0e3e91fa5ae8dff6de4b - languageName: node - linkType: hard - -"@react-email/code-inline@npm:0.0.6": - version: 0.0.6 - resolution: "@react-email/code-inline@npm:0.0.6" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/e4fba8d168162b0e514876d98809e3baea24fa1822a4770f62276b8a953209b4ca8efc5e8c8663dd5d790eb1e6f9b0b8774f4b08768db421155b6d0afce5ffa1 - languageName: node - linkType: hard - -"@react-email/column@npm:0.0.14": - version: 0.0.14 - resolution: "@react-email/column@npm:0.0.14" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/9cee2fa427ebc62ac144f73f1cac4cc8aebac7fdad850af6246b59522f478f8ecb65bbe9b2a8a799e65fa2719f1305a498b5eaf8b135a36b95c9b440bb8f35aa - languageName: node - linkType: hard - -"@react-email/components@npm:^1.0.12": - version: 1.0.12 - resolution: "@react-email/components@npm:1.0.12" - dependencies: - "@react-email/body": "npm:0.3.0" - "@react-email/button": "npm:0.2.1" - "@react-email/code-block": "npm:0.2.1" - "@react-email/code-inline": "npm:0.0.6" - "@react-email/column": "npm:0.0.14" - "@react-email/container": "npm:0.0.16" - "@react-email/font": "npm:0.0.10" - "@react-email/head": "npm:0.0.13" - "@react-email/heading": "npm:0.0.16" - "@react-email/hr": "npm:0.0.12" - "@react-email/html": "npm:0.0.12" - "@react-email/img": "npm:0.0.12" - "@react-email/link": "npm:0.0.13" - "@react-email/markdown": "npm:0.0.18" - "@react-email/preview": "npm:0.0.14" - "@react-email/render": "npm:2.0.6" - "@react-email/row": "npm:0.0.13" - "@react-email/section": "npm:0.0.17" - "@react-email/tailwind": "npm:2.0.7" - "@react-email/text": "npm:0.1.6" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/31c4947fbd4b3c11d7a291c5f9b37155f75468c72759fd3ea4480546751ea3e01409374fc0b91bf84df256b4cfc7ffa99a5b23e36f289eec98d33c5bae3efc4b - languageName: node - linkType: hard - -"@react-email/container@npm:0.0.16": - version: 0.0.16 - resolution: "@react-email/container@npm:0.0.16" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/6b86a25885e2a825082aeaa2d0339ccd863b4b657aa41c542d83ee989f63906506f29a5ecd261aa72f57d6be3f43d45c8cb0bc3415961c1d108156437825d95a - languageName: node - linkType: hard - -"@react-email/font@npm:0.0.10": - version: 0.0.10 - resolution: "@react-email/font@npm:0.0.10" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/b49f36cdc99bf7459d8fa56f079bccd7dff2ad168fd4acff80919dbfaa5bef03a2e85b8bd4aa01876f22facf2f24e3a73800a3fd1b0702f64f7121ed776ad4ff - languageName: node - linkType: hard - -"@react-email/head@npm:0.0.13": - version: 0.0.13 - resolution: "@react-email/head@npm:0.0.13" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/cab456a7748b96fb842f520f7e0340f5503a7027b9e676c32cda22ea44bdde5b2e2ad218a466a8fd699abd70dae315619b8b558cc8c07454371b9df12a21282f - languageName: node - linkType: hard - -"@react-email/heading@npm:0.0.16": - version: 0.0.16 - resolution: "@react-email/heading@npm:0.0.16" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/843993d978d8e1937a3ce92cd88004d554d83dc9b1a8cde8ad9b4b169da95dfd00cc5e2db7b161459026cb5e167bc208d2c2982c83600a6d9c288531fdb69903 - languageName: node - linkType: hard - -"@react-email/hr@npm:0.0.12": - version: 0.0.12 - resolution: "@react-email/hr@npm:0.0.12" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/e656f61e881cee1757bac75eee5b46861602b291038464d9f65d024884b9e22b35171173332482aa822c1c667129e7869f5b98583d57fc50445008aad08470eb - languageName: node - linkType: hard - -"@react-email/html@npm:0.0.12": - version: 0.0.12 - resolution: "@react-email/html@npm:0.0.12" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/664cf81508b788280ca54f9c36f6bdf9b7b4000c69aba2b78f3ec7ff366dacf03daf6e1dbbb668b8769646175fa22a97a7909c19c995fa6525648ae45ce6be0a - languageName: node - linkType: hard - -"@react-email/img@npm:0.0.12": - version: 0.0.12 - resolution: "@react-email/img@npm:0.0.12" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/9c390e7a329a30a2792ed5c9d7c53195541df8bf0c125f08cd2ac5df5c54ac210998de8bc201016e17f1b0e4eac5209675c699caa4505339254c825c39b62678 - languageName: node - linkType: hard - -"@react-email/link@npm:0.0.13": - version: 0.0.13 - resolution: "@react-email/link@npm:0.0.13" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/c083bc94c8b8854e9d44830f82f49e732c698b55967d94d45e51fd522a525bcf9f7093d3bb89e959da3232fba34f7f5c98e0ae9359940c81f850a72da20961e8 - languageName: node - linkType: hard - -"@react-email/markdown@npm:0.0.18": - version: 0.0.18 - resolution: "@react-email/markdown@npm:0.0.18" - dependencies: - marked: "npm:^15.0.12" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/d8023f87d95ab80df9ce72b38fa52ef4eac4337569309fb6155f8b16e82bb280c5704e1a6b971e08d1aaf736205411e52291d257b06d344d0901580ae7222b74 - languageName: node - linkType: hard - -"@react-email/preview@npm:0.0.14": - version: 0.0.14 - resolution: "@react-email/preview@npm:0.0.14" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/af9b8b618121af3f28699a240851dcc8f25448fa4bc47c04b5931d25330052a5bcbf45d7cd4da845e64bf91db5dc32108f471553fe20c54b1410443de850ef71 - languageName: node - linkType: hard - -"@react-email/render@npm:2.0.6": - version: 2.0.6 - resolution: "@react-email/render@npm:2.0.6" - dependencies: - html-to-text: "npm:^9.0.5" - prettier: "npm:^3.5.3" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/dce11a0068c9f24d45989f9252d5523408a4850542f8fd7724e69eb450588b8df14f2c2aabf25706d3a697b4ab0806a7b4b103ae662a80436ba4db2af24cefb0 - languageName: node - linkType: hard - -"@react-email/render@npm:>=2.0.8, @react-email/render@npm:^2.0.8": - version: 2.0.8 - resolution: "@react-email/render@npm:2.0.8" - dependencies: - html-to-text: "npm:^9.0.5" - prettier: "npm:^3.5.3" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/183793beaab413523e1ffbf3e07b352e33c0b7b0912e6bee0da2aceb495f327694f98b55957255419cbcaf771c538f2b084580d4d3a78c92ccf7a5cad527f73c - languageName: node - linkType: hard - -"@react-email/row@npm:0.0.13": - version: 0.0.13 - resolution: "@react-email/row@npm:0.0.13" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/74b075fb85cca2e4ed7bf2b62e0544e92ee4155160f5a7cf253e809f1fb136380ace73f8bd954efa5ed927a2bbcf7448d13b065133becc172e0bd8b071610310 - languageName: node - linkType: hard - -"@react-email/section@npm:0.0.17": - version: 0.0.17 - resolution: "@react-email/section@npm:0.0.17" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/93c16a1a0ae3abccd92244d51413e561ee4305990984eeceeb61dd8d08e7b4a3fbc3f6e381a9e0eed480f907485ab5f8a1e5914a4d6741376e74df46fb8bf02d - languageName: node - linkType: hard - -"@react-email/tailwind@npm:2.0.7": - version: 2.0.7 - resolution: "@react-email/tailwind@npm:2.0.7" - dependencies: - tailwindcss: "npm:^4.1.18" - peerDependencies: - "@react-email/body": ">=0" - "@react-email/button": ">=0" - "@react-email/code-block": ">=0" - "@react-email/code-inline": ">=0" - "@react-email/container": ">=0" - "@react-email/heading": ">=0" - "@react-email/hr": ">=0" - "@react-email/img": ">=0" - "@react-email/link": ">=0" - "@react-email/preview": ">=0" - "@react-email/text": ">=0" - react: ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@react-email/body": - optional: true - "@react-email/button": - optional: true - "@react-email/code-block": - optional: true - "@react-email/code-inline": - optional: true - "@react-email/container": - optional: true - "@react-email/heading": - optional: true - "@react-email/hr": - optional: true - "@react-email/img": - optional: true - "@react-email/link": - optional: true - "@react-email/preview": - optional: true - checksum: 10c0/6cd9277829d7a207ecf97abd8bca14235f70e2a83ca3022b8189e6a2ada00968acc1092d26f3f2d02a39021a84931368e26d66f414a40885519415e1da30caa7 - languageName: node - linkType: hard - -"@react-email/text@npm:0.1.6": - version: 0.1.6 - resolution: "@react-email/text@npm:0.1.6" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - checksum: 10c0/f40ef83746670ac1672069119b23f3c553bc4b42b102b106b8ff9f6ce0136b9c06c09bfaf917b7144d9ec0f33eeb52d93b093a7d86629b26fdc64f2c7cc4042c - languageName: node - linkType: hard - -"@react-email/ui@npm:6.1.4": - version: 6.1.4 - resolution: "@react-email/ui@npm:6.1.4" - dependencies: - esbuild: "npm:0.28.0" - next: "npm:16.2.6" - checksum: 10c0/6d4873467799f32229a9e904527822b9e6e8dd97e402e25cec1c3e85fcc16b51b875cba00cb626d5d5f626b894bc199ec8ab211619572fd3bd8c1eeaae532ddb - languageName: node - linkType: hard - -"@react-grab/cli@npm:0.1.23": - version: 0.1.23 - resolution: "@react-grab/cli@npm:0.1.23" - dependencies: - "@antfu/ni": "npm:^0.23.0" - commander: "npm:^14.0.0" - ignore: "npm:^7.0.5" - jsonc-parser: "npm:^3.3.1" - ora: "npm:^8.2.0" - picocolors: "npm:^1.1.1" - prompts: "npm:^2.4.2" - smol-toml: "npm:^1.6.0" - bin: - react-grab: dist/cli.js - checksum: 10c0/6a5db530501db83e6758425579bc770c650a5e68d05b63cc124481164c40e03355e6a469a87a017342c48b49dca6343930a59ebf9a7e9559843a9ca8df41a01a - languageName: node - linkType: hard - -"@react-grab/cli@npm:0.1.29": - version: 0.1.29 - resolution: "@react-grab/cli@npm:0.1.29" - dependencies: - "@antfu/ni": "npm:^0.23.0" - commander: "npm:^14.0.0" - ignore: "npm:^7.0.5" - jsonc-parser: "npm:^3.3.1" - ora: "npm:^8.2.0" - picocolors: "npm:^1.1.1" - prompts: "npm:^2.4.2" - smol-toml: "npm:^1.6.0" - bin: - react-grab: dist/cli.js - checksum: 10c0/b67c6ea6f14f722cf066629ed01b0fe9a0dd893c0c7a9c525b8b2c39503dc6d3defa339ddcb0fec8a3ea79e92ea933a70c2fa82580d2da3e7eba382ef9710cb2 - languageName: node - linkType: hard - -"@react-grab/mcp@npm:^0.1.23": - version: 0.1.29 - resolution: "@react-grab/mcp@npm:0.1.29" - dependencies: - "@modelcontextprotocol/sdk": "npm:^1.25.0" - fkill: "npm:^9.0.0" - react-grab: "npm:0.1.29" - zod: "npm:^3.25.0" - bin: - react-grab-mcp: dist/cli.cjs - checksum: 10c0/ce852f1eac43a7b932ad494f8b76f2cd9ec654fe64e8c9ea950ee1739af9fb636c20792623322ca772fac2858b735cd17f49cf4aa59b9311b4a75843fd9657b6 - languageName: node - linkType: hard - -"@replit/codemirror-lang-csharp@npm:^6.2.0": - version: 6.2.0 - resolution: "@replit/codemirror-lang-csharp@npm:6.2.0" - peerDependencies: - "@codemirror/autocomplete": ^6.0.0 - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 - "@lezer/highlight": ^1.0.0 - "@lezer/lr": ^1.0.0 - checksum: 10c0/c379968e07939a0605376ca607dd1736733083e927fa514c64180093421c92e2e5061c94cbe31e78555fb8fd7f161cd2b581e03a68d107ad338dfa7c2bbb0c72 - languageName: node - linkType: hard - -"@replit/codemirror-lang-nix@npm:^6.0.1": - version: 6.0.1 - resolution: "@replit/codemirror-lang-nix@npm:6.0.1" - peerDependencies: - "@codemirror/autocomplete": ^6.0.0 - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 - "@lezer/highlight": ^1.0.0 - "@lezer/lr": ^1.0.0 - checksum: 10c0/54237cc42f36b457e24db07aac20c5cc97129c517119a2bdd992b7472503619f94fb2d733f0b6ce4324c018785c606d31af1bbfe83f628a3849e2f01e3a03c7a - languageName: node - linkType: hard - -"@replit/codemirror-lang-solidity@npm:^6.0.2": - version: 6.0.2 - resolution: "@replit/codemirror-lang-solidity@npm:6.0.2" - dependencies: - "@lezer/highlight": "npm:^1.2.0" - peerDependencies: - "@codemirror/language": ^6.0.0 - checksum: 10c0/8aaa01e35f454b03b8a7b9d67335fc096899e6a6f713a869d258c026c9abd8ab5c59bfdb456bedb0652362d0d5e4042730b1d2265afadfc478852893ded7c6c6 - languageName: node - linkType: hard - -"@replit/codemirror-lang-svelte@npm:^6.0.0": - version: 6.0.0 - resolution: "@replit/codemirror-lang-svelte@npm:6.0.0" - peerDependencies: - "@codemirror/autocomplete": ^6.0.0 - "@codemirror/lang-css": ^6.0.1 - "@codemirror/lang-html": ^6.2.0 - "@codemirror/lang-javascript": ^6.1.1 - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 - "@lezer/highlight": ^1.0.0 - "@lezer/javascript": ^1.2.0 - "@lezer/lr": ^1.0.0 - checksum: 10c0/07b9293736b275a47bc5061a0690990b4fb7510b7939caa4e380056ec555e5cd52ed8778e7836303df37fad35828927976c614ee995fdfbe001a73f09f74b15c - languageName: node - linkType: hard - -"@replit/codemirror-vim@npm:^6.2.1": - version: 6.2.1 - resolution: "@replit/codemirror-vim@npm:6.2.1" - peerDependencies: - "@codemirror/commands": ^6.0.0 - "@codemirror/language": ^6.1.0 - "@codemirror/search": ^6.2.0 - "@codemirror/state": ^6.0.1 - "@codemirror/view": ^6.0.3 - checksum: 10c0/007a516769bd9809c036cc2a75b1f31ec79d697d81488d638fcd7c6fc315472e8130a11361bf3006b91474e4277151374468ee02b925bd60847628f42ef53922 - languageName: node - linkType: hard - -"@rolldown/binding-android-arm64@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-android-arm64@npm:1.0.3" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-darwin-arm64@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-darwin-arm64@npm:1.0.3" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-darwin-x64@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-darwin-x64@npm:1.0.3" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-freebsd-x64@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-freebsd-x64@npm:1.0.3" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm64-gnu@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.3" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-arm64-musl@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.3" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rolldown/binding-linux-ppc64-gnu@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.3" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-s390x-gnu@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.3" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-x64-gnu@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.3" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rolldown/binding-linux-x64-musl@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.3" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rolldown/binding-openharmony-arm64@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.3" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-wasm32-wasi@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.3" - dependencies: - "@emnapi/core": "npm:1.10.0" - "@emnapi/runtime": "npm:1.10.0" - "@napi-rs/wasm-runtime": "npm:^1.1.4" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@rolldown/binding-win32-arm64-msvc@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.3" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rolldown/binding-win32-x64-msvc@npm:1.0.3": - version: 1.0.3 - resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.3" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rolldown/pluginutils@npm:^1.0.0": - version: 1.0.1 - resolution: "@rolldown/pluginutils@npm:1.0.1" - checksum: 10c0/99d9b06d90196823e4d8c841f258db7a16e5dbba5824a2962b05d907b79f1ba929d56f22dd744fd530936e568c865ee56a719dc31e57e13bc0a8eb4764a8d8dd - languageName: node - linkType: hard - -"@rollup/plugin-commonjs@npm:28.0.1": - version: 28.0.1 - resolution: "@rollup/plugin-commonjs@npm:28.0.1" - dependencies: - "@rollup/pluginutils": "npm:^5.0.1" - commondir: "npm:^1.0.1" - estree-walker: "npm:^2.0.2" - fdir: "npm:^6.2.0" - is-reference: "npm:1.2.1" - magic-string: "npm:^0.30.3" - picomatch: "npm:^4.0.2" - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/15d73306f539763a4b0d5723a0be9099b56d07118ff12b4c7f4c04b26e762076706e9f88a45f131d639ed9b7bd52e51facf93f2ca265b994172677b48ca705fe - languageName: node - linkType: hard - -"@rollup/pluginutils@npm:^5.0.1": - version: 5.1.4 - resolution: "@rollup/pluginutils@npm:5.1.4" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-walker: "npm:^2.0.2" - picomatch: "npm:^4.0.2" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/6d58fbc6f1024eb4b087bc9bf59a1d655a8056a60c0b4021d3beaeec3f0743503f52467fd89d2cf0e7eccf2831feb40a05ad541a17637ea21ba10b21c2004deb - languageName: node - linkType: hard - -"@rollup/pluginutils@npm:^5.1.3": - version: 5.3.0 - resolution: "@rollup/pluginutils@npm:5.3.0" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-walker: "npm:^2.0.2" - picomatch: "npm:^4.0.2" - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - checksum: 10c0/001834bf62d7cf5bac424d2617c113f7f7d3b2bf3c1778cbcccb72cdc957b68989f8e7747c782c2b911f1dde8257f56f8ac1e779e29e74e638e3f1e2cac2bcd0 - languageName: node - linkType: hard - -"@rollup/rollup-android-arm-eabi@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.59.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-android-arm64@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-android-arm64@npm:4.59.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-arm64@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.59.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-x64@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.59.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-arm64@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.59.0" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-x64@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.59.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-gnueabihf@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.59.0" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-musleabihf@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.59.0" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-gnu@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.59.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-musl@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.59.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-loong64-gnu@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.59.0" - conditions: os=linux & cpu=loong64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-loong64-musl@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-loong64-musl@npm:4.59.0" - conditions: os=linux & cpu=loong64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-gnu@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.59.0" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-musl@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.59.0" - conditions: os=linux & cpu=ppc64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-gnu@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.59.0" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-musl@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.59.0" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.59.0" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.59.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-musl@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.59.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-openbsd-x64@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-openbsd-x64@npm:4.59.0" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-openharmony-arm64@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-openharmony-arm64@npm:4.59.0" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.59.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-ia32-msvc@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.59.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-gnu@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-win32-x64-gnu@npm:4.59.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.59.0": - version: 4.59.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.59.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rtsao/scc@npm:^1.1.0": - version: 1.1.0 - resolution: "@rtsao/scc@npm:1.1.0" - checksum: 10c0/b5bcfb0d87f7d1c1c7c0f7693f53b07866ed9fec4c34a97a8c948fb9a7c0082e416ce4d3b60beb4f5e167cbe04cdeefbf6771320f3ede059b9ce91188c409a5b - languageName: node - linkType: hard - -"@sagold/json-pointer@npm:^5.1.1, @sagold/json-pointer@npm:^5.1.2": - version: 5.1.2 - resolution: "@sagold/json-pointer@npm:5.1.2" - checksum: 10c0/6e82162852c824ecd5f41a4252a4514565f6e1d154488bb85b9ab1b7c4a483ef64fcbb9b0776762ae4cde63a65e232f5293583721e5742650ebaeb220f795245 - languageName: node - linkType: hard - -"@sagold/json-query@npm:^6.1.3": - version: 6.2.0 - resolution: "@sagold/json-query@npm:6.2.0" - dependencies: - "@sagold/json-pointer": "npm:^5.1.2" - ebnf: "npm:^1.9.1" - checksum: 10c0/64d03526ee81cf762eba564994420027b83c91ce012776ffb1bb12dc866da21ec5752ff6074fa91810ac20723cf5310598ae7a1da672c207f6350483332f68cc - languageName: node - linkType: hard - -"@selderee/plugin-htmlparser2@npm:^0.11.0": - version: 0.11.0 - resolution: "@selderee/plugin-htmlparser2@npm:0.11.0" - dependencies: - domhandler: "npm:^5.0.3" - selderee: "npm:^0.11.0" - checksum: 10c0/e938ba9aeb31a9cf30dcb2977ef41685c598bf744bedc88c57aa9e8b7e71b51781695cf99c08aac50773fd7714eba670bd2a079e46db0788abe40c6d220084eb - languageName: node - linkType: hard - -"@sentry/babel-plugin-component-annotate@npm:5.3.0": - version: 5.3.0 - resolution: "@sentry/babel-plugin-component-annotate@npm:5.3.0" - checksum: 10c0/744ef0fdc71fb30210ddabcdd665a2b69985b5e85fd12a65c456e0cb6286f5df71e304918058d285bc7fcb794792da91541cc290dc1f738aa406a6a40472e456 - languageName: node - linkType: hard - -"@sentry/browser-utils@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/browser-utils@npm:10.71.0" - dependencies: - "@sentry/conventions": "npm:^0.16.0" - "@sentry/core": "npm:10.71.0" - checksum: 10c0/7682ab2cfc95e395d5aa18b6505cd3ac815c576af35c0a1cdf0451154144ad8aabe14af07bf4f9e7519d1398f1447ccfe5cefc35348ea510314597e51af8c35b - languageName: node - linkType: hard - -"@sentry/browser@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/browser@npm:10.71.0" - dependencies: - "@sentry/browser-utils": "npm:10.71.0" - "@sentry/conventions": "npm:^0.16.0" - "@sentry/core": "npm:10.71.0" - "@sentry/feedback": "npm:10.71.0" - "@sentry/replay": "npm:10.71.0" - "@sentry/replay-canvas": "npm:10.71.0" - checksum: 10c0/37aec1c502777867e62f5e4407a772e488e9653266d08f06878e5a6bfdce956d5f51d2b8de2ab53452d1491a9981cbef5f166cbb8eba25c7194190f60b2d08ab - languageName: node - linkType: hard - -"@sentry/bundler-plugin-core@npm:^5.3.0": - version: 5.3.0 - resolution: "@sentry/bundler-plugin-core@npm:5.3.0" - dependencies: - "@babel/core": "npm:^7.18.5" - "@sentry/babel-plugin-component-annotate": "npm:5.3.0" - "@sentry/cli": "npm:^2.58.5" - dotenv: "npm:^16.3.1" - find-up: "npm:^5.0.0" - glob: "npm:^13.0.6" - magic-string: "npm:~0.30.8" - checksum: 10c0/7eb681a6da7bb13d1217c76caef4000a1158c597c40a5f1f5bb2a8d4884cfb83df7bab960ee7eececf00f1950c9e276f361f82299c94b9c4c4b910abf931f9d5 - languageName: node - linkType: hard - -"@sentry/bundler-plugins@npm:^10.64.0": - version: 10.70.0 - resolution: "@sentry/bundler-plugins@npm:10.70.0" - dependencies: - "@babel/core": "npm:^7.18.5" - "@sentry/cli": "npm:^2.58.6" - "@sentry/core": "npm:10.70.0" - dotenv: "npm:^17.4.2" - find-up: "npm:^5.0.0" - glob: "npm:^13.0.6" - magic-string: "npm:~0.30.8" - peerDependencies: - rollup: ">=3.2.0" - webpack: ">=5.0.0" - peerDependenciesMeta: - rollup: - optional: true - webpack: - optional: true - checksum: 10c0/e03bd5d5309e18a394b6f67a23e846395e4aaee6b66353c6b90cc41efd59b720180830e932d7de97e05bb8e349460644c2befe303979a98d0e88be6e9951719d - languageName: node - linkType: hard - -"@sentry/cli-darwin@npm:2.42.4": - version: 2.42.4 - resolution: "@sentry/cli-darwin@npm:2.42.4" - conditions: os=darwin - languageName: node - linkType: hard - -"@sentry/cli-darwin@npm:2.58.5": - version: 2.58.5 - resolution: "@sentry/cli-darwin@npm:2.58.5" - conditions: os=darwin - languageName: node - linkType: hard - -"@sentry/cli-darwin@npm:2.58.6": - version: 2.58.6 - resolution: "@sentry/cli-darwin@npm:2.58.6" - conditions: os=darwin - languageName: node - linkType: hard - -"@sentry/cli-linux-arm64@npm:2.42.4": - version: 2.42.4 - resolution: "@sentry/cli-linux-arm64@npm:2.42.4" - conditions: (os=linux | os=freebsd) & cpu=arm64 - languageName: node - linkType: hard - -"@sentry/cli-linux-arm64@npm:2.58.5": - version: 2.58.5 - resolution: "@sentry/cli-linux-arm64@npm:2.58.5" - conditions: (os=linux | os=freebsd | os=android) & cpu=arm64 - languageName: node - linkType: hard - -"@sentry/cli-linux-arm64@npm:2.58.6": - version: 2.58.6 - resolution: "@sentry/cli-linux-arm64@npm:2.58.6" - conditions: (os=linux | os=freebsd | os=android) & cpu=arm64 - languageName: node - linkType: hard - -"@sentry/cli-linux-arm@npm:2.42.4": - version: 2.42.4 - resolution: "@sentry/cli-linux-arm@npm:2.42.4" - conditions: (os=linux | os=freebsd) & cpu=arm - languageName: node - linkType: hard - -"@sentry/cli-linux-arm@npm:2.58.5": - version: 2.58.5 - resolution: "@sentry/cli-linux-arm@npm:2.58.5" - conditions: (os=linux | os=freebsd | os=android) & cpu=arm - languageName: node - linkType: hard - -"@sentry/cli-linux-arm@npm:2.58.6": - version: 2.58.6 - resolution: "@sentry/cli-linux-arm@npm:2.58.6" - conditions: (os=linux | os=freebsd | os=android) & cpu=arm - languageName: node - linkType: hard - -"@sentry/cli-linux-i686@npm:2.42.4": - version: 2.42.4 - resolution: "@sentry/cli-linux-i686@npm:2.42.4" - conditions: (os=linux | os=freebsd) & (cpu=x86 | cpu=ia32) - languageName: node - linkType: hard - -"@sentry/cli-linux-i686@npm:2.58.5": - version: 2.58.5 - resolution: "@sentry/cli-linux-i686@npm:2.58.5" - conditions: (os=linux | os=freebsd | os=android) & (cpu=x86 | cpu=ia32) - languageName: node - linkType: hard - -"@sentry/cli-linux-i686@npm:2.58.6": - version: 2.58.6 - resolution: "@sentry/cli-linux-i686@npm:2.58.6" - conditions: (os=linux | os=freebsd | os=android) & (cpu=x86 | cpu=ia32) - languageName: node - linkType: hard - -"@sentry/cli-linux-x64@npm:2.42.4": - version: 2.42.4 - resolution: "@sentry/cli-linux-x64@npm:2.42.4" - conditions: (os=linux | os=freebsd) & cpu=x64 - languageName: node - linkType: hard - -"@sentry/cli-linux-x64@npm:2.58.5": - version: 2.58.5 - resolution: "@sentry/cli-linux-x64@npm:2.58.5" - conditions: (os=linux | os=freebsd | os=android) & cpu=x64 - languageName: node - linkType: hard - -"@sentry/cli-linux-x64@npm:2.58.6": - version: 2.58.6 - resolution: "@sentry/cli-linux-x64@npm:2.58.6" - conditions: (os=linux | os=freebsd | os=android) & cpu=x64 - languageName: node - linkType: hard - -"@sentry/cli-win32-arm64@npm:2.58.5": - version: 2.58.5 - resolution: "@sentry/cli-win32-arm64@npm:2.58.5" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@sentry/cli-win32-arm64@npm:2.58.6": - version: 2.58.6 - resolution: "@sentry/cli-win32-arm64@npm:2.58.6" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@sentry/cli-win32-i686@npm:2.42.4": - version: 2.42.4 - resolution: "@sentry/cli-win32-i686@npm:2.42.4" - conditions: os=win32 & (cpu=x86 | cpu=ia32) - languageName: node - linkType: hard - -"@sentry/cli-win32-i686@npm:2.58.5": - version: 2.58.5 - resolution: "@sentry/cli-win32-i686@npm:2.58.5" - conditions: os=win32 & (cpu=x86 | cpu=ia32) - languageName: node - linkType: hard - -"@sentry/cli-win32-i686@npm:2.58.6": - version: 2.58.6 - resolution: "@sentry/cli-win32-i686@npm:2.58.6" - conditions: os=win32 & (cpu=x86 | cpu=ia32) - languageName: node - linkType: hard - -"@sentry/cli-win32-x64@npm:2.42.4": - version: 2.42.4 - resolution: "@sentry/cli-win32-x64@npm:2.42.4" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@sentry/cli-win32-x64@npm:2.58.5": - version: 2.58.5 - resolution: "@sentry/cli-win32-x64@npm:2.58.5" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@sentry/cli-win32-x64@npm:2.58.6": - version: 2.58.6 - resolution: "@sentry/cli-win32-x64@npm:2.58.6" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@sentry/cli@npm:^2.42.2": - version: 2.42.4 - resolution: "@sentry/cli@npm:2.42.4" - dependencies: - "@sentry/cli-darwin": "npm:2.42.4" - "@sentry/cli-linux-arm": "npm:2.42.4" - "@sentry/cli-linux-arm64": "npm:2.42.4" - "@sentry/cli-linux-i686": "npm:2.42.4" - "@sentry/cli-linux-x64": "npm:2.42.4" - "@sentry/cli-win32-i686": "npm:2.42.4" - "@sentry/cli-win32-x64": "npm:2.42.4" - https-proxy-agent: "npm:^5.0.0" - node-fetch: "npm:^2.6.7" - progress: "npm:^2.0.3" - proxy-from-env: "npm:^1.1.0" - which: "npm:^2.0.2" - dependenciesMeta: - "@sentry/cli-darwin": - optional: true - "@sentry/cli-linux-arm": - optional: true - "@sentry/cli-linux-arm64": - optional: true - "@sentry/cli-linux-i686": - optional: true - "@sentry/cli-linux-x64": - optional: true - "@sentry/cli-win32-i686": - optional: true - "@sentry/cli-win32-x64": - optional: true - bin: - sentry-cli: bin/sentry-cli - checksum: 10c0/e3900743803470874228a7d9b02f54e7973b01c89d433cd03d7d6fe71ae44df3f4420743fcae821613a572978ab1ff6fa397ab447a320bbe021bee333f04f397 - languageName: node - linkType: hard - -"@sentry/cli@npm:^2.58.5": - version: 2.58.5 - resolution: "@sentry/cli@npm:2.58.5" - dependencies: - "@sentry/cli-darwin": "npm:2.58.5" - "@sentry/cli-linux-arm": "npm:2.58.5" - "@sentry/cli-linux-arm64": "npm:2.58.5" - "@sentry/cli-linux-i686": "npm:2.58.5" - "@sentry/cli-linux-x64": "npm:2.58.5" - "@sentry/cli-win32-arm64": "npm:2.58.5" - "@sentry/cli-win32-i686": "npm:2.58.5" - "@sentry/cli-win32-x64": "npm:2.58.5" - https-proxy-agent: "npm:^5.0.0" - node-fetch: "npm:^2.6.7" - progress: "npm:^2.0.3" - proxy-from-env: "npm:^1.1.0" - which: "npm:^2.0.2" - dependenciesMeta: - "@sentry/cli-darwin": - optional: true - "@sentry/cli-linux-arm": - optional: true - "@sentry/cli-linux-arm64": - optional: true - "@sentry/cli-linux-i686": - optional: true - "@sentry/cli-linux-x64": - optional: true - "@sentry/cli-win32-arm64": - optional: true - "@sentry/cli-win32-i686": - optional: true - "@sentry/cli-win32-x64": - optional: true - bin: - sentry-cli: bin/sentry-cli - checksum: 10c0/569a3750f6a21e235f8dd3506e38cec7282e82f1e313fc677eb62f2ab3a6f44bdad4e43cc8b73200ca24ea94946811cbd54c0f6adbc4b6ed86b15707bd13941e - languageName: node - linkType: hard - -"@sentry/cli@npm:^2.58.6": - version: 2.58.6 - resolution: "@sentry/cli@npm:2.58.6" - dependencies: - "@sentry/cli-darwin": "npm:2.58.6" - "@sentry/cli-linux-arm": "npm:2.58.6" - "@sentry/cli-linux-arm64": "npm:2.58.6" - "@sentry/cli-linux-i686": "npm:2.58.6" - "@sentry/cli-linux-x64": "npm:2.58.6" - "@sentry/cli-win32-arm64": "npm:2.58.6" - "@sentry/cli-win32-i686": "npm:2.58.6" - "@sentry/cli-win32-x64": "npm:2.58.6" - https-proxy-agent: "npm:^5.0.0" - node-fetch: "npm:^2.6.7" - progress: "npm:^2.0.3" - proxy-from-env: "npm:^1.1.0" - which: "npm:^2.0.2" - dependenciesMeta: - "@sentry/cli-darwin": - optional: true - "@sentry/cli-linux-arm": - optional: true - "@sentry/cli-linux-arm64": - optional: true - "@sentry/cli-linux-i686": - optional: true - "@sentry/cli-linux-x64": - optional: true - "@sentry/cli-win32-arm64": - optional: true - "@sentry/cli-win32-i686": - optional: true - "@sentry/cli-win32-x64": - optional: true - bin: - sentry-cli: bin/sentry-cli - checksum: 10c0/3037c8c03d0b56114d4bdccc409a88b2e48df3544b2ddd800556a70d45b72e889e1dc5fc1a2997d962f9d047e360d30e5090d8f454078c9d7be1545ad32e7c0c - languageName: node - linkType: hard - -"@sentry/conventions@npm:^0.16.0": - version: 0.16.0 - resolution: "@sentry/conventions@npm:0.16.0" - checksum: 10c0/415aaa94cade2b8e0dd00ad9aa06d998d7fe95658a8f43b6e4ef382e3b4c115c8f199ca0fe9b74a98500e8270dc68d5333fd943f7dad6ed78f60d9372231fbe8 - languageName: node - linkType: hard - -"@sentry/core@npm:10.70.0": - version: 10.70.0 - resolution: "@sentry/core@npm:10.70.0" - dependencies: - "@sentry/conventions": "npm:^0.16.0" - checksum: 10c0/4625428ed269c00375d2436968d7a24e5235a9c83c2968dc237543bba606d42326b5922e2d8d08a76a15e5f8734b940c607b1d911da8906987e1259763d36e21 - languageName: node - linkType: hard - -"@sentry/core@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/core@npm:10.71.0" - dependencies: - "@sentry/conventions": "npm:^0.16.0" - checksum: 10c0/5dd0f077e6ede0838cfefc7d37459cbf9902ca197c73e8030a9d4b9147d4d4e2743ba3dca4969760be007603ca52b26fc36c3f31db24862726165aa7fce9db03 - languageName: node - linkType: hard - -"@sentry/feedback@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/feedback@npm:10.71.0" - dependencies: - "@sentry/core": "npm:10.71.0" - checksum: 10c0/7156bd43bebb0f1762d603c03052c6e42927a5026ba702c78c294a626adf9671fe536437f6c5309faa6b1a07eed08948a94661612021a34b13e461017b5d26aa - languageName: node - linkType: hard - -"@sentry/nextjs@npm:^10.71.0": - version: 10.71.0 - resolution: "@sentry/nextjs@npm:10.71.0" - dependencies: - "@opentelemetry/api": "npm:^1.9.1" - "@rollup/plugin-commonjs": "npm:28.0.1" - "@sentry/browser-utils": "npm:10.71.0" - "@sentry/bundler-plugin-core": "npm:^5.3.0" - "@sentry/conventions": "npm:^0.16.0" - "@sentry/core": "npm:10.71.0" - "@sentry/node": "npm:10.71.0" - "@sentry/opentelemetry": "npm:10.71.0" - "@sentry/react": "npm:10.71.0" - "@sentry/server-utils": "npm:10.71.0" - "@sentry/vercel-edge": "npm:10.71.0" - "@sentry/webpack-plugin": "npm:^5.3.0" - rollup: "npm:^4.60.3" - stacktrace-parser: "npm:^0.1.11" - peerDependencies: - next: ^13.2.0 || ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0 - checksum: 10c0/ad2b3a8a8725bc257925781d6a491448981198f4459be5c5f96454778ca678149687bb91ff62235b606d5b059d848193551d189def4c16a3d24025d9ccad7d0b - languageName: node - linkType: hard - -"@sentry/node-core@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/node-core@npm:10.71.0" - dependencies: - "@sentry/conventions": "npm:^0.16.0" - "@sentry/core": "npm:10.71.0" - "@sentry/opentelemetry": "npm:10.71.0" - import-in-the-middle: "npm:^3.0.0" - peerDependencies: - "@opentelemetry/api": ^1.9.0 - "@opentelemetry/core": ^1.30.1 || ^2.1.0 - "@opentelemetry/exporter-trace-otlp-http": ">=0.57.0 <1" - "@opentelemetry/instrumentation": ">=0.57.1 <1" - "@opentelemetry/sdk-trace-base": ^1.30.1 || ^2.1.0 - peerDependenciesMeta: - "@opentelemetry/api": - optional: true - "@opentelemetry/core": - optional: true - "@opentelemetry/exporter-trace-otlp-http": - optional: true - "@opentelemetry/instrumentation": - optional: true - "@opentelemetry/sdk-trace-base": - optional: true - checksum: 10c0/1e72532bc8d93ef88ff1cba24b24bb0f729c66ec520f9658c6c327b8ba4879f672ac4701352cb41db9b76a125ee086a24c29b2d06c18f4913c1a404d03ef2211 - languageName: node - linkType: hard - -"@sentry/node-cpu-profiler@npm:^2.4.3": - version: 2.4.3 - resolution: "@sentry/node-cpu-profiler@npm:2.4.3" - dependencies: - detect-libc: "npm:^2.0.3" - node-abi: "npm:^3.73.0" - node-gyp: "npm:latest" - checksum: 10c0/8ee115d4b9b9a5189c6575f39d9869a65de735deec601271ba06162f9d655d3905f2922c500470ab3651a541d379b2e85984b8b379554eee91c7dd170f6865db - languageName: node - linkType: hard - -"@sentry/node@npm:10.71.0, @sentry/node@npm:^10.71.0": - version: 10.71.0 - resolution: "@sentry/node@npm:10.71.0" - dependencies: - "@opentelemetry/api": "npm:^1.9.1" - "@opentelemetry/instrumentation": "npm:^0.220.0" - "@opentelemetry/sdk-trace-base": "npm:^2.9.0" - "@sentry/conventions": "npm:^0.16.0" - "@sentry/core": "npm:10.71.0" - "@sentry/node-core": "npm:10.71.0" - "@sentry/opentelemetry": "npm:10.71.0" - "@sentry/server-utils": "npm:10.71.0" - import-in-the-middle: "npm:^3.0.0" - checksum: 10c0/f9cac9864159ce009880f0195849534a5c5c82a35fc5f8bb1d3d0d9589b14a3ce56ba86a9ef09d28505a6da88ce19f67ae54880e9774b6a3743a678ca817c04d - languageName: node - linkType: hard - -"@sentry/opentelemetry@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/opentelemetry@npm:10.71.0" - dependencies: - "@sentry/conventions": "npm:^0.16.0" - "@sentry/core": "npm:10.71.0" - peerDependencies: - "@opentelemetry/api": ^1.9.0 - "@opentelemetry/core": ^1.30.1 || ^2.1.0 - "@opentelemetry/sdk-trace-base": ^1.30.1 || ^2.1.0 - checksum: 10c0/a801a19397c3e438ed8a7345957bf7d3b7a575980e511c8be52a3d283b4b8ea1d3bf059ccedee3b3ec48c6c0b70350166c44e862f24b4de016a0a506eb9b46a4 - languageName: node - linkType: hard - -"@sentry/profiling-node@npm:^10.71.0": - version: 10.71.0 - resolution: "@sentry/profiling-node@npm:10.71.0" - dependencies: - "@sentry/core": "npm:10.71.0" - "@sentry/node": "npm:10.71.0" - "@sentry/node-cpu-profiler": "npm:^2.4.3" - bin: - sentry-prune-profiler-binaries: scripts/prune-profiler-binaries.js - checksum: 10c0/bc2c1cda6d94b1a0dc21fa800a0d365ce01f3e8d5aa745beeabbe26ef50d9d5e83db18fc4fe5da112c367b66dafd76bec425444db9e168c698e1e9a1d63818f3 - languageName: node - linkType: hard - -"@sentry/react@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/react@npm:10.71.0" - dependencies: - "@sentry/browser": "npm:10.71.0" - "@sentry/conventions": "npm:^0.16.0" - "@sentry/core": "npm:10.71.0" - peerDependencies: - react: ^16.14.0 || 17.x || 18.x || 19.x - checksum: 10c0/4b9c48c8b73cb6be04574f1b7c96fe45a58912d42a32d31eecd22a43c366fc0e7edb5cda2281f0c8c55f3c92298d0f4030476b286a598c844cdb0842e68028a2 - languageName: node - linkType: hard - -"@sentry/replay-canvas@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/replay-canvas@npm:10.71.0" - dependencies: - "@sentry/core": "npm:10.71.0" - "@sentry/replay": "npm:10.71.0" - checksum: 10c0/454634b07666da2c133f79058aa8a74127ea7d748b74b79474deed54ed366e6c5a289b6282461ae706736b75d0b0deeb0bf676cbd06ce2bf405f51ebe0a5ce7a - languageName: node - linkType: hard - -"@sentry/replay@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/replay@npm:10.71.0" - dependencies: - "@sentry/browser-utils": "npm:10.71.0" - "@sentry/core": "npm:10.71.0" - checksum: 10c0/41223133c69c6666831ac7786814ab785390c4d6cf2209b808fe1914d894837b08f765b5746076dcf9fc52442c9ba26bb9d6ebe16171fa0be03ab1ce963489be - languageName: node - linkType: hard - -"@sentry/server-utils@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/server-utils@npm:10.71.0" - dependencies: - "@apm-js-collab/code-transformer-bundler-plugins": "npm:^0.7.3" - "@apm-js-collab/tracing-hooks": "npm:^0.13.0" - "@sentry/conventions": "npm:^0.16.0" - "@sentry/core": "npm:10.71.0" - meriyah: "npm:^6.1.4" - checksum: 10c0/4993924f918e71c6f1989aea931e86ceca8f06ff81d3b580ec3222db683ab71ec8917659a95f29a3cf64257abef7c9b4b99f2b676847a4a7dfe3d37dc32b3be6 - languageName: node - linkType: hard - -"@sentry/vercel-edge@npm:10.71.0": - version: 10.71.0 - resolution: "@sentry/vercel-edge@npm:10.71.0" - dependencies: - "@opentelemetry/api": "npm:^1.9.1" - "@sentry/core": "npm:10.71.0" - checksum: 10c0/acd204d0284ba7ee57d67575609df30d15a88d74a7f3473464a306c7cfe83f2eb3d84a8338baad2417b87dd396697937f4533332378ed56fe40af30f41650536 - languageName: node - linkType: hard - -"@sentry/webpack-plugin@npm:^5.3.0": - version: 5.4.0 - resolution: "@sentry/webpack-plugin@npm:5.4.0" - dependencies: - "@sentry/bundler-plugins": "npm:^10.64.0" - peerDependencies: - webpack: ">=5.0.0" - checksum: 10c0/7adeca900cd5cf515f52535f6a42f92141c7681da0271fe99bdc99207999b799403f8cf3535b105890ea4947bdc5cb53f718ed57e1662ffa0f7d26ff797b7d34 - languageName: node - linkType: hard - -"@shikijs/core@npm:1.29.2": - version: 1.29.2 - resolution: "@shikijs/core@npm:1.29.2" - dependencies: - "@shikijs/engine-javascript": "npm:1.29.2" - "@shikijs/engine-oniguruma": "npm:1.29.2" - "@shikijs/types": "npm:1.29.2" - "@shikijs/vscode-textmate": "npm:^10.0.1" - "@types/hast": "npm:^3.0.4" - hast-util-to-html: "npm:^9.0.4" - checksum: 10c0/b1bb0567babcee64608224d652ceb4076d387b409fb8ee767f7684c68f03cfaab0e17f42d0a3372fc7be1fe165af9a3a349efc188f6e7c720d4df1108c1ab78c - languageName: node - linkType: hard - -"@shikijs/engine-javascript@npm:1.29.2": - version: 1.29.2 - resolution: "@shikijs/engine-javascript@npm:1.29.2" - dependencies: - "@shikijs/types": "npm:1.29.2" - "@shikijs/vscode-textmate": "npm:^10.0.1" - oniguruma-to-es: "npm:^2.2.0" - checksum: 10c0/b61f9e9079493c19419ff64af6454c4360a32785d47f49b41e87752e66ddbf7466dd9cce67f4d5d4a8447e31d96b4f0a39330e9f26e8bd2bc2f076644e78dff7 - languageName: node - linkType: hard - -"@shikijs/engine-oniguruma@npm:1.29.2": - version: 1.29.2 - resolution: "@shikijs/engine-oniguruma@npm:1.29.2" - dependencies: - "@shikijs/types": "npm:1.29.2" - "@shikijs/vscode-textmate": "npm:^10.0.1" - checksum: 10c0/87d77e05af7fe862df40899a7034cbbd48d3635e27706873025e5035be578584d012f850208e97ca484d5e876bf802d4e23d0394d25026adb678eeb1d1f340ff - languageName: node - linkType: hard - -"@shikijs/langs@npm:1.29.2": - version: 1.29.2 - resolution: "@shikijs/langs@npm:1.29.2" - dependencies: - "@shikijs/types": "npm:1.29.2" - checksum: 10c0/137af52ec19ab10bb167ec67e2dc6888d77dedddb3be37708569cb8e8d54c057d09df335261276012d11ac38366ba57b9eae121cc0b7045859638c25648b0563 - languageName: node - linkType: hard - -"@shikijs/markdown-it@npm:^1.22.2": - version: 1.29.2 - resolution: "@shikijs/markdown-it@npm:1.29.2" - dependencies: - markdown-it: "npm:^14.1.0" - shiki: "npm:1.29.2" - checksum: 10c0/76bb213e87e11d6f8f0b19b135d8a395e88ae0ab9a021b5c815669edcd2869c0a2b354a7d5840a25ce26a0f5f7437d9af5ebbd38d92a3186d189a8fae0389897 - languageName: node - linkType: hard - -"@shikijs/themes@npm:1.29.2": - version: 1.29.2 - resolution: "@shikijs/themes@npm:1.29.2" - dependencies: - "@shikijs/types": "npm:1.29.2" - checksum: 10c0/1f7d3fc8615890d83b50c73c13e5182438dee579dd9a121d605bbdcc2dc877cafc9f7e23a3e1342345cd0b9161e3af6425b0fbfac949843f22b2a60527a8fb69 - languageName: node - linkType: hard - -"@shikijs/types@npm:1.29.2": - version: 1.29.2 - resolution: "@shikijs/types@npm:1.29.2" - dependencies: - "@shikijs/vscode-textmate": "npm:^10.0.1" - "@types/hast": "npm:^3.0.4" - checksum: 10c0/37b4ac315effc03e7185aca1da0c2631ac55bdf613897476bd1d879105c41f86ccce6ebd0b78779513d88cc2ee371039f7efd95d604f77f21f180791978822b3 - languageName: node - linkType: hard - -"@shikijs/vscode-textmate@npm:^10.0.1": - version: 10.0.2 - resolution: "@shikijs/vscode-textmate@npm:10.0.2" - checksum: 10c0/36b682d691088ec244de292dc8f91b808f95c89466af421cf84cbab92230f03c8348649c14b3251991b10ce632b0c715e416e992dd5f28ff3221dc2693fd9462 - languageName: node - linkType: hard - -"@shopify/lang-jsonc@npm:^1.0.0": - version: 1.0.1 - resolution: "@shopify/lang-jsonc@npm:1.0.1" - dependencies: - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.3.7" - checksum: 10c0/dd47e29d1fc74ec7b3c6bab9d71fe28ade7d0480d092a9b3fbb2267376c3527a8f4ae4e35092c9d19ead18538315061fa7c71792ef7a24986a78a2f9e185bdbb - languageName: node - linkType: hard - -"@simple-git/args-pathspec@npm:1.0.4, @simple-git/args-pathspec@npm:^1.0.4": - version: 1.0.4 - resolution: "@simple-git/args-pathspec@npm:1.0.4" - checksum: 10c0/f62c09daf6a17734b2a13a186421bf0fdbdbd48782d1ca6d751027b2a9f515f11505da672489609f95335a0541d2fcf6d6fd6c2754919245109e92335e437b1b - languageName: node - linkType: hard - -"@simple-git/argv-parser@npm:2.0.1, @simple-git/argv-parser@npm:^2.0.1": - version: 2.0.1 - resolution: "@simple-git/argv-parser@npm:2.0.1" - dependencies: - "@simple-git/args-pathspec": "npm:^1.0.4" - checksum: 10c0/7d2cd9852139ca3b524dcd91f6a887fa505cfb68c8813d7b849005566147365bb1e34f5450411c494fbd714a80c123058e65dc2ffc0b41d059e30bdc98e12223 - languageName: node - linkType: hard - -"@smithy/config-resolver@npm:^4.4.17": - version: 4.4.17 - resolution: "@smithy/config-resolver@npm:4.4.17" - dependencies: - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-config-provider": "npm:^4.2.2" - "@smithy/util-endpoints": "npm:^3.4.2" - "@smithy/util-middleware": "npm:^4.2.14" - tslib: "npm:^2.6.2" - checksum: 10c0/44e653e2ed31bf765f0b30ca404dc3e02f30ad800971f812a6363b71da8d37de5d7d8901d9db4d86d2493f25037904f35c01bbb1a83a2a72e7e7b201ce5c411a - languageName: node - linkType: hard - -"@smithy/core@npm:^3.23.17": - version: 3.23.17 - resolution: "@smithy/core@npm:3.23.17" - dependencies: - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/types": "npm:^4.14.1" - "@smithy/url-parser": "npm:^4.2.14" - "@smithy/util-base64": "npm:^4.3.2" - "@smithy/util-body-length-browser": "npm:^4.2.2" - "@smithy/util-middleware": "npm:^4.2.14" - "@smithy/util-stream": "npm:^4.5.25" - "@smithy/util-utf8": "npm:^4.2.2" - "@smithy/uuid": "npm:^1.1.2" - tslib: "npm:^2.6.2" - checksum: 10c0/223631835e93c314a8fa394db724673c0940d3ba9e5ffbd73bd7c09854d7e003d19de950b44ce408e099c72ed3c22eb5e41370abea4ac656f7037e6da07be3c1 - languageName: node - linkType: hard - -"@smithy/credential-provider-imds@npm:^4.2.14": - version: 4.2.14 - resolution: "@smithy/credential-provider-imds@npm:4.2.14" - dependencies: - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/types": "npm:^4.14.1" - "@smithy/url-parser": "npm:^4.2.14" - tslib: "npm:^2.6.2" - checksum: 10c0/62ced0249cb1ba64c6dd98a90b35b93dd9e3f1469d020752c46b5a83ecef38280f4b29c2f63e3b0c414a2fa2ec7631a19370415c80ed4d6ea18a9be040803126 - languageName: node - linkType: hard - -"@smithy/eventstream-codec@npm:^4.0.1": - version: 4.0.4 - resolution: "@smithy/eventstream-codec@npm:4.0.4" - dependencies: - "@aws-crypto/crc32": "npm:5.2.0" - "@smithy/types": "npm:^4.3.1" - "@smithy/util-hex-encoding": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/89b76826d4d3bf97317e3539ece105b9a03552144ad816a687b0b2cbca60e2b3513062c04b6cfacaffb270d616ffc8ac8bf549afc4aa676a6d7465df5a3215ba - languageName: node - linkType: hard - -"@smithy/fetch-http-handler@npm:^5.3.17": - version: 5.3.17 - resolution: "@smithy/fetch-http-handler@npm:5.3.17" - dependencies: - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/querystring-builder": "npm:^4.2.14" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-base64": "npm:^4.3.2" - tslib: "npm:^2.6.2" - checksum: 10c0/8adac6bf9d5735f8ddbe9e59dd268f985881b64b03cba7e83401471b3094139189476324fe640bbd19d75f5cd8e098d9a2a7f4925bc9fadecd1ccbe937773c12 - languageName: node - linkType: hard - -"@smithy/hash-node@npm:^4.2.14": - version: 4.2.14 - resolution: "@smithy/hash-node@npm:4.2.14" - dependencies: - "@smithy/types": "npm:^4.14.1" - "@smithy/util-buffer-from": "npm:^4.2.2" - "@smithy/util-utf8": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/c2cfc5dac4f2b996c4c5c503d3c26e52fcd0a647e71541182b24a48925801659828c9d378dad6857444b9d997c1655bdb23f6db5994ad8b7c814b2d0a09655b7 - languageName: node - linkType: hard - -"@smithy/invalid-dependency@npm:^4.2.14": - version: 4.2.14 - resolution: "@smithy/invalid-dependency@npm:4.2.14" - dependencies: - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/deba2c21232050de87e7893b86a27a8f080ace391a3cccf22d7aee183bc3b392247f3bb1a0e4f0b6ea6f928c18ba035fd2ed3af257178ba84f3564d47c635d16 - languageName: node - linkType: hard - -"@smithy/is-array-buffer@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/is-array-buffer@npm:2.2.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/2f2523cd8cc4538131e408eb31664983fecb0c8724956788b015aaf3ab85a0c976b50f4f09b176f1ed7bbe79f3edf80743be7a80a11f22cd9ce1285d77161aaf - languageName: node - linkType: hard - -"@smithy/is-array-buffer@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/is-array-buffer@npm:4.0.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/ae393fbd5944d710443cd5dd225d1178ef7fb5d6259c14f3e1316ec75e401bda6cf86f7eb98bfd38e5ed76e664b810426a5756b916702cbd418f0933e15e7a3b - languageName: node - linkType: hard - -"@smithy/is-array-buffer@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/is-array-buffer@npm:4.2.2" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/ab5bf2cad0f3bc6c1d882e15de436b80fa1504739ab9facc3d7006003870855480a6b15367e516fd803b3859c298b1fcc9212c854374b7e756cda01180bab0a6 - languageName: node - linkType: hard - -"@smithy/middleware-content-length@npm:^4.2.14": - version: 4.2.14 - resolution: "@smithy/middleware-content-length@npm:4.2.14" - dependencies: - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/c26cc36504ad9a720e42f009bcc185b16e35ff64644bbec710a998c071d3366face29bb6fa68744adc7312356803666922459e416f3a7ae5c804841957832c3d - languageName: node - linkType: hard - -"@smithy/middleware-endpoint@npm:^4.4.32": - version: 4.4.32 - resolution: "@smithy/middleware-endpoint@npm:4.4.32" - dependencies: - "@smithy/core": "npm:^3.23.17" - "@smithy/middleware-serde": "npm:^4.2.20" - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/shared-ini-file-loader": "npm:^4.4.9" - "@smithy/types": "npm:^4.14.1" - "@smithy/url-parser": "npm:^4.2.14" - "@smithy/util-middleware": "npm:^4.2.14" - tslib: "npm:^2.6.2" - checksum: 10c0/a77ba3f56956b872a533754c71f75d2a9d6df9af8d58a059d07caedd1af3ffdcae5b667a0b96b6d067555a777510f6fc5847f699a2dd705e9b5837d21510daa4 - languageName: node - linkType: hard - -"@smithy/middleware-retry@npm:^4.5.5": - version: 4.5.5 - resolution: "@smithy/middleware-retry@npm:4.5.5" - dependencies: - "@smithy/core": "npm:^3.23.17" - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/service-error-classification": "npm:^4.3.0" - "@smithy/smithy-client": "npm:^4.12.13" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-middleware": "npm:^4.2.14" - "@smithy/util-retry": "npm:^4.3.4" - "@smithy/uuid": "npm:^1.1.2" - tslib: "npm:^2.6.2" - checksum: 10c0/90bc79a5103e81a1f628c5c426cb4df3577cead58cc50776285ac130f9b128f51963f6ca43d9e68dd253d106ed126f069515396a8c08b29aade039dc67b7cfd0 - languageName: node - linkType: hard - -"@smithy/middleware-serde@npm:^4.2.20": - version: 4.2.20 - resolution: "@smithy/middleware-serde@npm:4.2.20" - dependencies: - "@smithy/core": "npm:^3.23.17" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/2db736d58c0d628a33febad86259eedd6d025135fc403458e4469a077a6adbb909587408acb62c982fa1b2d8b1376507da90661a4315a544c7d73a62179a3453 - languageName: node - linkType: hard - -"@smithy/middleware-stack@npm:^4.2.14": - version: 4.2.14 - resolution: "@smithy/middleware-stack@npm:4.2.14" - dependencies: - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/5a0323c50b399c4a2ff0d91b219c7c285b006f905f66b291b6013a4e94f14c036ff5a74c565989afc3c6f0fafc6c266bca6746b79e242403713b7d18dc266a92 - languageName: node - linkType: hard - -"@smithy/node-config-provider@npm:^4.3.14": - version: 4.3.14 - resolution: "@smithy/node-config-provider@npm:4.3.14" - dependencies: - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/shared-ini-file-loader": "npm:^4.4.9" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/59033a2fde5327d9ae1a0304a0eb2c3145141024cb4dcb58c5cd3c48371cd3a55d7228a3d2f33a5785b2d6a0a35475cbd0d1b2435d964c824683ac89a664e926 - languageName: node - linkType: hard - -"@smithy/node-http-handler@npm:^4.6.1": - version: 4.6.1 - resolution: "@smithy/node-http-handler@npm:4.6.1" - dependencies: - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/querystring-builder": "npm:^4.2.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/6c07fbfd8326cd5369283bd19c1af923ee49b7dcf42fdd199bb7132e4c25eaa6db8573e3b669fb60be0d8f9757a3f2482cd0cf6d6631494255f08239d3036ed2 - languageName: node - linkType: hard - -"@smithy/property-provider@npm:^4.2.14": - version: 4.2.14 - resolution: "@smithy/property-provider@npm:4.2.14" - dependencies: - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/8d3da90e228b53885d1e82f28b33c095b72f3b1cb5dcd7f7edcd96292d90848e9cdfed85cef00040e198343e850acef61540e4de24bd10b07fbc8e1e8f4a1fdd - languageName: node - linkType: hard - -"@smithy/protocol-http@npm:^5.3.14": - version: 5.3.14 - resolution: "@smithy/protocol-http@npm:5.3.14" - dependencies: - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/ed7306e7e4b919fdacf60d1928f003ac4c4679cffd7472b078547fbed7b6cb9ba524f105b1871c2cd79222871169d3183257fd0a1a81c172fa7cf0a9abaf35f9 - languageName: node - linkType: hard - -"@smithy/querystring-builder@npm:^4.2.14": - version: 4.2.14 - resolution: "@smithy/querystring-builder@npm:4.2.14" - dependencies: - "@smithy/types": "npm:^4.14.1" - "@smithy/util-uri-escape": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/ae2ceec55b4f32b73fe2eca710563b9dbe65c81157ed58c12c282bad6445998f1fe99d723591f9bac4ae6106d84213b57e960176865fb2dec78fc3bdf024b14b - languageName: node - linkType: hard - -"@smithy/querystring-parser@npm:^4.2.14": - version: 4.2.14 - resolution: "@smithy/querystring-parser@npm:4.2.14" - dependencies: - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/245923618197bbae5eb38b72807368f397fafccee8e98cd98ee7d8961a34acb57b5176fa5fe8083b796229043f135ea775060f17e14aa12080a5d7cdfbf56333 - languageName: node - linkType: hard - -"@smithy/service-error-classification@npm:^4.3.0": - version: 4.3.0 - resolution: "@smithy/service-error-classification@npm:4.3.0" - dependencies: - "@smithy/types": "npm:^4.14.1" - checksum: 10c0/713110456940c21dcf63beafe13b3e67bc14311472cc87e00e58dff325e524866dd8b590a2d5ee1b6f5954a9a8c50f639402d56586c81ddfc66a0c6e5ee5c93a - languageName: node - linkType: hard - -"@smithy/shared-ini-file-loader@npm:^4.4.9": - version: 4.4.9 - resolution: "@smithy/shared-ini-file-loader@npm:4.4.9" - dependencies: - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/9bf96ea80cedff027373c5547ffa53b35d272292b7d142a86211726343061953a34610f3dbd02153bb285c7c0f3802c5a25b4e27870e8068d777abdcaa9c1748 - languageName: node - linkType: hard - -"@smithy/signature-v4@npm:^5.3.14": - version: 5.3.14 - resolution: "@smithy/signature-v4@npm:5.3.14" - dependencies: - "@smithy/is-array-buffer": "npm:^4.2.2" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-hex-encoding": "npm:^4.2.2" - "@smithy/util-middleware": "npm:^4.2.14" - "@smithy/util-uri-escape": "npm:^4.2.2" - "@smithy/util-utf8": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/ccc788992e281a681984e079b7194a219af40cf4f7087988eba69c4947264b9a83ac00a806164b9074c7e2f0697e492fa2b377b56b783316d247be02aaccbdb3 - languageName: node - linkType: hard - -"@smithy/smithy-client@npm:^4.12.13": - version: 4.12.13 - resolution: "@smithy/smithy-client@npm:4.12.13" - dependencies: - "@smithy/core": "npm:^3.23.17" - "@smithy/middleware-endpoint": "npm:^4.4.32" - "@smithy/middleware-stack": "npm:^4.2.14" - "@smithy/protocol-http": "npm:^5.3.14" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-stream": "npm:^4.5.25" - tslib: "npm:^2.6.2" - checksum: 10c0/0680d4d0720d110a637fabb8bdc85175e1471191925f5c55f08636f5327de1bc29c8db75318aac1396491fa83c8a319dd4cd26c5e9fff619207c9a96b9dbd9fe - languageName: node - linkType: hard - -"@smithy/types@npm:^4.14.1": - version: 4.14.1 - resolution: "@smithy/types@npm:4.14.1" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/9e6209770a25582a11ca67d4750865de0b7732bf3f353ba9260f49e9c4b2adf3274d64057a2bda93da7025e33a54e51bd78c529307efc2b75b429bc45a6ad64c - languageName: node - linkType: hard - -"@smithy/types@npm:^4.3.1": - version: 4.3.1 - resolution: "@smithy/types@npm:4.3.1" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/8b350562b9ed4ff97465025b4ae77a34bb07b9d47fb6f9781755aac9401b0355a63c2fef307393e2dae3fa0277149dd7d83f5bc2a63d4ad3519ea32fd56b5cda - languageName: node - linkType: hard - -"@smithy/url-parser@npm:^4.2.14": - version: 4.2.14 - resolution: "@smithy/url-parser@npm:4.2.14" - dependencies: - "@smithy/querystring-parser": "npm:^4.2.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/360463fe1fb51b8a1c5b80f4a16df993ee4e87221e60ce51c428b0737d6f1325434ec572bb7afca7d65bb9a09c750f307822a23e42be675706ee71fedd7c6c06 - languageName: node - linkType: hard - -"@smithy/util-base64@npm:^4.3.2": - version: 4.3.2 - resolution: "@smithy/util-base64@npm:4.3.2" - dependencies: - "@smithy/util-buffer-from": "npm:^4.2.2" - "@smithy/util-utf8": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/acc08ff0b482ef4473289be655e0adc21c33555a837bbbc1cc7121d70e3ad595807bcaaec7456d92e93d83c2e8773729d42f78d716ac7d91552845b50cd87d89 - languageName: node - linkType: hard - -"@smithy/util-body-length-browser@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/util-body-length-browser@npm:4.2.2" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/4444039b995068eeda3dd0b143eb22cf86c7ef7632a590559dad12b0e681a728a7d82f8ed4f4019cdc09a72e4b5f14281262b64db75514dbcc08d170d9e8f1db - languageName: node - linkType: hard - -"@smithy/util-body-length-node@npm:^4.2.3": - version: 4.2.3 - resolution: "@smithy/util-body-length-node@npm:4.2.3" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/5345d75e8c3e0a726ed6e2fe604dfe97b0bcc37e940b30b045e3e116fced9555d8a9fa684d9f898111773eeef548bcb5f0bb03ee67c206ee498064842d6173b5 - languageName: node - linkType: hard - -"@smithy/util-buffer-from@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-buffer-from@npm:2.2.0" - dependencies: - "@smithy/is-array-buffer": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10c0/223d6a508b52ff236eea01cddc062b7652d859dd01d457a4e50365af3de1e24a05f756e19433f6ccf1538544076b4215469e21a4ea83dc1d58d829725b0dbc5a - languageName: node - linkType: hard - -"@smithy/util-buffer-from@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/util-buffer-from@npm:4.0.0" - dependencies: - "@smithy/is-array-buffer": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/be7cd33b6cb91503982b297716251e67cdca02819a15797632091cadab2dc0b4a147fff0709a0aa9bbc0b82a2644a7ed7c8afdd2194d5093cee2e9605b3a9f6f - languageName: node - linkType: hard - -"@smithy/util-buffer-from@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/util-buffer-from@npm:4.2.2" - dependencies: - "@smithy/is-array-buffer": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/d9acea42ee035e494da0373de43a25fa14f81d11e3605a2c6c5f56efef9a4f901289ec2ba343ebb3ad32ae4e0cfe517e8b6b3449a4297d1c060889c83cd1c94f - languageName: node - linkType: hard - -"@smithy/util-config-provider@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/util-config-provider@npm:4.2.2" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/cfd3350607ec00b6294724033aa3e469f8d9d258a7a70772e67d80c301f2eae62b17850ea0c8d8a20208b3f4f1ea5aa0019f45545a6c0577a94a47a05c81d8e8 - languageName: node - linkType: hard - -"@smithy/util-defaults-mode-browser@npm:^4.3.49": - version: 4.3.49 - resolution: "@smithy/util-defaults-mode-browser@npm:4.3.49" - dependencies: - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/smithy-client": "npm:^4.12.13" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/0979b09f1108aa41f5bf623e32fa138e129fbffe3adc23c46308afa310b925635428f9d7e36e3e2a312cafe9af325cb5f01667791ee672418d4f302c1961623b - languageName: node - linkType: hard - -"@smithy/util-defaults-mode-node@npm:^4.2.54": - version: 4.2.54 - resolution: "@smithy/util-defaults-mode-node@npm:4.2.54" - dependencies: - "@smithy/config-resolver": "npm:^4.4.17" - "@smithy/credential-provider-imds": "npm:^4.2.14" - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/property-provider": "npm:^4.2.14" - "@smithy/smithy-client": "npm:^4.12.13" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/7146087fa1d7758b37da456719d589f63300843ff5610891de02a0434c5abbd49fd257712c2d9e0bede904f4ec62c9d3c9eddcd6ec0372134f998e4f9c0bce09 - languageName: node - linkType: hard - -"@smithy/util-endpoints@npm:^3.4.2": - version: 3.4.2 - resolution: "@smithy/util-endpoints@npm:3.4.2" - dependencies: - "@smithy/node-config-provider": "npm:^4.3.14" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/602e05c8dc43d8902604bac74b717d09da5b4f1994dcdd5025bffeced6002eaa0612ae1ccbe7a0e636a3d92a60747715e22cbacf8feeb672394d15b6ae211b13 - languageName: node - linkType: hard - -"@smithy/util-hex-encoding@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/util-hex-encoding@npm:4.0.0" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/70dbb3aa1a79aff3329d07a66411ff26398df338bdd8a6d077b438231afe3dc86d9a7022204baddecd8bc633f059d5c841fa916d81dd7447ea79b64148f386d2 - languageName: node - linkType: hard - -"@smithy/util-hex-encoding@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/util-hex-encoding@npm:4.2.2" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/b2f2bca85475cd599b998e169b7026db40edc2a0a338ad7988b9c94d9f313c5f7e08451aced4f8e62dbeaa54e15d1300d76c572b83ffa36f9f8ca22b6fc84bd7 - languageName: node - linkType: hard - -"@smithy/util-middleware@npm:^4.2.14": - version: 4.2.14 - resolution: "@smithy/util-middleware@npm:4.2.14" - dependencies: - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/6ba5026b70ad7b58fac89d7428c0b1679be2a97a8fb47811a39e0183901a3c6ca8732ee225ddfda28e7b86223d49983ff709421905da571bc00b82c660e4fc27 - languageName: node - linkType: hard - -"@smithy/util-retry@npm:^4.3.4": - version: 4.3.4 - resolution: "@smithy/util-retry@npm:4.3.4" - dependencies: - "@smithy/service-error-classification": "npm:^4.3.0" - "@smithy/types": "npm:^4.14.1" - tslib: "npm:^2.6.2" - checksum: 10c0/8d80edf2dfb23199f5b8095b20ae3774edf3f34b391ce8b7acc6c0ac89a7963677cfdccf8a388d8e688c67a453e8a94448c1753ec3bfdcaa253373770e58538b - languageName: node - linkType: hard - -"@smithy/util-stream@npm:^4.5.25": - version: 4.5.25 - resolution: "@smithy/util-stream@npm:4.5.25" - dependencies: - "@smithy/fetch-http-handler": "npm:^5.3.17" - "@smithy/node-http-handler": "npm:^4.6.1" - "@smithy/types": "npm:^4.14.1" - "@smithy/util-base64": "npm:^4.3.2" - "@smithy/util-buffer-from": "npm:^4.2.2" - "@smithy/util-hex-encoding": "npm:^4.2.2" - "@smithy/util-utf8": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/4b222c975eca2018831f1ab4067f122f4ef5e68f3abb71776003309f1a27f67d509a2d86f5f1f81a91656236db0e29c38314c005b17dbf63f053de4d97be7b59 - languageName: node - linkType: hard - -"@smithy/util-uri-escape@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/util-uri-escape@npm:4.2.2" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/33b6546086c975278d16b5029e6555df551b4bd1e3a84042544d1ef956a287fe033b317954b1737b2773e82b6f27ebde542956ff79ef0e8a813dc0dbf9d34a58 - languageName: node - linkType: hard - -"@smithy/util-utf8@npm:^2.0.0": - version: 2.3.0 - resolution: "@smithy/util-utf8@npm:2.3.0" - dependencies: - "@smithy/util-buffer-from": "npm:^2.2.0" - tslib: "npm:^2.6.2" - checksum: 10c0/e18840c58cc507ca57fdd624302aefd13337ee982754c9aa688463ffcae598c08461e8620e9852a424d662ffa948fc64919e852508028d09e89ced459bd506ab - languageName: node - linkType: hard - -"@smithy/util-utf8@npm:^4.0.0": - version: 4.0.0 - resolution: "@smithy/util-utf8@npm:4.0.0" - dependencies: - "@smithy/util-buffer-from": "npm:^4.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/28a5a5372cbf0b3d2e32dd16f79b04c2aec6f704cf13789db922e9686fde38dde0171491cfa4c2c201595d54752a319faaeeed3c325329610887694431e28c98 - languageName: node - linkType: hard - -"@smithy/util-utf8@npm:^4.2.2": - version: 4.2.2 - resolution: "@smithy/util-utf8@npm:4.2.2" - dependencies: - "@smithy/util-buffer-from": "npm:^4.2.2" - tslib: "npm:^2.6.2" - checksum: 10c0/55b5119873237519a9175491c74fd0a14acd4f9c54c7eec9ae547de6c554098912d46572edb12d5b52a0b9675c0577e2e63d1f7cb8e022ca342f5bf80b56a466 - languageName: node - linkType: hard - -"@smithy/uuid@npm:^1.1.2": - version: 1.1.2 - resolution: "@smithy/uuid@npm:1.1.2" - dependencies: - tslib: "npm:^2.6.2" - checksum: 10c0/cbedfe5e2c1ec5ee05ae0cd6cc3c9f6f5e600207362d62470278827488794e19148a05a61ee9b6a2359bb460985af1a528c48d54f365891fe1c4913504250667 - languageName: node - linkType: hard - -"@socket.io/component-emitter@npm:~3.1.0": - version: 3.1.2 - resolution: "@socket.io/component-emitter@npm:3.1.2" - checksum: 10c0/c4242bad66f67e6f7b712733d25b43cbb9e19a595c8701c3ad99cbeb5901555f78b095e24852f862fffb43e96f1d8552e62def885ca82ae1bb05da3668fd87d7 - languageName: node - linkType: hard - -"@sourcebot/backend@workspace:packages/backend": - version: 0.0.0-use.local - resolution: "@sourcebot/backend@workspace:packages/backend" - dependencies: - "@bull-board/api": "npm:9.3.1" - "@bull-board/express": "npm:9.3.1" - "@bull-board/metrics": "npm:9.3.1" - "@bull-board/ui": "npm:9.3.1" - "@coderabbitai/bitbucket": "npm:^1.1.3" - "@gitbeaker/rest": "npm:^40.5.1" - "@octokit/app": "npm:^16.1.1" - "@octokit/rest": "npm:^21.0.2" - "@sentry/cli": "npm:^2.42.2" - "@sentry/node": "npm:^10.71.0" - "@sentry/profiling-node": "npm:^10.71.0" - "@simple-git/argv-parser": "npm:^2.0.1" - "@sourcebot/db": "workspace:*" - "@sourcebot/schemas": "workspace:*" - "@sourcebot/shared": "workspace:*" - "@types/argparse": "npm:^2.0.16" - "@types/express": "npm:^5.0.0" - "@types/micromatch": "npm:^4.0.9" - "@types/node": "npm:^22.7.5" - argparse: "npm:^2.0.1" - azure-devops-node-api: "npm:^15.1.1" - bullmq: "npm:^5.81.3" - chokidar: "npm:^4.0.3" - cross-env: "npm:^7.0.3" - cross-fetch: "npm:^4.0.0" - dotenv: "npm:^16.4.5" - express: "npm:^4.22.2" - express-async-errors: "npm:^3.1.1" - fast-deep-equal: "npm:^3.1.3" - git-url-parse: "npm:^16.1.0" - gitea-js: "npm:^1.22.0" - glob: "npm:^11.1.0" - http-status-codes: "npm:^2.3.0" - ioredis: "npm:^5.11.1" - json-schema-to-typescript: "npm:^15.0.4" - lowdb: "npm:^7.0.1" - micromatch: "npm:^4.0.8" - p-limit: "npm:^7.2.0" - posthog-node: "npm:^5.51.2" - prom-client: "npm:^15.1.3" - redlock: "npm:5.0.0-beta.2" - simple-git: "npm:^4.0.2" - tsc-watch: "npm:^6.2.0" - tsx: "npm:^4.21.0" - typescript: "npm:^5.6.2" - vitest: "npm:^4.1.4" - zod: "npm:^3.25.76" - languageName: unknown - linkType: soft - -"@sourcebot/codemirror-lang-tcl@npm:^1.0.13": - version: 1.0.13 - resolution: "@sourcebot/codemirror-lang-tcl@npm:1.0.13" - dependencies: - "@codemirror/highlight": "npm:^0.19.0" - "@codemirror/language": "npm:^6.0.0" - "@lezer/common": "npm:^1.0.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - tslib: "npm:^2.8.1" - checksum: 10c0/1d251f0be95264bf281deb15aaecda9004e511c0747d6e8199d9fd024834d129c1384865e548c8280290d48bca927b3be722d03f2b908c2b3025d5dff072f847 - languageName: node - linkType: hard - -"@sourcebot/db@workspace:*, @sourcebot/db@workspace:packages/db": - version: 0.0.0-use.local - resolution: "@sourcebot/db@workspace:packages/db" - dependencies: - "@prisma/client": "npm:6.2.1" - "@types/argparse": "npm:^2.0.16" - "@types/readline-sync": "npm:^1.4.8" - argparse: "npm:^2.0.1" - prisma: "npm:^6.2.1" - readline-sync: "npm:^1.4.10" - tsx: "npm:^4.21.0" - typescript: "npm:^5.7.3" - languageName: unknown - linkType: soft - -"@sourcebot/query-language@workspace:*, @sourcebot/query-language@workspace:packages/queryLanguage": - version: 0.0.0-use.local - resolution: "@sourcebot/query-language@workspace:packages/queryLanguage" - dependencies: - "@lezer/common": "npm:^1.3.0" - "@lezer/generator": "npm:^1.8.0" - "@lezer/lr": "npm:^1.4.3" - tsx: "npm:^4.21.0" - typescript: "npm:^5.7.3" - vitest: "npm:^4.1.4" - languageName: unknown - linkType: soft - -"@sourcebot/schemas@workspace:*, @sourcebot/schemas@workspace:^, @sourcebot/schemas@workspace:packages/schemas": - version: 0.0.0-use.local - resolution: "@sourcebot/schemas@workspace:packages/schemas" - dependencies: - "@apidevtools/json-schema-ref-parser": "npm:^11.7.3" - glob: "npm:^11.1.0" - json-schema-to-typescript: "npm:^15.0.4" - nodemon: "npm:^3.1.10" - tsx: "npm:^4.21.0" - typescript: "npm:^5.7.3" - languageName: unknown - linkType: soft - -"@sourcebot/shared@workspace:*, @sourcebot/shared@workspace:packages/shared": - version: 0.0.0-use.local - resolution: "@sourcebot/shared@workspace:packages/shared" - dependencies: - "@google-cloud/secret-manager": "npm:^6.1.1" - "@logtail/node": "npm:^0.5.2" - "@logtail/winston": "npm:^0.5.2" - "@sentry/node": "npm:^10.71.0" - "@sourcebot/db": "workspace:*" - "@sourcebot/schemas": "workspace:*" - "@t3-oss/env-core": "npm:^0.13.10" - "@types/micromatch": "npm:^4.0.9" - "@types/node": "npm:^22.7.5" - ajv: "npm:^8.17.1" - bullmq: "npm:^5.81.3" - cross-env: "npm:^7.0.3" - ioredis: "npm:^5.11.1" - micromatch: "npm:^4.0.8" - strip-json-comments: "npm:^5.0.1" - triple-beam: "npm:^1.4.1" - tsc-watch: "npm:6.2.1" - tsx: "npm:^4.21.0" - typescript: "npm:^5.7.3" - vitest: "npm:^4.1.4" - winston: "npm:^3.15.0" - zod: "npm:^3.25.76" - languageName: unknown - linkType: soft - -"@sourcebot/web@workspace:packages/web": - version: 0.0.0-use.local - resolution: "@sourcebot/web@workspace:packages/web" - dependencies: - "@ai-sdk/amazon-bedrock": "npm:^4.0.94" - "@ai-sdk/anthropic": "npm:^3.0.70" - "@ai-sdk/azure": "npm:^3.0.54" - "@ai-sdk/deepseek": "npm:^2.0.29" - "@ai-sdk/google": "npm:^3.0.64" - "@ai-sdk/google-vertex": "npm:^4.0.111" - "@ai-sdk/mcp": "npm:^2.0.0-beta.11" - "@ai-sdk/mistral": "npm:^3.0.30" - "@ai-sdk/openai": "npm:^3.0.53" - "@ai-sdk/openai-compatible": "npm:^2.0.41" - "@ai-sdk/react": "npm:^3.0.169" - "@ai-sdk/xai": "npm:^3.0.83" - "@anthropic-ai/sdk": "npm:^0.104.0" - "@asteasolutions/zod-to-openapi": "npm:7.3.4" - "@auth/prisma-adapter": "npm:^2.11.3" - "@aws-sdk/credential-providers": "npm:^3.1036.0" - "@bprogress/next": "npm:^3.2.12" - "@codemirror/commands": "npm:^6.6.0" - "@codemirror/lang-cpp": "npm:^6.0.2" - "@codemirror/lang-css": "npm:^6.3.0" - "@codemirror/lang-go": "npm:^6.0.1" - "@codemirror/lang-html": "npm:^6.4.9" - "@codemirror/lang-java": "npm:^6.0.1" - "@codemirror/lang-javascript": "npm:^6.2.2" - "@codemirror/lang-json": "npm:^6.0.1" - "@codemirror/lang-less": "npm:^6.0.2" - "@codemirror/lang-liquid": "npm:^6.2.2" - "@codemirror/lang-markdown": "npm:^6.2.5" - "@codemirror/lang-php": "npm:^6.0.1" - "@codemirror/lang-python": "npm:^6.1.6" - "@codemirror/lang-rust": "npm:^6.0.1" - "@codemirror/lang-sass": "npm:^6.0.2" - "@codemirror/lang-sql": "npm:^6.7.1" - "@codemirror/lang-vue": "npm:^0.1.3" - "@codemirror/lang-wast": "npm:^6.0.2" - "@codemirror/lang-xml": "npm:^6.1.0" - "@codemirror/lang-yaml": "npm:^6.1.2" - "@codemirror/language": "npm:^6.0.0" - "@codemirror/language-data": "npm:^6.5.1" - "@codemirror/legacy-modes": "npm:^6.4.2" - "@codemirror/merge": "npm:^6.12.1" - "@codemirror/search": "npm:^6.5.6" - "@codemirror/state": "npm:^6.4.1" - "@codemirror/view": "npm:^6.33.0" - "@electric-sql/pglite": "npm:0.5.8" - "@eslint/eslintrc": "npm:^3" - "@floating-ui/react": "npm:^0.27.2" - "@gitbeaker/rest": "npm:^40.5.1" - "@grpc/grpc-js": "npm:^1.14.1" - "@grpc/proto-loader": "npm:^0.8.0" - "@hookform/resolvers": "npm:^3.9.0" - "@iconify/react": "npm:^5.1.0" - "@iizukak/codemirror-lang-wgsl": "npm:^0.3.0" - "@modelcontextprotocol/sdk": "npm:^1.29.0" - "@openrouter/ai-sdk-provider": "npm:^2.2.3" - "@opentelemetry/api-logs": "npm:^0.203.0" - "@opentelemetry/instrumentation": "npm:^0.203.0" - "@opentelemetry/sdk-logs": "npm:^0.203.0" - "@posthog/ai": "npm:^7.18.7" - "@radix-ui/react-accordion": "npm:^1.2.11" - "@radix-ui/react-alert-dialog": "npm:^1.1.5" - "@radix-ui/react-avatar": "npm:^1.1.2" - "@radix-ui/react-checkbox": "npm:^1.3.2" - "@radix-ui/react-collapsible": "npm:^1.1.11" - "@radix-ui/react-dialog": "npm:^1.1.15" - "@radix-ui/react-dropdown-menu": "npm:^2.1.1" - "@radix-ui/react-hover-card": "npm:^1.1.6" - "@radix-ui/react-icons": "npm:^1.3.0" - "@radix-ui/react-label": "npm:^2.1.0" - "@radix-ui/react-navigation-menu": "npm:^1.2.0" - "@radix-ui/react-popover": "npm:^1.1.6" - "@radix-ui/react-scroll-area": "npm:^1.1.0" - "@radix-ui/react-select": "npm:^2.1.6" - "@radix-ui/react-separator": "npm:^1.1.8" - "@radix-ui/react-slot": "npm:^1.2.4" - "@radix-ui/react-switch": "npm:^1.2.4" - "@radix-ui/react-tabs": "npm:^1.1.2" - "@radix-ui/react-toast": "npm:^1.2.2" - "@radix-ui/react-toggle": "npm:^1.1.10" - "@radix-ui/react-toggle-group": "npm:^1.1.11" - "@radix-ui/react-tooltip": "npm:^1.2.8" - "@react-email/components": "npm:^1.0.12" - "@react-email/render": "npm:^2.0.8" - "@react-email/ui": "npm:6.1.4" - "@react-grab/mcp": "npm:^0.1.23" - "@replit/codemirror-lang-csharp": "npm:^6.2.0" - "@replit/codemirror-lang-nix": "npm:^6.0.1" - "@replit/codemirror-lang-solidity": "npm:^6.0.2" - "@replit/codemirror-lang-svelte": "npm:^6.0.0" - "@replit/codemirror-vim": "npm:^6.2.1" - "@sentry/nextjs": "npm:^10.71.0" - "@sentry/profiling-node": "npm:^10.71.0" - "@shopify/lang-jsonc": "npm:^1.0.0" - "@sourcebot/codemirror-lang-tcl": "npm:^1.0.13" - "@sourcebot/db": "workspace:*" - "@sourcebot/query-language": "workspace:*" - "@sourcebot/schemas": "workspace:*" - "@sourcebot/shared": "workspace:*" - "@ssddanbrown/codemirror-lang-twig": "npm:^1.0.0" - "@tailwindcss/container-queries": "npm:^0.1.1" - "@tailwindcss/typography": "npm:^0.5.16" - "@tanstack/eslint-plugin-query": "npm:^5.74.7" - "@tanstack/react-query": "npm:^5.53.3" - "@tanstack/react-table": "npm:^8.20.5" - "@tanstack/react-virtual": "npm:^3.10.8" - "@testing-library/dom": "npm:^10.4.1" - "@testing-library/react": "npm:^16.3.0" - "@types/canvas-confetti": "npm:^1.9.0" - "@types/glob-to-regexp": "npm:^0.4.4" - "@types/micromatch": "npm:^4.0.9" - "@types/node": "npm:^20" - "@types/nodemailer": "npm:^6.4.17" - "@types/psl": "npm:^1.1.3" - "@types/react": "npm:19.2.14" - "@types/react-dom": "npm:19.2.3" - "@typescript-eslint/eslint-plugin": "npm:^8.40.0" - "@typescript-eslint/parser": "npm:^8.40.0" - "@uidotdev/usehooks": "npm:^2.4.1" - "@uiw/codemirror-themes": "npm:^4.23.6" - "@uiw/react-codemirror": "npm:^4.23.0" - "@viz-js/lang-dot": "npm:^1.0.4" - "@xiechao/codemirror-lang-handlebars": "npm:^1.0.4" - ai: "npm:^6.0.167" - ajv: "npm:^8.17.1" - bcryptjs: "npm:^3.0.2" - canvas-confetti: "npm:^1.9.4" - class-variance-authority: "npm:^0.7.1" - client-only: "npm:^0.0.1" - clsx: "npm:^2.1.1" - cm6-graphql: "npm:^0.2.0" - cmdk: "npm:1.0.0" - codemirror: "npm:^5.65.3" - codemirror-json-schema: "npm:^0.8.0" - codemirror-lang-brainfuck: "npm:^0.1.0" - codemirror-lang-elixir: "npm:^4.0.0" - codemirror-lang-hcl: "npm:^0.0.0-beta.2" - codemirror-lang-j: "npm:^0.1.1" - codemirror-lang-jq: "npm:^1.0.0" - codemirror-lang-makefile: "npm:^0.1.1" - codemirror-lang-mermaid: "npm:^0.5.0" - codemirror-lang-perl: "npm:^0.1.5-beta.6" - codemirror-lang-prolog: "npm:^0.1.0" - codemirror-lang-r: "npm:^0.1.1" - codemirror-lang-sparql: "npm:^2.0.0" - codemirror-lang-spreadsheet: "npm:^1.3.0" - codemirror-lang-zig: "npm:^0.1.0" - cross-env: "npm:^7.0.3" - date-fns: "npm:^4.1.0" - dedent: "npm:^1.7.1" - embla-carousel-auto-scroll: "npm:^8.3.0" - embla-carousel-react: "npm:^8.3.0" - escape-string-regexp: "npm:^5.0.0" - eslint: "npm:^9" - eslint-config-next: "npm:16.1.6" - eslint-plugin-react: "npm:^7.37.5" - eslint-plugin-react-hooks: "npm:^7.0.1" - fast-deep-equal: "npm:^3.1.3" - fuse.js: "npm:^7.0.0" - glob-to-regexp: "npm:^0.4.1" - google-auth-library: "npm:^10.1.0" - graphql: "npm:^16.9.0" - http-status-codes: "npm:^2.3.0" - input-otp: "npm:^1.4.2" - jsdom: "npm:^25.0.1" - linguist-languages: "npm:^9.3.1" - lucide-react: "npm:^1.7.0" - mermaid: "npm:^11.16.0" - micromatch: "npm:^4.0.8" - minidenticons: "npm:^4.2.1" - motion: "npm:^12.42.0" - next: "npm:^16.3.3" - next-auth: "npm:^5.0.0-beta.32" - next-navigation-guard: "npm:^0.2.0" - next-themes: "npm:^0.3.0" - nodemailer: "npm:^10.0.2" - npm-run-all: "npm:^4.1.5" - octokit: "npm:^4.1.3" - openai: "npm:^4.98.0" - parse-diff: "npm:^0.11.1" - postcss: "npm:^8.5.12" - posthog-js: "npm:^1.369.0" - posthog-node: "npm:^5.51.2" - pretty-bytes: "npm:^6.1.1" - prom-client: "npm:^15.1.3" - psl: "npm:^1.15.0" - raw-loader: "npm:^4.0.2" - react: "npm:19.2.4" - react-day-picker: "npm:^9.14.0" - react-device-detect: "npm:^2.2.3" - react-dom: "npm:19.2.4" - react-dropzone: "npm:^15.0.0" - react-email: "npm:^6.1.4" - react-grab: "npm:^0.1.23" - react-hook-form: "npm:^7.53.0" - react-hotkeys-hook: "npm:^4.5.1" - react-icons: "npm:^5.6.0" - react-markdown: "npm:^10.1.0" - react-resizable-panels: "npm:^2.1.1" - react-scan: "npm:^0.5.3" - react-zoom-pan-pinch: "npm:^4.0.3" - recharts: "npm:^2.15.3" - rehype-raw: "npm:^7.0.0" - rehype-sanitize: "npm:^6.0.0" - remark-gfm: "npm:^4.0.1" - scroll-into-view-if-needed: "npm:^3.1.0" - server-only: "npm:^0.0.1" - sharp: "npm:^0.35.3" - simple-git: "npm:^4.0.2" - slate: "npm:^0.117.0" - slate-dom: "npm:^0.116.0" - slate-history: "npm:^0.113.1" - slate-react: "npm:^0.117.1" - strip-json-comments: "npm:^5.0.1" - tailwind-merge: "npm:^2.5.2" - tailwindcss: "npm:^3.4.1" - tailwindcss-animate: "npm:^1.0.7" - tsx: "npm:^4.21.0" - typescript: "npm:^5" - typescript-eslint: "npm:^8.56.1" - use-stick-to-bottom: "npm:^1.1.3" - usehooks-ts: "npm:^3.1.0" - uuid: "npm:^14.0.0" - vite-tsconfig-paths: "npm:^5.1.3" - vitest: "npm:^4.1.4" - vitest-mock-extended: "npm:^4.0.0" - vscode-icons-js: "npm:^11.6.1" - yaml: "npm:^2.8.3" - zod: "npm:^3.25.76" - zod-to-json-schema: "npm:^3.24.5" - languageName: unknown - linkType: soft - -"@ssddanbrown/codemirror-lang-twig@npm:^1.0.0": - version: 1.0.0 - resolution: "@ssddanbrown/codemirror-lang-twig@npm:1.0.0" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/3b7ec758d443d4d6d8e8bc7f3d186f06fece5e034f1821250f1f44a76401bfd21ed14f91dff86c366f787a93f0da73f2de6d6ac073d37556bf343551ead52996 - languageName: node - linkType: hard - -"@stablelib/base64@npm:^1.0.0": - version: 1.0.1 - resolution: "@stablelib/base64@npm:1.0.1" - checksum: 10c0/6330720f021819d19cecfe274111b79a256caa81df478d6b0ae7effc8842b96915b6aeed85926ff05b4d48ec1fc78ad043d928b730ee4e6cc6e8cba6aa097bed - languageName: node - linkType: hard - -"@standard-schema/spec@npm:1.1.0, @standard-schema/spec@npm:^1.1.0": - version: 1.1.0 - resolution: "@standard-schema/spec@npm:1.1.0" - checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 - languageName: node - linkType: hard - -"@swc/helpers@npm:0.5.23": - version: 0.5.23 - resolution: "@swc/helpers@npm:0.5.23" - dependencies: - tslib: "npm:^2.8.0" - checksum: 10c0/02da7b4df465693933ecd4851cc193ec729c309939c8a84eccae5ec0010aafc3894e713b8ef8d13a6ba401759f0e900c88e2dcfef5872c27bb91e70f73275cce - languageName: node - linkType: hard - -"@t3-oss/env-core@npm:^0.13.10": - version: 0.13.10 - resolution: "@t3-oss/env-core@npm:0.13.10" - peerDependencies: - arktype: ^2.1.0 - typescript: ">=5.0.0" - valibot: ^1.0.0-beta.7 || ^1.0.0 - zod: ^3.24.0 || ^4.0.0 - peerDependenciesMeta: - arktype: - optional: true - typescript: - optional: true - valibot: - optional: true - zod: - optional: true - checksum: 10c0/b3bd6edf9306ca77078cc1c596f038a6589fec9d279febcad5e02007ec6afa2e7a7173e62d74920620222e91a9c0a4a51a995c231c0a16bbdd9ddd966d6cbd67 - languageName: node - linkType: hard - -"@tabby_ai/hijri-converter@npm:1.0.5": - version: 1.0.5 - resolution: "@tabby_ai/hijri-converter@npm:1.0.5" - checksum: 10c0/40044f463ff57855315c8925461942311460bb64e16706480dde98142f40bcd8e9925bb6fee401fd209397b5bb25368d1529c85b1e6c7e6216ea2085f6aaf61e - languageName: node - linkType: hard - -"@tailwindcss/container-queries@npm:^0.1.1": - version: 0.1.1 - resolution: "@tailwindcss/container-queries@npm:0.1.1" - peerDependencies: - tailwindcss: ">=3.2.0" - checksum: 10c0/336546ddcc60280723f2a92e311cac0acb8b05624c6519675d4b11ae13ed01dba5e622705a9be69cd66ca2c8019032551176546e6920d9634750165ac4c15d8e - languageName: node - linkType: hard - -"@tailwindcss/typography@npm:^0.5.16": - version: 0.5.16 - resolution: "@tailwindcss/typography@npm:0.5.16" - dependencies: - lodash.castarray: "npm:^4.4.0" - lodash.isplainobject: "npm:^4.0.6" - lodash.merge: "npm:^4.6.2" - postcss-selector-parser: "npm:6.0.10" - peerDependencies: - tailwindcss: "*" - checksum: 10c0/35a7387876810c23c270a23848b920517229b707c8ead6a63c8bb7d6720a62f23728c3117f0a93b422a66d1e5ee9c7ad8a6c3f0fbf5255b535c0e4971ffa0158 - languageName: node - linkType: hard - -"@tanstack/eslint-plugin-query@npm:^5.74.7": - version: 5.74.7 - resolution: "@tanstack/eslint-plugin-query@npm:5.74.7" - dependencies: - "@typescript-eslint/utils": "npm:^8.18.1" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/7f026af15918e0f77e1032c0e53d70fd952d32735b0987a84d0df2b1c6b47ac01773da3812d579c999c398dd677d45400e133a1b3c2979e3f125028743451850 - languageName: node - linkType: hard - -"@tanstack/query-core@npm:5.69.0": - version: 5.69.0 - resolution: "@tanstack/query-core@npm:5.69.0" - checksum: 10c0/8ad87046d1a8c18773de10e74d7fef2093cdbe9734e76460945048c00a219ae3d2421eab2b4d54340f3f491813f99ceef7d2849827d95490c8b67de1b87934ae - languageName: node - linkType: hard - -"@tanstack/react-query@npm:^5.53.3": - version: 5.69.0 - resolution: "@tanstack/react-query@npm:5.69.0" - dependencies: - "@tanstack/query-core": "npm:5.69.0" - peerDependencies: - react: ^18 || ^19 - checksum: 10c0/3481218d0dd1623af8148037011415ca6f57f2f918e859f6856b7d6cec191ca79029f6fd9e5b1139b1ec252198bda645ce8c1b44ac8dd28adf3c5f978a4126ec - languageName: node - linkType: hard - -"@tanstack/react-table@npm:^8.20.5": - version: 8.21.2 - resolution: "@tanstack/react-table@npm:8.21.2" - dependencies: - "@tanstack/table-core": "npm:8.21.2" - peerDependencies: - react: ">=16.8" - react-dom: ">=16.8" - checksum: 10c0/192392c7d945bf50a21a0904fdce07e4abb74bc6187bcd32ae843031d48e851a10899e0218443d742ee01c30ca1ff890a8677a5878b8904561ebc23479adfdf1 - languageName: node - linkType: hard - -"@tanstack/react-virtual@npm:^3.10.8": - version: 3.13.4 - resolution: "@tanstack/react-virtual@npm:3.13.4" - dependencies: - "@tanstack/virtual-core": "npm:3.13.4" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/45cf785fa2984d536218aa546dc0b515cd6be2c8160987d01815a5b182fc517923d41d7f852fad718132ffc17faed94093a8318158ad6b338fdaba3243485da3 - languageName: node - linkType: hard - -"@tanstack/table-core@npm:8.21.2": - version: 8.21.2 - resolution: "@tanstack/table-core@npm:8.21.2" - checksum: 10c0/836326c6aef7e0b9b4566f9b2ade5ea73b90ce94f2b0cc35a3b3e1f44a9b3512d5507e4818c509824443b3d0488f2026df54e7a9f8f0cdccae6040347e6ff079 - languageName: node - linkType: hard - -"@tanstack/virtual-core@npm:3.13.4": - version: 3.13.4 - resolution: "@tanstack/virtual-core@npm:3.13.4" - checksum: 10c0/00ed3054e5f1370fe61d3fc9eec40ca0f18b66cfcb4a0bbce1a26397518c90145a0b493e463992b352842760bb8b0ec40969f07e3bb94dc6e68064f3973fe41a - languageName: node - linkType: hard - -"@testing-library/dom@npm:^10.4.1": - version: 10.4.1 - resolution: "@testing-library/dom@npm:10.4.1" - dependencies: - "@babel/code-frame": "npm:^7.10.4" - "@babel/runtime": "npm:^7.12.5" - "@types/aria-query": "npm:^5.0.1" - aria-query: "npm:5.3.0" - dom-accessibility-api: "npm:^0.5.9" - lz-string: "npm:^1.5.0" - picocolors: "npm:1.1.1" - pretty-format: "npm:^27.0.2" - checksum: 10c0/19ce048012d395ad0468b0dbcc4d0911f6f9e39464d7a8464a587b29707eed5482000dad728f5acc4ed314d2f4d54f34982999a114d2404f36d048278db815b1 - languageName: node - linkType: hard - -"@testing-library/react@npm:^16.3.0": - version: 16.3.0 - resolution: "@testing-library/react@npm:16.3.0" - dependencies: - "@babel/runtime": "npm:^7.12.5" - peerDependencies: - "@testing-library/dom": ^10.0.0 - "@types/react": ^18.0.0 || ^19.0.0 - "@types/react-dom": ^18.0.0 || ^19.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10c0/3a2cb1f87c9a67e1ebbbcfd99b94b01e496fc35147be8bc5d8bf07a699c7d523a09d57ef2f7b1d91afccd1a28e21eda3b00d80187fbb51b1de01e422592d845e - languageName: node - linkType: hard - -"@tybys/wasm-util@npm:^0.10.2": - version: 0.10.2 - resolution: "@tybys/wasm-util@npm:0.10.2" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/26165bcd1fd7269f42d7fbe3de318f854a8968de8397e89fc9a423bb3e2da35a52150f382e6323b3367595beb16d9800a6f35971a5599daf76da1742ec3afc25 - languageName: node - linkType: hard - -"@tybys/wasm-util@npm:^0.9.0": - version: 0.9.0 - resolution: "@tybys/wasm-util@npm:0.9.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d - languageName: node - linkType: hard - -"@types/argparse@npm:^2.0.16": - version: 2.0.17 - resolution: "@types/argparse@npm:2.0.17" - checksum: 10c0/cd22c329864d9f6df4740fc5c557290b7629385b0e51c1b3d038bbc22aa0be4ed9507ae421fc0dde63c1f9e71241c0bce4c9a1668702513c568ae176dfec780c - languageName: node - linkType: hard - -"@types/aria-query@npm:^5.0.1": - version: 5.0.4 - resolution: "@types/aria-query@npm:5.0.4" - checksum: 10c0/dc667bc6a3acc7bba2bccf8c23d56cb1f2f4defaa704cfef595437107efaa972d3b3db9ec1d66bc2711bfc35086821edd32c302bffab36f2e79b97f312069f08 - languageName: node - linkType: hard - -"@types/aws-lambda@npm:^8.10.83": - version: 8.10.149 - resolution: "@types/aws-lambda@npm:8.10.149" - checksum: 10c0/9ef41214a1b69fa30d89cab575429793f1ccc49cfe3a7aa75228aef31a202bb6d2c306a5b33def61ef29e0d0a1a324412bf6a4fa5a615e61117685584a394047 - languageName: node - linkType: hard - -"@types/body-parser@npm:*": - version: 1.19.5 - resolution: "@types/body-parser@npm:1.19.5" - dependencies: - "@types/connect": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df - languageName: node - linkType: hard - -"@types/braces@npm:*": - version: 3.0.5 - resolution: "@types/braces@npm:3.0.5" - checksum: 10c0/fff17426731376b452abf747e862f0116b80ccc68a2c8e6b56aff240048c26c983d61c456c6792dffe9df407d80c1a504bea21e8c1a56afaed1f311dfe75bc68 - languageName: node - linkType: hard - -"@types/canvas-confetti@npm:^1.9.0": - version: 1.9.0 - resolution: "@types/canvas-confetti@npm:1.9.0" - checksum: 10c0/ffe2c674d466b8e13472c81ab2a97056f3433fd40a3513dbc1bb76764e4e7c3ff0a2a58d37b16ea6a245c831077c553db321b069dda6572eab59f2be61137b2e - languageName: node - linkType: hard - -"@types/chai@npm:^5.2.2": - version: 5.2.3 - resolution: "@types/chai@npm:5.2.3" - dependencies: - "@types/deep-eql": "npm:*" - assertion-error: "npm:^2.0.1" - checksum: 10c0/e0ef1de3b6f8045a5e473e867c8565788c444271409d155588504840ad1a53611011f85072188c2833941189400228c1745d78323dac13fcede9c2b28bacfb2f - languageName: node - linkType: hard - -"@types/connect@npm:*": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c - languageName: node - linkType: hard - -"@types/cors@npm:^2.8.12": - version: 2.8.17 - resolution: "@types/cors@npm:2.8.17" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/457364c28c89f3d9ed34800e1de5c6eaaf344d1bb39af122f013322a50bc606eb2aa6f63de4e41a7a08ba7ef454473926c94a830636723da45bf786df032696d - languageName: node - linkType: hard - -"@types/d3-array@npm:*": - version: 3.2.2 - resolution: "@types/d3-array@npm:3.2.2" - checksum: 10c0/6137cb97302f8a4f18ca22c0560c585cfcb823f276b23d89f2c0c005d72697ec13bca671c08e68b4b0cabd622e3f0e91782ee221580d6774074050be96dd7028 - languageName: node - linkType: hard - -"@types/d3-array@npm:^3.0.3": - version: 3.2.1 - resolution: "@types/d3-array@npm:3.2.1" - checksum: 10c0/38bf2c778451f4b79ec81a2288cb4312fe3d6449ecdf562970cc339b60f280f31c93a024c7ff512607795e79d3beb0cbda123bb07010167bce32927f71364bca - languageName: node - linkType: hard - -"@types/d3-axis@npm:*": - version: 3.0.6 - resolution: "@types/d3-axis@npm:3.0.6" - dependencies: - "@types/d3-selection": "npm:*" - checksum: 10c0/d756d42360261f44d8eefd0950c5bb0a4f67a46dd92069da3f723ac36a1e8cb2b9ce6347d836ef19d5b8aef725dbcf8fdbbd6cfbff676ca4b0642df2f78b599a - languageName: node - linkType: hard - -"@types/d3-brush@npm:*": - version: 3.0.6 - resolution: "@types/d3-brush@npm:3.0.6" - dependencies: - "@types/d3-selection": "npm:*" - checksum: 10c0/fd6e2ac7657a354f269f6b9c58451ffae9d01b89ccb1eb6367fd36d635d2f1990967215ab498e0c0679ff269429c57fad6a2958b68f4d45bc9f81d81672edc01 - languageName: node - linkType: hard - -"@types/d3-chord@npm:*": - version: 3.0.6 - resolution: "@types/d3-chord@npm:3.0.6" - checksum: 10c0/c5a25eb5389db01e63faec0c5c2ec7cc41c494e9b3201630b494c4e862a60f1aa83fabbc33a829e7e1403941e3c30d206c741559b14406ac2a4239cfdf4b4c17 - languageName: node - linkType: hard - -"@types/d3-color@npm:*": - version: 3.1.3 - resolution: "@types/d3-color@npm:3.1.3" - checksum: 10c0/65eb0487de606eb5ad81735a9a5b3142d30bc5ea801ed9b14b77cb14c9b909f718c059f13af341264ee189acf171508053342142bdf99338667cea26a2d8d6ae - languageName: node - linkType: hard - -"@types/d3-contour@npm:*": - version: 3.0.6 - resolution: "@types/d3-contour@npm:3.0.6" - dependencies: - "@types/d3-array": "npm:*" - "@types/geojson": "npm:*" - checksum: 10c0/e7d83e94719af4576ceb5ac7f277c5806f83ba6c3631744ae391cffc3641f09dfa279470b83053cd0b2acd6784e8749c71141d05bdffa63ca58ffb5b31a0f27c - languageName: node - linkType: hard - -"@types/d3-delaunay@npm:*": - version: 6.0.4 - resolution: "@types/d3-delaunay@npm:6.0.4" - checksum: 10c0/d154a8864f08c4ea23ecb9bdabcef1c406a25baa8895f0cb08a0ed2799de0d360e597552532ce7086ff0cdffa8f3563f9109d18f0191459d32bb620a36939123 - languageName: node - linkType: hard - -"@types/d3-dispatch@npm:*": - version: 3.0.7 - resolution: "@types/d3-dispatch@npm:3.0.7" - checksum: 10c0/38c6605ebf0bf0099dfb70eafe0dd4ae8213368b40b8f930b72a909ff2e7259d2bd8a54d100bb5a44eb4b36f4f2a62dcb37f8be59613ca6b507c7a2f910b3145 - languageName: node - linkType: hard - -"@types/d3-drag@npm:*": - version: 3.0.7 - resolution: "@types/d3-drag@npm:3.0.7" - dependencies: - "@types/d3-selection": "npm:*" - checksum: 10c0/65e29fa32a87c72d26c44b5e2df3bf15af21cd128386bcc05bcacca255927c0397d0cd7e6062aed5f0abd623490544a9d061c195f5ed9f018fe0b698d99c079d - languageName: node - linkType: hard - -"@types/d3-dsv@npm:*": - version: 3.0.7 - resolution: "@types/d3-dsv@npm:3.0.7" - checksum: 10c0/c0f01da862465594c8a28278b51c850af3b4239cc22b14fd1a19d7a98f93d94efa477bf59d8071beb285dca45bf614630811451e18e7c52add3a0abfee0a1871 - languageName: node - linkType: hard - -"@types/d3-ease@npm:*, @types/d3-ease@npm:^3.0.0": - version: 3.0.2 - resolution: "@types/d3-ease@npm:3.0.2" - checksum: 10c0/aff5a1e572a937ee9bff6465225d7ba27d5e0c976bd9eacdac2e6f10700a7cb0c9ea2597aff6b43a6ed850a3210030870238894a77ec73e309b4a9d0333f099c - languageName: node - linkType: hard - -"@types/d3-fetch@npm:*": - version: 3.0.7 - resolution: "@types/d3-fetch@npm:3.0.7" - dependencies: - "@types/d3-dsv": "npm:*" - checksum: 10c0/3d147efa52a26da1a5d40d4d73e6cebaaa964463c378068062999b93ea3731b27cc429104c21ecbba98c6090e58ef13429db6399238c5e3500162fb3015697a0 - languageName: node - linkType: hard - -"@types/d3-force@npm:*": - version: 3.0.10 - resolution: "@types/d3-force@npm:3.0.10" - checksum: 10c0/c82b459079a106b50e346c9b79b141f599f2fc4f598985a5211e72c7a2e20d35bd5dc6e91f306b323c8bfa325c02c629b1645f5243f1c6a55bd51bc85cccfa92 - languageName: node - linkType: hard - -"@types/d3-format@npm:*": - version: 3.0.4 - resolution: "@types/d3-format@npm:3.0.4" - checksum: 10c0/3ac1600bf9061a59a228998f7cd3f29e85cbf522997671ba18d4d84d10a2a1aff4f95aceb143fa9960501c3ec351e113fc75884e6a504ace44dc1744083035ee - languageName: node - linkType: hard - -"@types/d3-geo@npm:*": - version: 3.1.0 - resolution: "@types/d3-geo@npm:3.1.0" - dependencies: - "@types/geojson": "npm:*" - checksum: 10c0/3745a93439038bb5b0b38facf435f7079812921d46406f5d38deaee59e90084ff742443c7ea0a8446df81a0d81eaf622fe7068cf4117a544bd4aa3b2dc182f88 - languageName: node - linkType: hard - -"@types/d3-hierarchy@npm:*": - version: 3.1.7 - resolution: "@types/d3-hierarchy@npm:3.1.7" - checksum: 10c0/873711737d6b8e7b6f1dda0bcd21294a48f75024909ae510c5d2c21fad2e72032e0958def4d9f68319d3aaac298ad09c49807f8bfc87a145a82693b5208613c7 - languageName: node - linkType: hard - -"@types/d3-interpolate@npm:*, @types/d3-interpolate@npm:^3.0.1": - version: 3.0.4 - resolution: "@types/d3-interpolate@npm:3.0.4" - dependencies: - "@types/d3-color": "npm:*" - checksum: 10c0/066ebb8da570b518dd332df6b12ae3b1eaa0a7f4f0c702e3c57f812cf529cc3500ec2aac8dc094f31897790346c6b1ebd8cd7a077176727f4860c2b181a65ca4 - languageName: node - linkType: hard - -"@types/d3-path@npm:*": - version: 3.1.1 - resolution: "@types/d3-path@npm:3.1.1" - checksum: 10c0/2c36eb31ebaf2ce4712e793fd88087117976f7c4ed69cc2431825f999c8c77cca5cea286f3326432b770739ac6ccd5d04d851eb65e7a4dbcc10c982b49ad2c02 - languageName: node - linkType: hard - -"@types/d3-polygon@npm:*": - version: 3.0.2 - resolution: "@types/d3-polygon@npm:3.0.2" - checksum: 10c0/f46307bb32b6c2aef8c7624500e0f9b518de8f227ccc10170b869dc43e4c542560f6c8d62e9f087fac45e198d6e4b623e579c0422e34c85baf56717456d3f439 - languageName: node - linkType: hard - -"@types/d3-quadtree@npm:*": - version: 3.0.6 - resolution: "@types/d3-quadtree@npm:3.0.6" - checksum: 10c0/7eaa0a4d404adc856971c9285e1c4ab17e9135ea669d847d6db7e0066126a28ac751864e7ce99c65d526e130f56754a2e437a1617877098b3bdcc3ef23a23616 - languageName: node - linkType: hard - -"@types/d3-random@npm:*": - version: 3.0.3 - resolution: "@types/d3-random@npm:3.0.3" - checksum: 10c0/5f4fea40080cd6d4adfee05183d00374e73a10c530276a6455348983dda341003a251def28565a27c25d9cf5296a33e870e397c9d91ff83fb7495a21c96b6882 - languageName: node - linkType: hard - -"@types/d3-scale-chromatic@npm:*": - version: 3.1.0 - resolution: "@types/d3-scale-chromatic@npm:3.1.0" - checksum: 10c0/93c564e02d2e97a048e18fe8054e4a935335da6ab75a56c3df197beaa87e69122eef0dfbeb7794d4a444a00e52e3123514ee27cec084bd21f6425b7037828cc2 - languageName: node - linkType: hard - -"@types/d3-scale@npm:*, @types/d3-scale@npm:^4.0.2": - version: 4.0.9 - resolution: "@types/d3-scale@npm:4.0.9" - dependencies: - "@types/d3-time": "npm:*" - checksum: 10c0/4ac44233c05cd50b65b33ecb35d99fdf07566bcdbc55bc1306b2f27d1c5134d8c560d356f2c8e76b096e9125ffb8d26d95f78d56e210d1c542cb255bdf31d6c8 - languageName: node - linkType: hard - -"@types/d3-selection@npm:*": - version: 3.0.11 - resolution: "@types/d3-selection@npm:3.0.11" - checksum: 10c0/0c512956c7503ff5def4bb32e0c568cc757b9a2cc400a104fc0f4cfe5e56d83ebde2a97821b6f2cb26a7148079d3b86a2f28e11d68324ed311cf35c2ed980d1d - languageName: node - linkType: hard - -"@types/d3-shape@npm:*": - version: 3.1.8 - resolution: "@types/d3-shape@npm:3.1.8" - dependencies: - "@types/d3-path": "npm:*" - checksum: 10c0/49ec2172b9eb66fc1d036e2a23966216bb972e9af51ddbed134df24bd71aedf207bb1ef81903a119eb4e1f5e927cf44beacaf64c9af86474e5548594b102b574 - languageName: node - linkType: hard - -"@types/d3-shape@npm:^3.1.0": - version: 3.1.7 - resolution: "@types/d3-shape@npm:3.1.7" - dependencies: - "@types/d3-path": "npm:*" - checksum: 10c0/38e59771c1c4c83b67aa1f941ce350410522a149d2175832fdc06396b2bb3b2c1a2dd549e0f8230f9f24296ee5641a515eaf10f55ee1ef6c4f83749e2dd7dcfd - languageName: node - linkType: hard - -"@types/d3-time-format@npm:*": - version: 4.0.3 - resolution: "@types/d3-time-format@npm:4.0.3" - checksum: 10c0/9ef5e8e2b96b94799b821eed5d61a3d432c7903247966d8ad951b8ce5797fe46554b425cb7888fa5bf604b4663c369d7628c0328ffe80892156671c58d1a7f90 - languageName: node - linkType: hard - -"@types/d3-time@npm:*, @types/d3-time@npm:^3.0.0": - version: 3.0.4 - resolution: "@types/d3-time@npm:3.0.4" - checksum: 10c0/6d9e2255d63f7a313a543113920c612e957d70da4fb0890931da6c2459010291b8b1f95e149a538500c1c99e7e6c89ffcce5554dd29a31ff134a38ea94b6d174 - languageName: node - linkType: hard - -"@types/d3-timer@npm:*, @types/d3-timer@npm:^3.0.0": - version: 3.0.2 - resolution: "@types/d3-timer@npm:3.0.2" - checksum: 10c0/c644dd9571fcc62b1aa12c03bcad40571553020feeb5811f1d8a937ac1e65b8a04b759b4873aef610e28b8714ac71c9885a4d6c127a048d95118f7e5b506d9e1 - languageName: node - linkType: hard - -"@types/d3-transition@npm:*": - version: 3.0.9 - resolution: "@types/d3-transition@npm:3.0.9" - dependencies: - "@types/d3-selection": "npm:*" - checksum: 10c0/4f68b9df7ac745b3491216c54203cbbfa0f117ae4c60e2609cdef2db963582152035407fdff995b10ee383bae2f05b7743493f48e1b8e46df54faa836a8fb7b5 - languageName: node - linkType: hard - -"@types/d3-zoom@npm:*": - version: 3.0.8 - resolution: "@types/d3-zoom@npm:3.0.8" - dependencies: - "@types/d3-interpolate": "npm:*" - "@types/d3-selection": "npm:*" - checksum: 10c0/1dbdbcafddcae12efb5beb6948546963f29599e18bc7f2a91fb69cc617c2299a65354f2d47e282dfb86fec0968406cd4fb7f76ba2d2fb67baa8e8d146eb4a547 - languageName: node - linkType: hard - -"@types/d3@npm:^7.4.3": - version: 7.4.3 - resolution: "@types/d3@npm:7.4.3" - dependencies: - "@types/d3-array": "npm:*" - "@types/d3-axis": "npm:*" - "@types/d3-brush": "npm:*" - "@types/d3-chord": "npm:*" - "@types/d3-color": "npm:*" - "@types/d3-contour": "npm:*" - "@types/d3-delaunay": "npm:*" - "@types/d3-dispatch": "npm:*" - "@types/d3-drag": "npm:*" - "@types/d3-dsv": "npm:*" - "@types/d3-ease": "npm:*" - "@types/d3-fetch": "npm:*" - "@types/d3-force": "npm:*" - "@types/d3-format": "npm:*" - "@types/d3-geo": "npm:*" - "@types/d3-hierarchy": "npm:*" - "@types/d3-interpolate": "npm:*" - "@types/d3-path": "npm:*" - "@types/d3-polygon": "npm:*" - "@types/d3-quadtree": "npm:*" - "@types/d3-random": "npm:*" - "@types/d3-scale": "npm:*" - "@types/d3-scale-chromatic": "npm:*" - "@types/d3-selection": "npm:*" - "@types/d3-shape": "npm:*" - "@types/d3-time": "npm:*" - "@types/d3-time-format": "npm:*" - "@types/d3-timer": "npm:*" - "@types/d3-transition": "npm:*" - "@types/d3-zoom": "npm:*" - checksum: 10c0/a9c6d65b13ef3b42c87f2a89ea63a6d5640221869f97d0657b0cb2f1dac96a0f164bf5605643c0794e0de3aa2bf05df198519aaf15d24ca135eb0e8bd8a9d879 - languageName: node - linkType: hard - -"@types/debug@npm:^4.0.0": - version: 4.1.12 - resolution: "@types/debug@npm:4.1.12" - dependencies: - "@types/ms": "npm:*" - checksum: 10c0/5dcd465edbb5a7f226e9a5efd1f399c6172407ef5840686b73e3608ce135eeca54ae8037dcd9f16bdb2768ac74925b820a8b9ecc588a58ca09eca6acabe33e2f - languageName: node - linkType: hard - -"@types/deep-eql@npm:*": - version: 4.0.2 - resolution: "@types/deep-eql@npm:4.0.2" - checksum: 10c0/bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 - languageName: node - linkType: hard - -"@types/estree-jsx@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/estree-jsx@npm:1.0.5" - dependencies: - "@types/estree": "npm:*" - checksum: 10c0/07b354331516428b27a3ab99ee397547d47eb223c34053b48f84872fafb841770834b90cc1a0068398e7c7ccb15ec51ab00ec64b31dc5e3dbefd624638a35c6d - languageName: node - linkType: hard - -"@types/estree@npm:*, @types/estree@npm:^1.0.0": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a - languageName: node - linkType: hard - -"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.6": - version: 1.0.8 - resolution: "@types/estree@npm:1.0.8" - checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 - languageName: node - linkType: hard - -"@types/estree@npm:^1.0.8": - version: 1.0.9 - resolution: "@types/estree@npm:1.0.9" - checksum: 10c0/3ad3286ca2988cd550dafb8f2ad599c8474868e954fa601a36655bdfefd8039f7c714b8c1c7f2ae219ffbd58bd4660e66fa7479a0120fc02d4777057d4865387 - languageName: node - linkType: hard - -"@types/express-serve-static-core@npm:^5.0.0": - version: 5.0.6 - resolution: "@types/express-serve-static-core@npm:5.0.6" - dependencies: - "@types/node": "npm:*" - "@types/qs": "npm:*" - "@types/range-parser": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/aced8cc88c1718adbbd1fc488756b0f22d763368d9eff2ae21b350698fab4a77d8d13c3699056dc662a887e43a8b67a3e8f6289ff76102ecc6bad4a7710d31a6 - languageName: node - linkType: hard - -"@types/express@npm:^5.0.0": - version: 5.0.1 - resolution: "@types/express@npm:5.0.1" - dependencies: - "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^5.0.0" - "@types/serve-static": "npm:*" - checksum: 10c0/e1385028c7251360ce916aab0e304187b613ca18cb9aa3fa90794a337e5b2e0c76330d467f41d3b3e936ce5336c4f3e63e323dc01192cf20f9686905daa6d00a - languageName: node - linkType: hard - -"@types/geojson@npm:*": - version: 7946.0.16 - resolution: "@types/geojson@npm:7946.0.16" - checksum: 10c0/1ff24a288bd5860b766b073ead337d31d73bdc715e5b50a2cee5cb0af57a1ed02cc04ef295f5fa68dc40fe3e4f104dd31282b2b818a5ba3231bc1001ba084e3c - languageName: node - linkType: hard - -"@types/glob-to-regexp@npm:^0.4.4": - version: 0.4.4 - resolution: "@types/glob-to-regexp@npm:0.4.4" - checksum: 10c0/7288ff853850d8302a8770a3698b187fc3970ad12ee6427f0b3758a3e7a0ebb0bd993abc6ebaaa979d09695b4194157d2bfaa7601b0fb9ed72c688b4c1298b88 - languageName: node - linkType: hard - -"@types/hast@npm:^3.0.0, @types/hast@npm:^3.0.4": - version: 3.0.4 - resolution: "@types/hast@npm:3.0.4" - dependencies: - "@types/unist": "npm:*" - checksum: 10c0/3249781a511b38f1d330fd1e3344eed3c4e7ea8eff82e835d35da78e637480d36fad37a78be5a7aed8465d237ad0446abc1150859d0fde395354ea634decf9f7 - languageName: node - linkType: hard - -"@types/http-errors@npm:*": - version: 2.0.4 - resolution: "@types/http-errors@npm:2.0.4" - checksum: 10c0/494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 - languageName: node - linkType: hard - -"@types/jasmine@npm:^3.6.3": - version: 3.10.18 - resolution: "@types/jasmine@npm:3.10.18" - checksum: 10c0/09914c65b09cb90536debd21c90000b27a26b730881d45e32c5c19cd429cdcf7407cf27dad2b11a5319bbba7e7e6d756b4a6f1f3c854b691bd1f0ac4f4ea1226 - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.8": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db - languageName: node - linkType: hard - -"@types/json5@npm:^0.0.29": - version: 0.0.29 - resolution: "@types/json5@npm:0.0.29" - checksum: 10c0/6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac - languageName: node - linkType: hard - -"@types/lodash@npm:^4.17.7": - version: 4.17.16 - resolution: "@types/lodash@npm:4.17.16" - checksum: 10c0/cf017901b8ab1d7aabc86d5189d9288f4f99f19a75caf020c0e2c77b8d4cead4db0d0b842d009b029339f92399f49f34377dd7c2721053388f251778b4c23534 - languageName: node - linkType: hard - -"@types/mdast@npm:^4.0.0": - version: 4.0.4 - resolution: "@types/mdast@npm:4.0.4" - dependencies: - "@types/unist": "npm:*" - checksum: 10c0/84f403dbe582ee508fd9c7643ac781ad8597fcbfc9ccb8d4715a2c92e4545e5772cbd0dbdf18eda65789386d81b009967fdef01b24faf6640f817287f54d9c82 - languageName: node - linkType: hard - -"@types/micromatch@npm:^4.0.9": - version: 4.0.9 - resolution: "@types/micromatch@npm:4.0.9" - dependencies: - "@types/braces": "npm:*" - checksum: 10c0/b13d7594b4320f20729f20156c51e957d79deb15083f98a736689cd0d3e4ba83b5d125959f6edf65270a6b6db90db9cebef8168d88e1c4eedc9a18aecc0234a3 - languageName: node - linkType: hard - -"@types/mime@npm:^1": - version: 1.3.5 - resolution: "@types/mime@npm:1.3.5" - checksum: 10c0/c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc - languageName: node - linkType: hard - -"@types/ms@npm:*": - version: 2.1.0 - resolution: "@types/ms@npm:2.1.0" - checksum: 10c0/5ce692ffe1549e1b827d99ef8ff71187457e0eb44adbae38fdf7b9a74bae8d20642ee963c14516db1d35fa2652e65f47680fdf679dcbde52bbfadd021f497225 - languageName: node - linkType: hard - -"@types/mute-stream@npm:^0.0.4": - version: 0.0.4 - resolution: "@types/mute-stream@npm:0.0.4" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/944730fd7b398c5078de3c3d4d0afeec8584283bc694da1803fdfca14149ea385e18b1b774326f1601baf53898ce6d121a952c51eb62d188ef6fcc41f725c0dc - languageName: node - linkType: hard - -"@types/node-fetch@npm:^2.6.4": - version: 2.6.12 - resolution: "@types/node-fetch@npm:2.6.12" - dependencies: - "@types/node": "npm:*" - form-data: "npm:^4.0.0" - checksum: 10c0/7693acad5499b7df2d1727d46cff092a63896dc04645f36b973dd6dd754a59a7faba76fcb777bdaa35d80625c6a9dd7257cca9c401a4bab03b04480cda7fd1af - languageName: node - linkType: hard - -"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:^22.7.5": - version: 22.13.11 - resolution: "@types/node@npm:22.13.11" - dependencies: - undici-types: "npm:~6.20.0" - checksum: 10c0/f6ee33d36372242535c38640fe7550a6640d8a775ec19b55bfc11775b521cba072d892ca92a912332ce01b317293d645c1bf767f3f882ec719f2404a3d2a5b96 - languageName: node - linkType: hard - -"@types/node@npm:>=13.7.0": - version: 24.9.2 - resolution: "@types/node@npm:24.9.2" - dependencies: - undici-types: "npm:~7.16.0" - checksum: 10c0/7905d43f65cee72ef475fe76316e10bbf6ac5d08a7f0f6c38f2b6285d7ca3009e8fcafc8f8a1d2bf3f55889c9c278dbb203a9081fd0cf2d6d62161703924c6fa - languageName: node - linkType: hard - -"@types/node@npm:^18.11.18": - version: 18.19.100 - resolution: "@types/node@npm:18.19.100" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 10c0/5524303171eee6788df45d736f5783b5bea27803a596b9cd5669f45487a619e5d8d41d56dd55b8c85c677ffd7c045edd8daea8c4b37e70290bee2a482fc605f6 - languageName: node - linkType: hard - -"@types/node@npm:^20": - version: 20.17.25 - resolution: "@types/node@npm:20.17.25" - dependencies: - undici-types: "npm:~6.19.2" - checksum: 10c0/9c9267ab1c4c4964a6d59076fa495321bbe69f36c4f4e95664c08f2712f401aa082fd41abfdd20d81df62377ce22f71f6de430af3f475f8a4de807b716480e08 - languageName: node - linkType: hard - -"@types/node@npm:^20.14.9": - version: 20.19.41 - resolution: "@types/node@npm:20.19.41" - dependencies: - undici-types: "npm:~6.21.0" - checksum: 10c0/aa2a07317bbd700bea68d5784b403a738dbcebadbe2d8ef05649f7953065120d5d37f7edfdd7881df3a3bd15328c8a4dc46fdd69732ab540d552c505378c585b - languageName: node - linkType: hard - -"@types/node@npm:^20.17.9": - version: 20.19.37 - resolution: "@types/node@npm:20.19.37" - dependencies: - undici-types: "npm:~6.21.0" - checksum: 10c0/8420353aee776ae5c1e9720058949909a0e908fa2af85501e9db2645bb9f9acd7d767890f8aaee34d375e6f8b5f550a9a169e908d2d8cf7d5daf63dce64092a0 - languageName: node - linkType: hard - -"@types/node@npm:^20.19.43": - version: 20.19.43 - resolution: "@types/node@npm:20.19.43" - dependencies: - undici-types: "npm:~6.21.0" - checksum: 10c0/9bcec3b5295bdd77ff0b44a528a69f7e22028c347507ba2c69be47ec84e30299f45043b222e9c86c510e138c9c53b2419dd5cd34920602a4a5a381c288075318 - languageName: node - linkType: hard - -"@types/nodemailer@npm:^6.4.17": - version: 6.4.17 - resolution: "@types/nodemailer@npm:6.4.17" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/689abb3005cf36cf89c2abe56f0aa4469a37e0814633a73fbeb35732e856f4b0d7ab32b6d91585038b6941f5b70db58ec2bd147ebe9f73e528eb6c99604f4e82 - languageName: node - linkType: hard - -"@types/parse-path@npm:^7.0.0": - version: 7.0.3 - resolution: "@types/parse-path@npm:7.0.3" - checksum: 10c0/8344b6c7acba4e4e5a8d542f56f53c297685fa92f9b0c085d7532cc7e1b661432cecfc1c75c76cdb0d161c95679b6ecfe0573d9fef7c836962aacf604150a984 - languageName: node - linkType: hard - -"@types/psl@npm:^1.1.3": - version: 1.1.3 - resolution: "@types/psl@npm:1.1.3" - checksum: 10c0/8719bac618613a2f47d4d2088742c2c01c00fd8d6fe92a3ed474aad83f7199ff53c813d8eee678768d816b02fc94c6e1f0cb4bce2e512efd0bcb3af2524ae5a6 - languageName: node - linkType: hard - -"@types/qs@npm:*": - version: 6.9.18 - resolution: "@types/qs@npm:6.9.18" - checksum: 10c0/790b9091348e06dde2c8e4118b5771ab386a8c22a952139a2eb0675360a2070d0b155663bf6f75b23f258fd0a1f7ffc0ba0f059d99a719332c03c40d9e9cd63b - languageName: node - linkType: hard - -"@types/range-parser@npm:*": - version: 1.2.7 - resolution: "@types/range-parser@npm:1.2.7" - checksum: 10c0/361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c - languageName: node - linkType: hard - -"@types/react-dom@npm:19.2.3": - version: 19.2.3 - resolution: "@types/react-dom@npm:19.2.3" - peerDependencies: - "@types/react": ^19.2.0 - checksum: 10c0/b486ebe0f4e2fb35e2e108df1d8fc0927ca5d6002d5771e8a739de11239fe62d0e207c50886185253c99eb9dedfeeb956ea7429e5ba17f6693c7acb4c02f8cd1 - languageName: node - linkType: hard - -"@types/react-reconciler@npm:^0.28.9": - version: 0.28.9 - resolution: "@types/react-reconciler@npm:0.28.9" - peerDependencies: - "@types/react": "*" - checksum: 10c0/9fe71fa856aab2cd4742fe0416bdd4f5c82ecc05ef6451ee7fcb65a5efdf5fa588f5820fbe2a665b15371b0da3bfc4097f28bb6d450b9a834af2d0fc00f403bd - languageName: node - linkType: hard - -"@types/react@npm:19.2.14": - version: 19.2.14 - resolution: "@types/react@npm:19.2.14" - dependencies: - csstype: "npm:^3.2.2" - checksum: 10c0/7d25bf41b57719452d86d2ac0570b659210402707313a36ee612666bf11275a1c69824f8c3ee1fdca077ccfe15452f6da8f1224529b917050eb2d861e52b59b7 - languageName: node - linkType: hard - -"@types/readline-sync@npm:^1.4.8": - version: 1.4.8 - resolution: "@types/readline-sync@npm:1.4.8" - checksum: 10c0/08da90bbc4905f42eea2f7e03253f86b8060e93dbd427cc2ef5ebc0955248088c85e1638dd480ce28e2e576624979a81e12d1371d2c38e1796002ca8efbc719f - languageName: node - linkType: hard - -"@types/retry@npm:0.12.0": - version: 0.12.0 - resolution: "@types/retry@npm:0.12.0" - checksum: 10c0/7c5c9086369826f569b83a4683661557cab1361bac0897a1cefa1a915ff739acd10ca0d62b01071046fe3f5a3f7f2aec80785fe283b75602dc6726781ea3e328 - languageName: node - linkType: hard - -"@types/send@npm:*": - version: 0.17.4 - resolution: "@types/send@npm:0.17.4" - dependencies: - "@types/mime": "npm:^1" - "@types/node": "npm:*" - checksum: 10c0/7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c - languageName: node - linkType: hard - -"@types/serve-static@npm:*": - version: 1.15.7 - resolution: "@types/serve-static@npm:1.15.7" - dependencies: - "@types/http-errors": "npm:*" - "@types/node": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/26ec864d3a626ea627f8b09c122b623499d2221bbf2f470127f4c9ebfe92bd8a6bb5157001372d4c4bd0dd37a1691620217d9dc4df5aa8f779f3fd996b1c60ae - languageName: node - linkType: hard - -"@types/stack-trace@npm:^0.0.33": - version: 0.0.33 - resolution: "@types/stack-trace@npm:0.0.33" - checksum: 10c0/cc8345f042f5de17f960652974d67aac71bf864b748f3efbd10a8c5315c0a7a8a13ab17931c239b9fe6b531a44378347509dc8a97a24dfa1247b93af3f943650 - languageName: node - linkType: hard - -"@types/triple-beam@npm:^1.3.2": - version: 1.3.5 - resolution: "@types/triple-beam@npm:1.3.5" - checksum: 10c0/d5d7f25da612f6d79266f4f1bb9c1ef8f1684e9f60abab251e1261170631062b656ba26ff22631f2760caeafd372abc41e64867cde27fba54fafb73a35b9056a - languageName: node - linkType: hard - -"@types/trusted-types@npm:^2.0.7": - version: 2.0.7 - resolution: "@types/trusted-types@npm:2.0.7" - checksum: 10c0/4c4855f10de7c6c135e0d32ce462419d8abbbc33713b31d294596c0cc34ae1fa6112a2f9da729c8f7a20707782b0d69da3b1f8df6645b0366d08825ca1522e0c - languageName: node - linkType: hard - -"@types/unist@npm:*, @types/unist@npm:^3.0.0": - version: 3.0.3 - resolution: "@types/unist@npm:3.0.3" - checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60 - languageName: node - linkType: hard - -"@types/unist@npm:^2.0.0": - version: 2.0.11 - resolution: "@types/unist@npm:2.0.11" - checksum: 10c0/24dcdf25a168f453bb70298145eb043cfdbb82472db0bc0b56d6d51cd2e484b9ed8271d4ac93000a80da568f2402e9339723db262d0869e2bf13bc58e081768d - languageName: node - linkType: hard - -"@types/wrap-ansi@npm:^3.0.0": - version: 3.0.0 - resolution: "@types/wrap-ansi@npm:3.0.0" - checksum: 10c0/8d8f53363f360f38135301a06b596c295433ad01debd082078c33c6ed98b05a5c8fe8853a88265432126096084f4a135ec1564e3daad631b83296905509f90b3 - languageName: node - linkType: hard - -"@types/ws@npm:^8.5.12": - version: 8.18.1 - resolution: "@types/ws@npm:8.18.1" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/61aff1129143fcc4312f083bc9e9e168aa3026b7dd6e70796276dcfb2c8211c4292603f9c4864fae702f2ed86e4abd4d38aa421831c2fd7f856c931a481afbab - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:8.56.1": - version: 8.56.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.56.1" - dependencies: - "@eslint-community/regexpp": "npm:^4.12.2" - "@typescript-eslint/scope-manager": "npm:8.56.1" - "@typescript-eslint/type-utils": "npm:8.56.1" - "@typescript-eslint/utils": "npm:8.56.1" - "@typescript-eslint/visitor-keys": "npm:8.56.1" - ignore: "npm:^7.0.5" - natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.4.0" - peerDependencies: - "@typescript-eslint/parser": ^8.56.1 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/8a97e777792ee3e25078884ba0a04f6732367779c9487abcdc5a2d65b224515fa6a0cf1fac1aafc52fb30f3af97f2e1c9949aadbd6ca74a0165691f95494a721 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^8.40.0": - version: 8.40.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.40.0" - dependencies: - "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.40.0" - "@typescript-eslint/type-utils": "npm:8.40.0" - "@typescript-eslint/utils": "npm:8.40.0" - "@typescript-eslint/visitor-keys": "npm:8.40.0" - graphemer: "npm:^1.4.0" - ignore: "npm:^7.0.0" - natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.1.0" - peerDependencies: - "@typescript-eslint/parser": ^8.40.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/dc8889c3255bce6956432f099059179dd13826ba29670f81ba9238ecde46764ee63459eb73a7d88f4f30e1144a2f000d79c9e3f256fa759689d9b3b74d423bda - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:8.56.1": - version: 8.56.1 - resolution: "@typescript-eslint/parser@npm:8.56.1" - dependencies: - "@typescript-eslint/scope-manager": "npm:8.56.1" - "@typescript-eslint/types": "npm:8.56.1" - "@typescript-eslint/typescript-estree": "npm:8.56.1" - "@typescript-eslint/visitor-keys": "npm:8.56.1" - debug: "npm:^4.4.3" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/61c9dab481e795b01835c00c9c7c845f1d7ea7faf3b8657fccee0f8658a65390cb5fe2b5230ae8c4241bd6e0c32aa9455a91989a492bd3bd6fec7c7d9339377a - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^8.40.0": - version: 8.40.0 - resolution: "@typescript-eslint/parser@npm:8.40.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:8.40.0" - "@typescript-eslint/types": "npm:8.40.0" - "@typescript-eslint/typescript-estree": "npm:8.40.0" - "@typescript-eslint/visitor-keys": "npm:8.40.0" - debug: "npm:^4.3.4" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/43ca9589b8a1f3f4b30a214c0e2254fa0ad43458ef1258b1d62c5aad52710ad11b9315b124cda79163274147b82201a5d76fab7de413e34bfe8e377142b71e98 - languageName: node - linkType: hard - -"@typescript-eslint/project-service@npm:8.40.0": - version: 8.40.0 - resolution: "@typescript-eslint/project-service@npm:8.40.0" - dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.40.0" - "@typescript-eslint/types": "npm:^8.40.0" - debug: "npm:^4.3.4" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/23d62e9ada9750136d0251f268bbe1f9784442ef258bb340a2e1e866749d8076730a14749d9a320d94d7c76df2d108caf21fe35e5dc100385f04be846dc979cb - languageName: node - linkType: hard - -"@typescript-eslint/project-service@npm:8.56.1": - version: 8.56.1 - resolution: "@typescript-eslint/project-service@npm:8.56.1" - dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.56.1" - "@typescript-eslint/types": "npm:^8.56.1" - debug: "npm:^4.4.3" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/ca61cde575233bc79046d73ddd330d183fb3cbb941fddc31919336317cda39885c59296e2e5401b03d9325a64a629e842fd66865705ff0d85d83ee3ee40871e8 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/scope-manager@npm:8.32.1" - dependencies: - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/visitor-keys": "npm:8.32.1" - checksum: 10c0/d2cb1f7736388972137d6e510b2beae4bac033fcab274e04de90ebba3ce466c71fe47f1795357e032e4a6c8b2162016b51b58210916c37212242c82d35352e9f - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.40.0": - version: 8.40.0 - resolution: "@typescript-eslint/scope-manager@npm:8.40.0" - dependencies: - "@typescript-eslint/types": "npm:8.40.0" - "@typescript-eslint/visitor-keys": "npm:8.40.0" - checksum: 10c0/48af81f9cdcec466994d290561e8d2fa3f6b156a898b71dd0e65633c896543b44729c5353596e84de2ae61bfd20e1398c3309cdfe86714a9663fd5aded4c9cd0 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.56.1": - version: 8.56.1 - resolution: "@typescript-eslint/scope-manager@npm:8.56.1" - dependencies: - "@typescript-eslint/types": "npm:8.56.1" - "@typescript-eslint/visitor-keys": "npm:8.56.1" - checksum: 10c0/89cc1af2635eee23f2aa2ff87c08f88f3ad972ebf67eaacdc604a4ef4178535682bad73fd086e6f3c542e4e5d874253349af10d58291d079cc29c6c7e9831de4 - languageName: node - linkType: hard - -"@typescript-eslint/tsconfig-utils@npm:8.40.0, @typescript-eslint/tsconfig-utils@npm:^8.40.0": - version: 8.40.0 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.40.0" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/c2366dcd802901d5cd4f59fc4eab7a00ed119aa4591ba59c507fe495d9af4cfca19431a603602ea675e4c861962230d1c2f100896903750cd1fcfc134702a7d0 - languageName: node - linkType: hard - -"@typescript-eslint/tsconfig-utils@npm:8.56.1, @typescript-eslint/tsconfig-utils@npm:^8.56.1": - version: 8.56.1 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.56.1" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/d03b64d7ff19020beeefa493ae667c2e67a4547d25a3ecb9210a3a52afe980c093d772a91014bae699ee148bfb60cc659479e02bfc2946ea06954a8478ef1fe1 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:8.40.0": - version: 8.40.0 - resolution: "@typescript-eslint/type-utils@npm:8.40.0" - dependencies: - "@typescript-eslint/types": "npm:8.40.0" - "@typescript-eslint/typescript-estree": "npm:8.40.0" - "@typescript-eslint/utils": "npm:8.40.0" - debug: "npm:^4.3.4" - ts-api-utils: "npm:^2.1.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/660b77d801b2538a4ccb65065269ad0e8370d0be985172b5ecb067f3eea22e64aa8af9e981b31bf2a34002339fe3253b09b55d181ce6d8242fc7daa80ac4aaca - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:8.56.1": - version: 8.56.1 - resolution: "@typescript-eslint/type-utils@npm:8.56.1" - dependencies: - "@typescript-eslint/types": "npm:8.56.1" - "@typescript-eslint/typescript-estree": "npm:8.56.1" - "@typescript-eslint/utils": "npm:8.56.1" - debug: "npm:^4.4.3" - ts-api-utils: "npm:^2.4.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/66517aed5059ef4a29605d06a510582f934d5789ae40ad673f1f0421f8aa13ec9ba7b8caab57ae9f270afacbf13ec5359cedfe74f21ae77e9a2364929f7e7cee - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/types@npm:8.32.1" - checksum: 10c0/86f59b29c12e7e8abe45a1659b6fae5e7b0cfaf09ab86dd596ed9d468aa61082bbccd509d25f769b197fbfdf872bbef0b323a2ded6ceaca351f7c679f1ba3bd3 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.40.0, @typescript-eslint/types@npm:^8.40.0": - version: 8.40.0 - resolution: "@typescript-eslint/types@npm:8.40.0" - checksum: 10c0/225374fff36d59288a5780667a7a1316c75090d5d60b70a8035ac18786120333ccd08dfdf0e05e30d5a82217e44c57b8708b769dd1eed89f12f2ac4d3a769f76 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.56.1, @typescript-eslint/types@npm:^8.56.1": - version: 8.56.1 - resolution: "@typescript-eslint/types@npm:8.56.1" - checksum: 10c0/e5a0318abddf0c4f98da3039cb10b3c0601c8601f7a9f7043630f0d622dabfe83a4cd833545ad3531fc846e46ca2874377277b392c2490dffec279d9242d827b - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.32.1" - dependencies: - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/visitor-keys": "npm:8.32.1" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^2.1.0" - peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/b5ae0d91ef1b46c9f3852741e26b7a14c28bb58ee8a283b9530ac484332ca58a7216b9d22eda23c5449b5fd69c6e4601ef3ebbd68e746816ae78269036c08cda - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.40.0": - version: 8.40.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.40.0" - dependencies: - "@typescript-eslint/project-service": "npm:8.40.0" - "@typescript-eslint/tsconfig-utils": "npm:8.40.0" - "@typescript-eslint/types": "npm:8.40.0" - "@typescript-eslint/visitor-keys": "npm:8.40.0" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^2.1.0" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/6c1ffc17947cb36cbd987cf9705f85223ed1cce584b5244840e36a2b8480861f4dfdb0312f96afbc12e7d1ba586005f0d959042baa0a96a1913ac7ace8e8f6d4 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.56.1": - version: 8.56.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.56.1" - dependencies: - "@typescript-eslint/project-service": "npm:8.56.1" - "@typescript-eslint/tsconfig-utils": "npm:8.56.1" - "@typescript-eslint/types": "npm:8.56.1" - "@typescript-eslint/visitor-keys": "npm:8.56.1" - debug: "npm:^4.4.3" - minimatch: "npm:^10.2.2" - semver: "npm:^7.7.3" - tinyglobby: "npm:^0.2.15" - ts-api-utils: "npm:^2.4.0" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/92f4421dac41be289761200dc2ed85974fa451deacb09490ae1870a25b71b97218e609a90d4addba9ded5b2abdebc265c9db7f6e9ce6d29ed20e89b8487e9618 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:8.40.0": - version: 8.40.0 - resolution: "@typescript-eslint/utils@npm:8.40.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.40.0" - "@typescript-eslint/types": "npm:8.40.0" - "@typescript-eslint/typescript-estree": "npm:8.40.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/6b3858b8725083fe7db7fb9bcbde930e758a6ba8ddedd1ed27d828fc1cbe04f54b774ef9144602f8eeaafeea9b19b4fd4c46fdad52a10ade99e6b282c7d0df92 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:8.56.1": - version: 8.56.1 - resolution: "@typescript-eslint/utils@npm:8.56.1" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.9.1" - "@typescript-eslint/scope-manager": "npm:8.56.1" - "@typescript-eslint/types": "npm:8.56.1" - "@typescript-eslint/typescript-estree": "npm:8.56.1" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/d9ffd9b2944a2c425e0532f71dc61e61d0a923d1a17733cf2777c2a4ae638307d12d44f63b33b6b3dc62f02f47db93ec49344ecefe17b76ee3e4fb0833325be3 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:^8.18.1": - version: 8.32.1 - resolution: "@typescript-eslint/utils@npm:8.32.1" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.32.1" - "@typescript-eslint/types": "npm:8.32.1" - "@typescript-eslint/typescript-estree": "npm:8.32.1" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/a2b90c0417cd3a33c6e22f9cc28c356f251bb8928ef1d25e057feda007d522d281bdc37a9a0d05b70312f00a7b3f350ca06e724867025ea85bba5a4c766732e7 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.32.1": - version: 8.32.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.32.1" - dependencies: - "@typescript-eslint/types": "npm:8.32.1" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/9c05053dfd048f681eb96e09ceefa8841a617b8b5950eea05e0844b38fe3510a284eb936324caa899c3ceb4bc23efe56ac01437fab378ac1beeb1c6c00404978 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.40.0": - version: 8.40.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.40.0" - dependencies: - "@typescript-eslint/types": "npm:8.40.0" - eslint-visitor-keys: "npm:^4.2.1" - checksum: 10c0/592f1c8c2d3da43a7f74f8ead14f05fafc2e4609d5df36811cf92ead5dc94f6f669556a494048e4746cb3774c60bc52a8c83d75369d5e196778d935c70e7d3a1 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.56.1": - version: 8.56.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.56.1" - dependencies: - "@typescript-eslint/types": "npm:8.56.1" - eslint-visitor-keys: "npm:^5.0.0" - checksum: 10c0/86d97905dec1af964cc177c185933d040449acf6006096497f2e0093c6a53eb92b3ac1db9eb40a5a2e8d91160f558c9734331a9280797f09f284c38978b22190 - languageName: node - linkType: hard - -"@uidotdev/usehooks@npm:^2.4.1": - version: 2.4.1 - resolution: "@uidotdev/usehooks@npm:2.4.1" - peerDependencies: - react: ">=18.0.0" - react-dom: ">=18.0.0" - checksum: 10c0/181c43fb324dbe4fef9762c61ab4b8235efa48abedf39a9bfeab65872522c43dae789c4f85b82a1164ed7bb18ae7ff25c3a19e7c4e0eb944937ac7f8109cee9b - languageName: node - linkType: hard - -"@uiw/codemirror-extensions-basic-setup@npm:4.23.10": - version: 4.23.10 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.23.10" - dependencies: - "@codemirror/autocomplete": "npm:^6.0.0" - "@codemirror/commands": "npm:^6.0.0" - "@codemirror/language": "npm:^6.0.0" - "@codemirror/lint": "npm:^6.0.0" - "@codemirror/search": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.0.0" - peerDependencies: - "@codemirror/autocomplete": ">=6.0.0" - "@codemirror/commands": ">=6.0.0" - "@codemirror/language": ">=6.0.0" - "@codemirror/lint": ">=6.0.0" - "@codemirror/search": ">=6.0.0" - "@codemirror/state": ">=6.0.0" - "@codemirror/view": ">=6.0.0" - checksum: 10c0/64c233857b1bf878bf630297b1d4b3df14e13761ff38ceccf7a1fa21d521be288311333b7cbff927889f9a899848f4fccefd975ea5fa8d626ea4aef088f13ee8 - languageName: node - linkType: hard - -"@uiw/codemirror-themes@npm:^4.23.6": - version: 4.23.10 - resolution: "@uiw/codemirror-themes@npm:4.23.10" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.0.0" - peerDependencies: - "@codemirror/language": ">=6.0.0" - "@codemirror/state": ">=6.0.0" - "@codemirror/view": ">=6.0.0" - checksum: 10c0/29f980789a535ae021ca8d8bec3ecee4dda8cb11c5451729c04481310cc04cd7c00ddb3011137f5cc305d565bc0a3464ebd88fdde9359e296d8f0a6cf6477811 - languageName: node - linkType: hard - -"@uiw/react-codemirror@npm:^4.23.0": - version: 4.23.10 - resolution: "@uiw/react-codemirror@npm:4.23.10" - dependencies: - "@babel/runtime": "npm:^7.18.6" - "@codemirror/commands": "npm:^6.1.0" - "@codemirror/state": "npm:^6.1.1" - "@codemirror/theme-one-dark": "npm:^6.0.0" - "@uiw/codemirror-extensions-basic-setup": "npm:4.23.10" - codemirror: "npm:^6.0.0" - peerDependencies: - "@babel/runtime": ">=7.11.0" - "@codemirror/state": ">=6.0.0" - "@codemirror/theme-one-dark": ">=6.0.0" - "@codemirror/view": ">=6.0.0" - codemirror: ">=6.0.0" - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: 10c0/cbcb928c84df2a6a03fd7789a3db317f6358961fd96197d2a3edb3ffbb00deff1cfa05fa1494c849393784bb89ae3f41425982f609f73bad0855a5e6522c328d - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.0.0": - version: 1.3.0 - resolution: "@ungap/structured-clone@npm:1.3.0" - checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-darwin-arm64@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-darwin-arm64@npm:1.2.2" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-darwin-x64@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-darwin-x64@npm:1.2.2" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-freebsd-x64@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-freebsd-x64@npm:1.2.2" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-linux-arm-gnueabihf@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-linux-arm-gnueabihf@npm:1.2.2" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-linux-arm64-gnu@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-linux-arm64-gnu@npm:1.2.2" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-linux-arm64-musl@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-linux-arm64-musl@npm:1.2.2" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-linux-x64-gnu@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-linux-x64-gnu@npm:1.2.2" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-linux-x64-musl@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-linux-x64-musl@npm:1.2.2" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-wasm32-wasi@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-wasm32-wasi@npm:1.2.2" - dependencies: - "@napi-rs/wasm-runtime": "npm:^0.2.7" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-win32-arm64-msvc@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-win32-arm64-msvc@npm:1.2.2" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@unrs/rspack-resolver-binding-win32-x64-msvc@npm:1.2.2": - version: 1.2.2 - resolution: "@unrs/rspack-resolver-binding-win32-x64-msvc@npm:1.2.2" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@upsetjs/venn.js@npm:^2.0.0": - version: 2.0.0 - resolution: "@upsetjs/venn.js@npm:2.0.0" - dependencies: - d3-selection: "npm:^3.0.0" - d3-transition: "npm:^3.0.1" - dependenciesMeta: - d3-selection: - optional: true - d3-transition: - optional: true - checksum: 10c0/b12014d94708ab4df7f5a4b6205c6f23ff235cca2ffe91df3314862b109b826e52f9020c2a2f7527d3712d21c578d6db9cdb60ce46a528739cc18e58d111f724 - languageName: node - linkType: hard - -"@vercel/oidc@npm:3.1.0": - version: 3.1.0 - resolution: "@vercel/oidc@npm:3.1.0" - checksum: 10c0/f57278ed4b4c022c7ca85e8baa5f9bdb2623397abfa0e5dbfd75de283c8e5dc534d64dac1364b5ad8c96d00eb2d469886e6f7b640f6f195def5766950ad8ce71 - languageName: node - linkType: hard - -"@vitest/expect@npm:4.1.11": - version: 4.1.11 - resolution: "@vitest/expect@npm:4.1.11" - dependencies: - "@standard-schema/spec": "npm:^1.1.0" - "@types/chai": "npm:^5.2.2" - "@vitest/spy": "npm:4.1.11" - "@vitest/utils": "npm:4.1.11" - chai: "npm:^6.2.2" - tinyrainbow: "npm:^3.1.0" - checksum: 10c0/0aa5e0973aca93a58cbdc3041c6bfed5897e976124965203b96a23b811f4ca403590c7eb15802c8d8366ec27a1db0682451e8a91c4d06617636de262baf86e4b - languageName: node - linkType: hard - -"@vitest/mocker@npm:4.1.11": - version: 4.1.11 - resolution: "@vitest/mocker@npm:4.1.11" - dependencies: - "@vitest/spy": "npm:4.1.11" - estree-walker: "npm:^3.0.3" - magic-string: "npm:^0.30.21" - peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - checksum: 10c0/3111ea34bd5046f6c70bbd67cf8b89608ee8c41cb27ab2bd61d42f4b68810e9ea16a9a757a71bc254c105f73b407d00ebb6bab1ab0f7f5cdcc9d7d16602a3933 - languageName: node - linkType: hard - -"@vitest/pretty-format@npm:4.1.11": - version: 4.1.11 - resolution: "@vitest/pretty-format@npm:4.1.11" - dependencies: - tinyrainbow: "npm:^3.1.0" - checksum: 10c0/ad32525c73807c0b72f38dc29bc51fd5a17879dc650f37995a9c5adbb8526e15f787691f76aa8768448ec7ed5bf5ba2b12329eac8fda1428b4d6b8c036390f71 - languageName: node - linkType: hard - -"@vitest/runner@npm:4.1.11": - version: 4.1.11 - resolution: "@vitest/runner@npm:4.1.11" - dependencies: - "@vitest/utils": "npm:4.1.11" - pathe: "npm:^2.0.3" - checksum: 10c0/3c782b055e9e688e1785f7c8937bd1669bad1b0e5758cb8b844f918f30a324b1d21e174d46c941ce80ebf37f2b89b55b6d619a675025914a1ece6377b95909e2 - languageName: node - linkType: hard - -"@vitest/snapshot@npm:4.1.11": - version: 4.1.11 - resolution: "@vitest/snapshot@npm:4.1.11" - dependencies: - "@vitest/pretty-format": "npm:4.1.11" - "@vitest/utils": "npm:4.1.11" - magic-string: "npm:^0.30.21" - pathe: "npm:^2.0.3" - checksum: 10c0/35d82a7c2a3e4b57529c30387d568d9106b6bf960189214e5d8cb1f5288cb042305c2e5c7b0b2f8cb56a2c814973de0310bc56d72deb79427bea272b6224190c - languageName: node - linkType: hard - -"@vitest/spy@npm:4.1.11": - version: 4.1.11 - resolution: "@vitest/spy@npm:4.1.11" - checksum: 10c0/06c68247a8efd21006abe7532fee17f30ba83c8cda3e0b952ef89e278d58058f4b1de69b6bbaa2ed614c568bf4f5769fcc76be42802dedf2bcdd9c0aae601740 - languageName: node - linkType: hard - -"@vitest/utils@npm:4.1.11": - version: 4.1.11 - resolution: "@vitest/utils@npm:4.1.11" - dependencies: - "@vitest/pretty-format": "npm:4.1.11" - convert-source-map: "npm:^2.0.0" - tinyrainbow: "npm:^3.1.0" - checksum: 10c0/a2c1ddc64333458c3e031465c1ee0440a7660fd1b298c54ccbf865ef1e5cf3ebdd6c5c75a5ea235d8a672498b394e7121f992b096f021f45014ab25e9abd1b52 - languageName: node - linkType: hard - -"@viz-js/lang-dot@npm:^1.0.4": - version: 1.0.4 - resolution: "@viz-js/lang-dot@npm:1.0.4" - dependencies: - "@codemirror/language": "npm:^6.8.0" - "@lezer/common": "npm:^1.0.3" - "@lezer/highlight": "npm:^1.1.6" - "@lezer/xml": "npm:^1.0.2" - checksum: 10c0/8d7fb9a2d5c7e02da8e2122db5e4557231b9b353c9aa2db8ada137125a7175ae6df828c6449ba5b7bf48d68211e4b1b73ad42da2e8814da5d2723a0a6b200b49 - languageName: node - linkType: hard - -"@xiechao/codemirror-lang-handlebars@npm:^1.0.4": - version: 1.0.4 - resolution: "@xiechao/codemirror-lang-handlebars@npm:1.0.4" - dependencies: - "@codemirror/lang-html": "npm:^6.4.7" - "@codemirror/language": "npm:^6.0.0" - "@lezer/common": "npm:^1.2.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - codemirror: "npm:^6.0.1" - checksum: 10c0/f61bfac681194fecc0878a44a3276d44d8e18e38fdc39e2f49874b81c49a95169a5ddabda502c0e58b5faad067a45070c905992104880a5fb0d550383e0062ff - languageName: node - linkType: hard - -"abbrev@npm:^3.0.0": - version: 3.0.0 - resolution: "abbrev@npm:3.0.0" - checksum: 10c0/049704186396f571650eb7b22ed3627b77a5aedf98bb83caf2eac81ca2a3e25e795394b0464cfb2d6076df3db6a5312139eac5b6a126ca296ac53c5008069c28 - languageName: node - linkType: hard - -"abort-controller@npm:^3.0.0": - version: 3.0.0 - resolution: "abort-controller@npm:3.0.0" - dependencies: - event-target-shim: "npm:^5.0.0" - checksum: 10c0/90ccc50f010250152509a344eb2e71977fbf8db0ab8f1061197e3275ddf6c61a41a6edfd7b9409c664513131dd96e962065415325ef23efa5db931b382d24ca5 - languageName: node - linkType: hard - -"accepts@npm:^2.0.0": - version: 2.0.0 - resolution: "accepts@npm:2.0.0" - dependencies: - mime-types: "npm:^3.0.0" - negotiator: "npm:^1.0.0" - checksum: 10c0/98374742097e140891546076215f90c32644feacf652db48412329de4c2a529178a81aa500fbb13dd3e6cbf6e68d829037b123ac037fc9a08bcec4b87b358eef - languageName: node - linkType: hard - -"accepts@npm:~1.3.4, accepts@npm:~1.3.8": - version: 1.3.8 - resolution: "accepts@npm:1.3.8" - dependencies: - mime-types: "npm:~2.1.34" - negotiator: "npm:0.6.3" - checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 - languageName: node - linkType: hard - -"acorn-import-attributes@npm:^1.9.5": - version: 1.9.5 - resolution: "acorn-import-attributes@npm:1.9.5" - peerDependencies: - acorn: ^8 - checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 - languageName: node - linkType: hard - -"acorn@npm:^8.14.0": - version: 8.14.1 - resolution: "acorn@npm:8.14.1" - bin: - acorn: bin/acorn - checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 - languageName: node - linkType: hard - -"acorn@npm:^8.15.0": - version: 8.15.0 - resolution: "acorn@npm:8.15.0" - bin: - acorn: bin/acorn - checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec - languageName: node - linkType: hard - -"agent-base@npm:6": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: "npm:4" - checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 - languageName: node - linkType: hard - -"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.6.0 - resolution: "agentkeepalive@npm:4.6.0" - dependencies: - humanize-ms: "npm:^1.2.1" - checksum: 10c0/235c182432f75046835b05f239708107138a40103deee23b6a08caee5136873709155753b394ec212e49e60e94a378189562cb01347765515cff61b692c69187 - languageName: node - linkType: hard - -"aggregate-error@npm:^5.0.0": - version: 5.0.0 - resolution: "aggregate-error@npm:5.0.0" - dependencies: - clean-stack: "npm:^5.2.0" - indent-string: "npm:^5.0.0" - checksum: 10c0/a5de7138571f514bad76290736f49a0db8809247082f2519037e0c37d03fc8d91d733e079d6b1674feda28a757b1932421ad205b8c0f8794a0c0e5bf1be2315e - languageName: node - linkType: hard - -"ai@npm:6.0.167, ai@npm:^6.0.167": - version: 6.0.167 - resolution: "ai@npm:6.0.167" - dependencies: - "@ai-sdk/gateway": "npm:3.0.103" - "@ai-sdk/provider": "npm:3.0.8" - "@ai-sdk/provider-utils": "npm:4.0.23" - "@opentelemetry/api": "npm:1.9.0" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10c0/8a17c10e8b9e636e0c37cde921dfe92cf4eeb71e766a56b5ba5c2bde8e00f2a3897d395bc2bc09abdd8caa22dd4d6189a490d0a56762bfac04e043e843e9455d - languageName: node - linkType: hard - -"ajv-formats@npm:^3.0.1": - version: 3.0.1 - resolution: "ajv-formats@npm:3.0.1" - dependencies: - ajv: "npm:^8.0.0" - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/168d6bca1ea9f163b41c8147bae537e67bd963357a5488a1eaf3abe8baa8eec806d4e45f15b10767e6020679315c7e1e5e6803088dfb84efa2b4e9353b83dd0a - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 - languageName: node - linkType: hard - -"ajv@npm:^6.12.5, ajv@npm:^6.14.0": - version: 6.14.0 - resolution: "ajv@npm:6.14.0" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10c0/a2bc39b0555dc9802c899f86990eb8eed6e366cddbf65be43d5aa7e4f3c4e1a199d5460fd7ca4fb3d864000dbbc049253b72faa83b3b30e641ca52cb29a68c22 - languageName: node - linkType: hard - -"ajv@npm:^8.18.0": - version: 8.18.0 - resolution: "ajv@npm:8.18.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - fast-uri: "npm:^3.0.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - checksum: 10c0/e7517c426173513a07391be951879932bdf3348feaebd2199f5b901c20f99d60db8cd1591502d4d551dc82f594e82a05c4fe1c70139b15b8937f7afeaed9532f - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.3.2": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: "npm:^0.21.3" - checksum: 10c0/da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 - languageName: node - linkType: hard - -"ansi-escapes@npm:^7.0.0": - version: 7.3.0 - resolution: "ansi-escapes@npm:7.3.0" - dependencies: - environment: "npm:^1.0.0" - checksum: 10c0/068961d99f0ef28b661a4a9f84a5d645df93ccf3b9b93816cc7d46bbe1913321d4cdf156bb842a4e1e4583b7375c631fa963efb43001c4eb7ff9ab8f78fc0679 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc - languageName: node - linkType: hard - -"ansi-regex@npm:^6.2.2": - version: 6.2.2 - resolution: "ansi-regex@npm:6.2.2" - checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 - languageName: node - linkType: hard - -"ansi-styles@npm:^5.0.0": - version: 5.2.0 - resolution: "ansi-styles@npm:5.2.0" - checksum: 10c0/9c4ca80eb3c2fb7b33841c210d2f20807f40865d27008d7c3f707b7f95cab7d67462a565e2388ac3285b71cb3d9bb2173de8da37c57692a362885ec34d6e27df - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c - languageName: node - linkType: hard - -"any-promise@npm:^1.0.0": - version: 1.3.0 - resolution: "any-promise@npm:1.3.0" - checksum: 10c0/60f0298ed34c74fef50daab88e8dab786036ed5a7fad02e012ab57e376e0a0b4b29e83b95ea9b5e7d89df762f5f25119b83e00706ecaccb22cfbacee98d74889 - languageName: node - linkType: hard - -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: "npm:^3.0.0" - picomatch: "npm:^2.0.4" - checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac - languageName: node - linkType: hard - -"arg@npm:^5.0.2": - version: 5.0.2 - resolution: "arg@npm:5.0.2" - checksum: 10c0/ccaf86f4e05d342af6666c569f844bec426595c567d32a8289715087825c2ca7edd8a3d204e4d2fb2aa4602e09a57d0c13ea8c9eea75aac3dbb4af5514e6800e - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e - languageName: node - linkType: hard - -"aria-hidden@npm:^1.1.1, aria-hidden@npm:^1.2.4": - version: 1.2.4 - resolution: "aria-hidden@npm:1.2.4" - dependencies: - tslib: "npm:^2.0.0" - checksum: 10c0/8abcab2e1432efc4db415e97cb3959649ddf52c8fc815d7384f43f3d3abf56f1c12852575d00df9a8927f421d7e0712652dd5f8db244ea57634344e29ecfc74a - languageName: node - linkType: hard - -"aria-query@npm:5.3.0": - version: 5.3.0 - resolution: "aria-query@npm:5.3.0" - dependencies: - dequal: "npm:^2.0.3" - checksum: 10c0/2bff0d4eba5852a9dd578ecf47eaef0e82cc52569b48469b0aac2db5145db0b17b7a58d9e01237706d1e14b7a1b0ac9b78e9c97027ad97679dd8f91b85da1469 - languageName: node - linkType: hard - -"aria-query@npm:^5.3.2": - version: 5.3.2 - resolution: "aria-query@npm:5.3.2" - checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e - languageName: node - linkType: hard - -"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": - version: 1.0.2 - resolution: "array-buffer-byte-length@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.3" - is-array-buffer: "npm:^3.0.5" - checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d - languageName: node - linkType: hard - -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 - languageName: node - linkType: hard - -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": - version: 3.1.8 - resolution: "array-includes@npm:3.1.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.4" - is-string: "npm:^1.0.7" - checksum: 10c0/5b1004d203e85873b96ddc493f090c9672fd6c80d7a60b798da8a14bff8a670ff95db5aafc9abc14a211943f05220dacf8ea17638ae0af1a6a47b8c0b48ce370 - languageName: node - linkType: hard - -"array-includes@npm:^3.1.9": - version: 3.1.9 - resolution: "array-includes@npm:3.1.9" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.4" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.24.0" - es-object-atoms: "npm:^1.1.1" - get-intrinsic: "npm:^1.3.0" - is-string: "npm:^1.1.1" - math-intrinsics: "npm:^1.1.0" - checksum: 10c0/0235fa69078abeac05ac4250699c44996bc6f774a9cbe45db48674ce6bd142f09b327d31482ff75cf03344db4ea03eae23edb862d59378b484b47ed842574856 - languageName: node - linkType: hard - -"array.prototype.findlast@npm:^1.2.5": - version: 1.2.5 - resolution: "array.prototype.findlast@npm:1.2.5" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/ddc952b829145ab45411b9d6adcb51a8c17c76bf89c9dd64b52d5dffa65d033da8c076ed2e17091779e83bc892b9848188d7b4b33453c5565e65a92863cb2775 - languageName: node - linkType: hard - -"array.prototype.findlastindex@npm:^1.2.6": - version: 1.2.6 - resolution: "array.prototype.findlastindex@npm:1.2.6" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.4" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.9" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.1.1" - es-shim-unscopables: "npm:^1.1.0" - checksum: 10c0/82559310d2e57ec5f8fc53d7df420e3abf0ba497935de0a5570586035478ba7d07618cb18e2d4ada2da514c8fb98a034aaf5c06caa0a57e2f7f4c4adedef5956 - languageName: node - linkType: hard - -"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.3": - version: 1.3.3 - resolution: "array.prototype.flat@npm:1.3.3" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/d90e04dfbc43bb96b3d2248576753d1fb2298d2d972e29ca7ad5ec621f0d9e16ff8074dae647eac4f31f4fb7d3f561a7ac005fb01a71f51705a13b5af06a7d8a - languageName: node - linkType: hard - -"array.prototype.flatmap@npm:^1.3.2, array.prototype.flatmap@npm:^1.3.3": - version: 1.3.3 - resolution: "array.prototype.flatmap@npm:1.3.3" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/ba899ea22b9dc9bf276e773e98ac84638ed5e0236de06f13d63a90b18ca9e0ec7c97d622d899796e3773930b946cd2413d098656c0c5d8cc58c6f25c21e6bd54 - languageName: node - linkType: hard - -"array.prototype.tosorted@npm:^1.1.4": - version: 1.1.4 - resolution: "array.prototype.tosorted@npm:1.1.4" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.3" - es-errors: "npm:^1.3.0" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/eb3c4c4fc0381b0bf6dba2ea4d48d367c2827a0d4236a5718d97caaccc6b78f11f4cadf090736e86301d295a6aa4967ed45568f92ced51be8cbbacd9ca410943 - languageName: node - linkType: hard - -"arraybuffer.prototype.slice@npm:^1.0.4": - version: 1.0.4 - resolution: "arraybuffer.prototype.slice@npm:1.0.4" - dependencies: - array-buffer-byte-length: "npm:^1.0.1" - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - is-array-buffer: "npm:^3.0.4" - checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 - languageName: node - linkType: hard - -"assertion-error@npm:^2.0.1": - version: 2.0.1 - resolution: "assertion-error@npm:2.0.1" - checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 - languageName: node - linkType: hard - -"ast-types-flow@npm:^0.0.8": - version: 0.0.8 - resolution: "ast-types-flow@npm:0.0.8" - checksum: 10c0/f2a0ba8055353b743c41431974521e5e852a9824870cd6fce2db0e538ac7bf4da406bbd018d109af29ff3f8f0993f6a730c9eddbd0abd031fbcb29ca75c1014e - languageName: node - linkType: hard - -"astring@npm:^1.9.0": - version: 1.9.0 - resolution: "astring@npm:1.9.0" - bin: - astring: bin/astring - checksum: 10c0/e7519544d9824494e80ef0e722bb3a0c543a31440d59691c13aeaceb75b14502af536b23f08db50aa6c632dafaade54caa25f0788aa7550b6b2d6e2df89e0830 - languageName: node - linkType: hard - -"async-function@npm:^1.0.0": - version: 1.0.0 - resolution: "async-function@npm:1.0.0" - checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 - languageName: node - linkType: hard - -"async@npm:^3.2.3": - version: 3.2.6 - resolution: "async@npm:3.2.6" - checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d - languageName: node - linkType: hard - -"atomically@npm:^2.0.3": - version: 2.1.0 - resolution: "atomically@npm:2.1.0" - dependencies: - stubborn-fs: "npm:^2.0.0" - when-exit: "npm:^2.1.4" - checksum: 10c0/c352ce2e247e4f9aec4e5f46b9720a3598a8241ba4ac7d067060cfd418051268976fec5c958b9d13cc1139b9f11076a8cbdb7837c2e15ca34d3dcceb9c1000b5 - languageName: node - linkType: hard - -"attr-accept@npm:^2.2.4": - version: 2.2.5 - resolution: "attr-accept@npm:2.2.5" - checksum: 10c0/9b4cb82213925cab2d568f71b3f1c7a7778f9192829aac39a281e5418cd00c04a88f873eb89f187e0bf786fa34f8d52936f178e62cbefb9254d57ecd88ada99b - languageName: node - linkType: hard - -"available-typed-arrays@npm:^1.0.7": - version: 1.0.7 - resolution: "available-typed-arrays@npm:1.0.7" - dependencies: - possible-typed-array-names: "npm:^1.0.0" - checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 - languageName: node - linkType: hard - -"aws4fetch@npm:^1.0.20": - version: 1.0.20 - resolution: "aws4fetch@npm:1.0.20" - checksum: 10c0/a4eac7bd0d1c3e611c17ed1ef41ac0b48c0a8e74a985ad968c071e74d94586d3572edc943b43fa5ca756c686ea73baa2f48e264d657bb8c2e95c8e0037d48a87 - languageName: node - linkType: hard - -"axe-core@npm:^4.10.0": - version: 4.10.3 - resolution: "axe-core@npm:4.10.3" - checksum: 10c0/1b1c24f435b2ffe89d76eca0001cbfff42dbf012ad9bd37398b70b11f0d614281a38a28bc3069e8972e3c90ec929a8937994bd24b0ebcbaab87b8d1e241ab0c7 - languageName: node - linkType: hard - -"axobject-query@npm:^4.1.0": - version: 4.1.0 - resolution: "axobject-query@npm:4.1.0" - checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775 - languageName: node - linkType: hard - -"azure-devops-node-api@npm:^15.1.1": - version: 15.1.1 - resolution: "azure-devops-node-api@npm:15.1.1" - dependencies: - tunnel: "npm:0.0.6" - typed-rest-client: "npm:2.1.0" - checksum: 10c0/e57de52745b322523c2f0220770fcbcb692032610d240644c96914ba0f08613416b701e56dc996b52c9bf6761270148a931f694630ed171b238555e237ee002c - languageName: node - linkType: hard - -"bail@npm:^2.0.0": - version: 2.0.2 - resolution: "bail@npm:2.0.2" - checksum: 10c0/25cbea309ef6a1f56214187004e8f34014eb015713ea01fa5b9b7e9e776ca88d0fdffd64143ac42dc91966c915a4b7b683411b56e14929fad16153fc026ffb8b - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"balanced-match@npm:^4.0.2": - version: 4.0.4 - resolution: "balanced-match@npm:4.0.4" - checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b - languageName: node - linkType: hard - -"base64-js@npm:^1.3.0, base64-js@npm:^1.5.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - -"base64id@npm:~2.0.0": - version: 2.0.0 - resolution: "base64id@npm:2.0.0" - checksum: 10c0/6919efd237ed44b9988cbfc33eca6f173a10e810ce50292b271a1a421aac7748ef232a64d1e6032b08f19aae48dce6ee8f66c5ae2c9e5066c82b884861d4d453 - languageName: node - linkType: hard - -"baseline-browser-mapping@npm:^2.11.12, baseline-browser-mapping@npm:^2.9.19": - version: 2.11.21 - resolution: "baseline-browser-mapping@npm:2.11.21" - bin: - baseline-browser-mapping: dist/cli.cjs - checksum: 10c0/1110ca70b60de9fa673e6d71154cbb2752225c28e069266c2f455f5a26367efc0e5b47a52afba22c9ef1e06d56a6c81aa964dda1fbc66c487e65c18a7c1e11c4 - languageName: node - linkType: hard - -"bcryptjs@npm:^3.0.2": - version: 3.0.2 - resolution: "bcryptjs@npm:3.0.2" - bin: - bcrypt: bin/bcrypt - checksum: 10c0/a0923cac99f83e913f8f4e4f42df6a27c6593b24d509900331d1280c4050b1544e602a0ac67b43f7bb5c969991c3ed77fd72f19b7dc873be8ee794da3d925c7e - languageName: node - linkType: hard - -"before-after-hook@npm:^3.0.2": - version: 3.0.2 - resolution: "before-after-hook@npm:3.0.2" - checksum: 10c0/dea640f9e88a1085372c9bcc974b7bf379267490693da92ec102a7d8b515dd1e95f00ef575a146b83ca638104c57406c3427d37bdf082f602dde4b56d05bba14 - languageName: node - linkType: hard - -"before-after-hook@npm:^4.0.0": - version: 4.0.0 - resolution: "before-after-hook@npm:4.0.0" - checksum: 10c0/9f8ae8d1b06142bcfb9ef6625226b5e50348bb11210f266660eddcf9734e0db6f9afc4cb48397ee3f5ac0a3728f3ae401cdeea88413f7bed748a71db84657be2 - languageName: node - linkType: hard - -"best-effort-json-parser@npm:^1.1.2": - version: 1.1.3 - resolution: "best-effort-json-parser@npm:1.1.3" - checksum: 10c0/dc2a7e0e9c9709c99ba9def181851ff23c263b841a0be33fa94a66e20e73e43c57c1525e6ea76096f6cabbfea0408625514f09d23f46449a9d661a2362cf4575 - languageName: node - linkType: hard - -"big.js@npm:^5.2.2": - version: 5.2.2 - resolution: "big.js@npm:5.2.2" - checksum: 10c0/230520f1ff920b2d2ce3e372d77a33faa4fa60d802fe01ca4ffbc321ee06023fe9a741ac02793ee778040a16b7e497f7d60c504d1c402b8fdab6f03bb785a25f - languageName: node - linkType: hard - -"bignumber.js@npm:^9.0.0": - version: 9.3.0 - resolution: "bignumber.js@npm:9.3.0" - checksum: 10c0/f54a79cd6fc98552ac0510c1cd9381650870ae443bdb20ba9b98e3548188d941506ac3c22a9f9c69b2cc60da9be5700e87d3f54d2825310a8b2ae999dfd6d99d - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.3.0 - resolution: "binary-extensions@npm:2.3.0" - checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 - languageName: node - linkType: hard - -"bintrees@npm:1.0.2": - version: 1.0.2 - resolution: "bintrees@npm:1.0.2" - checksum: 10c0/132944b20c93c1a8f97bf8aa25980a76c6eb4291b7f2df2dbcd01cb5b417c287d3ee0847c7260c9f05f3d5a4233aaa03dec95114e97f308abe9cc3f72bed4a44 - languageName: node - linkType: hard - -"bippy@npm:^0.5.30": - version: 0.5.30 - resolution: "bippy@npm:0.5.30" - dependencies: - "@types/react-reconciler": "npm:^0.28.9" - peerDependencies: - react: ">=17.0.1" - checksum: 10c0/aaa68a9beb1020bf21c517dbc96f8f6beacf01b461f9892ce83183718a05060b5a5807aa18f4ef88ef1885064dc34e7549b133b6fc0fa99228a79ca76155c3a6 - languageName: node - linkType: hard - -"bippy@npm:^0.5.32": - version: 0.5.32 - resolution: "bippy@npm:0.5.32" - dependencies: - "@types/react-reconciler": "npm:^0.28.9" - peerDependencies: - react: ">=17.0.1" - checksum: 10c0/019a6800ad54da471ff915a4b5815baa8981ebde1695aca79387fa67cd298d875631b3b83123c05dd2977077bfe0af651b1df59683a78dd428fccd8f80f38894 - languageName: node - linkType: hard - -"body-parser@npm:^2.2.1": - version: 2.3.0 - resolution: "body-parser@npm:2.3.0" - dependencies: - bytes: "npm:^3.1.2" - content-type: "npm:^2.0.0" - debug: "npm:^4.4.3" - http-errors: "npm:^2.0.1" - iconv-lite: "npm:^0.7.2" - on-finished: "npm:^2.4.1" - qs: "npm:^6.15.2" - raw-body: "npm:^3.0.2" - type-is: "npm:^2.1.0" - checksum: 10c0/2a8fbbdc471b588338555a3e1a597d1eb0ad0c21cf20fdc3bac5d3f8d9c3a4b19b4163575ab852a43a5dfc0df7770ced5284f979e561f1a24c2f851ce89e695a - languageName: node - linkType: hard - -"body-parser@npm:~1.20.5": - version: 1.20.6 - resolution: "body-parser@npm:1.20.6" - dependencies: - bytes: "npm:~3.1.2" - content-type: "npm:~1.0.5" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:~1.2.0" - http-errors: "npm:~2.0.1" - iconv-lite: "npm:~0.4.24" - on-finished: "npm:~2.4.1" - qs: "npm:~6.15.1" - raw-body: "npm:~2.5.3" - type-is: "npm:~1.6.18" - unpipe: "npm:~1.0.0" - checksum: 10c0/ad477209f1e714c41fa892a7d2fe22e10b23262103cc25cc6492dd3e6f7869cd2d8b00928b543a1a14d3c3663432452a192efd00422fad6f3687b0e38f7e3b07 - languageName: node - linkType: hard - -"bottleneck@npm:^2.15.3": - version: 2.19.5 - resolution: "bottleneck@npm:2.19.5" - checksum: 10c0/b0f72e45b2e0f56a21ba720183f16bef8e693452fb0495d997fa354e42904353a94bd8fd429868e6751bc85e54b6755190519eed5a0ae0a94a5185209ae7c6d0 - languageName: node - linkType: hard - -"bowser@npm:^2.11.0": - version: 2.12.1 - resolution: "bowser@npm:2.12.1" - checksum: 10c0/017e8cc63ce2dec75037340626e1408f68334dac95f953ba7db33a266c019f1d262346d2be3994f9a12b7e9c02f57c562078719b8c5e8e8febe01053c613ffbc - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.13": - version: 1.1.21 - resolution: "brace-expansion@npm:1.1.21" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/8f0a68a720f9cb28c2ecaea5cdaf15fafd686d6b6e4e722a81c9d4bd2f68c1fd0619731cac05875d842221eaf4d97d564d329a12eb3c4c22137502fb3c65be8b - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.3": - version: 2.1.7 - resolution: "brace-expansion@npm:2.1.7" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/17ee4194c85b05cde0a7b7c068eeef664440c027116ef42c3d35c13ebabdc9fd3eaf05c5c8a06dd0ca20ae012d652561d8ac2a699daa5cbee1f0510e5134ab4d - languageName: node - linkType: hard - -"brace-expansion@npm:^5.0.5": - version: 5.0.12 - resolution: "brace-expansion@npm:5.0.12" - dependencies: - balanced-match: "npm:^4.0.2" - checksum: 10c0/a40ac64d3bdb5bb222456514d3633c1f627f03b844f509c69e70f98b78be0ce85e21b44bbfecdd0ddd4cc0855ca4242b41ea96ddccf88c7c3c7a84405474bb3a - languageName: node - linkType: hard - -"braces@npm:^3.0.3, braces@npm:~3.0.2": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: "npm:^7.1.1" - checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 - languageName: node - linkType: hard - -"browserslist@npm:^4.24.0": - version: 4.28.8 - resolution: "browserslist@npm:4.28.8" - dependencies: - baseline-browser-mapping: "npm:^2.11.12" - caniuse-lite: "npm:^1.0.30001809" - electron-to-chromium: "npm:^1.5.402" - node-releases: "npm:^2.0.53" - update-browserslist-db: "npm:^1.3.0" - bin: - browserslist: cli.js - checksum: 10c0/047dd517c8d1f1f56a253d752c3127b8ad01c58e4cbb7e21cb5cd07ebd13e083a2237c3afb13eb60674282c9132bd4534aea2c3ff7c6f7d29be0687a00cbd537 - languageName: node - linkType: hard - -"buffer-equal-constant-time@npm:^1.0.1": - version: 1.0.1 - resolution: "buffer-equal-constant-time@npm:1.0.1" - checksum: 10c0/fb2294e64d23c573d0dd1f1e7a466c3e978fe94a4e0f8183937912ca374619773bef8e2aceb854129d2efecbbc515bbd0cc78d2734a3e3031edb0888531bbc8e - languageName: node - linkType: hard - -"bullmq@npm:^5.81.3": - version: 5.81.3 - resolution: "bullmq@npm:5.81.3" - dependencies: - cron-parser: "npm:4.9.0" - ioredis: "npm:5.11.1" - msgpackr: "npm:2.0.5" - node-abort-controller: "npm:3.1.1" - semver: "npm:7.8.5" - tslib: "npm:2.8.1" - peerDependencies: - redis: ">=5.0.0" - peerDependenciesMeta: - redis: - optional: true - checksum: 10c0/e28abf1f37191966d0204e8717040f99807749579ba34e6cd8ac4698f3daa0327be094e52fa52c6aab991f4cd4cdd338b6c950134ec083be166c19f82d96cde1 - languageName: node - linkType: hard - -"bytes@npm:3.1.2, bytes@npm:^3.1.2, bytes@npm:~3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e - languageName: node - linkType: hard - -"cacache@npm:^19.0.1": - version: 19.0.1 - resolution: "cacache@npm:19.0.1" - dependencies: - "@npmcli/fs": "npm:^4.0.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^7.0.2" - ssri: "npm:^12.0.0" - tar: "npm:^7.4.3" - unique-filename: "npm:^4.0.0" - checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c - languageName: node - linkType: hard - -"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind-apply-helpers@npm:1.0.2" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 - languageName: node - linkType: hard - -"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": - version: 1.0.8 - resolution: "call-bind@npm:1.0.8" - dependencies: - call-bind-apply-helpers: "npm:^1.0.0" - es-define-property: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.2" - checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 - languageName: node - linkType: hard - -"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": - version: 1.0.4 - resolution: "call-bound@npm:1.0.4" - dependencies: - call-bind-apply-helpers: "npm:^1.0.2" - get-intrinsic: "npm:^1.3.0" - checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 - languageName: node - linkType: hard - -"camelcase-css@npm:^2.0.1": - version: 2.0.1 - resolution: "camelcase-css@npm:2.0.1" - checksum: 10c0/1a1a3137e8a781e6cbeaeab75634c60ffd8e27850de410c162cce222ea331cd1ba5364e8fb21c95e5ca76f52ac34b81a090925ca00a87221355746d049c6e273 - languageName: node - linkType: hard - -"camelcase@npm:6": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 10c0/0d701658219bd3116d12da3eab31acddb3f9440790c0792e0d398f0a520a6a4058018e546862b6fba89d7ae990efaeb97da71e1913e9ebf5a8b5621a3d55c710 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001809": - version: 1.0.30001810 - resolution: "caniuse-lite@npm:1.0.30001810" - checksum: 10c0/d29bc73f33c888025d54c7ff2984372d3b350b15a6a9e174884fb40976175e9177f202e2a72c2d428dddfc032784bc8ba635a31d168fcab9fac65756d7b3d6b4 - languageName: node - linkType: hard - -"canvas-confetti@npm:^1.9.4": - version: 1.9.4 - resolution: "canvas-confetti@npm:1.9.4" - checksum: 10c0/08f11b5fa20b365922108828d7488f9b3eac2afdf39bc478339268c1250b5215df82682d7074520a3f0f72f4728f9703bbc937dcfe793f196b44e6e8ac0b1f7b - languageName: node - linkType: hard - -"ccount@npm:^2.0.0": - version: 2.0.1 - resolution: "ccount@npm:2.0.1" - checksum: 10c0/3939b1664390174484322bc3f45b798462e6c07ee6384cb3d645e0aa2f318502d174845198c1561930e1d431087f74cf1fe291ae9a4722821a9f4ba67e574350 - languageName: node - linkType: hard - -"chai@npm:^6.2.2": - version: 6.2.2 - resolution: "chai@npm:6.2.2" - checksum: 10c0/e6c69e5f0c11dffe6ea13d0290936ebb68fcc1ad688b8e952e131df6a6d5797d5e860bc55cef1aca2e950c3e1f96daf79e9d5a70fb7dbaab4e46355e2635ed53 - languageName: node - linkType: hard - -"chalk@npm:4.1.2, chalk@npm:^4.0.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 - languageName: node - linkType: hard - -"chalk@npm:^2.4.1": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 - languageName: node - linkType: hard - -"chalk@npm:^5.3.0, chalk@npm:^5.6.2": - version: 5.6.2 - resolution: "chalk@npm:5.6.2" - checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 - languageName: node - linkType: hard - -"character-entities-html4@npm:^2.0.0": - version: 2.1.0 - resolution: "character-entities-html4@npm:2.1.0" - checksum: 10c0/fe61b553f083400c20c0b0fd65095df30a0b445d960f3bbf271536ae6c3ba676f39cb7af0b4bf2755812f08ab9b88f2feed68f9aebb73bb153f7a115fe5c6e40 - languageName: node - linkType: hard - -"character-entities-legacy@npm:^3.0.0": - version: 3.0.0 - resolution: "character-entities-legacy@npm:3.0.0" - checksum: 10c0/ec4b430af873661aa754a896a2b55af089b4e938d3d010fad5219299a6b6d32ab175142699ee250640678cd64bdecd6db3c9af0b8759ab7b155d970d84c4c7d1 - languageName: node - linkType: hard - -"character-entities@npm:^2.0.0": - version: 2.0.2 - resolution: "character-entities@npm:2.0.2" - checksum: 10c0/b0c645a45bcc90ff24f0e0140f4875a8436b8ef13b6bcd31ec02cfb2ca502b680362aa95386f7815bdc04b6464d48cf191210b3840d7c04241a149ede591a308 - languageName: node - linkType: hard - -"character-reference-invalid@npm:^2.0.0": - version: 2.0.1 - resolution: "character-reference-invalid@npm:2.0.1" - checksum: 10c0/2ae0dec770cd8659d7e8b0ce24392d83b4c2f0eb4a3395c955dce5528edd4cc030a794cfa06600fcdd700b3f2de2f9b8e40e309c0011c4180e3be64a0b42e6a1 - languageName: node - linkType: hard - -"chardet@npm:^2.1.1": - version: 2.1.1 - resolution: "chardet@npm:2.1.1" - checksum: 10c0/d8391dd412338442b3de0d3a488aa9327f8bcf74b62b8723d6bd0b85c4084d50b731320e0a7c710edb1d44de75969995d2784b80e4c13b004a6c7a0db4c6e793 - languageName: node - linkType: hard - -"chokidar@npm:^3.5.2, chokidar@npm:^3.6.0": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" - dependencies: - anymatch: "npm:~3.1.2" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.2" - glob-parent: "npm:~5.1.2" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.6.0" - dependenciesMeta: - fsevents: - optional: true - checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 - languageName: node - linkType: hard - -"chokidar@npm:^4.0.3": - version: 4.0.3 - resolution: "chokidar@npm:4.0.3" - dependencies: - readdirp: "npm:^4.0.1" - checksum: 10c0/a58b9df05bb452f7d105d9e7229ac82fa873741c0c40ddcc7bb82f8a909fbe3f7814c9ebe9bc9a2bef9b737c0ec6e2d699d179048ef06ad3ec46315df0ebe6ad - languageName: node - linkType: hard - -"chownr@npm:^3.0.0": - version: 3.0.0 - resolution: "chownr@npm:3.0.0" - checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 - languageName: node - linkType: hard - -"citty@npm:^0.2.2": - version: 0.2.2 - resolution: "citty@npm:0.2.2" - checksum: 10c0/c896c9dcd187d2a16685706d11428dcdec9eb59aa13fe50aff7b12e1d3521f1bf434d6a5316fe75a341f8ba5ce1d2beceb84f7f261d018985a73d3f6f2a793e3 - languageName: node - linkType: hard - -"cjs-module-lexer@npm:^1.2.2": - version: 1.4.3 - resolution: "cjs-module-lexer@npm:1.4.3" - checksum: 10c0/076b3af85adc4d65dbdab1b5b240fe5b45d44fcf0ef9d429044dd94d19be5589376805c44fb2d4b3e684e5fe6a9b7cf3e426476a6507c45283c5fc6ff95240be - languageName: node - linkType: hard - -"cjs-module-lexer@npm:^2.2.0": - version: 2.2.0 - resolution: "cjs-module-lexer@npm:2.2.0" - checksum: 10c0/aec4ca58f87145fac221386790ecaae8b012f2e2359a45acb61d8c75ea4fa84f6ea869f17abc1a7e91a808eff0fed581209632f03540de16f72f0a28f5fd35ac - languageName: node - linkType: hard - -"class-variance-authority@npm:^0.7.1": - version: 0.7.1 - resolution: "class-variance-authority@npm:0.7.1" - dependencies: - clsx: "npm:^2.1.1" - checksum: 10c0/0f438cea22131808b99272de0fa933c2532d5659773bfec0c583de7b3f038378996d3350683426b8e9c74a6286699382106d71fbec52f0dd5fbb191792cccb5b - languageName: node - linkType: hard - -"clean-stack@npm:^5.2.0": - version: 5.3.0 - resolution: "clean-stack@npm:5.3.0" - dependencies: - escape-string-regexp: "npm:5.0.0" - checksum: 10c0/1aa8b6772eed1f678a9dcf6e02c74c59f26b6fdad26eaaca1dc6a367ff19c924315836b6143484c2686366758e05396f1ac0f32aaa70481b11d8e23790947ca0 - languageName: node - linkType: hard - -"cli-cursor@npm:^5.0.0": - version: 5.0.0 - resolution: "cli-cursor@npm:5.0.0" - dependencies: - restore-cursor: "npm:^5.0.0" - checksum: 10c0/7ec62f69b79f6734ab209a3e4dbdc8af7422d44d360a7cb1efa8a0887bbe466a6e625650c466fe4359aee44dbe2dc0b6994b583d40a05d0808a5cb193641d220 - languageName: node - linkType: hard - -"cli-spinners@npm:^2.9.2": - version: 2.9.2 - resolution: "cli-spinners@npm:2.9.2" - checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 - languageName: node - linkType: hard - -"cli-spinners@npm:^3.2.0": - version: 3.4.0 - resolution: "cli-spinners@npm:3.4.0" - checksum: 10c0/91296c32e147d5b973c9d439d1512306499215437b92f0c0d8be44ec850b555acb8795c19c606b2f6747f31d50c4e41fdde7dcef653f18f0ae7cdd58e99a4764 - languageName: node - linkType: hard - -"cli-width@npm:^4.1.0": - version: 4.1.0 - resolution: "cli-width@npm:4.1.0" - checksum: 10c0/1fbd56413578f6117abcaf858903ba1f4ad78370a4032f916745fa2c7e390183a9d9029cf837df320b0fdce8137668e522f60a30a5f3d6529ff3872d265a955f - languageName: node - linkType: hard - -"client-only@npm:0.0.1, client-only@npm:^0.0.1": - version: 0.0.1 - resolution: "client-only@npm:0.0.1" - checksum: 10c0/9d6cfd0c19e1c96a434605added99dff48482152af791ec4172fb912a71cff9027ff174efd8cdb2160cc7f377543e0537ffc462d4f279bc4701de3f2a3c4b358 - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 - languageName: node - linkType: hard - -"clsx@npm:^2.0.0, clsx@npm:^2.1.1": - version: 2.1.1 - resolution: "clsx@npm:2.1.1" - checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 - languageName: node - linkType: hard - -"cluster-key-slot@npm:1.1.1": - version: 1.1.1 - resolution: "cluster-key-slot@npm:1.1.1" - checksum: 10c0/079b1ae86b20e2d53308a877b08de5e830722a45c07810569d0dab4955bed569da33ac9f79998289d014adf02cca7223a0647cb0ee6548a12ab3c4f9beac1377 - languageName: node - linkType: hard - -"cm6-graphql@npm:^0.2.0": - version: 0.2.0 - resolution: "cm6-graphql@npm:0.2.0" - dependencies: - graphql-language-service: "npm:^5.3.0" - peerDependencies: - "@codemirror/autocomplete": ^6.0.0 - "@codemirror/language": ^6.0.0 - "@codemirror/lint": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/highlight": ^1.0.0 - graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 - checksum: 10c0/bfb38e5267f4cd02fe6780c71504554952aadd8b969323a898e3da0010385c6e3e5b832cb1bc79de6dbd367ecc378a1d42dff6ad1a2b3f3b469eff2e158aa07a - languageName: node - linkType: hard - -"cmdk@npm:1.0.0": - version: 1.0.0 - resolution: "cmdk@npm:1.0.0" - dependencies: - "@radix-ui/react-dialog": "npm:1.0.5" - "@radix-ui/react-primitive": "npm:1.0.3" - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10c0/bf1c9cfce46f2f507ab95735fa08c9aa27e76ecdff87720cc51ae89dbf4814b7559668458f66ff4c3932a88a6b9d8817be05c3cc4ff98bc40c3645acf4a97376 - languageName: node - linkType: hard - -"codemirror-json-schema@npm:^0.8.0": - version: 0.8.0 - resolution: "codemirror-json-schema@npm:0.8.0" - dependencies: - "@codemirror/autocomplete": "npm:^6.16.2" - "@codemirror/lang-json": "npm:^6.0.1" - "@codemirror/lang-yaml": "npm:^6.1.1" - "@sagold/json-pointer": "npm:^5.1.1" - "@shikijs/markdown-it": "npm:^1.22.2" - best-effort-json-parser: "npm:^1.1.2" - codemirror-json5: "npm:^1.0.3" - json-schema: "npm:^0.4.0" - json-schema-library: "npm:^9.3.5" - json5: "npm:^2.2.3" - loglevel: "npm:^1.9.1" - markdown-it: "npm:^14.1.0" - shiki: "npm:^1.22.2" - yaml: "npm:^2.3.4" - peerDependencies: - "@codemirror/language": ^6.10.2 - "@codemirror/lint": ^6.8.0 - "@codemirror/state": ^6.4.1 - "@codemirror/view": ^6.27.0 - "@lezer/common": ^1.2.1 - dependenciesMeta: - "@codemirror/autocomplete": - optional: true - "@codemirror/lang-json": - optional: true - "@codemirror/lang-yaml": - optional: true - codemirror-json5: - optional: true - json5: - optional: true - checksum: 10c0/d3913fcbbf698bd4b7e92a60d25e075e0ac06cfda66d5d09d912a9472b8ed9b9c6f35d93bfe56980450a0a406ecba2cc1f61e77754ab85efbba82b724d471602 - languageName: node - linkType: hard - -"codemirror-json5@npm:^1.0.3": - version: 1.0.3 - resolution: "codemirror-json5@npm:1.0.3" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.0.0" - "@lezer/common": "npm:^1.0.0" - "@lezer/highlight": "npm:^1.0.0" - json5: "npm:^2.2.1" - lezer-json5: "npm:^2.0.2" - checksum: 10c0/a842f3f34d3286abeb86879b89b555ca68b08447303f4e8fac9abfb71e6b6df30ab3815ecfae0cf790976749e32ef8cd7baae1db6dd7a4a8e6e40696a14d275f - languageName: node - linkType: hard - -"codemirror-lang-brainfuck@npm:^0.1.0": - version: 0.1.0 - resolution: "codemirror-lang-brainfuck@npm:0.1.0" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/265e0ccd048c25bf7ab459c158691331f7fc0abaf3e5523cbfd9dcea8d64b5117af5387fb052b0de2bebdddd18b6698edecc88c3fe53d3bfffc15002558b4884 - languageName: node - linkType: hard - -"codemirror-lang-elixir@npm:^4.0.0": - version: 4.0.0 - resolution: "codemirror-lang-elixir@npm:4.0.0" - dependencies: - "@codemirror/language": "npm:^6.0.0" - lezer-elixir: "npm:^1.0.0" - checksum: 10c0/333fda52b9ea71409392460573399bfc30d3e7e2c35d52b41714cf6c0fa10b19a345b2ec3c5c1cff2b2d4cf0c862d7ca5d6cd1d9451b94e8de1c27f9b0f3103d - languageName: node - linkType: hard - -"codemirror-lang-hcl@npm:^0.0.0-beta.2": - version: 0.0.0-beta.2 - resolution: "codemirror-lang-hcl@npm:0.0.0-beta.2" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/a87886f4b027a10a8917ca8b9b46b624bb43a8b6d037c8b9df4cd3bedf8c555dbb019cad9479630f7f70f7317f594de82c21b4b3b2496cb7d1abf2eeca6d1119 - languageName: node - linkType: hard - -"codemirror-lang-j@npm:^0.1.1": - version: 0.1.1 - resolution: "codemirror-lang-j@npm:0.1.1" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/common": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/25c8444dfb0292a1a5ad88a2d402945b08359e5507fc88bcd7b5749cd38769c44c3323a142d20ea65a1b8eec8b3da34fc699f727e866a7d15bfc5040f68417ad - languageName: node - linkType: hard - -"codemirror-lang-jq@npm:^1.0.0": - version: 1.0.0 - resolution: "codemirror-lang-jq@npm:1.0.0" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/356c09653f7f6d37b0997ef54a614606ca0bd2499d0e504de6f07ad10f34a99a788db83ef172abdddd36d02425437803c12e924ef7737cd8e093ed76bcc3ad17 - languageName: node - linkType: hard - -"codemirror-lang-makefile@npm:^0.1.1": - version: 0.1.1 - resolution: "codemirror-lang-makefile@npm:0.1.1" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/fdf2bf3b6adadca2cc95c4caefd1e0bbe8423287ca4043f0a435b02d6801d5293af7cc53329839156aa854994931287eb94e743038e468be175e5e77272a3dc6 - languageName: node - linkType: hard - -"codemirror-lang-mermaid@npm:^0.5.0": - version: 0.5.0 - resolution: "codemirror-lang-mermaid@npm:0.5.0" - dependencies: - "@codemirror/language": "npm:^6.9.0" - "@lezer/highlight": "npm:^1.1.6" - "@lezer/lr": "npm:^1.3.10" - checksum: 10c0/973988e42de58df9e7b94300e9829de93068eac14f6ebf53214367cb3854319bd898db7901292462e354553006b6f0b8a32c0eeaadf43d3cba9ddd0396975408 - languageName: node - linkType: hard - -"codemirror-lang-perl@npm:^0.1.5-beta.6": - version: 0.1.5-beta.6 - resolution: "codemirror-lang-perl@npm:0.1.5-beta.6" - dependencies: - "@codemirror/language": "npm:^6.10.2" - "@lezer/highlight": "npm:^1.2.1" - "@lezer/lr": "npm:^1.4.2" - checksum: 10c0/c6bb4a960900b15f63bcbb6e345f6aaf6627d9030f5cc95fc15d6071f4c923a5d1c23fdfbb916cdd25c1ffa2c8fa4c2640070e95eed19173ddaee1e0bf4f1afe - languageName: node - linkType: hard - -"codemirror-lang-prolog@npm:^0.1.0": - version: 0.1.0 - resolution: "codemirror-lang-prolog@npm:0.1.0" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/38dcadeb9973cbbe056e26d453f90e8ec225f47e79acae401fe6a090517d709fb0956be77f755d456f4d73e0361f5dadeddce1afb7e1a09b02e4ff31e6c6fcf3 - languageName: node - linkType: hard - -"codemirror-lang-r@npm:^0.1.1": - version: 0.1.1 - resolution: "codemirror-lang-r@npm:0.1.1" - dependencies: - "@codemirror/language": "npm:^6.10.3" - lezer-r: "npm:^0.1.3" - checksum: 10c0/e3206e4dba71f19bab7fee32f354c8462b3fe3d212a776a75f1f0aaef74527153aebcdd1223274def6e69ba63b57c5d268452c57499e4db3bca2135adb07dc90 - languageName: node - linkType: hard - -"codemirror-lang-sparql@npm:^2.0.0": - version: 2.0.0 - resolution: "codemirror-lang-sparql@npm:2.0.0" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/1fbd336dec7090375af1f66f94f3cbe0d575368b146a9a9f2cab2bd3ff9f114c9866eab21f59bffc7cc0e508660a3f092f73d295cf390a5302d96be1be7a0f39 - languageName: node - linkType: hard - -"codemirror-lang-spreadsheet@npm:^1.3.0": - version: 1.3.0 - resolution: "codemirror-lang-spreadsheet@npm:1.3.0" - dependencies: - "@codemirror/language": "npm:^6.6.0" - "@lezer/highlight": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/d3c9a5c7e6283038741d928e23298599e00ef9c022023481a44d4df545b29e45e62330aec08ad43ce3a0279bbaff5448bd5ca4ce2b6145b82a2ec2137f1a7298 - languageName: node - linkType: hard - -"codemirror-lang-zig@npm:^0.1.0": - version: 0.1.0 - resolution: "codemirror-lang-zig@npm:0.1.0" - dependencies: - "@codemirror/language": "npm:^6.0.0" - "@lezer/common": "npm:^1.0.0" - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/f1891d8f56dee4cc04b746a7b35f2e73d2a23bd2c6d46bd8fd1863dbd54ae41d8c1b86b6876185bde4c3217e6ff6d75232b12d00e2d01536fd9a263ef53fa8ee - languageName: node - linkType: hard - -"codemirror@npm:6.x, codemirror@npm:^6.0.0, codemirror@npm:^6.0.1": - version: 6.0.1 - resolution: "codemirror@npm:6.0.1" - dependencies: - "@codemirror/autocomplete": "npm:^6.0.0" - "@codemirror/commands": "npm:^6.0.0" - "@codemirror/language": "npm:^6.0.0" - "@codemirror/lint": "npm:^6.0.0" - "@codemirror/search": "npm:^6.0.0" - "@codemirror/state": "npm:^6.0.0" - "@codemirror/view": "npm:^6.0.0" - checksum: 10c0/219b0f6ee91d373380fba2e0564a2665990a3cdada0b01861768005b09061187c58eeb3db96aef486777b02b77b50a50ee843635e3743c47d3725034913c4b60 - languageName: node - linkType: hard - -"codemirror@npm:^5.65.3": - version: 5.65.19 - resolution: "codemirror@npm:5.65.19" - checksum: 10c0/067024d74a9a98721063bcd78373899e827914c92881c595a2d6789649a3c4e061edd892b29bca10995a5450488c9c93fc3998a3c4ed6fd19cba2e97cd23d4e1 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 - languageName: node - linkType: hard - -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"color-string@npm:^1.6.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" - dependencies: - color-name: "npm:^1.0.0" - simple-swizzle: "npm:^0.2.2" - checksum: 10c0/b0bfd74c03b1f837f543898b512f5ea353f71630ccdd0d66f83028d1f0924a7d4272deb278b9aef376cacf1289b522ac3fb175e99895283645a2dc3a33af2404 - languageName: node - linkType: hard - -"color@npm:^3.1.3": - version: 3.2.1 - resolution: "color@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.3" - color-string: "npm:^1.6.0" - checksum: 10c0/39345d55825884c32a88b95127d417a2c24681d8b57069413596d9fcbb721459ef9d9ec24ce3e65527b5373ce171b73e38dbcd9c830a52a6487e7f37bf00e83c - languageName: node - linkType: hard - -"colorspace@npm:1.1.x": - version: 1.1.4 - resolution: "colorspace@npm:1.1.4" - dependencies: - color: "npm:^3.1.3" - text-hex: "npm:1.0.x" - checksum: 10c0/af5f91ff7f8e146b96e439ac20ed79b197210193bde721b47380a75b21751d90fa56390c773bb67c0aedd34ff85091883a437ab56861c779bd507d639ba7e123 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: "npm:~1.0.0" - checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 - languageName: node - linkType: hard - -"comma-separated-tokens@npm:^2.0.0": - version: 2.0.3 - resolution: "comma-separated-tokens@npm:2.0.3" - checksum: 10c0/91f90f1aae320f1755d6957ef0b864fe4f54737f3313bd95e0802686ee2ca38bff1dd381964d00ae5db42912dd1f4ae5c2709644e82706ffc6f6842a813cdd67 - languageName: node - linkType: hard - -"commander@npm:7": - version: 7.2.0 - resolution: "commander@npm:7.2.0" - checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a - languageName: node - linkType: hard - -"commander@npm:^13.0.0": - version: 13.1.0 - resolution: "commander@npm:13.1.0" - checksum: 10c0/7b8c5544bba704fbe84b7cab2e043df8586d5c114a4c5b607f83ae5060708940ed0b5bd5838cf8ce27539cde265c1cbd59ce3c8c6b017ed3eec8943e3a415164 - languageName: node - linkType: hard - -"commander@npm:^14.0.0": - version: 14.0.3 - resolution: "commander@npm:14.0.3" - checksum: 10c0/755652564bbf56ff2ff083313912b326450d3f8d8c85f4b71416539c9a05c3c67dbd206821ca72635bf6b160e2afdefcb458e86b317827d5cb333b69ce7f1a24 - languageName: node - linkType: hard - -"commander@npm:^15.0.0": - version: 15.0.0 - resolution: "commander@npm:15.0.0" - checksum: 10c0/539229c171914ea1ccd45ee5f10d924289a12a684ea3a7a44147abe54003c35ed6de9ae4ad198d88c29fdf403dca0428451a388234e6dc01b6faa978fb207206 - languageName: node - linkType: hard - -"commander@npm:^2.19.0": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 - languageName: node - linkType: hard - -"commander@npm:^4.0.0": - version: 4.1.1 - resolution: "commander@npm:4.1.1" - checksum: 10c0/84a76c08fe6cc08c9c93f62ac573d2907d8e79138999312c92d4155bc2325d487d64d13f669b2000c9f8caf70493c1be2dac74fec3c51d5a04f8bc3ae1830bab - languageName: node - linkType: hard - -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 - languageName: node - linkType: hard - -"compute-scroll-into-view@npm:^3.0.2": - version: 3.1.1 - resolution: "compute-scroll-into-view@npm:3.1.1" - checksum: 10c0/59761ed62304a9599b52ad75d0d6fbf0669ee2ab7dd472fdb0ad9da36628414c014dea7b5810046560180ad30ffec52a953d19297f66a1d4f3aa0999b9d2521d - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - -"concurrently@npm:^9.2.1": - version: 9.2.1 - resolution: "concurrently@npm:9.2.1" - dependencies: - chalk: "npm:4.1.2" - rxjs: "npm:7.8.2" - shell-quote: "npm:1.8.3" - supports-color: "npm:8.1.1" - tree-kill: "npm:1.2.2" - yargs: "npm:17.7.2" - bin: - conc: dist/bin/concurrently.js - concurrently: dist/bin/concurrently.js - checksum: 10c0/da37f239f82eb7ac24f5ddb56259861e5f1d6da2ade7602b6ea7ad3101b13b5ccec02a77b7001402d1028ff2fdc38eed55644b32853ad5abf30e057002a963aa - languageName: node - linkType: hard - -"conf@npm:^15.0.2": - version: 15.0.2 - resolution: "conf@npm:15.0.2" - dependencies: - ajv: "npm:^8.17.1" - ajv-formats: "npm:^3.0.1" - atomically: "npm:^2.0.3" - debounce-fn: "npm:^6.0.0" - dot-prop: "npm:^10.0.0" - env-paths: "npm:^3.0.0" - json-schema-typed: "npm:^8.0.1" - semver: "npm:^7.7.2" - uint8array-extras: "npm:^1.5.0" - checksum: 10c0/77713ffe61e1ec26713fba972b6a4f589a3c45872cf07f0e6499a3e54fe855d2c88bf80e148346b28abef0174e4bffcb98cc0a58dd42d451c936a045bd319113 - languageName: node - linkType: hard - -"content-disposition@npm:^1.0.0": - version: 1.0.0 - resolution: "content-disposition@npm:1.0.0" - dependencies: - safe-buffer: "npm:5.2.1" - checksum: 10c0/c7b1ba0cea2829da0352ebc1b7f14787c73884bc707c8bc2271d9e3bf447b372270d09f5d3980dc5037c749ceef56b9a13fccd0b0001c87c3f12579967e4dd27 - languageName: node - linkType: hard - -"content-disposition@npm:~0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: "npm:5.2.1" - checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb - languageName: node - linkType: hard - -"content-type@npm:^1.0.5, content-type@npm:~1.0.4, content-type@npm:~1.0.5": - version: 1.0.5 - resolution: "content-type@npm:1.0.5" - checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af - languageName: node - linkType: hard - -"content-type@npm:^2.0.0": - version: 2.0.0 - resolution: "content-type@npm:2.0.0" - checksum: 10c0/491539fff707d7594b0ca4fabcc084bef2a31ffa754ff0a4f80c4377e3963cff0394317f9271c24087596c97fa675bc123d61fa34ffe65b4904e7d3d3098de72 - languageName: node - linkType: hard - -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b - languageName: node - linkType: hard - -"cookie-signature@npm:^1.2.1": - version: 1.2.2 - resolution: "cookie-signature@npm:1.2.2" - checksum: 10c0/54e05df1a293b3ce81589b27dddc445f462f6fa6812147c033350cd3561a42bc14481674e05ed14c7bd0ce1e8bb3dc0e40851bad75415733711294ddce0b7bc6 - languageName: node - linkType: hard - -"cookie-signature@npm:~1.0.6": - version: 1.0.7 - resolution: "cookie-signature@npm:1.0.7" - checksum: 10c0/e7731ad2995ae2efeed6435ec1e22cdd21afef29d300c27281438b1eab2bae04ef0d1a203928c0afec2cee72aa36540b8747406ebe308ad23c8e8cc3c26c9c51 - languageName: node - linkType: hard - -"cookie@npm:^0.7.1, cookie@npm:~0.7.1, cookie@npm:~0.7.2": - version: 0.7.2 - resolution: "cookie@npm:0.7.2" - checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 - languageName: node - linkType: hard - -"core-js@npm:^3.38.1": - version: 3.41.0 - resolution: "core-js@npm:3.41.0" - checksum: 10c0/a29ed0b7fe81acf49d04ce5c17a1947166b1c15197327a5d12f95bbe84b46d60c3c13de701d808f41da06fa316285f3f55ce5903abc8d5642afc1eac4457afc8 - languageName: node - linkType: hard - -"cors@npm:^2.8.5, cors@npm:~2.8.5": - version: 2.8.5 - resolution: "cors@npm:2.8.5" - dependencies: - object-assign: "npm:^4" - vary: "npm:^1" - checksum: 10c0/373702b7999409922da80de4a61938aabba6929aea5b6fd9096fefb9e8342f626c0ebd7507b0e8b0b311380744cc985f27edebc0a26e0ddb784b54e1085de761 - languageName: node - linkType: hard - -"cose-base@npm:^1.0.0": - version: 1.0.3 - resolution: "cose-base@npm:1.0.3" - dependencies: - layout-base: "npm:^1.0.0" - checksum: 10c0/a6e400b1d101393d6af0967c1353355777c1106c40417c5acaef6ca8bdda41e2fc9398f466d6c85be30290943ad631f2590569f67b3fd5368a0d8318946bd24f - languageName: node - linkType: hard - -"cose-base@npm:^2.2.0": - version: 2.2.0 - resolution: "cose-base@npm:2.2.0" - dependencies: - layout-base: "npm:^2.0.0" - checksum: 10c0/14b9f8100ac322a00777ffb1daeb3321af368bbc9cabe3103943361273baee2003202ffe38e4ab770960b600214224e9c196195a78d589521540aa694df7cdec - languageName: node - linkType: hard - -"crelt@npm:^1.0.5": - version: 1.0.6 - resolution: "crelt@npm:1.0.6" - checksum: 10c0/e0fb76dff50c5eb47f2ea9b786c17f9425c66276025adee80876bdbf4a84ab72e899e56d3928431ab0cb057a105ef704df80fe5726ef0f7b1658f815521bdf09 - languageName: node - linkType: hard - -"cron-parser@npm:4.9.0": - version: 4.9.0 - resolution: "cron-parser@npm:4.9.0" - dependencies: - luxon: "npm:^3.2.1" - checksum: 10c0/348622bdcd1a15695b61fc33af8a60133e5913a85cf99f6344367579e7002896514ba3b0a9d6bb569b02667d6b06836722bf2295fcd101b3de378f71d37bed0b - languageName: node - linkType: hard - -"cross-env@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-env@npm:7.0.3" - dependencies: - cross-spawn: "npm:^7.0.1" - bin: - cross-env: src/bin/cross-env.js - cross-env-shell: src/bin/cross-env-shell.js - checksum: 10c0/f3765c25746c69fcca369655c442c6c886e54ccf3ab8c16847d5ad0e91e2f337d36eedc6599c1227904bf2a228d721e690324446876115bc8e7b32a866735ecf - languageName: node - linkType: hard - -"cross-fetch@npm:^4.0.0": - version: 4.1.0 - resolution: "cross-fetch@npm:4.1.0" - dependencies: - node-fetch: "npm:^2.7.0" - checksum: 10c0/628b134ea27cfcada67025afe6ef1419813fffc5d63d175553efa75a2334522d450300a0f3f0719029700da80e96327930709d5551cf6deb39bb62f1d536642e - languageName: node - linkType: hard - -"cross-spawn@npm:^6.0.5": - version: 6.0.6 - resolution: "cross-spawn@npm:6.0.6" - dependencies: - nice-try: "npm:^1.0.4" - path-key: "npm:^2.0.1" - semver: "npm:^5.5.0" - shebang-command: "npm:^1.2.0" - which: "npm:^1.2.9" - checksum: 10c0/bf61fb890e8635102ea9bce050515cf915ff6a50ccaa0b37a17dc82fded0fb3ed7af5478b9367b86baee19127ad86af4be51d209f64fd6638c0862dca185fe1d - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6": - version: 7.0.6 - resolution: "cross-spawn@npm:7.0.6" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 - languageName: node - linkType: hard - -"css-tree@npm:3.2.1": - version: 3.2.1 - resolution: "css-tree@npm:3.2.1" - dependencies: - mdn-data: "npm:2.27.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/1f65e9ccaa56112a4706d6f003dd43d777f0dbcf848e66fd320f823192533581f8dd58daa906cb80622658332d50284d6be13b87a6ab4556cbbfe9ef535bbf7e - languageName: node - linkType: hard - -"cssesc@npm:^3.0.0": - version: 3.0.0 - resolution: "cssesc@npm:3.0.0" - bin: - cssesc: bin/cssesc - checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 - languageName: node - linkType: hard - -"cssstyle@npm:^4.1.0": - version: 4.3.0 - resolution: "cssstyle@npm:4.3.0" - dependencies: - "@asamuzakjp/css-color": "npm:^3.1.1" - rrweb-cssom: "npm:^0.8.0" - checksum: 10c0/770ccb288a99257fd0d5b129e03878f848e922d3b017358acb02e8dd530e8f0c7c6f74e6ae5367d715e2da36a490a734b4177fc1b78f3f08eca25f204a56a692 - languageName: node - linkType: hard - -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 - languageName: node - linkType: hard - -"csstype@npm:^3.1.0, csstype@npm:^3.2.2": - version: 3.2.3 - resolution: "csstype@npm:3.2.3" - checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce - languageName: node - linkType: hard - -"cytoscape-cose-bilkent@npm:^4.1.0": - version: 4.1.0 - resolution: "cytoscape-cose-bilkent@npm:4.1.0" - dependencies: - cose-base: "npm:^1.0.0" - peerDependencies: - cytoscape: ^3.2.0 - checksum: 10c0/5e2480ddba9da1a68e700ed2c674cbfd51e9efdbd55788f1971a68de4eb30708e3b3a5e808bf5628f7a258680406bbe6586d87a9133e02a9bdc1ab1a92f512f2 - languageName: node - linkType: hard - -"cytoscape-fcose@npm:^2.2.0": - version: 2.2.0 - resolution: "cytoscape-fcose@npm:2.2.0" - dependencies: - cose-base: "npm:^2.2.0" - peerDependencies: - cytoscape: ^3.2.0 - checksum: 10c0/ce472c9f85b9057e75c5685396f8e1f2468895e71b184913e05ad56dcf3092618fe59a1054f29cb0995051ba8ebe566ad0dd49a58d62845145624bd60cd44917 - languageName: node - linkType: hard - -"cytoscape@npm:^3.33.3": - version: 3.34.0 - resolution: "cytoscape@npm:3.34.0" - checksum: 10c0/cb17b3dcacb9492f058cff653debf7b5a713e7532a9866cc72ae79d207757e8a9b68430874fe986f2a6404a8161b4fb5c1a2f1ca9ac5b1a21e316f57ed9d1243 - languageName: node - linkType: hard - -"d3-array@npm:1 - 2": - version: 2.12.1 - resolution: "d3-array@npm:2.12.1" - dependencies: - internmap: "npm:^1.0.0" - checksum: 10c0/7eca10427a9f113a4ca6a0f7301127cab26043fd5e362631ef5a0edd1c4b2dd70c56ed317566700c31e4a6d88b55f3951aaba192291817f243b730cb2352882e - languageName: node - linkType: hard - -"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:2.5.0 - 3, d3-array@npm:3, d3-array@npm:^3.1.6, d3-array@npm:^3.2.0": - version: 3.2.4 - resolution: "d3-array@npm:3.2.4" - dependencies: - internmap: "npm:1 - 2" - checksum: 10c0/08b95e91130f98c1375db0e0af718f4371ccacef7d5d257727fe74f79a24383e79aba280b9ffae655483ffbbad4fd1dec4ade0119d88c4749f388641c8bf8c50 - languageName: node - linkType: hard - -"d3-axis@npm:3": - version: 3.0.0 - resolution: "d3-axis@npm:3.0.0" - checksum: 10c0/a271e70ba1966daa5aaf6a7f959ceca3e12997b43297e757c7b945db2e1ead3c6ee226f2abcfa22abbd4e2e28bd2b71a0911794c4e5b911bbba271328a582c78 - languageName: node - linkType: hard - -"d3-brush@npm:3": - version: 3.0.0 - resolution: "d3-brush@npm:3.0.0" - dependencies: - d3-dispatch: "npm:1 - 3" - d3-drag: "npm:2 - 3" - d3-interpolate: "npm:1 - 3" - d3-selection: "npm:3" - d3-transition: "npm:3" - checksum: 10c0/07baf00334c576da2f68a91fc0da5732c3a5fa19bd3d7aed7fd24d1d674a773f71a93e9687c154176f7246946194d77c48c2d8fed757f5dcb1a4740067ec50a8 - languageName: node - linkType: hard - -"d3-chord@npm:3": - version: 3.0.1 - resolution: "d3-chord@npm:3.0.1" - dependencies: - d3-path: "npm:1 - 3" - checksum: 10c0/baa6013914af3f4fe1521f0d16de31a38eb8a71d08ff1dec4741f6f45a828661e5cd3935e39bd14e3032bdc78206c283ca37411da21d46ec3cfc520be6e7a7ce - languageName: node - linkType: hard - -"d3-color@npm:1 - 3, d3-color@npm:3": - version: 3.1.0 - resolution: "d3-color@npm:3.1.0" - checksum: 10c0/a4e20e1115fa696fce041fbe13fbc80dc4c19150fa72027a7c128ade980bc0eeeba4bcf28c9e21f0bce0e0dbfe7ca5869ef67746541dcfda053e4802ad19783c - languageName: node - linkType: hard - -"d3-contour@npm:4": - version: 4.0.2 - resolution: "d3-contour@npm:4.0.2" - dependencies: - d3-array: "npm:^3.2.0" - checksum: 10c0/98bc5fbed6009e08707434a952076f39f1cd6ed8b9288253cc3e6a3286e4e80c63c62d84954b20e64bf6e4ededcc69add54d3db25e990784a59c04edd3449032 - languageName: node - linkType: hard - -"d3-delaunay@npm:6": - version: 6.0.4 - resolution: "d3-delaunay@npm:6.0.4" - dependencies: - delaunator: "npm:5" - checksum: 10c0/57c3aecd2525664b07c4c292aa11cf49b2752c0cf3f5257f752999399fe3c592de2d418644d79df1f255471eec8057a9cc0c3062ed7128cb3348c45f69597754 - languageName: node - linkType: hard - -"d3-dispatch@npm:1 - 3, d3-dispatch@npm:3": - version: 3.0.1 - resolution: "d3-dispatch@npm:3.0.1" - checksum: 10c0/6eca77008ce2dc33380e45d4410c67d150941df7ab45b91d116dbe6d0a3092c0f6ac184dd4602c796dc9e790222bad3ff7142025f5fd22694efe088d1d941753 - languageName: node - linkType: hard - -"d3-drag@npm:2 - 3, d3-drag@npm:3": - version: 3.0.0 - resolution: "d3-drag@npm:3.0.0" - dependencies: - d3-dispatch: "npm:1 - 3" - d3-selection: "npm:3" - checksum: 10c0/d2556e8dc720741a443b595a30af403dd60642dfd938d44d6e9bfc4c71a962142f9a028c56b61f8b4790b65a34acad177d1263d66f103c3c527767b0926ef5aa - languageName: node - linkType: hard - -"d3-dsv@npm:1 - 3, d3-dsv@npm:3": - version: 3.0.1 - resolution: "d3-dsv@npm:3.0.1" - dependencies: - commander: "npm:7" - iconv-lite: "npm:0.6" - rw: "npm:1" - bin: - csv2json: bin/dsv2json.js - csv2tsv: bin/dsv2dsv.js - dsv2dsv: bin/dsv2dsv.js - dsv2json: bin/dsv2json.js - json2csv: bin/json2dsv.js - json2dsv: bin/json2dsv.js - json2tsv: bin/json2dsv.js - tsv2csv: bin/dsv2dsv.js - tsv2json: bin/dsv2json.js - checksum: 10c0/10e6af9e331950ed258f34ab49ac1b7060128ef81dcf32afc790bd1f7e8c3cc2aac7f5f875250a83f21f39bb5925fbd0872bb209f8aca32b3b77d32bab8a65ab - languageName: node - linkType: hard - -"d3-ease@npm:1 - 3, d3-ease@npm:3, d3-ease@npm:^3.0.1": - version: 3.0.1 - resolution: "d3-ease@npm:3.0.1" - checksum: 10c0/fec8ef826c0cc35cda3092c6841e07672868b1839fcaf556e19266a3a37e6bc7977d8298c0fcb9885e7799bfdcef7db1baaba9cd4dcf4bc5e952cf78574a88b0 - languageName: node - linkType: hard - -"d3-fetch@npm:3": - version: 3.0.1 - resolution: "d3-fetch@npm:3.0.1" - dependencies: - d3-dsv: "npm:1 - 3" - checksum: 10c0/4f467a79bf290395ac0cbb5f7562483f6a18668adc4c8eb84c9d3eff048b6f6d3b6f55079ba1ebf1908dabe000c941d46be447f8d78453b2dad5fb59fb6aa93b - languageName: node - linkType: hard - -"d3-force@npm:3": - version: 3.0.0 - resolution: "d3-force@npm:3.0.0" - dependencies: - d3-dispatch: "npm:1 - 3" - d3-quadtree: "npm:1 - 3" - d3-timer: "npm:1 - 3" - checksum: 10c0/220a16a1a1ac62ba56df61028896e4b52be89c81040d20229c876efc8852191482c233f8a52bb5a4e0875c321b8e5cb6413ef3dfa4d8fe79eeb7d52c587f52cf - languageName: node - linkType: hard - -"d3-format@npm:1 - 3": - version: 3.1.0 - resolution: "d3-format@npm:3.1.0" - checksum: 10c0/049f5c0871ebce9859fc5e2f07f336b3c5bfff52a2540e0bac7e703fce567cd9346f4ad1079dd18d6f1e0eaa0599941c1810898926f10ac21a31fd0a34b4aa75 - languageName: node - linkType: hard - -"d3-format@npm:3": - version: 3.1.2 - resolution: "d3-format@npm:3.1.2" - checksum: 10c0/0de452ae07585238e7f01607a7e0066665c34609652188b6ac7dc9f424f69465a425e07d16d79bd0e5955202ac7f241c66d0c76f68a79fc6f4857c94cf420652 - languageName: node - linkType: hard - -"d3-geo@npm:3": - version: 3.1.1 - resolution: "d3-geo@npm:3.1.1" - dependencies: - d3-array: "npm:2.5.0 - 3" - checksum: 10c0/d32270dd2dc8ac3ea63e8805d63239c4c8ec6c0d339d73b5e5a30a87f8f54db22a78fb434369799465eae169503b25f9a107c642c8a16c32a3285bc0e6d8e8c1 - languageName: node - linkType: hard - -"d3-hierarchy@npm:3": - version: 3.1.2 - resolution: "d3-hierarchy@npm:3.1.2" - checksum: 10c0/6dcdb480539644aa7fc0d72dfc7b03f99dfbcdf02714044e8c708577e0d5981deb9d3e99bbbb2d26422b55bcc342ac89a0fa2ea6c9d7302e2fc0951dd96f89cf - languageName: node - linkType: hard - -"d3-interpolate@npm:1 - 3, d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:3, d3-interpolate@npm:^3.0.1": - version: 3.0.1 - resolution: "d3-interpolate@npm:3.0.1" - dependencies: - d3-color: "npm:1 - 3" - checksum: 10c0/19f4b4daa8d733906671afff7767c19488f51a43d251f8b7f484d5d3cfc36c663f0a66c38fe91eee30f40327443d799be17169f55a293a3ba949e84e57a33e6a - languageName: node - linkType: hard - -"d3-path@npm:1": - version: 1.0.9 - resolution: "d3-path@npm:1.0.9" - checksum: 10c0/e35e84df5abc18091f585725b8235e1fa97efc287571585427d3a3597301e6c506dea56b11dfb3c06ca5858b3eb7f02c1bf4f6a716aa9eade01c41b92d497eb5 - languageName: node - linkType: hard - -"d3-path@npm:1 - 3, d3-path@npm:3, d3-path@npm:^3.1.0": - version: 3.1.0 - resolution: "d3-path@npm:3.1.0" - checksum: 10c0/dc1d58ec87fa8319bd240cf7689995111a124b141428354e9637aa83059eb12e681f77187e0ada5dedfce346f7e3d1f903467ceb41b379bfd01cd8e31721f5da - languageName: node - linkType: hard - -"d3-polygon@npm:3": - version: 3.0.1 - resolution: "d3-polygon@npm:3.0.1" - checksum: 10c0/e236aa7f33efa9a4072907af7dc119f85b150a0716759d4fe5f12f62573018264a6cbde8617fbfa6944a7ae48c1c0c8d3f39ae72e11f66dd471e9b5e668385df - languageName: node - linkType: hard - -"d3-quadtree@npm:1 - 3, d3-quadtree@npm:3": - version: 3.0.1 - resolution: "d3-quadtree@npm:3.0.1" - checksum: 10c0/18302d2548bfecaef788152397edec95a76400fd97d9d7f42a089ceb68d910f685c96579d74e3712d57477ed042b056881b47cd836a521de683c66f47ce89090 - languageName: node - linkType: hard - -"d3-random@npm:3": - version: 3.0.1 - resolution: "d3-random@npm:3.0.1" - checksum: 10c0/987a1a1bcbf26e6cf01fd89d5a265b463b2cea93560fc17d9b1c45e8ed6ff2db5924601bcceb808de24c94133f000039eb7fa1c469a7a844ccbf1170cbb25b41 - languageName: node - linkType: hard - -"d3-sankey@npm:^0.12.3": - version: 0.12.3 - resolution: "d3-sankey@npm:0.12.3" - dependencies: - d3-array: "npm:1 - 2" - d3-shape: "npm:^1.2.0" - checksum: 10c0/261debb01a13269f6fc53b9ebaef174a015d5ad646242c23995bf514498829ab8b8f920a7873724a7494288b46bea3ce7ebc5a920b745bc8ae4caa5885cf5204 - languageName: node - linkType: hard - -"d3-scale-chromatic@npm:3": - version: 3.1.0 - resolution: "d3-scale-chromatic@npm:3.1.0" - dependencies: - d3-color: "npm:1 - 3" - d3-interpolate: "npm:1 - 3" - checksum: 10c0/9a3f4671ab0b971f4a411b42180d7cf92bfe8e8584e637ce7e698d705e18d6d38efbd20ec64f60cc0dfe966c20d40fc172565bc28aaa2990c0a006360eed91af - languageName: node - linkType: hard - -"d3-scale@npm:4, d3-scale@npm:^4.0.2": - version: 4.0.2 - resolution: "d3-scale@npm:4.0.2" - dependencies: - d3-array: "npm:2.10.0 - 3" - d3-format: "npm:1 - 3" - d3-interpolate: "npm:1.2.0 - 3" - d3-time: "npm:2.1.1 - 3" - d3-time-format: "npm:2 - 4" - checksum: 10c0/65d9ad8c2641aec30ed5673a7410feb187a224d6ca8d1a520d68a7d6eac9d04caedbff4713d1e8545be33eb7fec5739983a7ab1d22d4e5ad35368c6729d362f1 - languageName: node - linkType: hard - -"d3-selection@npm:2 - 3, d3-selection@npm:3, d3-selection@npm:^3.0.0": - version: 3.0.0 - resolution: "d3-selection@npm:3.0.0" - checksum: 10c0/e59096bbe8f0cb0daa1001d9bdd6dbc93a688019abc97d1d8b37f85cd3c286a6875b22adea0931b0c88410d025563e1643019161a883c516acf50c190a11b56b - languageName: node - linkType: hard - -"d3-shape@npm:3, d3-shape@npm:^3.1.0": - version: 3.2.0 - resolution: "d3-shape@npm:3.2.0" - dependencies: - d3-path: "npm:^3.1.0" - checksum: 10c0/f1c9d1f09926daaf6f6193ae3b4c4b5521e81da7d8902d24b38694517c7f527ce3c9a77a9d3a5722ad1e3ff355860b014557b450023d66a944eabf8cfde37132 - languageName: node - linkType: hard - -"d3-shape@npm:^1.2.0": - version: 1.3.7 - resolution: "d3-shape@npm:1.3.7" - dependencies: - d3-path: "npm:1" - checksum: 10c0/548057ce59959815decb449f15632b08e2a1bdce208f9a37b5f98ec7629dda986c2356bc7582308405ce68aedae7d47b324df41507404df42afaf352907577ae - languageName: node - linkType: hard - -"d3-time-format@npm:2 - 4, d3-time-format@npm:4": - version: 4.1.0 - resolution: "d3-time-format@npm:4.1.0" - dependencies: - d3-time: "npm:1 - 3" - checksum: 10c0/735e00fb25a7fd5d418fac350018713ae394eefddb0d745fab12bbff0517f9cdb5f807c7bbe87bb6eeb06249662f8ea84fec075f7d0cd68609735b2ceb29d206 - languageName: node - linkType: hard - -"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:3, d3-time@npm:^3.0.0": - version: 3.1.0 - resolution: "d3-time@npm:3.1.0" - dependencies: - d3-array: "npm:2 - 3" - checksum: 10c0/a984f77e1aaeaa182679b46fbf57eceb6ebdb5f67d7578d6f68ef933f8eeb63737c0949991618a8d29472dbf43736c7d7f17c452b2770f8c1271191cba724ca1 - languageName: node - linkType: hard - -"d3-timer@npm:1 - 3, d3-timer@npm:3, d3-timer@npm:^3.0.1": - version: 3.0.1 - resolution: "d3-timer@npm:3.0.1" - checksum: 10c0/d4c63cb4bb5461d7038aac561b097cd1c5673969b27cbdd0e87fa48d9300a538b9e6f39b4a7f0e3592ef4f963d858c8a9f0e92754db73116770856f2fc04561a - languageName: node - linkType: hard - -"d3-transition@npm:2 - 3, d3-transition@npm:3, d3-transition@npm:^3.0.1": - version: 3.0.1 - resolution: "d3-transition@npm:3.0.1" - dependencies: - d3-color: "npm:1 - 3" - d3-dispatch: "npm:1 - 3" - d3-ease: "npm:1 - 3" - d3-interpolate: "npm:1 - 3" - d3-timer: "npm:1 - 3" - peerDependencies: - d3-selection: 2 - 3 - checksum: 10c0/4e74535dda7024aa43e141635b7522bb70cf9d3dfefed975eb643b36b864762eca67f88fafc2ca798174f83ca7c8a65e892624f824b3f65b8145c6a1a88dbbad - languageName: node - linkType: hard - -"d3-zoom@npm:3": - version: 3.0.0 - resolution: "d3-zoom@npm:3.0.0" - dependencies: - d3-dispatch: "npm:1 - 3" - d3-drag: "npm:2 - 3" - d3-interpolate: "npm:1 - 3" - d3-selection: "npm:2 - 3" - d3-transition: "npm:2 - 3" - checksum: 10c0/ee2036479049e70d8c783d594c444fe00e398246048e3f11a59755cd0e21de62ece3126181b0d7a31bf37bcf32fd726f83ae7dea4495ff86ec7736ce5ad36fd3 - languageName: node - linkType: hard - -"d3@npm:^7.9.0": - version: 7.9.0 - resolution: "d3@npm:7.9.0" - dependencies: - d3-array: "npm:3" - d3-axis: "npm:3" - d3-brush: "npm:3" - d3-chord: "npm:3" - d3-color: "npm:3" - d3-contour: "npm:4" - d3-delaunay: "npm:6" - d3-dispatch: "npm:3" - d3-drag: "npm:3" - d3-dsv: "npm:3" - d3-ease: "npm:3" - d3-fetch: "npm:3" - d3-force: "npm:3" - d3-format: "npm:3" - d3-geo: "npm:3" - d3-hierarchy: "npm:3" - d3-interpolate: "npm:3" - d3-path: "npm:3" - d3-polygon: "npm:3" - d3-quadtree: "npm:3" - d3-random: "npm:3" - d3-scale: "npm:4" - d3-scale-chromatic: "npm:3" - d3-selection: "npm:3" - d3-shape: "npm:3" - d3-time: "npm:3" - d3-time-format: "npm:4" - d3-timer: "npm:3" - d3-transition: "npm:3" - d3-zoom: "npm:3" - checksum: 10c0/3dd9c08c73cfaa69c70c49e603c85e049c3904664d9c79a1a52a0f52795828a1ff23592dc9a7b2257e711d68a615472a13103c212032f38e016d609796e087e8 - languageName: node - linkType: hard - -"dagre-d3-es@npm:7.0.14": - version: 7.0.14 - resolution: "dagre-d3-es@npm:7.0.14" - dependencies: - d3: "npm:^7.9.0" - lodash-es: "npm:^4.17.21" - checksum: 10c0/0dc91fc79300eb0a4eab5a48a76c2baf3ce439c389d19e2f015729bb57dafd75e1e9a4c2880daf016e81ee45caca7b21745c13b23b6cd2a786ce84767e88323e - languageName: node - linkType: hard - -"damerau-levenshtein@npm:^1.0.8": - version: 1.0.8 - resolution: "damerau-levenshtein@npm:1.0.8" - checksum: 10c0/4c2647e0f42acaee7d068756c1d396e296c3556f9c8314bac1ac63ffb236217ef0e7e58602b18bb2173deec7ec8e0cac8e27cccf8f5526666b4ff11a13ad54a3 - languageName: node - linkType: hard - -"data-uri-to-buffer@npm:^4.0.0": - version: 4.0.1 - resolution: "data-uri-to-buffer@npm:4.0.1" - checksum: 10c0/20a6b93107597530d71d4cb285acee17f66bcdfc03fd81040921a81252f19db27588d87fc8fc69e1950c55cfb0bf8ae40d0e5e21d907230813eb5d5a7f9eb45b - languageName: node - linkType: hard - -"data-urls@npm:^5.0.0": - version: 5.0.0 - resolution: "data-urls@npm:5.0.0" - dependencies: - whatwg-mimetype: "npm:^4.0.0" - whatwg-url: "npm:^14.0.0" - checksum: 10c0/1b894d7d41c861f3a4ed2ae9b1c3f0909d4575ada02e36d3d3bc584bdd84278e20709070c79c3b3bff7ac98598cb191eb3e86a89a79ea4ee1ef360e1694f92ad - languageName: node - linkType: hard - -"data-view-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "data-view-buffer@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.2" - checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c - languageName: node - linkType: hard - -"data-view-byte-length@npm:^1.0.2": - version: 1.0.2 - resolution: "data-view-byte-length@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.2" - checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 - languageName: node - linkType: hard - -"data-view-byte-offset@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-offset@npm:1.0.1" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 - languageName: node - linkType: hard - -"date-fns-jalali@npm:4.1.0-0": - version: 4.1.0-0 - resolution: "date-fns-jalali@npm:4.1.0-0" - checksum: 10c0/f9ad98d9f7e8e5abe0d070dc806b0c8baded2b1208626c42e92cbd2605b5171f5714d6b79b20cc2666267d821699244c9d0b5e93274106cf57d6232da77596ed - languageName: node - linkType: hard - -"date-fns@npm:^4.1.0": - version: 4.1.0 - resolution: "date-fns@npm:4.1.0" - checksum: 10c0/b79ff32830e6b7faa009590af6ae0fb8c3fd9ffad46d930548fbb5acf473773b4712ae887e156ba91a7b3dc30591ce0f517d69fd83bd9c38650fdc03b4e0bac8 - languageName: node - linkType: hard - -"dayjs@npm:^1.11.20": - version: 1.11.21 - resolution: "dayjs@npm:1.11.21" - checksum: 10c0/bd97dfdc4bfea3c66268635690313828b386faa040fbc1f829ff42a2bd748b72c9d9b3c8f9616ce9e61fcb78923f1461a462c969c54b1084458ae1b715898fb0 - languageName: node - linkType: hard - -"debounce-fn@npm:^6.0.0": - version: 6.0.0 - resolution: "debounce-fn@npm:6.0.0" - dependencies: - mimic-function: "npm:^5.0.0" - checksum: 10c0/ff5c48a7d644e292a653fd602db340b701bddba3973da7f64c6f25bbd9ab0fde9058567fdbe7efc72553561f3393f285413818d58f08614e73e0e85319f1da6e - languageName: node - linkType: hard - -"debounce-promise@npm:^3.1.2": - version: 3.1.2 - resolution: "debounce-promise@npm:3.1.2" - checksum: 10c0/68d22b2ed5e8c890643c1b02dadffc9a6a31ec6db225530f34dfeef14112977bedf735d5141e29264ce608ec59375665d582f0013362fa61c7a92d3c0f2f410d - languageName: node - linkType: hard - -"debounce@npm:^2.0.0": - version: 2.2.0 - resolution: "debounce@npm:2.2.0" - checksum: 10c0/684536fe9a04c9eea46cf02f119f69aa4071813ba25b9b43370e1503ea60b34fd38d694c7145fa2be504f9d40e7e39354cb9ed155c70954a0eefa391aefe271c - languageName: node - linkType: hard - -"debug@npm:2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: "npm:2.0.0" - checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0": - version: 4.4.0 - resolution: "debug@npm:4.4.0" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de - languageName: node - linkType: hard - -"debug@npm:4.4.3, debug@npm:^4.4.1, debug@npm:^4.4.3, debug@npm:~4.4.1": - version: 4.4.3 - resolution: "debug@npm:4.4.3" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 - languageName: node - linkType: hard - -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - -"debug@npm:^4.0.0": - version: 4.4.1 - resolution: "debug@npm:4.4.1" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 - languageName: node - linkType: hard - -"debug@npm:~4.3.2": - version: 4.3.7 - resolution: "debug@npm:4.3.7" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b - languageName: node - linkType: hard - -"decamelize@npm:1.2.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 - languageName: node - linkType: hard - -"decimal.js-light@npm:^2.4.1": - version: 2.5.1 - resolution: "decimal.js-light@npm:2.5.1" - checksum: 10c0/4fd33f535aac9e5bd832796831b65d9ec7914ad129c7437b3ab991b0c2eaaa5a57e654e6174c4a17f1b3895ea366f0c1ab4955cdcdf7cfdcf3ad5a58b456c020 - languageName: node - linkType: hard - -"decimal.js@npm:^10.4.3": - version: 10.5.0 - resolution: "decimal.js@npm:10.5.0" - checksum: 10c0/785c35279df32762143914668df35948920b6c1c259b933e0519a69b7003fc0a5ed2a766b1e1dda02574450c566b21738a45f15e274b47c2ac02072c0d1f3ac3 - languageName: node - linkType: hard - -"decode-named-character-reference@npm:^1.0.0": - version: 1.2.0 - resolution: "decode-named-character-reference@npm:1.2.0" - dependencies: - character-entities: "npm:^2.0.0" - checksum: 10c0/761a89de6b0e0a2d4b21ae99074e4cc3344dd11eb29f112e23cc5909f2e9f33c5ed20cd6b146b27fb78170bce0f3f9b3362a84b75638676a05c938c24a60f5d7 - languageName: node - linkType: hard - -"dedent@npm:^1.7.1": - version: 1.7.1 - resolution: "dedent@npm:1.7.1" - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - checksum: 10c0/ae29ec1c5bd5216c698c9f23acaa5b720260fd4cef3c8b5af887eb5f8c9e6fdd5fed8668767437b4efea35e2991bd798987717633411a1734807c28255769b78 - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c - languageName: node - linkType: hard - -"deepmerge@npm:^4.3.1": - version: 4.3.1 - resolution: "deepmerge@npm:4.3.1" - checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 - languageName: node - linkType: hard - -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 - languageName: node - linkType: hard - -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": - version: 1.2.1 - resolution: "define-properties@npm:1.2.1" - dependencies: - define-data-property: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 - languageName: node - linkType: hard - -"delaunator@npm:5": - version: 5.1.0 - resolution: "delaunator@npm:5.1.0" - dependencies: - robust-predicates: "npm:^3.0.2" - checksum: 10c0/6489e3598212ab8759575e30f3ac26063471846e25c779048f441f2ccefd25efb9a52275e7e8e3dcc5bf5bc5c35169cf1de27f985d359fd5a24057be88fd1817 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 - languageName: node - linkType: hard - -"denque@npm:2.1.0": - version: 2.1.0 - resolution: "denque@npm:2.1.0" - checksum: 10c0/f9ef81aa0af9c6c614a727cb3bd13c5d7db2af1abf9e6352045b86e85873e629690f6222f4edd49d10e4ccf8f078bbeec0794fafaf61b659c0589d0c511ec363 - languageName: node - linkType: hard - -"depd@npm:2.0.0, depd@npm:^2.0.0, depd@npm:~2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c - languageName: node - linkType: hard - -"dequal@npm:^2.0.0, dequal@npm:^2.0.3": - version: 2.0.3 - resolution: "dequal@npm:2.0.3" - checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 - languageName: node - linkType: hard - -"des.js@npm:^1.1.0": - version: 1.1.0 - resolution: "des.js@npm:1.1.0" - dependencies: - inherits: "npm:^2.0.1" - minimalistic-assert: "npm:^1.0.0" - checksum: 10c0/671354943ad67493e49eb4c555480ab153edd7cee3a51c658082fcde539d2690ed2a4a0b5d1f401f9cde822edf3939a6afb2585f32c091f2d3a1b1665cd45236 - languageName: node - linkType: hard - -"destroy@npm:1.2.0, destroy@npm:~1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.1, detect-libc@npm:^2.0.3": - version: 2.0.3 - resolution: "detect-libc@npm:2.0.3" - checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 - languageName: node - linkType: hard - -"detect-libc@npm:^2.1.2": - version: 2.1.2 - resolution: "detect-libc@npm:2.1.2" - checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 - languageName: node - linkType: hard - -"detect-node-es@npm:^1.1.0": - version: 1.1.0 - resolution: "detect-node-es@npm:1.1.0" - checksum: 10c0/e562f00de23f10c27d7119e1af0e7388407eb4b06596a25f6d79a360094a109ff285de317f02b090faae093d314cf6e73ac3214f8a5bb3a0def5bece94557fbe - languageName: node - linkType: hard - -"devlop@npm:^1.0.0, devlop@npm:^1.1.0": - version: 1.1.0 - resolution: "devlop@npm:1.1.0" - dependencies: - dequal: "npm:^2.0.0" - checksum: 10c0/e0928ab8f94c59417a2b8389c45c55ce0a02d9ac7fd74ef62d01ba48060129e1d594501b77de01f3eeafc7cb00773819b0df74d96251cf20b31c5b3071f45c0e - languageName: node - linkType: hard - -"didyoumean@npm:^1.2.2": - version: 1.2.2 - resolution: "didyoumean@npm:1.2.2" - checksum: 10c0/95d0b53d23b851aacff56dfadb7ecfedce49da4232233baecfeecb7710248c4aa03f0aa8995062f0acafaf925adf8536bd7044a2e68316fd7d411477599bc27b - languageName: node - linkType: hard - -"direction@npm:^1.0.4": - version: 1.0.4 - resolution: "direction@npm:1.0.4" - bin: - direction: cli.js - checksum: 10c0/2257006edba01b3294322311a212a3f0e7c656d710ab164fd95123a2a9daaec536252c60da6a9df5be2bb89e9030684e9d1c7804fe82c9b3f510c2f737adeada - languageName: node - linkType: hard - -"discontinuous-range@npm:1.0.0": - version: 1.0.0 - resolution: "discontinuous-range@npm:1.0.0" - checksum: 10c0/487b105f83c1cc528e25e65d3c4b73958ec79769b7bd0e264414702a23a7e2b282c72982b4bef4af29fcab53f47816c3f0a5c40d85a99a490f4bc35b83dc00f8 - languageName: node - linkType: hard - -"dlv@npm:^1.1.3": - version: 1.1.3 - resolution: "dlv@npm:1.1.3" - checksum: 10c0/03eb4e769f19a027fd5b43b59e8a05e3fd2100ac239ebb0bf9a745de35d449e2f25cfaf3aa3934664551d72856f4ae8b7822016ce5c42c2d27c18ae79429ec42 - languageName: node - linkType: hard - -"doctrine@npm:^2.1.0": - version: 2.1.0 - resolution: "doctrine@npm:2.1.0" - dependencies: - esutils: "npm:^2.0.2" - checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac - languageName: node - linkType: hard - -"dom-accessibility-api@npm:^0.5.9": - version: 0.5.16 - resolution: "dom-accessibility-api@npm:0.5.16" - checksum: 10c0/b2c2eda4fae568977cdac27a9f0c001edf4f95a6a6191dfa611e3721db2478d1badc01db5bb4fa8a848aeee13e442a6c2a4386d65ec65a1436f24715a2f8d053 - languageName: node - linkType: hard - -"dom-helpers@npm:^5.0.1": - version: 5.2.1 - resolution: "dom-helpers@npm:5.2.1" - dependencies: - "@babel/runtime": "npm:^7.8.7" - csstype: "npm:^3.0.2" - checksum: 10c0/f735074d66dd759b36b158fa26e9d00c9388ee0e8c9b16af941c38f014a37fc80782de83afefd621681b19ac0501034b4f1c4a3bff5caa1b8667f0212b5e124c - languageName: node - linkType: hard - -"dom-serializer@npm:^2.0.0": - version: 2.0.0 - resolution: "dom-serializer@npm:2.0.0" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.2" - entities: "npm:^4.2.0" - checksum: 10c0/d5ae2b7110ca3746b3643d3ef60ef823f5f078667baf530cec096433f1627ec4b6fa8c072f09d079d7cda915fd2c7bc1b7b935681e9b09e591e1e15f4040b8e2 - languageName: node - linkType: hard - -"domelementtype@npm:^2.3.0": - version: 2.3.0 - resolution: "domelementtype@npm:2.3.0" - checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 - languageName: node - linkType: hard - -"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": - version: 5.0.3 - resolution: "domhandler@npm:5.0.3" - dependencies: - domelementtype: "npm:^2.3.0" - checksum: 10c0/bba1e5932b3e196ad6862286d76adc89a0dbf0c773e5ced1eb01f9af930c50093a084eff14b8de5ea60b895c56a04d5de8bbc4930c5543d029091916770b2d2a - languageName: node - linkType: hard - -"dompurify@npm:^3.3.2, dompurify@npm:^3.3.3": - version: 3.4.16 - resolution: "dompurify@npm:3.4.16" - dependencies: - "@types/trusted-types": "npm:^2.0.7" - dependenciesMeta: - "@types/trusted-types": - optional: true - checksum: 10c0/65a901c6b6d489d3e898f67223d81dac66d613cda48f5785f0ed52a4ae320c4b2745490a58c14161e29f0273080fea0a0cb234a9ef892650e1a9b2a7befa07a5 - languageName: node - linkType: hard - -"domutils@npm:^3.0.1": - version: 3.2.2 - resolution: "domutils@npm:3.2.2" - dependencies: - dom-serializer: "npm:^2.0.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - checksum: 10c0/47938f473b987ea71cd59e59626eb8666d3aa8feba5266e45527f3b636c7883cca7e582d901531961f742c519d7514636b7973353b648762b2e3bedbf235fada - languageName: node - linkType: hard - -"dot-prop@npm:^10.0.0": - version: 10.1.0 - resolution: "dot-prop@npm:10.1.0" - dependencies: - type-fest: "npm:^5.0.0" - checksum: 10c0/b034a06f017909ed55c6c164ddea962ccdce3d88b9b092f7106a9b738116a4cd003db5d47a0c6e140e93adbf1922b5e3a147e3d4a124c8556862940446ba5f75 - languageName: node - linkType: hard - -"dotenv-cli@npm:^8.0.0": - version: 8.0.0 - resolution: "dotenv-cli@npm:8.0.0" - dependencies: - cross-spawn: "npm:^7.0.6" - dotenv: "npm:^16.3.0" - dotenv-expand: "npm:^10.0.0" - minimist: "npm:^1.2.6" - bin: - dotenv: cli.js - checksum: 10c0/000469632758b7b44aaaa80cbbbd7f0c94dc170ec02e51aa8d8280341a0108fb7407954c23054257b77235b064033efdb8745836633eb6fd1586924953cf0528 - languageName: node - linkType: hard - -"dotenv-expand@npm:^10.0.0": - version: 10.0.0 - resolution: "dotenv-expand@npm:10.0.0" - checksum: 10c0/298f5018e29cfdcb0b5f463ba8e8627749103fbcf6cf81c561119115754ed582deee37b49dfc7253028aaba875ab7aea5fa90e5dac88e511d009ab0e6677924e - languageName: node - linkType: hard - -"dotenv@npm:^16.3.0, dotenv@npm:^16.3.1, dotenv@npm:^16.4.5": - version: 16.4.7 - resolution: "dotenv@npm:16.4.7" - checksum: 10c0/be9f597e36a8daf834452daa1f4cc30e5375a5968f98f46d89b16b983c567398a330580c88395069a77473943c06b877d1ca25b4afafcdd6d4adb549e8293462 - languageName: node - linkType: hard - -"dotenv@npm:^17.4.2": - version: 17.4.2 - resolution: "dotenv@npm:17.4.2" - checksum: 10c0/164f8e77a646c8446867d5b588d26ea6005c8ea7c5eb41cf926f6113d23f2191355f6e0cfd95ea9bab98394a5b0a3f1e51a8399711b666fe55cc7b0bd745f942 - languageName: node - linkType: hard - -"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "dunder-proto@npm:1.0.1" - dependencies: - call-bind-apply-helpers: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.2.0" - checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 - languageName: node - linkType: hard - -"duplexer@npm:~0.1.1": - version: 0.1.2 - resolution: "duplexer@npm:0.1.2" - checksum: 10c0/c57bcd4bdf7e623abab2df43a7b5b23d18152154529d166c1e0da6bee341d84c432d157d7e97b32fecb1bf3a8b8857dd85ed81a915789f550637ed25b8e64fc2 - languageName: node - linkType: hard - -"duplexify@npm:^4.1.3": - version: 4.1.3 - resolution: "duplexify@npm:4.1.3" - dependencies: - end-of-stream: "npm:^1.4.1" - inherits: "npm:^2.0.3" - readable-stream: "npm:^3.1.1" - stream-shift: "npm:^1.0.2" - checksum: 10c0/8a7621ae95c89f3937f982fe36d72ea997836a708471a75bb2a0eecde3330311b1e128a6dad510e0fd64ace0c56bff3484ed2e82af0e465600c82117eadfbda5 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 - languageName: node - linkType: hard - -"ebnf@npm:^1.9.1": - version: 1.9.1 - resolution: "ebnf@npm:1.9.1" - bin: - ebnf: dist/bin.js - checksum: 10c0/289a99edaabd15054a0c20da563cd378c3e3e22eec969ff86ae38b10e38a9ad0377c369b208eb7a3e287c1a3c5cb15b33e21d706d492c5f619e8fee2fea4f578 - languageName: node - linkType: hard - -"ecdsa-sig-formatter@npm:1.0.11, ecdsa-sig-formatter@npm:^1.0.11": - version: 1.0.11 - resolution: "ecdsa-sig-formatter@npm:1.0.11" - dependencies: - safe-buffer: "npm:^5.0.1" - checksum: 10c0/ebfbf19d4b8be938f4dd4a83b8788385da353d63307ede301a9252f9f7f88672e76f2191618fd8edfc2f24679236064176fab0b78131b161ee73daa37125408c - languageName: node - linkType: hard - -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 - languageName: node - linkType: hard - -"ejs@npm:^6.0.1": - version: 6.0.1 - resolution: "ejs@npm:6.0.1" - bin: - ejs: bin/cli.js - checksum: 10c0/475665efdab9deb01448a0b136129d138483228520138b2fba7991330255e4e1050eae145124c26101ff1ab158bf5f506f19a8dae5996054fc7e76bb94a12ebd - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.402": - version: 1.5.420 - resolution: "electron-to-chromium@npm:1.5.420" - checksum: 10c0/0c4a4932991cefc9aa655cbb00b3b693680709df9e4eb2fc1a51cab851b735a2be9510c345b5ed6cad571e58e6d27867731607741df82de9535a7eb041fceda2 - languageName: node - linkType: hard - -"element-source@npm:^0.0.3": - version: 0.0.3 - resolution: "element-source@npm:0.0.3" - dependencies: - bippy: "npm:^0.5.32" - checksum: 10c0/82ff07d9e9a5de3c8a881d6b9a359b3e1e7c9be74657a1dfe9dc8ed2418599b3877534e1a1afc078a3de59a6a7286251a56e2c06d31d951b57642ab8277bdd32 - languageName: node - linkType: hard - -"embla-carousel-auto-scroll@npm:^8.3.0": - version: 8.5.2 - resolution: "embla-carousel-auto-scroll@npm:8.5.2" - peerDependencies: - embla-carousel: 8.5.2 - checksum: 10c0/91a62f3d56b2c530ed110d0e408b9e69de2ee43a35e9794bab489a8677986b7e0f06e01639573f3d3f7a252ce80336f3869eaa2d75e24e7a169ab0222db7d240 - languageName: node - linkType: hard - -"embla-carousel-react@npm:^8.3.0": - version: 8.5.2 - resolution: "embla-carousel-react@npm:8.5.2" - dependencies: - embla-carousel: "npm:8.5.2" - embla-carousel-reactive-utils: "npm:8.5.2" - peerDependencies: - react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - checksum: 10c0/8e55a2bc562aed2c55d9debf2523dbd4f2524b0ecea62cf51f8f096ed993af608890084b5f35e1694a8aada087602a12cc4b8a68aeee12b4a33cc8361636c63d - languageName: node - linkType: hard - -"embla-carousel-reactive-utils@npm:8.5.2": - version: 8.5.2 - resolution: "embla-carousel-reactive-utils@npm:8.5.2" - peerDependencies: - embla-carousel: 8.5.2 - checksum: 10c0/aa4870539d9090f9ac02338c3ca3e1710a6f0e6890cd2f6fbf6afcc1eeac48192406f92bf042fe9429cc61709338124baf1514c75227a7a16b19b83e9f376274 - languageName: node - linkType: hard - -"embla-carousel@npm:8.5.2": - version: 8.5.2 - resolution: "embla-carousel@npm:8.5.2" - checksum: 10c0/4bbb04c08616d560a7b47b1897794a077baa5aa27642420b35b3be58ab7b0dc000ef073b6e47d0029b0791c046e0cd39d295704faecb1957d2c315df51be58e6 - languageName: node - linkType: hard - -"emoji-regex-xs@npm:^1.0.0": - version: 1.0.0 - resolution: "emoji-regex-xs@npm:1.0.0" - checksum: 10c0/1082de006991eb05a3324ef0efe1950c7cdf66efc01d4578de82b0d0d62add4e55e97695a8a7eeda826c305081562dc79b477ddf18d886da77f3ba08c4b940a0 - languageName: node - linkType: hard - -"emoji-regex@npm:^10.3.0": - version: 10.6.0 - resolution: "emoji-regex@npm:10.6.0" - checksum: 10c0/1e4aa097bb007301c3b4b1913879ae27327fdc48e93eeefefe3b87e495eb33c5af155300be951b4349ff6ac084f4403dc9eff970acba7c1c572d89396a9a32d7 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 - languageName: node - linkType: hard - -"emojis-list@npm:^3.0.0": - version: 3.0.0 - resolution: "emojis-list@npm:3.0.0" - checksum: 10c0/7dc4394b7b910444910ad64b812392159a21e1a7ecc637c775a440227dcb4f80eff7fe61f4453a7d7603fa23d23d30cc93fe9e4b5ed985b88d6441cd4a35117b - languageName: node - linkType: hard - -"enabled@npm:2.0.x": - version: 2.0.0 - resolution: "enabled@npm:2.0.0" - checksum: 10c0/3b2c2af9bc7f8b9e291610f2dde4a75cf6ee52a68f4dd585482fbdf9a55d65388940e024e56d40bb03e05ef6671f5f53021fa8b72a20e954d7066ec28166713f - languageName: node - linkType: hard - -"encodeurl@npm:^2.0.0, encodeurl@npm:~2.0.0": - version: 2.0.0 - resolution: "encodeurl@npm:2.0.0" - checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 - languageName: node - linkType: hard - -"end-of-stream@npm:^1.4.1": - version: 1.4.5 - resolution: "end-of-stream@npm:1.4.5" - dependencies: - once: "npm:^1.4.0" - checksum: 10c0/b0701c92a10b89afb1cb45bf54a5292c6f008d744eb4382fa559d54775ff31617d1d7bc3ef617575f552e24fad2c7c1a1835948c66b3f3a4be0a6c1f35c883d8 - languageName: node - linkType: hard - -"engine.io-parser@npm:~5.2.1": - version: 5.2.3 - resolution: "engine.io-parser@npm:5.2.3" - checksum: 10c0/ed4900d8dbef470ab3839ccf3bfa79ee518ea8277c7f1f2759e8c22a48f64e687ea5e474291394d0c94f84054749fd93f3ef0acb51fa2f5f234cc9d9d8e7c536 - languageName: node - linkType: hard - -"engine.io@npm:~6.6.0": - version: 6.6.11 - resolution: "engine.io@npm:6.6.11" - dependencies: - "@types/cors": "npm:^2.8.12" - "@types/node": "npm:>=10.0.0" - "@types/ws": "npm:^8.5.12" - accepts: "npm:~1.3.4" - cookie: "npm:~0.7.2" - cors: "npm:~2.8.5" - debug: "npm:~4.4.1" - engine.io-parser: "npm:~5.2.1" - ws: "npm:~8.21.0" - checksum: 10c0/b15b395dbbb8ea98942786f738794d2c2a38b9aa79d2d0eb861e26e20a9ac27beaf178e5bcf9b725bc85625748f7eb66158407932c25b89ef41e783bdbf22bc6 - languageName: node - linkType: hard - -"entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": - version: 4.5.0 - resolution: "entities@npm:4.5.0" - checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 - languageName: node - linkType: hard - -"entities@npm:^6.0.0": - version: 6.0.1 - resolution: "entities@npm:6.0.1" - checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"env-paths@npm:^3.0.0": - version: 3.0.0 - resolution: "env-paths@npm:3.0.0" - checksum: 10c0/76dec878cee47f841103bacd7fae03283af16f0702dad65102ef0a556f310b98a377885e0f32943831eb08b5ab37842a323d02529f3dfd5d0a40ca71b01b435f - languageName: node - linkType: hard - -"environment@npm:^1.0.0": - version: 1.1.0 - resolution: "environment@npm:1.1.0" - checksum: 10c0/fb26434b0b581ab397039e51ff3c92b34924a98b2039dcb47e41b7bca577b9dbf134a8eadb364415c74464b682e2d3afe1a4c0eb9873dc44ea814c5d3103331d - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce - languageName: node - linkType: hard - -"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": - version: 1.23.9 - resolution: "es-abstract@npm:1.23.9" - dependencies: - array-buffer-byte-length: "npm:^1.0.2" - arraybuffer.prototype.slice: "npm:^1.0.4" - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - data-view-buffer: "npm:^1.0.2" - data-view-byte-length: "npm:^1.0.2" - data-view-byte-offset: "npm:^1.0.1" - es-define-property: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - es-set-tostringtag: "npm:^2.1.0" - es-to-primitive: "npm:^1.3.0" - function.prototype.name: "npm:^1.1.8" - get-intrinsic: "npm:^1.2.7" - get-proto: "npm:^1.0.0" - get-symbol-description: "npm:^1.1.0" - globalthis: "npm:^1.0.4" - gopd: "npm:^1.2.0" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - hasown: "npm:^2.0.2" - internal-slot: "npm:^1.1.0" - is-array-buffer: "npm:^3.0.5" - is-callable: "npm:^1.2.7" - is-data-view: "npm:^1.0.2" - is-regex: "npm:^1.2.1" - is-shared-array-buffer: "npm:^1.0.4" - is-string: "npm:^1.1.1" - is-typed-array: "npm:^1.1.15" - is-weakref: "npm:^1.1.0" - math-intrinsics: "npm:^1.1.0" - object-inspect: "npm:^1.13.3" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.7" - own-keys: "npm:^1.0.1" - regexp.prototype.flags: "npm:^1.5.3" - safe-array-concat: "npm:^1.1.3" - safe-push-apply: "npm:^1.0.0" - safe-regex-test: "npm:^1.1.0" - set-proto: "npm:^1.0.0" - string.prototype.trim: "npm:^1.2.10" - string.prototype.trimend: "npm:^1.0.9" - string.prototype.trimstart: "npm:^1.0.8" - typed-array-buffer: "npm:^1.0.3" - typed-array-byte-length: "npm:^1.0.3" - typed-array-byte-offset: "npm:^1.0.4" - typed-array-length: "npm:^1.0.7" - unbox-primitive: "npm:^1.1.0" - which-typed-array: "npm:^1.1.18" - checksum: 10c0/1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b - languageName: node - linkType: hard - -"es-abstract@npm:^1.24.0": - version: 1.24.0 - resolution: "es-abstract@npm:1.24.0" - dependencies: - array-buffer-byte-length: "npm:^1.0.2" - arraybuffer.prototype.slice: "npm:^1.0.4" - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.4" - data-view-buffer: "npm:^1.0.2" - data-view-byte-length: "npm:^1.0.2" - data-view-byte-offset: "npm:^1.0.1" - es-define-property: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.1.1" - es-set-tostringtag: "npm:^2.1.0" - es-to-primitive: "npm:^1.3.0" - function.prototype.name: "npm:^1.1.8" - get-intrinsic: "npm:^1.3.0" - get-proto: "npm:^1.0.1" - get-symbol-description: "npm:^1.1.0" - globalthis: "npm:^1.0.4" - gopd: "npm:^1.2.0" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - hasown: "npm:^2.0.2" - internal-slot: "npm:^1.1.0" - is-array-buffer: "npm:^3.0.5" - is-callable: "npm:^1.2.7" - is-data-view: "npm:^1.0.2" - is-negative-zero: "npm:^2.0.3" - is-regex: "npm:^1.2.1" - is-set: "npm:^2.0.3" - is-shared-array-buffer: "npm:^1.0.4" - is-string: "npm:^1.1.1" - is-typed-array: "npm:^1.1.15" - is-weakref: "npm:^1.1.1" - math-intrinsics: "npm:^1.1.0" - object-inspect: "npm:^1.13.4" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.7" - own-keys: "npm:^1.0.1" - regexp.prototype.flags: "npm:^1.5.4" - safe-array-concat: "npm:^1.1.3" - safe-push-apply: "npm:^1.0.0" - safe-regex-test: "npm:^1.1.0" - set-proto: "npm:^1.0.0" - stop-iteration-iterator: "npm:^1.1.0" - string.prototype.trim: "npm:^1.2.10" - string.prototype.trimend: "npm:^1.0.9" - string.prototype.trimstart: "npm:^1.0.8" - typed-array-buffer: "npm:^1.0.3" - typed-array-byte-length: "npm:^1.0.3" - typed-array-byte-offset: "npm:^1.0.4" - typed-array-length: "npm:^1.0.7" - unbox-primitive: "npm:^1.1.0" - which-typed-array: "npm:^1.1.19" - checksum: 10c0/b256e897be32df5d382786ce8cce29a1dd8c97efbab77a26609bd70f2ed29fbcfc7a31758cb07488d532e7ccccdfca76c1118f2afe5a424cdc05ca007867c318 - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": - version: 1.0.1 - resolution: "es-define-property@npm:1.0.1" - checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 - languageName: node - linkType: hard - -"es-iterator-helpers@npm:^1.2.1": - version: 1.2.1 - resolution: "es-iterator-helpers@npm:1.2.1" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.6" - es-errors: "npm:^1.3.0" - es-set-tostringtag: "npm:^2.0.3" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.6" - globalthis: "npm:^1.0.4" - gopd: "npm:^1.2.0" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - internal-slot: "npm:^1.1.0" - iterator.prototype: "npm:^1.1.4" - safe-array-concat: "npm:^1.1.3" - checksum: 10c0/97e3125ca472d82d8aceea11b790397648b52c26d8768ea1c1ee6309ef45a8755bb63225a43f3150c7591cffc17caf5752459f1e70d583b4184370a8f04ebd2f - languageName: node - linkType: hard - -"es-module-lexer@npm:^2.0.0": - version: 2.0.0 - resolution: "es-module-lexer@npm:2.0.0" - checksum: 10c0/ae78dbbd43035a4b972c46cfb6877e374ea290adfc62bc2f5a083fea242c0b2baaab25c5886af86be55f092f4a326741cb94334cd3c478c383fdc8a9ec5ff817 - languageName: node - linkType: hard - -"es-module-lexer@npm:^2.1.0, es-module-lexer@npm:^2.2.0": - version: 2.3.1 - resolution: "es-module-lexer@npm:2.3.1" - checksum: 10c0/ada8b222772b5b8ea92eb6054c383233207418621855a07b480fdd36979b658a41414be09e793fcdd8a67a182741475f47830a01ff2ebd4353d7f6965c7c45f9 - languageName: node - linkType: hard - -"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": - version: 1.1.1 - resolution: "es-object-atoms@npm:1.1.1" - dependencies: - es-errors: "npm:^1.3.0" - checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.0.3, es-set-tostringtag@npm:^2.1.0": - version: 2.1.0 - resolution: "es-set-tostringtag@npm:2.1.0" - dependencies: - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af - languageName: node - linkType: hard - -"es-shim-unscopables@npm:^1.0.2, es-shim-unscopables@npm:^1.1.0": - version: 1.1.0 - resolution: "es-shim-unscopables@npm:1.1.0" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/1b9702c8a1823fc3ef39035a4e958802cf294dd21e917397c561d0b3e195f383b978359816b1732d02b255ccf63e1e4815da0065b95db8d7c992037be3bbbcdb - languageName: node - linkType: hard - -"es-to-primitive@npm:^1.3.0": - version: 1.3.0 - resolution: "es-to-primitive@npm:1.3.0" - dependencies: - is-callable: "npm:^1.2.7" - is-date-object: "npm:^1.0.5" - is-symbol: "npm:^1.0.4" - checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b - languageName: node - linkType: hard - -"es-toolkit@npm:^1.45.1": - version: 1.48.1 - resolution: "es-toolkit@npm:1.48.1" - dependenciesMeta: - "@trivago/prettier-plugin-sort-imports@4.3.0": - unplugged: true - prettier-plugin-sort-re-exports@0.0.1: - unplugged: true - vitepress-plugin-sandpack@1.1.4: - unplugged: true - checksum: 10c0/29bfccb8aaf088f27ea91b5bf6448b8a46ef5d809139ad9335bea6919d0bc3aadc3206c957ab6c72d65864906fd75cf9ab41fbd936aaf69e58c6259d2821187d - languageName: node - linkType: hard - -"esbuild-register@npm:3.6.0": - version: 3.6.0 - resolution: "esbuild-register@npm:3.6.0" - dependencies: - debug: "npm:^4.3.4" - peerDependencies: - esbuild: ">=0.12 <1" - checksum: 10c0/77193b7ca32ba9f81b35ddf3d3d0138efb0b1429d71b39480cfee932e1189dd2e492bd32bf04a4d0bc3adfbc7ec7381ceb5ffd06efe35f3e70904f1f686566d5 - languageName: node - linkType: hard - -"esbuild@npm:^0.28.0": - version: 0.28.1 - resolution: "esbuild@npm:0.28.1" - dependencies: - "@esbuild/aix-ppc64": "npm:0.28.1" - "@esbuild/android-arm": "npm:0.28.1" - "@esbuild/android-arm64": "npm:0.28.1" - "@esbuild/android-x64": "npm:0.28.1" - "@esbuild/darwin-arm64": "npm:0.28.1" - "@esbuild/darwin-x64": "npm:0.28.1" - "@esbuild/freebsd-arm64": "npm:0.28.1" - "@esbuild/freebsd-x64": "npm:0.28.1" - "@esbuild/linux-arm": "npm:0.28.1" - "@esbuild/linux-arm64": "npm:0.28.1" - "@esbuild/linux-ia32": "npm:0.28.1" - "@esbuild/linux-loong64": "npm:0.28.1" - "@esbuild/linux-mips64el": "npm:0.28.1" - "@esbuild/linux-ppc64": "npm:0.28.1" - "@esbuild/linux-riscv64": "npm:0.28.1" - "@esbuild/linux-s390x": "npm:0.28.1" - "@esbuild/linux-x64": "npm:0.28.1" - "@esbuild/netbsd-arm64": "npm:0.28.1" - "@esbuild/netbsd-x64": "npm:0.28.1" - "@esbuild/openbsd-arm64": "npm:0.28.1" - "@esbuild/openbsd-x64": "npm:0.28.1" - "@esbuild/openharmony-arm64": "npm:0.28.1" - "@esbuild/sunos-x64": "npm:0.28.1" - "@esbuild/win32-arm64": "npm:0.28.1" - "@esbuild/win32-ia32": "npm:0.28.1" - "@esbuild/win32-x64": "npm:0.28.1" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-arm64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/openharmony-arm64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/29cd456a79ce35ac2c7e05fe871330416b2c395c045d849653f843e51378d6e0d6e774d6dcd01b35f4e83238a29bf8decd04fcd34b3780c589a250b21e5f92bb - languageName: node - linkType: hard - -"escalade@npm:^3.1.1, escalade@npm:^3.2.0": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 - languageName: node - linkType: hard - -"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 - languageName: node - linkType: hard - -"escape-string-regexp@npm:5.0.0, escape-string-regexp@npm:^5.0.0": - version: 5.0.0 - resolution: "escape-string-regexp@npm:5.0.0" - checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 - languageName: node - linkType: hard - -"eslint-config-next@npm:16.1.6": - version: 16.1.6 - resolution: "eslint-config-next@npm:16.1.6" - dependencies: - "@next/eslint-plugin-next": "npm:16.1.6" - eslint-import-resolver-node: "npm:^0.3.6" - eslint-import-resolver-typescript: "npm:^3.5.2" - eslint-plugin-import: "npm:^2.32.0" - eslint-plugin-jsx-a11y: "npm:^6.10.0" - eslint-plugin-react: "npm:^7.37.0" - eslint-plugin-react-hooks: "npm:^7.0.0" - globals: "npm:16.4.0" - typescript-eslint: "npm:^8.46.0" - peerDependencies: - eslint: ">=9.0.0" - typescript: ">=3.3.1" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/2b4c13c3d556daf7b559d032276cd4ac2454413a574946cf1a689844784523ad44dd3bca525d4530e2cef5f5ecc036643e562792aea0a9140276b84866775bf2 - languageName: node - linkType: hard - -"eslint-import-resolver-node@npm:^0.3.6, eslint-import-resolver-node@npm:^0.3.9": - version: 0.3.9 - resolution: "eslint-import-resolver-node@npm:0.3.9" - dependencies: - debug: "npm:^3.2.7" - is-core-module: "npm:^2.13.0" - resolve: "npm:^1.22.4" - checksum: 10c0/0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 - languageName: node - linkType: hard - -"eslint-import-resolver-typescript@npm:^3.5.2": - version: 3.9.1 - resolution: "eslint-import-resolver-typescript@npm:3.9.1" - dependencies: - "@nolyfill/is-core-module": "npm:1.0.39" - debug: "npm:^4.4.0" - get-tsconfig: "npm:^4.10.0" - is-bun-module: "npm:^1.3.0" - rspack-resolver: "npm:^1.1.0" - stable-hash: "npm:^0.0.5" - tinyglobby: "npm:^0.2.12" - peerDependencies: - eslint: "*" - eslint-plugin-import: "*" - eslint-plugin-import-x: "*" - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - checksum: 10c0/6bcc5d74719dc51e20602c5b3a30ca5682dd6db4a5828697cf1485b19dd3aef4dff7cb1f434da48df26a35d9c362e834d4ea1adc1218d77dfd84cf6ce65f4662 - languageName: node - linkType: hard - -"eslint-module-utils@npm:^2.12.1": - version: 2.12.1 - resolution: "eslint-module-utils@npm:2.12.1" - dependencies: - debug: "npm:^3.2.7" - peerDependenciesMeta: - eslint: - optional: true - checksum: 10c0/6f4efbe7a91ae49bf67b4ab3644cb60bc5bd7db4cb5521de1b65be0847ffd3fb6bce0dd68f0995e1b312d137f768e2a1f842ee26fe73621afa05f850628fdc40 - languageName: node - linkType: hard - -"eslint-plugin-import@npm:^2.32.0": - version: 2.32.0 - resolution: "eslint-plugin-import@npm:2.32.0" - dependencies: - "@rtsao/scc": "npm:^1.1.0" - array-includes: "npm:^3.1.9" - array.prototype.findlastindex: "npm:^1.2.6" - array.prototype.flat: "npm:^1.3.3" - array.prototype.flatmap: "npm:^1.3.3" - debug: "npm:^3.2.7" - doctrine: "npm:^2.1.0" - eslint-import-resolver-node: "npm:^0.3.9" - eslint-module-utils: "npm:^2.12.1" - hasown: "npm:^2.0.2" - is-core-module: "npm:^2.16.1" - is-glob: "npm:^4.0.3" - minimatch: "npm:^3.1.2" - object.fromentries: "npm:^2.0.8" - object.groupby: "npm:^1.0.3" - object.values: "npm:^1.2.1" - semver: "npm:^6.3.1" - string.prototype.trimend: "npm:^1.0.9" - tsconfig-paths: "npm:^3.15.0" - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - checksum: 10c0/bfb1b8fc8800398e62ddfefbf3638d185286edfed26dfe00875cc2846d954491b4f5112457831588b757fa789384e1ae585f812614c4797f0499fa234fd4a48b - languageName: node - linkType: hard - -"eslint-plugin-jsx-a11y@npm:^6.10.0": - version: 6.10.2 - resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" - dependencies: - aria-query: "npm:^5.3.2" - array-includes: "npm:^3.1.8" - array.prototype.flatmap: "npm:^1.3.2" - ast-types-flow: "npm:^0.0.8" - axe-core: "npm:^4.10.0" - axobject-query: "npm:^4.1.0" - damerau-levenshtein: "npm:^1.0.8" - emoji-regex: "npm:^9.2.2" - hasown: "npm:^2.0.2" - jsx-ast-utils: "npm:^3.3.5" - language-tags: "npm:^1.0.9" - minimatch: "npm:^3.1.2" - object.fromentries: "npm:^2.0.8" - safe-regex-test: "npm:^1.0.3" - string.prototype.includes: "npm:^2.0.1" - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - checksum: 10c0/d93354e03b0cf66f018d5c50964e074dffe4ddf1f9b535fa020d19c4ae45f89c1a16e9391ca61ac3b19f7042c751ac0d361a056a65cbd1de24718a53ff8daa6e - languageName: node - linkType: hard - -"eslint-plugin-react-hooks@npm:^7.0.0, eslint-plugin-react-hooks@npm:^7.0.1": - version: 7.0.1 - resolution: "eslint-plugin-react-hooks@npm:7.0.1" - dependencies: - "@babel/core": "npm:^7.24.4" - "@babel/parser": "npm:^7.24.4" - hermes-parser: "npm:^0.25.1" - zod: "npm:^3.25.0 || ^4.0.0" - zod-validation-error: "npm:^3.5.0 || ^4.0.0" - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - checksum: 10c0/1e711d1a9d1fa9cfc51fa1572500656577201199c70c795c6a27adfc1df39e5c598f69aab6aa91117753d23cc1f11388579a2bed14921cf9a4efe60ae8618496 - languageName: node - linkType: hard - -"eslint-plugin-react@npm:^7.37.0, eslint-plugin-react@npm:^7.37.5": - version: 7.37.5 - resolution: "eslint-plugin-react@npm:7.37.5" - dependencies: - array-includes: "npm:^3.1.8" - array.prototype.findlast: "npm:^1.2.5" - array.prototype.flatmap: "npm:^1.3.3" - array.prototype.tosorted: "npm:^1.1.4" - doctrine: "npm:^2.1.0" - es-iterator-helpers: "npm:^1.2.1" - estraverse: "npm:^5.3.0" - hasown: "npm:^2.0.2" - jsx-ast-utils: "npm:^2.4.1 || ^3.0.0" - minimatch: "npm:^3.1.2" - object.entries: "npm:^1.1.9" - object.fromentries: "npm:^2.0.8" - object.values: "npm:^1.2.1" - prop-types: "npm:^15.8.1" - resolve: "npm:^2.0.0-next.5" - semver: "npm:^6.3.1" - string.prototype.matchall: "npm:^4.0.12" - string.prototype.repeat: "npm:^1.0.0" - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - checksum: 10c0/c850bfd556291d4d9234f5ca38db1436924a1013627c8ab1853f77cac73ec19b020e861e6c7b783436a48b6ffcdfba4547598235a37ad4611b6739f65fd8ad57 - languageName: node - linkType: hard - -"eslint-scope@npm:^8.4.0": - version: 8.4.0 - resolution: "eslint-scope@npm:8.4.0" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^5.2.0" - checksum: 10c0/407f6c600204d0f3705bd557f81bd0189e69cd7996f408f8971ab5779c0af733d1af2f1412066b40ee1588b085874fc37a2333986c6521669cdbdd36ca5058e0 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^4.2.0": - version: 4.2.0 - resolution: "eslint-visitor-keys@npm:4.2.0" - checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^4.2.1": - version: 4.2.1 - resolution: "eslint-visitor-keys@npm:4.2.1" - checksum: 10c0/fcd43999199d6740db26c58dbe0c2594623e31ca307e616ac05153c9272f12f1364f5a0b1917a8e962268fdecc6f3622c1c2908b4fcc2e047a106fe6de69dc43 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^5.0.0": - version: 5.0.1 - resolution: "eslint-visitor-keys@npm:5.0.1" - checksum: 10c0/16190bdf2cbae40a1109384c94450c526a79b0b9c3cb21e544256ed85ac48a4b84db66b74a6561d20fe6ab77447f150d711c2ad5ad74df4fcc133736bce99678 - languageName: node - linkType: hard - -"eslint@npm:^9": - version: 9.39.3 - resolution: "eslint@npm:9.39.3" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.8.0" - "@eslint-community/regexpp": "npm:^4.12.1" - "@eslint/config-array": "npm:^0.21.1" - "@eslint/config-helpers": "npm:^0.4.2" - "@eslint/core": "npm:^0.17.0" - "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.39.3" - "@eslint/plugin-kit": "npm:^0.4.1" - "@humanfs/node": "npm:^0.16.6" - "@humanwhocodes/module-importer": "npm:^1.0.1" - "@humanwhocodes/retry": "npm:^0.4.2" - "@types/estree": "npm:^1.0.6" - ajv: "npm:^6.12.4" - chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.6" - debug: "npm:^4.3.2" - escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^8.4.0" - eslint-visitor-keys: "npm:^4.2.1" - espree: "npm:^10.4.0" - esquery: "npm:^1.5.0" - esutils: "npm:^2.0.2" - fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^8.0.0" - find-up: "npm:^5.0.0" - glob-parent: "npm:^6.0.2" - ignore: "npm:^5.2.0" - imurmurhash: "npm:^0.1.4" - is-glob: "npm:^4.0.0" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.3" - peerDependencies: - jiti: "*" - peerDependenciesMeta: - jiti: - optional: true - bin: - eslint: bin/eslint.js - checksum: 10c0/5e5dbf84d4f604f5d2d7a58c5c3fcdde30a01b8973ff3caeca8b2bacc16066717cedb4385ce52db1a2746d0b621770d4d4227cc7f44982b0b03818be2c31538d - languageName: node - linkType: hard - -"espree@npm:^10.0.1, espree@npm:^10.4.0": - version: 10.4.0 - resolution: "espree@npm:10.4.0" - dependencies: - acorn: "npm:^8.15.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.2.1" - checksum: 10c0/c63fe06131c26c8157b4083313cb02a9a54720a08e21543300e55288c40e06c3fc284bdecf108d3a1372c5934a0a88644c98714f38b6ae8ed272b40d9ea08d6b - languageName: node - linkType: hard - -"esquery@npm:^1.5.0, esquery@npm:^1.7.0": - version: 1.7.0 - resolution: "esquery@npm:1.7.0" - dependencies: - estraverse: "npm:^5.1.0" - checksum: 10c0/77d5173db450b66f3bc685d11af4c90cffeedb340f34a39af96d43509a335ce39c894fd79233df32d38f5e4e219fa0f7076f6ec90bae8320170ba082c0db4793 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 - languageName: node - linkType: hard - -"estree-util-is-identifier-name@npm:^3.0.0": - version: 3.0.0 - resolution: "estree-util-is-identifier-name@npm:3.0.0" - checksum: 10c0/d1881c6ed14bd588ebd508fc90bf2a541811dbb9ca04dec2f39d27dcaa635f85b5ed9bbbe7fc6fb1ddfca68744a5f7c70456b4b7108b6c4c52780631cc787c5b - languageName: node - linkType: hard - -"estree-walker@npm:^2.0.2": - version: 2.0.2 - resolution: "estree-walker@npm:2.0.2" - checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af - languageName: node - linkType: hard - -"estree-walker@npm:^3.0.3": - version: 3.0.3 - resolution: "estree-walker@npm:3.0.3" - dependencies: - "@types/estree": "npm:^1.0.0" - checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 - languageName: node - linkType: hard - -"etag@npm:^1.8.1, etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 - languageName: node - linkType: hard - -"event-stream@npm:=3.3.4": - version: 3.3.4 - resolution: "event-stream@npm:3.3.4" - dependencies: - duplexer: "npm:~0.1.1" - from: "npm:~0" - map-stream: "npm:~0.1.0" - pause-stream: "npm:0.0.11" - split: "npm:0.3" - stream-combiner: "npm:~0.0.4" - through: "npm:~2.3.1" - checksum: 10c0/c3ec4e1efc27ab3e73a98923f0a2fa9a19051b87068fea2f3d53d2e4e8c5cfdadf8c8a115b17f3d90b16a46432d396bad91b6e8d0cceb3e449be717a03b75209 - languageName: node - linkType: hard - -"event-target-shim@npm:^5.0.0": - version: 5.0.1 - resolution: "event-target-shim@npm:5.0.1" - checksum: 10c0/0255d9f936215fd206156fd4caa9e8d35e62075d720dc7d847e89b417e5e62cf1ce6c9b4e0a1633a9256de0efefaf9f8d26924b1f3c8620cffb9db78e7d3076b - languageName: node - linkType: hard - -"eventemitter3@npm:^4.0.1, eventemitter3@npm:^4.0.4": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 10c0/5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b - languageName: node - linkType: hard - -"eventemitter3@npm:^5.0.1": - version: 5.0.4 - resolution: "eventemitter3@npm:5.0.4" - checksum: 10c0/575b8cac8d709e1473da46f8f15ef311b57ff7609445a7c71af5cd42598583eee6f098fa7a593e30f27e94b8865642baa0689e8fa97c016f742abdb3b1bf6d9a - languageName: node - linkType: hard - -"eventsource-parser@npm:^3.0.0, eventsource-parser@npm:^3.0.6": - version: 3.0.6 - resolution: "eventsource-parser@npm:3.0.6" - checksum: 10c0/70b8ccec7dac767ef2eca43f355e0979e70415701691382a042a2df8d6a68da6c2fca35363669821f3da876d29c02abe9b232964637c1b6635c940df05ada78a - languageName: node - linkType: hard - -"eventsource-parser@npm:^3.0.1": - version: 3.0.1 - resolution: "eventsource-parser@npm:3.0.1" - checksum: 10c0/146ce5ae8325d07645a49bbc54d7ac3aef42f5138bfbbe83d5cf96293b50eab2219926d6cf41eed0a0f90132578089652ba9286a19297662900133a9da6c2fd0 - languageName: node - linkType: hard - -"eventsource@npm:^3.0.2": - version: 3.0.6 - resolution: "eventsource@npm:3.0.6" - dependencies: - eventsource-parser: "npm:^3.0.1" - checksum: 10c0/074d865ea1c7e29e3243f85a13306e89fca2d775b982dca03fa6bfa75c56827fa89cf1ab9e730db24bd6b104cbdcae074f2b37ba498874e9dd9710fbff4979bb - languageName: node - linkType: hard - -"execa@npm:^6.1.0": - version: 6.1.0 - resolution: "execa@npm:6.1.0" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.1" - human-signals: "npm:^3.0.1" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^3.0.7" - strip-final-newline: "npm:^3.0.0" - checksum: 10c0/004ee32092af745766a1b0352fdba8701a4001bc3fe08e63101c04276d4c860bbe11bb8ab85f37acdff13d3da83d60e044041dcf24bd7e25e645a543828d9c41 - languageName: node - linkType: hard - -"execa@npm:^8.0.1": - version: 8.0.1 - resolution: "execa@npm:8.0.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^8.0.1" - human-signals: "npm:^5.0.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^4.1.0" - strip-final-newline: "npm:^3.0.0" - checksum: 10c0/2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af - languageName: node - linkType: hard - -"expect-type@npm:^1.3.0": - version: 1.3.0 - resolution: "expect-type@npm:1.3.0" - checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.2 - resolution: "exponential-backoff@npm:3.1.2" - checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 - languageName: node - linkType: hard - -"express-async-errors@npm:^3.1.1": - version: 3.1.1 - resolution: "express-async-errors@npm:3.1.1" - peerDependencies: - express: ^4.16.2 - checksum: 10c0/56c4e90c44e98c7edc5bd38e18dd23b0d9a7139cb94ff3e25943ba257415b433e0e52ea8f9bc1fb5b70a5e6c5246eaace4fb69ab171edfb8896580928bb97ec6 - languageName: node - linkType: hard - -"express-rate-limit@npm:^8.2.1": - version: 8.5.1 - resolution: "express-rate-limit@npm:8.5.1" - dependencies: - ip-address: "npm:^10.2.0" - peerDependencies: - express: ">= 4.11" - checksum: 10c0/bcd89bb916376f38858b2623cc486bc9a91124ff3c7dee038fafc4c03949db72b0ddc796ade17cc43af3f16af314b689dd3c6557996d8e007791151335b0f7f7 - languageName: node - linkType: hard - -"express@npm:^4.22.2": - version: 4.22.2 - resolution: "express@npm:4.22.2" - dependencies: - accepts: "npm:~1.3.8" - array-flatten: "npm:1.1.1" - body-parser: "npm:~1.20.5" - content-disposition: "npm:~0.5.4" - content-type: "npm:~1.0.4" - cookie: "npm:~0.7.1" - cookie-signature: "npm:~1.0.6" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - finalhandler: "npm:~1.3.1" - fresh: "npm:~0.5.2" - http-errors: "npm:~2.0.0" - merge-descriptors: "npm:1.0.3" - methods: "npm:~1.1.2" - on-finished: "npm:~2.4.1" - parseurl: "npm:~1.3.3" - path-to-regexp: "npm:~0.1.12" - proxy-addr: "npm:~2.0.7" - qs: "npm:~6.15.1" - range-parser: "npm:~1.2.1" - safe-buffer: "npm:5.2.1" - send: "npm:~0.19.0" - serve-static: "npm:~1.16.2" - setprototypeof: "npm:1.2.0" - statuses: "npm:~2.0.1" - type-is: "npm:~1.6.18" - utils-merge: "npm:1.0.1" - vary: "npm:~1.1.2" - checksum: 10c0/d06dd4379fd217440b30f8abbe45f0e74931114c1395034f03e7d635196ecdab530d4835a1962a6aa34838d61967dc6f1f77846999bba3032373e9e714222c44 - languageName: node - linkType: hard - -"express@npm:^5.2.1": - version: 5.2.1 - resolution: "express@npm:5.2.1" - dependencies: - accepts: "npm:^2.0.0" - body-parser: "npm:^2.2.1" - content-disposition: "npm:^1.0.0" - content-type: "npm:^1.0.5" - cookie: "npm:^0.7.1" - cookie-signature: "npm:^1.2.1" - debug: "npm:^4.4.0" - depd: "npm:^2.0.0" - encodeurl: "npm:^2.0.0" - escape-html: "npm:^1.0.3" - etag: "npm:^1.8.1" - finalhandler: "npm:^2.1.0" - fresh: "npm:^2.0.0" - http-errors: "npm:^2.0.0" - merge-descriptors: "npm:^2.0.0" - mime-types: "npm:^3.0.0" - on-finished: "npm:^2.4.1" - once: "npm:^1.4.0" - parseurl: "npm:^1.3.3" - proxy-addr: "npm:^2.0.7" - qs: "npm:^6.14.0" - range-parser: "npm:^1.2.1" - router: "npm:^2.2.0" - send: "npm:^1.1.0" - serve-static: "npm:^2.2.0" - statuses: "npm:^2.0.1" - type-is: "npm:^2.0.1" - vary: "npm:^1.1.2" - checksum: 10c0/45e8c841ad188a41402ddcd1294901e861ee0819f632fb494f2ed344ef9c43315d294d443fb48d594e6586a3b779785120f43321417adaef8567316a55072949 - languageName: node - linkType: hard - -"extend@npm:^3.0.0, extend@npm:^3.0.2": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 - languageName: node - linkType: hard - -"fast-content-type-parse@npm:^2.0.0": - version: 2.0.1 - resolution: "fast-content-type-parse@npm:2.0.1" - checksum: 10c0/e5ff87d75a35ae4cf377df1dca46ec49e7abbdc8513689676ecdef548b94900b50e66e516e64470035d79b9f7010ef15d98c24d8ae803a881363cc59e0715e19 - languageName: node - linkType: hard - -"fast-content-type-parse@npm:^3.0.0": - version: 3.0.0 - resolution: "fast-content-type-parse@npm:3.0.0" - checksum: 10c0/06251880c83b7118af3a5e66e8bcee60d44f48b39396fc60acc2b4630bd5f3e77552b999b5c8e943d45a818854360e5e97164c374ec4b562b4df96a2cdf2e188 - languageName: node - linkType: hard - -"fast-copy@npm:^3.0.2": - version: 3.1.0 - resolution: "fast-copy@npm:3.1.0" - checksum: 10c0/5eeb5c33a48a215d0600411f4c524f87f42bf8db9d875ef8b83c891bd84340c613e33e68475a11496b632a2008e97748ad7a60a2e82b5cad6f9cd7aa60c8def3 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fast-equals@npm:^5.0.1": - version: 5.2.2 - resolution: "fast-equals@npm:5.2.2" - checksum: 10c0/2bfeac6317a8959a00e2134749323557e5df6dea3af24e4457297733eace8ce4313fcbca2cf4532f3a6792607461e80442cd8d3af148d5c2e4e98ad996d6e5b5 - languageName: node - linkType: hard - -"fast-glob@npm:3.3.1": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10c0/b68431128fb6ce4b804c5f9622628426d990b66c75b21c0d16e3d80e2d1398bf33f7e1724e66a2e3f299285dcf5b8d745b122d0304e7dd66f5231081f33ec67c - languageName: node - linkType: hard - -"fast-glob@npm:^3.3.2": - version: 3.3.3 - resolution: "fast-glob@npm:3.3.3" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.8" - checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 - languageName: node - linkType: hard - -"fast-sha256@npm:^1.3.0": - version: 1.3.0 - resolution: "fast-sha256@npm:1.3.0" - checksum: 10c0/87f9e4baa7639576cf60a2b6235c9f436e1a1c52323abbd8a705b5bea8355500acf176f2aed0c14f2ecd6d6007e26151461bab2f27b8953bcca8d9d6b76a86e4 - languageName: node - linkType: hard - -"fast-string-truncated-width@npm:^3.0.2": - version: 3.0.3 - resolution: "fast-string-truncated-width@npm:3.0.3" - checksum: 10c0/043b8663397d14a3880ce4f3407bcda60b40db9bbeafe62863a35d1f9c69ea17c8da3fcd72de235553e6c9cd053128cde9e24ca0d4a7463208f48db3cd23d981 - languageName: node - linkType: hard - -"fast-string-width@npm:^3.0.2": - version: 3.0.2 - resolution: "fast-string-width@npm:3.0.2" - dependencies: - fast-string-truncated-width: "npm:^3.0.2" - checksum: 10c0/c8822d175315bb353ebe782b65214ac53b13e3bf704e03b132ea7bdfa8de6a636375b3ab7a4097545393d109381c37c4f387c72a462c90b61412dbc4632f39a7 - languageName: node - linkType: hard - -"fast-uri@npm:^3.1.2": - version: 3.1.8 - resolution: "fast-uri@npm:3.1.8" - checksum: 10c0/c9c47860a7f9110176d94bb30a02942182f0bfc8d6780e9702f320336dc2dadb83b1d9879cceaf8d4b439642d1ec6d78c317cb808ab155455551bd5d9d7c22d8 - languageName: node - linkType: hard - -"fast-wrap-ansi@npm:^0.2.0": - version: 0.2.0 - resolution: "fast-wrap-ansi@npm:0.2.0" - dependencies: - fast-string-width: "npm:^3.0.2" - checksum: 10c0/c0eb6debee565c5dbb9132dddff5c4d4aba5eb02185ae4dab285acd6186018cffca04264e92f373cbf592a9bcd1c33d65dba036030a8f3baeff1169969a1b59b - languageName: node - linkType: hard - -"fast-xml-builder@npm:^1.1.5": - version: 1.2.0 - resolution: "fast-xml-builder@npm:1.2.0" - dependencies: - path-expression-matcher: "npm:^1.5.0" - xml-naming: "npm:^0.1.0" - checksum: 10c0/84bb105cd04e91d6dcb746c4dbaeb12903b510e7ab9a06ffde55b5a582e005559a87d84467f18a655c6c4baf098f696fd74cee3cbe1aea9d01385907768ba32d - languageName: node - linkType: hard - -"fast-xml-parser@npm:5.7.1": - version: 5.7.1 - resolution: "fast-xml-parser@npm:5.7.1" - dependencies: - "@nodable/entities": "npm:^2.1.0" - fast-xml-builder: "npm:^1.1.5" - path-expression-matcher: "npm:^1.5.0" - strnum: "npm:^2.2.3" - bin: - fxparser: src/cli/cli.js - checksum: 10c0/b8b54e33060da5fc5ce26fdc73c4728f18415f9be9a774f1406b03265a5b411b742c39dba0127c3f0f31fad5b3ee11f51be79aa16df160f69fd5e4b902bfbb85 - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.19.1 - resolution: "fastq@npm:1.19.1" - dependencies: - reusify: "npm:^1.0.4" - checksum: 10c0/ebc6e50ac7048daaeb8e64522a1ea7a26e92b3cee5cd1c7f2316cdca81ba543aa40a136b53891446ea5c3a67ec215fbaca87ad405f102dd97012f62916905630 - languageName: node - linkType: hard - -"fdir@npm:^6.2.0, fdir@npm:^6.4.3": - version: 6.4.3 - resolution: "fdir@npm:6.4.3" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 10c0/d13c10120e9625adf21d8d80481586200759928c19405a816b77dd28eaeb80e7c59c5def3e2941508045eb06d34eb47fad865ccc8bf98e6ab988bb0ed160fb6f - languageName: node - linkType: hard - -"fdir@npm:^6.5.0": - version: 6.5.0 - resolution: "fdir@npm:6.5.0" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f - languageName: node - linkType: hard - -"fecha@npm:^4.2.0": - version: 4.2.3 - resolution: "fecha@npm:4.2.3" - checksum: 10c0/0e895965959cf6a22bb7b00f0bf546f2783836310f510ddf63f463e1518d4c96dec61ab33fdfd8e79a71b4856a7c865478ce2ee8498d560fe125947703c9b1cf - languageName: node - linkType: hard - -"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": - version: 3.2.0 - resolution: "fetch-blob@npm:3.2.0" - dependencies: - node-domexception: "npm:^1.0.0" - web-streams-polyfill: "npm:^3.0.3" - checksum: 10c0/60054bf47bfa10fb0ba6cb7742acec2f37c1f56344f79a70bb8b1c48d77675927c720ff3191fa546410a0442c998d27ab05e9144c32d530d8a52fbe68f843b69 - languageName: node - linkType: hard - -"fflate@npm:^0.4.8": - version: 0.4.9 - resolution: "fflate@npm:0.4.9" - checksum: 10c0/a74e599dc8592766d810e1af5c476627480132d1ded41bad3a8bff5ccebdaec048c0a3504f2578792b1fa26db5c2603473fb76e4983e76d0635f5cfc188f8613 - languageName: node - linkType: hard - -"file-entry-cache@npm:^8.0.0": - version: 8.0.0 - resolution: "file-entry-cache@npm:8.0.0" - dependencies: - flat-cache: "npm:^4.0.0" - checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 - languageName: node - linkType: hard - -"file-selector@npm:^2.1.0": - version: 2.1.2 - resolution: "file-selector@npm:2.1.2" - dependencies: - tslib: "npm:^2.7.0" - checksum: 10c0/fe827e0e95410aacfcc3eabc38c29cc36055257f03c1c06b631a2b5af9730c142ad2c52f5d64724d02231709617bda984701f52bd1f4b7aca50fb6585a27c1d2 - languageName: node - linkType: hard - -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: "npm:^5.0.1" - checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 - languageName: node - linkType: hard - -"finalhandler@npm:^2.1.0": - version: 2.1.0 - resolution: "finalhandler@npm:2.1.0" - dependencies: - debug: "npm:^4.4.0" - encodeurl: "npm:^2.0.0" - escape-html: "npm:^1.0.3" - on-finished: "npm:^2.4.1" - parseurl: "npm:^1.3.3" - statuses: "npm:^2.0.1" - checksum: 10c0/da0bbca6d03873472ee890564eb2183f4ed377f25f3628a0fc9d16dac40bed7b150a0d82ebb77356e4c6d97d2796ad2dba22948b951dddee2c8768b0d1b9fb1f - languageName: node - linkType: hard - -"finalhandler@npm:~1.3.1": - version: 1.3.2 - resolution: "finalhandler@npm:1.3.2" - dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - on-finished: "npm:~2.4.1" - parseurl: "npm:~1.3.3" - statuses: "npm:~2.0.2" - unpipe: "npm:~1.0.0" - checksum: 10c0/435a4fd65e4e4e4c71bb5474980090b73c353a123dd415583f67836bdd6516e528cf07298e219a82b94631dee7830eae5eece38d3c178073cf7df4e8c182f413 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a - languageName: node - linkType: hard - -"fkill@npm:^9.0.0": - version: 9.0.0 - resolution: "fkill@npm:9.0.0" - dependencies: - aggregate-error: "npm:^5.0.0" - execa: "npm:^8.0.1" - pid-port: "npm:^1.0.0" - process-exists: "npm:^5.0.0" - ps-list: "npm:^8.1.1" - taskkill: "npm:^5.0.0" - checksum: 10c0/91090ef26287b833d810789ef828b0fb37458677ea9c7b41a294e20a1147692d80e8ba61fa5a943211d1a0fa9331503f634f30a0f931a794c5be6a635296e90b - languageName: node - linkType: hard - -"flat-cache@npm:^4.0.0": - version: 4.0.1 - resolution: "flat-cache@npm:4.0.1" - dependencies: - flatted: "npm:^3.2.9" - keyv: "npm:^4.5.4" - checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc - languageName: node - linkType: hard - -"flatted@npm:^3.2.9": - version: 3.4.2 - resolution: "flatted@npm:3.4.2" - checksum: 10c0/a65b67aae7172d6cdf63691be7de6c5cd5adbdfdfe2e9da1a09b617c9512ed794037741ee53d93114276bff3f93cd3b0d97d54f9b316e1e4885dde6e9ffdf7ed - languageName: node - linkType: hard - -"fn.name@npm:1.x.x": - version: 1.1.0 - resolution: "fn.name@npm:1.1.0" - checksum: 10c0/8ad62aa2d4f0b2a76d09dba36cfec61c540c13a0fd72e5d94164e430f987a7ce6a743112bbeb14877c810ef500d1f73d7f56e76d029d2e3413f20d79e3460a9a - languageName: node - linkType: hard - -"for-each@npm:^0.3.3, for-each@npm:^0.3.5": - version: 0.3.5 - resolution: "for-each@npm:0.3.5" - dependencies: - is-callable: "npm:^1.2.7" - checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.1": - version: 3.3.1 - resolution: "foreground-child@npm:3.3.1" - dependencies: - cross-spawn: "npm:^7.0.6" - signal-exit: "npm:^4.0.1" - checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 - languageName: node - linkType: hard - -"form-data-encoder@npm:1.7.2": - version: 1.7.2 - resolution: "form-data-encoder@npm:1.7.2" - checksum: 10c0/56553768037b6d55d9de524f97fe70555f0e415e781cb56fc457a68263de3d40fadea2304d4beef2d40b1a851269bd7854e42c362107071892cb5238debe9464 - languageName: node - linkType: hard - -"form-data@npm:^4.0.0": - version: 4.0.6 - resolution: "form-data@npm:4.0.6" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.8" - es-set-tostringtag: "npm:^2.1.0" - hasown: "npm:^2.0.4" - mime-types: "npm:^2.1.35" - checksum: 10c0/43947a77bf0ff45c6ceed789778982d47a3f3e720a74b71721174ebf3310a5f1a8be1d6b38a3ee3688e8a18a2c4273073ec0844cd37efda3eaf46d41c9c318ff - languageName: node - linkType: hard - -"formdata-node@npm:^4.3.2": - version: 4.4.1 - resolution: "formdata-node@npm:4.4.1" - dependencies: - node-domexception: "npm:1.0.0" - web-streams-polyfill: "npm:4.0.0-beta.3" - checksum: 10c0/74151e7b228ffb33b565cec69182694ad07cc3fdd9126a8240468bb70a8ba66e97e097072b60bcb08729b24c7ce3fd3e0bd7f1f80df6f9f662b9656786e76f6a - languageName: node - linkType: hard - -"formdata-polyfill@npm:^4.0.10": - version: 4.0.10 - resolution: "formdata-polyfill@npm:4.0.10" - dependencies: - fetch-blob: "npm:^3.1.2" - checksum: 10c0/5392ec484f9ce0d5e0d52fb5a78e7486637d516179b0eb84d81389d7eccf9ca2f663079da56f761355c0a65792810e3b345dc24db9a8bbbcf24ef3c8c88570c6 - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 - languageName: node - linkType: hard - -"framer-motion@npm:^12.42.0": - version: 12.42.0 - resolution: "framer-motion@npm:12.42.0" - dependencies: - motion-dom: "npm:^12.42.0" - motion-utils: "npm:^12.39.0" - tslib: "npm:^2.4.0" - peerDependencies: - "@emotion/is-prop-valid": "*" - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@emotion/is-prop-valid": - optional: true - react: - optional: true - react-dom: - optional: true - checksum: 10c0/c425fa953615f3a54a0a3bb1dd7030d68613436aec1357bdb8b4752e9c46e0c9afe3c6d7ec2c2e730ff1978900575060480cb57ac1957baecd35093108e711bc - languageName: node - linkType: hard - -"fresh@npm:^2.0.0": - version: 2.0.0 - resolution: "fresh@npm:2.0.0" - checksum: 10c0/0557548194cb9a809a435bf92bcfbc20c89e8b5eb38861b73ced36750437251e39a111fc3a18b98531be9dd91fe1411e4969f229dc579ec0251ce6c5d4900bbc - languageName: node - linkType: hard - -"fresh@npm:~0.5.2": - version: 0.5.2 - resolution: "fresh@npm:0.5.2" - checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a - languageName: node - linkType: hard - -"from@npm:~0": - version: 0.1.7 - resolution: "from@npm:0.1.7" - checksum: 10c0/3aab5aea8fe8e1f12a5dee7f390d46a93431ce691b6222dcd5701c5d34378e51ca59b44967da1105a0f90fcdf5d7629d963d51e7ccd79827d19693bdcfb688d4 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"fsevents@npm:2.3.3, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": - version: 1.1.8 - resolution: "function.prototype.name@npm:1.1.8" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - functions-have-names: "npm:^1.2.3" - hasown: "npm:^2.0.2" - is-callable: "npm:^1.2.7" - checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 - languageName: node - linkType: hard - -"functions-have-names@npm:^1.2.3": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca - languageName: node - linkType: hard - -"fuse.js@npm:^7.0.0": - version: 7.1.0 - resolution: "fuse.js@npm:7.1.0" - checksum: 10c0/c0d1b1d192a4bdf3eade897453ddd28aff96b70bf3e49161a45880f9845ebaee97265595db633776700a5bcf8942223c752754a848d70c508c3c9fd997faad1e - languageName: node - linkType: hard - -"gaxios@npm:^7.0.0": - version: 7.1.1 - resolution: "gaxios@npm:7.1.1" - dependencies: - extend: "npm:^3.0.2" - https-proxy-agent: "npm:^7.0.1" - node-fetch: "npm:^3.3.2" - checksum: 10c0/f58dea117f67a3d8b46391db955eb061a3e408464c9260d5d24a67a07a8da673ca0382a096c7c01ae0e7db4c74ce6453109933d8dbfa4c02b5bb93f7d79e726d - languageName: node - linkType: hard - -"gcp-metadata@npm:^7.0.0": - version: 7.0.1 - resolution: "gcp-metadata@npm:7.0.1" - dependencies: - gaxios: "npm:^7.0.0" - google-logging-utils: "npm:^1.0.0" - json-bigint: "npm:^1.0.0" - checksum: 10c0/2f7eedef08992c13aa068001df4f64c9d62ec9cb031d1c47d6fb5e38e1444be88a951030710eb09a31a17a395b6c1b48f5ad4cbfdc89a0c354c8d7355d86b467 - languageName: node - linkType: hard - -"gcp-metadata@npm:^8.0.0": - version: 8.1.2 - resolution: "gcp-metadata@npm:8.1.2" - dependencies: - gaxios: "npm:^7.0.0" - google-logging-utils: "npm:^1.0.0" - json-bigint: "npm:^1.0.0" - checksum: 10c0/15a61231a9410dc11c2828d2c9fdc8b0a939f1af746195c44edc6f2ffea0acab52cef3a7b9828069a36fd5d68bda730f7328a415fe42a01258f6e249dfba6908 - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde - languageName: node - linkType: hard - -"get-east-asian-width@npm:^1.0.0": - version: 1.4.0 - resolution: "get-east-asian-width@npm:1.4.0" - checksum: 10c0/4e481d418e5a32061c36fbb90d1b225a254cc5b2df5f0b25da215dcd335a3c111f0c2023ffda43140727a9cafb62dac41d022da82c08f31083ee89f714ee3b83 - languageName: node - linkType: hard - -"get-east-asian-width@npm:^1.5.0": - version: 1.6.0 - resolution: "get-east-asian-width@npm:1.6.0" - checksum: 10c0/7e72e9550fd49ca5b246f9af6bb2afc129c96412845ff6556b3274fd44817a381702ca17028efe9866b261a3d44254cbf21e6c90cf05b4b61675630af776d431 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": - version: 1.3.0 - resolution: "get-intrinsic@npm:1.3.0" - dependencies: - call-bind-apply-helpers: "npm:^1.0.2" - es-define-property: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.1.1" - function-bind: "npm:^1.1.2" - get-proto: "npm:^1.0.1" - gopd: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - hasown: "npm:^2.0.2" - math-intrinsics: "npm:^1.1.0" - checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a - languageName: node - linkType: hard - -"get-nonce@npm:^1.0.0": - version: 1.0.1 - resolution: "get-nonce@npm:1.0.1" - checksum: 10c0/2d7df55279060bf0568549e1ffc9b84bc32a32b7541675ca092dce56317cdd1a59a98dcc4072c9f6a980779440139a3221d7486f52c488e69dc0fd27b1efb162 - languageName: node - linkType: hard - -"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "get-proto@npm:1.0.1" - dependencies: - dunder-proto: "npm:^1.0.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c - languageName: node - linkType: hard - -"get-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 - languageName: node - linkType: hard - -"get-stream@npm:^8.0.1": - version: 8.0.1 - resolution: "get-stream@npm:8.0.1" - checksum: 10c0/5c2181e98202b9dae0bb4a849979291043e5892eb40312b47f0c22b9414fc9b28a3b6063d2375705eb24abc41ecf97894d9a51f64ff021511b504477b27b4290 - languageName: node - linkType: hard - -"get-symbol-description@npm:^1.1.0": - version: 1.1.0 - resolution: "get-symbol-description@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b - languageName: node - linkType: hard - -"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.7.5": - version: 4.10.0 - resolution: "get-tsconfig@npm:4.10.0" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/c9b5572c5118923c491c04285c73bd55b19e214992af957c502a3be0fc0043bb421386ffd45ca3433c0a7fba81221ca300479e8393960acf15d0ed4563f38a86 - languageName: node - linkType: hard - -"git-up@npm:^8.1.0": - version: 8.1.1 - resolution: "git-up@npm:8.1.1" - dependencies: - is-ssh: "npm:^1.4.0" - parse-url: "npm:^9.2.0" - checksum: 10c0/2cc4461d8565a3f7a1ecd3d262a58ddb8df0a67f7f7d4915df2913c460b2e88ae570a6ea810700a6d22fb3b9e4bea8dd10a8eb469900ddc12e35c62208608c03 - languageName: node - linkType: hard - -"git-url-parse@npm:^16.1.0": - version: 16.1.0 - resolution: "git-url-parse@npm:16.1.0" - dependencies: - git-up: "npm:^8.1.0" - checksum: 10c0/b8f5ebcbd5b2baf9f1bb77a217376f0247c47fe1d42811ccaac3015768eebb0759a59051f758e50e70adf5c67ae059d1975bf6b750164f36bfd39138d11b940b - languageName: node - linkType: hard - -"gitea-js@npm:^1.22.0": - version: 1.23.0 - resolution: "gitea-js@npm:1.23.0" - checksum: 10c0/bad05f63faac950728b5b356e82d037e8ef10b3f59c0f9b6b549637440f9b268c1c6414a27b657b1868565602e429950ff2c5ad608d045d891fe05e9e76b2245 - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: "npm:^4.0.1" - checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: "npm:^4.0.3" - checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 - languageName: node - linkType: hard - -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 - languageName: node - linkType: hard - -"glob@npm:^10.5.0": - version: 10.5.0 - resolution: "glob@npm:10.5.0" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/100705eddbde6323e7b35e1d1ac28bcb58322095bd8e63a7d0bef1a2cdafe0d0f7922a981b2b48369a4f8c1b077be5c171804534c3509dfe950dde15fbe6d828 - languageName: node - linkType: hard - -"glob@npm:^11.1.0": - version: 11.1.0 - resolution: "glob@npm:11.1.0" - dependencies: - foreground-child: "npm:^3.3.1" - jackspeak: "npm:^4.1.1" - minimatch: "npm:^10.1.1" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^2.0.0" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/1ceae07f23e316a6fa74581d9a74be6e8c2e590d2f7205034dd5c0435c53f5f7b712c2be00c3b65bf0a49294a1c6f4b98cd84c7637e29453b5aa13b79f1763a2 - languageName: node - linkType: hard - -"glob@npm:^13.0.6": - version: 13.0.6 - resolution: "glob@npm:13.0.6" - dependencies: - minimatch: "npm:^10.2.2" - minipass: "npm:^7.1.3" - path-scurry: "npm:^2.0.2" - checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a - languageName: node - linkType: hard - -"globals@npm:16.4.0": - version: 16.4.0 - resolution: "globals@npm:16.4.0" - checksum: 10c0/a14b447a78b664b42f6d324e8675fcae6fe5e57924fecc1f6328dce08af9b2ca3a3138501e1b1f244a49814a732dc60cfc1aa24e714e0b64ac8bd18910bfac90 - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - -"globals@npm:^14.0.0": - version: 14.0.0 - resolution: "globals@npm:14.0.0" - checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d - languageName: node - linkType: hard - -"globalthis@npm:^1.0.4": - version: 1.0.4 - resolution: "globalthis@npm:1.0.4" - dependencies: - define-properties: "npm:^1.2.1" - gopd: "npm:^1.0.1" - checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 - languageName: node - linkType: hard - -"globrex@npm:^0.1.2": - version: 0.1.2 - resolution: "globrex@npm:0.1.2" - checksum: 10c0/a54c029520cf58bda1d8884f72bd49b4cd74e977883268d931fd83bcbd1a9eb96d57c7dbd4ad80148fb9247467ebfb9b215630b2ed7563b2a8de02e1ff7f89d1 - languageName: node - linkType: hard - -"google-auth-library@npm:^10.1.0": - version: 10.1.0 - resolution: "google-auth-library@npm:10.1.0" - dependencies: - base64-js: "npm:^1.3.0" - ecdsa-sig-formatter: "npm:^1.0.11" - gaxios: "npm:^7.0.0" - gcp-metadata: "npm:^7.0.0" - google-logging-utils: "npm:^1.0.0" - gtoken: "npm:^8.0.0" - jws: "npm:^4.0.0" - checksum: 10c0/5d769a1df775b2e1a7f5ddcd98da4b424db765b4404d050260628204b0cf25764aeec45f2227c50402ab10988954f09c4c86f537de1f30b1c5a476b62c4205f1 - languageName: node - linkType: hard - -"google-auth-library@npm:^10.3.0, google-auth-library@npm:^10.5.0": - version: 10.5.0 - resolution: "google-auth-library@npm:10.5.0" - dependencies: - base64-js: "npm:^1.3.0" - ecdsa-sig-formatter: "npm:^1.0.11" - gaxios: "npm:^7.0.0" - gcp-metadata: "npm:^8.0.0" - google-logging-utils: "npm:^1.0.0" - gtoken: "npm:^8.0.0" - jws: "npm:^4.0.0" - checksum: 10c0/49d3931d20b1f4a4d075216bf5518e2b3396dcf441a8f1952611cf3b6080afb1261c3d32009609047ee4a1cc545269a74b4957e6bba9cce840581df309c4b145 - languageName: node - linkType: hard - -"google-gax@npm:^5.0.0": - version: 5.0.5 - resolution: "google-gax@npm:5.0.5" - dependencies: - "@grpc/grpc-js": "npm:^1.12.6" - "@grpc/proto-loader": "npm:^0.8.0" - duplexify: "npm:^4.1.3" - google-auth-library: "npm:^10.1.0" - google-logging-utils: "npm:^1.1.1" - node-fetch: "npm:^3.3.2" - object-hash: "npm:^3.0.0" - proto3-json-serializer: "npm:^3.0.0" - protobufjs: "npm:^7.5.3" - retry-request: "npm:^8.0.0" - rimraf: "npm:^5.0.1" - checksum: 10c0/fccac5987bf4e7d6361564e14abddc7e51567f0af386bb34967369b2a27c281da2b0b891242de0670ae443ff328968499dd0ec0faee671ea0068f7b05aaa8d04 - languageName: node - linkType: hard - -"google-logging-utils@npm:^1.0.0": - version: 1.1.1 - resolution: "google-logging-utils@npm:1.1.1" - checksum: 10c0/a99ca790b39a4eb854310366f4583dab6d5842d2fa70b0f46de1ef23909a4baad8e6eedd8dcde0756f968131b053c5a4a6e8cb4825595f12ea6289a7ba6360df - languageName: node - linkType: hard - -"google-logging-utils@npm:^1.1.1": - version: 1.1.2 - resolution: "google-logging-utils@npm:1.1.2" - checksum: 10c0/c589d469045e49073913ae0e25c53058584e47298b6178910f2395cb2790f102681ba0e61be5ee6db7726b4745a57110b1d75441a225a7c58c3f1081101f2444 - languageName: node - linkType: hard - -"gopd@npm:^1.0.1, gopd@npm:^1.2.0": - version: 1.2.0 - resolution: "gopd@npm:1.2.0" - checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 - languageName: node - linkType: hard - -"graphql-language-service@npm:^5.3.0": - version: 5.3.0 - resolution: "graphql-language-service@npm:5.3.0" - dependencies: - debounce-promise: "npm:^3.1.2" - nullthrows: "npm:^1.0.0" - vscode-languageserver-types: "npm:^3.17.1" - peerDependencies: - graphql: ^15.5.0 || ^16.0.0 || ^17.0.0-alpha.2 - bin: - graphql: dist/temp-bin.js - checksum: 10c0/93bf543a6561c22ff4067fae00f7b3f30365fcf8d123ba9ca623693dc28272682df89c87bda74772cab353c906fb0a6942344a5809fd223df9ea3505a341065c - languageName: node - linkType: hard - -"graphql@npm:^16.9.0": - version: 16.10.0 - resolution: "graphql@npm:16.10.0" - checksum: 10c0/303730675538c8bd6c76b447dc6f03e61242e2d2596b408c34759666ec4877409e5593a7a0467d590ac5407b8c663b093b599556a77f24f281abea69ddc53de6 - languageName: node - linkType: hard - -"gtoken@npm:^8.0.0": - version: 8.0.0 - resolution: "gtoken@npm:8.0.0" - dependencies: - gaxios: "npm:^7.0.0" - jws: "npm:^4.0.0" - checksum: 10c0/058538e5bbe081d30ada5f1fd34d3a8194357c2e6ecbf7c8a98daeefbf13f7e06c15649c7dace6a1d4cc3bc6dc5483bd484d6d7adc5852021896d7c05c439f37 - languageName: node - linkType: hard - -"hachure-fill@npm:^0.5.2": - version: 0.5.2 - resolution: "hachure-fill@npm:0.5.2" - checksum: 10c0/307e3b6f9f2d3c11a82099c3f71eecbb9c440c00c1f896ac1732c23e6dbff16a92bb893d222b8b721b89cf11e58649ca60b4c24e5663f705f877cefd40153429 - languageName: node - linkType: hard - -"has-bigints@npm:^1.0.2": - version: 1.1.0 - resolution: "has-bigints@npm:1.1.0" - checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - -"has-proto@npm:^1.2.0": - version: 1.2.0 - resolution: "has-proto@npm:1.2.0" - dependencies: - dunder-proto: "npm:^1.0.0" - checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": - version: 1.1.0 - resolution: "has-symbols@npm:1.1.0" - checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c - languageName: node - linkType: hard - -"hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - -"hasown@npm:^2.0.4": - version: 2.0.4 - resolution: "hasown@npm:2.0.4" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/2d8de939e270b70618f8cebb69746620db10617dbb495bc66ddad326955ea24d3ca4af133aff3eb7c1853e0218f867bc2b050ec26fe02e3aea58f880ffc5e506 - languageName: node - linkType: hard - -"hast-util-from-parse5@npm:^8.0.0": - version: 8.0.3 - resolution: "hast-util-from-parse5@npm:8.0.3" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - devlop: "npm:^1.0.0" - hastscript: "npm:^9.0.0" - property-information: "npm:^7.0.0" - vfile: "npm:^6.0.0" - vfile-location: "npm:^5.0.0" - web-namespaces: "npm:^2.0.0" - checksum: 10c0/40ace6c0ad43c26f721c7499fe408e639cde917b2350c9299635e6326559855896dae3c3ebf7440df54766b96c4276a7823e8f376a2b6a28b37b591f03412545 - languageName: node - linkType: hard - -"hast-util-parse-selector@npm:^4.0.0": - version: 4.0.0 - resolution: "hast-util-parse-selector@npm:4.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 10c0/5e98168cb44470dc274aabf1a28317e4feb09b1eaf7a48bbaa8c1de1b43a89cd195cb1284e535698e658e3ec26ad91bc5e52c9563c36feb75abbc68aaf68fb9f - languageName: node - linkType: hard - -"hast-util-raw@npm:^9.0.0": - version: 9.1.0 - resolution: "hast-util-raw@npm:9.1.0" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - "@ungap/structured-clone": "npm:^1.0.0" - hast-util-from-parse5: "npm:^8.0.0" - hast-util-to-parse5: "npm:^8.0.0" - html-void-elements: "npm:^3.0.0" - mdast-util-to-hast: "npm:^13.0.0" - parse5: "npm:^7.0.0" - unist-util-position: "npm:^5.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - web-namespaces: "npm:^2.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/d0d909d2aedecef6a06f0005cfae410d6475e6e182d768bde30c3af9fcbbe4f9beb0522bdc21d0679cb3c243c0df40385797ed255148d68b3d3f12e82d12aacc - languageName: node - linkType: hard - -"hast-util-sanitize@npm:^5.0.0": - version: 5.0.2 - resolution: "hast-util-sanitize@npm:5.0.2" - dependencies: - "@types/hast": "npm:^3.0.0" - "@ungap/structured-clone": "npm:^1.0.0" - unist-util-position: "npm:^5.0.0" - checksum: 10c0/20951652078a8c21341c1c9a84f90015b2ba01cc41fa16772f122c65cda26a7adb0501fdeba5c8e37e40e2632447e8fe455d0dd2dc27d39663baacca76f2ecb6 - languageName: node - linkType: hard - -"hast-util-to-html@npm:^9.0.4": - version: 9.0.5 - resolution: "hast-util-to-html@npm:9.0.5" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - ccount: "npm:^2.0.0" - comma-separated-tokens: "npm:^2.0.0" - hast-util-whitespace: "npm:^3.0.0" - html-void-elements: "npm:^3.0.0" - mdast-util-to-hast: "npm:^13.0.0" - property-information: "npm:^7.0.0" - space-separated-tokens: "npm:^2.0.0" - stringify-entities: "npm:^4.0.0" - zwitch: "npm:^2.0.4" - checksum: 10c0/b7a08c30bab4371fc9b4a620965c40b270e5ae7a8e94cf885f43b21705179e28c8e43b39c72885d1647965fb3738654e6962eb8b58b0c2a84271655b4d748836 - languageName: node - linkType: hard - -"hast-util-to-jsx-runtime@npm:^2.0.0": - version: 2.3.6 - resolution: "hast-util-to-jsx-runtime@npm:2.3.6" - dependencies: - "@types/estree": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/unist": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - estree-util-is-identifier-name: "npm:^3.0.0" - hast-util-whitespace: "npm:^3.0.0" - mdast-util-mdx-expression: "npm:^2.0.0" - mdast-util-mdx-jsx: "npm:^3.0.0" - mdast-util-mdxjs-esm: "npm:^2.0.0" - property-information: "npm:^7.0.0" - space-separated-tokens: "npm:^2.0.0" - style-to-js: "npm:^1.0.0" - unist-util-position: "npm:^5.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/27297e02848fe37ef219be04a26ce708d17278a175a807689e94a821dcffc88aa506d62c3a85beed1f9a8544f7211bdcbcde0528b7b456a57c2e342c3fd11056 - languageName: node - linkType: hard - -"hast-util-to-parse5@npm:^8.0.0": - version: 8.0.0 - resolution: "hast-util-to-parse5@npm:8.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - devlop: "npm:^1.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - web-namespaces: "npm:^2.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/3c0c7fba026e0c4be4675daf7277f9ff22ae6da801435f1b7104f7740de5422576f1c025023c7b3df1d0a161e13a04c6ab8f98ada96eb50adb287b537849a2bd - languageName: node - linkType: hard - -"hast-util-whitespace@npm:^3.0.0": - version: 3.0.0 - resolution: "hast-util-whitespace@npm:3.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - checksum: 10c0/b898bc9fe27884b272580d15260b6bbdabe239973a147e97fa98c45fa0ffec967a481aaa42291ec34fb56530dc2d484d473d7e2bae79f39c83f3762307edfea8 - languageName: node - linkType: hard - -"hastscript@npm:^9.0.0": - version: 9.0.1 - resolution: "hastscript@npm:9.0.1" - dependencies: - "@types/hast": "npm:^3.0.0" - comma-separated-tokens: "npm:^2.0.0" - hast-util-parse-selector: "npm:^4.0.0" - property-information: "npm:^7.0.0" - space-separated-tokens: "npm:^2.0.0" - checksum: 10c0/18dc8064e5c3a7a2ae862978e626b97a254e1c8a67ee9d0c9f06d373bba155ed805fc5b5ce21b990fb7bc174624889e5e1ce1cade264f1b1d58b48f994bc85ce - languageName: node - linkType: hard - -"hermes-estree@npm:0.25.1": - version: 0.25.1 - resolution: "hermes-estree@npm:0.25.1" - checksum: 10c0/48be3b2fa37a0cbc77a112a89096fa212f25d06de92781b163d67853d210a8a5c3784fac23d7d48335058f7ed283115c87b4332c2a2abaaccc76d0ead1a282ac - languageName: node - linkType: hard - -"hermes-parser@npm:^0.25.1": - version: 0.25.1 - resolution: "hermes-parser@npm:0.25.1" - dependencies: - hermes-estree: "npm:0.25.1" - checksum: 10c0/3abaa4c6f1bcc25273f267297a89a4904963ea29af19b8e4f6eabe04f1c2c7e9abd7bfc4730ddb1d58f2ea04b6fee74053d8bddb5656ec6ebf6c79cc8d14202c - languageName: node - linkType: hard - -"hono@npm:^4.11.4": - version: 4.13.7 - resolution: "hono@npm:4.13.7" - checksum: 10c0/29672a94a4f2be7f3f4d959ad69808dd3bbc220909ca4f9660997022ff45d48ae71e42a460e417d808809d68110196f19359aaab2b14ae6a750331d789601b5a - languageName: node - linkType: hard - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 - languageName: node - linkType: hard - -"html-encoding-sniffer@npm:^4.0.0": - version: 4.0.0 - resolution: "html-encoding-sniffer@npm:4.0.0" - dependencies: - whatwg-encoding: "npm:^3.1.1" - checksum: 10c0/523398055dc61ac9b34718a719cb4aa691e4166f29187e211e1607de63dc25ac7af52ca7c9aead0c4b3c0415ffecb17326396e1202e2e86ff4bca4c0ee4c6140 - languageName: node - linkType: hard - -"html-to-text@npm:^9.0.5": - version: 9.0.5 - resolution: "html-to-text@npm:9.0.5" - dependencies: - "@selderee/plugin-htmlparser2": "npm:^0.11.0" - deepmerge: "npm:^4.3.1" - dom-serializer: "npm:^2.0.0" - htmlparser2: "npm:^8.0.2" - selderee: "npm:^0.11.0" - checksum: 10c0/5d2c77b798cf88a81b1da2fc1ea1a3b3e2ff49fe5a3d812392f802fff18ec315cf0969bd7846ef2eb7df8c37f463bc63e8cbdcf84e42696c6f3e15dfa61cdf4f - languageName: node - linkType: hard - -"html-url-attributes@npm:^3.0.0": - version: 3.0.1 - resolution: "html-url-attributes@npm:3.0.1" - checksum: 10c0/496e4908aa8b77665f348b4b03521901794f648b8ac34a581022cd6f2c97934d5c910cd91bc6593bbf2994687549037bc2520fcdc769b31484f29ffdd402acd0 - languageName: node - linkType: hard - -"html-void-elements@npm:^3.0.0": - version: 3.0.0 - resolution: "html-void-elements@npm:3.0.0" - checksum: 10c0/a8b9ec5db23b7c8053876dad73a0336183e6162bf6d2677376d8b38d654fdc59ba74fdd12f8812688f7db6fad451210c91b300e472afc0909224e0a44c8610d2 - languageName: node - linkType: hard - -"htmlparser2@npm:^8.0.2": - version: 8.0.2 - resolution: "htmlparser2@npm:8.0.2" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - domutils: "npm:^3.0.1" - entities: "npm:^4.4.0" - checksum: 10c0/609cca85886d0bf2c9a5db8c6926a89f3764596877492e2caa7a25a789af4065bc6ee2cdc81807fe6b1d03a87bf8a373b5a754528a4cc05146b713c20575aab4 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc - languageName: node - linkType: hard - -"http-errors@npm:2.0.0, http-errors@npm:^2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: "npm:2.0.0" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - toidentifier: "npm:1.0.1" - checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 - languageName: node - linkType: hard - -"http-errors@npm:^2.0.1, http-errors@npm:~2.0.0, http-errors@npm:~2.0.1": - version: 2.0.1 - resolution: "http-errors@npm:2.0.1" - dependencies: - depd: "npm:~2.0.0" - inherits: "npm:~2.0.4" - setprototypeof: "npm:~1.2.0" - statuses: "npm:~2.0.2" - toidentifier: "npm:~1.0.1" - checksum: 10c0/fb38906cef4f5c83952d97661fe14dc156cb59fe54812a42cd448fa57b5c5dfcb38a40a916957737bd6b87aab257c0648d63eb5b6a9ca9f548e105b6072712d4 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"http-status-codes@npm:^2.3.0": - version: 2.3.0 - resolution: "http-status-codes@npm:2.3.0" - checksum: 10c0/c2412188929e8eed6623eef468c62d0c3c082919c03e9b74fd79cfd060d11783dba44603e38a3cee52d26563fe32005913eaf6120aa8ba907da1238f3eaad5fe - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: "npm:6" - debug: "npm:4" - checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.5": - version: 7.0.6 - resolution: "https-proxy-agent@npm:7.0.6" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:4" - checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac - languageName: node - linkType: hard - -"human-signals@npm:^3.0.1": - version: 3.0.1 - resolution: "human-signals@npm:3.0.1" - checksum: 10c0/0bb27e72aea1666322f69ab9816e05df952ef2160346f2293f98f45d472edb1b62d0f1a596697b50d48d8f8222e6db3b9f9dc0b6bf6113866121001f0a8e48e9 - languageName: node - linkType: hard - -"human-signals@npm:^5.0.0": - version: 5.0.0 - resolution: "human-signals@npm:5.0.0" - checksum: 10c0/5a9359073fe17a8b58e5a085e9a39a950366d9f00217c4ff5878bd312e09d80f460536ea6a3f260b5943a01fe55c158d1cea3fc7bee3d0520aeef04f6d915c82 - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: "npm:^2.0.0" - checksum: 10c0/f34a2c20161d02303c2807badec2f3b49cbfbbb409abd4f95a07377ae01cfe6b59e3d15ac609cffcd8f2521f0eb37b7e1091acf65da99aa2a4f1ad63c21e7e7a - languageName: node - linkType: hard - -"iconv-lite@npm:0.6, iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.7.2, iconv-lite@npm:~0.7.0": - version: 0.7.2 - resolution: "iconv-lite@npm:0.7.2" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/3c228920f3bd307f56bf8363706a776f4a060eb042f131cd23855ceca962951b264d0997ab38a1ad340e1c5df8499ed26e1f4f0db6b2a2ad9befaff22f14b722 - languageName: node - linkType: hard - -"iconv-lite@npm:~0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 - languageName: node - linkType: hard - -"ignore-by-default@npm:^1.0.1": - version: 1.0.1 - resolution: "ignore-by-default@npm:1.0.1" - checksum: 10c0/9ab6e70e80f7cc12735def7ecb5527cfa56ab4e1152cd64d294522827f2dcf1f6d85531241537dc3713544e88dd888f65cb3c49c7b2cddb9009087c75274e533 - languageName: node - linkType: hard - -"ignore@npm:^5.2.0": - version: 5.3.2 - resolution: "ignore@npm:5.3.2" - checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 - languageName: node - linkType: hard - -"ignore@npm:^7.0.0, ignore@npm:^7.0.5": - version: 7.0.5 - resolution: "ignore@npm:7.0.5" - checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d - languageName: node - linkType: hard - -"immer@npm:^10.0.3": - version: 10.1.1 - resolution: "immer@npm:10.1.1" - checksum: 10c0/b749e10d137ccae91788f41bd57e9387f32ea6d6ea8fd7eb47b23fd7766681575efc7f86ceef7fe24c3bc9d61e38ff5d2f49c2663b2b0c056e280a4510923653 - languageName: node - linkType: hard - -"import-fresh@npm:^3.2.1": - version: 3.3.1 - resolution: "import-fresh@npm:3.3.1" - dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec - languageName: node - linkType: hard - -"import-in-the-middle@npm:^1.8.1": - version: 1.13.1 - resolution: "import-in-the-middle@npm:1.13.1" - dependencies: - acorn: "npm:^8.14.0" - acorn-import-attributes: "npm:^1.9.5" - cjs-module-lexer: "npm:^1.2.2" - module-details-from-path: "npm:^1.0.3" - checksum: 10c0/4ef05a924c37ff718dd08654927c90d470d92fd9425d646b0d423aaddc89655848debd14761bcb6efa4f57870d63ff38109bab31ca8a1d9d5df2e7d84d2649cf - languageName: node - linkType: hard - -"import-in-the-middle@npm:^3.0.0": - version: 3.3.3 - resolution: "import-in-the-middle@npm:3.3.3" - dependencies: - cjs-module-lexer: "npm:^2.2.0" - es-module-lexer: "npm:^2.2.0" - module-details-from-path: "npm:^1.0.4" - checksum: 10c0/8851038b0314fdf54368e036a79b2f8046bca938ea5cc66ff9dda774c76a1540b59acddc7d9999ba7fee5769a5bc562b98acc39e9a257f4953ee629238cb8de1 - languageName: node - linkType: hard - -"import-meta-resolve@npm:^4.2.0": - version: 4.2.0 - resolution: "import-meta-resolve@npm:4.2.0" - checksum: 10c0/3ee8aeecb61d19b49d2703987f977e9d1c7d4ba47db615a570eaa02fe414f40dfa63f7b953e842cbe8470d26df6371332bfcf21b2fd92b0112f9fea80dde2c4c - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"indent-string@npm:^5.0.0": - version: 5.0.0 - resolution: "indent-string@npm:5.0.0" - checksum: 10c0/8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 - languageName: node - linkType: hard - -"inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.4": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"inline-style-parser@npm:0.2.4": - version: 0.2.4 - resolution: "inline-style-parser@npm:0.2.4" - checksum: 10c0/ddc0b210eaa03e0f98d677b9836242c583c7c6051e84ce0e704ae4626e7871c5b78f8e30853480218b446355745775df318d4f82d33087ff7e393245efa9a881 - languageName: node - linkType: hard - -"input-otp@npm:^1.4.2": - version: 1.4.2 - resolution: "input-otp@npm:1.4.2" - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - checksum: 10c0/d3a3216a75ed832993f3f2852edd7a85c5bae30ea6d251182119120488bbf9fed7cfdd91819bcee6daff57b3cfcbca94fd16d6a7c92cee4d806c0d4fa6ff1128 - languageName: node - linkType: hard - -"inquirer-select-pro@npm:^1.0.0-alpha.9": - version: 1.0.0-alpha.9 - resolution: "inquirer-select-pro@npm:1.0.0-alpha.9" - dependencies: - "@inquirer/core": "npm:^8.1.0" - "@inquirer/figures": "npm:^1.0.1" - "@inquirer/type": "npm:^1.3.1" - ansi-escapes: "npm:^7.0.0" - chalk: "npm:^5.3.0" - checksum: 10c0/5362b6260f067d9a2309c669f6b89660eec7e61150a84ba640bb757e397e58fe856099ce9b4813fa6d96201dc2d716dc9846e9fdd68af3f4cfe0a79e569d8805 - languageName: node - linkType: hard - -"internal-slot@npm:^1.1.0": - version: 1.1.0 - resolution: "internal-slot@npm:1.1.0" - dependencies: - es-errors: "npm:^1.3.0" - hasown: "npm:^2.0.2" - side-channel: "npm:^1.1.0" - checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 - languageName: node - linkType: hard - -"internmap@npm:1 - 2": - version: 2.0.3 - resolution: "internmap@npm:2.0.3" - checksum: 10c0/8cedd57f07bbc22501516fbfc70447f0c6812871d471096fad9ea603516eacc2137b633633daf432c029712df0baefd793686388ddf5737e3ea15074b877f7ed - languageName: node - linkType: hard - -"internmap@npm:^1.0.0": - version: 1.0.1 - resolution: "internmap@npm:1.0.1" - checksum: 10c0/60942be815ca19da643b6d4f23bd0bf4e8c97abbd080fb963fe67583b60bdfb3530448ad4486bae40810e92317bded9995cc31411218acc750d72cd4e8646eee - languageName: node - linkType: hard - -"ioredis@npm:5.11.1, ioredis@npm:^5.11.1": - version: 5.11.1 - resolution: "ioredis@npm:5.11.1" - dependencies: - "@ioredis/commands": "npm:1.10.0" - cluster-key-slot: "npm:1.1.1" - debug: "npm:4.4.3" - denque: "npm:2.1.0" - redis-errors: "npm:1.2.0" - redis-parser: "npm:3.0.0" - standard-as-callback: "npm:2.1.0" - checksum: 10c0/a8b27043cf2c045dfc93f40a32ce24cf9f8b57799a37f4234c4b925c365ccf131629590f94a512f546fda2ba8ed034009c94c4933ecd44c50bc166636d929fd6 - languageName: node - linkType: hard - -"ip-address@npm:^10.1.1, ip-address@npm:^10.2.0": - version: 10.7.2 - resolution: "ip-address@npm:10.7.2" - checksum: 10c0/290b9c63289b2a89a442dac19eff88d919e65cd41d1a720fa963be736e126f3b0cf4f88f6056b06abbf4a95300dc9ce5362a773e012ef30e0400074d175b9d31 - languageName: node - linkType: hard - -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a - languageName: node - linkType: hard - -"is-alphabetical@npm:^2.0.0": - version: 2.0.1 - resolution: "is-alphabetical@npm:2.0.1" - checksum: 10c0/932367456f17237533fd1fc9fe179df77957271020b83ea31da50e5cc472d35ef6b5fb8147453274ffd251134472ce24eb6f8d8398d96dee98237cdb81a6c9a7 - languageName: node - linkType: hard - -"is-alphanumerical@npm:^2.0.0": - version: 2.0.1 - resolution: "is-alphanumerical@npm:2.0.1" - dependencies: - is-alphabetical: "npm:^2.0.0" - is-decimal: "npm:^2.0.0" - checksum: 10c0/4b35c42b18e40d41378293f82a3ecd9de77049b476f748db5697c297f686e1e05b072a6aaae2d16f54d2a57f85b00cbbe755c75f6d583d1c77d6657bd0feb5a2 - languageName: node - linkType: hard - -"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": - version: 3.0.5 - resolution: "is-array-buffer@npm:3.0.5" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 10c0/f59b43dc1d129edb6f0e282595e56477f98c40278a2acdc8b0a5c57097c9eff8fe55470493df5775478cf32a4dc8eaf6d3a749f07ceee5bc263a78b2434f6a54 - languageName: node - linkType: hard - -"is-async-function@npm:^2.0.0": - version: 2.1.1 - resolution: "is-async-function@npm:2.1.1" - dependencies: - async-function: "npm:^1.0.0" - call-bound: "npm:^1.0.3" - get-proto: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.2" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 - languageName: node - linkType: hard - -"is-bigint@npm:^1.1.0": - version: 1.1.0 - resolution: "is-bigint@npm:1.1.0" - dependencies: - has-bigints: "npm:^1.0.2" - checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4 - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: "npm:^2.0.0" - checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 - languageName: node - linkType: hard - -"is-boolean-object@npm:^1.2.1": - version: 1.2.2 - resolution: "is-boolean-object@npm:1.2.2" - dependencies: - call-bound: "npm:^1.0.3" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e - languageName: node - linkType: hard - -"is-bun-module@npm:^1.3.0": - version: 1.3.0 - resolution: "is-bun-module@npm:1.3.0" - dependencies: - semver: "npm:^7.6.3" - checksum: 10c0/2966744188fcd28e0123c52158c7073973f88babfa9ab04e2846ec5862d6b0f8f398df6413429d930f7c5ee6111ce2cbfb3eb8652d9ec42d4a37dc5089a866fb - languageName: node - linkType: hard - -"is-callable@npm:^1.2.7": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f - languageName: node - linkType: hard - -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.0, is-core-module@npm:^2.16.1": - version: 2.16.1 - resolution: "is-core-module@npm:2.16.1" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd - languageName: node - linkType: hard - -"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": - version: 1.0.2 - resolution: "is-data-view@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.6" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 - languageName: node - linkType: hard - -"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": - version: 1.1.0 - resolution: "is-date-object@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f - languageName: node - linkType: hard - -"is-decimal@npm:^2.0.0": - version: 2.0.1 - resolution: "is-decimal@npm:2.0.1" - checksum: 10c0/8085dd66f7d82f9de818fba48b9e9c0429cb4291824e6c5f2622e96b9680b54a07a624cfc663b24148b8e853c62a1c987cfe8b0b5a13f5156991afaf6736e334 - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 - languageName: node - linkType: hard - -"is-finalizationregistry@npm:^1.1.0": - version: 1.1.1 - resolution: "is-finalizationregistry@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc - languageName: node - linkType: hard - -"is-generator-function@npm:^1.0.10": - version: 1.1.0 - resolution: "is-generator-function@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - get-proto: "npm:^1.0.0" - has-tostringtag: "npm:^1.0.2" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: "npm:^2.1.1" - checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a - languageName: node - linkType: hard - -"is-hexadecimal@npm:^2.0.0": - version: 2.0.1 - resolution: "is-hexadecimal@npm:2.0.1" - checksum: 10c0/3eb60fe2f1e2bbc760b927dcad4d51eaa0c60138cf7fc671803f66353ad90c301605b502c7ea4c6bb0548e1c7e79dfd37b73b632652e3b76030bba603a7e9626 - languageName: node - linkType: hard - -"is-hotkey@npm:^0.2.0": - version: 0.2.0 - resolution: "is-hotkey@npm:0.2.0" - checksum: 10c0/d6589159b641014e26c0999ad261ca191e4cb7192e7db32dc849e69df416699b5ec78ad2a2192c169e7b3838847e48b0e1fc76f89f61946fad3036b23cfcd9b4 - languageName: node - linkType: hard - -"is-interactive@npm:^2.0.0": - version: 2.0.0 - resolution: "is-interactive@npm:2.0.0" - checksum: 10c0/801c8f6064f85199dc6bf99b5dd98db3282e930c3bc197b32f2c5b89313bb578a07d1b8a01365c4348c2927229234f3681eb861b9c2c92bee72ff397390fa600 - languageName: node - linkType: hard - -"is-map@npm:^2.0.3": - version: 2.0.3 - resolution: "is-map@npm:2.0.3" - checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc - languageName: node - linkType: hard - -"is-negative-zero@npm:^2.0.3": - version: 2.0.3 - resolution: "is-negative-zero@npm:2.0.3" - checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e - languageName: node - linkType: hard - -"is-network-error@npm:^1.1.0": - version: 1.3.0 - resolution: "is-network-error@npm:1.3.0" - checksum: 10c0/3e85a69e957988db66d5af5412efdd531a5a63e150d1bdd5647cfd4dc54fd89b1dbdd472621f8915233c3176ba1e6922afa8a51a9e363ba4693edf96a294f898 - languageName: node - linkType: hard - -"is-number-object@npm:^1.1.1": - version: 1.1.1 - resolution: "is-number-object@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 - languageName: node - linkType: hard - -"is-plain-obj@npm:^4.0.0": - version: 4.1.0 - resolution: "is-plain-obj@npm:4.1.0" - checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e - languageName: node - linkType: hard - -"is-plain-object@npm:^5.0.0": - version: 5.0.0 - resolution: "is-plain-object@npm:5.0.0" - checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c - languageName: node - linkType: hard - -"is-potential-custom-element-name@npm:^1.0.1": - version: 1.0.1 - resolution: "is-potential-custom-element-name@npm:1.0.1" - checksum: 10c0/b73e2f22bc863b0939941d369486d308b43d7aef1f9439705e3582bfccaa4516406865e32c968a35f97a99396dac84e2624e67b0a16b0a15086a785e16ce7db9 - languageName: node - linkType: hard - -"is-promise@npm:^4.0.0": - version: 4.0.0 - resolution: "is-promise@npm:4.0.0" - checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 - languageName: node - linkType: hard - -"is-reference@npm:1.2.1": - version: 1.2.1 - resolution: "is-reference@npm:1.2.1" - dependencies: - "@types/estree": "npm:*" - checksum: 10c0/7dc819fc8de7790264a0a5d531164f9f5b9ef5aa1cd05f35322d14db39c8a2ec78fd5d4bf57f9789f3ddd2b3abeea7728432b759636157a42db12a9e8c3b549b - languageName: node - linkType: hard - -"is-regex@npm:^1.2.1": - version: 1.2.1 - resolution: "is-regex@npm:1.2.1" - dependencies: - call-bound: "npm:^1.0.2" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 - languageName: node - linkType: hard - -"is-set@npm:^2.0.3": - version: 2.0.3 - resolution: "is-set@npm:2.0.3" - checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.4": - version: 1.0.4 - resolution: "is-shared-array-buffer@npm:1.0.4" - dependencies: - call-bound: "npm:^1.0.3" - checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db - languageName: node - linkType: hard - -"is-ssh@npm:^1.4.0": - version: 1.4.1 - resolution: "is-ssh@npm:1.4.1" - dependencies: - protocols: "npm:^2.0.1" - checksum: 10c0/021a7355cb032625d58db3cc8266ad9aa698cbabf460b71376a0307405577fd7d3aa0826c0bf1951d7809f134c0ee80403306f6d7633db94a5a3600a0106b398 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 - languageName: node - linkType: hard - -"is-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: 10c0/eb2f7127af02ee9aa2a0237b730e47ac2de0d4e76a4a905a50a11557f2339df5765eaea4ceb8029f1efa978586abe776908720bfcb1900c20c6ec5145f6f29d8 - languageName: node - linkType: hard - -"is-string@npm:^1.0.7, is-string@npm:^1.1.1": - version: 1.1.1 - resolution: "is-string@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d - languageName: node - linkType: hard - -"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": - version: 1.1.1 - resolution: "is-symbol@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.2" - has-symbols: "npm:^1.1.0" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": - version: 1.1.15 - resolution: "is-typed-array@npm:1.1.15" - dependencies: - which-typed-array: "npm:^1.1.16" - checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 - languageName: node - linkType: hard - -"is-unicode-supported@npm:^1.3.0": - version: 1.3.0 - resolution: "is-unicode-supported@npm:1.3.0" - checksum: 10c0/b8674ea95d869f6faabddc6a484767207058b91aea0250803cbf1221345cb0c56f466d4ecea375dc77f6633d248d33c47bd296fb8f4cdba0b4edba8917e83d8a - languageName: node - linkType: hard - -"is-unicode-supported@npm:^2.0.0, is-unicode-supported@npm:^2.1.0": - version: 2.1.0 - resolution: "is-unicode-supported@npm:2.1.0" - checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 - languageName: node - linkType: hard - -"is-weakmap@npm:^2.0.2": - version: 2.0.2 - resolution: "is-weakmap@npm:2.0.2" - checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 - languageName: node - linkType: hard - -"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0, is-weakref@npm:^1.1.1": - version: 1.1.1 - resolution: "is-weakref@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b - languageName: node - linkType: hard - -"is-weakset@npm:^2.0.3": - version: 2.0.4 - resolution: "is-weakset@npm:2.0.4" - dependencies: - call-bound: "npm:^1.0.3" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 - languageName: node - linkType: hard - -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 - languageName: node - linkType: hard - -"iterator.prototype@npm:^1.1.4": - version: 1.1.5 - resolution: "iterator.prototype@npm:1.1.5" - dependencies: - define-data-property: "npm:^1.1.4" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.6" - get-proto: "npm:^1.0.0" - has-symbols: "npm:^1.1.0" - set-function-name: "npm:^2.0.2" - checksum: 10c0/f7a262808e1b41049ab55f1e9c29af7ec1025a000d243b83edf34ce2416eedd56079b117fa59376bb4a724110690f13aa8427f2ee29a09eec63a7e72367626d0 - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 - languageName: node - linkType: hard - -"jackspeak@npm:^4.1.1": - version: 4.1.1 - resolution: "jackspeak@npm:4.1.1" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - checksum: 10c0/84ec4f8e21d6514db24737d9caf65361511f75e5e424980eebca4199f400874f45e562ac20fa8aeb1dd20ca2f3f81f0788b6e9c3e64d216a5794fd6f30e0e042 - languageName: node - linkType: hard - -"jiti@npm:2.4.2": - version: 2.4.2 - resolution: "jiti@npm:2.4.2" - bin: - jiti: lib/jiti-cli.mjs - checksum: 10c0/4ceac133a08c8faff7eac84aabb917e85e8257f5ad659e843004ce76e981c457c390a220881748ac67ba1b940b9b729b30fb85cbaf6e7989f04b6002c94da331 - languageName: node - linkType: hard - -"jiti@npm:^1.21.6": - version: 1.21.7 - resolution: "jiti@npm:1.21.7" - bin: - jiti: bin/jiti.js - checksum: 10c0/77b61989c758ff32407cdae8ddc77f85e18e1a13fc4977110dbd2e05fc761842f5f71bce684d9a01316e1c4263971315a111385759951080bbfe17cbb5de8f7a - languageName: node - linkType: hard - -"jose@npm:^6.0.6": - version: 6.0.10 - resolution: "jose@npm:6.0.10" - checksum: 10c0/d1327afd7fe6011a6648b570b8a220dd89c3d427d6fb3225825650df3249b58bf0f76494179a34a0f7ad185832fb083d6402092d3c7f880c677d0dd38cc75eae - languageName: node - linkType: hard - -"jose@npm:^6.1.3": - version: 6.1.3 - resolution: "jose@npm:6.1.3" - checksum: 10c0/b9577b4a7a5e84131011c23823db9f5951eae3ba796771a6a2401ae5dd50daf71104febc8ded9c38146aa5ebe94a92ac09c725e699e613ef26949b9f5a8bc30f - languageName: node - linkType: hard - -"js-md4@npm:^0.3.2": - version: 0.3.2 - resolution: "js-md4@npm:0.3.2" - checksum: 10c0/8313e00c45f710a53bdadc199c095b48ebaf54ea7b8cdb67a3f1863c270a5e9d0f89f204436b73866002af8c7ac4cacc872fdf271fc70e26614e424c7685b577 - languageName: node - linkType: hard - -"js-tiktoken@npm:^1.0.12": - version: 1.0.21 - resolution: "js-tiktoken@npm:1.0.21" - dependencies: - base64-js: "npm:^1.5.1" - checksum: 10c0/49a0b1e8915d271b84b5c2217fcab37de3124cfbba7e9901d3d9afb1acdd931f0ff7025ed94587dd1b59ae5c04cc19949c2869823854ee7f2f3f81678db276f3 - languageName: node - linkType: hard - -"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.1": - version: 4.3.2 - resolution: "js-yaml@npm:4.3.2" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/dedd34c2e8fef1d504687f1bc94ed0ee1311a1f78770fa2800352c6d59c635ccf555009d74e9afe529ae62199da2b1ccef30e53dc84dcd8d2d8187c22574bc97 - languageName: node - linkType: hard - -"jsdom@npm:^25.0.1": - version: 25.0.1 - resolution: "jsdom@npm:25.0.1" - dependencies: - cssstyle: "npm:^4.1.0" - data-urls: "npm:^5.0.0" - decimal.js: "npm:^10.4.3" - form-data: "npm:^4.0.0" - html-encoding-sniffer: "npm:^4.0.0" - http-proxy-agent: "npm:^7.0.2" - https-proxy-agent: "npm:^7.0.5" - is-potential-custom-element-name: "npm:^1.0.1" - nwsapi: "npm:^2.2.12" - parse5: "npm:^7.1.2" - rrweb-cssom: "npm:^0.7.1" - saxes: "npm:^6.0.0" - symbol-tree: "npm:^3.2.4" - tough-cookie: "npm:^5.0.0" - w3c-xmlserializer: "npm:^5.0.0" - webidl-conversions: "npm:^7.0.0" - whatwg-encoding: "npm:^3.1.1" - whatwg-mimetype: "npm:^4.0.0" - whatwg-url: "npm:^14.0.0" - ws: "npm:^8.18.0" - xml-name-validator: "npm:^5.0.0" - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - checksum: 10c0/6bda32a6dfe4e37a30568bf51136bdb3ba9c0b72aadd6356280404275a34c9e097c8c25b5eb3c742e602623741e172da977ff456684befd77c9042ed9bf8c2b4 - languageName: node - linkType: hard - -"jsesc@npm:^3.0.2": - version: 3.1.0 - resolution: "jsesc@npm:3.1.0" - bin: - jsesc: bin/jsesc - checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 - languageName: node - linkType: hard - -"json-bigint@npm:^1.0.0": - version: 1.0.0 - resolution: "json-bigint@npm:1.0.0" - dependencies: - bignumber.js: "npm:^9.0.0" - checksum: 10c0/e3f34e43be3284b573ea150a3890c92f06d54d8ded72894556357946aeed9877fd795f62f37fe16509af189fd314ab1104d0fd0f163746ad231b9f378f5b33f4 - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 - languageName: node - linkType: hard - -"json-parse-better-errors@npm:^1.0.1": - version: 1.0.2 - resolution: "json-parse-better-errors@npm:1.0.2" - checksum: 10c0/2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb - languageName: node - linkType: hard - -"json-schema-library@npm:^9.3.5": - version: 9.3.5 - resolution: "json-schema-library@npm:9.3.5" - dependencies: - "@sagold/json-pointer": "npm:^5.1.2" - "@sagold/json-query": "npm:^6.1.3" - deepmerge: "npm:^4.3.1" - fast-copy: "npm:^3.0.2" - fast-deep-equal: "npm:^3.1.3" - smtp-address-parser: "npm:1.0.10" - valid-url: "npm:^1.0.9" - checksum: 10c0/3268b7f6620faac347fc18d1e1e5b516869676b5317f470ca157b68704603fac9aadee6b6840a5086a04054fc2ec8e223a6cfe962ab09d5198f93631946548e1 - languageName: node - linkType: hard - -"json-schema-to-ts@npm:^3.1.1": - version: 3.1.1 - resolution: "json-schema-to-ts@npm:3.1.1" - dependencies: - "@babel/runtime": "npm:^7.18.3" - ts-algebra: "npm:^2.0.0" - checksum: 10c0/609bae04aa5e860a11b6d30ccf41445fae1c7f66fb600c1d170257cf33aa468aa9d03aa046428c3688aff0ff450c2b0c76584b66fa4a5d0da8e33799e4c439a6 - languageName: node - linkType: hard - -"json-schema-to-typescript@npm:^15.0.4": - version: 15.0.4 - resolution: "json-schema-to-typescript@npm:15.0.4" - dependencies: - "@apidevtools/json-schema-ref-parser": "npm:^11.5.5" - "@types/json-schema": "npm:^7.0.15" - "@types/lodash": "npm:^4.17.7" - is-glob: "npm:^4.0.3" - js-yaml: "npm:^4.1.0" - lodash: "npm:^4.17.21" - minimist: "npm:^1.2.8" - prettier: "npm:^3.2.5" - tinyglobby: "npm:^0.2.9" - bin: - json2ts: dist/src/cli.js - checksum: 10c0/1af8a68d5121710f6f2b9998eea062b751ffc45166b0272a17068e64443010b3c6b02360d3446ca696fcb77102bcb82abd717be0869299d1e12bab437287331b - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce - languageName: node - linkType: hard - -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 - languageName: node - linkType: hard - -"json-schema-typed@npm:^8.0.1, json-schema-typed@npm:^8.0.2": - version: 8.0.2 - resolution: "json-schema-typed@npm:8.0.2" - checksum: 10c0/89f5e2fb1495483b705c027203c07277ee6bf2665165ad25a9cb55de5af7f72570326d13d32565180781e4083ad5c9688102f222baed7b353c2f39c1e02b0428 - languageName: node - linkType: hard - -"json-schema@npm:^0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: 10c0/d4a637ec1d83544857c1c163232f3da46912e971d5bf054ba44fdb88f07d8d359a462b4aec46f2745efbc57053365608d88bc1d7b1729f7b4fc3369765639ed3 - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 - languageName: node - linkType: hard - -"json5@npm:^1.0.2": - version: 1.0.2 - resolution: "json5@npm:1.0.2" - dependencies: - minimist: "npm:^1.2.0" - bin: - json5: lib/cli.js - checksum: 10c0/9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f - languageName: node - linkType: hard - -"json5@npm:^2.1.2, json5@npm:^2.2.1, json5@npm:^2.2.2, json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c - languageName: node - linkType: hard - -"jsonc-parser@npm:^3.3.1": - version: 3.3.1 - resolution: "jsonc-parser@npm:3.3.1" - checksum: 10c0/269c3ae0a0e4f907a914bf334306c384aabb9929bd8c99f909275ebd5c2d3bc70b9bcd119ad794f339dec9f24b6a4ee9cd5a8ab2e6435e730ad4075388fc2ab6 - languageName: node - linkType: hard - -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": - version: 3.3.5 - resolution: "jsx-ast-utils@npm:3.3.5" - dependencies: - array-includes: "npm:^3.1.6" - array.prototype.flat: "npm:^1.3.1" - object.assign: "npm:^4.1.4" - object.values: "npm:^1.1.6" - checksum: 10c0/a32679e9cb55469cb6d8bbc863f7d631b2c98b7fc7bf172629261751a6e7bc8da6ae374ddb74d5fbd8b06cf0eb4572287b259813d92b36e384024ed35e4c13e1 - languageName: node - linkType: hard - -"jwa@npm:^2.0.1": - version: 2.0.1 - resolution: "jwa@npm:2.0.1" - dependencies: - buffer-equal-constant-time: "npm:^1.0.1" - ecdsa-sig-formatter: "npm:1.0.11" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/ab3ebc6598e10dc11419d4ed675c9ca714a387481466b10e8a6f3f65d8d9c9237e2826f2505280a739cf4cbcf511cb288eeec22b5c9c63286fc5a2e4f97e78cf - languageName: node - linkType: hard - -"jws@npm:^4.0.0": - version: 4.0.1 - resolution: "jws@npm:4.0.1" - dependencies: - jwa: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/6be1ed93023aef570ccc5ea8d162b065840f3ef12f0d1bb3114cade844de7a357d5dc558201d9a65101e70885a6fa56b17462f520e6b0d426195510618a154d0 - languageName: node - linkType: hard - -"katex@npm:^0.18.2": - version: 0.18.10 - resolution: "katex@npm:0.18.10" - dependencies: - commander: "npm:^15.0.0" - bin: - katex: cli.js - checksum: 10c0/3864a236334e9c7aef906b2fdd70defb76edfe8362372ccd5504167e8b22bbc1a48210e5d03e30e464c0c0f669e6d467b3b8b01120598fb1968c275fa5059721 - languageName: node - linkType: hard - -"keyv@npm:^4.5.4": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: "npm:3.0.1" - checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e - languageName: node - linkType: hard - -"khroma@npm:^2.1.0": - version: 2.1.0 - resolution: "khroma@npm:2.1.0" - checksum: 10c0/634d98753ff5d2540491cafeb708fc98de0d43f4e6795256d5c8f6e3ad77de93049ea41433928fda3697adf7bbe6fe27351858f6d23b78f8b5775ef314c59891 - languageName: node - linkType: hard - -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b - languageName: node - linkType: hard - -"kuler@npm:^2.0.0": - version: 2.0.0 - resolution: "kuler@npm:2.0.0" - checksum: 10c0/0a4e99d92ca373f8f74d1dc37931909c4d0d82aebc94cf2ba265771160fc12c8df34eaaac80805efbda367e2795cb1f1dd4c3d404b6b1cf38aec94035b503d2d - languageName: node - linkType: hard - -"langchain@npm:^1.2.28": - version: 1.3.3 - resolution: "langchain@npm:1.3.3" - dependencies: - "@langchain/langgraph": "npm:^1.2.8" - "@langchain/langgraph-checkpoint": "npm:^1.0.1" - langsmith: "npm:>=0.5.0 <1.0.0" - uuid: "npm:^11.1.0" - zod: "npm:^3.25.76 || ^4" - peerDependencies: - "@langchain/core": ^1.1.40 - checksum: 10c0/6ec4de246953e38e95a2584340aa6a17be2615f62bf8849154a1a8756fd85bcaf9b74651570494b70c48dc8cb19e8d4c7905c326d208a36c9604adbc81a53b48 - languageName: node - linkType: hard - -"langsmith@npm:>=0.5.0 <1.0.0": - version: 0.7.1 - resolution: "langsmith@npm:0.7.1" - dependencies: - p-queue: "npm:6.6.2" - peerDependencies: - "@opentelemetry/api": "*" - "@opentelemetry/exporter-trace-otlp-proto": "*" - "@opentelemetry/sdk-trace-base": "*" - openai: "*" - ws: ">=7" - peerDependenciesMeta: - "@opentelemetry/api": - optional: true - "@opentelemetry/exporter-trace-otlp-proto": - optional: true - "@opentelemetry/sdk-trace-base": - optional: true - openai: - optional: true - ws: - optional: true - checksum: 10c0/386be4928535311d47c8dabd9d8990d71445b8814b78d9e6e03341d663125e79dac6151176febed69baed4608fd955826a80decdb8e0bb18cc068b222df11f4a - languageName: node - linkType: hard - -"language-subtag-registry@npm:^0.3.20": - version: 0.3.23 - resolution: "language-subtag-registry@npm:0.3.23" - checksum: 10c0/e9b05190421d2cd36dd6c95c28673019c927947cb6d94f40ba7e77a838629ee9675c94accf897fbebb07923187deb843b8fbb8935762df6edafe6c28dcb0b86c - languageName: node - linkType: hard - -"language-tags@npm:^1.0.9": - version: 1.0.9 - resolution: "language-tags@npm:1.0.9" - dependencies: - language-subtag-registry: "npm:^0.3.20" - checksum: 10c0/9ab911213c4bd8bd583c850201c17794e52cb0660d1ab6e32558aadc8324abebf6844e46f92b80a5d600d0fbba7eface2c207bfaf270a1c7fd539e4c3a880bff - languageName: node - linkType: hard - -"layout-base@npm:^1.0.0": - version: 1.0.2 - resolution: "layout-base@npm:1.0.2" - checksum: 10c0/2a55d0460fd9f6ed53d7e301b9eb3dea19bda03815d616a40665ce6dc75c1f4d62e1ca19a897da1cfaf6de1b91de59cd6f2f79ba1258f3d7fccc7d46ca7f3337 - languageName: node - linkType: hard - -"layout-base@npm:^2.0.0": - version: 2.0.1 - resolution: "layout-base@npm:2.0.1" - checksum: 10c0/a44df9ef3cbff9916a10f616635e22b5787c89fa62b2fec6f99e8e6ee512c7cebd22668ce32dab5a83c934ba0a309c51a678aa0b40d70853de6c357893c0a88b - languageName: node - linkType: hard - -"leac@npm:^0.6.0": - version: 0.6.0 - resolution: "leac@npm:0.6.0" - checksum: 10c0/5257781e10791ef8462eb1cbe5e48e3cda7692486f2a775265d6f5216cc088960c62f138163b8df0dcf2119d18673bfe7b050d6b41543d92a7b7ac90e4eb1e8b - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: "npm:^1.2.1" - type-check: "npm:~0.4.0" - checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e - languageName: node - linkType: hard - -"lezer-elixir@npm:^1.0.0": - version: 1.1.2 - resolution: "lezer-elixir@npm:1.1.2" - dependencies: - "@lezer/highlight": "npm:^1.2.0" - "@lezer/lr": "npm:^1.3.0" - checksum: 10c0/a469127c098b2004fe80b05b8514d99c6eb60ac8fcf7da3850c33a046aae75f29d003683235ee1e33ebdaae19277d17c3816493dcc070b42a39d7438f7f697bc - languageName: node - linkType: hard - -"lezer-json5@npm:^2.0.2": - version: 2.0.2 - resolution: "lezer-json5@npm:2.0.2" - dependencies: - "@lezer/lr": "npm:^1.0.0" - checksum: 10c0/3c40a419a618e3722bd93271cedfbbc9c15c02a4f2310f793f7812f021a0ce46e99b2c30a80aabad699a9a7eae787325f511710f03fd2d480e36c2f639cb9de2 - languageName: node - linkType: hard - -"lezer-r@npm:^0.1.3": - version: 0.1.3 - resolution: "lezer-r@npm:0.1.3" - dependencies: - "@lezer/highlight": "npm:^1.2.1" - "@lezer/lr": "npm:^1.4.2" - checksum: 10c0/0b88dace8f309f60bbf55d69a2b42c199c10ef37efbbd298bfffc4e6b0f38c256562699c4999f851fdad3ed40ad53ed3f24c5e3bab724dd85923465b36b34956 - languageName: node - linkType: hard - -"lightningcss-android-arm64@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-android-arm64@npm:1.32.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-darwin-arm64@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-darwin-arm64@npm:1.32.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-darwin-x64@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-darwin-x64@npm:1.32.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-freebsd-x64@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-freebsd-x64@npm:1.32.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"lightningcss-linux-arm-gnueabihf@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-linux-arm-gnueabihf@npm:1.32.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"lightningcss-linux-arm64-gnu@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-linux-arm64-gnu@npm:1.32.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"lightningcss-linux-arm64-musl@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-linux-arm64-musl@npm:1.32.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"lightningcss-linux-x64-gnu@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-linux-x64-gnu@npm:1.32.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"lightningcss-linux-x64-musl@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-linux-x64-musl@npm:1.32.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"lightningcss-win32-arm64-msvc@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-win32-arm64-msvc@npm:1.32.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"lightningcss-win32-x64-msvc@npm:1.32.0": - version: 1.32.0 - resolution: "lightningcss-win32-x64-msvc@npm:1.32.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"lightningcss@npm:^1.32.0": - version: 1.32.0 - resolution: "lightningcss@npm:1.32.0" - dependencies: - detect-libc: "npm:^2.0.3" - lightningcss-android-arm64: "npm:1.32.0" - lightningcss-darwin-arm64: "npm:1.32.0" - lightningcss-darwin-x64: "npm:1.32.0" - lightningcss-freebsd-x64: "npm:1.32.0" - lightningcss-linux-arm-gnueabihf: "npm:1.32.0" - lightningcss-linux-arm64-gnu: "npm:1.32.0" - lightningcss-linux-arm64-musl: "npm:1.32.0" - lightningcss-linux-x64-gnu: "npm:1.32.0" - lightningcss-linux-x64-musl: "npm:1.32.0" - lightningcss-win32-arm64-msvc: "npm:1.32.0" - lightningcss-win32-x64-msvc: "npm:1.32.0" - dependenciesMeta: - lightningcss-android-arm64: - optional: true - lightningcss-darwin-arm64: - optional: true - lightningcss-darwin-x64: - optional: true - lightningcss-freebsd-x64: - optional: true - lightningcss-linux-arm-gnueabihf: - optional: true - lightningcss-linux-arm64-gnu: - optional: true - lightningcss-linux-arm64-musl: - optional: true - lightningcss-linux-x64-gnu: - optional: true - lightningcss-linux-x64-musl: - optional: true - lightningcss-win32-arm64-msvc: - optional: true - lightningcss-win32-x64-msvc: - optional: true - checksum: 10c0/70945bd55097af46fc9fab7f5ed09cd5869d85940a2acab7ee06d0117004a1d68155708a2d462531cea2fc3c67aefc9333a7068c80b0b78dd404c16838809e03 - languageName: node - linkType: hard - -"lilconfig@npm:^3.0.0, lilconfig@npm:^3.1.3": - version: 3.1.3 - resolution: "lilconfig@npm:3.1.3" - checksum: 10c0/f5604e7240c5c275743561442fbc5abf2a84ad94da0f5adc71d25e31fa8483048de3dcedcb7a44112a942fed305fd75841cdf6c9681c7f640c63f1049e9a5dcc - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d - languageName: node - linkType: hard - -"linguist-languages@npm:^9.3.1": - version: 9.3.1 - resolution: "linguist-languages@npm:9.3.1" - checksum: 10c0/41d5c16b9f7095310003598f4568254ac9736fc6f67daa1f62a11ae9aaf6acc847451675dbb8387b70ed8daaef75656dba8c8057ae93e07152304f3c27aa7440 - languageName: node - linkType: hard - -"linkify-it@npm:^5.0.2": - version: 5.0.2 - resolution: "linkify-it@npm:5.0.2" - dependencies: - uc.micro: "npm:^2.0.0" - checksum: 10c0/dd70b1735a13d41a2cff0a058ac3771166038f23f6aff004dd53873cf985c64b107902fe0b544a5b3d1ff6e63249cf9c648fb3ae9f285481db48f56887adb0d6 - languageName: node - linkType: hard - -"load-json-file@npm:^4.0.0": - version: 4.0.0 - resolution: "load-json-file@npm:4.0.0" - dependencies: - graceful-fs: "npm:^4.1.2" - parse-json: "npm:^4.0.0" - pify: "npm:^3.0.0" - strip-bom: "npm:^3.0.0" - checksum: 10c0/6b48f6a0256bdfcc8970be2c57f68f10acb2ee7e63709b386b2febb6ad3c86198f840889cdbe71d28f741cbaa2f23a7771206b138cd1bdd159564511ca37c1d5 - languageName: node - linkType: hard - -"loader-utils@npm:^2.0.0": - version: 2.0.4 - resolution: "loader-utils@npm:2.0.4" - dependencies: - big.js: "npm:^5.2.2" - emojis-list: "npm:^3.0.0" - json5: "npm:^2.1.2" - checksum: 10c0/d5654a77f9d339ec2a03d88221a5a695f337bf71eb8dea031b3223420bb818964ba8ed0069145c19b095f6c8b8fd386e602a3fc7ca987042bd8bb1dcc90d7100 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: "npm:^5.0.0" - checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 - languageName: node - linkType: hard - -"lodash-es@npm:^4.17.21": - version: 4.18.1 - resolution: "lodash-es@npm:4.18.1" - checksum: 10c0/35d4dcf87ef07f8d090f409447575800108057e360b445f590d0d25d09e3d1e33a163d2fc100d4d072b0f901d5e2fc533cd7c4bfd8eeb38a06abec693823c8b8 - languageName: node - linkType: hard - -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: 10c0/fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 - languageName: node - linkType: hard - -"lodash.castarray@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.castarray@npm:4.4.0" - checksum: 10c0/0bf523ad1596a5bf17869ba047235b4453eee927005013ae152345e2b291b81a02e7f2b7c38f876a1d16f73c34aa3c3241e965193e5b31595035bc8f330c4358 - languageName: node - linkType: hard - -"lodash.debounce@npm:^4.0.8": - version: 4.0.8 - resolution: "lodash.debounce@npm:4.0.8" - checksum: 10c0/762998a63e095412b6099b8290903e0a8ddcb353ac6e2e0f2d7e7d03abd4275fe3c689d88960eb90b0dde4f177554d51a690f22a343932ecbc50a5d111849987 - languageName: node - linkType: hard - -"lodash.isplainobject@npm:^4.0.6": - version: 4.0.6 - resolution: "lodash.isplainobject@npm:4.0.6" - checksum: 10c0/afd70b5c450d1e09f32a737bed06ff85b873ecd3d3d3400458725283e3f2e0bb6bf48e67dbe7a309eb371a822b16a26cca4a63c8c52db3fc7dc9d5f9dd324cbb - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 - languageName: node - linkType: hard - -"lodash@npm:^4.17.11, lodash@npm:^4.17.21": - version: 4.18.1 - resolution: "lodash@npm:4.18.1" - checksum: 10c0/757228fc68805c59789e82185135cf85f05d0b2d3d54631d680ca79ec21944ec8314d4533639a14b8bcfbd97a517e78960933041a5af17ecb693ec6eecb99a27 - languageName: node - linkType: hard - -"log-symbols@npm:^6.0.0": - version: 6.0.0 - resolution: "log-symbols@npm:6.0.0" - dependencies: - chalk: "npm:^5.3.0" - is-unicode-supported: "npm:^1.3.0" - checksum: 10c0/36636cacedba8f067d2deb4aad44e91a89d9efb3ead27e1846e7b82c9a10ea2e3a7bd6ce28a7ca616bebc60954ff25c67b0f92d20a6a746bb3cc52c3701891f6 - languageName: node - linkType: hard - -"log-symbols@npm:^7.0.0, log-symbols@npm:^7.0.1": - version: 7.0.1 - resolution: "log-symbols@npm:7.0.1" - dependencies: - is-unicode-supported: "npm:^2.0.0" - yoctocolors: "npm:^2.1.1" - checksum: 10c0/71d30f9a44b8604b14df5e7c9b579d739997253db7385339d493ece41ee2cc74c1f96c5b4c0b2c1e0829b05348d4f287e68faab495b7a094a80f51351c816075 - languageName: node - linkType: hard - -"logform@npm:^2.7.0": - version: 2.7.0 - resolution: "logform@npm:2.7.0" - dependencies: - "@colors/colors": "npm:1.6.0" - "@types/triple-beam": "npm:^1.3.2" - fecha: "npm:^4.2.0" - ms: "npm:^2.1.1" - safe-stable-stringify: "npm:^2.3.1" - triple-beam: "npm:^1.3.0" - checksum: 10c0/4789b4b37413c731d1835734cb799240d31b865afde6b7b3e06051d6a4127bfda9e88c99cfbf296d084a315ccbed2647796e6a56b66e725bcb268c586f57558f - languageName: node - linkType: hard - -"loglevel@npm:^1.9.1": - version: 1.9.2 - resolution: "loglevel@npm:1.9.2" - checksum: 10c0/1e317fa4648fe0b4a4cffef6de037340592cee8547b07d4ce97a487abe9153e704b98451100c799b032c72bb89c9366d71c9fb8192ada8703269263ae77acdc7 - languageName: node - linkType: hard - -"long@npm:^5.0.0, long@npm:^5.3.2": - version: 5.3.2 - resolution: "long@npm:5.3.2" - checksum: 10c0/7130fe1cbce2dca06734b35b70d380ca3f70271c7f8852c922a7c62c86c4e35f0c39290565eca7133c625908d40e126ac57c02b1b1a4636b9457d77e1e60b981 - languageName: node - linkType: hard - -"longest-streak@npm:^3.0.0": - version: 3.1.0 - resolution: "longest-streak@npm:3.1.0" - checksum: 10c0/7c2f02d0454b52834d1bcedef79c557bd295ee71fdabb02d041ff3aa9da48a90b5df7c0409156dedbc4df9b65da18742652aaea4759d6ece01f08971af6a7eaa - languageName: node - linkType: hard - -"loose-envify@npm:^1.4.0": - version: 1.4.0 - resolution: "loose-envify@npm:1.4.0" - dependencies: - js-tokens: "npm:^3.0.0 || ^4.0.0" - bin: - loose-envify: cli.js - checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e - languageName: node - linkType: hard - -"lowdb@npm:^7.0.1": - version: 7.0.1 - resolution: "lowdb@npm:7.0.1" - dependencies: - steno: "npm:^4.0.2" - checksum: 10c0/d61f554d6a507419772b07c91982bb72a0d3976dddef83e1d58fb24ff9049398962ec2c1917b3a863aedb46559081e0cd208d032ff3c43b1d59f41be9f4f4022 - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb - languageName: node - linkType: hard - -"lru-cache@npm:^11.0.0": - version: 11.0.2 - resolution: "lru-cache@npm:11.0.2" - checksum: 10c0/c993b8e06ead0b24b969c1dbb5b301716aed66e320e9014a80012f5febe280b438f28ff50046b2c55ff404e889351ccb332ff91f8dd175a21f5eae80e3fb155f - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: "npm:^3.0.2" - checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 - languageName: node - linkType: hard - -"lucide-react@npm:^1.7.0": - version: 1.7.0 - resolution: "lucide-react@npm:1.7.0" - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/bf913e1c9b8438fd1e19dbee602b4c1a596109faadd361b452e210135e51ff1147cbce9c1aa686a9c419f01541540536507a03202bc2cebebc04eb9a3cf8be2e - languageName: node - linkType: hard - -"luxon@npm:^3.2.1": - version: 3.5.0 - resolution: "luxon@npm:3.5.0" - checksum: 10c0/335789bba95077db831ef99894edadeb23023b3eb2137a1b56acd0d290082b691cf793143d69e30bc069ec95f0b49f36419f48e951c68014f19ffe12045e3494 - languageName: node - linkType: hard - -"lz-string@npm:^1.5.0": - version: 1.5.0 - resolution: "lz-string@npm:1.5.0" - bin: - lz-string: bin/bin.js - checksum: 10c0/36128e4de34791838abe979b19927c26e67201ca5acf00880377af7d765b38d1c60847e01c5ec61b1a260c48029084ab3893a3925fd6e48a04011364b089991b - languageName: node - linkType: hard - -"magic-string@npm:^0.30.21, magic-string@npm:~0.30.8": - version: 0.30.21 - resolution: "magic-string@npm:0.30.21" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.5" - checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a - languageName: node - linkType: hard - -"magic-string@npm:^0.30.3": - version: 0.30.17 - resolution: "magic-string@npm:0.30.17" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^14.0.3": - version: 14.0.3 - resolution: "make-fetch-happen@npm:14.0.3" - dependencies: - "@npmcli/agent": "npm:^3.0.0" - cacache: "npm:^19.0.1" - http-cache-semantics: "npm:^4.1.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^4.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^1.0.0" - proc-log: "npm:^5.0.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^12.0.0" - checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 - languageName: node - linkType: hard - -"map-stream@npm:~0.1.0": - version: 0.1.0 - resolution: "map-stream@npm:0.1.0" - checksum: 10c0/7dd6debe511c1b55d9da75e1efa65a28b1252a2d8357938d2e49b412713c478efbaefb0cdf0ee0533540c3bf733e8f9f71e1a15aa0fe74bf71b64e75bf1576bd - languageName: node - linkType: hard - -"markdown-it@npm:^14.1.1": - version: 14.3.2 - resolution: "markdown-it@npm:14.3.2" - dependencies: - argparse: "npm:^2.0.1" - entities: "npm:^4.5.0" - linkify-it: "npm:^5.0.2" - mdurl: "npm:^2.0.0" - punycode.js: "npm:^2.3.1" - uc.micro: "npm:^2.1.0" - bin: - markdown-it: bin/markdown-it.mjs - checksum: 10c0/51d03a244bbacc84aa7229fd784ccc16a76cb853cf93f668c4dfc1e9eb22d03138678e7743accac2304e03151a995068492fde56c7a9fbe6785b4169036cf590 - languageName: node - linkType: hard - -"markdown-table@npm:^3.0.0": - version: 3.0.4 - resolution: "markdown-table@npm:3.0.4" - checksum: 10c0/1257b31827629a54c24a5030a3dac952256c559174c95ce3ef89bebd6bff0cb1444b1fd667b1a1bb53307f83278111505b3e26f0c4e7b731e0060d435d2d930b - languageName: node - linkType: hard - -"marked@npm:^15.0.12": - version: 15.0.12 - resolution: "marked@npm:15.0.12" - bin: - marked: bin/marked.js - checksum: 10c0/e09da211544b787ecfb25fed07af206060bf7cd6d9de6cb123f15c496a57f83b7aabea93340aaa94dae9c94e097ae129377cad6310abc16009590972e85f4212 - languageName: node - linkType: hard - -"marked@npm:^16.3.0": - version: 16.4.2 - resolution: "marked@npm:16.4.2" - bin: - marked: bin/marked.js - checksum: 10c0/fc6051142172454f2023f3d6b31cca92879ec8e1b96457086a54c70354c74b00e1b6543a76a1fad6d399366f52b90a848f6ffb8e1d65a5baff87f3ba9b8f1847 - languageName: node - linkType: hard - -"math-intrinsics@npm:^1.1.0": - version: 1.1.0 - resolution: "math-intrinsics@npm:1.1.0" - checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f - languageName: node - linkType: hard - -"mdast-util-find-and-replace@npm:^3.0.0": - version: 3.0.2 - resolution: "mdast-util-find-and-replace@npm:3.0.2" - dependencies: - "@types/mdast": "npm:^4.0.0" - escape-string-regexp: "npm:^5.0.0" - unist-util-is: "npm:^6.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 10c0/c8417a35605d567772ff5c1aa08363ff3010b0d60c8ea68c53cba09bf25492e3dd261560425c1756535f3b7107f62e7ff3857cdd8fb1e62d1b2cc2ea6e074ca2 - languageName: node - linkType: hard - -"mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.2 - resolution: "mdast-util-from-markdown@npm:2.0.2" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - mdast-util-to-string: "npm:^4.0.0" - micromark: "npm:^4.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-decode-string: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unist-util-stringify-position: "npm:^4.0.0" - checksum: 10c0/76eb2bd2c6f7a0318087c73376b8af6d7561c1e16654e7667e640f391341096c56142618fd0ff62f6d39e5ab4895898b9789c84cd7cec2874359a437a0e1ff15 - languageName: node - linkType: hard - -"mdast-util-gfm-autolink-literal@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1" - dependencies: - "@types/mdast": "npm:^4.0.0" - ccount: "npm:^2.0.0" - devlop: "npm:^1.0.0" - mdast-util-find-and-replace: "npm:^3.0.0" - micromark-util-character: "npm:^2.0.0" - checksum: 10c0/963cd22bd42aebdec7bdd0a527c9494d024d1ad0739c43dc040fee35bdfb5e29c22564330a7418a72b5eab51d47a6eff32bc0255ef3ccb5cebfe8970e91b81b6 - languageName: node - linkType: hard - -"mdast-util-gfm-footnote@npm:^2.0.0": - version: 2.1.0 - resolution: "mdast-util-gfm-footnote@npm:2.1.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.1.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - checksum: 10c0/8ab965ee6be3670d76ec0e95b2ba3101fc7444eec47564943ab483d96ac17d29da2a4e6146a2a288be30c21b48c4f3938a1e54b9a46fbdd321d49a5bc0077ed0 - languageName: node - linkType: hard - -"mdast-util-gfm-strikethrough@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/b053e93d62c7545019bd914271ea9e5667ad3b3b57d16dbf68e56fea39a7e19b4a345e781312714eb3d43fdd069ff7ee22a3ca7f6149dfa774554f19ce3ac056 - languageName: node - linkType: hard - -"mdast-util-gfm-table@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-table@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - markdown-table: "npm:^3.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/128af47c503a53bd1c79f20642561e54a510ad5e2db1e418d28fefaf1294ab839e6c838e341aef5d7e404f9170b9ca3d1d89605f234efafde93ee51174a6e31e - languageName: node - linkType: hard - -"mdast-util-gfm-task-list-item@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834 - languageName: node - linkType: hard - -"mdast-util-gfm@npm:^3.0.0": - version: 3.1.0 - resolution: "mdast-util-gfm@npm:3.1.0" - dependencies: - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-gfm-autolink-literal: "npm:^2.0.0" - mdast-util-gfm-footnote: "npm:^2.0.0" - mdast-util-gfm-strikethrough: "npm:^2.0.0" - mdast-util-gfm-table: "npm:^2.0.0" - mdast-util-gfm-task-list-item: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/4bedcfb6a20e39901c8772f0d2bb2d7a64ae87a54c13cbd92eec062cf470fbb68c2ad754e149af5b30794e2de61c978ab1de1ace03c0c40f443ca9b9b8044f81 - languageName: node - linkType: hard - -"mdast-util-mdx-expression@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-mdx-expression@npm:2.0.1" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/9a1e57940f66431f10312fa239096efa7627f375e7933b5d3162c0b5c1712a72ac87447aff2b6838d2bbd5c1311b188718cc90b33b67dc67a88550e0a6ef6183 - languageName: node - linkType: hard - -"mdast-util-mdx-jsx@npm:^3.0.0": - version: 3.2.0 - resolution: "mdast-util-mdx-jsx@npm:3.2.0" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - ccount: "npm:^2.0.0" - devlop: "npm:^1.1.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - parse-entities: "npm:^4.0.0" - stringify-entities: "npm:^4.0.0" - unist-util-stringify-position: "npm:^4.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/3acadaf3b962254f7ad2990fed4729961dc0217ca31fde9917986e880843f3ecf3392b1f22d569235cacd180d50894ad266db7af598aedca69d330d33c7ac613 - languageName: node - linkType: hard - -"mdast-util-mdxjs-esm@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-mdxjs-esm@npm:2.0.1" - dependencies: - "@types/estree-jsx": "npm:^1.0.0" - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10c0/5bda92fc154141705af2b804a534d891f28dac6273186edf1a4c5e3f045d5b01dbcac7400d27aaf91b7e76e8dce007c7b2fdf136c11ea78206ad00bdf9db46bc - languageName: node - linkType: hard - -"mdast-util-phrasing@npm:^4.0.0": - version: 4.1.0 - resolution: "mdast-util-phrasing@npm:4.1.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - unist-util-is: "npm:^6.0.0" - checksum: 10c0/bf6c31d51349aa3d74603d5e5a312f59f3f65662ed16c58017169a5fb0f84ca98578f626c5ee9e4aa3e0a81c996db8717096705521bddb4a0185f98c12c9b42f - languageName: node - linkType: hard - -"mdast-util-to-hast@npm:^13.0.0": - version: 13.2.1 - resolution: "mdast-util-to-hast@npm:13.2.1" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - "@ungap/structured-clone": "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - trim-lines: "npm:^3.0.0" - unist-util-position: "npm:^5.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/3eeaf28a5e84e1e08e6d54a1a8a06c0fca88cb5d36f4cf8086f0177248d1ce6e4e751f4ad0da19a3dea1c6ea61bd80784acc3ae021e44ceeb21aa5413a375e43 - languageName: node - linkType: hard - -"mdast-util-to-markdown@npm:^2.0.0": - version: 2.1.2 - resolution: "mdast-util-to-markdown@npm:2.1.2" - dependencies: - "@types/mdast": "npm:^4.0.0" - "@types/unist": "npm:^3.0.0" - longest-streak: "npm:^3.0.0" - mdast-util-phrasing: "npm:^4.0.0" - mdast-util-to-string: "npm:^4.0.0" - micromark-util-classify-character: "npm:^2.0.0" - micromark-util-decode-string: "npm:^2.0.0" - unist-util-visit: "npm:^5.0.0" - zwitch: "npm:^2.0.0" - checksum: 10c0/4649722a6099f12e797bd8d6469b2b43b44e526b5182862d9c7766a3431caad2c0112929c538a972f214e63c015395e5d3f54bd81d9ac1b16e6d8baaf582f749 - languageName: node - linkType: hard - -"mdast-util-to-string@npm:^4.0.0": - version: 4.0.0 - resolution: "mdast-util-to-string@npm:4.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - checksum: 10c0/2d3c1af29bf3fe9c20f552ee9685af308002488f3b04b12fa66652c9718f66f41a32f8362aa2d770c3ff464c034860b41715902ada2306bb0a055146cef064d7 - languageName: node - linkType: hard - -"mdn-data@npm:2.27.1": - version: 2.27.1 - resolution: "mdn-data@npm:2.27.1" - checksum: 10c0/eb8abf5d22e4d1e090346f5e81b67d23cef14c83940e445da5c44541ad874dc8fb9f6ca236e8258c3a489d9fb5884188a4d7d58773adb9089ac2c0b966796393 - languageName: node - linkType: hard - -"mdurl@npm:^2.0.0": - version: 2.0.0 - resolution: "mdurl@npm:2.0.0" - checksum: 10c0/633db522272f75ce4788440669137c77540d74a83e9015666a9557a152c02e245b192edc20bc90ae953bbab727503994a53b236b4d9c99bdaee594d0e7dd2ce0 - languageName: node - linkType: hard - -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 - languageName: node - linkType: hard - -"media-typer@npm:^1.1.0": - version: 1.1.0 - resolution: "media-typer@npm:1.1.0" - checksum: 10c0/7b4baa40b25964bb90e2121ee489ec38642127e48d0cc2b6baa442688d3fde6262bfdca86d6bbf6ba708784afcac168c06840c71facac70e390f5f759ac121b9 - languageName: node - linkType: hard - -"memorystream@npm:^0.3.1": - version: 0.3.1 - resolution: "memorystream@npm:0.3.1" - checksum: 10c0/4bd164657711d9747ff5edb0508b2944414da3464b7fe21ac5c67cf35bba975c4b446a0124bd0f9a8be54cfc18faf92e92bd77563a20328b1ccf2ff04e9f39b9 - languageName: node - linkType: hard - -"merge-descriptors@npm:1.0.3": - version: 1.0.3 - resolution: "merge-descriptors@npm:1.0.3" - checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 - languageName: node - linkType: hard - -"merge-descriptors@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-descriptors@npm:2.0.0" - checksum: 10c0/95389b7ced3f9b36fbdcf32eb946dc3dd1774c2fdf164609e55b18d03aa499b12bd3aae3a76c1c7185b96279e9803525550d3eb292b5224866060a288f335cb3 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb - languageName: node - linkType: hard - -"meriyah@npm:^6.1.4": - version: 6.1.4 - resolution: "meriyah@npm:6.1.4" - checksum: 10c0/d792a12df453b9e86c2bb70e73adf41b2d0fa88125381143e4d339d309ddcbb7aeb108e286411dcb19be82539d29b881279c613ae03ce514b7c296c72e9a8d00 - languageName: node - linkType: hard - -"mermaid@npm:^11.16.0": - version: 11.16.1 - resolution: "mermaid@npm:11.16.1" - dependencies: - "@braintree/sanitize-url": "npm:^7.1.2" - "@iconify/utils": "npm:^3.0.2" - "@mermaid-js/parser": "npm:^1.2.0" - "@types/d3": "npm:^7.4.3" - "@upsetjs/venn.js": "npm:^2.0.0" - cytoscape: "npm:^3.33.3" - cytoscape-cose-bilkent: "npm:^4.1.0" - cytoscape-fcose: "npm:^2.2.0" - d3: "npm:^7.9.0" - d3-sankey: "npm:^0.12.3" - dagre-d3-es: "npm:7.0.14" - dayjs: "npm:^1.11.20" - dompurify: "npm:^3.3.3" - es-toolkit: "npm:^1.45.1" - katex: "npm:^0.16.45" - khroma: "npm:^2.1.0" - marked: "npm:^16.3.0" - roughjs: "npm:^4.6.6" - stylis: "npm:^4.3.6" - ts-dedent: "npm:^2.2.0" - uuid: "npm:^11.1.0 || ^12 || ^13 || ^14.0.0" - checksum: 10c0/a905627d5ad372914bf7c67cb9e491d50f248d3a8458e4ec920033f5ce7387bf419423909ed71d88f54a035ec42987746d64a46055bd2b2a4dc1bc4ceed38c44 - languageName: node - linkType: hard - -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 - languageName: node - linkType: hard - -"micromark-core-commonmark@npm:^2.0.0": - version: 2.0.3 - resolution: "micromark-core-commonmark@npm:2.0.3" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-factory-destination: "npm:^2.0.0" - micromark-factory-label: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-factory-title: "npm:^2.0.0" - micromark-factory-whitespace: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-classify-character: "npm:^2.0.0" - micromark-util-html-tag-name: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-subtokenize: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/bd4a794fdc9e88dbdf59eaf1c507ddf26e5f7ddf4e52566c72239c0f1b66adbcd219ba2cd42350debbe24471434d5f5e50099d2b3f4e5762ca222ba8e5b549ee - languageName: node - linkType: hard - -"micromark-extension-gfm-autolink-literal@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/84e6fbb84ea7c161dfa179665dc90d51116de4c28f3e958260c0423e5a745372b7dcbc87d3cde98213b532e6812f847eef5ae561c9397d7f7da1e59872ef3efe - languageName: node - linkType: hard - -"micromark-extension-gfm-footnote@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-footnote@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/d172e4218968b7371b9321af5cde8c77423f73b233b2b0fcf3ff6fd6f61d2e0d52c49123a9b7910612478bf1f0d5e88c75a3990dd68f70f3933fe812b9f77edc - languageName: node - linkType: hard - -"micromark-extension-gfm-strikethrough@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-classify-character: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/ef4f248b865bdda71303b494671b7487808a340b25552b11ca6814dff3fcfaab9be8d294643060bbdb50f79313e4a686ab18b99cbe4d3ee8a4170fcd134234fb - languageName: node - linkType: hard - -"micromark-extension-gfm-table@npm:^2.0.0": - version: 2.1.1 - resolution: "micromark-extension-gfm-table@npm:2.1.1" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/04bc00e19b435fa0add62cd029d8b7eb6137522f77832186b1d5ef34544a9bd030c9cf85e92ddfcc5c31f6f0a58a43d4b96dba4fc21316037c734630ee12c912 - languageName: node - linkType: hard - -"micromark-extension-gfm-tagfilter@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d - languageName: node - linkType: hard - -"micromark-extension-gfm-task-list-item@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/78aa537d929e9309f076ba41e5edc99f78d6decd754b6734519ccbbfca8abd52e1c62df68d41a6ae64d2a3fc1646cea955893c79680b0b4385ced4c52296181f - languageName: node - linkType: hard - -"micromark-extension-gfm@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-gfm@npm:3.0.0" - dependencies: - micromark-extension-gfm-autolink-literal: "npm:^2.0.0" - micromark-extension-gfm-footnote: "npm:^2.0.0" - micromark-extension-gfm-strikethrough: "npm:^2.0.0" - micromark-extension-gfm-table: "npm:^2.0.0" - micromark-extension-gfm-tagfilter: "npm:^2.0.0" - micromark-extension-gfm-task-list-item: "npm:^2.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9 - languageName: node - linkType: hard - -"micromark-factory-destination@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-destination@npm:2.0.1" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/bbafcf869cee5bf511161354cb87d61c142592fbecea051000ff116068dc85216e6d48519d147890b9ea5d7e2864a6341c0c09d9948c203bff624a80a476023c - languageName: node - linkType: hard - -"micromark-factory-label@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-label@npm:2.0.1" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/0137716b4ecb428114165505e94a2f18855c8bbea21b07a8b5ce514b32a595ed789d2b967125718fc44c4197ceaa48f6609d58807a68e778138d2e6b91b824e8 - languageName: node - linkType: hard - -"micromark-factory-space@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-space@npm:2.0.1" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/f9ed43f1c0652d8d898de0ac2be3f77f776fffe7dd96bdbba1e02d7ce33d3853c6ff5daa52568fc4fa32cdf3a62d86b85ead9b9189f7211e1d69ff2163c450fb - languageName: node - linkType: hard - -"micromark-factory-title@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-title@npm:2.0.1" - dependencies: - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/e72fad8d6e88823514916890099a5af20b6a9178ccf78e7e5e05f4de99bb8797acb756257d7a3a57a53854cb0086bf8aab15b1a9e9db8982500dd2c9ff5948b6 - languageName: node - linkType: hard - -"micromark-factory-whitespace@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-whitespace@npm:2.0.1" - dependencies: - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/20a1ec58698f24b766510a309b23a10175034fcf1551eaa9da3adcbed3e00cd53d1ebe5f030cf873f76a1cec3c34eb8c50cc227be3344caa9ed25d56cf611224 - languageName: node - linkType: hard - -"micromark-util-character@npm:^2.0.0": - version: 2.1.1 - resolution: "micromark-util-character@npm:2.1.1" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/d3fe7a5e2c4060fc2a076f9ce699c82a2e87190a3946e1e5eea77f563869b504961f5668d9c9c014724db28ac32fa909070ea8b30c3a39bd0483cc6c04cc76a1 - languageName: node - linkType: hard - -"micromark-util-chunked@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-chunked@npm:2.0.1" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/b68c0c16fe8106949537bdcfe1be9cf36c0ccd3bc54c4007003cb0984c3750b6cdd0fd77d03f269a3382b85b0de58bde4f6eedbe7ecdf7244759112289b1ab56 - languageName: node - linkType: hard - -"micromark-util-classify-character@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-classify-character@npm:2.0.1" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/8a02e59304005c475c332f581697e92e8c585bcd45d5d225a66c1c1b14ab5a8062705188c2ccec33cc998d33502514121478b2091feddbc751887fc9c290ed08 - languageName: node - linkType: hard - -"micromark-util-combine-extensions@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-combine-extensions@npm:2.0.1" - dependencies: - micromark-util-chunked: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/f15e282af24c8372cbb10b9b0b3e2c0aa681fea0ca323a44d6bc537dc1d9382c819c3689f14eaa000118f5a163245358ce6276b2cda9a84439cdb221f5d86ae7 - languageName: node - linkType: hard - -"micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.2 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/9c8a9f2c790e5593ffe513901c3a110e9ec8882a08f466da014112a25e5059b51551ca0aeb7ff494657d86eceb2f02ee556c6558b8d66aadc61eae4a240da0df - languageName: node - linkType: hard - -"micromark-util-decode-string@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-decode-string@npm:2.0.1" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/f24d75b2e5310be6e7b6dee532e0d17d3bf46996841d6295f2a9c87a2046fff4ab603c52ab9d7a7a6430a8b787b1574ae895849c603d262d1b22eef71736b5cb - languageName: node - linkType: hard - -"micromark-util-encode@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-encode@npm:2.0.1" - checksum: 10c0/b2b29f901093845da8a1bf997ea8b7f5e061ffdba85070dfe14b0197c48fda64ffcf82bfe53c90cf9dc185e69eef8c5d41cae3ba918b96bc279326921b59008a - languageName: node - linkType: hard - -"micromark-util-html-tag-name@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-html-tag-name@npm:2.0.1" - checksum: 10c0/ae80444db786fde908e9295f19a27a4aa304171852c77414516418650097b8afb401961c9edb09d677b06e97e8370cfa65638dde8438ebd41d60c0a8678b85b9 - languageName: node - linkType: hard - -"micromark-util-normalize-identifier@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-normalize-identifier@npm:2.0.1" - dependencies: - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/5299265fa360769fc499a89f40142f10a9d4a5c3dd8e6eac8a8ef3c2e4a6570e4c009cf75ea46dce5ee31c01f25587bde2f4a5cc0a935584ae86dd857f2babbd - languageName: node - linkType: hard - -"micromark-util-resolve-all@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-resolve-all@npm:2.0.1" - dependencies: - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/bb6ca28764696bb479dc44a2d5b5fe003e7177aeae1d6b0d43f24cc223bab90234092d9c3ce4a4d2b8df095ccfd820537b10eb96bb7044d635f385d65a4c984a - languageName: node - linkType: hard - -"micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-sanitize-uri@npm:2.0.1" - dependencies: - micromark-util-character: "npm:^2.0.0" - micromark-util-encode: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - checksum: 10c0/60e92166e1870fd4f1961468c2651013ff760617342918e0e0c3c4e872433aa2e60c1e5a672bfe5d89dc98f742d6b33897585cf86ae002cda23e905a3c02527c - languageName: node - linkType: hard - -"micromark-util-subtokenize@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-util-subtokenize@npm:2.1.0" - dependencies: - devlop: "npm:^1.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/bee69eece4393308e657c293ba80d92ebcb637e5f55e21dcf9c3fa732b91a8eda8ac248d76ff375e675175bfadeae4712e5158ef97eef1111789da1ce7ab5067 - languageName: node - linkType: hard - -"micromark-util-symbol@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-symbol@npm:2.0.1" - checksum: 10c0/f2d1b207771e573232436618e78c5e46cd4b5c560dd4a6d63863d58018abbf49cb96ec69f7007471e51434c60de3c9268ef2bf46852f26ff4aacd10f9da16fe9 - languageName: node - linkType: hard - -"micromark-util-types@npm:^2.0.0": - version: 2.0.2 - resolution: "micromark-util-types@npm:2.0.2" - checksum: 10c0/c8c15b96c858db781c4393f55feec10004bf7df95487636c9a9f7209e51002a5cca6a047c5d2a5dc669ff92da20e57aaa881e81a268d9ccadb647f9dce305298 - languageName: node - linkType: hard - -"micromark@npm:^4.0.0": - version: 4.0.2 - resolution: "micromark@npm:4.0.2" - dependencies: - "@types/debug": "npm:^4.0.0" - debug: "npm:^4.0.0" - decode-named-character-reference: "npm:^1.0.0" - devlop: "npm:^1.0.0" - micromark-core-commonmark: "npm:^2.0.0" - micromark-factory-space: "npm:^2.0.0" - micromark-util-character: "npm:^2.0.0" - micromark-util-chunked: "npm:^2.0.0" - micromark-util-combine-extensions: "npm:^2.0.0" - micromark-util-decode-numeric-character-reference: "npm:^2.0.0" - micromark-util-encode: "npm:^2.0.0" - micromark-util-normalize-identifier: "npm:^2.0.0" - micromark-util-resolve-all: "npm:^2.0.0" - micromark-util-sanitize-uri: "npm:^2.0.0" - micromark-util-subtokenize: "npm:^2.0.0" - micromark-util-symbol: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - checksum: 10c0/07462287254219d6eda6eac8a3cebaff2994e0575499e7088027b825105e096e4f51e466b14b2a81b71933a3b6c48ee069049d87bc2c2127eee50d9cc69e8af6 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" - dependencies: - braces: "npm:^3.0.3" - picomatch: "npm:^2.3.1" - checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-db@npm:^1.54.0": - version: 1.54.0 - resolution: "mime-db@npm:1.54.0" - checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 - languageName: node - linkType: hard - -"mime-types@npm:^2.1.35, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - -"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1": - version: 3.0.1 - resolution: "mime-types@npm:3.0.1" - dependencies: - mime-db: "npm:^1.54.0" - checksum: 10c0/bd8c20d3694548089cf229016124f8f40e6a60bbb600161ae13e45f793a2d5bb40f96bbc61f275836696179c77c1d6bf4967b2a75e0a8ad40fe31f4ed5be4da5 - languageName: node - linkType: hard - -"mime@npm:1.6.0": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 - languageName: node - linkType: hard - -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 10c0/de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf - languageName: node - linkType: hard - -"mimic-function@npm:^5.0.0": - version: 5.0.1 - resolution: "mimic-function@npm:5.0.1" - checksum: 10c0/f3d9464dd1816ecf6bdf2aec6ba32c0728022039d992f178237d8e289b48764fee4131319e72eedd4f7f094e22ded0af836c3187a7edc4595d28dd74368fd81d - languageName: node - linkType: hard - -"minidenticons@npm:^4.2.1": - version: 4.2.1 - resolution: "minidenticons@npm:4.2.1" - checksum: 10c0/086f78ce0fa36030275a206c66e8c228dc5c035b4909ea42e298c0595b305f178733230d9d11d9ff8411d6d4a1a390f07fe75871bfb82c1afdaeca4ae253bf1a - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd - languageName: node - linkType: hard - -"minimatch@npm:^10.1.1, minimatch@npm:^10.2.2": - version: 10.2.4 - resolution: "minimatch@npm:10.2.4" - dependencies: - brace-expansion: "npm:^5.0.2" - checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2, minimatch@npm:^3.1.3": - version: 3.1.5 - resolution: "minimatch@npm:3.1.5" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/2ecbdc0d33f07bddb0315a8b5afbcb761307a8778b48f0b312418ccbced99f104a2d17d8aca7573433c70e8ccd1c56823a441897a45e384ea76ef401a26ace70 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": - version: 9.0.9 - resolution: "minimatch@npm:9.0.9" - dependencies: - brace-expansion: "npm:^2.0.2" - checksum: 10c0/0b6a58530dbb00361745aa6c8cffaba4c90f551afe7c734830bd95fd88ebf469dd7355a027824ea1d09e37181cfeb0a797fb17df60c15ac174303ac110eb7e86 - languageName: node - linkType: hard - -"minimist@npm:^1.2.0, minimist@npm:^1.2.6, minimist@npm:^1.2.8": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^4.0.0": - version: 4.0.1 - resolution: "minipass-fetch@npm:4.0.1" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^3.0.1" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 - languageName: node - linkType: hard - -"minipass@npm:^7.1.3": - version: 7.1.3 - resolution: "minipass@npm:7.1.3" - checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb - languageName: node - linkType: hard - -"minizlib@npm:^3.0.1": - version: 3.0.1 - resolution: "minizlib@npm:3.0.1" - dependencies: - minipass: "npm:^7.0.4" - rimraf: "npm:^5.0.5" - checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 - languageName: node - linkType: hard - -"minizlib@npm:^3.1.0": - version: 3.1.0 - resolution: "minizlib@npm:3.1.0" - dependencies: - minipass: "npm:^7.1.2" - checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec - languageName: node - linkType: hard - -"module-details-from-path@npm:^1.0.3": - version: 1.0.3 - resolution: "module-details-from-path@npm:1.0.3" - checksum: 10c0/3d881f3410c142e4c2b1307835a2862ba04e5b3ec6e90655614a0ee2c4b299b4c1d117fb525d2435bf436990026f18d338a197b54ad6bd36252f465c336ff423 - languageName: node - linkType: hard - -"module-details-from-path@npm:^1.0.4": - version: 1.0.4 - resolution: "module-details-from-path@npm:1.0.4" - checksum: 10c0/10863413e96dab07dee917eae07afe46f7bf853065cc75a7d2a718adf67574857fb64f8a2c0c9af12ac733a9a8cf652db7ed39b95f7a355d08106cb9cc50c83b - languageName: node - linkType: hard - -"moo@npm:^0.5.0": - version: 0.5.2 - resolution: "moo@npm:0.5.2" - checksum: 10c0/a9d9ad8198a51fe35d297f6e9fdd718298ca0b39a412e868a0ebd92286379ab4533cfc1f1f34516177f5129988ab25fe598f78e77c84e3bfe0d4a877b56525a8 - languageName: node - linkType: hard - -"motion-dom@npm:^12.42.0": - version: 12.42.0 - resolution: "motion-dom@npm:12.42.0" - dependencies: - motion-utils: "npm:^12.39.0" - checksum: 10c0/c6cfe46ecce0bf2ffb4dcbc5d8b92777f0507b273bddc0a7da8cf2e043ee3db3082034138d801bbd581d1111a8d12465df9d7bb21ab0ea3e35cb2aac43e08d4e - languageName: node - linkType: hard - -"motion-utils@npm:^12.39.0": - version: 12.39.0 - resolution: "motion-utils@npm:12.39.0" - checksum: 10c0/6d7a2a2cc0797b72410a666a9cc1c201c8e39bf9669670464e433fe1e72af5f0217154c869867b34fbadf3664cf222c0d022bbc4eed7927f201ae971918e7440 - languageName: node - linkType: hard - -"motion@npm:^12.42.0": - version: 12.42.0 - resolution: "motion@npm:12.42.0" - dependencies: - framer-motion: "npm:^12.42.0" - tslib: "npm:^2.4.0" - peerDependencies: - "@emotion/is-prop-valid": "*" - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@emotion/is-prop-valid": - optional: true - react: - optional: true - react-dom: - optional: true - checksum: 10c0/5589172986a3a0bd3c11295d29190a01ef82a3a8b995b3db5cfe10a95f83a57ca72d5180034082c7ffee6c1389514342c330b147369ef6570b71d02cb482825c - languageName: node - linkType: hard - -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"msgpackr-extract@npm:^3.0.4": - version: 3.0.4 - resolution: "msgpackr-extract@npm:3.0.4" - dependencies: - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "npm:3.0.4" - "@msgpackr-extract/msgpackr-extract-darwin-x64": "npm:3.0.4" - "@msgpackr-extract/msgpackr-extract-linux-arm": "npm:3.0.4" - "@msgpackr-extract/msgpackr-extract-linux-arm64": "npm:3.0.4" - "@msgpackr-extract/msgpackr-extract-linux-x64": "npm:3.0.4" - "@msgpackr-extract/msgpackr-extract-win32-x64": "npm:3.0.4" - node-gyp: "npm:latest" - node-gyp-build-optional-packages: "npm:5.2.2" - dependenciesMeta: - "@msgpackr-extract/msgpackr-extract-darwin-arm64": - optional: true - "@msgpackr-extract/msgpackr-extract-darwin-x64": - optional: true - "@msgpackr-extract/msgpackr-extract-linux-arm": - optional: true - "@msgpackr-extract/msgpackr-extract-linux-arm64": - optional: true - "@msgpackr-extract/msgpackr-extract-linux-x64": - optional: true - "@msgpackr-extract/msgpackr-extract-win32-x64": - optional: true - bin: - download-msgpackr-prebuilds: bin/download-prebuilds.js - checksum: 10c0/582a9d17abbf3019e600e948736695056280ce401fd0235ee2474e95f9952208b9f6cce4d0e355b03b7d3c5630e6c3d11fe5fc27fdedb2311cce48de464338d8 - languageName: node - linkType: hard - -"msgpackr@npm:2.0.5": - version: 2.0.5 - resolution: "msgpackr@npm:2.0.5" - dependencies: - msgpackr-extract: "npm:^3.0.4" - dependenciesMeta: - msgpackr-extract: - optional: true - checksum: 10c0/7ac9820cecd44d24d2ef07994405a277509f004d4fb0a77d04e10e9071d0599e86ad53a9daf673e801518230774bdaca72b1fdcff2b516584ab58bd19362e6ad - languageName: node - linkType: hard - -"mustache@npm:^4.2.0": - version: 4.2.0 - resolution: "mustache@npm:4.2.0" - bin: - mustache: bin/mustache - checksum: 10c0/1f8197e8a19e63645a786581d58c41df7853da26702dbc005193e2437c98ca49b255345c173d50c08fe4b4dbb363e53cb655ecc570791f8deb09887248dd34a2 - languageName: node - linkType: hard - -"mute-stream@npm:^1.0.0": - version: 1.0.0 - resolution: "mute-stream@npm:1.0.0" - checksum: 10c0/dce2a9ccda171ec979a3b4f869a102b1343dee35e920146776780de182f16eae459644d187e38d59a3d37adf85685e1c17c38cf7bfda7e39a9880f7a1d10a74c - languageName: node - linkType: hard - -"mute-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "mute-stream@npm:3.0.0" - checksum: 10c0/12cdb36a101694c7a6b296632e6d93a30b74401873cf7507c88861441a090c71c77a58f213acadad03bc0c8fa186639dec99d68a14497773a8744320c136e701 - languageName: node - linkType: hard - -"mz@npm:^2.7.0": - version: 2.7.0 - resolution: "mz@npm:2.7.0" - dependencies: - any-promise: "npm:^1.0.0" - object-assign: "npm:^4.0.1" - thenify-all: "npm:^1.0.0" - checksum: 10c0/103114e93f87362f0b56ab5b2e7245051ad0276b646e3902c98397d18bb8f4a77f2ea4a2c9d3ad516034ea3a56553b60d3f5f78220001ca4c404bd711bd0af39 - languageName: node - linkType: hard - -"nanoid@npm:^3.3.16": - version: 3.3.18 - resolution: "nanoid@npm:3.3.18" - bin: - nanoid: bin/nanoid.cjs - checksum: 10c0/b994b4e396730f8be2520923284e2040d61eaee55cc6d4935ef6d38d34bafdc46133eda4d3faea5073bda545aa6079d82b886caeac5c731cf9ac18bcc1301425 - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 - languageName: node - linkType: hard - -"nearley@npm:^2.20.1": - version: 2.20.1 - resolution: "nearley@npm:2.20.1" - dependencies: - commander: "npm:^2.19.0" - moo: "npm:^0.5.0" - railroad-diagrams: "npm:^1.0.0" - randexp: "npm:0.4.6" - bin: - nearley-railroad: bin/nearley-railroad.js - nearley-test: bin/nearley-test.js - nearley-unparse: bin/nearley-unparse.js - nearleyc: bin/nearleyc.js - checksum: 10c0/d25e1fd40b19c53a0ada6a688670f4a39063fd9553ab62885e81a82927d51572ce47193b946afa3d85efa608ba2c68f433c421f69b854bfb7f599eacb5fae37e - languageName: node - linkType: hard - -"negotiator@npm:0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 - languageName: node - linkType: hard - -"negotiator@npm:^1.0.0": - version: 1.0.0 - resolution: "negotiator@npm:1.0.0" - checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b - languageName: node - linkType: hard - -"next-auth@npm:^5.0.0-beta.32": - version: 5.0.0-beta.32 - resolution: "next-auth@npm:5.0.0-beta.32" - dependencies: - "@auth/core": "npm:0.41.3" - peerDependencies: - "@simplewebauthn/browser": ^9.0.1 - "@simplewebauthn/server": ^9.0.2 - next: ^14.0.0-0 || ^15.0.0 || ^16.0.0 - nodemailer: ^7.0.7 || ^8.0.5 - react: ^18.2.0 || ^19.0.0 - peerDependenciesMeta: - "@simplewebauthn/browser": - optional: true - "@simplewebauthn/server": - optional: true - nodemailer: - optional: true - checksum: 10c0/f3000d6a412eab0e8cfb992eeed88882f15a2672cda3ffeda235f335a1f0809f385bf0d6f2fc58b4cb16e3d5e270124d40a9a952a3f5eca6e111bb7a7e1d2215 - languageName: node - linkType: hard - -"next-navigation-guard@npm:^0.2.0": - version: 0.2.0 - resolution: "next-navigation-guard@npm:0.2.0" - peerDependencies: - next: ^14 || ^15 - react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc - checksum: 10c0/b53ab6d7efc550076f931f8731648ccb5a771133b59a10b0163a2162f7fceb9e8f7b95b0e4698ae419870bc1c2bbb9dc7b96f81df92fcddf60d58612c247bd7d - languageName: node - linkType: hard - -"next-themes@npm:^0.3.0": - version: 0.3.0 - resolution: "next-themes@npm:0.3.0" - peerDependencies: - react: ^16.8 || ^17 || ^18 - react-dom: ^16.8 || ^17 || ^18 - checksum: 10c0/72bd670ad6b9f547dc18cece340dfd1ac41e3e7b37eb321d4767db90bfa2c239f937011cd0efe35ca0081f1ea260051bc0868808ef39b0fbff2ddefd7146cec6 - languageName: node - linkType: hard - -"next@npm:^16.2.11, next@npm:^16.3.3": - version: 16.3.8 - resolution: "next@npm:16.3.8" - dependencies: - "@next/env": "npm:16.3.8" - "@next/swc-darwin-arm64": "npm:16.3.8" - "@next/swc-darwin-x64": "npm:16.3.8" - "@next/swc-linux-arm64-gnu": "npm:16.3.8" - "@next/swc-linux-arm64-musl": "npm:16.3.8" - "@next/swc-linux-x64-gnu": "npm:16.3.8" - "@next/swc-linux-x64-musl": "npm:16.3.8" - "@next/swc-win32-arm64-msvc": "npm:16.3.8" - "@next/swc-win32-x64-msvc": "npm:16.3.8" - "@swc/helpers": "npm:0.5.23" - baseline-browser-mapping: "npm:^2.9.19" - caniuse-lite: "npm:^1.0.30001579" - postcss: "npm:8.5.23" - sharp: "npm:^0.35.4" - styled-jsx: "npm:5.1.6" - peerDependencies: - "@opentelemetry/api": ^1.1.0 - "@playwright/test": ^1.51.1 - babel-plugin-react-compiler: "*" - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - dependenciesMeta: - "@next/swc-darwin-arm64": - optional: true - "@next/swc-darwin-x64": - optional: true - "@next/swc-linux-arm64-gnu": - optional: true - "@next/swc-linux-arm64-musl": - optional: true - "@next/swc-linux-x64-gnu": - optional: true - "@next/swc-linux-x64-musl": - optional: true - "@next/swc-win32-arm64-msvc": - optional: true - "@next/swc-win32-x64-msvc": - optional: true - sharp: - optional: true - peerDependenciesMeta: - "@opentelemetry/api": - optional: true - "@playwright/test": - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - bin: - next: dist/bin/next - checksum: 10c0/6ad814a9351a990fd566225101c21a3e3a6d0d2098e3f04f5535d1bc004deb8b0107c0f5915b67c50301b2c5a1c041ba12fbeb8963e79cd2d87218f2c8368a9b - languageName: node - linkType: hard - -"nice-try@npm:^1.0.4": - version: 1.0.5 - resolution: "nice-try@npm:1.0.5" - checksum: 10c0/95568c1b73e1d0d4069a3e3061a2102d854513d37bcfda73300015b7ba4868d3b27c198d1dbbd8ebdef4112fc2ed9e895d4a0f2e1cce0bd334f2a1346dc9205f - languageName: node - linkType: hard - -"node-abi@npm:^3.73.0": - version: 3.74.0 - resolution: "node-abi@npm:3.74.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/a6c83c448d5e8b591f749a0157c9ec02f653021cdf3415c1a44fcb5fc8afc124acad186bc1ec76cb4db2485cc2dcdda187aacd382c54b6e3093ffc0389603643 - languageName: node - linkType: hard - -"node-abort-controller@npm:3.1.1, node-abort-controller@npm:^3.0.1": - version: 3.1.1 - resolution: "node-abort-controller@npm:3.1.1" - checksum: 10c0/f7ad0e7a8e33809d4f3a0d1d65036a711c39e9d23e0319d80ebe076b9a3b4432b4d6b86a7fab65521de3f6872ffed36fc35d1327487c48eb88c517803403eda3 - languageName: node - linkType: hard - -"node-addon-api@npm:^7.1.0": - version: 7.1.1 - resolution: "node-addon-api@npm:7.1.1" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 - languageName: node - linkType: hard - -"node-cleanup@npm:^2.1.2": - version: 2.1.2 - resolution: "node-cleanup@npm:2.1.2" - checksum: 10c0/c59077d7cac01f6315e4417e5d13523e43aa19965b14768581dbd06b37419323abe5f7171afe6aa52b7a483bdd0027e5a5f62a532a2ebec2a8c4cdf163736c92 - languageName: node - linkType: hard - -"node-domexception@npm:1.0.0, node-domexception@npm:^1.0.0": - version: 1.0.0 - resolution: "node-domexception@npm:1.0.0" - checksum: 10c0/5e5d63cda29856402df9472335af4bb13875e1927ad3be861dc5ebde38917aecbf9ae337923777af52a48c426b70148815e890a5d72760f1b4d758cc671b1a2b - languageName: node - linkType: hard - -"node-fetch@npm:^2.6.7, node-fetch@npm:^2.7.0": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: "npm:^5.0.0" - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 - languageName: node - linkType: hard - -"node-fetch@npm:^3.3.2": - version: 3.3.2 - resolution: "node-fetch@npm:3.3.2" - dependencies: - data-uri-to-buffer: "npm:^4.0.0" - fetch-blob: "npm:^3.1.4" - formdata-polyfill: "npm:^4.0.10" - checksum: 10c0/f3d5e56190562221398c9f5750198b34cf6113aa304e34ee97c94fd300ec578b25b2c2906edba922050fce983338fde0d5d34fcb0fc3336ade5bd0e429ad7538 - languageName: node - linkType: hard - -"node-gyp-build-optional-packages@npm:5.2.2": - version: 5.2.2 - resolution: "node-gyp-build-optional-packages@npm:5.2.2" - dependencies: - detect-libc: "npm:^2.0.1" - bin: - node-gyp-build-optional-packages: bin.js - node-gyp-build-optional-packages-optional: optional.js - node-gyp-build-optional-packages-test: build-test.js - checksum: 10c0/c81128c6f91873381be178c5eddcbdf66a148a6a89a427ce2bcd457593ce69baf2a8662b6d22cac092d24aa9c43c230dec4e69b3a0da604503f4777cd77e282b - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 11.1.0 - resolution: "node-gyp@npm:11.1.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^14.0.3" - nopt: "npm:^8.0.0" - proc-log: "npm:^5.0.0" - semver: "npm:^7.3.5" - tar: "npm:^7.4.3" - which: "npm:^5.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/c38977ce502f1ea41ba2b8721bd5b49bc3d5b3f813eabfac8414082faf0620ccb5211e15c4daecc23ed9f5e3e9cc4da00e575a0bcfc2a95a069294f2afa1e0cd - languageName: node - linkType: hard - -"node-pty@npm:^1.1.0": - version: 1.1.0 - resolution: "node-pty@npm:1.1.0" - dependencies: - node-addon-api: "npm:^7.1.0" - node-gyp: "npm:latest" - checksum: 10c0/e527305263da36d554b7d2116aee6430b898675fc50e7bd82fbd762f14cb6b948fb8d997736af1f70d76bf9ffd4f5179bc1ed1d8002567dfcf3b29f039291798 - languageName: node - linkType: hard - -"node-releases@npm:^2.0.53": - version: 2.0.54 - resolution: "node-releases@npm:2.0.54" - checksum: 10c0/196b54ab06fd03b742816b6ca8185c69af42735b283083036e2579682c430b8f9ff89046891fe8c625557e5885793a2032d28070100bb2e57e6d6586b2f483c1 - languageName: node - linkType: hard - -"nodemailer@npm:^10.0.2": - version: 10.0.13 - resolution: "nodemailer@npm:10.0.13" - checksum: 10c0/3004362415e977a3fdf2a0c0ec0ad9fd3724d5ccba3951763bd28fa13a6b87cab13e790c934ccb66b6657ca8149a7efc4cc973867760588169efd8ec3fb99908 - languageName: node - linkType: hard - -"nodemon@npm:^3.1.10": - version: 3.1.10 - resolution: "nodemon@npm:3.1.10" - dependencies: - chokidar: "npm:^3.5.2" - debug: "npm:^4" - ignore-by-default: "npm:^1.0.1" - minimatch: "npm:^3.1.2" - pstree.remy: "npm:^1.1.8" - semver: "npm:^7.5.3" - simple-update-notifier: "npm:^2.0.0" - supports-color: "npm:^5.5.0" - touch: "npm:^3.1.0" - undefsafe: "npm:^2.0.5" - bin: - nodemon: bin/nodemon.js - checksum: 10c0/95b64d647f2c22e85e375b250517b0a4b32c2d2392ad898444e331f70d6b1ab43b17f53a8a1d68d5879ab8401fc6cd6e26f0d2a8736240984f6b5a8435b407c0 - languageName: node - linkType: hard - -"nopt@npm:^8.0.0": - version: 8.1.0 - resolution: "nopt@npm:8.1.0" - dependencies: - abbrev: "npm:^3.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef - languageName: node - linkType: hard - -"normalize-package-data@npm:^2.3.2": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: "npm:^2.1.4" - resolve: "npm:^1.10.0" - semver: "npm:2 || 3 || 4 || 5" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 - languageName: node - linkType: hard - -"npm-run-all@npm:^4.1.5": - version: 4.1.5 - resolution: "npm-run-all@npm:4.1.5" - dependencies: - ansi-styles: "npm:^3.2.1" - chalk: "npm:^2.4.1" - cross-spawn: "npm:^6.0.5" - memorystream: "npm:^0.3.1" - minimatch: "npm:^3.0.4" - pidtree: "npm:^0.3.0" - read-pkg: "npm:^3.0.0" - shell-quote: "npm:^1.6.1" - string.prototype.padend: "npm:^3.0.0" - bin: - npm-run-all: bin/npm-run-all/index.js - run-p: bin/run-p/index.js - run-s: bin/run-s/index.js - checksum: 10c0/736ee39bd35454d3efaa4a2e53eba6c523e2e17fba21a18edcce6b221f5cab62000bef16bb6ae8aff9e615831e6b0eb25ab51d52d60e6fa6f4ea880e4c6d31f4 - languageName: node - linkType: hard - -"npm-run-path@npm:^5.1.0": - version: 5.3.0 - resolution: "npm-run-path@npm:5.3.0" - dependencies: - path-key: "npm:^4.0.0" - checksum: 10c0/124df74820c40c2eb9a8612a254ea1d557ddfab1581c3e751f825e3e366d9f00b0d76a3c94ecd8398e7f3eee193018622677e95816e8491f0797b21e30b2deba - languageName: node - linkType: hard - -"nullthrows@npm:^1.0.0": - version: 1.1.1 - resolution: "nullthrows@npm:1.1.1" - checksum: 10c0/56f34bd7c3dcb3bd23481a277fa22918120459d3e9d95ca72976c72e9cac33a97483f0b95fc420e2eb546b9fe6db398273aba9a938650cdb8c98ee8f159dcb30 - languageName: node - linkType: hard - -"nwsapi@npm:^2.2.12": - version: 2.2.19 - resolution: "nwsapi@npm:2.2.19" - checksum: 10c0/5bd9da260b2b24a775103c835a93c79584a870307eb59270b43c6970b7ae9c0af3cfffd9df5292c24d2ca2c67f49672b4c9be9824c347d6083b90e002a12779a - languageName: node - linkType: hard - -"nypm@npm:0.6.6": - version: 0.6.6 - resolution: "nypm@npm:0.6.6" - dependencies: - citty: "npm:^0.2.2" - pathe: "npm:^2.0.3" - tinyexec: "npm:^1.1.1" - bin: - nypm: dist/cli.mjs - checksum: 10c0/74918579bef694a9ae1cadbace9e316e323e4ec753c8ef03f47600ad08247a8744472c8ed86e4f5667cb5a1e4e5f871f225f27a5d2ceee619ef50c4deab818d7 - languageName: node - linkType: hard - -"oauth4webapi@npm:^3.3.0": - version: 3.3.1 - resolution: "oauth4webapi@npm:3.3.1" - checksum: 10c0/e3c990dddceff5392deac5401fbbd417f7ae0aeb192ac4531884e7b2d6356185fc9aad3dd62329b9c754f6a07c70de7c7e771a57c6f540cc2aa3a4e8924081b5 - languageName: node - linkType: hard - -"object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 - languageName: node - linkType: hard - -"object-hash@npm:^3.0.0": - version: 3.0.0 - resolution: "object-hash@npm:3.0.0" - checksum: 10c0/a06844537107b960c1c8b96cd2ac8592a265186bfa0f6ccafe0d34eabdb526f6fa81da1f37c43df7ed13b12a4ae3457a16071603bcd39d8beddb5f08c37b0f47 - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": - version: 1.13.4 - resolution: "object-inspect@npm:1.13.4" - checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d - languageName: node - linkType: hard - -"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": - version: 4.1.7 - resolution: "object.assign@npm:4.1.7" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - has-symbols: "npm:^1.1.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc - languageName: node - linkType: hard - -"object.entries@npm:^1.1.9": - version: 1.1.9 - resolution: "object.entries@npm:1.1.9" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.4" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.1.1" - checksum: 10c0/d4b8c1e586650407da03370845f029aa14076caca4e4d4afadbc69cfb5b78035fd3ee7be417141abdb0258fa142e59b11923b4c44d8b1255b28f5ffcc50da7db - languageName: node - linkType: hard - -"object.fromentries@npm:^2.0.8": - version: 2.0.8 - resolution: "object.fromentries@npm:2.0.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/cd4327e6c3369cfa805deb4cbbe919bfb7d3aeebf0bcaba291bb568ea7169f8f8cdbcabe2f00b40db0c20cd20f08e11b5f3a5a36fb7dd3fe04850c50db3bf83b - languageName: node - linkType: hard - -"object.groupby@npm:^1.0.3": - version: 1.0.3 - resolution: "object.groupby@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - checksum: 10c0/60d0455c85c736fbfeda0217d1a77525956f76f7b2495edeca9e9bbf8168a45783199e77b894d30638837c654d0cc410e0e02cbfcf445bc8de71c3da1ede6a9c - languageName: node - linkType: hard - -"object.values@npm:^1.1.6, object.values@npm:^1.2.1": - version: 1.2.1 - resolution: "object.values@npm:1.2.1" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/3c47814fdc64842ae3d5a74bc9d06bdd8d21563c04d9939bf6716a9c00596a4ebc342552f8934013d1ec991c74e3671b26710a0c51815f0b603795605ab6b2c9 - languageName: node - linkType: hard - -"obug@npm:^2.1.1": - version: 2.1.1 - resolution: "obug@npm:2.1.1" - checksum: 10c0/59dccd7de72a047e08f8649e94c1015ec72f94eefb6ddb57fb4812c4b425a813bc7e7cd30c9aca20db3c59abc3c85cc7a62bb656a968741d770f4e8e02bc2e78 - languageName: node - linkType: hard - -"octokit@npm:^4.1.3": - version: 4.1.3 - resolution: "octokit@npm:4.1.3" - dependencies: - "@octokit/app": "npm:^15.1.6" - "@octokit/core": "npm:^6.1.5" - "@octokit/oauth-app": "npm:^7.1.6" - "@octokit/plugin-paginate-graphql": "npm:^5.2.4" - "@octokit/plugin-paginate-rest": "npm:^12.0.0" - "@octokit/plugin-rest-endpoint-methods": "npm:^14.0.0" - "@octokit/plugin-retry": "npm:^7.2.1" - "@octokit/plugin-throttling": "npm:^10.0.0" - "@octokit/request-error": "npm:^6.1.8" - "@octokit/types": "npm:^14.0.0" - checksum: 10c0/a35352dff1d7bacf8123e491489650c29b830a765f78113064edd6bd0aad0e58e8933874394892972fb8b0e43369b6f7a7b354426c61f4d9fc37408891fde582 - languageName: node - linkType: hard - -"on-finished@npm:^2.4.1, on-finished@npm:~2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: "npm:1.1.1" - checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 - languageName: node - linkType: hard - -"once@npm:^1.4.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 - languageName: node - linkType: hard - -"one-time@npm:^1.0.0": - version: 1.0.0 - resolution: "one-time@npm:1.0.0" - dependencies: - fn.name: "npm:1.x.x" - checksum: 10c0/6e4887b331edbb954f4e915831cbec0a7b9956c36f4feb5f6de98c448ac02ff881fd8d9b55a6b1b55030af184c6b648f340a76eb211812f4ad8c9b4b8692fdaa - languageName: node - linkType: hard - -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: "npm:^4.0.0" - checksum: 10c0/4eef7c6abfef697dd4479345a4100c382d73c149d2d56170a54a07418c50816937ad09500e1ed1e79d235989d073a9bade8557122aee24f0576ecde0f392bb6c - languageName: node - linkType: hard - -"onetime@npm:^7.0.0": - version: 7.0.0 - resolution: "onetime@npm:7.0.0" - dependencies: - mimic-function: "npm:^5.0.0" - checksum: 10c0/5cb9179d74b63f52a196a2e7037ba2b9a893245a5532d3f44360012005c9cadb60851d56716ebff18a6f47129dab7168022445df47c2aff3b276d92585ed1221 - languageName: node - linkType: hard - -"oniguruma-to-es@npm:^2.2.0": - version: 2.3.0 - resolution: "oniguruma-to-es@npm:2.3.0" - dependencies: - emoji-regex-xs: "npm:^1.0.0" - regex: "npm:^5.1.1" - regex-recursion: "npm:^5.1.1" - checksum: 10c0/57ad95f3e9a50be75e7d54e582d8d4da4003f983fd04d99ccc9d17d2dc04e30ea64126782f2e758566bcef2c4c55db0d6a3d344f35ca179dd92ea5ca92fc0313 - languageName: node - linkType: hard - -"openai@npm:^4.98.0": - version: 4.98.0 - resolution: "openai@npm:4.98.0" - dependencies: - "@types/node": "npm:^18.11.18" - "@types/node-fetch": "npm:^2.6.4" - abort-controller: "npm:^3.0.0" - agentkeepalive: "npm:^4.2.1" - form-data-encoder: "npm:1.7.2" - formdata-node: "npm:^4.3.2" - node-fetch: "npm:^2.6.7" - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - bin: - openai: bin/cli - checksum: 10c0/399f07cd04c47d05be89cbcf3edb98650177ca09322ae664ade347bd56830cc0423834b4635341950bd9af59fdf203d3fad1de7927f4d8d2449b08c642c0ee3e - languageName: node - linkType: hard - -"openai@npm:^6.25.0": - version: 6.34.0 - resolution: "openai@npm:6.34.0" - peerDependencies: - ws: ^8.18.0 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - bin: - openai: bin/cli - checksum: 10c0/0d9652aea4b07d9be0f48fc30510c1caa05c24891ce5cdd6286df34b4d03f7a39ee289ff507e7c1a4c9cc2727a0ea799f1d545313ececd9979e4b3688583a1b5 - languageName: node - linkType: hard - -"openapi-fetch@npm:^0.13.4": - version: 0.13.5 - resolution: "openapi-fetch@npm:0.13.5" - dependencies: - openapi-typescript-helpers: "npm:^0.0.15" - checksum: 10c0/57736d9d4310d7bc7fa5e4e37e80d28893a7fefee88ee6e0327600de893e0638479445bf0c9f5bd7b1a2429f409425d3945d6e942b23b37b8081630ac52244fb - languageName: node - linkType: hard - -"openapi-typescript-helpers@npm:^0.0.15": - version: 0.0.15 - resolution: "openapi-typescript-helpers@npm:0.0.15" - checksum: 10c0/5eb68d487b787e3e31266470b1a310726549dd45a1079655ab18066ab291b0b3c343fdf629991013706a2329b86964f8798d56ef0272b94b931fe6c19abd7a88 - languageName: node - linkType: hard - -"openapi3-ts@npm:^4.1.2": - version: 4.5.0 - resolution: "openapi3-ts@npm:4.5.0" - dependencies: - yaml: "npm:^2.8.0" - checksum: 10c0/97de2d24e9ceffb89e1388e137e4a6e17ee57a02dce0c938a5e98b1338ac72b31e8b2ce8dd28945ad43fae8bee2a145892cb548ba5ae60b0930f1b6b79b0747d - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.4 - resolution: "optionator@npm:0.9.4" - dependencies: - deep-is: "npm:^0.1.3" - fast-levenshtein: "npm:^2.0.6" - levn: "npm:^0.4.1" - prelude-ls: "npm:^1.2.1" - type-check: "npm:^0.4.0" - word-wrap: "npm:^1.2.5" - checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 - languageName: node - linkType: hard - -"ora@npm:^8.2.0": - version: 8.2.0 - resolution: "ora@npm:8.2.0" - dependencies: - chalk: "npm:^5.3.0" - cli-cursor: "npm:^5.0.0" - cli-spinners: "npm:^2.9.2" - is-interactive: "npm:^2.0.0" - is-unicode-supported: "npm:^2.0.0" - log-symbols: "npm:^6.0.0" - stdin-discarder: "npm:^0.2.2" - string-width: "npm:^7.2.0" - strip-ansi: "npm:^7.1.0" - checksum: 10c0/7d9291255db22e293ea164f520b6042a3e906576ab06c9cf408bf9ef5664ba0a9f3bd258baa4ada058cfcc2163ef9b6696d51237a866682ce33295349ba02c3a - languageName: node - linkType: hard - -"ora@npm:^9.4.0": - version: 9.4.0 - resolution: "ora@npm:9.4.0" - dependencies: - chalk: "npm:^5.6.2" - cli-cursor: "npm:^5.0.0" - cli-spinners: "npm:^3.2.0" - is-interactive: "npm:^2.0.0" - is-unicode-supported: "npm:^2.1.0" - log-symbols: "npm:^7.0.1" - stdin-discarder: "npm:^0.3.2" - string-width: "npm:^8.1.0" - checksum: 10c0/8f2d7a8869cd68607797ac0ffe9f5cdceeb6009437672510d9920aea794cdd055164e3fe804248624c4940a71b22f94f1ffd94ce8fecf0746baef97a5c121a91 - languageName: node - linkType: hard - -"own-keys@npm:^1.0.1": - version: 1.0.1 - resolution: "own-keys@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.2.6" - object-keys: "npm:^1.1.1" - safe-push-apply: "npm:^1.0.0" - checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a - languageName: node - linkType: hard - -"p-finally@npm:^1.0.0": - version: 1.0.0 - resolution: "p-finally@npm:1.0.0" - checksum: 10c0/6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: "npm:^0.1.0" - checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a - languageName: node - linkType: hard - -"p-limit@npm:^7.2.0": - version: 7.2.0 - resolution: "p-limit@npm:7.2.0" - dependencies: - yocto-queue: "npm:^1.2.1" - checksum: 10c0/18e5ea305c31fdc0cf5260da7b63adfd46748cd72d4b40a31a13bd23eeece729c9308047fb5d848d7fa006d1b2fc2f36bb0d9dd173a300c38cd6dc1ed3355382 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: "npm:^3.0.2" - checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a - languageName: node - linkType: hard - -"p-map@npm:^7.0.2": - version: 7.0.3 - resolution: "p-map@npm:7.0.3" - checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c - languageName: node - linkType: hard - -"p-queue@npm:6.6.2, p-queue@npm:^6.6.2": - version: 6.6.2 - resolution: "p-queue@npm:6.6.2" - dependencies: - eventemitter3: "npm:^4.0.4" - p-timeout: "npm:^3.2.0" - checksum: 10c0/5739ecf5806bbeadf8e463793d5e3004d08bb3f6177bd1a44a005da8fd81bb90f80e4633e1fb6f1dfd35ee663a5c0229abe26aebb36f547ad5a858347c7b0d3e - languageName: node - linkType: hard - -"p-queue@npm:^9.0.1": - version: 9.1.0 - resolution: "p-queue@npm:9.1.0" - dependencies: - eventemitter3: "npm:^5.0.1" - p-timeout: "npm:^7.0.0" - checksum: 10c0/f6bb4644997c20cbbf68c0c88208283697c6c9b1e1879f2073791b1ffcb2d2eb0a9fe35c9631e0c74bd6562ef159b87b418d48df7e7b30e5ddb4d99055bb5c92 - languageName: node - linkType: hard - -"p-retry@npm:^4.6.2": - version: 4.6.2 - resolution: "p-retry@npm:4.6.2" - dependencies: - "@types/retry": "npm:0.12.0" - retry: "npm:^0.13.1" - checksum: 10c0/d58512f120f1590cfedb4c2e0c42cb3fa66f3cea8a4646632fcb834c56055bb7a6f138aa57b20cc236fb207c9d694e362e0b5c2b14d9b062f67e8925580c73b0 - languageName: node - linkType: hard - -"p-retry@npm:^7.1.1": - version: 7.1.1 - resolution: "p-retry@npm:7.1.1" - dependencies: - is-network-error: "npm:^1.1.0" - checksum: 10c0/d72fb15dace25b8bf72c97a13c8a630ad1deb4667e708955e8806ee38f1d70e9611598ebe57bd9677349256e024a5599292f99aabb203143e0e13f1735e30818 - languageName: node - linkType: hard - -"p-timeout@npm:^3.2.0": - version: 3.2.0 - resolution: "p-timeout@npm:3.2.0" - dependencies: - p-finally: "npm:^1.0.0" - checksum: 10c0/524b393711a6ba8e1d48137c5924749f29c93d70b671e6db761afa784726572ca06149c715632da8f70c090073afb2af1c05730303f915604fd38ee207b70a61 - languageName: node - linkType: hard - -"p-timeout@npm:^7.0.0": - version: 7.0.1 - resolution: "p-timeout@npm:7.0.1" - checksum: 10c0/87d96529d1096d506607218dba6f9ec077c6dbedd0c2e2788c748e33bcd05faae8a81009fd9d22ec0b3c95fc83f4717306baba223f6e464737d8b99294c3e863 - languageName: node - linkType: hard - -"package-json-from-dist@npm:^1.0.0": - version: 1.0.1 - resolution: "package-json-from-dist@npm:1.0.1" - checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b - languageName: node - linkType: hard - -"package-manager-detector@npm:^1.3.0": - version: 1.6.0 - resolution: "package-manager-detector@npm:1.6.0" - checksum: 10c0/6419d0b840be64fd45bcdcb7a19f09b81b65456d5e7f7a3daac305a4c90643052122f6ac0308afe548ffee75e36148532a2002ea9d292754f1e385aa2e1ea03b - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: "npm:^3.0.0" - checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 - languageName: node - linkType: hard - -"parse-diff@npm:^0.11.1": - version: 0.11.1 - resolution: "parse-diff@npm:0.11.1" - checksum: 10c0/b8a488039f535e0ddaf1cfd4a13c2adc6d142f4e6263de6dc603f9762b59da89703a8f0dc8aacb7c7c66cdbdd2d075a57c63813fb74f66c9b8f5fe8ad2e89689 - languageName: node - linkType: hard - -"parse-entities@npm:^4.0.0": - version: 4.0.2 - resolution: "parse-entities@npm:4.0.2" - dependencies: - "@types/unist": "npm:^2.0.0" - character-entities-legacy: "npm:^3.0.0" - character-reference-invalid: "npm:^2.0.0" - decode-named-character-reference: "npm:^1.0.0" - is-alphanumerical: "npm:^2.0.0" - is-decimal: "npm:^2.0.0" - is-hexadecimal: "npm:^2.0.0" - checksum: 10c0/a13906b1151750b78ed83d386294066daf5fb559e08c5af9591b2d98cc209123103016a01df776f65f8219ad26652d6d6b210d0974d452049cddfc53a8916c34 - languageName: node - linkType: hard - -"parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "parse-json@npm:4.0.0" - dependencies: - error-ex: "npm:^1.3.1" - json-parse-better-errors: "npm:^1.0.1" - checksum: 10c0/8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 - languageName: node - linkType: hard - -"parse-path@npm:^7.0.0": - version: 7.1.0 - resolution: "parse-path@npm:7.1.0" - dependencies: - protocols: "npm:^2.0.0" - checksum: 10c0/8c8c8b3019323d686e7b1cd6fd9653bc233404403ad68827836fbfe59dfe26aaef64ed4e0396d0e20c4a7e1469312ec969a679618960e79d5e7c652dc0da5a0f - languageName: node - linkType: hard - -"parse-url@npm:^9.2.0": - version: 9.2.0 - resolution: "parse-url@npm:9.2.0" - dependencies: - "@types/parse-path": "npm:^7.0.0" - parse-path: "npm:^7.0.0" - checksum: 10c0/b8f56cdb01e76616255dff82544f4b5ab4378f6f4bac8604ed6fde03a75b0f71c547d92688386d8f22f38fad3c928c075abf69458677c6185da76c841bfd7a93 - languageName: node - linkType: hard - -"parse5@npm:^7.0.0": - version: 7.3.0 - resolution: "parse5@npm:7.3.0" - dependencies: - entities: "npm:^6.0.0" - checksum: 10c0/7fd2e4e247e85241d6f2a464d0085eed599a26d7b0a5233790c49f53473232eb85350e8133344d9b3fd58b89339e7ad7270fe1f89d28abe50674ec97b87f80b5 - languageName: node - linkType: hard - -"parse5@npm:^7.1.2": - version: 7.2.1 - resolution: "parse5@npm:7.2.1" - dependencies: - entities: "npm:^4.5.0" - checksum: 10c0/829d37a0c709215a887e410a7118d754f8e1afd7edb529db95bc7bbf8045fb0266a7b67801331d8e8d9d073ea75793624ec27ce9ff3b96862c3b9008f4d68e80 - languageName: node - linkType: hard - -"parseley@npm:^0.12.0": - version: 0.12.1 - resolution: "parseley@npm:0.12.1" - dependencies: - leac: "npm:^0.6.0" - peberminta: "npm:^0.9.0" - checksum: 10c0/df3de74172b72305b867298a71e5882c413df75d30f2bafb5fb70779dfd349c5e4db03441fbf8ca83da8e4aa72bd0ef2b5c73086c4825d27d1c649d61bc0bcc0 - languageName: node - linkType: hard - -"parseurl@npm:^1.3.3, parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 - languageName: node - linkType: hard - -"path-data-parser@npm:0.1.0, path-data-parser@npm:^0.1.0": - version: 0.1.0 - resolution: "path-data-parser@npm:0.1.0" - checksum: 10c0/ba22d54669a8bc4a3df27431fe667900685585d1196085b803d0aa4066b83e709bbf2be7c1d2b56e706b49cc698231d55947c22abbfc4843ca424bbf8c985745 - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b - languageName: node - linkType: hard - -"path-expression-matcher@npm:^1.5.0": - version: 1.5.0 - resolution: "path-expression-matcher@npm:1.5.0" - checksum: 10c0/646cb5bc66cd7d809a52288336f3ac1e6223f156fd8e912936e490e590f7f93e8056d4fd25fcbcc7da61bb698fa520112cb050372a3f65e7b79bd4afa0f77610 - languageName: node - linkType: hard - -"path-key@npm:^2.0.1": - version: 2.0.1 - resolution: "path-key@npm:2.0.1" - checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c - languageName: node - linkType: hard - -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 10c0/794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - -"path-scurry@npm:^2.0.0": - version: 2.0.0 - resolution: "path-scurry@npm:2.0.0" - dependencies: - lru-cache: "npm:^11.0.0" - minipass: "npm:^7.1.2" - checksum: 10c0/3da4adedaa8e7ef8d6dc4f35a0ff8f05a9b4d8365f2b28047752b62d4c1ad73eec21e37b1579ef2d075920157856a3b52ae8309c480a6f1a8bbe06ff8e52b33c - languageName: node - linkType: hard - -"path-scurry@npm:^2.0.2": - version: 2.0.2 - resolution: "path-scurry@npm:2.0.2" - dependencies: - lru-cache: "npm:^11.0.0" - minipass: "npm:^7.1.2" - checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482 - languageName: node - linkType: hard - -"path-to-regexp@npm:^8.0.0": - version: 8.4.2 - resolution: "path-to-regexp@npm:8.4.2" - checksum: 10c0/05b115c49b47ad252ce05faa32930f643f23769c68b8bcfe78ad833545140c48bbffb3266986d6c8d5db13a64cf12e07e0d72d9882cab830efeefa553533ebaf - languageName: node - linkType: hard - -"path-to-regexp@npm:~0.1.12": - version: 0.1.13 - resolution: "path-to-regexp@npm:0.1.13" - checksum: 10c0/1cae3921739c154a8926e136185a10c916f79a249b9072a5001b266d96e193860ca03867e8e8cc808b786862d750f427ed93686bc259355442c3407a62deab1a - languageName: node - linkType: hard - -"path-type@npm:^3.0.0": - version: 3.0.0 - resolution: "path-type@npm:3.0.0" - dependencies: - pify: "npm:^3.0.0" - checksum: 10c0/1332c632f1cac15790ebab8dd729b67ba04fc96f81647496feb1c2975d862d046f41e4b975dbd893048999b2cc90721f72924ad820acc58c78507ba7141a8e56 - languageName: node - linkType: hard - -"pathe@npm:^2.0.3": - version: 2.0.3 - resolution: "pathe@npm:2.0.3" - checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 - languageName: node - linkType: hard - -"pause-stream@npm:0.0.11": - version: 0.0.11 - resolution: "pause-stream@npm:0.0.11" - dependencies: - through: "npm:~2.3" - checksum: 10c0/86f12c64cdaaa8e45ebaca4e39a478e1442db8b4beabc280b545bfaf79c0e2f33c51efb554aace5c069cc441c7b924ba484837b345eaa4ba6fc940d62f826802 - languageName: node - linkType: hard - -"peberminta@npm:^0.9.0": - version: 0.9.0 - resolution: "peberminta@npm:0.9.0" - checksum: 10c0/59c2c39269d9f7f559cf44582f1c0503524c6a9bc3478e0309adba2b41c71ab98745a239a4e6f98f46105291256e6d8f12ae9860d9f016b1c9a6f52c0b63bfe7 - languageName: node - linkType: hard - -"picocolors@npm:1.1.1, picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.1": - version: 1.1.1 - resolution: "picocolors@npm:1.1.1" - checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 - languageName: node - linkType: hard - -"picomatch-browser@npm:^2.2.6": - version: 2.2.6 - resolution: "picomatch-browser@npm:2.2.6" - checksum: 10c0/bf97d3e6f77dee776fe4cc7728037931b681c56e1fd964023ed797de341a0e32dcc1e90a5552cc74923cb97566464870a37be188b09e3db7279f9e9a9b12d977 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": - version: 2.3.2 - resolution: "picomatch@npm:2.3.2" - checksum: 10c0/a554d1709e59be97d1acb9eaedbbc700a5c03dbd4579807baed95100b00420bc729335440ef15004ae2378984e2487a7c1cebd743cfdb72b6fa9ab69223c0d61 - languageName: node - linkType: hard - -"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3, picomatch@npm:^4.0.4": - version: 4.0.4 - resolution: "picomatch@npm:4.0.4" - checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 - languageName: node - linkType: hard - -"picospinner@npm:^3.0.0": - version: 3.0.0 - resolution: "picospinner@npm:3.0.0" - checksum: 10c0/2c0826a5471575ccec22cfc2a72a6faf14e4d3048af8f39c88932e8bed7fbf7aa303a53285f414c1b72081dbd8e8db4420cd032b8f6870cbdac21e82ce25f08e - languageName: node - linkType: hard - -"pid-port@npm:^1.0.0": - version: 1.0.2 - resolution: "pid-port@npm:1.0.2" - dependencies: - execa: "npm:^8.0.1" - checksum: 10c0/b3a62fde1c73f896a0950f5446b014b55fff2bd84068bce3cba4a459561f695de76c11f74a6c54a64f395b0eca29c79f5c3d705061067d3d157ae8115b00e8a3 - languageName: node - linkType: hard - -"pidtree@npm:^0.3.0": - version: 0.3.1 - resolution: "pidtree@npm:0.3.1" - bin: - pidtree: bin/pidtree.js - checksum: 10c0/cd69b0182f749f45ab48584e3442c48c5dc4512502c18d5b0147a33b042c41a4db4269b9ce2f7c48f11833ee5e79d81f5ebc6f7bf8372d4ea55726f60dc505a1 - languageName: node - linkType: hard - -"pify@npm:^2.3.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc - languageName: node - linkType: hard - -"pify@npm:^3.0.0": - version: 3.0.0 - resolution: "pify@npm:3.0.0" - checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 - languageName: node - linkType: hard - -"pirates@npm:^4.0.1": - version: 4.0.6 - resolution: "pirates@npm:4.0.6" - checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 - languageName: node - linkType: hard - -"pkce-challenge@npm:^5.0.0": - version: 5.0.0 - resolution: "pkce-challenge@npm:5.0.0" - checksum: 10c0/c6706d627fdbb6f22bf8cc5d60d96d6b6a7bb481399b336a3d3f4e9bfba3e167a2c32f8ec0b5e74be686a0ba3bcc9894865d4c2dd1b91cea4c05dba1f28602c3 - languageName: node - linkType: hard - -"points-on-curve@npm:0.2.0, points-on-curve@npm:^0.2.0": - version: 0.2.0 - resolution: "points-on-curve@npm:0.2.0" - checksum: 10c0/f0d92343fcc2ad1f48334633e580574c1e0e28038a756133e171e537f270d6d64203feada5ee556e36f448a1b46e0306dee07b30f589f4e3ad720f6ee38ef48c - languageName: node - linkType: hard - -"points-on-path@npm:^0.2.1": - version: 0.2.1 - resolution: "points-on-path@npm:0.2.1" - dependencies: - path-data-parser: "npm:0.1.0" - points-on-curve: "npm:0.2.0" - checksum: 10c0/a7010340f9f196976f61838e767bb7b0b7f6273ab4fb9eb37c61001fe26fbfc3fcd63c96d5e85b9a4ab579213ab366f2ddaaf60e2a9253e2b91a62db33f395ba - languageName: node - linkType: hard - -"possible-typed-array-names@npm:^1.0.0": - version: 1.1.0 - resolution: "possible-typed-array-names@npm:1.1.0" - checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196 - languageName: node - linkType: hard - -"postcss-import@npm:^15.1.0": - version: 15.1.0 - resolution: "postcss-import@npm:15.1.0" - dependencies: - postcss-value-parser: "npm:^4.0.0" - read-cache: "npm:^1.0.0" - resolve: "npm:^1.1.7" - peerDependencies: - postcss: ^8.0.0 - checksum: 10c0/518aee5c83ea6940e890b0be675a2588db68b2582319f48c3b4e06535a50ea6ee45f7e63e4309f8754473245c47a0372632378d1d73d901310f295a92f26f17b - languageName: node - linkType: hard - -"postcss-js@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-js@npm:4.0.1" - dependencies: - camelcase-css: "npm:^2.0.1" - peerDependencies: - postcss: ^8.4.21 - checksum: 10c0/af35d55cb873b0797d3b42529514f5318f447b134541844285c9ac31a17497297eb72296902967911bb737a75163441695737300ce2794e3bd8c70c13a3b106e - languageName: node - linkType: hard - -"postcss-load-config@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-load-config@npm:4.0.2" - dependencies: - lilconfig: "npm:^3.0.0" - yaml: "npm:^2.3.4" - peerDependencies: - postcss: ">=8.0.9" - ts-node: ">=9.0.0" - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - checksum: 10c0/3d7939acb3570b0e4b4740e483d6e555a3e2de815219cb8a3c8fc03f575a6bde667443aa93369c0be390af845cb84471bf623e24af833260de3a105b78d42519 - languageName: node - linkType: hard - -"postcss-nested@npm:^6.2.0": - version: 6.2.0 - resolution: "postcss-nested@npm:6.2.0" - dependencies: - postcss-selector-parser: "npm:^6.1.1" - peerDependencies: - postcss: ^8.2.14 - checksum: 10c0/7f9c3f2d764191a39364cbdcec350f26a312431a569c9ef17408021424726b0d67995ff5288405e3724bb7152a4c92f73c027e580ec91e798800ed3c52e2bc6e - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^7.1.6": - version: 7.1.6 - resolution: "postcss-selector-parser@npm:7.1.6" - dependencies: - cssesc: "npm:^3.0.0" - util-deprecate: "npm:^1.0.2" - checksum: 10c0/fc8279859896b96ef25b24d0289b2bfff7bce6647b247aa983939ff872e226663788d1ea57bddf9d1695119c071e5cdcb8b2a364ed4313502efe4b0319879154 - languageName: node - linkType: hard - -"postcss-value-parser@npm:^4.0.0": - version: 4.2.0 - resolution: "postcss-value-parser@npm:4.2.0" - checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161 - languageName: node - linkType: hard - -"postcss@npm:8.5.23": - version: 8.5.23 - resolution: "postcss@npm:8.5.23" - dependencies: - nanoid: "npm:^3.3.16" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/ed714e635b330bb42666ecdd0c0b4f30224ded15b0b0052d6bc2b92832f2cf17d1c1141359453f96f0a84f8fbf4c405a74df187f559163b8f31131b2535455aa - languageName: node - linkType: hard - -"postcss@npm:^8.4.47, postcss@npm:^8.5.12, postcss@npm:^8.5.15": - version: 8.5.25 - resolution: "postcss@npm:8.5.25" - dependencies: - nanoid: "npm:^3.3.16" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/0a12c1e74b456c57122e81f684e02fd98ff4d57526f794d10c996df1147158808f5ae373ac82b988c8de6cbbaa82dbd7b13803b14f5dd3cf7cc6a42ccad5c9f2 - languageName: node - linkType: hard - -"posthog-js@npm:^1.369.0": - version: 1.369.0 - resolution: "posthog-js@npm:1.369.0" - dependencies: - "@opentelemetry/api": "npm:^1.9.0" - "@opentelemetry/api-logs": "npm:^0.208.0" - "@opentelemetry/exporter-logs-otlp-http": "npm:^0.208.0" - "@opentelemetry/resources": "npm:^2.2.0" - "@opentelemetry/sdk-logs": "npm:^0.208.0" - "@posthog/core": "npm:1.25.2" - "@posthog/types": "npm:1.369.0" - core-js: "npm:^3.38.1" - dompurify: "npm:^3.3.2" - fflate: "npm:^0.4.8" - preact: "npm:^10.28.2" - query-selector-shadow-dom: "npm:^1.0.1" - web-vitals: "npm:^5.1.0" - checksum: 10c0/e0133e0fa4813f881078b545a2dd9b0beddacb64e7ca3cfd7edb85bae858e26850cfe35f39377d5db075e475076c795e7e2d8869890b0febbd4217c11f363003 - languageName: node - linkType: hard - -"posthog-node@npm:5.52.1": - version: 5.52.1 - resolution: "posthog-node@npm:5.52.1" - dependencies: - "@posthog/core": "npm:^1.53.1" - peerDependencies: - rxjs: ^7.0.0 - peerDependenciesMeta: - rxjs: - optional: true - checksum: 10c0/dfb7f71792156a817aaddf478e844f6d91f3f53c1f91f8aa496a1a4f30b414dfee40baec3cad35570ca383ef6e0a5ec316e59f687fa303960dedd2aeb2d09218 - languageName: node - linkType: hard - -"posthog-node@npm:^5.51.2": - version: 5.51.2 - resolution: "posthog-node@npm:5.51.2" - dependencies: - "@posthog/core": "npm:^1.48.11" - peerDependencies: - rxjs: ^7.0.0 - peerDependenciesMeta: - rxjs: - optional: true - checksum: 10c0/a7a065d4a7ca4009662501cd72d4eef270d9b0ddcec4cc5a2956f4575a76601b2b609127b4e58ca48b5c289365cde0417eb421fb178b2d610a715db4a1c60760 - languageName: node - linkType: hard - -"preact-render-to-string@npm:6.5.11": - version: 6.5.11 - resolution: "preact-render-to-string@npm:6.5.11" - peerDependencies: - preact: ">=10" - checksum: 10c0/a68b704c1343756022fb41322154b45e39f6021b940cbc97e86c292627d017d019700339a17d67b42c308b14fc5323fc120c798f785d6a3e993c8f273610bfe2 - languageName: node - linkType: hard - -"preact@npm:10.24.3": - version: 10.24.3 - resolution: "preact@npm:10.24.3" - checksum: 10c0/c863df6d7be6a660480189762d8a8f2d4148733fc2bb9efbd9d2fd27315d2c7ede850a16077d716c91666c915c0349bd3c9699733e4f08457226a0519f408761 - languageName: node - linkType: hard - -"preact@npm:^10.25.1": - version: 10.29.0 - resolution: "preact@npm:10.29.0" - checksum: 10c0/d111381e5b48335e3a797a03adb83521cf5e9bdf880570fb2eff4fe9da9c82e6dedcbdf54538b1ed8f60bf813a0df0f4891b03dc32140ad93f8f720a8812dd5c - languageName: node - linkType: hard - -"preact@npm:^10.28.2": - version: 10.28.3 - resolution: "preact@npm:10.28.3" - checksum: 10c0/e8854fae8d8d40c918538f7a90888dd4f8acd388b8ba8e0c612ed0eb1a7d2cc6c15a7dc0a7b7c7bb5c361d2df63aa283e501cf1d47f8eb1413979cee611a38ef - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd - languageName: node - linkType: hard - -"prettier@npm:3.5.3": - version: 3.5.3 - resolution: "prettier@npm:3.5.3" - bin: - prettier: bin/prettier.cjs - checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 - languageName: node - linkType: hard - -"pretty-bytes@npm:^6.1.1": - version: 6.1.1 - resolution: "pretty-bytes@npm:6.1.1" - checksum: 10c0/c7a660b933355f3b4587ad3f001c266a8dd6afd17db9f89ebc50812354bb142df4b9600396ba5999bdb1f9717300387dc311df91895c5f0f2a1780e22495b5f8 - languageName: node - linkType: hard - -"pretty-format@npm:^27.0.2": - version: 27.5.1 - resolution: "pretty-format@npm:27.5.1" - dependencies: - ansi-regex: "npm:^5.0.1" - ansi-styles: "npm:^5.0.0" - react-is: "npm:^17.0.1" - checksum: 10c0/0cbda1031aa30c659e10921fa94e0dd3f903ecbbbe7184a729ad66f2b6e7f17891e8c7d7654c458fa4ccb1a411ffb695b4f17bbcd3fe075fabe181027c4040ed - languageName: node - linkType: hard - -"prisma@npm:^6.2.1": - version: 6.5.0 - resolution: "prisma@npm:6.5.0" - dependencies: - "@prisma/config": "npm:6.5.0" - "@prisma/engines": "npm:6.5.0" - fsevents: "npm:2.3.3" - peerDependencies: - typescript: ">=5.1.0" - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - typescript: - optional: true - bin: - prisma: build/index.js - checksum: 10c0/d859336d9b121987723e775d48a69e78b7eed7d6c56ccc040d2d53f3e6d999dc04b23021320bc4ee2c6db968929c2a863ae747c870f359b1faf831ced6f8132c - languageName: node - linkType: hard - -"prismjs@npm:^1.30.0": - version: 1.30.0 - resolution: "prismjs@npm:1.30.0" - checksum: 10c0/f56205bfd58ef71ccfcbcb691fd0eb84adc96c6ff21b0b69fc6fdcf02be42d6ef972ba4aed60466310de3d67733f6a746f89f2fb79c00bf217406d465b3e8f23 - languageName: node - linkType: hard - -"proc-log@npm:^5.0.0": - version: 5.0.0 - resolution: "proc-log@npm:5.0.0" - checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 - languageName: node - linkType: hard - -"process-exists@npm:^5.0.0": - version: 5.0.0 - resolution: "process-exists@npm:5.0.0" - dependencies: - ps-list: "npm:^8.0.0" - checksum: 10c0/2d0edce88dbf22adc1d30aac08a996bd747786cb91c861b003127345f27217e89c528c2c661404e2ad3d50c2a598e5ae4bbb997ce3628e095a07596590a29b67 - languageName: node - linkType: hard - -"progress@npm:^2.0.3": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: 10c0/1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c - languageName: node - linkType: hard - -"prom-client@npm:^15.1.3": - version: 15.1.3 - resolution: "prom-client@npm:15.1.3" - dependencies: - "@opentelemetry/api": "npm:^1.4.0" - tdigest: "npm:^0.1.1" - checksum: 10c0/816525572e5799a2d1d45af78512fb47d073c842dc899c446e94d17cfc343d04282a1627c488c7ca1bcd47f766446d3e49365ab7249f6d9c22c7664a5bce7021 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - -"prompts@npm:2.4.2, prompts@npm:^2.4.2": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: "npm:^3.0.3" - sisteransi: "npm:^1.0.5" - checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 - languageName: node - linkType: hard - -"prop-types@npm:^15.6.2, prop-types@npm:^15.8.1": - version: 15.8.1 - resolution: "prop-types@npm:15.8.1" - dependencies: - loose-envify: "npm:^1.4.0" - object-assign: "npm:^4.1.1" - react-is: "npm:^16.13.1" - checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 - languageName: node - linkType: hard - -"property-information@npm:^6.0.0": - version: 6.5.0 - resolution: "property-information@npm:6.5.0" - checksum: 10c0/981e0f9cc2e5acdb414a6fd48a99dd0fd3a4079e7a91ab41cf97a8534cf43e0e0bc1ffada6602a1b3d047a33db8b5fc2ef46d863507eda712d5ceedac443f0ef - languageName: node - linkType: hard - -"property-information@npm:^7.0.0": - version: 7.0.0 - resolution: "property-information@npm:7.0.0" - checksum: 10c0/bf443e3bbdfc154da8f4ff4c85ed97c3d21f5e5f77cce84d2fd653c6dfb974a75ad61eafbccb2b8d2285942be35d763eaa99d51e29dccc28b40917d3f018107e - languageName: node - linkType: hard - -"proto3-json-serializer@npm:^3.0.0": - version: 3.0.4 - resolution: "proto3-json-serializer@npm:3.0.4" - dependencies: - protobufjs: "npm:^7.4.0" - checksum: 10c0/59150d5e6b396e00c0374e71eb4ebd6f33acd4212c0ad2acdda12181b08f923b733559d74ad78455085223efe24168d4d42887a8b8f15f7663f20debe5796081 - languageName: node - linkType: hard - -"protobufjs@npm:^7.3.0, protobufjs@npm:^7.4.0, protobufjs@npm:^7.5.3, protobufjs@npm:^7.5.4": - version: 7.6.5 - resolution: "protobufjs@npm:7.6.5" - dependencies: - "@protobufjs/aspromise": "npm:^1.1.2" - "@protobufjs/base64": "npm:^1.1.2" - "@protobufjs/codegen": "npm:^2.0.5" - "@protobufjs/eventemitter": "npm:^1.1.1" - "@protobufjs/fetch": "npm:^1.1.1" - "@protobufjs/float": "npm:^1.0.2" - "@protobufjs/path": "npm:^1.1.2" - "@protobufjs/pool": "npm:^1.1.0" - "@protobufjs/utf8": "npm:^1.1.1" - "@types/node": "npm:>=13.7.0" - long: "npm:^5.3.2" - checksum: 10c0/863eaca9c6f45bfcfb8787c545f53e9c6696507e328e3981b4643c12d35df7f2826021c10e3fd30bef342c13a8e9d306547bac9c0849ee3bf50f770a12f01dc5 - languageName: node - linkType: hard - -"protocols@npm:^2.0.0, protocols@npm:^2.0.1": - version: 2.0.2 - resolution: "protocols@npm:2.0.2" - checksum: 10c0/b87d78c1fcf038d33691da28447ce94011d5c7f0c7fd25bcb5fb4d975991c99117873200c84f4b6a9d7f8b9092713a064356236960d1473a7d6fcd4228897b60 - languageName: node - linkType: hard - -"proxy-addr@npm:^2.0.7, proxy-addr@npm:~2.0.7": - version: 2.0.8 - resolution: "proxy-addr@npm:2.0.8" - dependencies: - forwarded: "npm:0.2.0" - ipaddr.js: "npm:1.9.1" - checksum: 10c0/58398f36e5b1f72b1011ca21844c0c41a9a3b6f2f0d101bcdb19abb3f3dd9626b27a96e53da777ded901eb67faed0304a4bc1d435b235e436f66f8e5e1fe1f5e - languageName: node - linkType: hard - -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b - languageName: node - linkType: hard - -"ps-list@npm:^8.0.0, ps-list@npm:^8.1.1": - version: 8.1.1 - resolution: "ps-list@npm:8.1.1" - checksum: 10c0/5c0fa265f910e03eac14e0785f106d481c4bc3eb95f6fd77a055c231194a5accdea5e1e410050bdb5976cf1620a0bcf41923a10c9540e3ad1b9c8e0bd402116b - languageName: node - linkType: hard - -"ps-tree@npm:^1.2.0": - version: 1.2.0 - resolution: "ps-tree@npm:1.2.0" - dependencies: - event-stream: "npm:=3.3.4" - bin: - ps-tree: ./bin/ps-tree.js - checksum: 10c0/9d1c159e0890db5aa05f84d125193c2190a6c4ecd457596fd25e7611f8f747292a846459dcc0244e27d45529d4cea6d1010c3a2a087fad02624d12fdb7d97c22 - languageName: node - linkType: hard - -"psl@npm:^1.15.0": - version: 1.15.0 - resolution: "psl@npm:1.15.0" - dependencies: - punycode: "npm:^2.3.1" - checksum: 10c0/d8d45a99e4ca62ca12ac3c373e63d80d2368d38892daa40cfddaa1eb908be98cd549ac059783ef3a56cfd96d57ae8e2fd9ae53d1378d90d42bc661ff924e102a - languageName: node - linkType: hard - -"pstree.remy@npm:^1.1.8": - version: 1.1.8 - resolution: "pstree.remy@npm:1.1.8" - checksum: 10c0/30f78c88ce6393cb3f7834216cb6e282eb83c92ccb227430d4590298ab2811bc4a4745f850a27c5178e79a8f3e316591de0fec87abc19da648c2b3c6eb766d14 - languageName: node - linkType: hard - -"punycode.js@npm:^2.3.1": - version: 2.3.1 - resolution: "punycode.js@npm:2.3.1" - checksum: 10c0/1d12c1c0e06127fa5db56bd7fdf698daf9a78104456a6b67326877afc21feaa821257b171539caedd2f0524027fa38e67b13dd094159c8d70b6d26d2bea4dfdb - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.3.1": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 - languageName: node - linkType: hard - -"qs@npm:^6.14.2": - version: 6.16.0 - resolution: "qs@npm:6.16.0" - dependencies: - es-define-property: "npm:^1.0.1" - side-channel: "npm:^1.1.1" - checksum: 10c0/eb3e31992fbd70e31a1791e571ed817d70975de7d3bfcbbbec93d77d1dd305877e9e8fdbcc62303c228ee5c3606685622cd6231c042dbc4790bb4e7c65fcbe18 - languageName: node - linkType: hard - -"query-selector-shadow-dom@npm:^1.0.1": - version: 1.0.1 - resolution: "query-selector-shadow-dom@npm:1.0.1" - checksum: 10c0/f36de03f170ff1da69c3eecfa7f8b01e450a46dd266c921e17f36076ec59862eee00179489f30cb17c118bb56e868436578c01ea66f671fb358750d6ae474125 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 - languageName: node - linkType: hard - -"railroad-diagrams@npm:^1.0.0": - version: 1.0.0 - resolution: "railroad-diagrams@npm:1.0.0" - checksum: 10c0/81bf8f86870a69fb9ed243102db9ad6416d09c4cb83964490d44717690e07dd982f671503236a1f8af28f4cb79d5d7a87613930f10ac08defa845ceb6764e364 - languageName: node - linkType: hard - -"randexp@npm:0.4.6": - version: 0.4.6 - resolution: "randexp@npm:0.4.6" - dependencies: - discontinuous-range: "npm:1.0.0" - ret: "npm:~0.1.10" - checksum: 10c0/14ee14b6d7f5ce69609b51cc914fb7a7c82ad337820a141c5f762c5ad1fe868f5191ea6e82359aee019b625ee1359486628fa833909d12c3b5dd9571908c3345 - languageName: node - linkType: hard - -"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 - languageName: node - linkType: hard - -"rate-limiter-flexible@npm:^4.0.1": - version: 4.0.1 - resolution: "rate-limiter-flexible@npm:4.0.1" - checksum: 10c0/93db9ed61a62c4d7d411713e12ed9cd7ea196a08b81cb289156f7ff0fe85bd4607916e82be750d2d8c44248dafefaff3f4a1cd4b7caae077b078573ad7f24fa6 - languageName: node - linkType: hard - -"raw-body@npm:^3.0.0": - version: 3.0.0 - resolution: "raw-body@npm:3.0.0" - dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.6.3" - unpipe: "npm:1.0.0" - checksum: 10c0/f8daf4b724064a4811d118745a781ca0fb4676298b8adadfd6591155549cfea0a067523cf7dd3baeb1265fecc9ce5dfb2fc788c12c66b85202a336593ece0f87 - languageName: node - linkType: hard - -"raw-body@npm:^3.0.2": - version: 3.0.2 - resolution: "raw-body@npm:3.0.2" - dependencies: - bytes: "npm:~3.1.2" - http-errors: "npm:~2.0.1" - iconv-lite: "npm:~0.7.0" - unpipe: "npm:~1.0.0" - checksum: 10c0/d266678d08e1e7abea62c0ce5864344e980fa81c64f6b481e9842c5beaed2cdcf975f658a3ccd67ad35fc919c1f6664ccc106067801850286a6cbe101de89f29 - languageName: node - linkType: hard - -"raw-body@npm:~2.5.3": - version: 2.5.3 - resolution: "raw-body@npm:2.5.3" - dependencies: - bytes: "npm:~3.1.2" - http-errors: "npm:~2.0.1" - iconv-lite: "npm:~0.4.24" - unpipe: "npm:~1.0.0" - checksum: 10c0/449844344fc90547fb994383a494b83300e4f22199f146a79f68d78a199a8f2a923ea9fd29c3be979bfd50291a3884733619ffc15ba02a32e703b612f8d3f74a - languageName: node - linkType: hard - -"raw-loader@npm:^4.0.2": - version: 4.0.2 - resolution: "raw-loader@npm:4.0.2" - dependencies: - loader-utils: "npm:^2.0.0" - schema-utils: "npm:^3.0.0" - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 10c0/981ebe65e1cee7230300d21ba6dcd8bd23ea81ef4ad2b167c0f62d93deba347f27921d330be848634baab3831cf9f38900af6082d6416c2e937fe612fa6a74ff - languageName: node - linkType: hard - -"react-day-picker@npm:^9.14.0": - version: 9.14.0 - resolution: "react-day-picker@npm:9.14.0" - dependencies: - "@date-fns/tz": "npm:^1.4.1" - "@tabby_ai/hijri-converter": "npm:1.0.5" - date-fns: "npm:^4.1.0" - date-fns-jalali: "npm:4.1.0-0" - peerDependencies: - react: ">=16.8.0" - checksum: 10c0/5d26b2e8e28fb504c2ec577bda2ea26709ccab07555aada0674bd72ae38963de6f5cab135d936bb2fef935f97f73c6510657b15b936766e53d5c65811d13289a - languageName: node - linkType: hard - -"react-device-detect@npm:^2.2.3": - version: 2.2.3 - resolution: "react-device-detect@npm:2.2.3" - dependencies: - ua-parser-js: "npm:^1.0.33" - peerDependencies: - react: ">= 0.14.0" - react-dom: ">= 0.14.0" - checksum: 10c0/396bbeeab0cb21da084c67434d204c9cf502fad6c683903313084d3f6487950a36a34f9bf67ccf5c1772a1bb5b79a2a4403fcfe6b51d93877db4c2d9f3a3a925 - languageName: node - linkType: hard - -"react-dom@npm:19.2.4": - version: 19.2.4 - resolution: "react-dom@npm:19.2.4" - dependencies: - scheduler: "npm:^0.27.0" - peerDependencies: - react: ^19.2.4 - checksum: 10c0/f0c63f1794dedb154136d4d0f59af00b41907f4859571c155940296808f4b94bf9c0c20633db75b5b2112ec13d8d7dd4f9bf57362ed48782f317b11d05a44f35 - languageName: node - linkType: hard - -"react-dropzone@npm:^15.0.0": - version: 15.0.0 - resolution: "react-dropzone@npm:15.0.0" - dependencies: - attr-accept: "npm:^2.2.4" - file-selector: "npm:^2.1.0" - prop-types: "npm:^15.8.1" - peerDependencies: - react: ">= 16.8 || 18.0.0" - checksum: 10c0/fb7b48a709fdd26273707f7aca5c0e77fce2b9c9201122645d3ecfb07ecfbb89e2495273ea141994f0ed0838ee79f27832c0855b2c598b377b342c3965608b54 - languageName: node - linkType: hard - -"react-email@npm:^6.1.4": - version: 6.1.4 - resolution: "react-email@npm:6.1.4" - dependencies: - "@babel/parser": "npm:7.27.0" - "@babel/traverse": "npm:7.27.0" - "@react-email/render": "npm:>=2.0.8" - chokidar: "npm:^4.0.3" - commander: "npm:^13.0.0" - conf: "npm:^15.0.2" - css-tree: "npm:3.2.1" - debounce: "npm:^2.0.0" - esbuild: "npm:^0.28.0" - glob: "npm:^13.0.6" - jiti: "npm:2.4.2" - log-symbols: "npm:^7.0.0" - marked: "npm:^15.0.12" - mime-types: "npm:^3.0.0" - normalize-path: "npm:^3.0.0" - nypm: "npm:0.6.6" - picospinner: "npm:^3.0.0" - prismjs: "npm:^1.30.0" - prompts: "npm:2.4.2" - socket.io: "npm:^4.8.1" - tailwindcss: "npm:^4.1.18" - tsconfig-paths: "npm:4.2.0" - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^18.0 || ^19.0 || ^19.0.0-rc - bin: - email: ./dist/cli/index.mjs - checksum: 10c0/68b3f0d098f98a7b35e9b6bbb5fbd1d1ae7b0c5f0b74885bccaea2de1736af7f1471c39c1041fd9661cdbd7e9bde72fce0e06c66ab276ad97fc5bbfdc556a6d7 - languageName: node - linkType: hard - -"react-grab@npm:0.1.29": - version: 0.1.29 - resolution: "react-grab@npm:0.1.29" - dependencies: - "@medv/finder": "npm:^4.0.2" - "@react-grab/cli": "npm:0.1.29" - bippy: "npm:^0.5.32" - element-source: "npm:^0.0.3" - solid-js: "npm:^1.9.10" - peerDependencies: - react: ">=17.0.0" - peerDependenciesMeta: - react: - optional: true - bin: - react-grab: bin/cli.js - checksum: 10c0/7afd3959f3395c357dbaa5a09a4ce7b7b64455c2b5ed9aac97c84a07e0370af68a31b32b3a43d1724714065cb3f4e1a0f48a9bdb25757fbf86e8ac8baf08c6d7 - languageName: node - linkType: hard - -"react-grab@npm:^0.1.23": - version: 0.1.23 - resolution: "react-grab@npm:0.1.23" - dependencies: - "@medv/finder": "npm:^4.0.2" - "@react-grab/cli": "npm:0.1.23" - bippy: "npm:^0.5.30" - solid-js: "npm:^1.9.10" - peerDependencies: - react: ">=17.0.0" - peerDependenciesMeta: - react: - optional: true - bin: - react-grab: bin/cli.js - checksum: 10c0/7b41ab32bc398d07fcabeb5e9bdde15023ca4e981224fb98692a9de1e6679eb079a57f5099d3aa1ce8e778afa9efd434c2b16cf3eb885836cd834c5bfe67b2c8 - languageName: node - linkType: hard - -"react-hook-form@npm:^7.53.0": - version: 7.54.2 - resolution: "react-hook-form@npm:7.54.2" - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10c0/6eebead2900e3d369a989e7a20429f390dc75b3897142aa3107f1f6dabb9ae64fed201ea98cdcd8676e40466c97748aeb0c0d83264f5bd3a84dbc0b8e4863415 - languageName: node - linkType: hard - -"react-hotkeys-hook@npm:^4.5.1": - version: 4.6.1 - resolution: "react-hotkeys-hook@npm:4.6.1" - peerDependencies: - react: ">=16.8.1" - react-dom: ">=16.8.1" - checksum: 10c0/e23916567b0b863831cf7e2ddba591e82988a3212a9e4b818ac7da6d751b7e8b102f2245d8bf7e9526a97766ffd092efdbfbcc457b74564415f5d5f8ab51919e - languageName: node - linkType: hard - -"react-icons@npm:^5.6.0": - version: 5.6.0 - resolution: "react-icons@npm:5.6.0" - peerDependencies: - react: "*" - checksum: 10c0/addba1ebfd45cdf7f69291d0c93df64fca1271cfdb66df657abd223e3451c73356b035f50e75858627dd182b02129596c79eaaaa45d32eb52658e443a992645c - languageName: node - linkType: hard - -"react-is@npm:^16.13.1": - version: 16.13.1 - resolution: "react-is@npm:16.13.1" - checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 - languageName: node - linkType: hard - -"react-is@npm:^17.0.1": - version: 17.0.2 - resolution: "react-is@npm:17.0.2" - checksum: 10c0/2bdb6b93fbb1820b024b496042cce405c57e2f85e777c9aabd55f9b26d145408f9f74f5934676ffdc46f3dcff656d78413a6e43968e7b3f92eea35b3052e9053 - languageName: node - linkType: hard - -"react-is@npm:^18.3.1": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: 10c0/f2f1e60010c683479e74c63f96b09fb41603527cd131a9959e2aee1e5a8b0caf270b365e5ca77d4a6b18aae659b60a86150bb3979073528877029b35aecd2072 - languageName: node - linkType: hard - -"react-markdown@npm:^10.1.0": - version: 10.1.0 - resolution: "react-markdown@npm:10.1.0" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - devlop: "npm:^1.0.0" - hast-util-to-jsx-runtime: "npm:^2.0.0" - html-url-attributes: "npm:^3.0.0" - mdast-util-to-hast: "npm:^13.0.0" - remark-parse: "npm:^11.0.0" - remark-rehype: "npm:^11.0.0" - unified: "npm:^11.0.0" - unist-util-visit: "npm:^5.0.0" - vfile: "npm:^6.0.0" - peerDependencies: - "@types/react": ">=18" - react: ">=18" - checksum: 10c0/4a5dc7d15ca6d05e9ee95318c1904f83b111a76f7588c44f50f1d54d4c97193b84e4f64c4b592057c989228238a2590306cedd0c4d398e75da49262b2b5ae1bf - languageName: node - linkType: hard - -"react-remove-scroll-bar@npm:^2.3.3, react-remove-scroll-bar@npm:^2.3.7": - version: 2.3.8 - resolution: "react-remove-scroll-bar@npm:2.3.8" - dependencies: - react-style-singleton: "npm:^2.2.2" - tslib: "npm:^2.0.0" - peerDependencies: - "@types/react": "*" - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/9a0675c66cbb52c325bdbfaed80987a829c4504cefd8ff2dd3b6b3afc9a1500b8ec57b212e92c1fb654396d07bbe18830a8146fe77677d2a29ce40b5e1f78654 - languageName: node - linkType: hard - -"react-remove-scroll@npm:2.5.5": - version: 2.5.5 - resolution: "react-remove-scroll@npm:2.5.5" - dependencies: - react-remove-scroll-bar: "npm:^2.3.3" - react-style-singleton: "npm:^2.2.1" - tslib: "npm:^2.1.0" - use-callback-ref: "npm:^1.3.0" - use-sidecar: "npm:^1.1.2" - peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/4952657e6a7b9d661d4ad4dfcef81b9c7fa493e35164abff99c35c0b27b3d172ef7ad70c09416dc44dd14ff2e6b38a5ec7da27e27e90a15cbad36b8fd2fd8054 - languageName: node - linkType: hard - -"react-remove-scroll@npm:^2.6.3": - version: 2.6.3 - resolution: "react-remove-scroll@npm:2.6.3" - dependencies: - react-remove-scroll-bar: "npm:^2.3.7" - react-style-singleton: "npm:^2.2.3" - tslib: "npm:^2.1.0" - use-callback-ref: "npm:^1.3.3" - use-sidecar: "npm:^1.1.3" - peerDependencies: - "@types/react": "*" - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/068e9704ff26816fffc4c8903e2c6c8df7291ee08615d7c1ab0cf8751f7080e2c5a5d78ef5d908b11b9cfc189f176d312e44cb02ea291ca0466d8283b479b438 - languageName: node - linkType: hard - -"react-resizable-panels@npm:^2.1.1": - version: 2.1.7 - resolution: "react-resizable-panels@npm:2.1.7" - peerDependencies: - react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - checksum: 10c0/644a57960507b809f571bf8c95f07a04e3aeb9b20405a1d9d8cb6deb72d2462192e6e5e9751237347e7818179a619a6f65de4b355e276334d10b8cfe737ca4e1 - languageName: node - linkType: hard - -"react-scan@npm:^0.5.3": - version: 0.5.3 - resolution: "react-scan@npm:0.5.3" - dependencies: - "@babel/core": "npm:^7.26.0" - "@babel/generator": "npm:^7.26.2" - "@babel/types": "npm:^7.26.0" - "@preact/signals": "npm:^1.3.1" - "@rollup/pluginutils": "npm:^5.1.3" - "@types/node": "npm:^20.17.9" - bippy: "npm:^0.5.30" - commander: "npm:^14.0.0" - esbuild: "npm:^0.25.0" - estree-walker: "npm:^3.0.3" - picocolors: "npm:^1.1.1" - preact: "npm:^10.25.1" - prompts: "npm:^2.4.2" - unplugin: "npm:2.1.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - dependenciesMeta: - unplugin: - optional: true - bin: - react-scan: bin/cli.js - checksum: 10c0/e0f1743ef5f512c8f7e0a520b700849bf5dcf8d54dac2dbd11e929148bac5ed2ec4a296b6dbb132ab1f0b8792228e77dc29c102d2fde7d15531d1ae9b64b78bc - languageName: node - linkType: hard - -"react-smooth@npm:^4.0.4": - version: 4.0.4 - resolution: "react-smooth@npm:4.0.4" - dependencies: - fast-equals: "npm:^5.0.1" - prop-types: "npm:^15.8.1" - react-transition-group: "npm:^4.4.5" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/d94cb27f808721ec040d320ca1927919199495fd212e54eb9dc8ee3f73ff1d808a34be9f4b09fe49b01f411ac2387fdf0e4bee297f18faf56f94bfbef5fd204c - languageName: node - linkType: hard - -"react-style-singleton@npm:^2.2.1, react-style-singleton@npm:^2.2.2, react-style-singleton@npm:^2.2.3": - version: 2.2.3 - resolution: "react-style-singleton@npm:2.2.3" - dependencies: - get-nonce: "npm:^1.0.0" - tslib: "npm:^2.0.0" - peerDependencies: - "@types/react": "*" - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/841938ff16d16a6b76895f4cb2e1fea957e5fe3b30febbf03a54892dae1c9153f2383e231dea0b3ba41192ad2f2849448fa859caccd288943bce32639e971bee - languageName: node - linkType: hard - -"react-transition-group@npm:^4.4.5": - version: 4.4.5 - resolution: "react-transition-group@npm:4.4.5" - dependencies: - "@babel/runtime": "npm:^7.5.5" - dom-helpers: "npm:^5.0.1" - loose-envify: "npm:^1.4.0" - prop-types: "npm:^15.6.2" - peerDependencies: - react: ">=16.6.0" - react-dom: ">=16.6.0" - checksum: 10c0/2ba754ba748faefa15f87c96dfa700d5525054a0141de8c75763aae6734af0740e77e11261a1e8f4ffc08fd9ab78510122e05c21c2d79066c38bb6861a886c82 - languageName: node - linkType: hard - -"react-zoom-pan-pinch@npm:^4.0.3": - version: 4.0.3 - resolution: "react-zoom-pan-pinch@npm:4.0.3" - peerDependencies: - react: "*" - react-dom: "*" - checksum: 10c0/611bc498891550c5e59da5ee94996ff9c31eae533affa10f2fa0b0cb7b5333b51c1e7aa1bb918dcfff2a103c42de0b1963e1fdfe4fa87fcae36b046c37a822b1 - languageName: node - linkType: hard - -"react@npm:19.2.4": - version: 19.2.4 - resolution: "react@npm:19.2.4" - checksum: 10c0/cd2c9ff67a720799cc3b38a516009986f7fc4cb8d3e15716c6211cf098d1357ee3e348ab05ad0600042bbb0fd888530ba92e329198c92eafa0994f5213396596 - languageName: node - linkType: hard - -"read-cache@npm:^1.0.0": - version: 1.0.0 - resolution: "read-cache@npm:1.0.0" - dependencies: - pify: "npm:^2.3.0" - checksum: 10c0/90cb2750213c7dd7c80cb420654344a311fdec12944e81eb912cd82f1bc92aea21885fa6ce442e3336d9fccd663b8a7a19c46d9698e6ca55620848ab932da814 - languageName: node - linkType: hard - -"read-pkg@npm:^3.0.0": - version: 3.0.0 - resolution: "read-pkg@npm:3.0.0" - dependencies: - load-json-file: "npm:^4.0.0" - normalize-package-data: "npm:^2.3.2" - path-type: "npm:^3.0.0" - checksum: 10c0/65acf2df89fbcd506b48b7ced56a255ba00adf7ecaa2db759c86cc58212f6fd80f1f0b7a85c848551a5d0685232e9b64f45c1fd5b48d85df2761a160767eeb93 - languageName: node - linkType: hard - -"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.2": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 - languageName: node - linkType: hard - -"readdirp@npm:^4.0.1": - version: 4.1.2 - resolution: "readdirp@npm:4.1.2" - checksum: 10c0/60a14f7619dec48c9c850255cd523e2717001b0e179dc7037cfa0895da7b9e9ab07532d324bfb118d73a710887d1e35f79c495fa91582784493e085d18c72c62 - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: "npm:^2.2.1" - checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b - languageName: node - linkType: hard - -"readline-sync@npm:^1.4.10": - version: 1.4.10 - resolution: "readline-sync@npm:1.4.10" - checksum: 10c0/0a4d0fe4ad501f8f005a3c9cbf3cc0ae6ca2ced93e9a1c7c46f226bdfcb6ef5d3f437ae7e9d2e1098ee13524a3739c830e4c8dbc7f543a693eecd293e41093a3 - languageName: node - linkType: hard - -"recharts-scale@npm:^0.4.4": - version: 0.4.5 - resolution: "recharts-scale@npm:0.4.5" - dependencies: - decimal.js-light: "npm:^2.4.1" - checksum: 10c0/64ce1fc4ebe62001787bf4dc4cbb779452d33831619309c71c50277c58e8968ffe98941562d9d0d5ffdb02588ebd62f4fe6548fa826110fd458db9c3cc6dadc1 - languageName: node - linkType: hard - -"recharts@npm:^2.15.3": - version: 2.15.3 - resolution: "recharts@npm:2.15.3" - dependencies: - clsx: "npm:^2.0.0" - eventemitter3: "npm:^4.0.1" - lodash: "npm:^4.17.21" - react-is: "npm:^18.3.1" - react-smooth: "npm:^4.0.4" - recharts-scale: "npm:^0.4.4" - tiny-invariant: "npm:^1.3.1" - victory-vendor: "npm:^36.6.8" - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/76757605d67a07562bcfb1a4b9a3a0b6b5fed2b84ee5f00813cedf151502969965bf7bd3856eb7e5d60c1d71c7b0d67d9ae2f1ef45676152fcd532abafc501fb - languageName: node - linkType: hard - -"redis-errors@npm:1.2.0, redis-errors@npm:^1.0.0": - version: 1.2.0 - resolution: "redis-errors@npm:1.2.0" - checksum: 10c0/5b316736e9f532d91a35bff631335137a4f974927bb2fb42bf8c2f18879173a211787db8ac4c3fde8f75ed6233eb0888e55d52510b5620e30d69d7d719c8b8a7 - languageName: node - linkType: hard - -"redis-info@npm:^3.1.0": - version: 3.1.0 - resolution: "redis-info@npm:3.1.0" - dependencies: - lodash: "npm:^4.17.11" - checksum: 10c0/ec0f31d97893c5828cec7166486d74198c92160c60073b6f2fe805cdf575a10ddcccc7641737d44b8f451355f0ab5b6c7b0d79e8fc24742b75dd625f91ffee38 - languageName: node - linkType: hard - -"redis-parser@npm:3.0.0": - version: 3.0.0 - resolution: "redis-parser@npm:3.0.0" - dependencies: - redis-errors: "npm:^1.0.0" - checksum: 10c0/ee16ac4c7b2a60b1f42a2cdaee22b005bd4453eb2d0588b8a4939718997ae269da717434da5d570fe0b05030466eeb3f902a58cf2e8e1ca058bf6c9c596f632f - languageName: node - linkType: hard - -"redlock@npm:5.0.0-beta.2": - version: 5.0.0-beta.2 - resolution: "redlock@npm:5.0.0-beta.2" - dependencies: - node-abort-controller: "npm:^3.0.1" - checksum: 10c0/6664a1b7807ec0ceb223d8f50bf087ac9a6df6356329c47b4374c3a7e4cbcb24a3045d45735dbc74422fc399657baf533e24c0d6528c141c9dd14701880d4fe4 - languageName: node - linkType: hard - -"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": - version: 1.0.10 - resolution: "reflect.getprototypeof@npm:1.0.10" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.9" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.7" - get-proto: "npm:^1.0.1" - which-builtin-type: "npm:^1.2.1" - checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.14.0": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 - languageName: node - linkType: hard - -"regex-recursion@npm:^5.1.1": - version: 5.1.1 - resolution: "regex-recursion@npm:5.1.1" - dependencies: - regex: "npm:^5.1.1" - regex-utilities: "npm:^2.3.0" - checksum: 10c0/c61c284bc41f2b271dfa0549d657a5a26397108b860d7cdb15b43080196681c0092bf8cf920a8836213e239d1195c4ccf6db9be9298bce4e68c9daab1febeab9 - languageName: node - linkType: hard - -"regex-utilities@npm:^2.3.0": - version: 2.3.0 - resolution: "regex-utilities@npm:2.3.0" - checksum: 10c0/78c550a80a0af75223244fff006743922591bd8f61d91fef7c86b9b56cf9bbf8ee5d7adb6d8991b5e304c57c90103fc4818cf1e357b11c6c669b782839bd7893 - languageName: node - linkType: hard - -"regex@npm:^5.1.1": - version: 5.1.1 - resolution: "regex@npm:5.1.1" - dependencies: - regex-utilities: "npm:^2.3.0" - checksum: 10c0/314e032f0fe09497ce7a160b99675c4a16c7524f0a24833f567cbbf3a2bebc26bf59737dc5c23f32af7c74aa7a6bd3f809fc72c90c49a05faf8be45677db508a - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": - version: 1.5.4 - resolution: "regexp.prototype.flags@npm:1.5.4" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-errors: "npm:^1.3.0" - get-proto: "npm:^1.0.1" - gopd: "npm:^1.2.0" - set-function-name: "npm:^2.0.2" - checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 - languageName: node - linkType: hard - -"rehype-raw@npm:^7.0.0": - version: 7.0.0 - resolution: "rehype-raw@npm:7.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-raw: "npm:^9.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52 - languageName: node - linkType: hard - -"rehype-sanitize@npm:^6.0.0": - version: 6.0.0 - resolution: "rehype-sanitize@npm:6.0.0" - dependencies: - "@types/hast": "npm:^3.0.0" - hast-util-sanitize: "npm:^5.0.0" - checksum: 10c0/43d6c056e63c994cf56e5ee0e157052d2030dc5ac160845ee494af9a26e5906bf5ec5af56c7d90c99f9c4dc0091e45a48a168618135fb6c64a76481ad3c449e9 - languageName: node - linkType: hard - -"remark-gfm@npm:^4.0.1": - version: 4.0.1 - resolution: "remark-gfm@npm:4.0.1" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-gfm: "npm:^3.0.0" - micromark-extension-gfm: "npm:^3.0.0" - remark-parse: "npm:^11.0.0" - remark-stringify: "npm:^11.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/427ecc6af3e76222662061a5f670a3e4e33ec5fffe2cabf04034da6a3f9a1bda1fc023e838a636385ba314e66e2bebbf017ca61ebea357eb0f5200fe0625a4b7 - languageName: node - linkType: hard - -"remark-parse@npm:^11.0.0": - version: 11.0.0 - resolution: "remark-parse@npm:11.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-from-markdown: "npm:^2.0.0" - micromark-util-types: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/6eed15ddb8680eca93e04fcb2d1b8db65a743dcc0023f5007265dda558b09db595a087f622062ccad2630953cd5cddc1055ce491d25a81f3317c858348a8dd38 - languageName: node - linkType: hard - -"remark-rehype@npm:^11.0.0": - version: 11.1.2 - resolution: "remark-rehype@npm:11.1.2" - dependencies: - "@types/hast": "npm:^3.0.0" - "@types/mdast": "npm:^4.0.0" - mdast-util-to-hast: "npm:^13.0.0" - unified: "npm:^11.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/f9eccacfb596d9605581dc05bfad28635d6ded5dd0a18e88af5fd4df0d3fcf9612e1501d4513bc2164d833cfe9636dab20400080b09e53f155c6e1442a1231fb - languageName: node - linkType: hard - -"remark-stringify@npm:^11.0.0": - version: 11.0.0 - resolution: "remark-stringify@npm:11.0.0" - dependencies: - "@types/mdast": "npm:^4.0.0" - mdast-util-to-markdown: "npm:^2.0.0" - unified: "npm:^11.0.0" - checksum: 10c0/0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f - languageName: node - linkType: hard - -"reo-census@npm:^1.2.10": - version: 1.2.10 - resolution: "reo-census@npm:1.2.10" - checksum: 10c0/cd0c26c28dfdfe520fa80c4ab31c045ee89c7ff27a27b1703795c02cbd31bf4840eb398cf6d2b37fb82b6f800bfdb4df89f4424d27f7df10c3c68e9d4dc31a21 - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 - languageName: node - linkType: hard - -"require-in-the-middle@npm:^7.1.1": - version: 7.5.2 - resolution: "require-in-the-middle@npm:7.5.2" - dependencies: - debug: "npm:^4.3.5" - module-details-from-path: "npm:^1.0.3" - resolve: "npm:^1.22.8" - checksum: 10c0/43a2dac5520e39d13c413650895715e102d6802e6cc6ff322017bd948f12a9657fe28435f7cbbcba437b167f02e192ac7af29fa35cabd5d0c375d071c0605e01 - languageName: node - linkType: hard - -"require-in-the-middle@npm:^8.0.0": - version: 8.0.1 - resolution: "require-in-the-middle@npm:8.0.1" - dependencies: - debug: "npm:^4.3.5" - module-details-from-path: "npm:^1.0.3" - checksum: 10c0/4b3d29adfff873585dceffa9ddb8f33bb6599001ddff758503e0e5ade2ae6d20d691314125bb13679fa75a19893338e11953d4702dd2fea181e95c0f8316b29b - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 - languageName: node - linkType: hard - -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab - languageName: node - linkType: hard - -"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.22.4, resolve@npm:^1.22.8": - version: 1.22.10 - resolution: "resolve@npm:1.22.10" - dependencies: - is-core-module: "npm:^2.16.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 - languageName: node - linkType: hard - -"resolve@npm:^2.0.0-next.5": - version: 2.0.0-next.5 - resolution: "resolve@npm:2.0.0-next.5" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/a6c33555e3482ea2ec4c6e3d3bf0d78128abf69dca99ae468e64f1e30acaa318fd267fb66c8836b04d558d3e2d6ed875fe388067e7d8e0de647d3c21af21c43a - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": - version: 1.22.10 - resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.16.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": - version: 2.0.0-next.5 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/78ad6edb8309a2bfb720c2c1898f7907a37f858866ce11a5974643af1203a6a6e05b2fa9c53d8064a673a447b83d42569260c306d43628bff5bb101969708355 - languageName: node - linkType: hard - -"restore-cursor@npm:^5.0.0": - version: 5.1.0 - resolution: "restore-cursor@npm:5.1.0" - dependencies: - onetime: "npm:^7.0.0" - signal-exit: "npm:^4.1.0" - checksum: 10c0/c2ba89131eea791d1b25205bdfdc86699767e2b88dee2a590b1a6caa51737deac8bad0260a5ded2f7c074b7db2f3a626bcf1fcf3cdf35974cbeea5e2e6764f60 - languageName: node - linkType: hard - -"ret@npm:~0.1.10": - version: 0.1.15 - resolution: "ret@npm:0.1.15" - checksum: 10c0/01f77cad0f7ea4f955852c03d66982609893edc1240c0c964b4c9251d0f9fb6705150634060d169939b096d3b77f4c84d6b6098a5b5d340160898c8581f1f63f - languageName: node - linkType: hard - -"retry-request@npm:^8.0.0": - version: 8.0.2 - resolution: "retry-request@npm:8.0.2" - dependencies: - extend: "npm:^3.0.2" - teeny-request: "npm:^10.0.0" - checksum: 10c0/e0b44950d69fe8f51d4e808650cd0d06383cd711adcc71e7764b28b2f10a9ac3b2209f0c9ac0547df0745031810a259730b9d13b0070d69df9806c37432456a9 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe - languageName: node - linkType: hard - -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 10c0/9ae822ee19db2163497e074ea919780b1efa00431d197c7afdb950e42bf109196774b92a49fc9821f0b8b328a98eea6017410bfc5e8a0fc19c85c6d11adb3772 - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.1.0 - resolution: "reusify@npm:1.1.0" - checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa - languageName: node - linkType: hard - -"rimraf@npm:^5.0.1, rimraf@npm:^5.0.5": - version: 5.0.10 - resolution: "rimraf@npm:5.0.10" - dependencies: - glob: "npm:^10.3.7" - bin: - rimraf: dist/esm/bin.mjs - checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc - languageName: node - linkType: hard - -"robust-predicates@npm:^3.0.2": - version: 3.0.3 - resolution: "robust-predicates@npm:3.0.3" - checksum: 10c0/ae23a0318be809545f091a076818747848f144495491e24e6df5d767f2bad0a1501bbeac34e78b74681d1437ecff0585f593ebfe6c8d49a50e79c5053b962693 - languageName: node - linkType: hard - -"rolldown@npm:1.0.3": - version: 1.0.3 - resolution: "rolldown@npm:1.0.3" - dependencies: - "@oxc-project/types": "npm:=0.133.0" - "@rolldown/binding-android-arm64": "npm:1.0.3" - "@rolldown/binding-darwin-arm64": "npm:1.0.3" - "@rolldown/binding-darwin-x64": "npm:1.0.3" - "@rolldown/binding-freebsd-x64": "npm:1.0.3" - "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.3" - "@rolldown/binding-linux-arm64-gnu": "npm:1.0.3" - "@rolldown/binding-linux-arm64-musl": "npm:1.0.3" - "@rolldown/binding-linux-ppc64-gnu": "npm:1.0.3" - "@rolldown/binding-linux-s390x-gnu": "npm:1.0.3" - "@rolldown/binding-linux-x64-gnu": "npm:1.0.3" - "@rolldown/binding-linux-x64-musl": "npm:1.0.3" - "@rolldown/binding-openharmony-arm64": "npm:1.0.3" - "@rolldown/binding-wasm32-wasi": "npm:1.0.3" - "@rolldown/binding-win32-arm64-msvc": "npm:1.0.3" - "@rolldown/binding-win32-x64-msvc": "npm:1.0.3" - "@rolldown/pluginutils": "npm:^1.0.0" - dependenciesMeta: - "@rolldown/binding-android-arm64": - optional: true - "@rolldown/binding-darwin-arm64": - optional: true - "@rolldown/binding-darwin-x64": - optional: true - "@rolldown/binding-freebsd-x64": - optional: true - "@rolldown/binding-linux-arm-gnueabihf": - optional: true - "@rolldown/binding-linux-arm64-gnu": - optional: true - "@rolldown/binding-linux-arm64-musl": - optional: true - "@rolldown/binding-linux-ppc64-gnu": - optional: true - "@rolldown/binding-linux-s390x-gnu": - optional: true - "@rolldown/binding-linux-x64-gnu": - optional: true - "@rolldown/binding-linux-x64-musl": - optional: true - "@rolldown/binding-openharmony-arm64": - optional: true - "@rolldown/binding-wasm32-wasi": - optional: true - "@rolldown/binding-win32-arm64-msvc": - optional: true - "@rolldown/binding-win32-x64-msvc": - optional: true - bin: - rolldown: ./bin/cli.mjs - checksum: 10c0/5f9dd47b7abf203b16bc600db68542f245e974c800e59ff50b76157d1dada1403657690435b036fabca88e93d13a67c31abe5cfaa6f61ce33717f61720204cdf - languageName: node - linkType: hard - -"rollup@npm:^4.59.0": - version: 4.59.0 - resolution: "rollup@npm:4.59.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.59.0" - "@rollup/rollup-android-arm64": "npm:4.59.0" - "@rollup/rollup-darwin-arm64": "npm:4.59.0" - "@rollup/rollup-darwin-x64": "npm:4.59.0" - "@rollup/rollup-freebsd-arm64": "npm:4.59.0" - "@rollup/rollup-freebsd-x64": "npm:4.59.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.59.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.59.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.59.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.59.0" - "@rollup/rollup-linux-loong64-gnu": "npm:4.59.0" - "@rollup/rollup-linux-loong64-musl": "npm:4.59.0" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.59.0" - "@rollup/rollup-linux-ppc64-musl": "npm:4.59.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.59.0" - "@rollup/rollup-linux-riscv64-musl": "npm:4.59.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.59.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.59.0" - "@rollup/rollup-linux-x64-musl": "npm:4.59.0" - "@rollup/rollup-openbsd-x64": "npm:4.59.0" - "@rollup/rollup-openharmony-arm64": "npm:4.59.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.59.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.59.0" - "@rollup/rollup-win32-x64-gnu": "npm:4.59.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.59.0" - "@types/estree": "npm:1.0.8" - fsevents: "npm:~2.3.2" - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-freebsd-arm64": - optional: true - "@rollup/rollup-freebsd-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-loong64-gnu": - optional: true - "@rollup/rollup-linux-loong64-musl": - optional: true - "@rollup/rollup-linux-ppc64-gnu": - optional: true - "@rollup/rollup-linux-ppc64-musl": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-riscv64-musl": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-openbsd-x64": - optional: true - "@rollup/rollup-openharmony-arm64": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-gnu": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/f38742da34cfee5e899302615fa157aa77cb6a2a1495e5e3ce4cc9c540d3262e235bbe60caa31562bbfe492b01fdb3e7a8c43c39d842d3293bcf843123b766fc - languageName: node - linkType: hard - -"root-workspace-0b6124@workspace:.": - version: 0.0.0-use.local - resolution: "root-workspace-0b6124@workspace:." - dependencies: - concurrently: "npm:^9.2.1" - cross-env: "npm:^7.0.3" - dotenv-cli: "npm:^8.0.0" - languageName: unknown - linkType: soft - -"roughjs@npm:^4.6.6": - version: 4.6.6 - resolution: "roughjs@npm:4.6.6" - dependencies: - hachure-fill: "npm:^0.5.2" - path-data-parser: "npm:^0.1.0" - points-on-curve: "npm:^0.2.0" - points-on-path: "npm:^0.2.1" - checksum: 10c0/68c11bf4516aa014cef2fe52426a9bab237c2f500d13e1a4f13b523cb5723667bf2d92b9619325efdc5bc2a193588ff5af8d51683df17cfb8720e96fe2b92b0c - languageName: node - linkType: hard - -"router@npm:^2.2.0": - version: 2.2.0 - resolution: "router@npm:2.2.0" - dependencies: - debug: "npm:^4.4.0" - depd: "npm:^2.0.0" - is-promise: "npm:^4.0.0" - parseurl: "npm:^1.3.3" - path-to-regexp: "npm:^8.0.0" - checksum: 10c0/3279de7450c8eae2f6e095e9edacbdeec0abb5cb7249c6e719faa0db2dba43574b4fff5892d9220631c9abaff52dd3cad648cfea2aaace845e1a071915ac8867 - languageName: node - linkType: hard - -"rrweb-cssom@npm:^0.7.1": - version: 0.7.1 - resolution: "rrweb-cssom@npm:0.7.1" - checksum: 10c0/127b8ca6c8aac45e2755abbae6138d4a813b1bedc2caabf79466ae83ab3cfc84b5bfab513b7033f0aa4561c7753edf787d0dd01163ceacdee2e8eb1b6bf7237e - languageName: node - linkType: hard - -"rrweb-cssom@npm:^0.8.0": - version: 0.8.0 - resolution: "rrweb-cssom@npm:0.8.0" - checksum: 10c0/56f2bfd56733adb92c0b56e274c43f864b8dd48784d6fe946ef5ff8d438234015e59ad837fc2ad54714b6421384141c1add4eb569e72054e350d1f8a50b8ac7b - languageName: node - linkType: hard - -"rspack-resolver@npm:^1.1.0": - version: 1.2.2 - resolution: "rspack-resolver@npm:1.2.2" - dependencies: - "@unrs/rspack-resolver-binding-darwin-arm64": "npm:1.2.2" - "@unrs/rspack-resolver-binding-darwin-x64": "npm:1.2.2" - "@unrs/rspack-resolver-binding-freebsd-x64": "npm:1.2.2" - "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": "npm:1.2.2" - "@unrs/rspack-resolver-binding-linux-arm64-gnu": "npm:1.2.2" - "@unrs/rspack-resolver-binding-linux-arm64-musl": "npm:1.2.2" - "@unrs/rspack-resolver-binding-linux-x64-gnu": "npm:1.2.2" - "@unrs/rspack-resolver-binding-linux-x64-musl": "npm:1.2.2" - "@unrs/rspack-resolver-binding-wasm32-wasi": "npm:1.2.2" - "@unrs/rspack-resolver-binding-win32-arm64-msvc": "npm:1.2.2" - "@unrs/rspack-resolver-binding-win32-x64-msvc": "npm:1.2.2" - dependenciesMeta: - "@unrs/rspack-resolver-binding-darwin-arm64": - optional: true - "@unrs/rspack-resolver-binding-darwin-x64": - optional: true - "@unrs/rspack-resolver-binding-freebsd-x64": - optional: true - "@unrs/rspack-resolver-binding-linux-arm-gnueabihf": - optional: true - "@unrs/rspack-resolver-binding-linux-arm64-gnu": - optional: true - "@unrs/rspack-resolver-binding-linux-arm64-musl": - optional: true - "@unrs/rspack-resolver-binding-linux-x64-gnu": - optional: true - "@unrs/rspack-resolver-binding-linux-x64-musl": - optional: true - "@unrs/rspack-resolver-binding-wasm32-wasi": - optional: true - "@unrs/rspack-resolver-binding-win32-arm64-msvc": - optional: true - "@unrs/rspack-resolver-binding-win32-x64-msvc": - optional: true - checksum: 10c0/897343b6e0934b54570722f1d21ca0239eaf0bdbad9b3357cc636a9cfc775f2b28f5fea477caf800978c22efed0f312ef2893d71c7b5e84447ac1ef9c5d80f22 - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: "npm:^1.2.2" - checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 - languageName: node - linkType: hard - -"rw@npm:1": - version: 1.3.3 - resolution: "rw@npm:1.3.3" - checksum: 10c0/b1e1ef37d1e79d9dc7050787866e30b6ddcb2625149276045c262c6b4d53075ddc35f387a856a8e76f0d0df59f4cd58fe24707e40797ebee66e542b840ed6a53 - languageName: node - linkType: hard - -"rxjs@npm:7.8.2": - version: 7.8.2 - resolution: "rxjs@npm:7.8.2" - dependencies: - tslib: "npm:^2.1.0" - checksum: 10c0/1fcd33d2066ada98ba8f21fcbbcaee9f0b271de1d38dc7f4e256bfbc6ffcdde68c8bfb69093de7eeb46f24b1fb820620bf0223706cff26b4ab99a7ff7b2e2c45 - languageName: node - linkType: hard - -"safe-array-concat@npm:^1.1.3": - version: 1.1.3 - resolution: "safe-array-concat@npm:1.1.3" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.6" - has-symbols: "npm:^1.1.0" - isarray: "npm:^2.0.5" - checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"safe-push-apply@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-push-apply@npm:1.0.0" - dependencies: - es-errors: "npm:^1.3.0" - isarray: "npm:^2.0.5" - checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 - languageName: node - linkType: hard - -"safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0": - version: 1.1.0 - resolution: "safe-regex-test@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - is-regex: "npm:^1.2.1" - checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 - languageName: node - linkType: hard - -"safe-stable-stringify@npm:^2.3.1": - version: 2.5.0 - resolution: "safe-stable-stringify@npm:2.5.0" - checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"saxes@npm:^6.0.0": - version: 6.0.0 - resolution: "saxes@npm:6.0.0" - dependencies: - xmlchars: "npm:^2.2.0" - checksum: 10c0/3847b839f060ef3476eb8623d099aa502ad658f5c40fd60c105ebce86d244389b0d76fcae30f4d0c728d7705ceb2f7e9b34bb54717b6a7dbedaf5dad2d9a4b74 - languageName: node - linkType: hard - -"scheduler@npm:^0.27.0": - version: 0.27.0 - resolution: "scheduler@npm:0.27.0" - checksum: 10c0/4f03048cb05a3c8fddc45813052251eca00688f413a3cee236d984a161da28db28ba71bd11e7a3dd02f7af84ab28d39fb311431d3b3772fed557945beb00c452 - languageName: node - linkType: hard - -"schema-utils@npm:^3.0.0": - version: 3.3.0 - resolution: "schema-utils@npm:3.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.8" - ajv: "npm:^6.12.5" - ajv-keywords: "npm:^3.5.2" - checksum: 10c0/fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 - languageName: node - linkType: hard - -"scroll-into-view-if-needed@npm:^3.1.0": - version: 3.1.0 - resolution: "scroll-into-view-if-needed@npm:3.1.0" - dependencies: - compute-scroll-into-view: "npm:^3.0.2" - checksum: 10c0/1f46b090e1e04fcfdef1e384f6d7e615f9f84d4176faf4dbba7347cc0a6e491e5d578eaf4dbe9618dd3d8d38efafde58535b3e00f2a21ce4178c14be364850ff - languageName: node - linkType: hard - -"selderee@npm:^0.11.0": - version: 0.11.0 - resolution: "selderee@npm:0.11.0" - dependencies: - parseley: "npm:^0.12.0" - checksum: 10c0/c2ad8313a0dbf3c0b74752a8d03cfbc0931ae77a36679cdb64733eb732c1762f95a5174249bf7e8b8103874cb0e013a030f9c8b72f5d41e62f1d847d4a845d39 - languageName: node - linkType: hard - -"semifies@npm:^1.0.0": - version: 1.0.0 - resolution: "semifies@npm:1.0.0" - checksum: 10c0/d93d5e8d2c0b7d5f972b9378736ed5cc1f2ab40d043234b4156665872f08cb0da914ee8c8b35c59dc6b17880a4c5502588c7515c6bb4dbc3ce5565746428d31d - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 - languageName: node - linkType: hard - -"semver@npm:7.8.5, semver@npm:^7.8.5": - version: 7.8.5 - resolution: "semver@npm:7.8.5" - bin: - semver: bin/semver.js - checksum: 10c0/b1f3127a5be8125a94f37188b361c212466c292c6910adce3ec106cff5dc211ccaedc4739c11bb70fda59d6fc1f040a9bca289f4e093451521a2372e5231fe0c - languageName: node - linkType: hard - -"semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d - languageName: node - linkType: hard - -"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.6.0, semver@npm:^7.6.3": - version: 7.7.1 - resolution: "semver@npm:7.7.1" - bin: - semver: bin/semver.js - checksum: 10c0/fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 - languageName: node - linkType: hard - -"semver@npm:^7.7.2, semver@npm:^7.7.3": - version: 7.7.3 - resolution: "semver@npm:7.7.3" - bin: - semver: bin/semver.js - checksum: 10c0/4afe5c986567db82f44c8c6faef8fe9df2a9b1d98098fc1721f57c696c4c21cebd572f297fc21002f81889492345b8470473bc6f4aff5fb032a6ea59ea2bc45e - languageName: node - linkType: hard - -"send@npm:^1.1.0, send@npm:^1.2.0": - version: 1.2.0 - resolution: "send@npm:1.2.0" - dependencies: - debug: "npm:^4.3.5" - encodeurl: "npm:^2.0.0" - escape-html: "npm:^1.0.3" - etag: "npm:^1.8.1" - fresh: "npm:^2.0.0" - http-errors: "npm:^2.0.0" - mime-types: "npm:^3.0.1" - ms: "npm:^2.1.3" - on-finished: "npm:^2.4.1" - range-parser: "npm:^1.2.1" - statuses: "npm:^2.0.1" - checksum: 10c0/531bcfb5616948d3468d95a1fd0adaeb0c20818ba4a500f439b800ca2117971489e02074ce32796fd64a6772ea3e7235fe0583d8241dbd37a053dc3378eff9a5 - languageName: node - linkType: hard - -"send@npm:~0.19.0, send@npm:~0.19.1": - version: 0.19.2 - resolution: "send@npm:0.19.2" - dependencies: - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - fresh: "npm:~0.5.2" - http-errors: "npm:~2.0.1" - mime: "npm:1.6.0" - ms: "npm:2.1.3" - on-finished: "npm:~2.4.1" - range-parser: "npm:~1.2.1" - statuses: "npm:~2.0.2" - checksum: 10c0/20c2389fe0fdf3fc499938cac598bc32272287e993c4960717381a10de8550028feadfb9076f959a3a3ebdea42e1f690e116f0d16468fa56b9fd41866d3dc267 - languageName: node - linkType: hard - -"serialize-error@npm:8.1.0": - version: 8.1.0 - resolution: "serialize-error@npm:8.1.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10c0/8cfd89f43ca93e283c5f1d16178a536bdfac9bc6029f4a9df988610cc399bc4f2478d1f10ce40b9dff66b863a5158a19b438fbec929045c96d92174f6bca1e88 - languageName: node - linkType: hard - -"seroval-plugins@npm:~1.6.8": - version: 1.6.8 - resolution: "seroval-plugins@npm:1.6.8" - peerDependencies: - seroval: ^1.0 - checksum: 10c0/1510c7b977bc4e3b1a1dd2841e600ba555ac02e74a0ea0378a782dc821fb11b3578b288a4aed7a5ead9998d0a6a3f8f5ee94338a949902cbb86e11fcf0ec8949 - languageName: node - linkType: hard - -"seroval@npm:~1.6.8": - version: 1.6.8 - resolution: "seroval@npm:1.6.8" - checksum: 10c0/c65f4ca1bd712d89c70c86df41bedc8270ee33cc8365c867761a9fe6310ab3b8c0fc43a48f6c1cea3cf9b5cc362714e7325e5f9275407303e4c51dfcebeb98b2 - languageName: node - linkType: hard - -"serve-static@npm:^2.2.0": - version: 2.2.0 - resolution: "serve-static@npm:2.2.0" - dependencies: - encodeurl: "npm:^2.0.0" - escape-html: "npm:^1.0.3" - parseurl: "npm:^1.3.3" - send: "npm:^1.2.0" - checksum: 10c0/30e2ed1dbff1984836cfd0c65abf5d3f3f83bcd696c99d2d3c97edbd4e2a3ff4d3f87108a7d713640d290a7b6fe6c15ddcbc61165ab2eaad48ea8d3b52c7f913 - languageName: node - linkType: hard - -"serve-static@npm:~1.16.2": - version: 1.16.3 - resolution: "serve-static@npm:1.16.3" - dependencies: - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - parseurl: "npm:~1.3.3" - send: "npm:~0.19.1" - checksum: 10c0/36320397a073c71bedf58af48a4a100fe6d93f07459af4d6f08b9a7217c04ce2a4939e0effd842dc7bece93ffcd59eb52f58c4fff2a8e002dc29ae6b219cd42b - languageName: node - linkType: hard - -"server-only@npm:^0.0.1": - version: 0.0.1 - resolution: "server-only@npm:0.0.1" - checksum: 10c0/4704f0ef85da0be981af6d4ed8e739d39bcfd265b9c246a684060acda5642d0fdc6daffc2308e71e2682c5f508090978802eae0a77623c9b90a49f9ae68048d6 - languageName: node - linkType: hard - -"set-function-length@npm:^1.2.2": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c - languageName: node - linkType: hard - -"set-function-name@npm:^2.0.2": - version: 2.0.2 - resolution: "set-function-name@npm:2.0.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - functions-have-names: "npm:^1.2.3" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 - languageName: node - linkType: hard - -"set-proto@npm:^1.0.0": - version: 1.0.0 - resolution: "set-proto@npm:1.0.0" - dependencies: - dunder-proto: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0, setprototypeof@npm:~1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc - languageName: node - linkType: hard - -"setup-sourcebot@workspace:packages/setupWizard": - version: 0.0.0-use.local - resolution: "setup-sourcebot@workspace:packages/setupWizard" - dependencies: - "@inquirer/prompts": "npm:^8.4.3" - "@sourcebot/schemas": "workspace:^" - "@types/node": "npm:^20.19.43" - chalk: "npm:^5.6.2" - inquirer-select-pro: "npm:^1.0.0-alpha.9" - node-pty: "npm:^1.1.0" - ora: "npm:^9.4.0" - posthog-node: "npm:5.52.1" - reo-census: "npm:^1.2.10" - tsx: "npm:^4.21.0" - typescript: "npm:^5.6.2" - undici: "npm:^7" - bin: - setup-sourcebot: ./bin.cjs - languageName: unknown - linkType: soft - -"sharp@npm:^0.35.3, sharp@npm:^0.35.4": - version: 0.35.5 - resolution: "sharp@npm:0.35.5" - dependencies: - "@img/colour": "npm:^1.1.0" - "@img/sharp-darwin-arm64": "npm:0.35.5" - "@img/sharp-darwin-x64": "npm:0.35.5" - "@img/sharp-freebsd-wasm32": "npm:0.35.5" - "@img/sharp-libvips-darwin-arm64": "npm:1.3.4" - "@img/sharp-libvips-darwin-x64": "npm:1.3.4" - "@img/sharp-libvips-linux-arm": "npm:1.3.4" - "@img/sharp-libvips-linux-arm64": "npm:1.3.4" - "@img/sharp-libvips-linux-ppc64": "npm:1.3.4" - "@img/sharp-libvips-linux-riscv64": "npm:1.3.4" - "@img/sharp-libvips-linux-s390x": "npm:1.3.4" - "@img/sharp-libvips-linux-x64": "npm:1.3.4" - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.3.4" - "@img/sharp-libvips-linuxmusl-x64": "npm:1.3.4" - "@img/sharp-linux-arm": "npm:0.35.5" - "@img/sharp-linux-arm64": "npm:0.35.5" - "@img/sharp-linux-ppc64": "npm:0.35.5" - "@img/sharp-linux-riscv64": "npm:0.35.5" - "@img/sharp-linux-s390x": "npm:0.35.5" - "@img/sharp-linux-x64": "npm:0.35.5" - "@img/sharp-linuxmusl-arm64": "npm:0.35.5" - "@img/sharp-linuxmusl-x64": "npm:0.35.5" - "@img/sharp-webcontainers-wasm32": "npm:0.35.5" - "@img/sharp-win32-arm64": "npm:0.35.5" - "@img/sharp-win32-ia32": "npm:0.35.5" - "@img/sharp-win32-x64": "npm:0.35.5" - detect-libc: "npm:^2.1.2" - semver: "npm:^7.8.5" - dependenciesMeta: - "@img/sharp-darwin-arm64": - optional: true - "@img/sharp-darwin-x64": - optional: true - "@img/sharp-freebsd-wasm32": - optional: true - "@img/sharp-libvips-darwin-arm64": - optional: true - "@img/sharp-libvips-darwin-x64": - optional: true - "@img/sharp-libvips-linux-arm": - optional: true - "@img/sharp-libvips-linux-arm64": - optional: true - "@img/sharp-libvips-linux-ppc64": - optional: true - "@img/sharp-libvips-linux-riscv64": - optional: true - "@img/sharp-libvips-linux-s390x": - optional: true - "@img/sharp-libvips-linux-x64": - optional: true - "@img/sharp-libvips-linuxmusl-arm64": - optional: true - "@img/sharp-libvips-linuxmusl-x64": - optional: true - "@img/sharp-linux-arm": - optional: true - "@img/sharp-linux-arm64": - optional: true - "@img/sharp-linux-ppc64": - optional: true - "@img/sharp-linux-riscv64": - optional: true - "@img/sharp-linux-s390x": - optional: true - "@img/sharp-linux-x64": - optional: true - "@img/sharp-linuxmusl-arm64": - optional: true - "@img/sharp-linuxmusl-x64": - optional: true - "@img/sharp-webcontainers-wasm32": - optional: true - "@img/sharp-win32-arm64": - optional: true - "@img/sharp-win32-ia32": - optional: true - "@img/sharp-win32-x64": - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - checksum: 10c0/73d61270979fdb89a14d523c071662f1f557814dac62faa5491ca975e0e2b0007665456941b90356a9a511b2fba8920d9088aa7f91b4786554e12852f94a82b0 - languageName: node - linkType: hard - -"shebang-command@npm:^1.2.0": - version: 1.2.0 - resolution: "shebang-command@npm:1.2.0" - dependencies: - shebang-regex: "npm:^1.0.0" - checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e - languageName: node - linkType: hard - -"shebang-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "shebang-regex@npm:1.0.0" - checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 - languageName: node - linkType: hard - -"shell-quote@npm:^1.6.1, shell-quote@npm:^1.8.4": - version: 1.12.0 - resolution: "shell-quote@npm:1.12.0" - checksum: 10c0/1605a4ed6a758bf13de7cb8197a4184d8015f7a4dbdcd6cd4a717d5b30b3ae7666300cc4ae7f3155cf80ace9739e9e82061ee5aa1a648f53f5fab31a220816d0 - languageName: node - linkType: hard - -"shiki@npm:1.29.2, shiki@npm:^1.22.2": - version: 1.29.2 - resolution: "shiki@npm:1.29.2" - dependencies: - "@shikijs/core": "npm:1.29.2" - "@shikijs/engine-javascript": "npm:1.29.2" - "@shikijs/engine-oniguruma": "npm:1.29.2" - "@shikijs/langs": "npm:1.29.2" - "@shikijs/themes": "npm:1.29.2" - "@shikijs/types": "npm:1.29.2" - "@shikijs/vscode-textmate": "npm:^10.0.1" - "@types/hast": "npm:^3.0.4" - checksum: 10c0/9ef452021582c405501077082c4ae8d877027dca6488d2c7a1963ed661567f121b4cc5dea9dfab26689504b612b8a961f3767805cbeaaae3c1d6faa5e6f37eb0 - languageName: node - linkType: hard - -"side-channel-list@npm:^1.0.1": - version: 1.0.1 - resolution: "side-channel-list@npm:1.0.1" - dependencies: - es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.4" - checksum: 10c0/d346c787fd2f9f1c2fdea14f00e8250118db0e7596d85a6cb9faa75f105d31a73a8f7a341c93d7df2a2429098c3d37a77bd3be9e88c37094b8c01807bc77c7a2 - languageName: node - linkType: hard - -"side-channel-map@npm:^1.0.1": - version: 1.0.1 - resolution: "side-channel-map@npm:1.0.1" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.5" - object-inspect: "npm:^1.13.3" - checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 - languageName: node - linkType: hard - -"side-channel-weakmap@npm:^1.0.2": - version: 1.0.2 - resolution: "side-channel-weakmap@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.5" - object-inspect: "npm:^1.13.3" - side-channel-map: "npm:^1.0.1" - checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 - languageName: node - linkType: hard - -"side-channel@npm:^1.1.0, side-channel@npm:^1.1.1": - version: 1.1.1 - resolution: "side-channel@npm:1.1.1" - dependencies: - es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.4" - side-channel-list: "npm:^1.0.1" - side-channel-map: "npm:^1.0.1" - side-channel-weakmap: "npm:^1.0.2" - checksum: 10c0/dc0ab81d67f61bda9247d053ce93f41c3fd8ad2bdcb9cf9d8d2f8540d488f26d87a5e99ebfc07eea49ec025867b2452b705442d974b1478f0395e69f6bfb3270 - languageName: node - linkType: hard - -"siginfo@npm:^2.0.0": - version: 2.0.0 - resolution: "siginfo@npm:2.0.0" - checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 - languageName: node - linkType: hard - -"simple-git@npm:^4.0.2": - version: 4.0.2 - resolution: "simple-git@npm:4.0.2" - dependencies: - "@kwsites/file-exists": "npm:^1.1.1" - "@kwsites/promise-deferred": "npm:^1.1.1" - "@simple-git/args-pathspec": "npm:1.0.4" - "@simple-git/argv-parser": "npm:2.0.1" - debug: "npm:^4.4.0" - checksum: 10c0/d028927258fa286d9d8e462f29ec6a37a32398acd7e53cef7fc81e70636c149d7359a542d1a4f8490b342d40d98e341c35c718734aec448fc24fdee88566e981 - languageName: node - linkType: hard - -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: "npm:^0.3.1" - checksum: 10c0/df5e4662a8c750bdba69af4e8263c5d96fe4cd0f9fe4bdfa3cbdeb45d2e869dff640beaaeb1ef0e99db4d8d2ec92f85508c269f50c972174851bc1ae5bd64308 - languageName: node - linkType: hard - -"simple-update-notifier@npm:^2.0.0": - version: 2.0.0 - resolution: "simple-update-notifier@npm:2.0.0" - dependencies: - semver: "npm:^7.5.3" - checksum: 10c0/2a00bd03bfbcbf8a737c47ab230d7920f8bfb92d1159d421bdd194479f6d01ebc995d13fbe13d45dace23066a78a3dc6642999b4e3b38b847e6664191575b20c - languageName: node - linkType: hard - -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 - languageName: node - linkType: hard - -"slate-dom@npm:^0.116.0": - version: 0.116.0 - resolution: "slate-dom@npm:0.116.0" - dependencies: - "@juggle/resize-observer": "npm:^3.4.0" - direction: "npm:^1.0.4" - is-hotkey: "npm:^0.2.0" - is-plain-object: "npm:^5.0.0" - lodash: "npm:^4.17.21" - scroll-into-view-if-needed: "npm:^3.1.0" - tiny-invariant: "npm:1.3.1" - peerDependencies: - slate: ">=0.99.0" - checksum: 10c0/ad256c1ac305a5304cd2b7d82ada470ec611a3786d2da836c380ebd1c4c62054a8ab889e3b7a11484bdffd41c2caaf9c07d5df8d70687771ac87820a98ecac22 - languageName: node - linkType: hard - -"slate-history@npm:^0.113.1": - version: 0.113.1 - resolution: "slate-history@npm:0.113.1" - dependencies: - is-plain-object: "npm:^5.0.0" - peerDependencies: - slate: ">=0.65.3" - checksum: 10c0/cb3de172d391db7bfa023a1844f778b39a323c1e4b3b32e2d6ca73a0edec2ae9afd147b766d555e2f8d742716d2ed140550b1ee38e3654eebecac24fc98cc05f - languageName: node - linkType: hard - -"slate-react@npm:^0.117.1": - version: 0.117.1 - resolution: "slate-react@npm:0.117.1" - dependencies: - "@juggle/resize-observer": "npm:^3.4.0" - direction: "npm:^1.0.4" - is-hotkey: "npm:^0.2.0" - lodash: "npm:^4.17.21" - scroll-into-view-if-needed: "npm:^3.1.0" - tiny-invariant: "npm:1.3.1" - peerDependencies: - react: ">=18.2.0" - react-dom: ">=18.2.0" - slate: ">=0.114.0" - slate-dom: ">=0.116.0" - checksum: 10c0/7feed8bece3a9fb0e0d0b6c84d175c6b863bd4eaabc317173e1fa5534309416e85a12e456362644132f87416efad474ebcb6c5f4b3a52037e5a6324d5644be78 - languageName: node - linkType: hard - -"slate@npm:^0.117.0": - version: 0.117.0 - resolution: "slate@npm:0.117.0" - dependencies: - immer: "npm:^10.0.3" - tiny-warning: "npm:^1.0.3" - checksum: 10c0/7e1251bc814a7237a7b6d2f0c631a8f7ee5317d9fdb6ffa1b1d97178adc5648789d6b2059a3fb2590967799b3e6105832c4d160aa68723929ce85320a7c18701 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"smol-toml@npm:^1.7.1": - version: 1.9.0 - resolution: "smol-toml@npm:1.9.0" - checksum: 10c0/9a15a7560e15d050961f12cffab502f8b42af9d9e4713218181d10d3bda5e0265c4c81a92d6877e7d4e73145fc44d7fbc7cce997d9317b855fea974fc3bbc238 - languageName: node - linkType: hard - -"smtp-address-parser@npm:1.0.10": - version: 1.0.10 - resolution: "smtp-address-parser@npm:1.0.10" - dependencies: - nearley: "npm:^2.20.1" - checksum: 10c0/946a06d81721e8fb0ea7cb26c3726523b2a82389aee523a28ace4e913a406da63e66b2fd27d946f0cff676cc2f2f58e822783d5ec4721786a7224be3f0211b62 - languageName: node - linkType: hard - -"socket.io-adapter@npm:~2.5.2": - version: 2.5.7 - resolution: "socket.io-adapter@npm:2.5.7" - dependencies: - debug: "npm:~4.4.1" - ws: "npm:~8.20.1" - checksum: 10c0/c911e18e2a8a1cf30117d3df7f6309a6d1c802cc3cc1115606d75e0928ea270978800725d4557526bfb1853ccaa2bc33b0d221a361cd2653bdd00b7e313ffab0 - languageName: node - linkType: hard - -"socket.io-parser@npm:~4.2.4": - version: 4.2.7 - resolution: "socket.io-parser@npm:4.2.7" - dependencies: - "@socket.io/component-emitter": "npm:~3.1.0" - debug: "npm:~4.4.1" - checksum: 10c0/16a5579718b871114ca644d688987dd3cf9292010c949fb083633eefbc1d8fdaf424691d6511d746e5c10f5c88cbd8911cd0b1e807242159f40989be90842b4e - languageName: node - linkType: hard - -"socket.io@npm:^4.8.1": - version: 4.8.1 - resolution: "socket.io@npm:4.8.1" - dependencies: - accepts: "npm:~1.3.4" - base64id: "npm:~2.0.0" - cors: "npm:~2.8.5" - debug: "npm:~4.3.2" - engine.io: "npm:~6.6.0" - socket.io-adapter: "npm:~2.5.2" - socket.io-parser: "npm:~4.2.4" - checksum: 10c0/acf931a2bb235be96433b71da3d8addc63eeeaa8acabd33dc8d64e12287390a45f1e9f389a73cf7dc336961cd491679741b7a016048325c596835abbcc017ca9 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.5 - resolution: "socks-proxy-agent@npm:8.0.5" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.9 - resolution: "socks@npm:2.8.9" - dependencies: - ip-address: "npm:^10.1.1" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/2d4350c31142b0931eb1758825b426bcbf4bfb5eed682ca48bc46dc9e7d1930ec366ea574ad49fc6c1fd9e9e17ce243be0ef13e31fc4b0319d9093f1fb19743c - languageName: node - linkType: hard - -"solid-js@npm:^1.9.10": - version: 1.9.17 - resolution: "solid-js@npm:1.9.17" - dependencies: - csstype: "npm:^3.1.0" - seroval: "npm:~1.6.8" - seroval-plugins: "npm:~1.6.8" - checksum: 10c0/a41b5b8577dd30e70d9448efbe84a393fce43df00ffa258f4c1133d7e6cfe90a0d5a6ff677e204f588638a08955b47f2dfca388d6201c3c81e281ac6f9552145 - languageName: node - linkType: hard - -"source-map-js@npm:^1.2.1": - version: 1.2.2 - resolution: "source-map-js@npm:1.2.2" - checksum: 10c0/d5d6dec62266834f83dd4f8a2606a196fb1a006ca5d53b0ef80ee513b7eba2f4e2ae241f4bc129ae7e9b80dea24f6e3d92b446b7e6e96be7653cab8888168a94 - languageName: node - linkType: hard - -"source-map@npm:^0.6.0": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 - languageName: node - linkType: hard - -"space-separated-tokens@npm:^2.0.0": - version: 2.0.2 - resolution: "space-separated-tokens@npm:2.0.2" - checksum: 10c0/6173e1d903dca41dcab6a2deed8b4caf61bd13b6d7af8374713500570aa929ff9414ae09a0519f4f8772df993300305a395d4871f35bc4ca72b6db57e1f30af8 - languageName: node - linkType: hard - -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: "npm:^3.0.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.5.0 - resolution: "spdx-exceptions@npm:2.5.0" - checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: "npm:^2.1.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.21 - resolution: "spdx-license-ids@npm:3.0.21" - checksum: 10c0/ecb24c698d8496aa9efe23e0b1f751f8a7a89faedcdfcbfabae772b546c2db46ccde8f3bc447a238eb86bbcd4f73fea88720ef3b8394f7896381bec3d7736411 - languageName: node - linkType: hard - -"split@npm:0.3": - version: 0.3.3 - resolution: "split@npm:0.3.3" - dependencies: - through: "npm:2" - checksum: 10c0/88c09b1b4de84953bf5d6c153123a1fbb20addfea9381f70d27b4eb6b2bfbadf25d313f8f5d3fd727d5679b97bfe54da04766b91010f131635bf49e51d5db3fc - languageName: node - linkType: hard - -"ssri@npm:^12.0.0": - version: 12.0.0 - resolution: "ssri@npm:12.0.0" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d - languageName: node - linkType: hard - -"stable-hash@npm:^0.0.5": - version: 0.0.5 - resolution: "stable-hash@npm:0.0.5" - checksum: 10c0/ca670cb6d172f1c834950e4ec661e2055885df32fee3ebf3647c5df94993b7c2666a5dbc1c9a62ee11fc5c24928579ec5e81bb5ad31971d355d5a341aab493b3 - languageName: node - linkType: hard - -"stack-trace@npm:0.0.10, stack-trace@npm:0.0.x": - version: 0.0.10 - resolution: "stack-trace@npm:0.0.10" - checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b - languageName: node - linkType: hard - -"stackback@npm:0.0.2": - version: 0.0.2 - resolution: "stackback@npm:0.0.2" - checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 - languageName: node - linkType: hard - -"stacktrace-parser@npm:^0.1.11": - version: 0.1.11 - resolution: "stacktrace-parser@npm:0.1.11" - dependencies: - type-fest: "npm:^0.7.1" - checksum: 10c0/4633d9afe8cd2f6c7fb2cebdee3cc8de7fd5f6f9736645fd08c0f66872a303061ce9cc0ccf46f4216dc94a7941b56e331012398dc0024dc25e46b5eb5d4ff018 - languageName: node - linkType: hard - -"standard-as-callback@npm:2.1.0": - version: 2.1.0 - resolution: "standard-as-callback@npm:2.1.0" - checksum: 10c0/012677236e3d3fdc5689d29e64ea8a599331c4babe86956bf92fc5e127d53f85411c5536ee0079c52c43beb0026b5ce7aa1d834dd35dd026e82a15d1bcaead1f - languageName: node - linkType: hard - -"standardwebhooks@npm:^1.0.0": - version: 1.0.0 - resolution: "standardwebhooks@npm:1.0.0" - dependencies: - "@stablelib/base64": "npm:^1.0.0" - fast-sha256: "npm:^1.3.0" - checksum: 10c0/aee097d0f3c05172c19b80df1ed9596a2ce92f8956957650d0bbe47c2ca6d36515796b51d523333cb4a48c889b2ab130d789e7879e14975c4381bc7a61274327 - languageName: node - linkType: hard - -"statuses@npm:2.0.1, statuses@npm:^2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 - languageName: node - linkType: hard - -"statuses@npm:~2.0.1, statuses@npm:~2.0.2": - version: 2.0.2 - resolution: "statuses@npm:2.0.2" - checksum: 10c0/a9947d98ad60d01f6b26727570f3bcceb6c8fa789da64fe6889908fe2e294d57503b14bf2b5af7605c2d36647259e856635cd4c49eab41667658ec9d0080ec3f - languageName: node - linkType: hard - -"std-env@npm:^4.0.0-rc.1": - version: 4.0.0 - resolution: "std-env@npm:4.0.0" - checksum: 10c0/63b1716eae27947adde49e21b7225a0f75fb2c3d410273ae9de8333c07c7d5fc7a0628ae4c8af6b4b49b4274ed46c2bf118ed69b64f1261c9d8213d76ed1c16c - languageName: node - linkType: hard - -"stdin-discarder@npm:^0.2.2": - version: 0.2.2 - resolution: "stdin-discarder@npm:0.2.2" - checksum: 10c0/c78375e82e956d7a64be6e63c809c7f058f5303efcaf62ea48350af072bacdb99c06cba39209b45a071c1acbd49116af30df1df9abb448df78a6005b72f10537 - languageName: node - linkType: hard - -"stdin-discarder@npm:^0.3.2": - version: 0.3.2 - resolution: "stdin-discarder@npm:0.3.2" - checksum: 10c0/5dbaba9efbcb447a4450d5ae19794641ea9166abe96dc4b5547a109db1bb6e8bdb17bbe1029e02ca8d9d8ee996b7c7cbcce12b12c18c121871cd4f574292381a - languageName: node - linkType: hard - -"steno@npm:^4.0.2": - version: 4.0.2 - resolution: "steno@npm:4.0.2" - checksum: 10c0/fda6bb192bb73ce9453586080aae3fc75506e1c10c9285df49849a016bb9378c6146610f27976708437a6c5492619ec09efb9def6d5397624ae0ad70e57ccaf1 - languageName: node - linkType: hard - -"stop-iteration-iterator@npm:^1.1.0": - version: 1.1.0 - resolution: "stop-iteration-iterator@npm:1.1.0" - dependencies: - es-errors: "npm:^1.3.0" - internal-slot: "npm:^1.1.0" - checksum: 10c0/de4e45706bb4c0354a4b1122a2b8cc45a639e86206807ce0baf390ee9218d3ef181923fa4d2b67443367c491aa255c5fbaa64bb74648e3c5b48299928af86c09 - languageName: node - linkType: hard - -"stream-combiner@npm:~0.0.4": - version: 0.0.4 - resolution: "stream-combiner@npm:0.0.4" - dependencies: - duplexer: "npm:~0.1.1" - checksum: 10c0/8075a94c0eb0f20450a8236cb99d4ce3ea6e6a4b36d8baa7440b1a08cde6ffd227debadffaecd80993bd334282875d0e927ab5b88484625e01970dd251004ff5 - languageName: node - linkType: hard - -"stream-events@npm:^1.0.5": - version: 1.0.5 - resolution: "stream-events@npm:1.0.5" - dependencies: - stubs: "npm:^3.0.0" - checksum: 10c0/5d235a5799a483e94ea8829526fe9d95d76460032d5e78555fe4f801949ac6a27ea2212e4e0827c55f78726b3242701768adf2d33789465f51b31ed8ebd6b086 - languageName: node - linkType: hard - -"stream-shift@npm:^1.0.2": - version: 1.0.3 - resolution: "stream-shift@npm:1.0.3" - checksum: 10c0/939cd1051ca750d240a0625b106a2b988c45fb5a3be0cebe9a9858cb01bc1955e8c7b9fac17a9462976bea4a7b704e317c5c2200c70f0ca715a3363b9aa4fd3b - languageName: node - linkType: hard - -"string-argv@npm:^0.3.1": - version: 0.3.2 - resolution: "string-argv@npm:0.3.2" - checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca - languageName: node - linkType: hard - -"string-width@npm:^7.2.0": - version: 7.2.0 - resolution: "string-width@npm:7.2.0" - dependencies: - emoji-regex: "npm:^10.3.0" - get-east-asian-width: "npm:^1.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 - languageName: node - linkType: hard - -"string-width@npm:^8.1.0": - version: 8.2.1 - resolution: "string-width@npm:8.2.1" - dependencies: - get-east-asian-width: "npm:^1.5.0" - strip-ansi: "npm:^7.1.2" - checksum: 10c0/d467b4eaf4c40a01bb438a2620e77badd2456ffd5131c9973abe4f3acf7c802d5b21f3b6a00a5e33a7fc28ca8f9c103226e01bac61e9f259659c6f46d78e353a - languageName: node - linkType: hard - -"string.prototype.includes@npm:^2.0.1": - version: 2.0.1 - resolution: "string.prototype.includes@npm:2.0.1" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.3" - checksum: 10c0/25ce9c9b49128352a2618fbe8758b46f945817a58a4420f4799419e40a8d28f116e176c7590d767d5327a61e75c8f32c86171063f48e389b9fdd325f1bd04ee5 - languageName: node - linkType: hard - -"string.prototype.matchall@npm:^4.0.12": - version: 4.0.12 - resolution: "string.prototype.matchall@npm:4.0.12" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.6" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.6" - gopd: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - internal-slot: "npm:^1.1.0" - regexp.prototype.flags: "npm:^1.5.3" - set-function-name: "npm:^2.0.2" - side-channel: "npm:^1.1.0" - checksum: 10c0/1a53328ada73f4a77f1fdf1c79414700cf718d0a8ef6672af5603e709d26a24f2181208144aed7e858b1bcc1a0d08567a570abfb45567db4ae47637ed2c2f85c - languageName: node - linkType: hard - -"string.prototype.padend@npm:^3.0.0": - version: 3.1.6 - resolution: "string.prototype.padend@npm:3.1.6" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/8f2c8c1f3db1efcdc210668c80c87f2cea1253d6029ff296a172b5e13edc9adebeed4942d023de8d31f9b13b69f3f5d73de7141959b1f09817fba5f527e83be1 - languageName: node - linkType: hard - -"string.prototype.repeat@npm:^1.0.0": - version: 1.0.0 - resolution: "string.prototype.repeat@npm:1.0.0" - dependencies: - define-properties: "npm:^1.1.3" - es-abstract: "npm:^1.17.5" - checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40 - languageName: node - linkType: hard - -"string.prototype.trim@npm:^1.2.10": - version: 1.2.10 - resolution: "string.prototype.trim@npm:1.2.10" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" - define-data-property: "npm:^1.1.4" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-object-atoms: "npm:^1.0.0" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 - languageName: node - linkType: hard - -"string.prototype.trimend@npm:^1.0.9": - version: 1.0.9 - resolution: "string.prototype.trimend@npm:1.0.9" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 - languageName: node - linkType: hard - -"string.prototype.trimstart@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimstart@npm:1.0.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d - languageName: node - linkType: hard - -"stringify-entities@npm:^4.0.0": - version: 4.0.4 - resolution: "stringify-entities@npm:4.0.4" - dependencies: - character-entities-html4: "npm:^2.0.0" - character-entities-legacy: "npm:^3.0.0" - checksum: 10c0/537c7e656354192406bdd08157d759cd615724e9d0873602d2c9b2f6a5c0a8d0b1d73a0a08677848105c5eebac6db037b57c0b3a4ec86331117fa7319ed50448 - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 - languageName: node - linkType: hard - -"strip-ansi@npm:^7.1.0": - version: 7.1.2 - resolution: "strip-ansi@npm:7.1.2" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/0d6d7a023de33368fd042aab0bf48f4f4077abdfd60e5393e73c7c411e85e1b3a83507c11af2e656188511475776215df9ca589b4da2295c9455cc399ce1858b - languageName: node - linkType: hard - -"strip-ansi@npm:^7.1.2": - version: 7.2.0 - resolution: "strip-ansi@npm:7.2.0" - dependencies: - ansi-regex: "npm:^6.2.2" - checksum: 10c0/544d13b7582f8254811ea97db202f519e189e59d35740c46095897e254e4f1aa9fe1524a83ad6bc5ad67d4dd6c0281d2e0219ed62b880a6238a16a17d375f221 - languageName: node - linkType: hard - -"strip-bom@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-bom@npm:3.0.0" - checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 - languageName: node - linkType: hard - -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 10c0/a771a17901427bac6293fd416db7577e2bc1c34a19d38351e9d5478c3c415f523f391003b42ed475f27e33a78233035df183525395f731d3bfb8cdcbd4da08ce - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd - languageName: node - linkType: hard - -"strip-json-comments@npm:^5.0.1": - version: 5.0.1 - resolution: "strip-json-comments@npm:5.0.1" - checksum: 10c0/c9d9d55a0167c57aa688df3aa20628cf6f46f0344038f189eaa9d159978e80b2bfa6da541a40d83f7bde8a3554596259bf6b70578b2172356536a0e3fa5a0982 - languageName: node - linkType: hard - -"strnum@npm:^2.2.3": - version: 2.2.3 - resolution: "strnum@npm:2.2.3" - checksum: 10c0/1ee78101f1cd73a5b32f63cfd0be501bd246801a002f5987efef903a49e9297d1b63574e302ab3c06ee5e715c524d6cbdfef010e372ec1ea848e0179836cc208 - languageName: node - linkType: hard - -"stubborn-fs@npm:^2.0.0": - version: 2.0.0 - resolution: "stubborn-fs@npm:2.0.0" - dependencies: - stubborn-utils: "npm:^1.0.1" - checksum: 10c0/31a60c9b2a61ce380b688f2649acaeff63cb0f2503bb6820c3ccd4f3af584c6310a48efa41b40c16b1717f1728572ed887c2c88650955c776a088228797e8d0e - languageName: node - linkType: hard - -"stubborn-utils@npm:^1.0.1": - version: 1.0.2 - resolution: "stubborn-utils@npm:1.0.2" - checksum: 10c0/e65c5820d02c993df55c88e938796c2fb2f3a6d3dc247c961d1e4be4d6d88c355283f4b74157e89d1a1a761d66b5ae79560a416384241a7d3b4e8ba8f1ff5a78 - languageName: node - linkType: hard - -"stubs@npm:^3.0.0": - version: 3.0.0 - resolution: "stubs@npm:3.0.0" - checksum: 10c0/841a4ab8c76795d34aefe129185763b55fbf2e4693208215627caea4dd62e1299423dcd96f708d3128e3dfa0e669bae2cb912e6e906d7d81eaf6493196570923 - languageName: node - linkType: hard - -"style-mod@npm:^4.0.0, style-mod@npm:^4.1.0": - version: 4.1.2 - resolution: "style-mod@npm:4.1.2" - checksum: 10c0/ad4d870b3642b0e42ecc7be0e106dd14b7af11985e34fee8de34e5e38c3214bfc96fa7055acea86d75a3a59ddea3f6a8c6641001a66494d7df72d09685e3fadb - languageName: node - linkType: hard - -"style-to-js@npm:^1.0.0": - version: 1.1.17 - resolution: "style-to-js@npm:1.1.17" - dependencies: - style-to-object: "npm:1.0.9" - checksum: 10c0/429b9d5593a238d73761324e2c12f75b238f6964e12e4ecf7ea02b44c0ec1940b45c1c1fa8fac9a58637b753aa3ce973a2413b2b6da679584117f27a79e33ba3 - languageName: node - linkType: hard - -"style-to-object@npm:1.0.9": - version: 1.0.9 - resolution: "style-to-object@npm:1.0.9" - dependencies: - inline-style-parser: "npm:0.2.4" - checksum: 10c0/acc89a291ac348a57fa1d00b8eb39973ea15a6c7d7fe4b11339ea0be3b84acea3670c98aa22e166be20ca3d67e12f68f83cf114dde9d43ebb692593e859a804f - languageName: node - linkType: hard - -"styled-jsx@npm:5.1.6": - version: 5.1.6 - resolution: "styled-jsx@npm:5.1.6" - dependencies: - client-only: "npm:0.0.1" - peerDependencies: - react: ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - peerDependenciesMeta: - "@babel/core": - optional: true - babel-plugin-macros: - optional: true - checksum: 10c0/ace50e7ea5ae5ae6a3b65a50994c51fca6ae7df9c7ecfd0104c36be0b4b3a9c5c1a2374d16e2a11e256d0b20be6d47256d768ecb4f91ab390f60752a075780f5 - languageName: node - linkType: hard - -"stylis@npm:^4.3.6": - version: 4.4.0 - resolution: "stylis@npm:4.4.0" - checksum: 10c0/259be096d90dfbfe903c8656dcb7591e52a421e577e950ef42ebd9ca02f387623a1165dd08761492fb6e92a7a562d62a53a694a10b0a2f6dcd7a0db107b4bf55 - languageName: node - linkType: hard - -"sucrase@npm:^3.35.0": - version: 3.35.0 - resolution: "sucrase@npm:3.35.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.2" - commander: "npm:^4.0.0" - glob: "npm:^10.3.10" - lines-and-columns: "npm:^1.1.6" - mz: "npm:^2.7.0" - pirates: "npm:^4.0.1" - ts-interface-checker: "npm:^0.1.9" - bin: - sucrase: bin/sucrase - sucrase-node: bin/sucrase-node - checksum: 10c0/ac85f3359d2c2ecbf5febca6a24ae9bf96c931f05fde533c22a94f59c6a74895e5d5f0e871878dfd59c2697a75ebb04e4b2224ef0bfc24ca1210735c2ec191ef - languageName: node - linkType: hard - -"supports-color@npm:8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 - languageName: node - linkType: hard - -"swr@npm:^2.2.5": - version: 2.3.4 - resolution: "swr@npm:2.3.4" - dependencies: - dequal: "npm:^2.0.3" - use-sync-external-store: "npm:^1.4.0" - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/c5cf536c2652fc6b64d64d3ce232f8bbe25dcaffc688f852fb81cf06e28b59280ebebde752429d9801c3af8e7a956ee7242376a6386a599cedc0000b862a712d - languageName: node - linkType: hard - -"symbol-tree@npm:^3.2.4": - version: 3.2.4 - resolution: "symbol-tree@npm:3.2.4" - checksum: 10c0/dfbe201ae09ac6053d163578778c53aa860a784147ecf95705de0cd23f42c851e1be7889241495e95c37cabb058edb1052f141387bef68f705afc8f9dd358509 - languageName: node - linkType: hard - -"tabbable@npm:^6.0.0": - version: 6.2.0 - resolution: "tabbable@npm:6.2.0" - checksum: 10c0/ced8b38f05f2de62cd46836d77c2646c42b8c9713f5bd265daf0e78ff5ac73d3ba48a7ca45f348bafeef29b23da7187c72250742d37627883ef89cbd7fa76898 - languageName: node - linkType: hard - -"tagged-tag@npm:^1.0.0": - version: 1.0.0 - resolution: "tagged-tag@npm:1.0.0" - checksum: 10c0/91d25c9ffb86a91f20522cefb2cbec9b64caa1febe27ad0df52f08993ff60888022d771e868e6416cf2e72dab68449d2139e8709ba009b74c6c7ecd4000048d1 - languageName: node - linkType: hard - -"tailwind-merge@npm:^2.5.2": - version: 2.6.0 - resolution: "tailwind-merge@npm:2.6.0" - checksum: 10c0/fc8a5535524de9f4dacf1c16ab298581c7bb757d68a95faaf28942b1c555a619bba9d4c6726fe83986e44973b315410c1a5226e5354c30ba82353bd6d2288fa5 - languageName: node - linkType: hard - -"tailwindcss-animate@npm:^1.0.7": - version: 1.0.7 - resolution: "tailwindcss-animate@npm:1.0.7" - peerDependencies: - tailwindcss: "*" - checksum: 10c0/ec7dbd1631076b97d66a1fbaaa06e0725fccfa63119221e8d87a997b02dcede98ad88bb1ef6665b968f5d260fcefb10592e0299ca70208d365b37761edf5e19a - languageName: node - linkType: hard - -"tailwindcss@npm:^3.4.1": - version: 3.4.17 - resolution: "tailwindcss@npm:3.4.17" - dependencies: - "@alloc/quick-lru": "npm:^5.2.0" - arg: "npm:^5.0.2" - chokidar: "npm:^3.6.0" - didyoumean: "npm:^1.2.2" - dlv: "npm:^1.1.3" - fast-glob: "npm:^3.3.2" - glob-parent: "npm:^6.0.2" - is-glob: "npm:^4.0.3" - jiti: "npm:^1.21.6" - lilconfig: "npm:^3.1.3" - micromatch: "npm:^4.0.8" - normalize-path: "npm:^3.0.0" - object-hash: "npm:^3.0.0" - picocolors: "npm:^1.1.1" - postcss: "npm:^8.4.47" - postcss-import: "npm:^15.1.0" - postcss-js: "npm:^4.0.1" - postcss-load-config: "npm:^4.0.2" - postcss-nested: "npm:^6.2.0" - postcss-selector-parser: "npm:^6.1.2" - resolve: "npm:^1.22.8" - sucrase: "npm:^3.35.0" - bin: - tailwind: lib/cli.js - tailwindcss: lib/cli.js - checksum: 10c0/cc42c6e7fdf88a5507a0d7fea37f1b4122bec158977f8c017b2ae6828741f9e6f8cb90282c6bf2bd5951fd1220a53e0a50ca58f5c1c00eb7f5d9f8b80dc4523c - languageName: node - linkType: hard - -"tailwindcss@npm:^4.1.18": - version: 4.1.18 - resolution: "tailwindcss@npm:4.1.18" - checksum: 10c0/c79263cea0b2c577859b02f28284caa4eb3844e4d0f563686726ca97817c045c5c395a55bc776daaa351ba9e4aefa9a75bfbb43c22d86f3c573eecc2b87d6bf1 - languageName: node - linkType: hard - -"tar@npm:^7.4.3": - version: 7.5.22 - resolution: "tar@npm:7.5.22" - dependencies: - "@isaacs/fs-minipass": "npm:^4.0.0" - chownr: "npm:^3.0.0" - minipass: "npm:^7.1.2" - minizlib: "npm:^3.1.0" - yallist: "npm:^5.0.0" - checksum: 10c0/1311f6be85a8157ac4c9147bae43e13923d2a1aae15e4aa1bd5239e4e03d2cf53cfe103dde7f35832fbb4c938b042856bc8e9a0afd29abd05e2d1608788c4fea - languageName: node - linkType: hard - -"taskkill@npm:^5.0.0": - version: 5.0.0 - resolution: "taskkill@npm:5.0.0" - dependencies: - execa: "npm:^6.1.0" - checksum: 10c0/ba9684224806a3b0bbc1898a51125d56aa6fa16f4e9e5dfbb14bc00301151297414966067a28cb5078cb5e7db8161b9b1c95a4969d0846078f7f7582fe633e46 - languageName: node - linkType: hard - -"tdigest@npm:^0.1.1": - version: 0.1.2 - resolution: "tdigest@npm:0.1.2" - dependencies: - bintrees: "npm:1.0.2" - checksum: 10c0/10187b8144b112fcdfd3a5e4e9068efa42c990b1e30cd0d4f35ee8f58f16d1b41bc587e668fa7a6f6ca31308961cbd06cd5d4a4ae1dc388335902ae04f7d57df - languageName: node - linkType: hard - -"teeny-request@npm:^10.1.2": - version: 10.1.2 - resolution: "teeny-request@npm:10.1.2" - dependencies: - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - node-fetch: "npm:^3.3.2" - stream-events: "npm:^1.0.5" - checksum: 10c0/32cebdd723bc0bf7a10e2e6c0c7870b3e48895b8780949eab1aec8c2f7a10ccf50f2f2f66b4d520a490081b3d791b1d9746faaa510fb1fcff0eaeb1058c1fc08 - languageName: node - linkType: hard - -"text-hex@npm:1.0.x": - version: 1.0.0 - resolution: "text-hex@npm:1.0.0" - checksum: 10c0/57d8d320d92c79d7c03ffb8339b825bb9637c2cbccf14304309f51d8950015c44464b6fd1b6820a3d4821241c68825634f09f5a2d9d501e84f7c6fd14376860d - languageName: node - linkType: hard - -"thenify-all@npm:^1.0.0": - version: 1.6.0 - resolution: "thenify-all@npm:1.6.0" - dependencies: - thenify: "npm:>= 3.1.0 < 4" - checksum: 10c0/9b896a22735e8122754fe70f1d65f7ee691c1d70b1f116fda04fea103d0f9b356e3676cb789506e3909ae0486a79a476e4914b0f92472c2e093d206aed4b7d6b - languageName: node - linkType: hard - -"thenify@npm:>= 3.1.0 < 4": - version: 3.3.1 - resolution: "thenify@npm:3.3.1" - dependencies: - any-promise: "npm:^1.0.0" - checksum: 10c0/f375aeb2b05c100a456a30bc3ed07ef03a39cbdefe02e0403fb714b8c7e57eeaad1a2f5c4ecfb9ce554ce3db9c2b024eba144843cd9e344566d9fcee73b04767 - languageName: node - linkType: hard - -"throttleit@npm:2.1.0": - version: 2.1.0 - resolution: "throttleit@npm:2.1.0" - checksum: 10c0/1696ae849522cea6ba4f4f3beac1f6655d335e51b42d99215e196a718adced0069e48deaaf77f7e89f526ab31de5b5c91016027da182438e6f9280be2f3d5265 - languageName: node - linkType: hard - -"through@npm:2, through@npm:~2.3, through@npm:~2.3.1": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc - languageName: node - linkType: hard - -"tiny-invariant@npm:1.3.1": - version: 1.3.1 - resolution: "tiny-invariant@npm:1.3.1" - checksum: 10c0/5b87c1d52847d9452b60d0dcb77011b459044e0361ca8253bfe7b43d6288106e12af926adb709a6fc28900e3864349b91dad9a4ac93c39aa15f360b26c2ff4db - languageName: node - linkType: hard - -"tiny-invariant@npm:^1.3.1": - version: 1.3.3 - resolution: "tiny-invariant@npm:1.3.3" - checksum: 10c0/65af4a07324b591a059b35269cd696aba21bef2107f29b9f5894d83cc143159a204b299553435b03874ebb5b94d019afa8b8eff241c8a4cfee95872c2e1c1c4a - languageName: node - linkType: hard - -"tiny-warning@npm:^1.0.3": - version: 1.0.3 - resolution: "tiny-warning@npm:1.0.3" - checksum: 10c0/ef8531f581b30342f29670cb41ca248001c6fd7975ce22122bd59b8d62b4fc84ad4207ee7faa95cde982fa3357cd8f4be650142abc22805538c3b1392d7084fa - languageName: node - linkType: hard - -"tinybench@npm:^2.9.0": - version: 2.9.0 - resolution: "tinybench@npm:2.9.0" - checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c - languageName: node - linkType: hard - -"tinyexec@npm:^1.0.1": - version: 1.2.4 - resolution: "tinyexec@npm:1.2.4" - checksum: 10c0/153b8db6b080194b558ff145b9cffc36b80a6e07babd644dcfbe49c807eee668c876049d28bdee90b96304476f883352f2dad91b3f86bc23832532f4363e66ff - languageName: node - linkType: hard - -"tinyexec@npm:^1.0.2": - version: 1.1.1 - resolution: "tinyexec@npm:1.1.1" - checksum: 10c0/48433cb32573a767e2b63bb92343cbbae4240d05a19a63f7869f9447491305e7bd82d11daccb79b2628b596ad703a25798226c50bfd1d8e63477fb42af6a5b35 - languageName: node - linkType: hard - -"tinyexec@npm:^1.1.1": - version: 1.1.2 - resolution: "tinyexec@npm:1.1.2" - checksum: 10c0/9e0ef6c001ce54688cf16833a02f70a339276219ca947b88930b124267de2cffc764ff44e87e7369384b1d75ab63491465412cbbdf06f2437956b9ab66ab4491 - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.9": - version: 0.2.12 - resolution: "tinyglobby@npm:0.2.12" - dependencies: - fdir: "npm:^6.4.3" - picomatch: "npm:^4.0.2" - checksum: 10c0/7c9be4fd3625630e262dcb19015302aad3b4ba7fc620f269313e688f2161ea8724d6cb4444baab5ef2826eb6bed72647b169a33ec8eea37501832a2526ff540f - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.15": - version: 0.2.15 - resolution: "tinyglobby@npm:0.2.15" - dependencies: - fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.3" - checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.17": - version: 0.2.17 - resolution: "tinyglobby@npm:0.2.17" - dependencies: - fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.4" - checksum: 10c0/7f7bb0f197c88bc4b20c231e0deca4240ca3bf313a88f5a7fee93a872b84966a4d50220947c0455ad07a60b3b360961c5b7fd979222aeb716a9f99b412002e4c - languageName: node - linkType: hard - -"tinyrainbow@npm:^3.1.0": - version: 3.1.0 - resolution: "tinyrainbow@npm:3.1.0" - checksum: 10c0/f11cf387a26c5c9255bec141a90ac511b26172981b10c3e50053bc6700ea7d2336edcc4a3a21dbb8412fe7c013477d2ba4d7e4877800f3f8107be5105aad6511 - languageName: node - linkType: hard - -"tldts-core@npm:^6.1.85": - version: 6.1.85 - resolution: "tldts-core@npm:6.1.85" - checksum: 10c0/f028759b361bef86d3dd8dbaaa010b4c3aca236ec7ba097658b9a595243bb34c98206e410cc3631055af6ed34012f5da7e9af2c4e38e218d5fc693df6ab3da33 - languageName: node - linkType: hard - -"tldts@npm:^6.1.32": - version: 6.1.85 - resolution: "tldts@npm:6.1.85" - dependencies: - tldts-core: "npm:^6.1.85" - bin: - tldts: bin/cli.js - checksum: 10c0/83bc222046f36a9ca071b662e3272bb1e98e849fa4bddfab0a3eba8804a4a539b02bcbe55e1277fe713de6677e55104da2ef9a54d006c642b6e9f26c7595d5aa - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: "npm:^7.0.0" - checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 - languageName: node - linkType: hard - -"toad-cache@npm:^3.7.0": - version: 3.7.0 - resolution: "toad-cache@npm:3.7.0" - checksum: 10c0/7dae2782ee20b22c9798bb8b71dec7ec6a0091021d2ea9dd6e8afccab6b65b358fdba49a02209fac574499702e2c000660721516c87c2538d1b2c0ba03e8c0c3 - languageName: node - linkType: hard - -"toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 - languageName: node - linkType: hard - -"touch@npm:^3.1.0": - version: 3.1.1 - resolution: "touch@npm:3.1.1" - bin: - nodetouch: bin/nodetouch.js - checksum: 10c0/d2e4d269a42c846a22a29065b9af0b263de58effc85a1764bb7a2e8fc4b47700e9e2fcbd7eb1f5bffbb7c73d860f93600cef282b93ddac8f0b62321cb498b36e - languageName: node - linkType: hard - -"tough-cookie@npm:^5.0.0": - version: 5.1.2 - resolution: "tough-cookie@npm:5.1.2" - dependencies: - tldts: "npm:^6.1.32" - checksum: 10c0/5f95023a47de0f30a902bba951664b359725597d8adeabc66a0b93a931c3af801e1e697dae4b8c21a012056c0ea88bd2bf4dfe66b2adcf8e2f42cd9796fe0626 - languageName: node - linkType: hard - -"tr46@npm:^5.1.0": - version: 5.1.0 - resolution: "tr46@npm:5.1.0" - dependencies: - punycode: "npm:^2.3.1" - checksum: 10c0/d761f7144e0cb296187674ef245c74f761e334d7cf25ca73ef60e4c72c097c75051031c093fa1a2fee04b904977b316716a7915854bcae8fb1a371746513cbe8 - languageName: node - linkType: hard - -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 - languageName: node - linkType: hard - -"tree-kill@npm:1.2.2": - version: 1.2.2 - resolution: "tree-kill@npm:1.2.2" - bin: - tree-kill: cli.js - checksum: 10c0/7b1b7c7f17608a8f8d20a162e7957ac1ef6cd1636db1aba92f4e072dc31818c2ff0efac1e3d91064ede67ed5dc57c565420531a8134090a12ac10cf792ab14d2 - languageName: node - linkType: hard - -"trim-lines@npm:^3.0.0": - version: 3.0.1 - resolution: "trim-lines@npm:3.0.1" - checksum: 10c0/3a1611fa9e52aa56a94c69951a9ea15b8aaad760eaa26c56a65330dc8adf99cb282fc07cc9d94968b7d4d88003beba220a7278bbe2063328eb23fb56f9509e94 - languageName: node - linkType: hard - -"triple-beam@npm:^1.3.0, triple-beam@npm:^1.4.1": - version: 1.4.1 - resolution: "triple-beam@npm:1.4.1" - checksum: 10c0/4bf1db71e14fe3ff1c3adbe3c302f1fdb553b74d7591a37323a7badb32dc8e9c290738996cbb64f8b10dc5a3833645b5d8c26221aaaaa12e50d1251c9aba2fea - languageName: node - linkType: hard - -"trough@npm:^2.0.0": - version: 2.2.0 - resolution: "trough@npm:2.2.0" - checksum: 10c0/58b671fc970e7867a48514168894396dd94e6d9d6456aca427cc299c004fe67f35ed7172a36449086b2edde10e78a71a284ec0076809add6834fb8f857ccb9b0 - languageName: node - linkType: hard - -"ts-algebra@npm:^2.0.0": - version: 2.0.0 - resolution: "ts-algebra@npm:2.0.0" - checksum: 10c0/4ae93bec1bada635bba425854eec323dad50b6ffe86bc04ad2d7f9ce3fb129d673dcf483e19a6e70d07a3a9083e6a0a7f4e004bb8d2164cddc60cc9540ba187f - languageName: node - linkType: hard - -"ts-api-utils@npm:^2.1.0": - version: 2.1.0 - resolution: "ts-api-utils@npm:2.1.0" - peerDependencies: - typescript: ">=4.8.4" - checksum: 10c0/9806a38adea2db0f6aa217ccc6bc9c391ddba338a9fe3080676d0d50ed806d305bb90e8cef0276e793d28c8a929f400abb184ddd7ff83a416959c0f4d2ce754f - languageName: node - linkType: hard - -"ts-api-utils@npm:^2.4.0": - version: 2.4.0 - resolution: "ts-api-utils@npm:2.4.0" - peerDependencies: - typescript: ">=4.8.4" - checksum: 10c0/ed185861aef4e7124366a3f6561113557a57504267d4d452a51e0ba516a9b6e713b56b4aeaab9fa13de9db9ab755c65c8c13a777dba9133c214632cb7b65c083 - languageName: node - linkType: hard - -"ts-dedent@npm:^2.2.0": - version: 2.3.0 - resolution: "ts-dedent@npm:2.3.0" - checksum: 10c0/bfc3331e0740191c0134fb526e7f01e16657e50955c9395de14703c6ef17119c91651fa044cf558dc9c1dbb0fe1b2a74e303aeebcbd5e3b31acd14f72f545a54 - languageName: node - linkType: hard - -"ts-essentials@npm:>=10.0.0": - version: 10.1.1 - resolution: "ts-essentials@npm:10.1.1" - peerDependencies: - typescript: ">=4.5.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/8c59148a03eae086e7b1454fa6895e94e2f71385089ccda7e1f720a586749ede7e49ff7338e5f27e44a79f4bed740cc5dc3ad59313769bec028a85fa985685ff - languageName: node - linkType: hard - -"ts-interface-checker@npm:^0.1.9": - version: 0.1.13 - resolution: "ts-interface-checker@npm:0.1.13" - checksum: 10c0/232509f1b84192d07b81d1e9b9677088e590ac1303436da1e92b296e9be8e31ea042e3e1fd3d29b1742ad2c959e95afe30f63117b8f1bc3a3850070a5142fea7 - languageName: node - linkType: hard - -"tsc-watch@npm:6.2.1": - version: 6.2.1 - resolution: "tsc-watch@npm:6.2.1" - dependencies: - cross-spawn: "npm:^7.0.3" - node-cleanup: "npm:^2.1.2" - ps-tree: "npm:^1.2.0" - string-argv: "npm:^0.3.1" - peerDependencies: - typescript: "*" - bin: - tsc-watch: dist/lib/tsc-watch.js - checksum: 10c0/f5fe19e5ac9f4c42a5600c20aee9ff49e282f11813aead65ed58fa11d98a20f5a82bf4f931897270f49f6475dd54e9aab9c46a07c3801b8d237dfbe77bcf1bfc - languageName: node - linkType: hard - -"tsc-watch@npm:^6.2.0": - version: 6.3.0 - resolution: "tsc-watch@npm:6.3.0" - dependencies: - cross-spawn: "npm:^7.0.3" - node-cleanup: "npm:^2.1.2" - ps-tree: "npm:^1.2.0" - string-argv: "npm:^0.3.1" - peerDependencies: - typescript: "*" - bin: - tsc-watch: dist/lib/tsc-watch.js - checksum: 10c0/7fca4ddcb96dced095391f218a4b9d27b0046213639fc8f8133492b46d2c1b4dc797719bf4b3239cfe54a1e95c6730122467ef35b4055d2ba6cb231950c2fd54 - languageName: node - linkType: hard - -"tsconfck@npm:^3.0.3": - version: 3.1.5 - resolution: "tsconfck@npm:3.1.5" - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - bin: - tsconfck: bin/tsconfck.js - checksum: 10c0/9b62cd85d5702aa23ea50ea578d7124f3d59cc4518fcc7eacc04f4f9c9c481f720738ff8351bd4472247c0723a17dfd01af95a5b60ad623cdb8727fbe4881847 - languageName: node - linkType: hard - -"tsconfig-paths@npm:4.2.0": - version: 4.2.0 - resolution: "tsconfig-paths@npm:4.2.0" - dependencies: - json5: "npm:^2.2.2" - minimist: "npm:^1.2.6" - strip-bom: "npm:^3.0.0" - checksum: 10c0/09a5877402d082bb1134930c10249edeebc0211f36150c35e1c542e5b91f1047b1ccf7da1e59babca1ef1f014c525510f4f870de7c9bda470c73bb4e2721b3ea - languageName: node - linkType: hard - -"tsconfig-paths@npm:^3.15.0": - version: 3.15.0 - resolution: "tsconfig-paths@npm:3.15.0" - dependencies: - "@types/json5": "npm:^0.0.29" - json5: "npm:^1.0.2" - minimist: "npm:^1.2.6" - strip-bom: "npm:^3.0.0" - checksum: 10c0/5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 - languageName: node - linkType: hard - -"tslib@npm:2.8.1, tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.7.0, tslib@npm:^2.8.0, tslib@npm:^2.8.1": - version: 2.8.1 - resolution: "tslib@npm:2.8.1" - checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 - languageName: node - linkType: hard - -"tsx@npm:^4.21.0": - version: 4.21.0 - resolution: "tsx@npm:4.21.0" - dependencies: - esbuild: "npm:~0.27.0" - fsevents: "npm:~2.3.3" - get-tsconfig: "npm:^4.7.5" - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: 10c0/f5072923cd8459a1f9a26df87823a2ab5754641739d69df2a20b415f61814322b751fa6be85db7c6ec73cf68ba8fac2fd1cfc76bdb0aa86ded984d84d5d2126b - languageName: node - linkType: hard - -"tunnel@npm:0.0.6": - version: 0.0.6 - resolution: "tunnel@npm:0.0.6" - checksum: 10c0/e27e7e896f2426c1c747325b5f54efebc1a004647d853fad892b46d64e37591ccd0b97439470795e5262b5c0748d22beb4489a04a0a448029636670bfd801b75 - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: "npm:^1.2.1" - checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 - languageName: node - linkType: hard - -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 - languageName: node - linkType: hard - -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: 10c0/902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 - languageName: node - linkType: hard - -"type-fest@npm:^0.7.1": - version: 0.7.1 - resolution: "type-fest@npm:0.7.1" - checksum: 10c0/ce6b5ef806a76bf08d0daa78d65e61f24d9a0380bd1f1df36ffb61f84d14a0985c3a921923cf4b97831278cb6fa9bf1b89c751df09407e0510b14e8c081e4e0f - languageName: node - linkType: hard - -"type-fest@npm:^5.0.0": - version: 5.3.1 - resolution: "type-fest@npm:5.3.1" - dependencies: - tagged-tag: "npm:^1.0.0" - checksum: 10c0/3282cf11f5e8708321c109b5a72967702cf4c3b928b4d77f5819600b23915dc6a6b8f16cde4182cfbad308973ed3eeea544825cafe9657634ac1f331dc940315 - languageName: node - linkType: hard - -"type-is@npm:^2.0.1": - version: 2.0.1 - resolution: "type-is@npm:2.0.1" - dependencies: - content-type: "npm:^1.0.5" - media-typer: "npm:^1.1.0" - mime-types: "npm:^3.0.0" - checksum: 10c0/7f7ec0a060b16880bdad36824ab37c26019454b67d73e8a465ed5a3587440fbe158bc765f0da68344498235c877e7dbbb1600beccc94628ed05599d667951b99 - languageName: node - linkType: hard - -"type-is@npm:^2.1.0": - version: 2.1.0 - resolution: "type-is@npm:2.1.0" - dependencies: - content-type: "npm:^2.0.0" - media-typer: "npm:^1.1.0" - mime-types: "npm:^3.0.0" - checksum: 10c0/a6018f8f509de48f2c7429305e3a920e73b374fa93127dd0877ae1c2df65a5d33907caac8afb0c37a9b9fc7c49f29e3f55d668963dc845d966930b667c07f50e - languageName: node - linkType: hard - -"type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" - dependencies: - media-typer: "npm:0.3.0" - mime-types: "npm:~2.1.24" - checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d - languageName: node - linkType: hard - -"typed-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "typed-array-buffer@npm:1.0.3" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - is-typed-array: "npm:^1.1.14" - checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 - languageName: node - linkType: hard - -"typed-array-byte-length@npm:^1.0.3": - version: 1.0.3 - resolution: "typed-array-byte-length@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.8" - for-each: "npm:^0.3.3" - gopd: "npm:^1.2.0" - has-proto: "npm:^1.2.0" - is-typed-array: "npm:^1.1.14" - checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e - languageName: node - linkType: hard - -"typed-array-byte-offset@npm:^1.0.4": - version: 1.0.4 - resolution: "typed-array-byte-offset@npm:1.0.4" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - for-each: "npm:^0.3.3" - gopd: "npm:^1.2.0" - has-proto: "npm:^1.2.0" - is-typed-array: "npm:^1.1.15" - reflect.getprototypeof: "npm:^1.0.9" - checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 - languageName: node - linkType: hard - -"typed-array-length@npm:^1.0.7": - version: 1.0.7 - resolution: "typed-array-length@npm:1.0.7" - dependencies: - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - is-typed-array: "npm:^1.1.13" - possible-typed-array-names: "npm:^1.0.0" - reflect.getprototypeof: "npm:^1.0.6" - checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295 - languageName: node - linkType: hard - -"typed-rest-client@npm:2.1.0": - version: 2.1.0 - resolution: "typed-rest-client@npm:2.1.0" - dependencies: - des.js: "npm:^1.1.0" - js-md4: "npm:^0.3.2" - qs: "npm:^6.10.3" - tunnel: "npm:0.0.6" - underscore: "npm:^1.12.1" - checksum: 10c0/b9d29db5217b6d3d0ae9aa68e87e84be8c2d885e7a932f4df3eca070bb615ded5f390035f26857996911803830d28ba2296d6cb748072dbc6d8657916107132d - languageName: node - linkType: hard - -"typescript-eslint@npm:^8.46.0, typescript-eslint@npm:^8.56.1": - version: 8.56.1 - resolution: "typescript-eslint@npm:8.56.1" - dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.56.1" - "@typescript-eslint/parser": "npm:8.56.1" - "@typescript-eslint/typescript-estree": "npm:8.56.1" - "@typescript-eslint/utils": "npm:8.56.1" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/c33aeb9a8beab54308412dcd460ab60f845fee30eaed1fdc1083ff53c430a4dcbdfeac862136a21fb3a639538f8712d933fc410680c2a650e67b992720a0d9f6 - languageName: node - linkType: hard - -"typescript@npm:^5, typescript@npm:^5.6.2, typescript@npm:^5.7.3": - version: 5.8.2 - resolution: "typescript@npm:5.8.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5c4f6fbf1c6389b6928fe7b8fcd5dc73bb2d58cd4e3883f1d774ed5bd83b151cbac6b7ecf11723de56d4676daeba8713894b1e9af56174f2f9780ae7848ec3c6 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5#optional!builtin, typescript@patch:typescript@npm%3A^5.6.2#optional!builtin, typescript@patch:typescript@npm%3A^5.7.3#optional!builtin": - version: 5.8.2 - resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=5786d5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5448a08e595cc558ab321e49d4cac64fb43d1fa106584f6ff9a8d8e592111b373a995a1d5c7f3046211c8a37201eb6d0f1566f15cdb7a62a5e3be01d087848e2 - languageName: node - linkType: hard - -"ua-parser-js@npm:^1.0.33": - version: 1.0.40 - resolution: "ua-parser-js@npm:1.0.40" - bin: - ua-parser-js: script/cli.js - checksum: 10c0/2b6ac642c74323957dae142c31f72287f2420c12dced9603d989b96c132b80232779c429b296d7de4012ef8b64e0d8fadc53c639ef06633ce13d785a78b5be6c - languageName: node - linkType: hard - -"uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": - version: 2.1.0 - resolution: "uc.micro@npm:2.1.0" - checksum: 10c0/8862eddb412dda76f15db8ad1c640ccc2f47cdf8252a4a30be908d535602c8d33f9855dfcccb8b8837855c1ce1eaa563f7fa7ebe3c98fd0794351aab9b9c55fa - languageName: node - linkType: hard - -"uint8array-extras@npm:^1.5.0": - version: 1.5.0 - resolution: "uint8array-extras@npm:1.5.0" - checksum: 10c0/0e74641ac7dadb02eadefc1ccdadba6010e007757bda824960de3c72bbe2b04e6d3af75648441f412148c4103261d54fcb60be45a2863beb76643a55fddba3bd - languageName: node - linkType: hard - -"unbox-primitive@npm:^1.1.0": - version: 1.1.0 - resolution: "unbox-primitive@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - has-bigints: "npm:^1.0.2" - has-symbols: "npm:^1.1.0" - which-boxed-primitive: "npm:^1.1.1" - checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 - languageName: node - linkType: hard - -"undefsafe@npm:^2.0.5": - version: 2.0.5 - resolution: "undefsafe@npm:2.0.5" - checksum: 10c0/96c0466a5fbf395917974a921d5d4eee67bca4b30d3a31ce7e621e0228c479cf893e783a109af6e14329b52fe2f0cb4108665fad2b87b0018c0df6ac771261d5 - languageName: node - linkType: hard - -"underscore@npm:^1.12.1": - version: 1.13.8 - resolution: "underscore@npm:1.13.8" - checksum: 10c0/6677688daeda30484823e77c0b89ce4dcf29964a77d5a06f37299c007ab4bb1c66a0ff75e0d274620b62a1fe2a6ba29879f8214533ca611d71a1ae504f2bfc9b - languageName: node - linkType: hard - -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 10c0/bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 - languageName: node - linkType: hard - -"undici-types@npm:~6.19.2": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 - languageName: node - linkType: hard - -"undici-types@npm:~6.20.0": - version: 6.20.0 - resolution: "undici-types@npm:6.20.0" - checksum: 10c0/68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf - languageName: node - linkType: hard - -"undici-types@npm:~6.21.0": - version: 6.21.0 - resolution: "undici-types@npm:6.21.0" - checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 - languageName: node - linkType: hard - -"undici-types@npm:~7.16.0": - version: 7.16.0 - resolution: "undici-types@npm:7.16.0" - checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a - languageName: node - linkType: hard - -"undici@npm:^7": - version: 7.29.1 - resolution: "undici@npm:7.29.1" - checksum: 10c0/5a419b1364531071ebdfd93748f7f2392d4eb6d68dd99814e1020f8fc6a517e3298129004c871516ee204bac68aba93541f587200b04a7449b8d45683a7d86f6 - languageName: node - linkType: hard - -"unified@npm:^11.0.0": - version: 11.0.5 - resolution: "unified@npm:11.0.5" - dependencies: - "@types/unist": "npm:^3.0.0" - bail: "npm:^2.0.0" - devlop: "npm:^1.0.0" - extend: "npm:^3.0.0" - is-plain-obj: "npm:^4.0.0" - trough: "npm:^2.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/53c8e685f56d11d9d458a43e0e74328a4d6386af51c8ac37a3dcabec74ce5026da21250590d4aff6733ccd7dc203116aae2b0769abc18cdf9639a54ae528dfc9 - languageName: node - linkType: hard - -"unique-filename@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-filename@npm:4.0.0" - dependencies: - unique-slug: "npm:^5.0.0" - checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc - languageName: node - linkType: hard - -"unique-slug@npm:^5.0.0": - version: 5.0.0 - resolution: "unique-slug@npm:5.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 - languageName: node - linkType: hard - -"unist-util-is@npm:^6.0.0": - version: 6.0.0 - resolution: "unist-util-is@npm:6.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: 10c0/9419352181eaa1da35eca9490634a6df70d2217815bb5938a04af3a662c12c5607a2f1014197ec9c426fbef18834f6371bfdb6f033040fa8aa3e965300d70e7e - languageName: node - linkType: hard - -"unist-util-position@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-position@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: 10c0/dde3b31e314c98f12b4dc6402f9722b2bf35e96a4f2d463233dd90d7cde2d4928074a7a11eff0a5eb1f4e200f27fc1557e0a64a7e8e4da6558542f251b1b7400 - languageName: node - linkType: hard - -"unist-util-stringify-position@npm:^4.0.0": - version: 4.0.0 - resolution: "unist-util-stringify-position@npm:4.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - checksum: 10c0/dfe1dbe79ba31f589108cb35e523f14029b6675d741a79dea7e5f3d098785045d556d5650ec6a8338af11e9e78d2a30df12b1ee86529cded1098da3f17ee999e - languageName: node - linkType: hard - -"unist-util-visit-parents@npm:^6.0.0": - version: 6.0.1 - resolution: "unist-util-visit-parents@npm:6.0.1" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-is: "npm:^6.0.0" - checksum: 10c0/51b1a5b0aa23c97d3e03e7288f0cdf136974df2217d0999d3de573c05001ef04cccd246f51d2ebdfb9e8b0ed2704451ad90ba85ae3f3177cf9772cef67f56206 - languageName: node - linkType: hard - -"unist-util-visit@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-visit@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-is: "npm:^6.0.0" - unist-util-visit-parents: "npm:^6.0.0" - checksum: 10c0/51434a1d80252c1540cce6271a90fd1a106dbe624997c09ed8879279667fb0b2d3a685e02e92bf66598dcbe6cdffa7a5f5fb363af8fdf90dda6c855449ae39a5 - languageName: node - linkType: hard - -"universal-github-app-jwt@npm:^2.2.0": - version: 2.2.2 - resolution: "universal-github-app-jwt@npm:2.2.2" - checksum: 10c0/7ae5f031fb89c01a4407459b764c5e6341d725d436e1ceec161f9b754dd4883d9704cc8de53d5b6314b7e1bef8dbc7561799fc23001e706f213d468c17026fb6 - languageName: node - linkType: hard - -"universal-user-agent@npm:^7.0.0, universal-user-agent@npm:^7.0.2": - version: 7.0.2 - resolution: "universal-user-agent@npm:7.0.2" - checksum: 10c0/e60517ee929813e6b3ac0ceb3c66deccafadc71341edca160279ff046319c684fd7090a60d63aa61cd34a06c2d2acebeb8c2f8d364244ae7bf8ab788e20cd8c8 - languageName: node - linkType: hard - -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c - languageName: node - linkType: hard - -"unplugin@npm:2.1.0": - version: 2.1.0 - resolution: "unplugin@npm:2.1.0" - dependencies: - acorn: "npm:^8.14.0" - webpack-virtual-modules: "npm:^0.6.2" - checksum: 10c0/f41d4ee1ccc3d8478afdfb4d5f52ddd34bcd3157ebe5ac804b9c5d0afe1e3d6fad5ef44f7bbf030e8a1c671e145fcc8547be46e21d080bd9729f6e97d86f9fd3 - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.3.0": - version: 1.3.2 - resolution: "update-browserslist-db@npm:1.3.2" - dependencies: - escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.1" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10c0/837b4ea8c4934228c5c2a922ea747a54b0ec9d1c408d2fbc9220a9b98327c04109776e6ea1206fa056ea61ed8534863af472d9f2cfce569d35f04e98c95db739 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c - languageName: node - linkType: hard - -"use-callback-ref@npm:^1.3.0, use-callback-ref@npm:^1.3.3": - version: 1.3.3 - resolution: "use-callback-ref@npm:1.3.3" - dependencies: - tslib: "npm:^2.0.0" - peerDependencies: - "@types/react": "*" - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/f887488c6e6075cdad4962979da1714b217bcb1ee009a9e57ce9a844bcfc4c3a99e93983dfc2e5af9e0913824d24e730090ff255e902c516dcb58d2d3837e01c - languageName: node - linkType: hard - -"use-sidecar@npm:^1.1.2, use-sidecar@npm:^1.1.3": - version: 1.1.3 - resolution: "use-sidecar@npm:1.1.3" - dependencies: - detect-node-es: "npm:^1.1.0" - tslib: "npm:^2.0.0" - peerDependencies: - "@types/react": "*" - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/161599bf921cfaa41c85d2b01c871975ee99260f3e874c2d41c05890d41170297bdcf314bc5185e7a700de2034ac5b888e3efc8e9f35724f4918f53538d717c9 - languageName: node - linkType: hard - -"use-stick-to-bottom@npm:^1.1.3": - version: 1.1.3 - resolution: "use-stick-to-bottom@npm:1.1.3" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/60408d47b4ddac959a8f170fe9806cdea94fd8a51d3b58cbcce6246ef9babde56d1a5f1a14cb12f474d351430145464992aaac008178924c60191b6c61954bf7 - languageName: node - linkType: hard - -"use-sync-external-store@npm:^1.4.0": - version: 1.5.0 - resolution: "use-sync-external-store@npm:1.5.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10c0/1b8663515c0be34fa653feb724fdcce3984037c78dd4a18f68b2c8be55cc1a1084c578d5b75f158d41b5ddffc2bf5600766d1af3c19c8e329bb20af2ec6f52f4 - languageName: node - linkType: hard - -"usehooks-ts@npm:^3.1.0": - version: 3.1.1 - resolution: "usehooks-ts@npm:3.1.1" - dependencies: - lodash.debounce: "npm:^4.0.8" - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 || ^19.0.0-rc - checksum: 10c0/8bbebf52b063f2e705eb27364f08ec2eff987b9e8d28d82a28248652dd89ef53cb514e1f2ee1cbc6ac6e083a8dce86310301c3e92a99902b98c32a26381202d7 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 - languageName: node - linkType: hard - -"utils-merge@npm:1.0.1": - version: 1.0.1 - resolution: "utils-merge@npm:1.0.1" - checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 - languageName: node - linkType: hard - -"uuid@npm:^14.0.0": - version: 14.0.0 - resolution: "uuid@npm:14.0.0" - bin: - uuid: dist-node/bin/uuid - checksum: 10c0/a57ae7794c45005c1a9208989196c5baf79a7679c30f43c1bee9033a2c4d113a2cea216fa6fcc9663b08b0d55635df1a7c6eb7e7f3d21c3e50688c698fa39a50 - languageName: node - linkType: hard - -"valid-url@npm:^1.0.9": - version: 1.0.9 - resolution: "valid-url@npm:1.0.9" - checksum: 10c0/3995e65f9942dbcb1621754c0f9790335cec61e9e9310c0a809e9ae0e2ae91bb7fc6a471fba788e979db0418d9806639f681ecebacc869bc8c3de88efa562ee6 - languageName: node - linkType: hard - -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f - languageName: node - linkType: hard - -"vary@npm:^1, vary@npm:^1.1.2, vary@npm:~1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f - languageName: node - linkType: hard - -"vfile-location@npm:^5.0.0": - version: 5.0.3 - resolution: "vfile-location@npm:5.0.3" - dependencies: - "@types/unist": "npm:^3.0.0" - vfile: "npm:^6.0.0" - checksum: 10c0/1711f67802a5bc175ea69750d59863343ed43d1b1bb25c0a9063e4c70595e673e53e2ed5cdbb6dcdc370059b31605144d95e8c061b9361bcc2b036b8f63a4966 - languageName: node - linkType: hard - -"vfile-message@npm:^4.0.0": - version: 4.0.2 - resolution: "vfile-message@npm:4.0.2" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-stringify-position: "npm:^4.0.0" - checksum: 10c0/07671d239a075f888b78f318bc1d54de02799db4e9dce322474e67c35d75ac4a5ac0aaf37b18801d91c9f8152974ea39678aa72d7198758b07f3ba04fb7d7514 - languageName: node - linkType: hard - -"vfile@npm:^6.0.0": - version: 6.0.3 - resolution: "vfile@npm:6.0.3" - dependencies: - "@types/unist": "npm:^3.0.0" - vfile-message: "npm:^4.0.0" - checksum: 10c0/e5d9eb4810623f23758cfc2205323e33552fb5972e5c2e6587babe08fe4d24859866277404fb9e2a20afb71013860d96ec806cb257536ae463c87d70022ab9ef - languageName: node - linkType: hard - -"victory-vendor@npm:^36.6.8": - version: 36.9.2 - resolution: "victory-vendor@npm:36.9.2" - dependencies: - "@types/d3-array": "npm:^3.0.3" - "@types/d3-ease": "npm:^3.0.0" - "@types/d3-interpolate": "npm:^3.0.1" - "@types/d3-scale": "npm:^4.0.2" - "@types/d3-shape": "npm:^3.1.0" - "@types/d3-time": "npm:^3.0.0" - "@types/d3-timer": "npm:^3.0.0" - d3-array: "npm:^3.1.6" - d3-ease: "npm:^3.0.1" - d3-interpolate: "npm:^3.0.1" - d3-scale: "npm:^4.0.2" - d3-shape: "npm:^3.1.0" - d3-time: "npm:^3.0.0" - d3-timer: "npm:^3.0.1" - checksum: 10c0/bad36de3bf4d406834743c2e99a8281d786af324d7e84b7f7a2fc02c27a3779034fb0c3c4707d4c8e68683334d924a67100cfa13985235565e83b9877f8e2ffd - languageName: node - linkType: hard - -"vite-tsconfig-paths@npm:^5.1.3": - version: 5.1.4 - resolution: "vite-tsconfig-paths@npm:5.1.4" - dependencies: - debug: "npm:^4.1.1" - globrex: "npm:^0.1.2" - tsconfck: "npm:^3.0.3" - peerDependencies: - vite: "*" - peerDependenciesMeta: - vite: - optional: true - checksum: 10c0/6228f23155ea25d92b1e1702284cf8dc52ad3c683c5ca691edd5a4c82d2913e7326d00708cef1cbfde9bb226261df0e0a12e03ef1d43b6a92d8f02b483ef37e3 - languageName: node - linkType: hard - -"vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.0.16 - resolution: "vite@npm:8.0.16" - dependencies: - fsevents: "npm:~2.3.3" - lightningcss: "npm:^1.32.0" - picomatch: "npm:^4.0.4" - postcss: "npm:^8.5.15" - rolldown: "npm:1.0.3" - tinyglobby: "npm:^0.2.17" - peerDependencies: - "@types/node": ^20.19.0 || >=22.12.0 - "@vitejs/devtools": ^0.1.18 - esbuild: ^0.27.0 || ^0.28.0 - jiti: ">=1.21.0" - less: ^4.0.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: ">=0.54.8" - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - "@vitejs/devtools": - optional: true - esbuild: - optional: true - jiti: - optional: true - less: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - bin: - vite: bin/vite.js - checksum: 10c0/d75be3fbe2f63e6a8145325970338afaf0dd4d96ba9175c13f9a286fd5f95afc489401b693e4fa6c0899a4dd0e137be91cdf9401a40a635563911ad5036e3467 - languageName: node - linkType: hard - -"vitest-mock-extended@npm:^4.0.0": - version: 4.0.0 - resolution: "vitest-mock-extended@npm:4.0.0" - dependencies: - ts-essentials: "npm:>=10.0.0" - peerDependencies: - typescript: 3.x || 4.x || 5.x || 6.x - vitest: ">=4.0.0" - checksum: 10c0/c0730f1996475a1e87ef23ea637844c48caee928be65c8f9a00b53dde19805eb8df56dfc8a88fe9896092096d88172c6a3aaaae27317c7aabdc3d9fa4d5e234b - languageName: node - linkType: hard - -"vitest@npm:^4.1.4": - version: 4.1.11 - resolution: "vitest@npm:4.1.11" - dependencies: - "@vitest/expect": "npm:4.1.11" - "@vitest/mocker": "npm:4.1.11" - "@vitest/pretty-format": "npm:4.1.11" - "@vitest/runner": "npm:4.1.11" - "@vitest/snapshot": "npm:4.1.11" - "@vitest/spy": "npm:4.1.11" - "@vitest/utils": "npm:4.1.11" - es-module-lexer: "npm:^2.0.0" - expect-type: "npm:^1.3.0" - magic-string: "npm:^0.30.21" - obug: "npm:^2.1.1" - pathe: "npm:^2.0.3" - picomatch: "npm:^4.0.3" - std-env: "npm:^4.0.0-rc.1" - tinybench: "npm:^2.9.0" - tinyexec: "npm:^1.0.2" - tinyglobby: "npm:^0.2.15" - tinyrainbow: "npm:^3.1.0" - vite: "npm:^6.0.0 || ^7.0.0 || ^8.0.0" - why-is-node-running: "npm:^2.3.0" - peerDependencies: - "@edge-runtime/vm": "*" - "@opentelemetry/api": ^1.9.0 - "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 - "@vitest/browser-playwright": 4.1.11 - "@vitest/browser-preview": 4.1.11 - "@vitest/browser-webdriverio": 4.1.11 - "@vitest/coverage-istanbul": 4.1.11 - "@vitest/coverage-v8": 4.1.11 - "@vitest/ui": 4.1.11 - happy-dom: "*" - jsdom: "*" - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - "@edge-runtime/vm": - optional: true - "@opentelemetry/api": - optional: true - "@types/node": - optional: true - "@vitest/browser-playwright": - optional: true - "@vitest/browser-preview": - optional: true - "@vitest/browser-webdriverio": - optional: true - "@vitest/coverage-istanbul": - optional: true - "@vitest/coverage-v8": - optional: true - "@vitest/ui": - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vite: - optional: false - bin: - vitest: ./vitest.mjs - checksum: 10c0/3fa0948cf74adcccc8cbcdb4e6d30ada6933bdfb1816ff99200f3d3b689325b37dc483b22535b57b6d911f7a7b64eaa6a5f8da1606cfe7f2466f48000c21e296 - languageName: node - linkType: hard - -"vscode-icons-js@npm:^11.6.1": - version: 11.6.1 - resolution: "vscode-icons-js@npm:11.6.1" - dependencies: - "@types/jasmine": "npm:^3.6.3" - checksum: 10c0/bae04f20e3a981cd730f92fed29ff07f389837a12f22c7c36656f7ed005bd672d19dd2213c3db16f8dbbf9c4e0655ccb303a847616fbdb290071c7ec4dc99b99 - languageName: node - linkType: hard - -"vscode-languageserver-types@npm:^3.17.1": - version: 3.17.5 - resolution: "vscode-languageserver-types@npm:3.17.5" - checksum: 10c0/1e1260de79a2cc8de3e46f2e0182cdc94a7eddab487db5a3bd4ee716f67728e685852707d72c059721ce500447be9a46764a04f0611e94e4321ffa088eef36f8 - languageName: node - linkType: hard - -"w3c-keyname@npm:^2.2.4": - version: 2.2.8 - resolution: "w3c-keyname@npm:2.2.8" - checksum: 10c0/37cf335c90efff31672ebb345577d681e2177f7ff9006a9ad47c68c5a9d265ba4a7b39d6c2599ceea639ca9315584ce4bd9c9fbf7a7217bfb7a599e71943c4c4 - languageName: node - linkType: hard - -"w3c-xmlserializer@npm:^5.0.0": - version: 5.0.0 - resolution: "w3c-xmlserializer@npm:5.0.0" - dependencies: - xml-name-validator: "npm:^5.0.0" - checksum: 10c0/8712774c1aeb62dec22928bf1cdfd11426c2c9383a1a63f2bcae18db87ca574165a0fbe96b312b73652149167ac6c7f4cf5409f2eb101d9c805efe0e4bae798b - languageName: node - linkType: hard - -"web-namespaces@npm:^2.0.0": - version: 2.0.1 - resolution: "web-namespaces@npm:2.0.1" - checksum: 10c0/df245f466ad83bd5cd80bfffc1674c7f64b7b84d1de0e4d2c0934fb0782e0a599164e7197a4bce310ee3342fd61817b8047ff04f076a1ce12dd470584142a4bd - languageName: node - linkType: hard - -"web-streams-polyfill@npm:4.0.0-beta.3": - version: 4.0.0-beta.3 - resolution: "web-streams-polyfill@npm:4.0.0-beta.3" - checksum: 10c0/a9596779db2766990117ed3a158e0b0e9f69b887a6d6ba0779940259e95f99dc3922e534acc3e5a117b5f5905300f527d6fbf8a9f0957faf1d8e585ce3452e8e - languageName: node - linkType: hard - -"web-streams-polyfill@npm:^3.0.3": - version: 3.3.3 - resolution: "web-streams-polyfill@npm:3.3.3" - checksum: 10c0/64e855c47f6c8330b5436147db1c75cb7e7474d924166800e8e2aab5eb6c76aac4981a84261dd2982b3e754490900b99791c80ae1407a9fa0dcff74f82ea3a7f - languageName: node - linkType: hard - -"web-vitals@npm:^5.1.0": - version: 5.1.0 - resolution: "web-vitals@npm:5.1.0" - checksum: 10c0/1af22ddbe2836ba880fcb492cfba24c3349f4760ebb5e92f38324ea67bca3c4dbb9c86f1a32af4795b6115cdaf98b90000cf3a7402bffef6e8c503f0d1b2e706 - languageName: node - linkType: hard - -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db - languageName: node - linkType: hard - -"webidl-conversions@npm:^7.0.0": - version: 7.0.0 - resolution: "webidl-conversions@npm:7.0.0" - checksum: 10c0/228d8cb6d270c23b0720cb2d95c579202db3aaf8f633b4e9dd94ec2000a04e7e6e43b76a94509cdb30479bd00ae253ab2371a2da9f81446cc313f89a4213a2c4 - languageName: node - linkType: hard - -"webpack-virtual-modules@npm:^0.6.2": - version: 0.6.2 - resolution: "webpack-virtual-modules@npm:0.6.2" - checksum: 10c0/5ffbddf0e84bf1562ff86cf6fcf039c74edf09d78358a6904a09bbd4484e8bb6812dc385fe14330b715031892dcd8423f7a88278b57c9f5002c84c2860179add - languageName: node - linkType: hard - -"whatwg-encoding@npm:^3.1.1": - version: 3.1.1 - resolution: "whatwg-encoding@npm:3.1.1" - dependencies: - iconv-lite: "npm:0.6.3" - checksum: 10c0/273b5f441c2f7fda3368a496c3009edbaa5e43b71b09728f90425e7f487e5cef9eb2b846a31bd760dd8077739c26faf6b5ca43a5f24033172b003b72cf61a93e - languageName: node - linkType: hard - -"whatwg-mimetype@npm:^4.0.0": - version: 4.0.0 - resolution: "whatwg-mimetype@npm:4.0.0" - checksum: 10c0/a773cdc8126b514d790bdae7052e8bf242970cebd84af62fb2f35a33411e78e981f6c0ab9ed1fe6ec5071b09d5340ac9178e05b52d35a9c4bcf558ba1b1551df - languageName: node - linkType: hard - -"whatwg-url@npm:^14.0.0": - version: 14.2.0 - resolution: "whatwg-url@npm:14.2.0" - dependencies: - tr46: "npm:^5.1.0" - webidl-conversions: "npm:^7.0.0" - checksum: 10c0/f746fc2f4c906607d09537de1227b13f9494c171141e5427ed7d2c0dd0b6a48b43d8e71abaae57d368d0c06b673fd8ec63550b32ad5ed64990c7b0266c2b4272 - languageName: node - linkType: hard - -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: "npm:~0.0.3" - webidl-conversions: "npm:^3.0.0" - checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 - languageName: node - linkType: hard - -"when-exit@npm:^2.1.4": - version: 2.1.5 - resolution: "when-exit@npm:2.1.5" - checksum: 10c0/7db41b28c98456b784c25780ca327653f233c6eb7b25d4ce251d04519828cbd609fb6d10548caf9031d4d6fab2999d6f6911c32e1731efab24c93a522573470d - languageName: node - linkType: hard - -"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": - version: 1.1.1 - resolution: "which-boxed-primitive@npm:1.1.1" - dependencies: - is-bigint: "npm:^1.1.0" - is-boolean-object: "npm:^1.2.1" - is-number-object: "npm:^1.1.1" - is-string: "npm:^1.1.1" - is-symbol: "npm:^1.1.1" - checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe - languageName: node - linkType: hard - -"which-builtin-type@npm:^1.2.1": - version: 1.2.1 - resolution: "which-builtin-type@npm:1.2.1" - dependencies: - call-bound: "npm:^1.0.2" - function.prototype.name: "npm:^1.1.6" - has-tostringtag: "npm:^1.0.2" - is-async-function: "npm:^2.0.0" - is-date-object: "npm:^1.1.0" - is-finalizationregistry: "npm:^1.1.0" - is-generator-function: "npm:^1.0.10" - is-regex: "npm:^1.2.1" - is-weakref: "npm:^1.0.2" - isarray: "npm:^2.0.5" - which-boxed-primitive: "npm:^1.1.0" - which-collection: "npm:^1.0.2" - which-typed-array: "npm:^1.1.16" - checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 - languageName: node - linkType: hard - -"which-collection@npm:^1.0.2": - version: 1.0.2 - resolution: "which-collection@npm:1.0.2" - dependencies: - is-map: "npm:^2.0.3" - is-set: "npm:^2.0.3" - is-weakmap: "npm:^2.0.2" - is-weakset: "npm:^2.0.3" - checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.19": - version: 1.1.19 - resolution: "which-typed-array@npm:1.1.19" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.4" - for-each: "npm:^0.3.5" - get-proto: "npm:^1.0.1" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/702b5dc878addafe6c6300c3d0af5983b175c75fcb4f2a72dfc3dd38d93cf9e89581e4b29c854b16ea37e50a7d7fca5ae42ece5c273d8060dcd603b2404bbb3f - languageName: node - linkType: hard - -"which@npm:^1.2.9": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - -"which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f - languageName: node - linkType: hard - -"which@npm:^5.0.0": - version: 5.0.0 - resolution: "which@npm:5.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b - languageName: node - linkType: hard - -"why-is-node-running@npm:^2.3.0": - version: 2.3.0 - resolution: "why-is-node-running@npm:2.3.0" - dependencies: - siginfo: "npm:^2.0.0" - stackback: "npm:0.0.2" - bin: - why-is-node-running: cli.js - checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 - languageName: node - linkType: hard - -"winston-transport@npm:^4.3.0, winston-transport@npm:^4.9.0": - version: 4.9.0 - resolution: "winston-transport@npm:4.9.0" - dependencies: - logform: "npm:^2.7.0" - readable-stream: "npm:^3.6.2" - triple-beam: "npm:^1.3.0" - checksum: 10c0/e2990a172e754dbf27e7823772214a22dc8312f7ec9cfba831e5ef30a5d5528792e5ea8f083c7387ccfc5b2af20e3691f64738546c8869086110a26f98671095 - languageName: node - linkType: hard - -"winston@npm:^3.15.0": - version: 3.17.0 - resolution: "winston@npm:3.17.0" - dependencies: - "@colors/colors": "npm:^1.6.0" - "@dabh/diagnostics": "npm:^2.0.2" - async: "npm:^3.2.3" - is-stream: "npm:^2.0.0" - logform: "npm:^2.7.0" - one-time: "npm:^1.0.0" - readable-stream: "npm:^3.4.0" - safe-stable-stringify: "npm:^2.3.1" - stack-trace: "npm:0.0.x" - triple-beam: "npm:^1.3.0" - winston-transport: "npm:^4.9.0" - checksum: 10c0/ec8eaeac9a72b2598aedbff50b7dac82ce374a400ed92e7e705d7274426b48edcb25507d78cff318187c4fb27d642a0e2a39c57b6badc9af8e09d4a40636a5f7 - languageName: node - linkType: hard - -"word-wrap@npm:^1.2.5": - version: 1.2.5 - resolution: "word-wrap@npm:1.2.5" - checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da - languageName: node - linkType: hard - -"wrap-ansi@npm:^6.2.0": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - -"ws@npm:^8.18.0, ws@npm:^8.21.0": - version: 8.21.0 - resolution: "ws@npm:8.21.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/ef4a243476283fc49bc7550966c4af4aa0eef56273837211e700de3b664e08604a760cdddcb5ba43c049140e74ccfec5b0ee0bb439e08c2adf9138902fdde5f9 - languageName: node - linkType: hard - -"ws@npm:~8.21.0": - version: 8.21.3 - resolution: "ws@npm:8.21.3" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/7b28dc2863ea0e2cece68d142a3eee90361021b73f750431e6d8076bb7dede5fdfdb75b3d29534b62f411261147b76b1bc80fb5cc63ab0aabd467280e85b22e0 - languageName: node - linkType: hard - -"xcase@npm:^2.0.1": - version: 2.0.1 - resolution: "xcase@npm:2.0.1" - checksum: 10c0/11b8ae8f6734b29d442a5acf1dff3a896cabbf49e7ffa01472ff6fa687a6e6f6a25889d06c10a41950e7a90fe89239fa78d95eab0c5eb654ca75f0ccd71ba8ed - languageName: node - linkType: hard - -"xml-name-validator@npm:^5.0.0": - version: 5.0.0 - resolution: "xml-name-validator@npm:5.0.0" - checksum: 10c0/3fcf44e7b73fb18be917fdd4ccffff3639373c7cb83f8fc35df6001fecba7942f1dbead29d91ebb8315e2f2ff786b508f0c9dc0215b6353f9983c6b7d62cb1f5 - languageName: node - linkType: hard - -"xml-naming@npm:^0.1.0": - version: 0.1.0 - resolution: "xml-naming@npm:0.1.0" - checksum: 10c0/8c7614865361bcb7e53e3e091dac21c567e2b92d447919b2f072775aa9dcfc94a5255bd52fbaa0fd53c93513e53a23a6a835218ad2af512451dbc678392f85fe - languageName: node - linkType: hard - -"xmlchars@npm:^2.2.0": - version: 2.2.0 - resolution: "xmlchars@npm:2.2.0" - checksum: 10c0/b64b535861a6f310c5d9bfa10834cf49127c71922c297da9d4d1b45eeaae40bf9b4363275876088fbe2667e5db028d2cd4f8ee72eed9bede840a67d57dab7593 - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"yallist@npm:^5.0.0": - version: 5.0.0 - resolution: "yallist@npm:5.0.0" - checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 - languageName: node - linkType: hard - -"yaml@npm:^2.8.3": - version: 2.8.3 - resolution: "yaml@npm:2.8.3" - bin: - yaml: bin.mjs - checksum: 10c0/ddff0e11c1b467728d7eb4633db61c5f5de3d8e9373cf84d08fb0cdee03e1f58f02b9f1c51a4a8a865751695addbd465a77f73f1079be91fe5493b29c305fd77 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 - languageName: node - linkType: hard - -"yargs@npm:17.7.2, yargs@npm:^17.7.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f - languageName: node - linkType: hard - -"yocto-queue@npm:^1.2.1": - version: 1.2.1 - resolution: "yocto-queue@npm:1.2.1" - checksum: 10c0/5762caa3d0b421f4bdb7a1926b2ae2189fc6e4a14469258f183600028eb16db3e9e0306f46e8ebf5a52ff4b81a881f22637afefbef5399d6ad440824e9b27f9f - languageName: node - linkType: hard - -"yoctocolors@npm:^2.1.1": - version: 2.1.2 - resolution: "yoctocolors@npm:2.1.2" - checksum: 10c0/b220f30f53ebc2167330c3adc86a3c7f158bcba0236f6c67e25644c3188e2571a6014ffc1321943bb619460259d3d27eb4c9cc58c2d884c1b195805883ec7066 - languageName: node - linkType: hard - -"zod-to-json-schema@npm:^3.24.5": - version: 3.24.5 - resolution: "zod-to-json-schema@npm:3.24.5" - peerDependencies: - zod: ^3.24.1 - checksum: 10c0/0745b94ba53e652d39f262641cdeb2f75d24339fb6076a38ce55bcf53d82dfaea63adf524ebc5f658681005401687f8e9551c4feca7c4c882e123e66091dfb90 - languageName: node - linkType: hard - -"zod-to-json-schema@npm:^3.25.1": - version: 3.25.1 - resolution: "zod-to-json-schema@npm:3.25.1" - peerDependencies: - zod: ^3.25 || ^4 - checksum: 10c0/711b30e34d1f1211f1afe64bf457f0d799234199dc005cca720b236ea808804c03164039c232f5df33c46f462023874015a8a0b3aab1585eca14124c324db7e2 - languageName: node - linkType: hard - -"zod-validation-error@npm:^3.5.0 || ^4.0.0": - version: 4.0.2 - resolution: "zod-validation-error@npm:4.0.2" - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - checksum: 10c0/0ccfec48c46de1be440b719cd02044d4abb89ed0e14c13e637cd55bf29102f67ccdba373f25def0fc7130e5f15025be4d557a7edcc95d5a3811599aade689e1b - languageName: node - linkType: hard - -"zod@npm:^3.25 || ^4.0, zod@npm:^3.25.0 || ^4.0.0, zod@npm:^3.25.76 || ^4, zod@npm:^4.1.13": - version: 4.3.6 - resolution: "zod@npm:4.3.6" - checksum: 10c0/860d25a81ab41d33aa25f8d0d07b091a04acb426e605f396227a796e9e800c44723ed96d0f53a512b57be3d1520f45bf69c0cb3b378a232a00787a2609625307 - languageName: node - linkType: hard - -"zod@npm:^3.25.0, zod@npm:^3.25.76": - version: 3.25.76 - resolution: "zod@npm:3.25.76" - checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c - languageName: node - linkType: hard - -"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": - version: 2.0.4 - resolution: "zwitch@npm:2.0.4" - checksum: 10c0/3c7830cdd3378667e058ffdb4cf2bb78ac5711214e2725900873accb23f3dfe5f9e7e5a06dcdc5f29605da976fc45c26d9a13ca334d6eea2245a15e77b8fc06e - languageName: node - linkType: hard