diff --git a/.claude/commands/build-docs.md b/.claude/commands/build-docs.md index 39d622cd..4cefb6c3 100644 --- a/.claude/commands/build-docs.md +++ b/.claude/commands/build-docs.md @@ -10,14 +10,16 @@ Build and serve the `docs/` subproject locally for inspection. Stop immediately ## Workflow -Run each step sequentially from the `docs/` directory. If any step fails, stop and report the failure clearly. +Run each step sequentially from the repo root. If any step fails, stop and report the failure clearly. -1. **Install dependencies**: `cd docs && bundle install` -2. **Build site**: `cd docs && bundle exec jekyll build` +1. **Install Ruby dependencies**: `cd docs && bundle install` +2. **Build the full site**: `make docs` from the repo root. This runs the whole pipeline in order — ts-rs bindings, the generated reference docs and hosted collection bundle (`cargo run -- docs`), the shared `webcomponents/` bundle, the copy into `docs/assets/js/`, then Jekyll. 3. **Serve locally**: `cd docs && bundle exec jekyll serve` (run in background so the session remains interactive; serves on port 4000) 4. **Report**: Confirm the site is running at http://localhost:4000. Let the user know it auto-rebuilds on file changes. ## Notes +- Use `make docs`, not a bare `bundle exec jekyll build`. Jekyll alone will not regenerate the collection bundle or build the web components, so `/workflows/` pages render an empty graph canvas. +- `bun` is required for step 2 (the `webcomponents/` build). `docs/assets/js/` is a build artifact and is gitignored. - If port 4000 is already in use, report the conflict and suggest killing the existing process or using `--port` to pick a different one. - To stop the server later, kill the background Jekyll process. diff --git a/.claude/commands/new-collection.md b/.claude/commands/new-collection.md new file mode 100644 index 00000000..3cddaaca --- /dev/null +++ b/.claude/commands/new-collection.md @@ -0,0 +1,264 @@ +--- +description: Author a new Operator issuetype collection — a shareable AI workflow +allowed-tools: Bash, Read, Write, Edit, Glob, Grep +--- + +# Author a New Collection + +Create a new workflow **collection**: a named, versioned bundle of issue types that encodes a coherent process of doing software development with AI agents. + +The mechanics are easy; the design is the hard part. workflows allow agents to apply themselves in a deterministic manner. + +## Vocabulary — get this right first + +Three terms that are easy to conflate: + +| Term | What it is | +|---|---| +| **Operator workflow** | The step graph itself: an ordered set of typed steps with review gates and reject edges. Lives in an issue type's `steps`. This is the native format. | +| **Issue type** | One kind of work (`FEAT`, `PRD`, `ELVSTAGE`). Carries identity, input `fields`, and exactly one Operator workflow. | +| **Collection** | A bundle of issue types that work together. What you are authoring. | + +Kanban issue types describe how a *team labels* work; a collection describes how the *agents do* the work. + +### Other non-Operator "workflows" + +the term _"Workflow"_ is overloaded in the AI space. Operator workflows are json described collections of issuetypes. they can export to other workflows, such as `claude workflows` among others. As a result Operator workflows are meant to compose as broad and neutral as possible, with some opinions about structure and behavior. Define your workflows in the context of the work you want to get done. + +## Step 1 — Decide what loop you are encoding + +Answer these before opening an editor. If you cannot answer them crisply, the +collection is not ready to write. + +1. **What is the loop?** What repeats, and what ends it? "Implement one + right-sized story per fresh agent context" (`ralph_loop`) is a loop. + "Do software development" is not. +2. **What are the work types?** Each issue type must be a *genuinely different + shape of work*, not a different priority or label. If two types have the + same steps, they are one type with a field. +3. **Where does state live between steps?** Agents lose context. Name the + files or surfaces that carry memory forward (`workflow_hints.memory_surfaces`). +4. **What are the gates?** Where must a human or a test approve before + continuing, and what happens on rejection? +5. **When does it stop?** Both success and give-up conditions. + +Study the shipped collections before inventing a shape — they are short and +each encodes a real, published methodology: + +```bash +ls src/collections/ # simple, dev_kanban, devops_kanban, operator, + # ralph_loop, jr_orchestration, elves_overnight +cat src/collections/ralph_loop/collection.json +cat src/collections/dev_kanban/FEAT.json # the canonical multi-step example +``` + +## Step 2 — Create the directory + +Official/curated collections that ship in the binary live in +`src/collections//`. Community contributions live in +`collections/community//` and are hosted-only. + +**Pick `src/collections/` only if the collection should be available offline +to every user.** When in doubt, use `collections/community/`. + +``` +/ +├── collection.json # the manifest +├── icon.svg # Simple Icons-shaped glyph +├── .json # one per issue type — the Operator workflow +└── .md # optional ticket template per issue type +``` + +`` must match `^[a-z0-9_]{3,64}$` and equal the directory name. + +## Step 3 — Write the issue types + +One `.json` per issue type. `KEY` matches `^[A-Z][A-Z0-9_]{1,15}$` — +**no hyphens**, because the hyphen separates the key from the ticket number in +`FEAT-123-project-summary.md`. + +Start from the JSON Schema and a real example: + +```bash +cat src/schemas/issuetype_schema.json # the contract +cat src/collections/ralph_loop/STORY.json # a 5-step autonomous workflow +``` + +Required top-level fields: `key`, `name`, `description`, `mode`, `glyph`, +`fields`, `steps`. Also set `"$schema": "../../schemas/issuetype_schema.json"` +so editors validate as you type. + +- **`mode`** — `autonomous` (launch and monitor; several run in parallel) or + `paired` (needs you in the loop; one at a time). This is a real scheduling + constraint, not a hint. Choose `paired` only when a human genuinely must + participate throughout. +- **`glyph`** — one character shown in the TUI. Already in use across + collections: `! # % * > ? @ B E F J L P R S T V ~`. Pick something unused and + mnemonic. +- **`color`** — one of `cyan`, `green`, `blue`, `magenta`, `yellow`, `red`. +- **`fields`** — the ticket's inputs. Types: `string`, `text`, `enum`, `bool`, + `date`, `integer`. Use `"auto": "id" | "date" | "branch" | "status"` for + values Operator fills in, and mark those `"user_editable": false`. + +### Designing the steps + +Steps are where the methodology actually lives. Each step is one agent session. + +```jsonc +{ + "name": "plan", // lowercase identifier + "display_name": "Planning", // shown in the UI + "outputs": ["plan"], // plan|code|test|pr|ticket|review|report|documentation + "prompt": "...", // Handlebars over the ticket's fields: {{ summary }} + "allowed_tools": ["Read", "Grep"], // least privilege for this step + "artifact_patterns": [".tickets/plans/{{ id }}.md"], // files that signal completion + "review_type": "plan", // none|plan|visual|pr — a gate + "on_reject": { "goto_step": "plan", "prompt": "Plan rejected: {{ rejection_reason }}..." }, + "next_step": "build" // omit on the final step +} +``` + +Rules that matter: + +- **Chain with `next_step`.** Ordering follows the chain from the first step, + then appends anything unreached. Do not rely on array order alone. +- **`on_reject.goto_step` is the retry edge** — it may point backwards, and + usually should point at the step that can actually fix the problem (a failed + PR review goes back to `code`, not to `plan`). +- **One step, one job.** A step that plans *and* implements *and* tests gives + the agent no checkpoint and no place to fail cleanly. +- **Scope `allowed_tools` per step.** A planning step should not have `Write` + to source. This is the main safety control you have. +- **Prompts are Handlebars** over the ticket's fields. Reference only fields + you actually declared. + +Beyond plain `task` steps, these types exist — use them when the shape calls +for it, not for novelty: `classifier`, `rag`, `delegator`, `mcp`, +`multi_model` (fan out, then vote), `multi_prompt`, `matrixed`, `pipeline`. + +### Ticket templates + +`.md` is the markdown scaffold for a new ticket, with YAML frontmatter +and Handlebars placeholders. Copy the shape from an existing one: + +```bash +cat src/collections/dev_kanban/FEAT.md +``` + +## Step 4 — Write the manifest + +```jsonc +{ + "schema_version": 1, + "id": "", // must equal the directory name + "name": "Display Name", + "description": "One line. What loop is this, in plain language.", + "version": "1.0.0", + "publisher": "untra", + "author": "you-or-the-methodology-author", + "url": "https://github.com/...", // where the methodology comes from + "license": "MIT", + "tags": ["agentic-loop", "..."], + "tier": "community", // or "official" for src/collections/ + "icon_path": "icon.svg", + "created": "YYYY-MM-DD", + "updated": "YYYY-MM-DD", + "issue_types": [ // display order; also priority order + { "key": "PRD", "schema_path": "PRD.json", "template_path": "PRD.md" } + ], + "workflow_hints": { + "loop_kind": "fresh_context_story_loop", + "memory_surfaces": ["docs/plan.md"], + "review_gates": ["plan_review", "test_suite"], + "external_tools": ["git", "gh"], + "stop_conditions": ["all stories pass", "budget exhausted"], + "runner_semantics": "prompt_driven" + }, + "default_selected": ["PRD"] +} +``` + +**Do not write `checksum` or `schema_checksum`** — the docs generator computes +them at publish time. `tier: "community"` additionally requires `author`, +`url`, `license`, and `icon_path`. + +`workflow_hints` is descriptive metadata (v1 does not execute it) but it is +what the catalog page displays, so it is how a reader decides whether to adopt +your collection. Write it for them, not for the parser. + +## Step 5 — Draw the icon + +A single-path 24×24 glyph. The full rules and rationale are in +`docs/design-system/` under "Brand & collection icons"; the short version: + +```svg +Display Name +``` + +No `fill`, `stroke`, `width`, or `height` — the icon inherits `currentColor` +and its container's size. The `` must equal the manifest's `name`. + +Render it and *look at it* before trusting it — hand-authored path data is easy +to get subtly wrong, and the test checks shape, not whether the glyph reads: + +```bash +# whichever is available +rsvg-convert -w 96 -h 96 -b white <id>/icon.svg -o /tmp/icon.png +magick -background white -density 384 <id>/icon.svg /tmp/icon.png +``` + +Then open `/tmp/icon.png`. If neither tool is installed, open the SVG in a +browser. + +## Step 6 — Register it (embedded collections only) + +Skip this for `collections/community/`. For `src/collections/<id>/`, add an +entry to `EMBEDDED_COLLECTIONS` in `src/collections/mod.rs`, following the +existing entries exactly — `manifest`, `icon_svg`, and one `EmbeddedIssueType` +per key, in the same order as the manifest. + +## Step 7 — Validate + +Run these in order and fix anything that fails. Do not skip ahead. + +```bash +# Community collections: schema, key grammar, paths, attribution, referenced files +cargo test --test community_collections + +# Icon shape +cargo test --test svg_icon_standard + +# Everything: manifest parsing, embedded/manifest ordering, checksums, generators +make check + +# Publish the bundle and the catalog page +cargo run -- docs +``` + +Then look at the result: + +```bash +make docs +cd docs/_site && python3 -m http.server 4100 +``` + +Open `http://localhost:4100/workflows/` — your collection should appear as a +card — then its page, and step through each issue type's graph. **A workflow +that looks wrong as a graph is wrong.** Disconnected nodes, a reject edge +pointing somewhere useless, or a 12-step chain with no gates are all visible +at a glance and all worth fixing before shipping. + +## What good looks like + +Before opening a PR, check the collection against its own claims: + +- Could someone adopt this without reading the source? The description and + `workflow_hints` should be enough. +- Does each issue type earn its place, or is one of them a field on another? +- Does every reject edge point at a step that can actually fix the problem? +- Is `allowed_tools` scoped per step, or did every step get `["*"]`? +- Does the loop actually terminate, and is that visible in `stop_conditions`? + +Submissions are reviewed for prompt quality and safety, not just schema +validity. A good collection describes a workflow shape worth sharing: what loop +it runs, what memory it keeps, what gates it enforces, and when it stops. diff --git a/.githooks/pre-push b/.githooks/pre-push new file mode 100755 index 00000000..6a3a55f4 --- /dev/null +++ b/.githooks/pre-push @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Committed pre-push hook. Runs the fast lint gate (`make fmt clippy`) before +# any push so formatting/clippy failures are caught locally instead of on CI. +# Tests are deliberately excluded — they are too slow for a push gate; run +# `make check` or `scripts/cicdprep.sh` before opening a PR. +# +# Enable once per clone: make install-hooks (sets core.hooksPath=.githooks) +# Bypass in an emergency: git push --no-verify +set -euo pipefail + +# Resolve the repo root so the hook works regardless of the cwd at push time. +repo_root="$(git rev-parse --show-toplevel)" +cd "$repo_root" + +echo "pre-push: running lint checks (fmt + clippy)…" +if ! make fmt clippy; then + echo + echo "pre-push: lint checks failed — push aborted." >&2 + echo "Fix the issues above, or bypass with 'git push --no-verify' (not recommended)." >&2 + exit 1 +fi diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 1a8c212c..6aa25db9 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -52,15 +52,34 @@ jobs: key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: ${{ runner.os }}-cargo- + # The frontend is typed against these; generate before anything compiles. + # bindings/ is committed — the script regenerates and fails on any + # checksum difference vs the checkout (modified or newly exported types). + - name: Generate TypeScript bindings and verify they are committed + run: | + scripts/check-bindings-fresh.sh || { + echo "::error::bindings/ is out of date. Run 'make bindings' and commit the result." + exit 1 + } + - name: Setup Bun uses: oven-sh/setup-bun@v2 with: bun-version: 1.3.14 + - name: Build shared web components + run: | + cd webcomponents + bun install --frozen-lockfile + bun run typecheck + bun test + bun run build + - name: Build UI dist run: | cd ui bun install --frozen-lockfile + bun run typecheck bun run build DIST_SIZE=$(du -sb dist/ | cut -f1) echo "UI dist size: ${DIST_SIZE}B ($(echo "scale=1; $DIST_SIZE/1048576" | bc)MB uncompressed)" @@ -274,6 +293,13 @@ jobs: # Pinned to match .tool-versions bun-version: 1.3.14 + # Shared components first: ui/ imports @operator/webcomponents from its dist. + - name: Build shared web components + run: | + cd webcomponents + bun install --frozen-lockfile + bun run build + # Build embedded web UI for operator binary - name: Build UI for embedding run: | @@ -467,7 +493,6 @@ jobs: - name: Update package.json versions run: | for f in vscode-extension/package.json \ - backstage-server/package.json \ agnt-plugin/package.json \ agnt-plugin/manifest.json; do jq --arg v "${{ needs.version.outputs.version }}" '.version = $v' "$f" > tmp.json && mv tmp.json "$f" @@ -506,7 +531,6 @@ jobs: vscode-extension/src/webhook-server.ts \ opr8r/Cargo.toml opr8r/Cargo.lock \ zed-extension/Cargo.toml zed-extension/extension.toml zed-extension/Cargo.lock \ - backstage-server/package.json \ agnt-plugin/package.json agnt-plugin/manifest.json \ docs/schemas/openapi.json git commit -m "chore: bump version to v${{ needs.version.outputs.version }} [skip ci]" diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 3d5ed750..6195f076 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -10,7 +10,12 @@ on: - 'src/taxonomy/taxonomy.toml' - 'src/templates/*.json' - 'src/collections/**' + - 'collections/**' - 'src/schemas/**' + # The shared components bundle ships with the site, and the workflow + # exporter's ordering rule is mirrored by the graph mapper. + - 'webcomponents/**' + - 'src/workflow_gen/**' - '.github/workflows/docs.yml' workflow_dispatch: @@ -49,10 +54,36 @@ jobs: key: ${{ runner.os }}-cargo-docs-${{ hashFiles('**/Cargo.lock') }} restore-keys: ${{ runner.os }}-cargo-docs- - # Generate reference documentation from source-of-truth files + # The components are typed against these; generate before they compile. + - name: Generate TypeScript bindings + run: cargo test --locked export_bindings_ + + # Shared components, built before Jekyll so the site never needs a + # prebuilt bundle committed to the repo. + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: 1.3.14 + + - name: Build shared web components + working-directory: webcomponents + run: | + bun install --frozen-lockfile + bun run typecheck + bun test + bun run build + + # Generate reference documentation from source-of-truth files. After the + # components so the pipeline matches `make docs` (bindings -> + # webcomponents -> generated docs -> Jekyll). - name: Generate reference docs run: cargo run --locked -- docs + - name: Stage web components into the site + run: | + mkdir -p docs/assets/js + cp webcomponents/dist/elements.js webcomponents/dist/elements.css docs/assets/js/ + - name: Setup Ruby uses: ruby/setup-ruby@v1 with: @@ -68,6 +99,16 @@ jobs: run: bundle exec jekyll build working-directory: docs + # The hosted collection bundle is excluded from Jekyll processing (see + # docs/_config.yml) and copied in verbatim, so every file operator fetches + # matches the SHA-256 recorded in its manifest. + - name: Stage the collection bundle verbatim + run: cp -R docs/collections docs/_site/ + + - name: Verify the served bundle is byte-identical + run: | + diff -r docs/collections docs/_site/collections + - name: Deploy to gh-pages if: github.event_name == 'workflow_dispatch' uses: peaceiris/actions-gh-pages@v4 diff --git a/.github/workflows/integration-tests-matrix.yml b/.github/workflows/integration-tests-matrix.yml index 72a96a96..2e12e0b9 100644 --- a/.github/workflows/integration-tests-matrix.yml +++ b/.github/workflows/integration-tests-matrix.yml @@ -535,7 +535,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: '20' + node-version: '22' cache: 'npm' cache-dependency-path: vscode-extension/package-lock.json diff --git a/.github/workflows/vscode-extension.yaml b/.github/workflows/vscode-extension.yaml index 56f7d65a..75f63dbb 100644 --- a/.github/workflows/vscode-extension.yaml +++ b/.github/workflows/vscode-extension.yaml @@ -35,7 +35,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: '20' + node-version: '22' cache: 'npm' cache-dependency-path: vscode-extension/package-lock.json @@ -167,7 +167,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: '20' + node-version: '22' cache: 'npm' cache-dependency-path: vscode-extension/package-lock.json @@ -214,7 +214,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: '20' + node-version: '22' - name: Install vsce run: npm install -g @vscode/vsce diff --git a/.gitignore b/.gitignore index 8300859d..16b74bf1 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,10 @@ zed-extension/target/ dist/ node_modules/ +# Shared web-component bundle copied into the docs site by `make docs`. +# Built from webcomponents/ ahead of the Jekyll build; never committed. +docs/assets/js/ + # Test coverage coverage/ *.lcov @@ -42,8 +46,9 @@ docs/_site/ # built zed extension *.wasm -# vscode-extension generated types (copied from bindings/) +# generated types copied from bindings/ (bindings/ itself is committed) vscode-extension/src/generated/ +webcomponents/src/generated/ vscode-extension/out/ vscode-extension/.vscode-test/ test-output.txt diff --git a/CLAUDE.md b/CLAUDE.md index 04f85a66..92af3b3c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -18,6 +18,12 @@ Aim for functional software development with a focus on stateless, single respon ## Development Standards +1. Ask, don't assume. If something is unclear, ask before writing into a corner. Never make silent assumptions about intent, architecture or requirements. +2. Consider the simplest solution first. First attempt the simplest approach that could work, then consider abstractions and flexibility with regards to similar implementations. +3. Avoid changing unrelated code. If a file or function is not part of the current task, do not modify it. +4. Flag uncertainty explicitly. If you are not confident about an approach or technical detail, say so before proceeding. +5. I am open to ideas on better approaches or strategies. Speak up and suggest a better course if I am off-course from a better solution. + ### Mandatory Before Committing All changes MUST pass these checks before committing. Run them with `make check`, @@ -37,8 +43,9 @@ cargo test --locked # Run all tests > deprecation that only surfaces under `--all-targets`), which is how a clippy > failure can pass locally yet break CI. Always use the full command above. -Install the pre-push hook once per clone so this gate runs automatically before -every push: +Install the pre-push hook once per clone so the fast lint gate (fmt + clippy, +no tests) runs automatically before every push; the full `make check` remains +the expectation before opening a PR: ```bash make install-hooks # sets core.hooksPath=.githooks @@ -94,7 +101,7 @@ make check ```bash make check # Full CI-parity gate (fmt + clippy + test) -make install-hooks # Install the pre-push hook (once per clone) +make install-hooks # Install the lint-only pre-push hook (once per clone) cargo fmt # Format code cargo clippy --locked --all-targets --all-features -- -D warnings # Lint (CI parity) cargo test # Run all tests @@ -230,6 +237,9 @@ Operator uses a schema-driven, code-derived documentation strategy to reduce mai | `src/config.rs` | `docs/configuration/index.md` | Config structure (via schemars) | | `src/rest/` | `docs/schemas/openapi.json` | REST API spec (via utoipa) | | `src/docs_gen/llms.rs` + `docs/*/index.md` | `docs/llms.txt` | llms.txt site map for LLMs (no front matter; served verbatim) | +| `src/collections/*/collection.json` + `collections/community/*/` | `docs/collections/` | Hosted collection bundle: `index.json`, per-collection manifests, issuetype schemas, templates, icons | +| the same collection sources | `docs/collections/search.json` | Machine-readable collection catalog (also feeds the `/workflows/` page) | +| the same collection sources | `docs/workflows/` | The workflow catalog page + one page per collection | ### Regenerating Documentation @@ -242,7 +252,9 @@ cargo run -- docs --only taxonomy cargo run -- docs --only openapi cargo run -- docs --only config -# Available generators: taxonomy, issuetype, metadata, shortcuts, cli, config, openapi +# `--only` accepts any key from docs_gen::all_generators(); an unknown key +# prints the full list. `llm-tools` is opt-in only: it is excluded from a full +# run because docs/llm-tools/index.md is currently maintained by hand. ``` ### Auto-Generated File Headers @@ -258,8 +270,9 @@ All generated files include a header warning: 1. Create a struct implementing `DocGenerator` trait in `src/docs_gen/` 2. Implement `name()`, `source()`, `output_path()`, and `generate()` -3. Register in `src/docs_gen/mod.rs` `generate_all()` function -4. Add to CLI match in `src/main.rs` `cmd_docs()` +3. Register it in `src/docs_gen/mod.rs` `all_generators()` — that one list drives + the full run, the `--only` filter, and the CLI help text, so there is nothing + to add in `src/main.rs` ## Design & UI Consistency @@ -277,8 +290,16 @@ it; never re-declare a brand color elsewhere. | Docs site (Jekyll) | `docs/assets/css/main.css` | Links `tokens.css` (via `_includes/head.html`); style components with `var(--...)`, never raw hex. | | Embedded SPA (Vite/React) | `ui/src/index.css` + `*.module.css` | Imports `tokens.css`; layers app-only semantic tokens (`--surface`, `--border`, `--danger`, …) on top. Components reference semantic tokens, not raw hex. | | Ratatui TUI | `src/ui/*.rs` | Terminal can't render hex — match a **semantic role to ANSI** (danger→Red, success→Green, warning→Yellow, focus→Cyan). Reuse `color_for_key`/`glyph_for_key` from `src/templates/mod.rs`; don't re-hardcode issuetype/priority colors. | -| VS Code webview (MUI) | `vscode-extension/webview-ui/` | **Defer to the VS Code host theme** (`computeStyles.ts` → `createVSCodeTheme.ts`). Apply brand only as accents via `OPERATOR_BRAND`; never override the user's editor theme wholesale. | +| VS Code webview | `vscode-extension/webview-ui/` | **Defer to the VS Code host theme**: style with raw `var(--vscode-*)` custom properties (`styles/webview.css` + `components/primitives/`). Apply brand only as accents via the `--op-*` variables; never override the user's editor theme wholesale. No MUI/CSS-in-JS — enforced by `tests/ui_packaging.rs`. | When adding or changing UI: change a brand color in `tokens.css` (web surfaces follow automatically); reference semantic tokens in new web CSS; map a role to ANSI in the TUI; and leave the webview deferring to the editor theme. + +**Icons.** Every SVG icon follows the Operator icon standard — a single +monochrome `<path>` on a 24×24 canvas with no `fill`/`stroke`/`width`/`height`, +so it tints from `currentColor` and sizes to its container on all four +surfaces. Governed directories: `icons/`, `docs/assets/icons/`, +`ui/public/icons/`, and each collection's `icon.svg`. Enforced by +`cargo test --test svg_icon_standard`; the rules and rationale are in +`docs/design-system/`. diff --git a/Cargo.lock b/Cargo.lock index 3d5d93c4..36cce719 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,45 +10,47 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "agent-client-protocol" -version = "0.14.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efba6592048ef8a9ac97de8d79b2d9933d8ac4d94f7a2de102348fed0c61103" +checksum = "6d87bc7769eba641753ba5dc52f73ec3765d51022c6753bf040967125ddc86a8" dependencies = [ "agent-client-protocol-derive", "agent-client-protocol-schema", + "async-io", "async-process", "blocking", "futures", "futures-concurrency", - "jsonrpcmsg", "rustc-hash", - "schemars 1.2.1", + "rustix 1.1.4", + "schemars 1.2.2", "serde", "serde_json", "shell-words", "tracing", "uuid", + "windows-sys 0.61.2", ] [[package]] name = "agent-client-protocol-derive" -version = "0.14.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d176a10d4cb06e0262a738c3c5bf21ff0968db13a666e31cbca94a3d3d72e7c" +checksum = "3abd4080f51e4f24f5042beb7fb7a66ede29a2dc1c2582c329532e1c27264ddc" dependencies = [ "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "agent-client-protocol-schema" -version = "0.13.6" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c290bfa00c6b52339db66f8e9cf711d5f08530800529f7d619ff24d6cba253d0" +checksum = "d5c231915b4ab578c722eca2d1bd7df4d300bfd6cac3b8e9f0d1e3ddc95b187c" dependencies = [ "anyhow", "derive_more", - "schemars 1.2.1", + "schemars 1.2.2", "serde", "serde_json", "serde_with", @@ -132,9 +134,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "arbitrary" @@ -244,7 +246,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -273,13 +275,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -347,28 +349,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "axum-extra" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9963ff19f40c6102c76756ef0a46004c0d58957d87259fc9208ff8441c12ab96" -dependencies = [ - "axum", - "axum-core", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "serde_core", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "axum-macros" version = "0.5.1" @@ -377,7 +357,7 @@ checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -405,22 +385,13 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" dependencies = [ "serde_core", ] -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.12.1" @@ -469,9 +440,9 @@ checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "cassowary" @@ -490,9 +461,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.62" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" dependencies = [ "find-msvc-tools", "shlex", @@ -506,9 +477,20 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core", +] [[package]] name = "chrono" @@ -526,9 +508,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.1" +version = "4.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" +checksum = "301b56658598e48f3648647ac6fc887be7e7108eddfa4e9b63fcf3ec58c0cadf" dependencies = [ "clap_builder", "clap_derive", @@ -536,9 +518,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.6.0" +version = "4.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" +checksum = "94a65403d1a1bd28f7dc68eb8506e8874808ee5eecb59298de588e2e1407a078" dependencies = [ "anstream", "anstyle", @@ -548,14 +530,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.1" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -572,9 +554,9 @@ checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "compact_str" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" +checksum = "7fd622ebbb56a5b2ccb651b32b911cdeb2a9b4b11776b2473bf26a26a286244e" dependencies = [ "castaway", "cfg-if", @@ -595,9 +577,9 @@ dependencies = [ [[package]] name = "config" -version = "0.15.23" +version = "0.15.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f316c6237b2d38be61949ecd15268a4c6ca32570079394a2444d9ce2c72a72d8" +checksum = "b85f248a4de22d204ceabc6299d89d2c70fbd7f09fea53c06c852369652d8139" dependencies = [ "async-trait", "convert_case 0.6.0", @@ -683,15 +665,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - [[package]] name = "cpufeatures" version = "0.3.0" @@ -712,18 +685,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crossterm" @@ -731,7 +704,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "crossterm_winapi", "mio", "parking_lot", @@ -756,16 +729,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - [[package]] name = "crypto-common" version = "0.2.2" @@ -806,7 +769,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.119", ] [[package]] @@ -819,7 +782,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.119", ] [[package]] @@ -830,7 +793,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -841,7 +804,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core 0.23.0", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -850,7 +813,6 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", "serde_core", ] @@ -862,7 +824,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -883,7 +845,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -893,7 +855,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn", + "syn 2.0.119", ] [[package]] @@ -915,29 +877,19 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 2.0.119", "unicode-xid", ] -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "crypto-common 0.1.7", -] - [[package]] name = "digest" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ - "block-buffer 0.12.1", + "block-buffer", "const-oid", - "crypto-common 0.2.2", + "crypto-common", ] [[package]] @@ -988,19 +940,19 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "objc2", ] [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -1020,9 +972,9 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" [[package]] name = "encoding_rs" @@ -1057,7 +1009,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1089,11 +1041,10 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.4.1" +version = "5.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" dependencies = [ - "concurrent-queue", "parking", "pin-project-lite", ] @@ -1110,9 +1061,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "filetime" @@ -1200,9 +1151,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" dependencies = [ "futures-channel", "futures-core", @@ -1215,9 +1166,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" dependencies = [ "futures-core", "futures-sink", @@ -1238,15 +1189,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" [[package]] name = "futures-executor" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" dependencies = [ "futures-core", "futures-task", @@ -1255,9 +1206,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" [[package]] name = "futures-lite" @@ -1274,32 +1225,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" dependencies = [ "futures-channel", "futures-core", @@ -1312,16 +1263,6 @@ dependencies = [ "slab", ] -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - [[package]] name = "getrandom" version = "0.2.17" @@ -1337,36 +1278,23 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi 5.3.0", - "wasip2", + "r-efi", + "rand_core", "wasm-bindgen", ] -[[package]] -name = "getrandom" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" -dependencies = [ - "cfg-if", - "libc", - "r-efi 6.0.0", - "wasip2", - "wasip3", -] - [[package]] name = "glob" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" [[package]] name = "gloo-timers" @@ -1382,9 +1310,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", @@ -1401,9 +1329,9 @@ dependencies = [ [[package]] name = "handlebars" -version = "6.4.1" +version = "6.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43ccdfe15a81ab0a8af639e90254227c9a46afd9c5f5b6ec7efaa345c4b0f00" +checksum = "4633d16a2350341713c379d6d06a4b9e1845329386026a49ce4fd09c2f3b16f6" dependencies = [ "derive_builder", "log", @@ -1412,7 +1340,7 @@ dependencies = [ "pest_derive", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -1482,9 +1410,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", "itoa", @@ -1492,9 +1420,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", "http", @@ -1502,9 +1430,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", @@ -1527,18 +1455,18 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" dependencies = [ "typenum", ] [[package]] name = "hyper" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", @@ -1719,12 +1647,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "ident_case" version = "1.0.1" @@ -1797,20 +1719,20 @@ dependencies = [ [[package]] name = "inotify" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533e68a5842e734946fe159fb03fc9bbbb254f590dd0d8ad321ae5ff7beca2c1" +checksum = "153be1941a183ec9ccd095ddbe17a8b8d435ef6c76e9e02451b933c3999af2c8" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "inotify-sys", "libc", ] [[package]] name = "inotify-sys" -version = "0.1.5" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +checksum = "c033f80b2c113cdf91ab7a33faa9cbc014726dcad99880c8609af2a370edf37d" dependencies = [ "libc", ] @@ -1825,7 +1747,7 @@ dependencies = [ "indoc", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -1866,13 +1788,12 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.99" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] @@ -1887,21 +1808,11 @@ dependencies = [ "serde", ] -[[package]] -name = "jsonrpcmsg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d833a15225c779251e13929203518c2ff26e2fe0f322d584b213f4f4dad37bd" -dependencies = [ - "serde", - "serde_json", -] - [[package]] name = "kqueue" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" dependencies = [ "kqueue-sys", "libc", @@ -1913,7 +1824,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "libc", ] @@ -1923,23 +1834,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ "libc", ] @@ -1973,9 +1878,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.30" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "lru" @@ -1994,9 +1899,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "mac-notification-sys" -version = "0.6.14" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04fd0110fd05744c3c904acf1a8ca624a721d75a35638f127cd5fb6b7ccfb1bf" +checksum = "fd604973958ddcc11b561193c0fb96ba146506ef2f231ef2e7c35fd2cbc9beca" dependencies = [ "cc", "log", @@ -2023,9 +1928,9 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memoffset" @@ -2064,9 +1969,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "log", @@ -2097,7 +2002,7 @@ version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "filetime", "fsevent-sys", "inotify 0.10.2", @@ -2116,9 +2021,9 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "fsevent-sys", - "inotify 0.11.2", + "inotify 0.11.4", "kqueue", "libc", "log", @@ -2130,9 +2035,9 @@ dependencies = [ [[package]] name = "notify-rust" -version = "4.17.0" +version = "4.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50ff2e74231b72c832d82982193b417f230945be6bdb5575b251d941d31adb00" +checksum = "c5b4c1b4f2aa9f25f63a7a49d3dd0ed567b3670da15330a66b29434be899b891" dependencies = [ "futures-lite", "log", @@ -2157,7 +2062,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] @@ -2186,9 +2091,9 @@ checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-modular" -version = "0.6.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" +checksum = "fc41a1374056e9672221567958a66c16be12d0e2c1b408761e14d901c237d5e0" [[package]] name = "num-order" @@ -2223,7 +2128,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "dispatch2", "objc2", ] @@ -2240,7 +2145,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "block2", "libc", "objc2", @@ -2282,11 +2187,11 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.80" +version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "cfg-if", "foreign-types", "libc", @@ -2302,7 +2207,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2313,9 +2218,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.116" +version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" dependencies = [ "cc", "libc", @@ -2331,7 +2236,6 @@ dependencies = [ "anyhow", "async-trait", "axum", - "axum-extra", "backon", "chrono", "clap", @@ -2354,19 +2258,19 @@ dependencies = [ "regex", "reqwest", "rust-embed", - "schemars 1.2.1", + "schemars 1.2.2", "serde", "serde_json", "serde_yaml", - "sha2 0.11.0", + "sha2", "sysinfo", "tempfile", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tokio-stream", "toml", "tower", - "tower-http", + "tower-http 0.7.0", "tracing", "tracing-appender", "tracing-subscriber", @@ -2469,9 +2373,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.6" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +checksum = "7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2" dependencies = [ "memchr", "ucd-trie", @@ -2479,9 +2383,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.6" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" +checksum = "9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd" dependencies = [ "pest", "pest_generator", @@ -2489,25 +2393,24 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.6" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" +checksum = "6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "pest_meta" -version = "2.8.6" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" +checksum = "85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c" dependencies = [ "pest", - "sha2 0.10.9", ] [[package]] @@ -2527,7 +2430,7 @@ checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -2582,25 +2485,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn", -] - [[package]] name = "proc-macro-crate" version = "3.5.0" @@ -2612,27 +2496,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] -[[package]] -name = "quick-xml" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" -dependencies = [ - "memchr", -] - [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -2642,7 +2517,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tracing", "web-time", @@ -2650,20 +2525,21 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", "rand", + "rand_pcg", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.19", "tinyvec", "tracing", "web-time", @@ -2671,33 +2547,27 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.45" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "r-efi" version = "6.0.0" @@ -2706,31 +2576,28 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.9.4" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ - "rand_chacha", + "chacha20", + "getrandom 0.4.3", "rand_core", ] [[package]] -name = "rand_chacha" -version = "0.9.0" +name = "rand_core" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core", -] +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] -name = "rand_core" -version = "0.9.5" +name = "rand_pcg" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" dependencies = [ - "getrandom 0.3.4", + "rand_core", ] [[package]] @@ -2739,7 +2606,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "cassowary", "compact_str", "crossterm", @@ -2760,7 +2627,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] @@ -2782,34 +2649,34 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "regex" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -2819,9 +2686,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", @@ -2830,9 +2697,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" @@ -2871,7 +2738,7 @@ dependencies = [ "tokio-native-tls", "tokio-rustls", "tower", - "tower-http", + "tower-http 0.6.11", "tower-service", "url", "wasm-bindgen", @@ -2896,11 +2763,11 @@ dependencies = [ [[package]] name = "ron" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4147b952f3f819eca0e99527022f7d6a8d05f111aeb0a62960c74eb283bec8fc" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "once_cell", "serde", "serde_derive", @@ -2910,9 +2777,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.11.0" +version = "8.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" +checksum = "e9e7760e252aaba7b09f4be00e36476cf585bdb68a53552ac954cdf504ab4bc9" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -2921,24 +2788,25 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.11.0" +version = "8.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" +checksum = "3bcfc4d6f53af43755f7a723e4b6b8794fcce052a178dd8c6c1dadc5f5343097" dependencies = [ + "mime_guess", "proc-macro2", "quote", "rust-embed-utils", - "syn", + "syn 2.0.119", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.11.0" +version = "8.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" +checksum = "42ffa149f6aa81b58a5b3011d01a857c4ed12c7a732d2c51947a4c7c692185f0" dependencies = [ - "sha2 0.10.9", + "sha2", "walkdir", ] @@ -2954,9 +2822,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc_version" @@ -2973,7 +2841,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -2986,7 +2854,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys 0.12.1", @@ -2995,9 +2863,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.40" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "once_cell", "ring", @@ -3009,9 +2877,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -3030,9 +2898,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "ryu" @@ -3072,9 +2940,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" dependencies = [ "chrono", "dyn-clone", @@ -3087,14 +2955,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" +checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn", + "syn 3.0.3", ] [[package]] @@ -3109,7 +2977,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -3134,9 +3002,9 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" dependencies = [ "serde_core", "serde_derive", @@ -3156,40 +3024,40 @@ dependencies = [ [[package]] name = "serde_core" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.229" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "serde_derive_internals" -version = "0.29.1" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ "indexmap 2.14.0", "itoa", @@ -3212,13 +3080,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -3244,9 +3112,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.20.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e72c1c2cb7b223fafb600a619537a871c2818583d619401b785e7c0b746ccde2" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ "base64", "bs58", @@ -3255,7 +3123,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.14.0", "schemars 0.9.0", - "schemars 1.2.1", + "schemars 1.2.2", "serde_core", "serde_json", "serde_with_macros", @@ -3264,14 +3132,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.20.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90c488738ecb4fb0262f41f43bc40efc5868d9fb744319ddf5f5317f417bfac" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ "darling 0.23.0", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -3287,17 +3155,6 @@ dependencies = [ "unsafe-libyaml", ] -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", -] - [[package]] name = "sha2" version = "0.11.0" @@ -3305,8 +3162,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", - "digest 0.11.3", + "cpufeatures", + "digest", ] [[package]] @@ -3326,9 +3183,9 @@ checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook" @@ -3363,9 +3220,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "slab" @@ -3375,15 +3232,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -3435,7 +3292,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.119", ] [[package]] @@ -3447,7 +3304,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -3464,9 +3321,20 @@ checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -3490,14 +3358,14 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "sysinfo" -version = "0.39.3" +version = "0.39.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d0d938c10fcda3e897e28aaddf4ab462375d411f4378cd63b1c945f69aba96" +checksum = "d2071df9448915b71c4fe6d25deaf1c22f12bd234f01540b77312bb8e41361e6" dependencies = [ "libc", "memchr", @@ -3514,7 +3382,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -3531,12 +3399,11 @@ dependencies = [ [[package]] name = "tauri-winrt-notification" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b1e66e07de489fe43a46678dd0b8df65e0c973909df1b60ba33874e297ba9b9" +checksum = "9ed071c670382e85fc2f48ae706492d8c338f4f89bf72520d32f8abfe880aade" dependencies = [ - "quick-xml", - "thiserror 2.0.18", + "thiserror 2.0.19", "windows 0.61.3", "windows-version", ] @@ -3548,7 +3415,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom 0.4.3", "once_cell", "rustix 1.1.4", "windows-sys 0.61.2", @@ -3574,11 +3441,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.19", ] [[package]] @@ -3589,37 +3456,36 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] [[package]] name = "time" -version = "0.3.47" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde_core", @@ -3629,15 +3495,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -3664,9 +3530,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -3679,9 +3545,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.3" +version = "1.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" dependencies = [ "bytes", "libc", @@ -3696,13 +3562,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.3", ] [[package]] @@ -3727,9 +3593,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" dependencies = [ "futures-core", "pin-project-lite", @@ -3738,22 +3604,23 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-sink", + "libc", "pin-project-lite", "tokio", ] [[package]] name = "toml" -version = "1.1.2+spec-1.1.0" +version = "1.1.4+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" dependencies = [ "indexmap 2.14.0", "serde_core", @@ -3775,9 +3642,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.11+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ "indexmap 2.14.0", "toml_datetime", @@ -3787,18 +3654,18 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.1.2+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.1.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" [[package]] name = "tower" @@ -3822,7 +3689,7 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "bytes", "futures-util", "http", @@ -3831,10 +3698,26 @@ dependencies = [ "tower", "tower-layer", "tower-service", - "tracing", "url", ] +[[package]] +name = "tower-http" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b11f75e912b0c2be01b63d8cf8057b8c3f97cf34abb3d431a3a4c8675498e233" +dependencies = [ + "bitflags 2.13.1", + "bytes", + "http", + "http-body", + "percent-encoding", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -3867,7 +3750,7 @@ checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" dependencies = [ "crossbeam-channel", "symlink", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", "tracing-subscriber", ] @@ -3880,7 +3763,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -3936,7 +3819,7 @@ checksum = "756050066659291d47a554a9f558125db17428b073c5ffce1daf5dcb0f7231d8" dependencies = [ "chrono", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.19", "ts-rs-macros", "uuid", ] @@ -3949,7 +3832,7 @@ checksum = "38d90eea51bc7988ef9e674bf80a85ba6804739e535e9cab48e4bb34a8b652aa" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "termcolor", ] @@ -3972,9 +3855,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.20.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ucd-trie" @@ -4007,9 +3890,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-truncate" @@ -4110,7 +3993,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn", + "syn 2.0.119", "uuid", ] @@ -4134,11 +4017,11 @@ dependencies = [ [[package]] name = "uuid" -version = "1.23.3" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" dependencies = [ - "getrandom 0.4.2", + "getrandom 0.4.3", "js-sys", "serde_core", "wasm-bindgen", @@ -4156,12 +4039,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - [[package]] name = "walkdir" version = "2.5.0" @@ -4187,29 +4064,11 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasip2" -version = "1.0.3+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" -dependencies = [ - "wit-bindgen 0.57.1", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", -] - [[package]] name = "wasm-bindgen" -version = "0.2.122" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -4220,9 +4079,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.72" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ "js-sys", "wasm-bindgen", @@ -4230,9 +4089,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.122" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4240,65 +4099,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.122" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.122" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.14.0", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.13.0", - "hashbrown 0.15.5", - "indexmap 2.14.0", - "semver", -] - [[package]] name = "web-sys" -version = "0.3.99" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -4316,18 +4141,18 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] [[package]] name = "which" -version = "8.0.3" +version = "8.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c789537cf2f7f55be8e6192f92e464174ee55f91af622777f7f1ceb0dbccd03e" +checksum = "8f3ef584124b911bcc3875c2f1472e80f24361ceb789bd1c62b3e9a3df9ff43c" dependencies = [ "libc", ] @@ -4462,7 +4287,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -4473,7 +4298,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -4815,107 +4640,13 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap 2.14.0", - "prettyplease", - "syn", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.13.0", - "indexmap 2.14.0", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.14.0", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - [[package]] name = "writeable" version = "0.6.3" @@ -4935,9 +4666,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -4952,15 +4683,15 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] [[package]] name = "zbus" -version = "5.15.0" +version = "5.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bcbf15c8708d7fc1be0c993622e0a5cbd5e8b52bfa40afa4c3e0cd8d724ac1" +checksum = "fe18fb60dc696039e738717b76eaea21e7a4489bbb1885020b43c94236d7e98a" dependencies = [ "async-broadcast", "async-executor", @@ -4993,14 +4724,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.15.0" +version = "5.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fa5406ad9175a8c825a931f8cf347116b531b3634fcb0b627c290f1f2516ff" +checksum = "fe96480bed92df2b442a1a30df364e12d08eed03aeb061f2b8dc6afb2be91119" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.119", "zbus_names", "zvariant", "zvariant_utils", @@ -5008,35 +4739,15 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.3.2" +version = "4.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" dependencies = [ "serde", "winnow", "zvariant", ] -[[package]] -name = "zerocopy" -version = "0.8.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zerofrom" version = "0.1.8" @@ -5054,15 +4765,15 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zerotrie" @@ -5094,7 +4805,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.119", ] [[package]] @@ -5113,15 +4824,15 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.6.3" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" +checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5" [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zopfli" @@ -5137,9 +4848,9 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.11.0" +version = "5.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c1567a6ec68df868cbbfde844cfc6d81649fe5109a62b116b19fabd53e618ee" +checksum = "bee2a0bcd2a907786a456fff45aaaaf54c9ba5f50b71ae9ec1a4edd200c94911" dependencies = [ "endi", "enumflags2", @@ -5151,26 +4862,26 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.11.0" +version = "5.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d5b780599bbde114e39d9a0799577fad1ced5105d38515745f7b3099d8ceda" +checksum = "38a708216a18780796770bfe3f4739c7c83a3e8f789b755534bbbc06e4e23e12" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.119", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.3.1" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d464f5733ffa07a3164d656f18533caace9d0638596721355d73256a410d691" +checksum = "90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7" dependencies = [ "proc-macro2", "quote", "serde", - "syn", + "syn 2.0.119", "winnow", ] diff --git a/Cargo.toml b/Cargo.toml index 78e525f3..1af181d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -87,12 +87,10 @@ async-trait = "0.1" # REST API axum = { version = "0.8", features = ["macros", "tokio", "tracing"] } -# `Host` extractor moved out of axum core in 0.8; it now lives in axum-extra. -axum-extra = "0.10" tokio-stream = "0.1" futures-util = "0.3" tower = "0.5" -tower-http = { version = "0.6", features = ["cors", "trace"] } +tower-http = { version = "0.7", features = ["cors", "trace"] } http-body-util = "0.1" # OpenAPI documentation @@ -100,7 +98,7 @@ utoipa = { version = "5", features = ["axum_extras", "uuid", "chrono"] } utoipa-swagger-ui = { version = "9", features = ["axum"] } # Agent Client Protocol (ACP) — JSON-RPC 2.0 over stdio for editor integration -agent-client-protocol = "0.14" +agent-client-protocol = "2.0" # Embedded web UI (behind embed-ui feature flag) rust-embed = { version = "8", optional = true } diff --git a/Makefile b/Makefile index 5437bd9f..4dab95e9 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ # Operator developer tasks. # # `make check` mirrors the CI `lint-test` job exactly so a clean local run means -# a clean CI run. `make install-hooks` wires the committed pre-push hook so the -# same gate runs automatically before every push. +# a clean CI run. `make install-hooks` wires the committed pre-push hook, which +# runs the fast lint gate (fmt + clippy, no tests) before every push. -.PHONY: check fmt clippy test build run install-hooks +.PHONY: check fmt clippy test build run install-hooks bindings webcomponents ui docs # Full CI-parity gate. Keep these commands byte-identical to # .github/workflows/build.yaml so local and CI never disagree. @@ -27,7 +27,37 @@ build: run: cargo run +# TypeScript types generated from the Rust domain types. ts-rs writes bindings/ +# as a side effect of the `export_bindings_*` tests it generates, so this is the +# first link in the chain: cargo -> bindings/ -> copy-types -> tsc/vite. +bindings: + cargo test --locked export_bindings_ + +# Shared frontend components. Built ahead of both consumers so the SPA and the +# docs site render collections from one implementation, and so neither needs a +# prebuilt artifact committed to the repo. Depends on `bindings` because the +# components are typed against the generated Rust types. +webcomponents: bindings + cd webcomponents && bun install --frozen-lockfile && bun run typecheck && bun test && bun run build + +# The embedded SPA, which resolves @operator/webcomponents from its dist/. +ui: webcomponents + cd ui && bun install --frozen-lockfile && bun run build + +# Full docs pipeline: bindings, generated reference docs and the hosted +# collection bundle, the shared components bundle, then Jekyll. Mirrors the +# ordering in .github/workflows/docs.yml. +docs: webcomponents + cargo test --locked + cargo run --locked -- docs + mkdir -p docs/assets/js + cp webcomponents/dist/elements.js webcomponents/dist/elements.css docs/assets/js/ + cd docs && bundle exec jekyll build + # The collection bundle is excluded from Jekyll (see docs/_config.yml) and + # copied in verbatim, so the bytes operator fetches match their checksums. + cp -R docs/collections docs/_site/ + # One-time per clone: route git hooks at the committed .githooks/ directory. install-hooks: git config core.hooksPath .githooks - @echo "pre-push hook installed (runs 'make check')" + @echo "pre-push hook installed (runs 'make fmt clippy')" diff --git a/README.md b/README.md index 017a38f2..bfc7178c 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ * **Platform** [![Docker](https://img.shields.io/badge/Docker-2496ED?logo=docker&logoColor=white)](https://operator.untra.io/getting-started/platforms/docker/) [![Coder](https://img.shields.io/badge/Coder-7C71FF?logo=coder&logoColor=white)](https://operator.untra.io/getting-started/platforms/coder/) -* **Workflow Format** [![Claude Workflow](https://img.shields.io/badge/Claude_Workflow-D97757?logo=claude&logoColor=white)](https://operator.untra.io/getting-started/workflows/claude/) [![AGNT Workflow](https://img.shields.io/badge/AGNT_Workflow-6E56CF)](https://operator.untra.io/getting-started/workflows/agnt/) +* **Workflow Export Format** [![Claude Workflow](https://img.shields.io/badge/Claude_Workflow-D97757?logo=claude&logoColor=white)](https://operator.untra.io/getting-started/workflows/claude/) [![AGNT Workflow](https://img.shields.io/badge/AGNT_Workflow-6E56CF)](https://operator.untra.io/getting-started/workflows/agnt/) An orchestration tool for [**AI-assisted**](https://operator.untra.io/getting-started/agents/) [_kanban-shaped_](https://operator.untra.io/getting-started/kanban/) [git-versioned](https://operator.untra.io/getting-started/git/) software development. diff --git a/backstage-server/.eslintignore b/backstage-server/.eslintignore deleted file mode 100644 index fd2171e1..00000000 --- a/backstage-server/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -dist -coverage -*.d.ts diff --git a/backstage-server/.eslintrc.json b/backstage-server/.eslintrc.json deleted file mode 100644 index 6aa746f3..00000000 --- a/backstage-server/.eslintrc.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2022, - "sourceType": "module", - "ecmaFeatures": { - "jsx": true - } - }, - "plugins": [ - "@typescript-eslint", - "react", - "react-hooks" - ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:react/recommended", - "plugin:react-hooks/recommended", - "../.eslintrc.base.json" - ], - "settings": { - "react": { - "version": "detect" - } - }, - "env": { - "browser": true, - "node": true, - "es2022": true - }, - "rules": { - "react/react-in-jsx-scope": "off" - } -} diff --git a/backstage-server/.gitignore b/backstage-server/.gitignore deleted file mode 100644 index f849f8a3..00000000 --- a/backstage-server/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Build outputs -dist/ -packages/*/dist/ -packages/plugins/*/dist/ - -# Generated embedding files -src/assets/ -src/embedded-assets.ts - -# Dependencies -node_modules/ - -# IDE -.idea/ -*.swp -*.swo - -# OS -.DS_Store - -# Playwright test artifacts -e2e/.auth/ -playwright-report/ -test-results/ diff --git a/backstage-server/README.md b/backstage-server/README.md deleted file mode 100644 index 610c7c4a..00000000 --- a/backstage-server/README.md +++ /dev/null @@ -1,162 +0,0 @@ -# Backstage Server - -A Bun-compiled standalone web portal for Operator, built with Backstage components and Hono. - -## Overview - -This is a self-contained Backstage-based web portal that provides: - -- **Dashboard**: Queue status, active agents, issue types overview -- **Catalog**: Software catalog with Operator's 5-tier taxonomy -- **Issue Types**: Create and manage issue type templates -- **Plugins**: View installed plugins - -The server compiles to a single binary using Bun with embedded frontend assets. - -## Tech Stack - -- **Runtime**: Bun (compiled binary) -- **Backend**: Hono web framework -- **Frontend**: React 18 + Backstage UI components -- **Language**: TypeScript 5 -- **Testing**: Bun test (unit) + Playwright (E2E) - -## Development - -### Prerequisites - -- Bun 1.0+ -- Node.js 18+ (for Backstage CLI) - -### Commands - -```bash -# Development server with hot reload -bun run dev - -# Build production binary -bun run build - -# Run the built binary -./dist/backstage-server -``` - -### Testing - -```bash -# Unit tests -bun test - -# E2E tests (requires server running) -bun run test:e2e - -# E2E with UI -bun run test:e2e:ui - -# E2E headed mode -bun run test:e2e:headed -``` - -### Linting & Type Checking - -```bash -# Lint all packages -bun run lint - -# Auto-fix lint issues -bun run lint:fix - -# Type check -bun run typecheck - -# Dependency analysis -bun run knip -``` - -## Quality Enforcement - -This project uses multiple tools to enforce code quality: - -| Tool | Purpose | Command | -|------|---------|---------| -| ESLint | Code linting | `bun run lint` | -| TypeScript | Type checking | `bun run typecheck` | -| Bun test | Unit tests | `bun test` | -| Playwright | E2E tests | `bun run test:e2e` | -| Knip | Unused exports/deps | `bun run knip` | - -### CI Checks - -All PRs must pass: - -1. `bun run lint` - No lint errors -2. `bun run typecheck` - No type errors -3. `bun test` - All unit tests pass -4. `bun run knip` - No unused exports or dependencies -5. `bun run test:e2e` - All E2E tests pass - -## Architecture - -``` -backstage-server/ -├── src/ -│ ├── standalone.ts # Hono server entry point -│ ├── embedded-assets.ts # Auto-generated asset embeddings -│ ├── catalog/ # Catalog storage and routes -│ └── search/ # Search index -├── packages/ -│ ├── app/ # React frontend -│ │ ├── src/ -│ │ │ ├── AppNew.tsx # New frontend system -│ │ │ ├── App.tsx # Legacy routing -│ │ │ ├── components/ # UI components -│ │ │ │ ├── home/ # Dashboard widgets -│ │ │ │ ├── catalog/ # Catalog views -│ │ │ │ └── plugins/ # Plugins page -│ │ │ └── extensions/ # Backstage extensions -│ │ └── public/ # Static assets -│ ├── backend/ # Backstage backend (reference) -│ └── plugins/ -│ └── plugin-issuetypes/ # Issue types plugin -├── e2e/ # Playwright E2E tests -├── scripts/ -│ └── generate-embeds.ts # Asset embedding generator -├── bunfig.toml # Bun configuration -├── knip.json # Knip configuration -└── playwright.config.ts # Playwright configuration -``` - -## Build Process - -1. **Frontend build**: `backstage-cli package build` compiles React app -2. **Asset embedding**: `generate-embeds.ts` creates `embedded-assets.ts` -3. **Binary compilation**: Bun compiles server + assets into single binary - -```bash -bun run build:frontend # Build React app -bun run build:embeds # Generate asset embeddings -bun run build:standalone # Compile to binary -``` - -## API Endpoints - -| Endpoint | Description | -|----------|-------------| -| `GET /health` | Health check | -| `GET /api/status` | Server status + catalog stats | -| `GET /api/catalog/entities` | List catalog entities | -| `POST /api/search/query` | Search catalog | -| `GET /api/issuetypes` | List issue types (proxied to Operator) | -| `ALL /api/operator/*` | Proxy to Operator REST API | - -## Configuration - -The server reads configuration from: - -- `~/.operator/backstage-catalog.json` - Catalog persistence -- `~/.operator/backstage/branding/theme.json` - Custom theming - -Environment variables: - -- `OPERATOR_API_URL` - Operator REST API URL (default: `http://localhost:7008`) -- `PORT` - Server port (default: `7007`) diff --git a/backstage-server/app-config.yaml b/backstage-server/app-config.yaml deleted file mode 100644 index 64689458..00000000 --- a/backstage-server/app-config.yaml +++ /dev/null @@ -1,45 +0,0 @@ -app: - title: Operator! Portal - baseUrl: http://localhost:7007 - -organization: - name: Operator - -backend: - baseUrl: http://localhost:7007 - listen: - port: ${PORT:-7007} - # Database disabled - using file-based catalog only - # database: - # client: better-sqlite3 - # connection: ':memory:' - -auth: - providers: - guest: - dangerouslyAllowOutsideDevelopment: true - -# Proxy configuration for Operator REST API -proxy: - '/operator': - target: 'http://localhost:7008' - changeOrigin: true - -catalog: - rules: - - allow: - - Component - - API - - Resource - - System - - Domain - - Location - - Template - - Group - - User - locations: - # Scan workspace for catalog-info.yaml files - - type: file - target: ../../**/catalog-info.yaml - rules: - - allow: [Component, API, Resource, System, Domain] diff --git a/backstage-server/bun.lock b/backstage-server/bun.lock deleted file mode 100644 index ca774ed9..00000000 --- a/backstage-server/bun.lock +++ /dev/null @@ -1,6354 +0,0 @@ -{ - "lockfileVersion": 1, - "configVersion": 1, - "workspaces": { - "": { - "name": "operator-backstage", - "dependencies": { - "hono": "^4.11.2", - }, - "devDependencies": { - "@backstage/cli": "^0.27.0", - "@happy-dom/global-registrator": "^20.0.11", - "@playwright/test": "^1.40.0", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "@typescript-eslint/eslint-plugin": "^7.0.0", - "@typescript-eslint/parser": "^7.0.0", - "bun-types": "^1.0.0", - "eslint": "^8.57.0", - "eslint-plugin-react": "^7.34.0", - "eslint-plugin-react-hooks": "^4.6.0", - "knip": "^5.0.0", - "typescript": "^5.0.0", - }, - }, - "packages/app": { - "name": "app", - "version": "0.0.0", - "dependencies": { - "@backstage/app-defaults": "^1.5.0", - "@backstage/catalog-client": "^1.6.0", - "@backstage/catalog-model": "^1.6.0", - "@backstage/core-app-api": "^1.14.0", - "@backstage/core-components": "^0.14.0", - "@backstage/core-plugin-api": "^1.9.0", - "@backstage/frontend-defaults": "^0.3.4", - "@backstage/frontend-plugin-api": "^0.13.2", - "@backstage/plugin-catalog": "^1.21.0", - "@backstage/plugin-catalog-graph": "^0.4.0", - "@backstage/plugin-catalog-import": "^0.12.0", - "@backstage/plugin-catalog-react": "^1.12.0", - "@backstage/plugin-home": "^0.7.0", - "@backstage/plugin-search": "^1.4.0", - "@backstage/plugin-search-react": "^1.7.0", - "@backstage/theme": "^0.5.0", - "@backstage/ui": "^0.10.0", - "@material-ui/core": "^4.12.4", - "@material-ui/icons": "^4.11.3", - "@operator/plugin-issuetypes": "workspace:*", - "@remixicon/react": "^4.7.0", - "@tanstack/react-query": "^5.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.0.0", - }, - "devDependencies": { - "@backstage/cli": "^0.27.0", - "@testing-library/react": "^14.0.0", - "happy-dom": "^13.0.0", - "msw": "^2.0.0", - "raw-loader": "^4.0.2", - }, - }, - "packages/backend": { - "name": "backend", - "version": "0.0.0", - "dependencies": { - "@backstage/backend-defaults": "^0.4.0", - "@backstage/plugin-app-backend": "^0.3.0", - "@backstage/plugin-auth-backend": "^0.22.0", - "@backstage/plugin-auth-backend-module-guest-provider": "^0.1.0", - "@backstage/plugin-catalog-backend": "^1.24.0", - "@backstage/plugin-proxy-backend": "^0.5.0", - }, - }, - "packages/plugins/plugin-issuetypes": { - "name": "@operator/plugin-issuetypes", - "version": "0.0.0", - "dependencies": { - "@backstage/core-components": "^0.14.0", - "@backstage/core-plugin-api": "^1.9.0", - "@backstage/frontend-plugin-api": "^0.13.2", - "@backstage/theme": "^0.5.0", - "react": "^18.2.0", - "react-router-dom": "^6.0.0", - }, - "devDependencies": { - "@backstage/cli": "^0.27.0", - "@material-ui/core": "^4.12.4", - "@types/react": "^18", - }, - "peerDependencies": { - "@material-ui/core": "^4.12.0", - "react": "^18.0.0", - }, - }, - }, - "overrides": { - "better-sqlite3": "npm:empty-npm-package@1.0.0", - "isolated-vm": "npm:empty-npm-package@1.0.0", - }, - "packages": { - "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@11.7.2", "", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA=="], - - "@apidevtools/openapi-schemas": ["@apidevtools/openapi-schemas@2.1.0", "", {}, "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ=="], - - "@apidevtools/swagger-methods": ["@apidevtools/swagger-methods@3.0.2", "", {}, "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg=="], - - "@apidevtools/swagger-parser": ["@apidevtools/swagger-parser@10.1.1", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "11.7.2", "@apidevtools/openapi-schemas": "^2.1.0", "@apidevtools/swagger-methods": "^3.0.2", "@jsdevtools/ono": "^7.1.3", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "call-me-maybe": "^1.0.2" }, "peerDependencies": { "openapi-types": ">=7" } }, "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA=="], - - "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], - - "@aws-crypto/crc32c": ["@aws-crypto/crc32c@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag=="], - - "@aws-crypto/sha1-browser": ["@aws-crypto/sha1-browser@5.2.0", "", { "dependencies": { "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg=="], - - "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "", { "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="], - - "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="], - - "@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="], - - "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - - "@aws-sdk/abort-controller": ["@aws-sdk/abort-controller@3.374.0", "", { "dependencies": { "@smithy/abort-controller": "^1.0.1", "tslib": "^2.5.0" } }, "sha512-pO1pqFBdIF28ZvnJmg58Erj35RLzXsTrjvHghdc/xgtSvodFFCNrUsPg6AP3On8eiw9elpHoS4P8jMx1pHDXEw=="], - - "@aws-sdk/client-codecommit": ["@aws-sdk/client-codecommit@3.958.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-node": "3.958.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-B0ePaOAxb6I5RGi6q4/YRHd80hNyjKsCvwJCxqvL6rVGoW6pSl+mKC6cB353hWGw2ZsLDSe35OVt65yZ7P443w=="], - - "@aws-sdk/client-cognito-identity": ["@aws-sdk/client-cognito-identity@3.958.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-node": "3.958.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Sj+r1e1Hqn9/2Z3FYiOL1C7thHht3ZihEB2/yInY1hxA5WJtdWL+OKMd0m+rJy9ZzRWPYSDPFLql+NGtaMKNKQ=="], - - "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.958.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-node": "3.958.0", "@aws-sdk/middleware-bucket-endpoint": "3.957.0", "@aws-sdk/middleware-expect-continue": "3.957.0", "@aws-sdk/middleware-flexible-checksums": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-location-constraint": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-sdk-s3": "3.957.0", "@aws-sdk/middleware-ssec": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/signature-v4-multi-region": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/eventstream-serde-browser": "^4.2.7", "@smithy/eventstream-serde-config-resolver": "^4.3.7", "@smithy/eventstream-serde-node": "^4.2.7", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-blob-browser": "^4.2.8", "@smithy/hash-node": "^4.2.7", "@smithy/hash-stream-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/md5-js": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-ol8Sw37AToBWb6PjRuT/Wu40SrrZSA0N4F7U3yTkjUNX0lirfO1VFLZ0hZtZplVJv8GNPITbiczxQ8VjxESXxg=="], - - "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.958.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-6qNCIeaMzKzfqasy2nNRuYnMuaMebCcCPP4J2CVGkA8QYMbIVKPlkn9bpB20Vxe6H/r3jtCCLQaOJjVTx/6dXg=="], - - "@aws-sdk/client-sts": ["@aws-sdk/client-sts@3.958.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-node": "3.958.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-GqKPfuWU/2nT67OH8jezgPEHFxW7X+hNk7VvjJzVO28+423vpc3rrmKQtYwDWkbK3/pmEUi8BWv9P/j64AwRvQ=="], - - "@aws-sdk/core": ["@aws-sdk/core@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@aws-sdk/xml-builder": "3.957.0", "@smithy/core": "^3.20.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-DrZgDnF1lQZv75a52nFWs6MExihJF2GZB6ETZRqr6jMwhrk2kbJPUtvgbifwcL7AYmVqHQDJBrR/MqkwwFCpiw=="], - - "@aws-sdk/crc64-nvme": ["@aws-sdk/crc64-nvme@3.957.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-qSwSfI+qBU9HDsd6/4fM9faCxYJx2yDuHtj+NVOQ6XYDWQzFab/hUdwuKZ77Pi6goLF1pBZhJ2azaC2w7LbnTA=="], - - "@aws-sdk/credential-provider-cognito-identity": ["@aws-sdk/credential-provider-cognito-identity@3.958.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-O+j43kTMoh0jIgXU5C68aA+KWqYCpQ4MiYMIW6WahHGiKOBfk/N1EEifZkY/BIYMNTipItyFI4RROQhZhT/TxA=="], - - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-475mkhGaWCr+Z52fOOVb/q2VHuNvqEDixlYIkeaO6xJ6t9qR0wpLt4hOQaR6zR1wfZV0SlE7d8RErdYq/PByog=="], - - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/node-http-handler": "^4.4.7", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" } }, "sha512-8dS55QHRxXgJlHkEYaCGZIhieCs9NU1HU1BcqQ4RfUdSsfRdxxktqUKgCnBnOOn0oD3PPA8cQOCAVgIyRb3Rfw=="], - - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.958.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", "@aws-sdk/credential-provider-login": "3.958.0", "@aws-sdk/credential-provider-process": "3.957.0", "@aws-sdk/credential-provider-sso": "3.958.0", "@aws-sdk/credential-provider-web-identity": "3.958.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-u7twvZa1/6GWmPBZs6DbjlegCoNzNjBsMS/6fvh5quByYrcJr/uLd8YEr7S3UIq4kR/gSnHqcae7y2nL2bqZdg=="], - - "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.958.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-sDwtDnBSszUIbzbOORGh5gmXGl9aK25+BHb4gb1aVlqB+nNL2+IUEJA62+CE55lXSH8qXF90paivjK8tOHTwPA=="], - - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.958.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", "@aws-sdk/credential-provider-ini": "3.958.0", "@aws-sdk/credential-provider-process": "3.957.0", "@aws-sdk/credential-provider-sso": "3.958.0", "@aws-sdk/credential-provider-web-identity": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-vdoZbNG2dt66I7EpN3fKCzi6fp9xjIiwEA/vVVgqO4wXCGw8rKPIdDUus4e13VvTr330uQs2W0UNg/7AgtquEQ=="], - - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-/KIz9kadwbeLy6SKvT79W81Y+hb/8LMDyeloA2zhouE28hmne+hLn0wNCQXAAupFFlYOAtZR2NTBs7HBAReJlg=="], - - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.958.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.958.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/token-providers": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-CBYHJ5ufp8HC4q+o7IJejCUctJXWaksgpmoFpXerbjAso7/Fg7LLUu9inXVOxlHKLlvYekDXjIUBXDJS2WYdgg=="], - - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.958.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-dgnvwjMq5Y66WozzUzxNkCFap+umHUtqMMKlr8z/vl9NYMLem/WUbWNpFFOVFWquXikc+ewtpBMR4KEDXfZ+KA=="], - - "@aws-sdk/credential-providers": ["@aws-sdk/credential-providers@3.958.0", "", { "dependencies": { "@aws-sdk/client-cognito-identity": "3.958.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-cognito-identity": "3.958.0", "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", "@aws-sdk/credential-provider-ini": "3.958.0", "@aws-sdk/credential-provider-login": "3.958.0", "@aws-sdk/credential-provider-node": "3.958.0", "@aws-sdk/credential-provider-process": "3.957.0", "@aws-sdk/credential-provider-sso": "3.958.0", "@aws-sdk/credential-provider-web-identity": "3.958.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-HSyfH4f3uG63enBz2KOg25lcEUNPffUVIWcjQCBMIntsojBAOOHcGjuwiKvhwL5tt4nqTAoTXTMZ+drKYM5IAg=="], - - "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@aws-sdk/util-arn-parser": "3.957.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-iczcn/QRIBSpvsdAS/rbzmoBpleX1JBjXvCynMbDceVLBIcVrwT1hXECrhtIC2cjh4HaLo9ClAbiOiWuqt+6MA=="], - - "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-AlbK3OeVNwZZil0wlClgeI/ISlOt/SPUxBsIns876IFaVu/Pj3DgImnYhpcJuFRek4r4XM51xzIaGQXM6GDHGg=="], - - "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.957.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/crc64-nvme": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-iJpeVR5V8se1hl2pt+k8bF/e9JO4KWgPCMjg8BtRspNtKIUGy7j6msYvbDixaKZaF2Veg9+HoYcOhwnZumjXSA=="], - - "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-BBgKawVyfQZglEkNTuBBdC3azlyqNXsvvN4jPkWAiNYcY0x1BasaJFl+7u/HisfULstryweJq/dAvIZIxzlZaA=="], - - "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-y8/W7TOQpmDJg/fPYlqAhwA4+I15LrS7TwgUEoxogtkD8gfur9wFMRLT8LCyc9o4NMEcAnK50hSb4+wB0qv6tQ=="], - - "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-w1qfKrSKHf9b5a8O76yQ1t69u6NWuBjr5kBX+jRWFx/5mu6RLpqERXRpVJxfosbep7k3B+DSB5tZMZ82GKcJtQ=="], - - "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-D2H/WoxhAZNYX+IjkKTdOhOkWQaK0jjJrDBj56hKjU5c9ltQiaX/1PqJ4dfjHntEshJfu0w+E6XJ+/6A6ILBBA=="], - - "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-arn-parser": "3.957.0", "@smithy/core": "^3.20.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-5B2qY2nR2LYpxoQP0xUum5A1UNvH2JQpLHDH1nWFNF/XetV7ipFHksMxPNhtJJ6ARaWhQIDXfOUj0jcnkJxXUg=="], - - "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-qwkmrK0lizdjNt5qxl4tHYfASh8DFpHXM1iDVo+qHe+zuslfMqQEGRkzxS8tJq/I+8F0c6v3IKOveKJAfIvfqQ=="], - - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.957.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@smithy/core": "^3.20.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-50vcHu96XakQnIvlKJ1UoltrFODjsq2KvtTgHiPFteUS884lQnK5VC/8xd1Msz/1ONpLMzdCVproCQqhDTtMPQ=="], - - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.958.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/region-config-resolver": "3.957.0", "@aws-sdk/types": "3.957.0", "@aws-sdk/util-endpoints": "3.957.0", "@aws-sdk/util-user-agent-browser": "3.957.0", "@aws-sdk/util-user-agent-node": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/core": "^3.20.0", "@smithy/fetch-http-handler": "^5.3.8", "@smithy/hash-node": "^4.2.7", "@smithy/invalid-dependency": "^4.2.7", "@smithy/middleware-content-length": "^4.2.7", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-retry": "^4.4.17", "@smithy/middleware-serde": "^4.2.8", "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.16", "@smithy/util-defaults-mode-node": "^4.2.19", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-/KuCcS8b5TpQXkYOrPLYytrgxBhv81+5pChkOlhegbeHttjM69pyUpQVJqyfDM/A7wPLnDrzCAnk4zaAOkY0Nw=="], - - "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/config-resolver": "^4.4.5", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A=="], - - "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.957.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/protocol-http": "^5.3.7", "@smithy/signature-v4": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-t6UfP1xMUigMMzHcb7vaZcjv7dA2DQkk9C/OAP1dKyrE0vb4lFGDaTApi17GN6Km9zFxJthEMUbBc7DL0hq1Bg=="], - - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.958.0", "", { "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-UCj7lQXODduD1myNJQkV+LYcGYJ9iiMggR8ow8Hva1g3A/Na5imNXzz6O67k7DAee0TYpy+gkNw+SizC6min8Q=="], - - "@aws-sdk/types": ["@aws-sdk/types@3.957.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg=="], - - "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.957.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Aj6m+AyrhWyg8YQ4LDPg2/gIfGHCEcoQdBt5DeSFogN5k9mmJPOJ+IAmNSWmWRjpOxEy6eY813RNDI6qS97M0g=="], - - "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-endpoints": "^3.2.7", "tslib": "^2.6.2" } }, "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw=="], - - "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.957.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-nhmgKHnNV9K+i9daumaIz8JTLsIIML9PE/HUks5liyrjUzenjW/aHoc7WJ9/Td/gPZtayxFnXQSJRb/fDlBuJw=="], - - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.957.0", "", { "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw=="], - - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.957.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.957.0", "@aws-sdk/types": "3.957.0", "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-ycbYCwqXk4gJGp0Oxkzf2KBeeGBdTxz559D41NJP8FlzSej1Gh7Rk40Zo6AyTfsNWkrl/kVi1t937OIzC5t+9Q=="], - - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.957.0", "", { "dependencies": { "@smithy/types": "^4.11.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-Ai5iiQqS8kJ5PjzMhWcLKN0G2yasAkvpnPlq2EnqlIMdB48HsizElt62qcktdxp4neRMyGkFq4NzgmDbXnhRiA=="], - - "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.2.2", "", {}, "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg=="], - - "@azure/abort-controller": ["@azure/abort-controller@2.1.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA=="], - - "@azure/core-auth": ["@azure/core-auth@1.10.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-util": "^1.13.0", "tslib": "^2.6.2" } }, "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg=="], - - "@azure/core-client": ["@azure/core-client@1.10.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0", "@azure/core-tracing": "^1.3.0", "@azure/core-util": "^1.13.0", "@azure/logger": "^1.3.0", "tslib": "^2.6.2" } }, "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w=="], - - "@azure/core-http-compat": ["@azure/core-http-compat@2.3.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-client": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0" } }, "sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g=="], - - "@azure/core-lro": ["@azure/core-lro@2.7.2", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.2.0", "@azure/logger": "^1.0.0", "tslib": "^2.6.2" } }, "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw=="], - - "@azure/core-paging": ["@azure/core-paging@1.6.2", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA=="], - - "@azure/core-rest-pipeline": ["@azure/core-rest-pipeline@1.22.2", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-tracing": "^1.3.0", "@azure/core-util": "^1.13.0", "@azure/logger": "^1.3.0", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg=="], - - "@azure/core-tracing": ["@azure/core-tracing@1.3.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ=="], - - "@azure/core-util": ["@azure/core-util@1.13.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A=="], - - "@azure/core-xml": ["@azure/core-xml@1.5.0", "", { "dependencies": { "fast-xml-parser": "^5.0.7", "tslib": "^2.8.1" } }, "sha512-D/sdlJBMJfx7gqoj66PKVmhDDaU6TKA49ptcolxdas29X7AfvLTmfAGLjAcIMBK7UZ2o4lygHIqVckOlQU3xWw=="], - - "@azure/identity": ["@azure/identity@4.13.0", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.2", "@azure/core-rest-pipeline": "^1.17.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", "@azure/msal-browser": "^4.2.0", "@azure/msal-node": "^3.5.0", "open": "^10.1.0", "tslib": "^2.2.0" } }, "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw=="], - - "@azure/logger": ["@azure/logger@1.3.0", "", { "dependencies": { "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA=="], - - "@azure/msal-browser": ["@azure/msal-browser@4.27.0", "", { "dependencies": { "@azure/msal-common": "15.13.3" } }, "sha512-bZ8Pta6YAbdd0o0PEaL1/geBsPrLEnyY/RDWqvF1PP9RUH8EMLvUMGoZFYS6jSlUan6KZ9IMTLCnwpWWpQRK/w=="], - - "@azure/msal-common": ["@azure/msal-common@15.13.3", "", {}, "sha512-shSDU7Ioecya+Aob5xliW9IGq1Ui8y4EVSdWGyI1Gbm4Vg61WpP95LuzcY214/wEjSn6w4PZYD4/iVldErHayQ=="], - - "@azure/msal-node": ["@azure/msal-node@3.8.4", "", { "dependencies": { "@azure/msal-common": "15.13.3", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" } }, "sha512-lvuAwsDpPDE/jSuVQOBMpLbXuVuLsPNRwWCyK3/6bPlBk0fGWegqoZ0qjZclMWyQ2JNvIY3vHY7hoFmFmFQcOw=="], - - "@azure/storage-blob": ["@azure/storage-blob@12.29.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.3", "@azure/core-http-compat": "^2.2.0", "@azure/core-lro": "^2.2.0", "@azure/core-paging": "^1.6.2", "@azure/core-rest-pipeline": "^1.19.1", "@azure/core-tracing": "^1.2.0", "@azure/core-util": "^1.11.0", "@azure/core-xml": "^1.4.5", "@azure/logger": "^1.1.4", "@azure/storage-common": "^12.1.1", "events": "^3.0.0", "tslib": "^2.8.1" } }, "sha512-7ktyY0rfTM0vo7HvtK6E3UvYnI9qfd6Oz6z/+92VhGRveWng3kJwMKeUpqmW/NmwcDNbxHpSlldG+vsUnRFnBg=="], - - "@azure/storage-common": ["@azure/storage-common@12.1.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.9.0", "@azure/core-http-compat": "^2.2.0", "@azure/core-rest-pipeline": "^1.19.1", "@azure/core-tracing": "^1.2.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.1.4", "events": "^3.3.0", "tslib": "^2.8.1" } }, "sha512-eIOH1pqFwI6UmVNnDQvmFeSg0XppuzDLFeUNO/Xht7ODAzRLgGDh7h550pSxoA+lPDxBl1+D2m/KG3jWzCUjTg=="], - - "@babel/code-frame": ["@babel/code-frame@7.0.0", "", { "dependencies": { "@babel/highlight": "^7.0.0" } }, "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA=="], - - "@babel/compat-data": ["@babel/compat-data@7.28.5", "", {}, "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA=="], - - "@babel/core": ["@babel/core@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw=="], - - "@babel/generator": ["@babel/generator@7.28.5", "", { "dependencies": { "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ=="], - - "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], - - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], - - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ=="], - - "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw=="], - - "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.5", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "debug": "^4.4.1", "lodash.debounce": "^4.0.8", "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg=="], - - "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], - - "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], - - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], - - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], - - "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], - - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], - - "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="], - - "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="], - - "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], - - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], - - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - - "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2" } }, "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g=="], - - "@babel/helpers": ["@babel/helpers@7.28.4", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" } }, "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="], - - "@babel/highlight": ["@babel/highlight@7.25.9", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw=="], - - "@babel/parser": ["@babel/parser@7.28.5", "", { "dependencies": { "@babel/types": "^7.28.5" }, "bin": "./bin/babel-parser.js" }, "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ=="], - - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q=="], - - "@babel/plugin-bugfix-safari-class-field-initializer-scope": ["@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA=="], - - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ["@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA=="], - - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ["@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw=="], - - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ["@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw=="], - - "@babel/plugin-proposal-private-property-in-object": ["@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w=="], - - "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], - - "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], - - "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], - - "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="], - - "@babel/plugin-syntax-import-assertions": ["@babel/plugin-syntax-import-assertions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg=="], - - "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], - - "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], - - "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], - - "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], - - "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], - - "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], - - "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="], - - "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="], - - "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="], - - "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], - - "@babel/plugin-syntax-private-property-in-object": ["@babel/plugin-syntax-private-property-in-object@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="], - - "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], - - "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], - - "@babel/plugin-syntax-unicode-sets-regex": ["@babel/plugin-syntax-unicode-sets-regex@7.18.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg=="], - - "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="], - - "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="], - - "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], - - "@babel/plugin-transform-block-scoped-functions": ["@babel/plugin-transform-block-scoped-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg=="], - - "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g=="], - - "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA=="], - - "@babel/plugin-transform-class-static-block": ["@babel/plugin-transform-class-static-block@7.28.3", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg=="], - - "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.4", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA=="], - - "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], - - "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw=="], - - "@babel/plugin-transform-dotall-regex": ["@babel/plugin-transform-dotall-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw=="], - - "@babel/plugin-transform-duplicate-keys": ["@babel/plugin-transform-duplicate-keys@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q=="], - - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ["@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ=="], - - "@babel/plugin-transform-dynamic-import": ["@babel/plugin-transform-dynamic-import@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A=="], - - "@babel/plugin-transform-explicit-resource-management": ["@babel/plugin-transform-explicit-resource-management@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ=="], - - "@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw=="], - - "@babel/plugin-transform-export-namespace-from": ["@babel/plugin-transform-export-namespace-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ=="], - - "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="], - - "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="], - - "@babel/plugin-transform-json-strings": ["@babel/plugin-transform-json-strings@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q=="], - - "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], - - "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA=="], - - "@babel/plugin-transform-member-expression-literals": ["@babel/plugin-transform-member-expression-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ=="], - - "@babel/plugin-transform-modules-amd": ["@babel/plugin-transform-modules-amd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA=="], - - "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], - - "@babel/plugin-transform-modules-systemjs": ["@babel/plugin-transform-modules-systemjs@7.28.5", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew=="], - - "@babel/plugin-transform-modules-umd": ["@babel/plugin-transform-modules-umd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w=="], - - "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], - - "@babel/plugin-transform-new-target": ["@babel/plugin-transform-new-target@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ=="], - - "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], - - "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], - - "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.4", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew=="], - - "@babel/plugin-transform-object-super": ["@babel/plugin-transform-object-super@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng=="], - - "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], - - "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ=="], - - "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="], - - "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA=="], - - "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ=="], - - "@babel/plugin-transform-property-literals": ["@babel/plugin-transform-property-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ=="], - - "@babel/plugin-transform-react-constant-elements": ["@babel/plugin-transform-react-constant-elements@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug=="], - - "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA=="], - - "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/types": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw=="], - - "@babel/plugin-transform-react-jsx-development": ["@babel/plugin-transform-react-jsx-development@7.27.1", "", { "dependencies": { "@babel/plugin-transform-react-jsx": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q=="], - - "@babel/plugin-transform-react-pure-annotations": ["@babel/plugin-transform-react-pure-annotations@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA=="], - - "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.28.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA=="], - - "@babel/plugin-transform-regexp-modifiers": ["@babel/plugin-transform-regexp-modifiers@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA=="], - - "@babel/plugin-transform-reserved-words": ["@babel/plugin-transform-reserved-words@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw=="], - - "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], - - "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], - - "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="], - - "@babel/plugin-transform-template-literals": ["@babel/plugin-transform-template-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg=="], - - "@babel/plugin-transform-typeof-symbol": ["@babel/plugin-transform-typeof-symbol@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw=="], - - "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA=="], - - "@babel/plugin-transform-unicode-escapes": ["@babel/plugin-transform-unicode-escapes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg=="], - - "@babel/plugin-transform-unicode-property-regex": ["@babel/plugin-transform-unicode-property-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q=="], - - "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="], - - "@babel/plugin-transform-unicode-sets-regex": ["@babel/plugin-transform-unicode-sets-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw=="], - - "@babel/preset-env": ["@babel/preset-env@7.28.5", "", { "dependencies": { "@babel/compat-data": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", "@babel/plugin-transform-spread": "^7.27.1", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", "@babel/plugin-transform-unicode-property-regex": "^7.27.1", "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg=="], - - "@babel/preset-modules": ["@babel/preset-modules@0.1.6-no-external-plugins", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA=="], - - "@babel/preset-react": ["@babel/preset-react@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-transform-react-display-name": "^7.28.0", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ=="], - - "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="], - - "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], - - "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], - - "@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], - - "@babel/types": ["@babel/types@7.28.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA=="], - - "@backstage/app-defaults": ["@backstage/app-defaults@1.7.3", "", { "dependencies": { "@backstage/core-app-api": "^1.19.3", "@backstage/core-components": "^0.18.4", "@backstage/core-plugin-api": "^1.12.1", "@backstage/plugin-permission-react": "^0.4.39", "@backstage/theme": "^0.7.1", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-qV3N5aCJQCuSmO1xVpwzhqstAFUlHQZL5kZ+BqJTmcPBoZWZzkOwwFa14f9VMQczWoUCgW3OtuYZMHs2ZI+N1g=="], - - "@backstage/backend-app-api": ["@backstage/backend-app-api@0.9.3", "", { "dependencies": { "@backstage/backend-common": "^0.24.1", "@backstage/backend-plugin-api": "^0.8.1", "@backstage/cli-common": "^0.1.14", "@backstage/cli-node": "^0.2.7", "@backstage/config": "^1.2.0", "@backstage/config-loader": "^1.9.0", "@backstage/errors": "^1.2.4", "@backstage/plugin-auth-node": "^0.5.1", "@backstage/plugin-permission-node": "^0.8.2", "@backstage/types": "^1.1.1", "@manypkg/get-packages": "^1.1.3", "compression": "^1.7.4", "cookie": "^0.6.0", "cors": "^2.8.5", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "helmet": "^6.0.0", "jose": "^5.0.0", "knex": "^3.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", "luxon": "^3.0.0", "minimatch": "^9.0.0", "minimist": "^1.2.5", "morgan": "^1.10.0", "node-fetch": "^2.7.0", "node-forge": "^1.3.1", "path-to-regexp": "^6.2.1", "selfsigned": "^2.0.0", "stoppable": "^1.1.0", "triple-beam": "^1.4.1", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0" } }, "sha512-K4M5Wl3Bu7+4xRpaGdQtEi2iVFqQH766zl+R7lK1n4q/NVWEpulJpmwzPxP45xsJUCJeFkjL+dJn2pw+iS2wHQ=="], - - "@backstage/backend-common": ["@backstage/backend-common@0.24.1", "", { "dependencies": { "@aws-sdk/abort-controller": "^3.347.0", "@aws-sdk/client-codecommit": "^3.350.0", "@aws-sdk/client-s3": "^3.350.0", "@aws-sdk/credential-providers": "^3.350.0", "@aws-sdk/types": "^3.347.0", "@backstage/backend-dev-utils": "^0.1.5", "@backstage/backend-plugin-api": "^0.8.1", "@backstage/cli-common": "^0.1.14", "@backstage/config": "^1.2.0", "@backstage/config-loader": "^1.9.0", "@backstage/errors": "^1.2.4", "@backstage/integration": "^1.14.0", "@backstage/integration-aws-node": "^0.1.12", "@backstage/plugin-auth-node": "^0.5.1", "@backstage/types": "^1.1.1", "@google-cloud/storage": "^7.0.0", "@keyv/memcache": "^1.3.5", "@keyv/redis": "^2.5.3", "@kubernetes/client-node": "0.20.0", "@manypkg/get-packages": "^1.1.3", "@octokit/rest": "^19.0.3", "@types/cors": "^2.8.6", "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", "@types/webpack-env": "^1.15.2", "archiver": "^6.0.0", "base64-stream": "^1.0.0", "compression": "^1.7.4", "concat-stream": "^2.0.0", "cors": "^2.8.5", "dockerode": "^4.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "git-url-parse": "^14.0.0", "helmet": "^6.0.0", "isomorphic-git": "^1.23.0", "jose": "^5.0.0", "keyv": "^4.5.2", "knex": "^3.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", "luxon": "^3.0.0", "minimatch": "^9.0.0", "minimist": "^1.2.5", "morgan": "^1.10.0", "mysql2": "^3.0.0", "node-fetch": "^2.7.0", "node-forge": "^1.3.1", "p-limit": "^3.1.0", "path-to-regexp": "^6.2.1", "pg": "^8.11.3", "pg-format": "^1.0.4", "raw-body": "^2.4.1", "selfsigned": "^2.0.0", "stoppable": "^1.1.0", "tar": "^6.1.12", "triple-beam": "^1.4.1", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0", "yauzl": "^3.0.0", "yn": "^4.0.0" }, "peerDependencies": { "pg-connection-string": "^2.3.0" }, "optionalPeers": ["pg-connection-string"] }, "sha512-U4CHgO1Ob1v4StgMolNpVRGg1c3LqhUY2L5ztjdKu3yuwgQcSTWi/sQTtua4OTWTupmhkyYGfroAoeE1QFqUCA=="], - - "@backstage/backend-defaults": ["@backstage/backend-defaults@0.4.4", "", { "dependencies": { "@aws-sdk/abort-controller": "^3.347.0", "@aws-sdk/client-codecommit": "^3.350.0", "@aws-sdk/client-s3": "^3.350.0", "@aws-sdk/credential-providers": "^3.350.0", "@aws-sdk/types": "^3.347.0", "@backstage/backend-app-api": "^0.9.3", "@backstage/backend-common": "^0.24.1", "@backstage/backend-dev-utils": "^0.1.5", "@backstage/backend-plugin-api": "^0.8.1", "@backstage/cli-common": "^0.1.14", "@backstage/config": "^1.2.0", "@backstage/config-loader": "^1.9.0", "@backstage/errors": "^1.2.4", "@backstage/integration": "^1.14.0", "@backstage/integration-aws-node": "^0.1.12", "@backstage/plugin-auth-node": "^0.5.1", "@backstage/plugin-events-node": "^0.3.10", "@backstage/plugin-permission-node": "^0.8.2", "@backstage/types": "^1.1.1", "@google-cloud/storage": "^7.0.0", "@keyv/memcache": "^1.3.5", "@keyv/redis": "^2.5.3", "@manypkg/get-packages": "^1.1.3", "@octokit/rest": "^19.0.3", "@opentelemetry/api": "^1.3.0", "@types/cors": "^2.8.6", "@types/express": "^4.17.6", "archiver": "^6.0.0", "base64-stream": "^1.0.0", "better-sqlite3": "^11.0.0", "compression": "^1.7.4", "concat-stream": "^2.0.0", "cookie": "^0.6.0", "cors": "^2.8.5", "cron": "^3.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "git-url-parse": "^14.0.0", "helmet": "^6.0.0", "isomorphic-git": "^1.23.0", "jose": "^5.0.0", "keyv": "^4.5.2", "knex": "^3.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", "luxon": "^3.0.0", "minimatch": "^9.0.0", "minimist": "^1.2.5", "morgan": "^1.10.0", "mysql2": "^3.0.0", "node-fetch": "^2.7.0", "node-forge": "^1.3.1", "p-limit": "^3.1.0", "path-to-regexp": "^6.2.1", "pg": "^8.11.3", "pg-connection-string": "^2.3.0", "pg-format": "^1.0.4", "raw-body": "^2.4.1", "selfsigned": "^2.0.0", "stoppable": "^1.1.0", "tar": "^6.1.12", "triple-beam": "^1.4.1", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0", "yauzl": "^3.0.0", "yn": "^4.0.0", "zod": "^3.22.4" } }, "sha512-wQmLNxpQPykzdvVcKNUbS0VMJZCRHYYHY/0cLJ/npg8Gpq+pb85Dh+dLV61HhzF+cbig5aRgM2lql7wheyVGlw=="], - - "@backstage/backend-dev-utils": ["@backstage/backend-dev-utils@0.1.6", "", {}, "sha512-5TqtPyNhC4JMUdlvrhC0oOexJRCdglsOxc68IANWprNeXhVYoGyg3w/T7+XsN/iBi40a7qXJ1RNAO/hUwbLDAQ=="], - - "@backstage/backend-openapi-utils": ["@backstage/backend-openapi-utils@0.5.5", "", { "dependencies": { "@apidevtools/swagger-parser": "^10.1.0", "@backstage/backend-plugin-api": "^1.4.1", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.1", "@types/express": "^4.17.6", "@types/express-serve-static-core": "^4.17.5", "ajv": "^8.16.0", "express": "^4.17.1", "express-openapi-validator": "^5.0.4", "express-promise-router": "^4.1.0", "get-port": "^5.1.1", "json-schema-to-ts": "^3.0.0", "lodash": "^4.17.21", "mockttp": "^3.13.0", "openapi-merge": "^1.3.2", "openapi3-ts": "^3.1.2" } }, "sha512-oIn7rKF+FYM2bOqiuxUbwQkkde2w7QMXbnT+SbNkX4ssSD6CAvsQ/HycxBwCjbw5EXx7NtCnekB/q+QMEb4ppQ=="], - - "@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@0.8.1", "", { "dependencies": { "@backstage/cli-common": "^0.1.14", "@backstage/config": "^1.2.0", "@backstage/errors": "^1.2.4", "@backstage/plugin-auth-node": "^0.5.1", "@backstage/plugin-permission-common": "^0.8.1", "@backstage/types": "^1.1.1", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", "express": "^4.17.1", "knex": "^3.0.0", "luxon": "^3.0.0" } }, "sha512-Ckr/aE+jSZzwooH6nRCRWhtJFhm4P1JTyukH8gygP0wIkQGdoC7n3Xt7cheGP2fMV//9p5NZ+sfNZTr8LpO8hg=="], - - "@backstage/catalog-client": ["@backstage/catalog-client@1.12.1", "", { "dependencies": { "@backstage/catalog-model": "^1.7.6", "@backstage/errors": "^1.2.7", "cross-fetch": "^4.0.0", "uri-template": "^2.0.0" } }, "sha512-+09CysCoP35TLNh+y+MKq8iSbSP4VkbynDEC+Wm5YdRNSr8JoQtcmaDtlhyMD2nsOrpIfAuf0KxNARIYXdhruw=="], - - "@backstage/catalog-model": ["@backstage/catalog-model@1.7.6", "", { "dependencies": { "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "ajv": "^8.10.0", "lodash": "^4.17.21" } }, "sha512-EaMl9kA+hJhwLz0lTZihA+66mN4PEmE4j5GDxX4Pntjjv/utIQ2kTBfWRgBL1BOayKtfeXKoe19ZoKb7mPYQwQ=="], - - "@backstage/cli": ["@backstage/cli@0.27.1", "", { "dependencies": { "@backstage/catalog-model": "^1.7.0", "@backstage/cli-common": "^0.1.14", "@backstage/cli-node": "^0.2.8", "@backstage/config": "^1.2.0", "@backstage/config-loader": "^1.9.1", "@backstage/errors": "^1.2.4", "@backstage/eslint-plugin": "^0.1.9", "@backstage/integration": "^1.15.0", "@backstage/release-manifests": "^0.0.11", "@backstage/types": "^1.1.1", "@manypkg/get-packages": "^1.1.3", "@module-federation/enhanced": "^0.6.0", "@octokit/graphql": "^5.0.0", "@octokit/graphql-schema": "^13.7.0", "@octokit/oauth-app": "^4.2.0", "@octokit/request": "^6.0.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", "@rollup/plugin-commonjs": "^26.0.0", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.0", "@rollup/plugin-yaml": "^4.0.0", "@spotify/eslint-config-base": "^15.0.0", "@spotify/eslint-config-react": "^15.0.0", "@spotify/eslint-config-typescript": "^15.0.0", "@sucrase/webpack-loader": "^2.0.0", "@svgr/core": "6.5.x", "@svgr/plugin-jsx": "6.5.x", "@svgr/plugin-svgo": "6.5.x", "@svgr/rollup": "6.5.x", "@svgr/webpack": "6.5.x", "@swc/core": "^1.3.46", "@swc/helpers": "^0.5.0", "@swc/jest": "^0.2.22", "@types/jest": "^29.5.11", "@types/webpack-env": "^1.15.2", "@typescript-eslint/eslint-plugin": "^6.12.0", "@typescript-eslint/parser": "^6.7.2", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "^3.0.0", "bfj": "^8.0.0", "buffer": "^6.0.3", "chalk": "^4.0.0", "chokidar": "^3.3.1", "commander": "^12.0.0", "cross-fetch": "^4.0.0", "cross-spawn": "^7.0.3", "css-loader": "^6.5.1", "ctrlc-windows": "^2.1.0", "diff": "^5.0.0", "esbuild": "^0.23.0", "esbuild-loader": "^4.0.0", "eslint": "^8.6.0", "eslint-config-prettier": "^9.0.0", "eslint-formatter-friendly": "^7.0.0", "eslint-plugin-deprecation": "^2.0.0", "eslint-plugin-import": "^2.25.4", "eslint-plugin-jest": "^28.0.0", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", "eslint-plugin-unused-imports": "^3.0.0", "eslint-webpack-plugin": "^4.0.0", "express": "^4.17.1", "fork-ts-checker-webpack-plugin": "^9.0.0", "fs-extra": "^11.2.0", "git-url-parse": "^14.0.0", "glob": "^7.1.7", "global-agent": "^3.0.0", "handlebars": "^4.7.3", "html-webpack-plugin": "^5.3.1", "inquirer": "^8.2.0", "jest": "^29.7.0", "jest-css-modules": "^2.1.0", "jest-environment-jsdom": "^29.0.2", "jest-runtime": "^29.0.2", "json-schema": "^0.4.0", "lodash": "^4.17.21", "mini-css-extract-plugin": "^2.4.2", "minimatch": "^9.0.0", "node-fetch": "^2.7.0", "node-libs-browser": "^2.2.1", "npm-packlist": "^5.0.0", "ora": "^5.3.0", "p-limit": "^3.1.0", "p-queue": "^6.6.2", "pirates": "^4.0.6", "postcss": "^8.1.0", "process": "^0.11.10", "raw-loader": "^4.0.2", "react-dev-utils": "^12.0.0-next.60", "react-refresh": "^0.14.0", "recursive-readdir": "^2.2.2", "replace-in-file": "^7.1.0", "rollup": "^4.0.0", "rollup-plugin-dts": "^6.1.0", "rollup-plugin-esbuild": "^6.1.1", "rollup-plugin-postcss": "^4.0.0", "rollup-pluginutils": "^2.8.2", "run-script-webpack-plugin": "^0.2.0", "semver": "^7.5.3", "style-loader": "^3.3.1", "sucrase": "^3.20.2", "swc-loader": "^0.2.3", "tar": "^6.1.12", "terser-webpack-plugin": "^5.1.3", "util": "^0.12.3", "webpack": "^5.70.0", "webpack-dev-server": "^5.0.0", "webpack-node-externals": "^3.0.0", "yaml": "^2.0.0", "yml-loader": "^2.1.0", "yn": "^4.0.0", "zod": "^3.22.4" }, "peerDependencies": { "@vitejs/plugin-react": "^4.3.1", "vite": "^5.0.0", "vite-plugin-html": "^3.2.2", "vite-plugin-node-polyfills": "^0.22.0" }, "optionalPeers": ["@vitejs/plugin-react", "vite", "vite-plugin-html", "vite-plugin-node-polyfills"], "bin": { "backstage-cli": "bin/backstage-cli" } }, "sha512-w9TRDy0DGvqhuVVPCVpUEMBzzDvY5jCyrxgxyAOR/V9B9sW5VduXZCmVKIqKOEKoncFutsWFxtYqYuZynKDJag=="], - - "@backstage/cli-common": ["@backstage/cli-common@0.1.16", "", { "dependencies": { "@backstage/errors": "^1.2.7", "cross-spawn": "^7.0.3", "global-agent": "^3.0.0", "undici": "^7.2.3" } }, "sha512-rC2/WhzXK6YYN7jS4bwvbIlji57U8viHFLpLvq4qzskL83IIAvdozbgjY6vcSHughFxHMqYLYs7H3U6h4Z+xGQ=="], - - "@backstage/cli-node": ["@backstage/cli-node@0.2.16", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@manypkg/get-packages": "^1.1.3", "@yarnpkg/parsers": "^3.0.0", "fs-extra": "^11.2.0", "semver": "^7.5.3", "zod": "^3.22.4" } }, "sha512-fmx7B1w8fwR2jJR07gHfO1LsJBbrQbi7bIpd+WEX+wncpm7C4zr7qjXsfg6K5ZjlqeI+0+CqMwtosaPE50bKKA=="], - - "@backstage/config": ["@backstage/config@1.3.6", "", { "dependencies": { "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "ms": "^2.1.3" } }, "sha512-aq/xPfF1+gEBhlQnCS6L+4dzPzM+pKd47AyljMOmcX1SstnK38YErNJvMg47bJOtxQhtxEW6lyZ1aIui6XO4/A=="], - - "@backstage/config-loader": ["@backstage/config-loader@1.10.7", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/json-schema": "^7.0.6", "ajv": "^8.10.0", "chokidar": "^3.5.2", "fs-extra": "^11.2.0", "json-schema": "^0.4.0", "json-schema-merge-allof": "^0.8.1", "json-schema-traverse": "^1.0.0", "lodash": "^4.17.21", "minimist": "^1.2.5", "typescript-json-schema": "^0.67.0", "yaml": "^2.0.0" } }, "sha512-X/x4lBeLd6ByPv5lVa8d8TZh9INWa1mYuRzsvnchLd2oin3hL/RFH3em606Mkb/V+SdvgChpY8+h58laXvxxDA=="], - - "@backstage/core-app-api": ["@backstage/core-app-api@1.19.3", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "@types/prop-types": "^15.7.3", "history": "^5.0.0", "i18next": "^22.4.15", "lodash": "^4.17.21", "prop-types": "^15.7.2", "react-use": "^17.2.4", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-xqF0go5fdf/o74CuFJW8zMi9CJi5qp4N1arFCGpnKTLGUcVWatZHH+SLLiPqsB4xriKQslSMxyEbcQI9zGkOdw=="], - - "@backstage/core-compat-api": ["@backstage/core-compat-api@0.5.5", "", { "dependencies": { "@backstage/core-plugin-api": "^1.12.1", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/plugin-catalog-react": "^1.21.4", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "lodash": "^4.17.21", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-O+t+XelOsOIyqR1FR62oPDznoHcL0lXv1QO9KUqbBHAJURBsPa9t6DOhzXRxflTFA+dhlg4LhlL08MtC65m+qA=="], - - "@backstage/core-components": ["@backstage/core-components@0.14.10", "", { "dependencies": { "@backstage/config": "^1.2.0", "@backstage/core-plugin-api": "^1.9.3", "@backstage/errors": "^1.2.4", "@backstage/theme": "^0.5.6", "@backstage/version-bridge": "^1.0.8", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "dagre": "^0.8.5", "linkify-react": "4.1.3", "linkifyjs": "4.1.3", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" } }, "sha512-RAEIQsJimokQDF0eAuRXSZreo2vjhf4a2tlMbi/edPRaGk4nTOHH7q6V7qLqqX9spTzS0bBAhkuif/v96shJuw=="], - - "@backstage/core-plugin-api": ["@backstage/core-plugin-api@1.12.1", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "history": "^5.0.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-SxESH+BsjX10e3XsmqSZIr7dyLxE9T44lyqYqjt8hDFG7/Dh3LADYty5jI6BXzctWYOKFIKUfnpTsk+iv4w4hQ=="], - - "@backstage/errors": ["@backstage/errors@1.2.7", "", { "dependencies": { "@backstage/types": "^1.2.1", "serialize-error": "^8.0.1" } }, "sha512-XsH0w4hW0aJs3NuANbvgpQoKrQGYIMUaVKeDoGO/99uDgBbJ2QyDb/m9onbKV7tG9HkEe/NKixKqRhxRLx4wzA=="], - - "@backstage/eslint-plugin": ["@backstage/eslint-plugin@0.1.12", "", { "dependencies": { "@manypkg/get-packages": "^1.1.3", "minimatch": "^9.0.0" } }, "sha512-jgG+VF/t8rWSth2Q1BI8kNYKJRsV8k35fzFVPYfdybwejGcqxmJKzVUwbNCyhDKio0Y3ZwfZbohjiaHo+vk50A=="], - - "@backstage/frontend-app-api": ["@backstage/frontend-app-api@0.13.3", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-app-api": "^1.19.3", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/frontend-defaults": "^0.3.4", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "lodash": "^4.17.21", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-FE2+On2zPbhqYb0KNE56Ga4+pgqfEvh1UStbH9VC5pSuhE9oDO6vL7aEjjCo8ErBBfqvZMKkCA0xRNOth9cHPQ=="], - - "@backstage/frontend-defaults": ["@backstage/frontend-defaults@0.3.4", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-components": "^0.18.4", "@backstage/errors": "^1.2.7", "@backstage/frontend-app-api": "^0.13.3", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/plugin-app": "^0.3.3", "@react-hookz/web": "^24.0.0" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-jB4LiqdRRkWQvyeXP0adE56i81sDa74D2gKGx16t079g6/Jf3q6CPpSYhmKyGWgKj2gCwRjTh7xmclO7Cl0zXA=="], - - "@backstage/frontend-plugin-api": ["@backstage/frontend-plugin-api@0.13.2", "", { "dependencies": { "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-bEZjeBvTCGNNDiuB44riq1g/ayPWV5kxXZlIK5No+lnqYco5qraN4TKWjhjUmNSJIQ57/97Cc1QSC02QS+bt1Q=="], - - "@backstage/frontend-test-utils": ["@backstage/frontend-test-utils@0.4.2", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/frontend-app-api": "^0.13.3", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/plugin-app": "^0.3.3", "@backstage/test-utils": "^1.7.14", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "zod": "^3.22.4" }, "peerDependencies": { "@testing-library/react": "^16.0.0", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-O02hVDb2bnA2cs14Xtu/YHYiIjWwWZSLUtyBkmzTV7Ahc1cDkn4ZsNDuYxIveZkGVopg2fCxUxFAdYgDkq32bA=="], - - "@backstage/integration": ["@backstage/integration@1.19.0", "", { "dependencies": { "@azure/identity": "^4.0.0", "@azure/storage-blob": "^12.5.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@octokit/auth-app": "^4.0.0", "@octokit/rest": "^19.0.3", "cross-fetch": "^4.0.0", "git-url-parse": "^15.0.0", "lodash": "^4.17.21", "luxon": "^3.0.0" } }, "sha512-WR9cFbDr1WCoI1jML/zt9wrZCSqQCbQ61CNAi/fYYv5SiDbhhpOVm56qr+5BZjowKRr6qmcuzu9Vb6HpSDbwTw=="], - - "@backstage/integration-aws-node": ["@backstage/integration-aws-node@0.1.19", "", { "dependencies": { "@aws-sdk/client-sts": "^3.350.0", "@aws-sdk/credential-provider-node": "^3.350.0", "@aws-sdk/credential-providers": "^3.350.0", "@aws-sdk/types": "^3.347.0", "@aws-sdk/util-arn-parser": "^3.310.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7" } }, "sha512-BC+tz65IjD6EhnaMgW+gbsqdvQEx2EroovmCCyHOJN6y6cGpPu8BVrvqPXKWIjUXczOVDffrNUQ7w357N+kbBw=="], - - "@backstage/integration-react": ["@backstage/integration-react@1.2.13", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/integration": "^1.19.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-l1+wI4w5zWO4WxhhJY1C5cY005AYP2gfkUfyzVpx8EHVdeSFPv1KPBCmETGXzKI7hgZ4K6jzL+sIynDxKY8ZFQ=="], - - "@backstage/plugin-app": ["@backstage/plugin-app@0.3.3", "", { "dependencies": { "@backstage/core-components": "^0.18.4", "@backstage/core-plugin-api": "^1.12.1", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/integration-react": "^1.2.13", "@backstage/plugin-permission-react": "^0.4.39", "@backstage/theme": "^0.7.1", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "@material-ui/core": "^4.9.13", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "^4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "react-use": "^17.2.4", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-heRxTesxUST5QlanaqqNa7+J9Nu6o0QE018Y5nvFKNcKhdZTQW48acSjZ6mF4OQhAlFOn1G0WLVZcOINhcwNhg=="], - - "@backstage/plugin-app-backend": ["@backstage/plugin-app-backend@0.3.76", "", { "dependencies": { "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "^1.0.1", "@backstage/config": "^1.2.0", "@backstage/config-loader": "^1.9.1", "@backstage/errors": "^1.2.4", "@backstage/plugin-app-node": "^0.1.26", "@backstage/plugin-auth-node": "^0.5.3", "@backstage/types": "^1.1.1", "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "globby": "^11.0.0", "helmet": "^6.0.0", "knex": "^3.0.0", "lodash": "^4.17.21", "luxon": "^3.0.0", "yn": "^4.0.0" } }, "sha512-606xw9p8HGSQnjY4Mg9PzPcg67Iph16f5wa5JCsRKbUzAFt5u3K9J6WxDCD6hIS/TZ3FxHmzRW0kz8J20gN1YQ=="], - - "@backstage/plugin-app-node": ["@backstage/plugin-app-node@0.1.40", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config-loader": "^1.10.7", "@types/express": "^4.17.6", "express": "^4.22.0", "fs-extra": "^11.2.0" } }, "sha512-1vUjiW0EuUxcW+ghTsTgOWI7Xy+A6MxSWK3x8uWHyuw1k4mGIjq36GW7Ti6Y8+PBdxF4GsjRD8C+zQlmyKZYKw=="], - - "@backstage/plugin-auth-backend": ["@backstage/plugin-auth-backend@0.22.12", "", { "dependencies": { "@backstage/backend-common": "^0.24.1", "@backstage/backend-plugin-api": "^0.8.1", "@backstage/catalog-client": "^1.6.6", "@backstage/catalog-model": "^1.6.0", "@backstage/config": "^1.2.0", "@backstage/errors": "^1.2.4", "@backstage/plugin-auth-backend-module-atlassian-provider": "^0.2.5", "@backstage/plugin-auth-backend-module-aws-alb-provider": "^0.1.17", "@backstage/plugin-auth-backend-module-azure-easyauth-provider": "^0.1.7", "@backstage/plugin-auth-backend-module-bitbucket-provider": "^0.1.7", "@backstage/plugin-auth-backend-module-cloudflare-access-provider": "^0.2.1", "@backstage/plugin-auth-backend-module-gcp-iap-provider": "^0.2.19", "@backstage/plugin-auth-backend-module-github-provider": "^0.1.21", "@backstage/plugin-auth-backend-module-gitlab-provider": "^0.1.21", "@backstage/plugin-auth-backend-module-google-provider": "^0.1.21", "@backstage/plugin-auth-backend-module-microsoft-provider": "^0.1.19", "@backstage/plugin-auth-backend-module-oauth2-provider": "^0.2.5", "@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "^0.1.17", "@backstage/plugin-auth-backend-module-oidc-provider": "^0.2.6", "@backstage/plugin-auth-backend-module-okta-provider": "^0.0.17", "@backstage/plugin-auth-backend-module-onelogin-provider": "^0.1.5", "@backstage/plugin-auth-node": "^0.5.1", "@backstage/plugin-catalog-node": "^1.12.6", "@backstage/types": "^1.1.1", "@google-cloud/firestore": "^7.0.0", "@node-saml/passport-saml": "^4.0.4", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "compression": "^1.7.4", "connect-session-knex": "^4.0.0", "cookie-parser": "^1.4.5", "cors": "^2.8.5", "express": "^4.17.1", "express-promise-router": "^4.1.0", "express-session": "^1.17.1", "fs-extra": "^11.2.0", "google-auth-library": "^9.0.0", "jose": "^5.0.0", "knex": "^3.0.0", "lodash": "^4.17.21", "luxon": "^3.0.0", "minimatch": "^9.0.0", "morgan": "^1.10.0", "node-cache": "^5.1.2", "node-fetch": "^2.7.0", "openid-client": "^5.2.1", "passport": "^0.7.0", "passport-auth0": "^1.4.3", "passport-github2": "^0.1.12", "passport-google-oauth20": "^2.0.0", "passport-microsoft": "^1.0.0", "passport-oauth2": "^1.6.1", "passport-onelogin-oauth": "^0.0.1", "uuid": "^9.0.0", "winston": "^3.2.1", "yn": "^4.0.0" } }, "sha512-3mP+kEkyK3HDg4lqWkF5dTLQ1PqE2JI48GTQ6FwuLqNgarrqevxa33nJSXJuSkCWqeAp4VnS0NJAhKYC/GIeyQ=="], - - "@backstage/plugin-auth-backend-module-atlassian-provider": ["@backstage/plugin-auth-backend-module-atlassian-provider@0.2.5", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/plugin-auth-node": "^0.5.1", "express": "^4.18.2", "passport": "^0.7.0", "passport-atlassian-oauth2": "^2.1.0" } }, "sha512-v7QQIyxbYuajbNW9dnGumjIosmkjPbJbd0hkr2GB/VmqiXgcEEj50bhMF50i02CiE4PrHunS+bh0l1pPksYfzg=="], - - "@backstage/plugin-auth-backend-module-aws-alb-provider": ["@backstage/plugin-auth-backend-module-aws-alb-provider@0.1.17", "", { "dependencies": { "@backstage/backend-common": "^0.24.1", "@backstage/backend-plugin-api": "^0.8.1", "@backstage/errors": "^1.2.4", "@backstage/plugin-auth-backend": "^0.22.12", "@backstage/plugin-auth-node": "^0.5.1", "jose": "^5.0.0", "node-cache": "^5.1.2", "node-fetch": "^2.7.0" } }, "sha512-xJdW46fAqVXyoafOR8Tq2RD52FrXCCDpNLrYlOKEa8NaCZCLiaAcn9cqGdax/XtZ6NC48XLmRW8MIzLIXOaQnA=="], - - "@backstage/plugin-auth-backend-module-azure-easyauth-provider": ["@backstage/plugin-auth-backend-module-azure-easyauth-provider@0.1.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/catalog-model": "^1.6.0", "@backstage/errors": "^1.2.4", "@backstage/plugin-auth-node": "^0.5.1", "@types/passport": "^1.0.16", "express": "^4.19.2", "jose": "^5.0.0", "passport": "^0.7.0" } }, "sha512-gZgZRljvtWZRlitLtVso3Os/0b902yjNwEp2cEllWSi4jgMcmBifqJdyjPbJErA5SK4OEZrdbiFUEQZGX7T2rA=="], - - "@backstage/plugin-auth-backend-module-bitbucket-provider": ["@backstage/plugin-auth-backend-module-bitbucket-provider@0.1.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/plugin-auth-node": "^0.5.1", "express": "^4.18.2", "passport": "^0.7.0", "passport-bitbucket-oauth2": "^0.1.2" } }, "sha512-xWqziQ/4ZG4TtyCb3DWR7CcjpOek/4O5WMDuMPkArKS9EM0Hn0CafuFW9v1nYcxIS+ipEYUQdcyrdJqiAWezRw=="], - - "@backstage/plugin-auth-backend-module-cloudflare-access-provider": ["@backstage/plugin-auth-backend-module-cloudflare-access-provider@0.2.1", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/config": "^1.2.0", "@backstage/errors": "^1.2.4", "@backstage/plugin-auth-node": "^0.5.1", "express": "^4.18.2", "jose": "^5.0.0", "node-fetch": "^2.7.0" } }, "sha512-zCce3ePLCE1/Mgzg8VG0WEP9EEUTXgASf0DuEuP1//xjEhxHG8zOY+u1OHNM5p2X8KC+U+smTWuF82nk0oZP3g=="], - - "@backstage/plugin-auth-backend-module-gcp-iap-provider": ["@backstage/plugin-auth-backend-module-gcp-iap-provider@0.2.19", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/errors": "^1.2.4", "@backstage/plugin-auth-node": "^0.5.1", "@backstage/types": "^1.1.1", "google-auth-library": "^9.0.0" } }, "sha512-a9a63CPClGWqHRJzVvnEQObzMkz81Yh/sluaImPk4EH5vsxLfHXQ3Tn7Y4wC+kVSkQiu3ASD1IjXfE1P0ayjiA=="], - - "@backstage/plugin-auth-backend-module-github-provider": ["@backstage/plugin-auth-backend-module-github-provider@0.1.21", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/plugin-auth-node": "^0.5.1", "passport-github2": "^0.1.12" } }, "sha512-qBhswVCnisj+uClNYlTIWcD27ojDj7XS98oKAbaqA6loBGXCJbHzQzzKeb2kJazPDcBCJi7C1WugNItEGwrYZg=="], - - "@backstage/plugin-auth-backend-module-gitlab-provider": ["@backstage/plugin-auth-backend-module-gitlab-provider@0.1.21", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/plugin-auth-node": "^0.5.1", "express": "^4.18.2", "passport": "^0.7.0", "passport-gitlab2": "^5.0.0" } }, "sha512-MaCjxvpY77FFasKADB8QnE2yD4O9+7PjSgPNxNAY8u8xyeqRILVr1X7psZ89WUPwkNJxks+UuzKBy4NT0gvdRg=="], - - "@backstage/plugin-auth-backend-module-google-provider": ["@backstage/plugin-auth-backend-module-google-provider@0.1.21", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/plugin-auth-node": "^0.5.1", "google-auth-library": "^9.0.0", "passport-google-oauth20": "^2.0.0" } }, "sha512-M/kn5TXZ00l44E28hrZX5LajXBSkIw2fXMZXj3KIFUf6L0iLVW5azlCDoEUXfk13d1ngQBUkfHigQKCLHWC93w=="], - - "@backstage/plugin-auth-backend-module-guest-provider": ["@backstage/plugin-auth-backend-module-guest-provider@0.1.10", "", { "dependencies": { "@backstage/backend-common": "^0.24.1", "@backstage/backend-plugin-api": "^0.8.1", "@backstage/catalog-model": "^1.6.0", "@backstage/errors": "^1.2.4", "@backstage/plugin-auth-node": "^0.5.1", "passport-oauth2": "^1.7.0" } }, "sha512-K90TMOuTS6vKKv51YoTWiz27x6IntwXb+vSPLng905vgem8kj9zBlhv53S6hCL3wwyq8Du5PYGUWawVah0SadQ=="], - - "@backstage/plugin-auth-backend-module-microsoft-provider": ["@backstage/plugin-auth-backend-module-microsoft-provider@0.1.19", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/plugin-auth-node": "^0.5.1", "express": "^4.18.2", "jose": "^5.0.0", "node-fetch": "^2.7.0", "passport-microsoft": "^1.0.0" } }, "sha512-Xl4F+R4YDGSCOwL4ZDYoNEbyAXzs6SAKe7aTaWUi99/0Dx/yJWdrJBkqBDwShLybjqiHSpkt5otFZzONsx1Yvg=="], - - "@backstage/plugin-auth-backend-module-oauth2-provider": ["@backstage/plugin-auth-backend-module-oauth2-provider@0.2.5", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/plugin-auth-node": "^0.5.1", "passport": "^0.7.0", "passport-oauth2": "^1.6.1" } }, "sha512-n+1j5SR2EFERgmJhYZeK5+tOaxnnQwi6DsKN6KeGHQzsn4dISeAeDsO3yDiQT0tSneaW9UlWC1iO44YcDeI3Dg=="], - - "@backstage/plugin-auth-backend-module-oauth2-proxy-provider": ["@backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.1.17", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/errors": "^1.2.4", "@backstage/plugin-auth-node": "^0.5.1", "jose": "^5.0.0" } }, "sha512-TbXg8LFe2zgfvh/niWBlDMQMyfiB4xNJt7Ie3j+JTrgyjJnYLJ+ZZrvOeYq+s0pVOpRPuQ/qO1WiExVg4cfXPw=="], - - "@backstage/plugin-auth-backend-module-oidc-provider": ["@backstage/plugin-auth-backend-module-oidc-provider@0.2.6", "", { "dependencies": { "@backstage/backend-common": "^0.24.1", "@backstage/backend-plugin-api": "^0.8.1", "@backstage/plugin-auth-backend": "^0.22.12", "@backstage/plugin-auth-node": "^0.5.1", "express": "^4.18.2", "openid-client": "^5.5.0", "passport": "^0.7.0" } }, "sha512-Naf6Bm5Gf/7CNtYtmHqZepJ6pf8CKiDFK5gfojQ8v+bTc3UTarxOassV5oG77JyOVPrXmWZwRWz7Ywl6aYYgEw=="], - - "@backstage/plugin-auth-backend-module-okta-provider": ["@backstage/plugin-auth-backend-module-okta-provider@0.0.17", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/plugin-auth-node": "^0.5.1", "@davidzemon/passport-okta-oauth": "^0.0.5", "express": "^4.18.2", "passport": "^0.7.0" } }, "sha512-ls4wdab8/voIYIw5Wbh+Rc5xnGKExdsSUkj1Kj9jyg3H5Fl6LnDp1gNox52mJHnLouRSFxLWrjWQiKCjPaRHwg=="], - - "@backstage/plugin-auth-backend-module-onelogin-provider": ["@backstage/plugin-auth-backend-module-onelogin-provider@0.1.5", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1", "@backstage/plugin-auth-node": "^0.5.1", "express": "^4.18.2", "passport": "^0.7.0", "passport-onelogin-oauth": "^0.0.1" } }, "sha512-Q7u89CDPn0r3PTOljD3abN6x2k2RkOGPHMCoXsjCXkjIzB4lt/fpPus1ggsiZH29ewhrY3AtLl0AJD/Yft/5KA=="], - - "@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.5.6", "", { "dependencies": { "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "^1.1.1", "@backstage/catalog-client": "^1.9.1", "@backstage/catalog-model": "^1.7.3", "@backstage/config": "^1.3.2", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.1", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.17.1", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "winston": "^3.2.1", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-C3hI7gB0hQwc/NORjZYDB368UTbZe1g2md8LHfTLeIeuyoZyFGAODKZa0XCwLFAX99awttkVeuOjffNLR295Sw=="], - - "@backstage/plugin-catalog": ["@backstage/plugin-catalog@1.32.1", "", { "dependencies": { "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/core-compat-api": "^0.5.5", "@backstage/core-components": "^0.18.4", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/integration-react": "^1.2.13", "@backstage/plugin-catalog-common": "^1.1.7", "@backstage/plugin-catalog-react": "^1.21.4", "@backstage/plugin-permission-react": "^0.4.39", "@backstage/plugin-scaffolder-common": "^1.7.4", "@backstage/plugin-search-common": "^1.2.21", "@backstage/plugin-search-react": "^1.10.1", "@backstage/plugin-techdocs-common": "^0.1.1", "@backstage/plugin-techdocs-react": "^1.3.6", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@mui/utils": "^5.14.15", "classnames": "^2.3.1", "dataloader": "^2.0.0", "history": "^5.0.0", "lodash": "^4.17.21", "pluralize": "^8.0.0", "react-helmet": "6.1.0", "react-use": "^17.2.4", "zen-observable": "^0.10.0" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-Xni8jdlvoOAI2OGaxEPayQrDJJY3physVMfhNZJU6o/zkuiieiIx/oiGgfq3K5eXtf8Nft1comn+wmmYLpeC+Q=="], - - "@backstage/plugin-catalog-backend": ["@backstage/plugin-catalog-backend@1.32.1", "", { "dependencies": { "@backstage/backend-common": "^0.25.0", "@backstage/backend-openapi-utils": "^0.5.2", "@backstage/backend-plugin-api": "^1.3.0", "@backstage/catalog-client": "^1.9.1", "@backstage/catalog-model": "^1.7.3", "@backstage/config": "^1.3.2", "@backstage/errors": "^1.2.7", "@backstage/integration": "^1.16.3", "@backstage/plugin-catalog-common": "^1.1.3", "@backstage/plugin-catalog-node": "^1.16.3", "@backstage/plugin-events-node": "^0.4.10", "@backstage/plugin-permission-common": "^0.8.4", "@backstage/plugin-permission-node": "^0.9.1", "@backstage/plugin-search-backend-module-catalog": "^0.3.3", "@backstage/plugin-search-common": "^1.2.17", "@backstage/types": "^1.2.1", "@opentelemetry/api": "^1.9.0", "@types/express": "^4.17.6", "codeowners-utils": "^1.0.2", "core-js": "^3.6.5", "express": "^4.17.1", "fast-json-stable-stringify": "^2.1.0", "fs-extra": "^11.2.0", "git-url-parse": "^15.0.0", "glob": "^7.1.6", "knex": "^3.0.0", "lodash": "^4.17.21", "luxon": "^3.0.0", "minimatch": "^9.0.0", "p-limit": "^3.0.2", "prom-client": "^15.0.0", "uuid": "^11.0.0", "yaml": "^2.0.0", "yn": "^4.0.0", "zod": "^3.22.4" } }, "sha512-qmwoGXUi31mg2WSkVUzMUH44KiIl74dQ5goZqg/AMaplyJkudBogyTvwwfJprSvURUyGZ4N42su5SW5S8wIZzw=="], - - "@backstage/plugin-catalog-common": ["@backstage/plugin-catalog-common@1.1.7", "", { "dependencies": { "@backstage/catalog-model": "^1.7.6", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-search-common": "^1.2.21" } }, "sha512-HIU99MiXvPpUbdsdNtXo+sLo+eMcePjnj8eqIZ9JAkTmod+wGV38T96cYJlyevp4tix80djz8qyuc2FjJTY5LQ=="], - - "@backstage/plugin-catalog-graph": ["@backstage/plugin-catalog-graph@0.4.22", "", { "dependencies": { "@backstage/catalog-client": "^1.11.0", "@backstage/catalog-model": "^1.7.5", "@backstage/core-compat-api": "^0.5.0", "@backstage/core-components": "^0.17.5", "@backstage/core-plugin-api": "^1.10.9", "@backstage/frontend-plugin-api": "^0.11.0", "@backstage/plugin-catalog-react": "^1.20.0", "@backstage/types": "^1.2.1", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "classnames": "^2.3.1", "lodash": "^4.17.15", "p-limit": "^3.1.0", "qs": "^6.9.4", "react-use": "^17.2.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-x5WieCiI4/wA6KOdSmCc00B9Tr5uMZUPalhSVKpuaQYG8cP36lNoSm2Ad2DQIbnDaKX9K5r/yQa9o4CY3OTg1Q=="], - - "@backstage/plugin-catalog-import": ["@backstage/plugin-catalog-import@0.12.13", "", { "dependencies": { "@backstage/catalog-client": "^1.9.1", "@backstage/catalog-model": "^1.7.3", "@backstage/config": "^1.3.2", "@backstage/core-compat-api": "^0.4.1", "@backstage/core-components": "^0.17.1", "@backstage/core-plugin-api": "^1.10.6", "@backstage/errors": "^1.2.7", "@backstage/frontend-plugin-api": "^0.10.1", "@backstage/integration": "^1.16.3", "@backstage/integration-react": "^1.2.6", "@backstage/plugin-catalog-common": "^1.1.3", "@backstage/plugin-catalog-react": "^1.17.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@octokit/rest": "^19.0.3", "git-url-parse": "^15.0.0", "js-base64": "^3.6.0", "lodash": "^4.17.21", "react-hook-form": "^7.12.2", "react-use": "^17.2.4", "yaml": "^2.0.0" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-ZzDYCo277RRuZbFoAIt+xN2+5P67MsONsLFd2kmCQp4gODJaaLS2j9R7ByGMW9ltvRDcoj38ffzlDeI4sTMK0g=="], - - "@backstage/plugin-catalog-node": ["@backstage/plugin-catalog-node@1.20.1", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-catalog-common": "^1.1.7", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "lodash": "^4.17.21", "yaml": "^2.0.0" } }, "sha512-EkIk1mzHL3ffOgWXN1qC7gRxbraEQalAbsYzDaa57FdGM+Dabagdx18kC0L00AkGdUxzQk1GTL7bTo8Vptua3A=="], - - "@backstage/plugin-catalog-react": ["@backstage/plugin-catalog-react@1.21.4", "", { "dependencies": { "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/core-compat-api": "^0.5.5", "@backstage/core-components": "^0.18.4", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/frontend-test-utils": "^0.4.2", "@backstage/integration-react": "^1.2.13", "@backstage/plugin-catalog-common": "^1.1.7", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-react": "^0.4.39", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "classnames": "^2.2.6", "lodash": "^4.17.21", "material-ui-popup-state": "^5.3.6", "qs": "^6.9.4", "react-use": "^17.2.4", "yaml": "^2.0.0", "zen-observable": "^0.10.0" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-F8hkM8QsvV4ueAX7TQpHBVUs4hTsyES0KPlPVGDb1YPx9aqYi5kIrK70Tik5z2xib3u3fNlBIPk+lKhvLhw6rg=="], - - "@backstage/plugin-events-node": ["@backstage/plugin-events-node@0.3.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^0.8.1" } }, "sha512-A+x674f5VrrwkIxm3LskvnMC7Cw2HibYLvf89jIJFDLsimktOiKwKqv6o11yhqJjoUhaul+z/sDJeQsCMg+Dmg=="], - - "@backstage/plugin-home": ["@backstage/plugin-home@0.7.11", "", { "dependencies": { "@backstage/catalog-client": "^1.7.0", "@backstage/catalog-model": "^1.7.0", "@backstage/config": "^1.2.0", "@backstage/core-app-api": "^1.15.0", "@backstage/core-compat-api": "^0.3.0", "@backstage/core-components": "^0.15.0", "@backstage/core-plugin-api": "^1.9.4", "@backstage/frontend-plugin-api": "^0.8.0", "@backstage/plugin-catalog-react": "^1.13.1", "@backstage/plugin-home-react": "^0.1.17", "@backstage/theme": "^0.5.7", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@rjsf/core": "5.21.1", "@rjsf/material-ui": "5.21.1", "@rjsf/utils": "5.21.1", "@rjsf/validator-ajv8": "5.21.1", "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "lodash": "^4.17.21", "luxon": "^3.4.3", "react-grid-layout": "1.3.4", "react-resizable": "^3.0.4", "react-use": "^17.2.4", "zod": "^3.22.4" }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" } }, "sha512-GdJMFAPx2laf+FddMhS5RIlvM47j8bApp+7IkiBxm9G0hSTtUpij1ZKGp2SXynTOI6zH2h3PKpjcxMUQertJeQ=="], - - "@backstage/plugin-home-react": ["@backstage/plugin-home-react@0.1.33", "", { "dependencies": { "@backstage/core-components": "^0.18.4", "@backstage/core-plugin-api": "^1.12.1", "@backstage/frontend-plugin-api": "^0.13.2", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@rjsf/utils": "5.24.13" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-LNwgk6c/Rw8LZqCPM8+NHmW9IYlOQ/dOvz7N1CdkBPyTGDcJa7Bu9KnerMnexa4IN2bKi/qGM/YcijyAva2v+A=="], - - "@backstage/plugin-permission-common": ["@backstage/plugin-permission-common@0.9.3", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "cross-fetch": "^4.0.0", "uuid": "^11.0.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-QB9HtU4DlKyWaQFJvwiiURej1GYeMn4fB38lsVmvHuFTxraMIwEgoHjSjzdCFBBItrOUl4FILaaIZBtJGei9vA=="], - - "@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.8.8", "", { "dependencies": { "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "^1.2.0", "@backstage/config": "^1.3.2", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.0", "@backstage/plugin-permission-common": "^0.8.4", "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-CCOjbKFyaZB81fxc/+HAzTsHWfY07XUb6KGNw4D0UlObMLfozfJX09/wvOEM51jDWo+E1YprZ/HJ9CafGfWvgg=="], - - "@backstage/plugin-permission-react": ["@backstage/plugin-permission-react@0.4.39", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/plugin-permission-common": "^0.9.3", "swr": "^2.0.0" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-qCS1AYd0iKGe4Y+LrRRBPF2wlY85tf7rs6tJ6PpR530+WV04SXzthCNNdnjyuoqIFG2RxwbZ9V2F3KVx3gqP7A=="], - - "@backstage/plugin-proxy-backend": ["@backstage/plugin-proxy-backend@0.5.11", "", { "dependencies": { "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "^1.2.0", "@backstage/config": "^1.3.2", "@backstage/plugin-proxy-node": "^0.1.1", "@backstage/types": "^1.2.1", "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "http-proxy-middleware": "^2.0.0", "morgan": "^1.10.0", "uuid": "^11.0.0", "winston": "^3.2.1", "yaml": "^2.0.0", "yn": "^4.0.0", "yup": "^1.0.0" } }, "sha512-lfTpfLgKPehz7GYhZl0gTMzLq3+0vEuu4N5wuKJyYQ6mxHoZJB9vDaZZoEqpkGoqTfL9gk0fO0UR8yKZuJNqUg=="], - - "@backstage/plugin-proxy-node": ["@backstage/plugin-proxy-node@0.1.11", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "http-proxy-middleware": "^2.0.0" } }, "sha512-oorNVc9LEGbh7n2YTVnPZklR8/SImsGYe49VaiQLKviePIZlfPKq3yjHtWfeoJMAo5sVND81mEXNSsmG04hhTA=="], - - "@backstage/plugin-scaffolder-common": ["@backstage/plugin-scaffolder-common@1.7.4", "", { "dependencies": { "@backstage/catalog-model": "^1.7.6", "@backstage/errors": "^1.2.7", "@backstage/integration": "^1.19.0", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/types": "^1.2.2", "@microsoft/fetch-event-source": "^2.0.1", "@types/json-schema": "^7.0.9", "cross-fetch": "^4.0.0", "json-schema": "^0.4.0", "uri-template": "^2.0.0", "zen-observable": "^0.10.0" } }, "sha512-cgzdxFhuiwXl5jjlaBGrT0lJ9hJXTr3uzM8zW16Xccz5nt2G/6gmYNy7l6Zl25wkpdfZ89V4b5OIfDNuRmFu0Q=="], - - "@backstage/plugin-search": ["@backstage/plugin-search@1.5.1", "", { "dependencies": { "@backstage/core-components": "^0.18.4", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/plugin-catalog-react": "^1.21.4", "@backstage/plugin-search-common": "^1.2.21", "@backstage/plugin-search-react": "^1.10.1", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "qs": "^6.9.4", "react-use": "^17.2.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-hiwbMhAgQlFRYWzI3+CRuhVQzhMMZZXwhU+JXBclv+6V6ViYRPvX3TWqaABgL8Y0qTy4KxNbHlCnl2XuWdsb/g=="], - - "@backstage/plugin-search-backend-module-catalog": ["@backstage/plugin-search-backend-module-catalog@0.3.11", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-catalog-common": "^1.1.7", "@backstage/plugin-catalog-node": "^1.20.1", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-search-backend-node": "^1.4.0", "@backstage/plugin-search-common": "^1.2.21" } }, "sha512-xnv893eCNcxy70XIi0tKw2LItea2+Qh8k7aEJo4G9DiZKgg5lBtNBGj3mW6hlzVkKLhJdTc8PF29xvs+o8SCkQ=="], - - "@backstage/plugin-search-backend-node": ["@backstage/plugin-search-backend-node@1.4.0", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-search-common": "^1.2.21", "@types/lunr": "^2.3.3", "lodash": "^4.17.21", "lunr": "^2.3.9", "ndjson": "^2.0.0", "uuid": "^11.0.0" } }, "sha512-zztPebLhqQ1aeOrbpSLeuwlSKowyQnTZGjmxMpGZGTU27CA5VBN9IJ+PwNocug3F221LGgvYwKr+XJOp53YjNQ=="], - - "@backstage/plugin-search-common": ["@backstage/plugin-search-common@1.2.21", "", { "dependencies": { "@backstage/plugin-permission-common": "^0.9.3", "@backstage/types": "^1.2.2" } }, "sha512-3M42J4R+qenDSO2fJhHq6V/NN5dFOYBEwuCLKZWPj+4gpeXYdLXaEEF0qTu9oZJqjjQYFrU1k6p1nfw7Ltwaag=="], - - "@backstage/plugin-search-react": ["@backstage/plugin-search-react@1.10.1", "", { "dependencies": { "@backstage/core-components": "^0.18.4", "@backstage/core-plugin-api": "^1.12.1", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/plugin-search-common": "^1.2.21", "@backstage/theme": "^0.7.1", "@backstage/types": "^1.2.2", "@backstage/version-bridge": "^1.0.11", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "lodash": "^4.17.21", "qs": "^6.9.4", "react-use": "^17.3.2", "uuid": "^11.0.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-J/5JPg5JVnO3GwqupQmDlRDbHFu/UX0V7qOfgunhu6GAj0XdmiQjWPIytobQ1UmdsXKjyXl+y8gYHwgEfd88iA=="], - - "@backstage/plugin-techdocs-common": ["@backstage/plugin-techdocs-common@0.1.1", "", {}, "sha512-MWYW1uVweSJQkI9it2g0xM/4YfykS0GzIlbA3D9YawQIfqQ7UCdsblKHt2Xb3eWLrk+itWrp4IXbW2bUa02DyA=="], - - "@backstage/plugin-techdocs-react": ["@backstage/plugin-techdocs-react@1.3.6", "", { "dependencies": { "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/core-components": "^0.18.4", "@backstage/core-plugin-api": "^1.12.1", "@backstage/frontend-plugin-api": "^0.13.2", "@backstage/plugin-techdocs-common": "^0.1.1", "@backstage/version-bridge": "^1.0.11", "@material-ui/core": "^4.12.2", "@material-ui/styles": "^4.11.0", "jss": "~10.10.0", "lodash": "^4.17.21", "react-helmet": "6.1.0", "react-use": "^17.2.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-++GFQUYH/E9ixtClNlZDid7erfI+arwp4+CTC/Wt8vucwJVsc/Ex02ztVTuyiwDSc/iYnqepnm8rDgyQX/lf/Q=="], - - "@backstage/release-manifests": ["@backstage/release-manifests@0.0.11", "", { "dependencies": { "cross-fetch": "^4.0.0" } }, "sha512-OZFwv7ohRRB9fDQ+fShgQgM5H4VvKXAtvErSjZCmqGnUiNpyT9e/km0wF2/QVTm2ry5kCEj37f/B/dDp0gmNAw=="], - - "@backstage/test-utils": ["@backstage/test-utils@1.7.14", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-app-api": "^1.19.3", "@backstage/core-plugin-api": "^1.12.1", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-react": "^0.4.39", "@backstage/theme": "^0.7.1", "@backstage/types": "^1.2.2", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "cross-fetch": "^4.0.0", "i18next": "^22.4.15", "zen-observable": "^0.10.0" }, "peerDependencies": { "@testing-library/react": "^16.0.0", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-LyjfJHO9Hu3rPQLZHe3GAVSxzRoIf7hLhIoVx4Zwq4J+EZVcOnCG2TCp8VWFGZoADYiv6/V5YxVd2J0GQoBn9g=="], - - "@backstage/theme": ["@backstage/theme@0.5.7", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" } }, "sha512-XztEKnNot3DA4BuLZJocbSYvpYpWm/OF9PP7nOk9pJ4Jg4YIrEzZxOxPorOp7r/UhZhLwnqneIV3RcFBhOt9BA=="], - - "@backstage/types": ["@backstage/types@1.2.2", "", {}, "sha512-gCctHIL3VSCKiffbWDq4Zl2n7g8NPO/dD2ksdOEm9KzWfb5AubsfQzakoKjZ8XvmdaY9jY7j1yRmHSjAqq7rBA=="], - - "@backstage/ui": ["@backstage/ui@0.10.0", "", { "dependencies": { "@remixicon/react": "^4.6.0", "@tanstack/react-table": "^8.21.3", "clsx": "^2.1.1", "react-aria-components": "^1.13.0" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-eKIAVM7bnPhuj7TIMYO/jeQ6QkqxyzG3lJj+k9J7XvmxuHK1YQlmdhUrfhMu/s6/NYO1TR5kw7pdxtwN3vMGwA=="], - - "@backstage/version-bridge": ["@backstage/version-bridge@1.0.11", "", { "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-gigfUgs6cLWAkU5EZp6C4hwSp7UsYMXf2W6EcLPn/IQAzeO77v2y+SEhWa0MBrfAgxQdEdvcztRCCkTdiXWcxQ=="], - - "@balena/dockerignore": ["@balena/dockerignore@1.0.2", "", {}, "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q=="], - - "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], - - "@changesets/types": ["@changesets/types@4.1.0", "", {}, "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw=="], - - "@colors/colors": ["@colors/colors@1.6.0", "", {}, "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA=="], - - "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], - - "@dabh/diagnostics": ["@dabh/diagnostics@2.0.8", "", { "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q=="], - - "@dagrejs/dagre": ["@dagrejs/dagre@1.1.8", "", { "dependencies": { "@dagrejs/graphlib": "2.2.4" } }, "sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw=="], - - "@dagrejs/graphlib": ["@dagrejs/graphlib@2.2.4", "", {}, "sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw=="], - - "@date-io/core": ["@date-io/core@1.3.13", "", {}, "sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA=="], - - "@date-io/date-fns": ["@date-io/date-fns@1.3.13", "", { "dependencies": { "@date-io/core": "^1.3.13" }, "peerDependencies": { "date-fns": "^2.0.0" } }, "sha512-yXxGzcRUPcogiMj58wVgFjc9qUYrCnnU9eLcyNbsQCmae4jPuZCDoIBR21j8ZURsM7GRtU62VOw5yNd4dDHunA=="], - - "@davidzemon/passport-okta-oauth": ["@davidzemon/passport-okta-oauth@0.0.5", "", { "dependencies": { "@types/passport-oauth2": "^1.4.11", "passport-oauth2": "^1.6.1", "pkginfo": "^0.4.1", "uid2": "^1.0.0" } }, "sha512-eaC2Ve2MIoqR7dLKgpHxhVKRcfgJCes0Fozxm5SefZh/zqLNb8tGIou+dj0EbylksLmB+nVlhr8p8qwjA9n2sA=="], - - "@emnapi/core": ["@emnapi/core@1.7.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg=="], - - "@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="], - - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], - - "@emotion/babel-plugin": ["@emotion/babel-plugin@11.13.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.2.0" } }, "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="], - - "@emotion/cache": ["@emotion/cache@11.14.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA=="], - - "@emotion/hash": ["@emotion/hash@0.8.0", "", {}, "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="], - - "@emotion/is-prop-valid": ["@emotion/is-prop-valid@1.4.0", "", { "dependencies": { "@emotion/memoize": "^0.9.0" } }, "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw=="], - - "@emotion/memoize": ["@emotion/memoize@0.9.0", "", {}, "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="], - - "@emotion/react": ["@emotion/react@11.14.0", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA=="], - - "@emotion/serialize": ["@emotion/serialize@1.3.3", "", { "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA=="], - - "@emotion/sheet": ["@emotion/sheet@1.4.0", "", {}, "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="], - - "@emotion/styled": ["@emotion/styled@11.14.1", "", { "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", "react": ">=16.8.0" } }, "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw=="], - - "@emotion/unitless": ["@emotion/unitless@0.10.0", "", {}, "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="], - - "@emotion/use-insertion-effect-with-fallbacks": ["@emotion/use-insertion-effect-with-fallbacks@1.2.0", "", { "peerDependencies": { "react": ">=16.8.0" } }, "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg=="], - - "@emotion/utils": ["@emotion/utils@1.4.2", "", {}, "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA=="], - - "@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="], - - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.23.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.23.1", "", { "os": "android", "cpu": "arm" }, "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.23.1", "", { "os": "android", "cpu": "arm64" }, "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.23.1", "", { "os": "android", "cpu": "x64" }, "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.23.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.23.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.23.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.23.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.23.1", "", { "os": "linux", "cpu": "arm" }, "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.23.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.23.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.23.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.23.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.23.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ=="], - - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.2", "", { "os": "none", "cpu": "arm64" }, "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.23.1", "", { "os": "none", "cpu": "x64" }, "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA=="], - - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.23.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.23.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA=="], - - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.2", "", { "os": "none", "cpu": "arm64" }, "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.23.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.23.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.23.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.23.1", "", { "os": "win32", "cpu": "x64" }, "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg=="], - - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], - - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], - - "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], - - "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], - - "@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@2.3.6", "", { "dependencies": { "@formatjs/fast-memoize": "2.2.7", "@formatjs/intl-localematcher": "0.6.2", "decimal.js": "^10.4.3", "tslib": "^2.8.0" } }, "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw=="], - - "@formatjs/fast-memoize": ["@formatjs/fast-memoize@2.2.7", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ=="], - - "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@2.11.4", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/icu-skeleton-parser": "1.8.16", "tslib": "^2.8.0" } }, "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw=="], - - "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@1.8.16", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "tslib": "^2.8.0" } }, "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ=="], - - "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.6.2", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA=="], - - "@google-cloud/firestore": ["@google-cloud/firestore@7.11.6", "", { "dependencies": { "@opentelemetry/api": "^1.3.0", "fast-deep-equal": "^3.1.1", "functional-red-black-tree": "^1.0.1", "google-gax": "^4.3.3", "protobufjs": "^7.2.6" } }, "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw=="], - - "@google-cloud/paginator": ["@google-cloud/paginator@5.0.2", "", { "dependencies": { "arrify": "^2.0.0", "extend": "^3.0.2" } }, "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg=="], - - "@google-cloud/projectify": ["@google-cloud/projectify@4.0.0", "", {}, "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA=="], - - "@google-cloud/promisify": ["@google-cloud/promisify@4.0.0", "", {}, "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g=="], - - "@google-cloud/storage": ["@google-cloud/storage@7.18.0", "", { "dependencies": { "@google-cloud/paginator": "^5.0.0", "@google-cloud/projectify": "^4.0.0", "@google-cloud/promisify": "<4.1.0", "abort-controller": "^3.0.0", "async-retry": "^1.3.3", "duplexify": "^4.1.3", "fast-xml-parser": "^4.4.1", "gaxios": "^6.0.2", "google-auth-library": "^9.6.3", "html-entities": "^2.5.2", "mime": "^3.0.0", "p-limit": "^3.0.1", "retry-request": "^7.0.0", "teeny-request": "^9.0.0", "uuid": "^8.0.0" } }, "sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ=="], - - "@graphql-tools/merge": ["@graphql-tools/merge@8.3.1", "", { "dependencies": { "@graphql-tools/utils": "8.9.0", "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg=="], - - "@graphql-tools/schema": ["@graphql-tools/schema@8.5.1", "", { "dependencies": { "@graphql-tools/merge": "8.3.1", "@graphql-tools/utils": "8.9.0", "tslib": "^2.4.0", "value-or-promise": "1.0.11" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg=="], - - "@graphql-tools/utils": ["@graphql-tools/utils@8.13.1", "", { "dependencies": { "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw=="], - - "@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="], - - "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], - - "@happy-dom/global-registrator": ["@happy-dom/global-registrator@20.0.11", "", { "dependencies": { "@types/node": "^20.0.0", "happy-dom": "^20.0.11" } }, "sha512-GqNqiShBT/lzkHTMC/slKBrvN0DsD4Di8ssBk4aDaVgEn+2WMzE6DXxq701ndSXj7/0cJ8mNT71pM7Bnrr6JRw=="], - - "@httptoolkit/httpolyglot": ["@httptoolkit/httpolyglot@2.2.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-Mm75bidN/jrUsuhBjHAMoQbmR52zQYi8xr/+0mQYGW+dQelg+sdJR/kGRKKZGeAoPgp/1rrZWJqdohZP0xm18g=="], - - "@httptoolkit/subscriptions-transport-ws": ["@httptoolkit/subscriptions-transport-ws@0.11.2", "", { "dependencies": { "backo2": "^1.0.2", "eventemitter3": "^3.1.0", "iterall": "^1.2.1", "symbol-observable": "^1.0.4", "ws": "^8.8.0" }, "peerDependencies": { "graphql": "^15.7.2 || ^16.0.0" } }, "sha512-YB+gYYVjgYUeJrGkfS91ABeNWCFU7EVcn9Cflf2UXjsIiPJEI6yPxujPcjKv9wIJpM+33KQW/qVEmc+BdIDK2w=="], - - "@httptoolkit/websocket-stream": ["@httptoolkit/websocket-stream@6.0.1", "", { "dependencies": { "@types/ws": "*", "duplexify": "^3.5.1", "inherits": "^2.0.1", "isomorphic-ws": "^4.0.1", "readable-stream": "^2.3.3", "safe-buffer": "^5.1.2", "ws": "*", "xtend": "^4.0.0" } }, "sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ=="], - - "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="], - - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], - - "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], - - "@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="], - - "@inquirer/confirm": ["@inquirer/confirm@5.1.21", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ=="], - - "@inquirer/core": ["@inquirer/core@10.3.2", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A=="], - - "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="], - - "@inquirer/figures": ["@inquirer/figures@1.0.15", "", {}, "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g=="], - - "@inquirer/type": ["@inquirer/type@3.0.10", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA=="], - - "@internationalized/date": ["@internationalized/date@3.10.1", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA=="], - - "@internationalized/message": ["@internationalized/message@3.1.8", "", { "dependencies": { "@swc/helpers": "^0.5.0", "intl-messageformat": "^10.1.0" } }, "sha512-Rwk3j/TlYZhn3HQ6PyXUV0XP9Uv42jqZGNegt0BXlxjE6G3+LwHjbQZAGHhCnCPdaA6Tvd3ma/7QzLlLkJxAWA=="], - - "@internationalized/number": ["@internationalized/number@3.6.5", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g=="], - - "@internationalized/string": ["@internationalized/string@3.2.7", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-D4OHBjrinH+PFZPvfCXvG28n2LSykWcJ7GIioQL+ok0LON15SdfoUssoHzzOUmVZLbRoREsQXVzA6r8JKsbP6A=="], - - "@ioredis/commands": ["@ioredis/commands@1.4.0", "", {}, "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ=="], - - "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], - - "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], - - "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="], - - "@jest/console": ["@jest/console@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg=="], - - "@jest/core": ["@jest/core@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.7.0", "jest-config": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-resolve-dependencies": "^29.7.0", "jest-runner": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg=="], - - "@jest/create-cache-key-function": ["@jest/create-cache-key-function@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0" } }, "sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg=="], - - "@jest/environment": ["@jest/environment@29.7.0", "", { "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" } }, "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw=="], - - "@jest/expect": ["@jest/expect@29.7.0", "", { "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" } }, "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ=="], - - "@jest/expect-utils": ["@jest/expect-utils@29.7.0", "", { "dependencies": { "jest-get-type": "^29.6.3" } }, "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA=="], - - "@jest/fake-timers": ["@jest/fake-timers@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ=="], - - "@jest/globals": ["@jest/globals@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" } }, "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ=="], - - "@jest/pattern": ["@jest/pattern@30.0.1", "", { "dependencies": { "@types/node": "*", "jest-regex-util": "30.0.1" } }, "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA=="], - - "@jest/reporters": ["@jest/reporters@29.7.0", "", { "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg=="], - - "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], - - "@jest/source-map": ["@jest/source-map@29.6.3", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw=="], - - "@jest/test-result": ["@jest/test-result@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA=="], - - "@jest/test-sequencer": ["@jest/test-sequencer@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw=="], - - "@jest/transform": ["@jest/transform@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw=="], - - "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], - - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], - - "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], - - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - - "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - - "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], - - "@jsdevtools/ono": ["@jsdevtools/ono@7.1.3", "", {}, "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="], - - "@jsonjoy.com/base64": ["@jsonjoy.com/base64@1.1.2", "", { "peerDependencies": { "tslib": "2" } }, "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA=="], - - "@jsonjoy.com/buffers": ["@jsonjoy.com/buffers@1.2.1", "", { "peerDependencies": { "tslib": "2" } }, "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA=="], - - "@jsonjoy.com/codegen": ["@jsonjoy.com/codegen@1.0.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g=="], - - "@jsonjoy.com/json-pack": ["@jsonjoy.com/json-pack@1.21.0", "", { "dependencies": { "@jsonjoy.com/base64": "^1.1.2", "@jsonjoy.com/buffers": "^1.2.0", "@jsonjoy.com/codegen": "^1.0.0", "@jsonjoy.com/json-pointer": "^1.0.2", "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", "thingies": "^2.5.0", "tree-dump": "^1.1.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg=="], - - "@jsonjoy.com/json-pointer": ["@jsonjoy.com/json-pointer@1.0.2", "", { "dependencies": { "@jsonjoy.com/codegen": "^1.0.0", "@jsonjoy.com/util": "^1.9.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg=="], - - "@jsonjoy.com/util": ["@jsonjoy.com/util@1.9.0", "", { "dependencies": { "@jsonjoy.com/buffers": "^1.0.0", "@jsonjoy.com/codegen": "^1.0.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ=="], - - "@keyv/memcache": ["@keyv/memcache@1.4.1", "", { "dependencies": { "json-buffer": "^3.0.1", "memjs": "^1.3.2" } }, "sha512-BoXgJG3xZO6J3JPuJGzbP+gyc1QcqzEK7o0SP7TFdMu+AXJ8LAXflCqJug3BmDNTCnBb3mqUgMr01EOhJ+CqWw=="], - - "@keyv/redis": ["@keyv/redis@2.8.5", "", { "dependencies": { "ioredis": "^5.4.1" } }, "sha512-e9W1faN32A1Wy5726qtorAvPu1Xffh75ngfQQtETQ0hIN/FQtK0RcBTz/OH/vwDvLX8zrzdu0sWq/KoSHDYfVw=="], - - "@kubernetes/client-node": ["@kubernetes/client-node@0.20.0", "", { "dependencies": { "@types/js-yaml": "^4.0.1", "@types/node": "^20.1.1", "@types/request": "^2.47.1", "@types/ws": "^8.5.3", "byline": "^5.0.0", "isomorphic-ws": "^5.0.0", "js-yaml": "^4.1.0", "jsonpath-plus": "^7.2.0", "request": "^2.88.0", "rfc4648": "^1.3.0", "stream-buffers": "^3.0.2", "tar": "^6.1.11", "tslib": "^2.4.1", "ws": "^8.11.0" }, "optionalDependencies": { "openid-client": "^5.3.0" } }, "sha512-xxlv5GLX4FVR/dDKEsmi4SPeuB49aRc35stndyxcC73XnUEEwF39vXbROpHOirmDse8WE9vxOjABnSVS+jb7EA=="], - - "@leichtgewicht/ip-codec": ["@leichtgewicht/ip-codec@2.0.5", "", {}, "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="], - - "@manypkg/find-root": ["@manypkg/find-root@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", "find-up": "^4.1.0", "fs-extra": "^8.1.0" } }, "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA=="], - - "@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="], - - "@material-table/core": ["@material-table/core@3.2.5", "", { "dependencies": { "@babel/runtime": "^7.12.5", "@date-io/date-fns": "^1.3.13", "@material-ui/pickers": "^3.2.10", "@material-ui/styles": "^4.11.4", "classnames": "^2.2.6", "date-fns": "^2.16.1", "debounce": "^1.2.0", "fast-deep-equal": "^3.1.3", "prop-types": "^15.7.2", "react-beautiful-dnd": "^13.0.0", "react-double-scrollbar": "0.0.15", "uuid": "^3.4.0" }, "peerDependencies": { "@date-io/core": "^1.3.13", "@material-ui/core": "^4.11.2", "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-TmVN/In15faabezW3COb4Ve5+YhqxFEQnf2Q2Cz3FVXXCFqJvtu3pkRLi+7N9UJ5bvistszz6wfHeiZZY1Rf9Q=="], - - "@material-ui/core": ["@material-ui/core@4.12.4", "", { "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/styles": "^4.11.5", "@material-ui/system": "^4.12.2", "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.3", "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.4", "hoist-non-react-statics": "^3.3.2", "popper.js": "1.16.1-lts", "prop-types": "^15.7.2", "react-is": "^16.8.0 || ^17.0.0", "react-transition-group": "^4.4.0" }, "peerDependencies": { "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ=="], - - "@material-ui/icons": ["@material-ui/icons@4.11.3", "", { "dependencies": { "@babel/runtime": "^7.4.4" }, "peerDependencies": { "@material-ui/core": "^4.0.0", "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA=="], - - "@material-ui/lab": ["@material-ui/lab@4.0.0-alpha.61", "", { "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.3", "clsx": "^1.0.4", "prop-types": "^15.7.2", "react-is": "^16.8.0 || ^17.0.0" }, "peerDependencies": { "@material-ui/core": "^4.12.1", "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg=="], - - "@material-ui/pickers": ["@material-ui/pickers@3.3.11", "", { "dependencies": { "@babel/runtime": "^7.6.0", "@date-io/core": "1.x", "@types/styled-jsx": "^2.2.8", "clsx": "^1.0.2", "react-transition-group": "^4.0.0", "rifm": "^0.7.0" }, "peerDependencies": { "@material-ui/core": "^4.0.0", "prop-types": "^15.6.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" } }, "sha512-pDYjbjUeabapijS2FpSwK/ruJdk7IGeAshpLbKDa3PRRKRy7Nv6sXxAvUg2F+lID/NwUKgBmCYS5bzrl7Xxqzw=="], - - "@material-ui/styles": ["@material-ui/styles@4.11.5", "", { "dependencies": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.3", "clsx": "^1.0.4", "csstype": "^2.5.2", "hoist-non-react-statics": "^3.3.2", "jss": "^10.5.1", "jss-plugin-camel-case": "^10.5.1", "jss-plugin-default-unit": "^10.5.1", "jss-plugin-global": "^10.5.1", "jss-plugin-nested": "^10.5.1", "jss-plugin-props-sort": "^10.5.1", "jss-plugin-rule-value-function": "^10.5.1", "jss-plugin-vendor-prefixer": "^10.5.1", "prop-types": "^15.7.2" }, "peerDependencies": { "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA=="], - - "@material-ui/system": ["@material-ui/system@4.12.2", "", { "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.3", "csstype": "^2.5.2", "prop-types": "^15.7.2" }, "peerDependencies": { "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw=="], - - "@material-ui/types": ["@material-ui/types@5.1.0", "", { "peerDependencies": { "@types/react": "*" }, "optionalPeers": ["@types/react"] }, "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A=="], - - "@material-ui/utils": ["@material-ui/utils@4.11.3", "", { "dependencies": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", "react-is": "^16.8.0 || ^17.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" } }, "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg=="], - - "@microsoft/fetch-event-source": ["@microsoft/fetch-event-source@2.0.1", "", {}, "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA=="], - - "@module-federation/bridge-react-webpack-plugin": ["@module-federation/bridge-react-webpack-plugin@0.6.16", "", { "dependencies": { "@module-federation/sdk": "0.6.16", "@types/semver": "7.5.8", "semver": "7.6.3" } }, "sha512-AQj20lUL5fmdz4un56W3VF8naZaRDmztczl+/j4Qa69JAaUbbZK6zZJ3NEjx0cNzpiq/mGmG9Vik3V4rI/4BUA=="], - - "@module-federation/data-prefetch": ["@module-federation/data-prefetch@0.6.16", "", { "dependencies": { "@module-federation/runtime": "0.6.16", "@module-federation/sdk": "0.6.16", "fs-extra": "9.1.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-m5SNKlAkB2FFCs2cl6LWqo6s2NZ7HuCrp6QrrMzuKjB6EddvKojVQxOzrWdcMLs1vESy6fyU4M4U7PxSojw6Ww=="], - - "@module-federation/dts-plugin": ["@module-federation/dts-plugin@0.6.16", "", { "dependencies": { "@module-federation/error-codes": "0.6.14", "@module-federation/managers": "0.6.16", "@module-federation/sdk": "0.6.16", "@module-federation/third-party-dts-extractor": "0.6.16", "adm-zip": "^0.5.10", "ansi-colors": "^4.1.3", "axios": "^1.7.4", "chalk": "3.0.0", "fs-extra": "9.1.0", "isomorphic-ws": "5.0.0", "koa": "2.15.3", "lodash.clonedeepwith": "4.5.0", "log4js": "6.9.1", "node-schedule": "2.1.1", "rambda": "^9.1.0", "ws": "8.18.0" }, "peerDependencies": { "typescript": "^4.9.0 || ^5.0.0", "vue-tsc": ">=1.0.24" }, "optionalPeers": ["vue-tsc"] }, "sha512-XM6+EYVrS2Q/ZW0u9cH0sJT5t5SQHRjzmW7JWdPv0+wKGCA15WtRMc55boM4Wan7jXJZf+JeD5QLXWiSjaJdnw=="], - - "@module-federation/enhanced": ["@module-federation/enhanced@0.6.16", "", { "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.6.16", "@module-federation/data-prefetch": "0.6.16", "@module-federation/dts-plugin": "0.6.16", "@module-federation/managers": "0.6.16", "@module-federation/manifest": "0.6.16", "@module-federation/rspack": "0.6.16", "@module-federation/runtime-tools": "0.6.16", "@module-federation/sdk": "0.6.16", "btoa": "^1.2.1", "upath": "2.0.1" }, "peerDependencies": { "typescript": "^4.9.0 || ^5.0.0", "vue-tsc": ">=1.0.24", "webpack": "^5.0.0" }, "optionalPeers": ["typescript", "vue-tsc", "webpack"] }, "sha512-5MqA35WGvPmCScT/xNnheR4RBa2oYHkLpeVjOA0xg0PeUTC7aSfGRLsntzFeyzLITSjbVTupK2YwmjiZr3Z0LQ=="], - - "@module-federation/error-codes": ["@module-federation/error-codes@0.6.14", "", {}, "sha512-ik+ezloFkxmE5atqTUG9lRr9xV5EcKDjH+MZba2IJQT5cZIM6o2ThTC45E013N4SCleaGxBtIGoPLZJzT4xa0Q=="], - - "@module-federation/managers": ["@module-federation/managers@0.6.16", "", { "dependencies": { "@module-federation/sdk": "0.6.16", "find-pkg": "2.0.0", "fs-extra": "9.1.0" } }, "sha512-9oqJT0F61GhaFE4EFgJjVyQlD8ohXxMJBS9UGCKC6nHd3+PI4NBWGN2D+alBOwvwtt3LhtssbVH8H8HZEM1GnQ=="], - - "@module-federation/manifest": ["@module-federation/manifest@0.6.16", "", { "dependencies": { "@module-federation/dts-plugin": "0.6.16", "@module-federation/managers": "0.6.16", "@module-federation/sdk": "0.6.16", "chalk": "3.0.0", "find-pkg": "2.0.0" } }, "sha512-YjOk+1uR6E5qIEWiy35IrMyEy+rDGI5nJd+6MQobkXG40DK94mdPxJ7TSCozj/bpZ9SadCxXRCkMiE/gTkryAQ=="], - - "@module-federation/rspack": ["@module-federation/rspack@0.6.16", "", { "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.6.16", "@module-federation/dts-plugin": "0.6.16", "@module-federation/managers": "0.6.16", "@module-federation/manifest": "0.6.16", "@module-federation/runtime-tools": "0.6.16", "@module-federation/sdk": "0.6.16" }, "peerDependencies": { "typescript": "^4.9.0 || ^5.0.0", "vue-tsc": ">=1.0.24" }, "optionalPeers": ["typescript", "vue-tsc"] }, "sha512-9nQAyw7QvgXJYPTQseyQ31qQtSlo0VsppQOyFLstLITzgWWugN7cN8cGAriUKYBI78THuX+lp1mdgsNTBvxJPA=="], - - "@module-federation/runtime": ["@module-federation/runtime@0.6.16", "", { "dependencies": { "@module-federation/error-codes": "0.6.14", "@module-federation/sdk": "0.6.16" } }, "sha512-3oFDRkolGwiXuQz+wzX3YzBWI9so0+K05YRf0TEdJguj3W/v/AMrBCz7W4c4O/wSK45Kuqd4lHKhCyKWRPyhOw=="], - - "@module-federation/runtime-tools": ["@module-federation/runtime-tools@0.6.16", "", { "dependencies": { "@module-federation/runtime": "0.6.16", "@module-federation/webpack-bundler-runtime": "0.6.16" } }, "sha512-AIaxnx99tVYppYCgdJQz43mrGZ2pPJtC7YEIjuQV+UnSORj+d/GOIqF88MDx3i7siFcQ4zrT5BVtEWhXcJdv0g=="], - - "@module-federation/sdk": ["@module-federation/sdk@0.6.16", "", { "dependencies": { "isomorphic-rslog": "0.0.5" } }, "sha512-rzQH/v9bVc032lzV4j1IGYRc5gszwzBevYBBDJf3oNLwkY2kIDUJ99OWvq3aaPJoE0jEWPVe3K5iNc+dZe4tMQ=="], - - "@module-federation/third-party-dts-extractor": ["@module-federation/third-party-dts-extractor@0.6.16", "", { "dependencies": { "find-pkg": "2.0.0", "fs-extra": "9.1.0", "resolve": "1.22.8" } }, "sha512-F4W8QBlPLNY22TGjUWA+FyFYN6wVgGKhefd170A8BOqv2gB1yhm6OIEmDnO6TwfDfQQebVCcAu23AzLzgS5eCg=="], - - "@module-federation/webpack-bundler-runtime": ["@module-federation/webpack-bundler-runtime@0.6.16", "", { "dependencies": { "@module-federation/runtime": "0.6.16", "@module-federation/sdk": "0.6.16" } }, "sha512-Tpi251DApEaQ62KCaJCh1RU1SZTUcVh8lx2zotn/YOMZdw83IzYu3PYYA1V0Eg5jVe6I2GmGH52pJPCtwbgjqA=="], - - "@mswjs/interceptors": ["@mswjs/interceptors@0.40.0", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ=="], - - "@mui/core-downloads-tracker": ["@mui/core-downloads-tracker@5.18.0", "", {}, "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA=="], - - "@mui/material": ["@mui/material@5.18.0", "", { "dependencies": { "@babel/runtime": "^7.23.9", "@mui/core-downloads-tracker": "^5.18.0", "@mui/system": "^5.18.0", "@mui/types": "~7.2.15", "@mui/utils": "^5.17.1", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^19.0.0", "react-transition-group": "^4.4.5" }, "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled", "@types/react"] }, "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA=="], - - "@mui/private-theming": ["@mui/private-theming@5.17.1", "", { "dependencies": { "@babel/runtime": "^7.23.9", "@mui/utils": "^5.17.1", "prop-types": "^15.8.1" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ=="], - - "@mui/styled-engine": ["@mui/styled-engine@5.18.0", "", { "dependencies": { "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.13.5", "@emotion/serialize": "^1.3.3", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled"] }, "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg=="], - - "@mui/system": ["@mui/system@5.18.0", "", { "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.17.1", "@mui/styled-engine": "^5.18.0", "@mui/types": "~7.2.15", "@mui/utils": "^5.17.1", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/react", "@emotion/styled", "@types/react"] }, "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw=="], - - "@mui/types": ["@mui/types@7.2.24", "", { "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw=="], - - "@mui/utils": ["@mui/utils@5.17.1", "", { "dependencies": { "@babel/runtime": "^7.23.9", "@mui/types": "~7.2.15", "@types/prop-types": "^15.7.12", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-is": "^19.0.0" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg=="], - - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.0", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA=="], - - "@node-saml/node-saml": ["@node-saml/node-saml@4.0.5", "", { "dependencies": { "@types/debug": "^4.1.7", "@types/passport": "^1.0.11", "@types/xml-crypto": "^1.4.2", "@types/xml-encryption": "^1.2.1", "@types/xml2js": "^0.4.11", "@xmldom/xmldom": "^0.8.6", "debug": "^4.3.4", "xml-crypto": "^3.0.1", "xml-encryption": "^3.0.2", "xml2js": "^0.5.0", "xmlbuilder": "^15.1.1" } }, "sha512-J5DglElbY1tjOuaR1NPtjOXkXY5bpUhDoKVoeucYN98A3w4fwgjIOPqIGcb6cQsqFq2zZ6vTCeKn5C/hvefSaw=="], - - "@node-saml/passport-saml": ["@node-saml/passport-saml@4.0.4", "", { "dependencies": { "@node-saml/node-saml": "^4.0.4", "@types/express": "^4.17.14", "@types/passport": "^1.0.11", "@types/passport-strategy": "^0.2.35", "passport": "^0.6.0", "passport-strategy": "^1.0.0" } }, "sha512-xFw3gw0yo+K1mzlkW15NeBF7cVpRHN/4vpjmBKzov5YFImCWh/G0LcTZ8krH3yk2/eRPc3Or8LRPudVJBjmYaw=="], - - "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - - "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - - "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - - "@octokit/auth-app": ["@octokit/auth-app@4.0.13", "", { "dependencies": { "@octokit/auth-oauth-app": "^5.0.0", "@octokit/auth-oauth-user": "^2.0.0", "@octokit/request": "^6.0.0", "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", "deprecation": "^2.3.1", "lru-cache": "^9.0.0", "universal-github-app-jwt": "^1.1.1", "universal-user-agent": "^6.0.0" } }, "sha512-NBQkmR/Zsc+8fWcVIFrwDgNXS7f4XDrkd9LHdi9DPQw1NdGHLviLzRO2ZBwTtepnwHXW5VTrVU9eFGijMUqllg=="], - - "@octokit/auth-oauth-app": ["@octokit/auth-oauth-app@5.0.6", "", { "dependencies": { "@octokit/auth-oauth-device": "^4.0.0", "@octokit/auth-oauth-user": "^2.0.0", "@octokit/request": "^6.0.0", "@octokit/types": "^9.0.0", "@types/btoa-lite": "^1.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-SxyfIBfeFcWd9Z/m1xa4LENTQ3l1y6Nrg31k2Dcb1jS5ov7pmwMJZ6OGX8q3K9slRgVpeAjNA1ipOAMHkieqyw=="], - - "@octokit/auth-oauth-device": ["@octokit/auth-oauth-device@4.0.5", "", { "dependencies": { "@octokit/oauth-methods": "^2.0.0", "@octokit/request": "^6.0.0", "@octokit/types": "^9.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ=="], - - "@octokit/auth-oauth-user": ["@octokit/auth-oauth-user@2.1.2", "", { "dependencies": { "@octokit/auth-oauth-device": "^4.0.0", "@octokit/oauth-methods": "^2.0.0", "@octokit/request": "^6.0.0", "@octokit/types": "^9.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg=="], - - "@octokit/auth-token": ["@octokit/auth-token@3.0.4", "", {}, "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ=="], - - "@octokit/auth-unauthenticated": ["@octokit/auth-unauthenticated@3.0.5", "", { "dependencies": { "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0" } }, "sha512-yH2GPFcjrTvDWPwJWWCh0tPPtTL5SMgivgKPA+6v/XmYN6hGQkAto8JtZibSKOpf8ipmeYhLNWQ2UgW0GYILCw=="], - - "@octokit/core": ["@octokit/core@4.2.4", "", { "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", "@octokit/request": "^6.0.0", "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" } }, "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ=="], - - "@octokit/endpoint": ["@octokit/endpoint@7.0.6", "", { "dependencies": { "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg=="], - - "@octokit/graphql": ["@octokit/graphql@5.0.6", "", { "dependencies": { "@octokit/request": "^6.0.0", "@octokit/types": "^9.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw=="], - - "@octokit/graphql-schema": ["@octokit/graphql-schema@13.10.0", "", { "dependencies": { "graphql": "^16.0.0", "graphql-tag": "^2.10.3" } }, "sha512-D9ci/oCYOIea/AFmWUxD67aMaoMw392Nu4sxaO+kW+w/aeDeyECpGuztzXASyCn53ROPTweAg1fk7Payzmu5xQ=="], - - "@octokit/oauth-app": ["@octokit/oauth-app@4.2.4", "", { "dependencies": { "@octokit/auth-oauth-app": "^5.0.0", "@octokit/auth-oauth-user": "^2.0.0", "@octokit/auth-unauthenticated": "^3.0.0", "@octokit/core": "^4.0.0", "@octokit/oauth-authorization-url": "^5.0.0", "@octokit/oauth-methods": "^2.0.0", "@types/aws-lambda": "^8.10.83", "fromentries": "^1.3.1", "universal-user-agent": "^6.0.0" } }, "sha512-iuOVFrmm5ZKNavRtYu5bZTtmlKLc5uVgpqTfMEqYYf2OkieV6VdxKZAb5qLVdEPL8LU2lMWcGpavPBV835cgoA=="], - - "@octokit/oauth-authorization-url": ["@octokit/oauth-authorization-url@5.0.0", "", {}, "sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg=="], - - "@octokit/oauth-methods": ["@octokit/oauth-methods@2.0.6", "", { "dependencies": { "@octokit/oauth-authorization-url": "^5.0.0", "@octokit/request": "^6.2.3", "@octokit/request-error": "^3.0.3", "@octokit/types": "^9.0.0", "btoa-lite": "^1.0.0" } }, "sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw=="], - - "@octokit/openapi-types": ["@octokit/openapi-types@18.1.1", "", {}, "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw=="], - - "@octokit/plugin-paginate-rest": ["@octokit/plugin-paginate-rest@6.1.2", "", { "dependencies": { "@octokit/tsconfig": "^1.0.2", "@octokit/types": "^9.2.3" }, "peerDependencies": { "@octokit/core": ">=4" } }, "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ=="], - - "@octokit/plugin-request-log": ["@octokit/plugin-request-log@1.0.4", "", { "peerDependencies": { "@octokit/core": ">=3" } }, "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA=="], - - "@octokit/plugin-rest-endpoint-methods": ["@octokit/plugin-rest-endpoint-methods@7.2.3", "", { "dependencies": { "@octokit/types": "^10.0.0" }, "peerDependencies": { "@octokit/core": ">=3" } }, "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA=="], - - "@octokit/request": ["@octokit/request@6.2.8", "", { "dependencies": { "@octokit/endpoint": "^7.0.0", "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" } }, "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw=="], - - "@octokit/request-error": ["@octokit/request-error@3.0.3", "", { "dependencies": { "@octokit/types": "^9.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ=="], - - "@octokit/rest": ["@octokit/rest@19.0.13", "", { "dependencies": { "@octokit/core": "^4.2.1", "@octokit/plugin-paginate-rest": "^6.1.2", "@octokit/plugin-request-log": "^1.0.4", "@octokit/plugin-rest-endpoint-methods": "^7.1.2" } }, "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA=="], - - "@octokit/tsconfig": ["@octokit/tsconfig@1.0.2", "", {}, "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA=="], - - "@octokit/types": ["@octokit/types@9.3.2", "", { "dependencies": { "@octokit/openapi-types": "^18.0.0" } }, "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA=="], - - "@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="], - - "@open-draft/logger": ["@open-draft/logger@0.3.0", "", { "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" } }, "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ=="], - - "@open-draft/until": ["@open-draft/until@2.1.0", "", {}, "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg=="], - - "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], - - "@operator/plugin-issuetypes": ["@operator/plugin-issuetypes@workspace:packages/plugins/plugin-issuetypes"], - - "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.16.1", "", { "os": "android", "cpu": "arm" }, "sha512-EkOmYEFccQfSdsYjqBVeA6/m1eM3agQQp29RvI8x6Z++Ng5++76rXqgSHl/4G3I3FvO273vb33tmwsjMLyKPaQ=="], - - "@oxc-resolver/binding-android-arm64": ["@oxc-resolver/binding-android-arm64@11.16.1", "", { "os": "android", "cpu": "arm64" }, "sha512-Sj+URM2+3jWEoe8uyozhRRI2azgRs54wldvEEbndVhk2XrB2xTUFV+YB/pPLCqr0eSlfamtmpjmakJFpN6oBCw=="], - - "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@11.16.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-80vNc2c+Da274yxJaenJi79iENOoQ/r6YG/lnNMyFN4aEkpYFUJu/zji8u4gxHWm121VdA2rdVzody1dgFq/Kg=="], - - "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@11.16.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-pYmRpiB7BrJVoaYsfhxybp3kqgzqjm8BE8RPGdYoPMItmBh4bVItpx1i0djCJXyx3dcZfG4kD9ZfDK2JUMPvcw=="], - - "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@11.16.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-XxGkO8CywZKirr2lnhQH1UGVNJY6GMtQZs7C05Rwj2d0p72VDliAL2w1PkWov/WrrqbXGAPqeQxc0XJ8ycEFIw=="], - - "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@11.16.1", "", { "os": "linux", "cpu": "arm" }, "sha512-PaCQgtsNG9JQrRFLVfW3NJlWQ6OR8EuntvgnbmkMQ4SDAP4xZLFXR/4J3JyavUlvGcAcCrbOvGoVXpZAptSyLQ=="], - - "@oxc-resolver/binding-linux-arm-musleabihf": ["@oxc-resolver/binding-linux-arm-musleabihf@11.16.1", "", { "os": "linux", "cpu": "arm" }, "sha512-5ZOgCH2PMvk92y5RFX7ReDhUVAZnv/1UntURDE6EaAbKVSwHzzD2o9NaW1WFHY3noqJpEN0VdDVG2+ih/uoWqg=="], - - "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@11.16.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Y5pnJDKm85atZgN7LAKy+5ta/+qUzm+P+8RDKCQSstFwIrseS163B5XK93BxlHSKS31GGjVBoxRXUxiYotpLyQ=="], - - "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@11.16.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZYQgkl7dzjCbI2q05uZwSDWCBJRZy5fyhiO0KEuG6Ni+imJUoRFgaLHQ5YJWjYGP+pgswCFV09gURTZqA3mpUQ=="], - - "@oxc-resolver/binding-linux-ppc64-gnu": ["@oxc-resolver/binding-linux-ppc64-gnu@11.16.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-IO+L910FaHv/6cJ09GLXlg6kTeo7nQEhGNCgXM2mypMOX2mZIbG7wIDaCiZyBBYykfu/s0N+6zmQjM4RanTc8Q=="], - - "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@11.16.1", "", { "os": "linux", "cpu": "none" }, "sha512-JfS9ap5rn2xKBMCtT2KoTdkVP4d56Xk7ydpBhIo50zWVCbV4M42ScmJhOj4Rt9BCEFKARAj5Y3dpGZ4WG2Vkag=="], - - "@oxc-resolver/binding-linux-riscv64-musl": ["@oxc-resolver/binding-linux-riscv64-musl@11.16.1", "", { "os": "linux", "cpu": "none" }, "sha512-FtAXP2LDnSn2Q334KdGUMK+/XhSVD+CxlLthAKUUv+hK+6PsFCTnL99iHKMBr0jVLuar4pYZnULri032BpdYrA=="], - - "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@11.16.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-obYGj/cR8yk1IZVYeWRJlWtJkYap9d9x1y/tewatVkRca+5QgC8o8+fGz2HZIpKEXLkuMyFBoC9xnC2455MYoQ=="], - - "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@11.16.1", "", { "os": "linux", "cpu": "x64" }, "sha512-vLUCPrgQ7KN2XTtn3ZGCsEFi1HVwjkRfUxYa5jd0dgwiI9xRP8m5mMolMZO5aGgwq62JbYXTdmlLhll46lc5Aw=="], - - "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@11.16.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Habu7Q/FrnIMuPfAslFPry42yUE8FVG4No1SWeJ21SW+vrMU7nZh6jQSfGT4t+jcgWUsuTYXfnewlIxMpmEHNw=="], - - "@oxc-resolver/binding-openharmony-arm64": ["@oxc-resolver/binding-openharmony-arm64@11.16.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4zPHQ0g/3C6QKxfxe130+mJlp1Hr1Ias1VgaN3ulktO50v3V1MWgSnNZ6rnEHY2FGOyY1QpzJarZsN5OYG/PLw=="], - - "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@11.16.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.0" }, "cpu": "none" }, "sha512-uCF71JE6Z6bLzaZORasf81Zp6t7r6r3DV6o+EZPoNAYH4FMUUTFr1MHpkZLrwi+ifI+DtuSGJDCcSeQW31rx5w=="], - - "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@11.16.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-GIm51df6OR6EVdusezBsRrI496AnV7U6elDXlwzJnKmgX+WuUXTUUDcepMSIX8dV4B9+nDxAHa/0X0THWyzA0A=="], - - "@oxc-resolver/binding-win32-ia32-msvc": ["@oxc-resolver/binding-win32-ia32-msvc@11.16.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-lvMx7XWLJED1JGMyOUKSXFlebdCUMGzBu6fnOjt7iLDtJpwyR/HUs+kMhoUyiMDEsN8DRGLoy+C7V/VUIwxRqg=="], - - "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.16.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PhzhSbDJP8q1T47DzUKMgWecRcfZjYKJdCkmMpW8eSsh86xpnBgrz37UGyBes2g9CAiPp2RmnZAoAA/ufuf3YQ=="], - - "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - - "@playwright/test": ["@playwright/test@1.57.0", "", { "dependencies": { "playwright": "1.57.0" }, "bin": { "playwright": "cli.js" } }, "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA=="], - - "@pmmmwh/react-refresh-webpack-plugin": ["@pmmmwh/react-refresh-webpack-plugin@0.5.17", "", { "dependencies": { "ansi-html": "^0.0.9", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", "schema-utils": "^4.2.0", "source-map": "^0.7.3" }, "peerDependencies": { "@types/webpack": "4.x || 5.x", "react-refresh": ">=0.10.0 <1.0.0", "sockjs-client": "^1.4.0", "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", "webpack-dev-server": "3.x || 4.x || 5.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, "optionalPeers": ["@types/webpack", "sockjs-client", "type-fest", "webpack-dev-server", "webpack-hot-middleware", "webpack-plugin-serve"] }, "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ=="], - - "@popperjs/core": ["@popperjs/core@2.11.8", "", {}, "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="], - - "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], - - "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], - - "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], - - "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], - - "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], - - "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], - - "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], - - "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], - - "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], - - "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], - - "@react-aria/autocomplete": ["@react-aria/autocomplete@3.0.0-rc.4", "", { "dependencies": { "@react-aria/combobox": "^3.14.1", "@react-aria/focus": "^3.21.3", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/listbox": "^3.15.1", "@react-aria/searchfield": "^3.8.10", "@react-aria/textfield": "^3.18.3", "@react-aria/utils": "^3.32.0", "@react-stately/autocomplete": "3.0.0-beta.4", "@react-stately/combobox": "^3.12.1", "@react-types/autocomplete": "3.0.0-alpha.36", "@react-types/button": "^3.14.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-4bMMVNaCuYDZX9HM4ZNSAImZMcL/orwhLLe818+lyzmSrvGmW9h433PZxTolb0d+FnJVfn1MDY0zEWLiyI86GA=="], - - "@react-aria/breadcrumbs": ["@react-aria/breadcrumbs@3.5.30", "", { "dependencies": { "@react-aria/i18n": "^3.12.14", "@react-aria/link": "^3.8.7", "@react-aria/utils": "^3.32.0", "@react-types/breadcrumbs": "^3.7.17", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-DZymglA70SwvDJA7GB147sUexvdDy6vWcriGrlEHhMMzBLhGB30I5J96R4pPzURLxXISrWFH56KC5rRgIqsqqg=="], - - "@react-aria/button": ["@react-aria/button@3.14.3", "", { "dependencies": { "@react-aria/interactions": "^3.26.0", "@react-aria/toolbar": "3.0.0-beta.22", "@react-aria/utils": "^3.32.0", "@react-stately/toggle": "^3.9.3", "@react-types/button": "^3.14.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-iJTuEECs9im7TwrCRZ0dvuwp8Gao0+I1IuYs1LQvJQgKLpgRH2/6jAiqb2bdAcoAjdbaMs7Xe0xUwURpVNkEyA=="], - - "@react-aria/calendar": ["@react-aria/calendar@3.9.3", "", { "dependencies": { "@internationalized/date": "^3.10.1", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/live-announcer": "^3.4.4", "@react-aria/utils": "^3.32.0", "@react-stately/calendar": "^3.9.1", "@react-types/button": "^3.14.1", "@react-types/calendar": "^3.8.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-F12UQ4zd8GIxpJxs9GAHzDD9Lby2hESHm0LF5tjsYBIOBJc5K7ICeeE5UqLMBPzgnEP5nfh1CKS8KhCB0mS7PA=="], - - "@react-aria/checkbox": ["@react-aria/checkbox@3.16.3", "", { "dependencies": { "@react-aria/form": "^3.1.3", "@react-aria/interactions": "^3.26.0", "@react-aria/label": "^3.7.23", "@react-aria/toggle": "^3.12.3", "@react-aria/utils": "^3.32.0", "@react-stately/checkbox": "^3.7.3", "@react-stately/form": "^3.2.2", "@react-stately/toggle": "^3.9.3", "@react-types/checkbox": "^3.10.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-2p1haCUtERo5XavBAWNaX//dryNVnOOWfSKyzLs4UiCZR/NL0ttN+Nu/i445q0ipjLqZ6bBJtx0g0NNrubbU7Q=="], - - "@react-aria/collections": ["@react-aria/collections@3.0.1", "", { "dependencies": { "@react-aria/interactions": "^3.26.0", "@react-aria/ssr": "^3.9.10", "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-C8KBQGXzVefR4I+hQmkb10t09Jt1Ivl12qgQKshmT0hV2yBESXEYWMZUxV4ggOgWDreAgCtr+Ho3X+7MzBQT8Q=="], - - "@react-aria/color": ["@react-aria/color@3.1.3", "", { "dependencies": { "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/numberfield": "^3.12.3", "@react-aria/slider": "^3.8.3", "@react-aria/spinbutton": "^3.7.0", "@react-aria/textfield": "^3.18.3", "@react-aria/utils": "^3.32.0", "@react-aria/visually-hidden": "^3.8.29", "@react-stately/color": "^3.9.3", "@react-stately/form": "^3.2.2", "@react-types/color": "^3.1.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-EHzsFbqzFrO1/3irEa8E8wawlQg7hRd4/Jscvl9zhplAcrWFd6L5TWl8463Z6h0J6zN1eH9T2QDEn6rivDLkkg=="], - - "@react-aria/combobox": ["@react-aria/combobox@3.14.1", "", { "dependencies": { "@react-aria/focus": "^3.21.3", "@react-aria/i18n": "^3.12.14", "@react-aria/listbox": "^3.15.1", "@react-aria/live-announcer": "^3.4.4", "@react-aria/menu": "^3.19.4", "@react-aria/overlays": "^3.31.0", "@react-aria/selection": "^3.27.0", "@react-aria/textfield": "^3.18.3", "@react-aria/utils": "^3.32.0", "@react-stately/collections": "^3.12.8", "@react-stately/combobox": "^3.12.1", "@react-stately/form": "^3.2.2", "@react-types/button": "^3.14.1", "@react-types/combobox": "^3.13.10", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-wuP/4UQrGsYXLw1Gk8G/FcnUlHuoViA9G6w3LhtUgu5Q3E5DvASJalxej3NtyYU+4w4epD1gJidzosAL0rf8Ug=="], - - "@react-aria/datepicker": ["@react-aria/datepicker@3.15.3", "", { "dependencies": { "@internationalized/date": "^3.10.1", "@internationalized/number": "^3.6.5", "@internationalized/string": "^3.2.7", "@react-aria/focus": "^3.21.3", "@react-aria/form": "^3.1.3", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/label": "^3.7.23", "@react-aria/spinbutton": "^3.7.0", "@react-aria/utils": "^3.32.0", "@react-stately/datepicker": "^3.15.3", "@react-stately/form": "^3.2.2", "@react-types/button": "^3.14.1", "@react-types/calendar": "^3.8.1", "@react-types/datepicker": "^3.13.3", "@react-types/dialog": "^3.5.22", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-0KkLYeLs+IubHXb879n8dzzKU/NWcxC9DXtv7M/ofL7vAvMSTmaceYJcMW+2gGYhJVpyYz8B6bk0W7kTxgB3jg=="], - - "@react-aria/dialog": ["@react-aria/dialog@3.5.32", "", { "dependencies": { "@react-aria/interactions": "^3.26.0", "@react-aria/overlays": "^3.31.0", "@react-aria/utils": "^3.32.0", "@react-types/dialog": "^3.5.22", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-2puMjsJS2FtB8LiFuQDAdBSU4dt3lqdJn4FWt/8GL6l91RZBqp2Dnm5Obuee6rV2duNJZcSAUWsQZ/S1iW8Y2g=="], - - "@react-aria/disclosure": ["@react-aria/disclosure@3.1.1", "", { "dependencies": { "@react-aria/ssr": "^3.9.10", "@react-aria/utils": "^3.32.0", "@react-stately/disclosure": "^3.0.9", "@react-types/button": "^3.14.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-4k8Y3CZEl+Qhou0fH7Sj7BbzvwAfi1JDL+hG7U20ZL5+MJ/VbDYuYX2gYK2KqdlbeuuzGcov3ZFQbyIVHMY+/A=="], - - "@react-aria/dnd": ["@react-aria/dnd@3.11.4", "", { "dependencies": { "@internationalized/string": "^3.2.7", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/live-announcer": "^3.4.4", "@react-aria/overlays": "^3.31.0", "@react-aria/utils": "^3.32.0", "@react-stately/collections": "^3.12.8", "@react-stately/dnd": "^3.7.2", "@react-types/button": "^3.14.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-dBrnM33Kmk76F+Pknh2WfSLIX4dsYwFzWJUIABJCPmPc80hTG0so7mfqH45ba759/6ERMfXXoodZPLtypOjYPg=="], - - "@react-aria/focus": ["@react-aria/focus@3.21.3", "", { "dependencies": { "@react-aria/interactions": "^3.26.0", "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-FsquWvjSCwC2/sBk4b+OqJyONETUIXQ2vM0YdPAuC+QFQh2DT6TIBo6dOZVSezlhudDla69xFBd6JvCFq1AbUw=="], - - "@react-aria/form": ["@react-aria/form@3.1.3", "", { "dependencies": { "@react-aria/interactions": "^3.26.0", "@react-aria/utils": "^3.32.0", "@react-stately/form": "^3.2.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-HAKnPjMiqTxoGLVbfZyGYcZQ1uu6aSeCi9ODmtZuKM5DWZZnTUjDmM1i2L6IXvF+d1kjyApyJC7VTbKZ8AI77g=="], - - "@react-aria/grid": ["@react-aria/grid@3.14.6", "", { "dependencies": { "@react-aria/focus": "^3.21.3", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/live-announcer": "^3.4.4", "@react-aria/selection": "^3.27.0", "@react-aria/utils": "^3.32.0", "@react-stately/collections": "^3.12.8", "@react-stately/grid": "^3.11.7", "@react-stately/selection": "^3.20.7", "@react-types/checkbox": "^3.10.2", "@react-types/grid": "^3.3.6", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-xagBKHNPu4Ovt/I5He7T/oIEq82MDMSrRi5Sw3oxSCwwtZpv+7eyKRSrFz9vrNUzNgWCcx5VHLE660bLdeVNDQ=="], - - "@react-aria/gridlist": ["@react-aria/gridlist@3.14.2", "", { "dependencies": { "@react-aria/focus": "^3.21.3", "@react-aria/grid": "^3.14.6", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/selection": "^3.27.0", "@react-aria/utils": "^3.32.0", "@react-stately/list": "^3.13.2", "@react-stately/tree": "^3.9.4", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-c51ip0bc/lKppfrPNFHbWu1n/r0NHd9Xl114904cDxuRcElJ3H/V/3e3U9HyDy+4xioiXZIdZ75CNxtEoTmrxw=="], - - "@react-aria/i18n": ["@react-aria/i18n@3.12.14", "", { "dependencies": { "@internationalized/date": "^3.10.1", "@internationalized/message": "^3.1.8", "@internationalized/number": "^3.6.5", "@internationalized/string": "^3.2.7", "@react-aria/ssr": "^3.9.10", "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-zYvs1FlLamFD49uneX3i5mPHrAsB3OjVpSWApTcPw8ydxOaphQDp/Q1aqrbcxlrQCcxZdXWHuvLlbkNR4+8jzw=="], - - "@react-aria/interactions": ["@react-aria/interactions@3.26.0", "", { "dependencies": { "@react-aria/ssr": "^3.9.10", "@react-aria/utils": "^3.32.0", "@react-stately/flags": "^3.1.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q=="], - - "@react-aria/label": ["@react-aria/label@3.7.23", "", { "dependencies": { "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-dRkuCJfsyBHPTq3WOJVHNRvNyQL4cRRLELmjYfUX9/jQKIsUW2l71YnUHZTRCSn2ZjhdAcdwq96fNcQo0hncBQ=="], - - "@react-aria/landmark": ["@react-aria/landmark@3.0.8", "", { "dependencies": { "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-xuY8kYxCrF9C0h0Pj2lZHoxCidNfQ/SrkYWXuiN+LuBTJGCmPVif93gt7TklQ0rKJ+pKJsUgh8AC0pgwI3QP7A=="], - - "@react-aria/link": ["@react-aria/link@3.8.7", "", { "dependencies": { "@react-aria/interactions": "^3.26.0", "@react-aria/utils": "^3.32.0", "@react-types/link": "^3.6.5", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-TOC6Hf/x3N0P8SLR1KD/dGiJ9PmwAq8H57RiwbFbdINnG/HIvIQr5MxGTjwBvOOWcJu9brgWL5HkQaZK7Q/4Yw=="], - - "@react-aria/listbox": ["@react-aria/listbox@3.15.1", "", { "dependencies": { "@react-aria/interactions": "^3.26.0", "@react-aria/label": "^3.7.23", "@react-aria/selection": "^3.27.0", "@react-aria/utils": "^3.32.0", "@react-stately/collections": "^3.12.8", "@react-stately/list": "^3.13.2", "@react-types/listbox": "^3.7.4", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-81iDLFhmPXvLOtkI0SKzgrngfzwfR2o9oFDAYRfpYCOxgT7jjh8SaB4wCteJXRiMwymRGmgyTvD4yxWTluEeXA=="], - - "@react-aria/live-announcer": ["@react-aria/live-announcer@3.4.4", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-PTTBIjNRnrdJOIRTDGNifY2d//kA7GUAwRFJNOEwSNG4FW+Bq9awqLiflw0JkpyB0VNIwou6lqKPHZVLsGWOXA=="], - - "@react-aria/menu": ["@react-aria/menu@3.19.4", "", { "dependencies": { "@react-aria/focus": "^3.21.3", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/overlays": "^3.31.0", "@react-aria/selection": "^3.27.0", "@react-aria/utils": "^3.32.0", "@react-stately/collections": "^3.12.8", "@react-stately/menu": "^3.9.9", "@react-stately/selection": "^3.20.7", "@react-stately/tree": "^3.9.4", "@react-types/button": "^3.14.1", "@react-types/menu": "^3.10.5", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-0A0DUEkEvZynmaD3zktHavM+EmgZSR/ht+g1ExS2jXe73CegA+dbSRfPl9eIKcHxaRrWOV96qMj2pTf0yWTBDg=="], - - "@react-aria/meter": ["@react-aria/meter@3.4.28", "", { "dependencies": { "@react-aria/progress": "^3.4.28", "@react-types/meter": "^3.4.13", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-elACITUBOf4Dp+BQ2aIgHIe58fjWYjspxhVcE5BMiqePktOfRkpb9ESj8nWcNXO8eqCYwrFJpElHvXkjYLWemw=="], - - "@react-aria/numberfield": ["@react-aria/numberfield@3.12.3", "", { "dependencies": { "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/spinbutton": "^3.7.0", "@react-aria/textfield": "^3.18.3", "@react-aria/utils": "^3.32.0", "@react-stately/form": "^3.2.2", "@react-stately/numberfield": "^3.10.3", "@react-types/button": "^3.14.1", "@react-types/numberfield": "^3.8.16", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-70LRXWPEuj2X8mbQXUx6l6We+RGs49Kb+2eUiSSLArHK4RvTWJWEfSjHL5IHHJ+j2AkbORdryD7SR3gcXSX+5w=="], - - "@react-aria/overlays": ["@react-aria/overlays@3.31.0", "", { "dependencies": { "@react-aria/focus": "^3.21.3", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/ssr": "^3.9.10", "@react-aria/utils": "^3.32.0", "@react-aria/visually-hidden": "^3.8.29", "@react-stately/overlays": "^3.6.21", "@react-types/button": "^3.14.1", "@react-types/overlays": "^3.9.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Vq41X1s8XheGIhGbbuqRJslJEX08qmMVX//dwuBaFX9T18mMR04tumKOMxp8Lz+vqwdGLvjNUYDMcgolL+AMjw=="], - - "@react-aria/progress": ["@react-aria/progress@3.4.28", "", { "dependencies": { "@react-aria/i18n": "^3.12.14", "@react-aria/label": "^3.7.23", "@react-aria/utils": "^3.32.0", "@react-types/progress": "^3.5.16", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-3NUUAu+rwf1M7pau9WFkrxe/PlBPiqCl/1maGU7iufVveHnz+SVVqXdNkjYx+WkPE0ViwG86Zx6OU4AYJ1pjNw=="], - - "@react-aria/radio": ["@react-aria/radio@3.12.3", "", { "dependencies": { "@react-aria/focus": "^3.21.3", "@react-aria/form": "^3.1.3", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/label": "^3.7.23", "@react-aria/utils": "^3.32.0", "@react-stately/radio": "^3.11.3", "@react-types/radio": "^3.9.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-noucVX++9J3VYWg7dB+r09NVX8UZSR1TWUMCbT/MffzhltOsmiLJVvgJ0uEeeVRuu3+ZM63jOshrzG89anX4TQ=="], - - "@react-aria/searchfield": ["@react-aria/searchfield@3.8.10", "", { "dependencies": { "@react-aria/i18n": "^3.12.14", "@react-aria/textfield": "^3.18.3", "@react-aria/utils": "^3.32.0", "@react-stately/searchfield": "^3.5.17", "@react-types/button": "^3.14.1", "@react-types/searchfield": "^3.6.6", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-1wMoSjXoekcETC4ZP5AUcWoaK96FssVuF9MgqQNqE5VnauQDjZBpPCfz6GSZwRHTGwoqb7CI4iEi7433kd50xg=="], - - "@react-aria/select": ["@react-aria/select@3.17.1", "", { "dependencies": { "@react-aria/form": "^3.1.3", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/label": "^3.7.23", "@react-aria/listbox": "^3.15.1", "@react-aria/menu": "^3.19.4", "@react-aria/selection": "^3.27.0", "@react-aria/utils": "^3.32.0", "@react-aria/visually-hidden": "^3.8.29", "@react-stately/select": "^3.9.0", "@react-types/button": "^3.14.1", "@react-types/select": "^3.12.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-jPMuaSp+4SbdE9G5UrrTer2CPbbUnUSLd8I2wgRgGcyk3wFw9DtnUNfms+UBA/2SrVnAEJ6KCQAI0oiMK2m+tQ=="], - - "@react-aria/selection": ["@react-aria/selection@3.27.0", "", { "dependencies": { "@react-aria/focus": "^3.21.3", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/utils": "^3.32.0", "@react-stately/selection": "^3.20.7", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-4zgreuCu4QM4t2U7aF3mbMvIKCEkTEo6h6nGJvbyZALZ/eFtLTvUiV8/5CGDJRLGvgMvi3XxUeF9PZbpk5nMJg=="], - - "@react-aria/separator": ["@react-aria/separator@3.4.14", "", { "dependencies": { "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-a32OB5HMAmXEdExyDvsadsnlmNcVxxpx3tt+Jxxl6H9CHsLO+Ak077KGFJteGVg4bTfhWGAgczOsnvIioR88xw=="], - - "@react-aria/slider": ["@react-aria/slider@3.8.3", "", { "dependencies": { "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/label": "^3.7.23", "@react-aria/utils": "^3.32.0", "@react-stately/slider": "^3.7.3", "@react-types/shared": "^3.32.1", "@react-types/slider": "^3.8.2", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-tOZVH+wLt3ik0C3wyuXqHL9fvnQ5S+/tHMYB7z8aZV5cEe36Gt4efBILphlA7ChkL/RvpHGK2AGpEGxvuEQIuQ=="], - - "@react-aria/spinbutton": ["@react-aria/spinbutton@3.7.0", "", { "dependencies": { "@react-aria/i18n": "^3.12.14", "@react-aria/live-announcer": "^3.4.4", "@react-aria/utils": "^3.32.0", "@react-types/button": "^3.14.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-FOyH94BZp+jNhUJuZqXSubQZDNQEJyW/J19/gwCxQvQvxAP79dhDFshh1UtrL4EjbjIflmaOes+sH/XEHUnJVA=="], - - "@react-aria/ssr": ["@react-aria/ssr@3.9.10", "", { "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ=="], - - "@react-aria/switch": ["@react-aria/switch@3.7.9", "", { "dependencies": { "@react-aria/toggle": "^3.12.3", "@react-stately/toggle": "^3.9.3", "@react-types/shared": "^3.32.1", "@react-types/switch": "^3.5.15", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-RZtuFRXews0PBx8Fc2R/kqaIARD5YIM5uYtmwnWfY7y5bEsBGONxp0d+m2vDyY7yk+VNpVFBdwewY9GbZmH1CA=="], - - "@react-aria/table": ["@react-aria/table@3.17.9", "", { "dependencies": { "@react-aria/focus": "^3.21.3", "@react-aria/grid": "^3.14.6", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/live-announcer": "^3.4.4", "@react-aria/utils": "^3.32.0", "@react-aria/visually-hidden": "^3.8.29", "@react-stately/collections": "^3.12.8", "@react-stately/flags": "^3.1.2", "@react-stately/table": "^3.15.2", "@react-types/checkbox": "^3.10.2", "@react-types/grid": "^3.3.6", "@react-types/shared": "^3.32.1", "@react-types/table": "^3.13.4", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Jby561E1YfzoRgtp+RQuhDz4vnxlcqol9RTgQQ7FWXC2IcN9Pny1COU34LkA1cL9VeB9LJ0+qfMhGw4aAwaUmw=="], - - "@react-aria/tabs": ["@react-aria/tabs@3.10.9", "", { "dependencies": { "@react-aria/focus": "^3.21.3", "@react-aria/i18n": "^3.12.14", "@react-aria/selection": "^3.27.0", "@react-aria/utils": "^3.32.0", "@react-stately/tabs": "^3.8.7", "@react-types/shared": "^3.32.1", "@react-types/tabs": "^3.3.20", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-2+FNd7Ohr3hrEgYrKdZW0FWbgybzTVZft6tw95oQ2+9PnjdDVdtzHliI+8HY8jzb4hTf4bU7O8n+s/HBlCBSIw=="], - - "@react-aria/tag": ["@react-aria/tag@3.7.3", "", { "dependencies": { "@react-aria/gridlist": "^3.14.2", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/label": "^3.7.23", "@react-aria/selection": "^3.27.0", "@react-aria/utils": "^3.32.0", "@react-stately/list": "^3.13.2", "@react-types/button": "^3.14.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-fonqGFxhpnlIDOz3u38y4+MG5wyAef9+oDybsCKaJ57K+D4BTvSmpGBemN/mcaxdabnYfyhasCm0H91Q9XRcCA=="], - - "@react-aria/textfield": ["@react-aria/textfield@3.18.3", "", { "dependencies": { "@react-aria/form": "^3.1.3", "@react-aria/interactions": "^3.26.0", "@react-aria/label": "^3.7.23", "@react-aria/utils": "^3.32.0", "@react-stately/form": "^3.2.2", "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@react-types/textfield": "^3.12.6", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ehiSHOKuKCwPdxFe7wGE0QJlSeeJR4iJuH+OdsYVlZzYbl9J/uAdGbpsj/zPhNtBo1g/Td76U8TtTlYRZ8lUZw=="], - - "@react-aria/toast": ["@react-aria/toast@3.0.9", "", { "dependencies": { "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/landmark": "^3.0.8", "@react-aria/utils": "^3.32.0", "@react-stately/toast": "^3.1.2", "@react-types/button": "^3.14.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-2sRitczXl5VEwyq97o8TVvq3bIqLA7EfA7dhDPkYlHGa4T1vzKkhNqgkskKd9+Tw7gqeFRFjnokh+es9jkM11g=="], - - "@react-aria/toggle": ["@react-aria/toggle@3.12.3", "", { "dependencies": { "@react-aria/interactions": "^3.26.0", "@react-aria/utils": "^3.32.0", "@react-stately/toggle": "^3.9.3", "@react-types/checkbox": "^3.10.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-mciUbeVP99fRObnH5qLFrkKXX+5VKeV6BhFJlmz1eo3ltR/0xZKnUcycA2CGzmqtB70w09CAhr8NMEnpNH8dwQ=="], - - "@react-aria/toolbar": ["@react-aria/toolbar@3.0.0-beta.22", "", { "dependencies": { "@react-aria/focus": "^3.21.3", "@react-aria/i18n": "^3.12.14", "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Q1gOj6N4vzvpGrIoNAxpUudEQP82UgQACENH/bcH8FnEMbSP7DHvVfDhj7GTU6ldMXO2cjqLhiidoUK53gkCiA=="], - - "@react-aria/tooltip": ["@react-aria/tooltip@3.9.0", "", { "dependencies": { "@react-aria/interactions": "^3.26.0", "@react-aria/utils": "^3.32.0", "@react-stately/tooltip": "^3.5.9", "@react-types/shared": "^3.32.1", "@react-types/tooltip": "^3.5.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-2O1DXEV8/+DeUq9dIlAfaNa7lSG+7FCZDuF+sNiPYnZM6tgFOrsId26uMF5EuwpVfOvXSSGnq0+6Ma2On7mZPg=="], - - "@react-aria/tree": ["@react-aria/tree@3.1.5", "", { "dependencies": { "@react-aria/gridlist": "^3.14.2", "@react-aria/i18n": "^3.12.14", "@react-aria/selection": "^3.27.0", "@react-aria/utils": "^3.32.0", "@react-stately/tree": "^3.9.4", "@react-types/button": "^3.14.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-FAq7pAhRVrWU0U/8QbQIJfBqHuoCD+F9rR9ruoM3oL0vVIZxVN57ak/dhyge3EGlraTl9vzFi6IRceXiMuk5kg=="], - - "@react-aria/utils": ["@react-aria/utils@3.32.0", "", { "dependencies": { "@react-aria/ssr": "^3.9.10", "@react-stately/flags": "^3.1.2", "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg=="], - - "@react-aria/virtualizer": ["@react-aria/virtualizer@4.1.11", "", { "dependencies": { "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/utils": "^3.32.0", "@react-stately/virtualizer": "^4.4.4", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-eYL//bX11Aox4Eh1BSZFX4I/4EdyVVWLjmpW+Y5qy4WajNrowjiuJJM7Fp1rQBlOAVuz0KbaDmFhiU3Z3rWjsw=="], - - "@react-aria/visually-hidden": ["@react-aria/visually-hidden@3.8.29", "", { "dependencies": { "@react-aria/interactions": "^3.26.0", "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-1joCP+MHBLd+YA6Gb08nMFfDBhOF0Kh1gR1SA8zoxEB5RMfQEEkufIB8k0GGwvHGSCK3gFyO8UAVsD0+rRYEyg=="], - - "@react-hookz/deep-equal": ["@react-hookz/deep-equal@1.0.4", "", {}, "sha512-N56fTrAPUDz/R423pag+n6TXWbvlBZDtTehaGFjK0InmN+V2OFWLE/WmORhmn6Ce7dlwH5+tQN1LJFw3ngTJVg=="], - - "@react-hookz/web": ["@react-hookz/web@24.0.4", "", { "dependencies": { "@react-hookz/deep-equal": "^1.0.4" }, "peerDependencies": { "js-cookie": "^3.0.5", "react": "^16.8 || ^17 || ^18", "react-dom": "^16.8 || ^17 || ^18" }, "optionalPeers": ["js-cookie"] }, "sha512-DcIM6JiZklDyHF6CRD1FTXzuggAkQ+3Ncq2Wln7Kdih8GV6ZIeN9JfS6ZaQxpQUxan8/4n0J2V/R7nMeiSrb2Q=="], - - "@react-stately/autocomplete": ["@react-stately/autocomplete@3.0.0-beta.4", "", { "dependencies": { "@react-stately/utils": "^3.11.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-K2Uy7XEdseFvgwRQ8CyrYEHMupjVKEszddOapP8deNz4hntYvT1aRm0m+sKa5Kl/4kvg9c/3NZpQcrky/vRZIg=="], - - "@react-stately/calendar": ["@react-stately/calendar@3.9.1", "", { "dependencies": { "@internationalized/date": "^3.10.1", "@react-stately/utils": "^3.11.0", "@react-types/calendar": "^3.8.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-q0Q8fivpQa1rcLg5daUVxwVj1smCp1VnpX9A5Q5PkI9lH9x+xdS0Y6eOqb8Ih3TKBDkx9/oEZonOX7RYNIzSig=="], - - "@react-stately/checkbox": ["@react-stately/checkbox@3.7.3", "", { "dependencies": { "@react-stately/form": "^3.2.2", "@react-stately/utils": "^3.11.0", "@react-types/checkbox": "^3.10.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ve2K+uWT+NRM1JMn+tkWJDP2iBAaWvbZ0TbSXs371IUcTWaNW61HygZ+UFOB/frAZGloazEKGqAsX5XjFpgB9w=="], - - "@react-stately/collections": ["@react-stately/collections@3.12.8", "", { "dependencies": { "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-AceJYLLXt1Y2XIcOPi6LEJSs4G/ubeYW3LqOCQbhfIgMaNqKfQMIfagDnPeJX9FVmPFSlgoCBxb1pTJW2vjCAQ=="], - - "@react-stately/color": ["@react-stately/color@3.9.3", "", { "dependencies": { "@internationalized/number": "^3.6.5", "@internationalized/string": "^3.2.7", "@react-stately/form": "^3.2.2", "@react-stately/numberfield": "^3.10.3", "@react-stately/slider": "^3.7.3", "@react-stately/utils": "^3.11.0", "@react-types/color": "^3.1.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-H5lQgl07upsI7+cxTwYo639ziDDG1DFgOtq5pmC4Nxi8uNl8sR/8YeLaYuxyJiVkj2VLHBYRQ3+JcxrdduFvPQ=="], - - "@react-stately/combobox": ["@react-stately/combobox@3.12.1", "", { "dependencies": { "@react-stately/collections": "^3.12.8", "@react-stately/form": "^3.2.2", "@react-stately/list": "^3.13.2", "@react-stately/overlays": "^3.6.21", "@react-stately/utils": "^3.11.0", "@react-types/combobox": "^3.13.10", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-RwfTTYgKJ9raIY+7grZ5DbfVRSO5pDjo/ur2VN/28LZzM0eOQrLFQ00vpBmY7/R64sHRpcXLDxpz5cqpKCdvTw=="], - - "@react-stately/data": ["@react-stately/data@3.15.0", "", { "dependencies": { "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ocP39NQQkrbtHVCPsqltNncpEHaONyYX/8s2UK9xeLRc+55NtDI2RZDKTUf/mi6H2SHxzEwLMQH8hWtEwC55mQ=="], - - "@react-stately/datepicker": ["@react-stately/datepicker@3.15.3", "", { "dependencies": { "@internationalized/date": "^3.10.1", "@internationalized/string": "^3.2.7", "@react-stately/form": "^3.2.2", "@react-stately/overlays": "^3.6.21", "@react-stately/utils": "^3.11.0", "@react-types/datepicker": "^3.13.3", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-RDYoz1R/EkCyxHYewb58T7DngU3gl6CnQL7xiWiDlayPnstGaanoQ3yCZGJaIQwR8PrKdNbQwXF9NlSmj8iCOw=="], - - "@react-stately/disclosure": ["@react-stately/disclosure@3.0.9", "", { "dependencies": { "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-M3HKsXqdzYKQf1TpnQRLZ6+/b8E3Nba3oOuY0OW5NnM5dZWSnXuj8foBQJT118FdLgMjpfBdPIkUvnaGiDCs5w=="], - - "@react-stately/dnd": ["@react-stately/dnd@3.7.2", "", { "dependencies": { "@react-stately/selection": "^3.20.7", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-tr5nNgrLMn5GV308K1f010XUZ2j8CApqHrrcjg5fa2AnpO2gECcOf+UEnAvoFNUsvknje4iPX8y0/0No2ZHsgA=="], - - "@react-stately/flags": ["@react-stately/flags@3.1.2", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg=="], - - "@react-stately/form": ["@react-stately/form@3.2.2", "", { "dependencies": { "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-soAheOd7oaTO6eNs6LXnfn0tTqvOoe3zN9FvtIhhrErKz9XPc5sUmh3QWwR45+zKbitOi1HOjfA/gifKhZcfWw=="], - - "@react-stately/grid": ["@react-stately/grid@3.11.7", "", { "dependencies": { "@react-stately/collections": "^3.12.8", "@react-stately/selection": "^3.20.7", "@react-types/grid": "^3.3.6", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-SqzBSxUTFZKLZicfXDK+M0A3gh07AYK1pmU/otcq2cjZ0nSC4CceKijQ2GBZnl+YGcGHI1RgkhpLP6ZioMYctQ=="], - - "@react-stately/layout": ["@react-stately/layout@4.5.2", "", { "dependencies": { "@react-stately/collections": "^3.12.8", "@react-stately/table": "^3.15.2", "@react-stately/virtualizer": "^4.4.4", "@react-types/grid": "^3.3.6", "@react-types/shared": "^3.32.1", "@react-types/table": "^3.13.4", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-quAzYkshApkv1vChz2NXBaLTC7ihJUmv3ijqJBHCkZSY6qq+1qnc4aGespDF1f3mPhmpGswTFGXFImFTAYfi5g=="], - - "@react-stately/list": ["@react-stately/list@3.13.2", "", { "dependencies": { "@react-stately/collections": "^3.12.8", "@react-stately/selection": "^3.20.7", "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-dGFALuQWNNOkv7W12qSsXLF4mJHLeWeK2hVvdyj4SI8Vxku+BOfaVKuW3sn3mNiixI1dM/7FY2ip4kK+kv27vw=="], - - "@react-stately/menu": ["@react-stately/menu@3.9.9", "", { "dependencies": { "@react-stately/overlays": "^3.6.21", "@react-types/menu": "^3.10.5", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-moW5JANxMxPilfR0SygpCWCZe7Ef09oadgzTZthRymNRv0PXVS9ad4wd1EkwuMvPH/n0uZLZE2s8hNyFDgyqPA=="], - - "@react-stately/numberfield": ["@react-stately/numberfield@3.10.3", "", { "dependencies": { "@internationalized/number": "^3.6.5", "@react-stately/form": "^3.2.2", "@react-stately/utils": "^3.11.0", "@react-types/numberfield": "^3.8.16", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-40g/oyVcWoEaLqkr61KuHZzQVLLXFi3oa2K8XLnb6o+859SM4TX3XPNqL6eNQjXSKoJO5Hlgpqhee9j+VDbGog=="], - - "@react-stately/overlays": ["@react-stately/overlays@3.6.21", "", { "dependencies": { "@react-stately/utils": "^3.11.0", "@react-types/overlays": "^3.9.2", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-7f25H1PS2g+SNvuWPEW30pSGqYNHxesCP4w+1RcV/XV1oQI7oP5Ji2WfI0QsJEFc9wP/ZO1pyjHNKpfLI3O88g=="], - - "@react-stately/radio": ["@react-stately/radio@3.11.3", "", { "dependencies": { "@react-stately/form": "^3.2.2", "@react-stately/utils": "^3.11.0", "@react-types/radio": "^3.9.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-8+Cy0azV1aBWKcBfGHi3nBa285lAS6XhmVw2LfEwxq8DeVKTbJAaCHHwvDoclxDiOAnqzE0pio0QMD8rYISt9g=="], - - "@react-stately/searchfield": ["@react-stately/searchfield@3.5.17", "", { "dependencies": { "@react-stately/utils": "^3.11.0", "@react-types/searchfield": "^3.6.6", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-/KExpJt6EGyuLxy/PRQJlETQxJGw8tRxVws6qF1lankN49Os2UhFEWi7ogbMCOWN67gIgevhZRdzmJnuov6BEQ=="], - - "@react-stately/select": ["@react-stately/select@3.9.0", "", { "dependencies": { "@react-stately/form": "^3.2.2", "@react-stately/list": "^3.13.2", "@react-stately/overlays": "^3.6.21", "@react-stately/utils": "^3.11.0", "@react-types/select": "^3.12.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-eNE33zVYpVdCPKRPGYyViN3LnEq82e1wjBIrs9T7Vo4EBnJeT57pqMZpalTPk7qsA+861t14Qrj7GnUd+YbEXw=="], - - "@react-stately/selection": ["@react-stately/selection@3.20.7", "", { "dependencies": { "@react-stately/collections": "^3.12.8", "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-NkiRsNCfORBIHNF1bCavh4Vvj+Yd5NffE10iXtaFuhF249NlxLynJZmkcVCqNP9taC2pBIHX00+9tcBgxhG+mA=="], - - "@react-stately/slider": ["@react-stately/slider@3.7.3", "", { "dependencies": { "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@react-types/slider": "^3.8.2", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-9QGnQNXFAH52BzxtU7weyOV/VV7/so6uIvE8VOHfc6QR3GMBM/kJvqBCTWZfQ0pxDIsRagBQDD/tjB09ixTOzg=="], - - "@react-stately/table": ["@react-stately/table@3.15.2", "", { "dependencies": { "@react-stately/collections": "^3.12.8", "@react-stately/flags": "^3.1.2", "@react-stately/grid": "^3.11.7", "@react-stately/selection": "^3.20.7", "@react-stately/utils": "^3.11.0", "@react-types/grid": "^3.3.6", "@react-types/shared": "^3.32.1", "@react-types/table": "^3.13.4", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-vgEArBN5ocqsQdeORBj6xk8acu5iFnd/CyXEQKl0R5RyuYuw0ms8UmFHvs8Fv1HONehPYg+XR4QPliDFPX8R9A=="], - - "@react-stately/tabs": ["@react-stately/tabs@3.8.7", "", { "dependencies": { "@react-stately/list": "^3.13.2", "@react-types/shared": "^3.32.1", "@react-types/tabs": "^3.3.20", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ETZEzg7s9F2SCvisZ2cCpLx6XBHqdvVgDGU5l3C3s9zBKBr6lgyLFt61IdGW8XXZRUvw4mMGT6tGQbXeGvR0Wg=="], - - "@react-stately/toast": ["@react-stately/toast@3.1.2", "", { "dependencies": { "@swc/helpers": "^0.5.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-HiInm7bck32khFBHZThTQaAF6e6/qm57F4mYRWdTq8IVeGDzpkbUYibnLxRhk0UZ5ybc6me+nqqPkG/lVmM42Q=="], - - "@react-stately/toggle": ["@react-stately/toggle@3.9.3", "", { "dependencies": { "@react-stately/utils": "^3.11.0", "@react-types/checkbox": "^3.10.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-G6aA/aTnid/6dQ9dxNEd7/JqzRmVkVYYpOAP+l02hepiuSmFwLu4nE98i4YFBQqFZ5b4l01gMrS90JGL7HrNmw=="], - - "@react-stately/tooltip": ["@react-stately/tooltip@3.5.9", "", { "dependencies": { "@react-stately/overlays": "^3.6.21", "@react-types/tooltip": "^3.5.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-YwqtxFqQFfJtbeh+axHVGAfz9XHf73UaBndHxSbVM/T5c1PfI2yOB39T2FOU5fskZ2VMO3qTDhiXmFgGbGYSfQ=="], - - "@react-stately/tree": ["@react-stately/tree@3.9.4", "", { "dependencies": { "@react-stately/collections": "^3.12.8", "@react-stately/selection": "^3.20.7", "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Re1fdEiR0hHPcEda+7ecw+52lgGfFW0MAEDzFg9I6J/t8STQSP+1YC0VVVkv2xRrkLbKLPqggNKgmD8nggecnw=="], - - "@react-stately/utils": ["@react-stately/utils@3.11.0", "", { "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw=="], - - "@react-stately/virtualizer": ["@react-stately/virtualizer@4.4.4", "", { "dependencies": { "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ri8giqXSZOrznZDCCOE4U36wSkOhy+hrFK7yo/YVcpxTqqp3d3eisfKMqbDsgqBW+XTHycTU/xeAf0u9NqrfpQ=="], - - "@react-types/autocomplete": ["@react-types/autocomplete@3.0.0-alpha.36", "", { "dependencies": { "@react-types/combobox": "^3.13.10", "@react-types/searchfield": "^3.6.6", "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-J/wYkXom9zmEX/xuGjKrqMco9sf5AcByNXOgGAx82LMlk0jFcViggVjIYo/Qzr0TmDeTWyy++r1N59POI6179g=="], - - "@react-types/breadcrumbs": ["@react-types/breadcrumbs@3.7.17", "", { "dependencies": { "@react-types/link": "^3.6.5", "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-IhvVTcfli5o/UDlGACXxjlor2afGlMQA8pNR3faH0bBUay1Fmm3IWktVw9Xwmk+KraV2RTAg9e+E6p8DOQZfiw=="], - - "@react-types/button": ["@react-types/button@3.14.1", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-D8C4IEwKB7zEtiWYVJ3WE/5HDcWlze9mLWQ5hfsBfpePyWCgO3bT/+wjb/7pJvcAocrkXo90QrMm85LcpBtrpg=="], - - "@react-types/calendar": ["@react-types/calendar@3.8.1", "", { "dependencies": { "@internationalized/date": "^3.10.1", "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-B0UuitMP7YkArBAQldwSZSNL2WwazNGCG+lp6yEDj831NrH9e36/jcjv1rObQ9ZMS6uDX9LXu5C8V5RFwGQabA=="], - - "@react-types/checkbox": ["@react-types/checkbox@3.10.2", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-ktPkl6ZfIdGS1tIaGSU/2S5Agf2NvXI9qAgtdMDNva0oLyAZ4RLQb6WecPvofw1J7YKXu0VA5Mu7nlX+FM2weQ=="], - - "@react-types/color": ["@react-types/color@3.1.2", "", { "dependencies": { "@react-types/shared": "^3.32.1", "@react-types/slider": "^3.8.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-NP0TAY3j4tlMztOp/bBfMlPwC9AQKTjSiTFmc2oQNkx5M4sl3QpPqFPosdt7jZ8M4nItvfCWZrlZGjST4SB83A=="], - - "@react-types/combobox": ["@react-types/combobox@3.13.10", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Wo4iix++ID6JzoH9eD7ddGUlirQiGpN/VQc3iFjnaTXiJ/cj3v+1oGsDGCZZTklTVeUMU7SRBfMhMgxHHIYLXA=="], - - "@react-types/datepicker": ["@react-types/datepicker@3.13.3", "", { "dependencies": { "@internationalized/date": "^3.10.1", "@react-types/calendar": "^3.8.1", "@react-types/overlays": "^3.9.2", "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-OTRa3banGxcUQKRTLUzr0zTVUMUL+Az1BWARCYQ+8Z/dlkYXYUW0fnS5I0pUEqihgai15KxiY13U0gAqbNSfcA=="], - - "@react-types/dialog": ["@react-types/dialog@3.5.22", "", { "dependencies": { "@react-types/overlays": "^3.9.2", "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-smSvzOcqKE196rWk0oqJDnz+ox5JM5+OT0PmmJXiUD4q7P5g32O6W5Bg7hMIFUI9clBtngo8kLaX2iMg+GqAzg=="], - - "@react-types/form": ["@react-types/form@3.7.16", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Sb7KJoWEaQ/e4XIY+xRbjKvbP1luome98ZXevpD+zVSyGjEcfIroebizP6K1yMHCWP/043xH6GUkgEqWPoVGjg=="], - - "@react-types/grid": ["@react-types/grid@3.3.6", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-vIZJlYTii2n1We9nAugXwM2wpcpsC6JigJFBd6vGhStRdRWRoU4yv1Gc98Usbx0FQ/J7GLVIgeG8+1VMTKBdxw=="], - - "@react-types/link": ["@react-types/link@3.6.5", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-+I2s3XWBEvLrzts0GnNeA84mUkwo+a7kLUWoaJkW0TOBDG7my95HFYxF9WnqKye7NgpOkCqz4s3oW96xPdIniQ=="], - - "@react-types/listbox": ["@react-types/listbox@3.7.4", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-p4YEpTl/VQGrqVE8GIfqTS5LkT5jtjDTbVeZgrkPnX/fiPhsfbTPiZ6g0FNap4+aOGJFGEEZUv2q4vx+rCORww=="], - - "@react-types/menu": ["@react-types/menu@3.10.5", "", { "dependencies": { "@react-types/overlays": "^3.9.2", "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-HBTrKll2hm0VKJNM4ubIv1L9MNo8JuOnm2G3M+wXvb6EYIyDNxxJkhjsqsGpUXJdAOSkacHBDcNh2HsZABNX4A=="], - - "@react-types/meter": ["@react-types/meter@3.4.13", "", { "dependencies": { "@react-types/progress": "^3.5.16" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-EiarfbpHcvmeyXvXcr6XLaHkNHuGc4g7fBVEiDPwssFJKKfbUzqnnknDxPjyspqUVRcXC08CokS98J1jYobqDg=="], - - "@react-types/numberfield": ["@react-types/numberfield@3.8.16", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-945F0GsD7K2T293YXhap+2Runl3tZWbnhadXVHFWLbqIKKONZFSZTfLKxQcbFr+bQXr2uh1bVJhYcOiS1l5M+A=="], - - "@react-types/overlays": ["@react-types/overlays@3.9.2", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Q0cRPcBGzNGmC8dBuHyoPR7N3057KTS5g+vZfQ53k8WwmilXBtemFJPLsogJbspuewQ/QJ3o2HYsp2pne7/iNw=="], - - "@react-types/progress": ["@react-types/progress@3.5.16", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-I9tSdCFfvQ7gHJtm90VAKgwdTWXQgVNvLRStEc0z9h+bXBxdvZb+QuiRPERChwFQ9VkK4p4rDqaFo69nDqWkpw=="], - - "@react-types/radio": ["@react-types/radio@3.9.2", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-3UcJXu37JrTkRyP4GJPDBU7NmDTInrEdOe+bVzA1j4EegzdkJmLBkLg5cLDAbpiEHB+xIsvbJdx6dxeMuc+H3g=="], - - "@react-types/searchfield": ["@react-types/searchfield@3.6.6", "", { "dependencies": { "@react-types/shared": "^3.32.1", "@react-types/textfield": "^3.12.6" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-cl3itr/fk7wbIQc2Gz5Ie8aVeUmPjVX/mRGS5/EXlmzycAKNYTvqf2mlxwObLndtLISmt7IgNjRRhbUUDI8Ang=="], - - "@react-types/select": ["@react-types/select@3.12.0", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-tM3mEbQNotvCJs1gYRFyIeXmXrIBSBLGw7feCIaYSO45IyjCGv8NZwpQWjoKPaWo3GpbHfHMNlWlq3v5QQPIXw=="], - - "@react-types/shared": ["@react-types/shared@3.32.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w=="], - - "@react-types/slider": ["@react-types/slider@3.8.2", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-MQYZP76OEOYe7/yA2To+Dl0LNb0cKKnvh5JtvNvDnAvEprn1RuLiay8Oi/rTtXmc2KmBa4VdTcsXsmkbbkeN2Q=="], - - "@react-types/switch": ["@react-types/switch@3.5.15", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-r/ouGWQmIeHyYSP1e5luET+oiR7N7cLrAlWsrAfYRWHxqXOSNQloQnZJ3PLHrKFT02fsrQhx2rHaK2LfKeyN3A=="], - - "@react-types/table": ["@react-types/table@3.13.4", "", { "dependencies": { "@react-types/grid": "^3.3.6", "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-I/DYiZQl6aNbMmjk90J9SOhkzVDZvyA3Vn3wMWCiajkMNjvubFhTfda5DDf2SgFP5l0Yh6TGGH5XumRv9LqL5Q=="], - - "@react-types/tabs": ["@react-types/tabs@3.3.20", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-Kjq4PypapdMOVPAQgaFIKH65Kr3YnRvaxBGd6RYizTsqYImQhXoGj6B4lBpjYy4KhfRd4dYS82frHqTGKmBYiA=="], - - "@react-types/textfield": ["@react-types/textfield@3.12.6", "", { "dependencies": { "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-hpEVKE+M3uUkTjw2WrX1NrH/B3rqDJFUa+ViNK2eVranLY4ZwFqbqaYXSzHupOF3ecSjJJv2C103JrwFvx6TPQ=="], - - "@react-types/tooltip": ["@react-types/tooltip@3.5.0", "", { "dependencies": { "@react-types/overlays": "^3.9.2", "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-o/m1wlKlOD2sLb9vZLWdVkD5LFLHBMLGeeK/bhyUtp0IEdUeKy0ZRTS7pa/A50trov9RvdbzLK79xG8nKNxHew=="], - - "@remix-run/router": ["@remix-run/router@1.23.1", "", {}, "sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ=="], - - "@remixicon/react": ["@remixicon/react@4.7.0", "", { "peerDependencies": { "react": ">=18.2.0" } }, "sha512-ODBQjdbOjnFguCqctYkpDjERXOInNaBnRPDKfZOBvbzExBAwr2BaH/6AHFTg/UAFzBDkwtylfMT8iKPAkLwPLQ=="], - - "@rjsf/core": ["@rjsf/core@5.21.1", "", { "dependencies": { "lodash": "^4.17.21", "lodash-es": "^4.17.21", "markdown-to-jsx": "^7.4.1", "nanoid": "^3.3.7", "prop-types": "^15.8.1" }, "peerDependencies": { "@rjsf/utils": "^5.20.x", "react": "^16.14.0 || >=17" } }, "sha512-qURYyhL5RO8S8mkBKFL506mzc20ywJiIQbByozUYudAc25TL7ebxskwscdwhMnuzqQbMjBBimvHJGjcwzfIVxQ=="], - - "@rjsf/material-ui": ["@rjsf/material-ui@5.21.1", "", { "peerDependencies": { "@material-ui/core": "^4.12.3", "@material-ui/icons": "^4.11.2", "@rjsf/core": "^5.20.x", "@rjsf/utils": "^5.20.x", "react": "^16.14.0 || >=17" } }, "sha512-E4We7bETnvQQeo5d2e7po8SipTLzRBxLylC4043/Dsogx1AEy4zyfne6GmtTFAFoVmBZeTQuH6NPuXd25h8SlQ=="], - - "@rjsf/utils": ["@rjsf/utils@5.21.1", "", { "dependencies": { "json-schema-merge-allof": "^0.8.1", "jsonpointer": "^5.0.1", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "react-is": "^18.2.0" }, "peerDependencies": { "react": "^16.14.0 || >=17" } }, "sha512-KEwEtIswzKE2WTLRxvh5vwMwvNMTHnRSxwaRlz3QKz5/iQr9XGJTWcmArjIN3y0ypfLk+X6qZsboamQBIhTV3w=="], - - "@rjsf/validator-ajv8": ["@rjsf/validator-ajv8@5.21.1", "", { "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^2.1.1", "lodash": "^4.17.21", "lodash-es": "^4.17.21" }, "peerDependencies": { "@rjsf/utils": "^5.20.x" } }, "sha512-wR8sSQCnHQT51JzGZMsJfYednOKs3nahnpInkkZmJrK+FvlWkfMfB2QOl8ZgTrKX3egde3362QtBp9QCKEXYxg=="], - - "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@26.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "glob": "^10.4.1", "is-reference": "1.2.1", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-2BJcolt43MY+y5Tz47djHkodCC3c1VKVrBDKpVqHKpQ9z9S158kCCqB8NF6/gzxLdNlYW9abB3Ibh+kOWLp8KQ=="], - - "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], - - "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@15.3.1", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA=="], - - "@rollup/plugin-yaml": ["@rollup/plugin-yaml@4.1.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "js-yaml": "^4.1.0", "tosource": "^2.0.0-alpha.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw=="], - - "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], - - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.54.0", "", { "os": "android", "cpu": "arm" }, "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng=="], - - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.54.0", "", { "os": "android", "cpu": "arm64" }, "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw=="], - - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.54.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw=="], - - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.54.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A=="], - - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.54.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA=="], - - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.54.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ=="], - - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.54.0", "", { "os": "linux", "cpu": "arm" }, "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ=="], - - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.54.0", "", { "os": "linux", "cpu": "arm" }, "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA=="], - - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.54.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng=="], - - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.54.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg=="], - - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.54.0", "", { "os": "linux", "cpu": "none" }, "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw=="], - - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.54.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA=="], - - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.54.0", "", { "os": "linux", "cpu": "none" }, "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ=="], - - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.54.0", "", { "os": "linux", "cpu": "none" }, "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A=="], - - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.54.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ=="], - - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.54.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ=="], - - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.54.0", "", { "os": "linux", "cpu": "x64" }, "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw=="], - - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.54.0", "", { "os": "none", "cpu": "arm64" }, "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg=="], - - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.54.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw=="], - - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.54.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ=="], - - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.54.0", "", { "os": "win32", "cpu": "x64" }, "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ=="], - - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.54.0", "", { "os": "win32", "cpu": "x64" }, "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg=="], - - "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], - - "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], - - "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], - - "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.3.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA=="], - - "@smithy/abort-controller": ["@smithy/abort-controller@1.1.0", "", { "dependencies": { "@smithy/types": "^1.2.0", "tslib": "^2.5.0" } }, "sha512-5imgGUlZL4dW4YWdMYAKLmal9ny/tlenM81QZY7xYyb76z9Z/QOg7oM5Ak9HQl8QfFTlGVWwcMXl+54jroRgEQ=="], - - "@smithy/chunked-blob-reader": ["@smithy/chunked-blob-reader@5.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA=="], - - "@smithy/chunked-blob-reader-native": ["@smithy/chunked-blob-reader-native@4.2.1", "", { "dependencies": { "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" } }, "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ=="], - - "@smithy/config-resolver": ["@smithy/config-resolver@4.4.5", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg=="], - - "@smithy/core": ["@smithy/core@3.20.0", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.8", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-WsSHCPq/neD5G/MkK4csLI5Y5Pkd9c1NMfpYEKeghSGaD4Ja1qLIohRQf2D5c1Uy5aXp76DeKHkzWZ9KAlHroQ=="], - - "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.7", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA=="], - - "@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.7", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.11.0", "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-DrpkEoM3j9cBBWhufqBwnbbn+3nf1N9FP6xuVJ+e220jbactKuQgaZwjwP5CP1t+O94brm2JgVMD2atMGX3xIQ=="], - - "@smithy/eventstream-serde-browser": ["@smithy/eventstream-serde-browser@4.2.7", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-ujzPk8seYoDBmABDE5YqlhQZAXLOrtxtJLrbhHMKjBoG5b4dK4i6/mEU+6/7yXIAkqOO8sJ6YxZl+h0QQ1IJ7g=="], - - "@smithy/eventstream-serde-config-resolver": ["@smithy/eventstream-serde-config-resolver@4.3.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-x7BtAiIPSaNaWuzm24Q/mtSkv+BrISO/fmheiJ39PKRNH3RmH2Hph/bUKSOBOBC9unqfIYDhKTHwpyZycLGPVQ=="], - - "@smithy/eventstream-serde-node": ["@smithy/eventstream-serde-node@4.2.7", "", { "dependencies": { "@smithy/eventstream-serde-universal": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-roySCtHC5+pQq5lK4be1fZ/WR6s/AxnPaLfCODIPArtN2du8s5Ot4mKVK3pPtijL/L654ws592JHJ1PbZFF6+A=="], - - "@smithy/eventstream-serde-universal": ["@smithy/eventstream-serde-universal@4.2.7", "", { "dependencies": { "@smithy/eventstream-codec": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-QVD+g3+icFkThoy4r8wVFZMsIP08taHVKjE6Jpmz8h5CgX/kk6pTODq5cht0OMtcapUx+xrPzUTQdA+TmO0m1g=="], - - "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.3.8", "", { "dependencies": { "@smithy/protocol-http": "^5.3.7", "@smithy/querystring-builder": "^4.2.7", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" } }, "sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg=="], - - "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.2.8", "", { "dependencies": { "@smithy/chunked-blob-reader": "^5.2.0", "@smithy/chunked-blob-reader-native": "^4.2.1", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-07InZontqsM1ggTCPSRgI7d8DirqRrnpL7nIACT4PW0AWrgDiHhjGZzbAE5UtRSiU0NISGUYe7/rri9ZeWyDpw=="], - - "@smithy/hash-node": ["@smithy/hash-node@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw=="], - - "@smithy/hash-stream-node": ["@smithy/hash-stream-node@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-ZQVoAwNYnFMIbd4DUc517HuwNelJUY6YOzwqrbcAgCnVn+79/OK7UjwA93SPpdTOpKDVkLIzavWm/Ck7SmnDPQ=="], - - "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ=="], - - "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ=="], - - "@smithy/md5-js": ["@smithy/md5-js@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-Wv6JcUxtOLTnxvNjDnAiATUsk8gvA6EeS8zzHig07dotpByYsLot+m0AaQEniUBjx97AC41MQR4hW0baraD1Xw=="], - - "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.7", "", { "dependencies": { "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg=="], - - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.4.1", "", { "dependencies": { "@smithy/core": "^3.20.0", "@smithy/middleware-serde": "^4.2.8", "@smithy/node-config-provider": "^4.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "@smithy/url-parser": "^4.2.7", "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" } }, "sha512-gpLspUAoe6f1M6H0u4cVuFzxZBrsGZmjx2O9SigurTx4PbntYa4AJ+o0G0oGm1L2oSX6oBhcGHwrfJHup2JnJg=="], - - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.17", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/service-error-classification": "^4.2.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg=="], - - "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.8", "", { "dependencies": { "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w=="], - - "@smithy/middleware-stack": ["@smithy/middleware-stack@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw=="], - - "@smithy/node-config-provider": ["@smithy/node-config-provider@4.3.7", "", { "dependencies": { "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-7r58wq8sdOcrwWe+klL9y3bc4GW1gnlfnFOuL7CXa7UzfhzhxKuzNdtqgzmTV+53lEp9NXh5hY/S4UgjLOzPfw=="], - - "@smithy/node-http-handler": ["@smithy/node-http-handler@4.4.7", "", { "dependencies": { "@smithy/abort-controller": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/querystring-builder": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ=="], - - "@smithy/property-provider": ["@smithy/property-provider@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA=="], - - "@smithy/protocol-http": ["@smithy/protocol-http@5.3.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA=="], - - "@smithy/querystring-builder": ["@smithy/querystring-builder@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg=="], - - "@smithy/querystring-parser": ["@smithy/querystring-parser@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w=="], - - "@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0" } }, "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA=="], - - "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.4.2", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-M7iUUff/KwfNunmrgtqBfvZSzh3bmFgv/j/t1Y1dQ+8dNo34br1cqVEqy6v0mYEgi0DkGO7Xig0AnuOaEGVlcg=="], - - "@smithy/signature-v4": ["@smithy/signature-v4@5.3.7", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.0", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-middleware": "^4.2.7", "@smithy/util-uri-escape": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg=="], - - "@smithy/smithy-client": ["@smithy/smithy-client@4.10.2", "", { "dependencies": { "@smithy/core": "^3.20.0", "@smithy/middleware-endpoint": "^4.4.1", "@smithy/middleware-stack": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" } }, "sha512-D5z79xQWpgrGpAHb054Fn2CCTQZpog7JELbVQ6XAvXs5MNKWf28U9gzSBlJkOyMl9LA1TZEjRtwvGXfP0Sl90g=="], - - "@smithy/types": ["@smithy/types@4.11.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA=="], - - "@smithy/url-parser": ["@smithy/url-parser@4.2.7", "", { "dependencies": { "@smithy/querystring-parser": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg=="], - - "@smithy/util-base64": ["@smithy/util-base64@4.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ=="], - - "@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg=="], - - "@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.2.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA=="], - - "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew=="], - - "@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q=="], - - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.16", "", { "dependencies": { "@smithy/property-provider": "^4.2.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ=="], - - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.19", "", { "dependencies": { "@smithy/config-resolver": "^4.4.5", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", "@smithy/property-provider": "^4.2.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA=="], - - "@smithy/util-endpoints": ["@smithy/util-endpoints@3.2.7", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg=="], - - "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw=="], - - "@smithy/util-middleware": ["@smithy/util-middleware@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w=="], - - "@smithy/util-retry": ["@smithy/util-retry@4.2.7", "", { "dependencies": { "@smithy/service-error-classification": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg=="], - - "@smithy/util-stream": ["@smithy/util-stream@4.5.8", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.8", "@smithy/node-http-handler": "^4.4.7", "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-ZnnBhTapjM0YPGUSmOs0Mcg/Gg87k503qG4zU2v/+Js2Gu+daKOJMeqcQns8ajepY8tgzzfYxl6kQyZKml6O2w=="], - - "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA=="], - - "@smithy/util-utf8": ["@smithy/util-utf8@4.2.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw=="], - - "@smithy/util-waiter": ["@smithy/util-waiter@4.2.7", "", { "dependencies": { "@smithy/abort-controller": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw=="], - - "@smithy/uuid": ["@smithy/uuid@1.1.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw=="], - - "@so-ric/colorspace": ["@so-ric/colorspace@1.1.6", "", { "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" } }, "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw=="], - - "@spotify/eslint-config-base": ["@spotify/eslint-config-base@15.0.0", "", { "peerDependencies": { "eslint": ">=7.x" } }, "sha512-7UA5QWbb8xk3Q1665BkRldzieI/Of7ONzjEXZpoyIjrfBDEmlXEDdCmOsv8Pt2aOuzHSTiykMzn7wNF5ymGL/A=="], - - "@spotify/eslint-config-react": ["@spotify/eslint-config-react@15.0.0", "", { "peerDependencies": { "eslint": ">=8.x", "eslint-plugin-jsx-a11y": "6.x", "eslint-plugin-react": ">=7.7.0 <8", "eslint-plugin-react-hooks": "^4.0.0" } }, "sha512-TgYLvOb0RvniWbJ3dz0Skh/AMRpkJU7aNnUfHIaEvXziVQYUrRAuMwNvCCjeCfR9FkeImuORsyBobZhgsfjrZQ=="], - - "@spotify/eslint-config-typescript": ["@spotify/eslint-config-typescript@15.0.0", "", { "peerDependencies": { "@typescript-eslint/eslint-plugin": ">=5", "@typescript-eslint/parser": ">=5", "eslint": ">=8.x" } }, "sha512-70nKh2v6So0MddkEfKj4xgAcqs1VmR0AS2yb62XYetZ1Ep3AmhYDl/5CYtU5pbAQS4zCap8rd/EYdmVEHXiS6g=="], - - "@sucrase/webpack-loader": ["@sucrase/webpack-loader@2.0.0", "", { "dependencies": { "loader-utils": "^1.1.0" }, "peerDependencies": { "sucrase": "^3" } }, "sha512-KUfWr83g70Qm+ZqjGL+M4tX01taDP3BldQcI6NSMlDf7WTDfuo0RvLlS0ekF6dPVslNyZhbFFBy2OBTB6Sa6+Q=="], - - "@svgr/babel-plugin-add-jsx-attribute": ["@svgr/babel-plugin-add-jsx-attribute@6.5.1", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ=="], - - "@svgr/babel-plugin-remove-jsx-attribute": ["@svgr/babel-plugin-remove-jsx-attribute@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA=="], - - "@svgr/babel-plugin-remove-jsx-empty-expression": ["@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA=="], - - "@svgr/babel-plugin-replace-jsx-attribute-value": ["@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg=="], - - "@svgr/babel-plugin-svg-dynamic-title": ["@svgr/babel-plugin-svg-dynamic-title@6.5.1", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw=="], - - "@svgr/babel-plugin-svg-em-dimensions": ["@svgr/babel-plugin-svg-em-dimensions@6.5.1", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA=="], - - "@svgr/babel-plugin-transform-react-native-svg": ["@svgr/babel-plugin-transform-react-native-svg@6.5.1", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg=="], - - "@svgr/babel-plugin-transform-svg-component": ["@svgr/babel-plugin-transform-svg-component@6.5.1", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ=="], - - "@svgr/babel-preset": ["@svgr/babel-preset@6.5.1", "", { "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", "@svgr/babel-plugin-remove-jsx-attribute": "*", "@svgr/babel-plugin-remove-jsx-empty-expression": "*", "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", "@svgr/babel-plugin-transform-svg-component": "^6.5.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw=="], - - "@svgr/core": ["@svgr/core@6.5.1", "", { "dependencies": { "@babel/core": "^7.19.6", "@svgr/babel-preset": "^6.5.1", "@svgr/plugin-jsx": "^6.5.1", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.1" } }, "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw=="], - - "@svgr/hast-util-to-babel-ast": ["@svgr/hast-util-to-babel-ast@6.5.1", "", { "dependencies": { "@babel/types": "^7.20.0", "entities": "^4.4.0" } }, "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw=="], - - "@svgr/plugin-jsx": ["@svgr/plugin-jsx@6.5.1", "", { "dependencies": { "@babel/core": "^7.19.6", "@svgr/babel-preset": "^6.5.1", "@svgr/hast-util-to-babel-ast": "^6.5.1", "svg-parser": "^2.0.4" }, "peerDependencies": { "@svgr/core": "^6.0.0" } }, "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw=="], - - "@svgr/plugin-svgo": ["@svgr/plugin-svgo@6.5.1", "", { "dependencies": { "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", "svgo": "^2.8.0" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ=="], - - "@svgr/rollup": ["@svgr/rollup@6.5.1", "", { "dependencies": { "@babel/core": "^7.19.6", "@babel/plugin-transform-react-constant-elements": "^7.18.12", "@babel/preset-env": "^7.19.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", "@rollup/pluginutils": "^4.2.1", "@svgr/core": "^6.5.1", "@svgr/plugin-jsx": "^6.5.1", "@svgr/plugin-svgo": "^6.5.1" } }, "sha512-GeUfq0grJfpcn2jRWRaZ4npn27nnWK21vUj6MqDqknuJnEqGADcZZjO9wrUAaPLr3InAnQi0Z7nwiNUdzkaj6A=="], - - "@svgr/webpack": ["@svgr/webpack@6.5.1", "", { "dependencies": { "@babel/core": "^7.19.6", "@babel/plugin-transform-react-constant-elements": "^7.18.12", "@babel/preset-env": "^7.19.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", "@svgr/core": "^6.5.1", "@svgr/plugin-jsx": "^6.5.1", "@svgr/plugin-svgo": "^6.5.1" } }, "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA=="], - - "@swc/core": ["@swc/core@1.15.7", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.25" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.7", "@swc/core-darwin-x64": "1.15.7", "@swc/core-linux-arm-gnueabihf": "1.15.7", "@swc/core-linux-arm64-gnu": "1.15.7", "@swc/core-linux-arm64-musl": "1.15.7", "@swc/core-linux-x64-gnu": "1.15.7", "@swc/core-linux-x64-musl": "1.15.7", "@swc/core-win32-arm64-msvc": "1.15.7", "@swc/core-win32-ia32-msvc": "1.15.7", "@swc/core-win32-x64-msvc": "1.15.7" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-kTGB8XI7P+pTKW83tnUEDVP4zduF951u3UAOn5eTi0vyW6MvL56A3+ggMdfuVFtDI0/DsbSzf5z34HVBbuScWw=="], - - "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+hNVUfezUid7LeSHqnhoC6Gh3BROABxjlDNInuZ/fie1RUxaEX4qzDwdTgozJELgHhvYxyPIg1ro8ibnKtgO4g=="], - - "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.15.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZAFuvtSYZTuXPcrhanaD5eyp27H8LlDzx2NAeVyH0FchYcuXf0h5/k3GL9ZU6Jw9eQ63R1E8KBgpXEJlgRwZUQ=="], - - "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.15.7", "", { "os": "linux", "cpu": "arm" }, "sha512-K3HTYocpqnOw8KcD8SBFxiDHjIma7G/X+bLdfWqf+qzETNBrzOub/IEkq9UaeupaJiZJkPptr/2EhEXXWryS/A=="], - - "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.15.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-HCnVIlsLnCtQ3uXcXgWrvQ6SAraskLA9QJo9ykTnqTH6TvUYqEta+TdTdGjzngD6TOE7XjlAiUs/RBtU8Z0t+Q=="], - - "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.15.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-/OOp9UZBg4v2q9+x/U21Jtld0Wb8ghzBScwhscI7YvoSh4E8RALaJ1msV8V8AKkBkZH7FUAFB7Vbv0oVzZsezA=="], - - "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.15.7", "", { "os": "linux", "cpu": "x64" }, "sha512-VBbs4gtD4XQxrHuQ2/2+TDZpPQQgrOHYRnS6SyJW+dw0Nj/OomRqH+n5Z4e/TgKRRbieufipeIGvADYC/90PYQ=="], - - "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.15.7", "", { "os": "linux", "cpu": "x64" }, "sha512-kVuy2unodso6p0rMauS2zby8/bhzoGRYxBDyD6i2tls/fEYAE74oP0VPFzxIyHaIjK1SN6u5TgvV9MpyJ5xVug=="], - - "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.15.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-uddYoo5Xmo1XKLhAnh4NBIyy5d0xk33x1sX3nIJboFySLNz878ksCFCZ3IBqrt1Za0gaoIWoOSSSk0eNhAc/sw=="], - - "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.15.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-rqq8JjNMLx3QNlh0aPTtN/4+BGLEHC94rj9mkH1stoNRf3ra6IksNHMHy+V1HUqElEgcZyx+0yeXx3eLOTcoFw=="], - - "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.15.7", "", { "os": "win32", "cpu": "x64" }, "sha512-4BK06EGdPnuplgcNhmSbOIiLdRgHYX3v1nl4HXo5uo4GZMfllXaCyBUes+0ePRfwbn9OFgVhCWPcYYjMT6hycQ=="], - - "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], - - "@swc/helpers": ["@swc/helpers@0.5.18", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ=="], - - "@swc/jest": ["@swc/jest@0.2.39", "", { "dependencies": { "@jest/create-cache-key-function": "^30.0.0", "@swc/counter": "^0.1.3", "jsonc-parser": "^3.2.0" }, "peerDependencies": { "@swc/core": "*" } }, "sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA=="], - - "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="], - - "@tanstack/query-core": ["@tanstack/query-core@5.90.15", "", {}, "sha512-mInIZNUZftbERE+/Hbtswfse49uUQwch46p+27gP9DWJL927UjnaWEF2t3RMOqBcXbfMdcNkPe06VyUIAZTV1g=="], - - "@tanstack/react-query": ["@tanstack/react-query@5.90.15", "", { "dependencies": { "@tanstack/query-core": "5.90.15" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-uQvnDDcTOgJouNtAyrgRej+Azf0U5WDov3PXmHFUBc+t1INnAYhIlpZtCGNBLwCN41b43yO7dPNZu8xWkUFBwQ=="], - - "@tanstack/react-table": ["@tanstack/react-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="], - - "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="], - - "@testing-library/dom": ["@testing-library/dom@9.3.4", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.1.3", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" } }, "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ=="], - - "@testing-library/react": ["@testing-library/react@14.3.1", "", { "dependencies": { "@babel/runtime": "^7.12.5", "@testing-library/dom": "^9.0.0", "@types/react-dom": "^18.0.0" }, "peerDependencies": { "react": "^18.0.0", "react-dom": "^18.0.0" } }, "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ=="], - - "@tootallnate/once": ["@tootallnate/once@2.0.0", "", {}, "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="], - - "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], - - "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], - - "@tsconfig/node10": ["@tsconfig/node10@1.0.12", "", {}, "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ=="], - - "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="], - - "@tsconfig/node14": ["@tsconfig/node14@1.0.3", "", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="], - - "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], - - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], - - "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], - - "@types/aws-lambda": ["@types/aws-lambda@8.10.159", "", {}, "sha512-SAP22WSGNN12OQ8PlCzGzRCZ7QDCwI85dQZbmpz7+mAk+L7j+wI7qnvmdKh+o7A5LaOp6QnOZ2NJphAZQTTHQg=="], - - "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], - - "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], - - "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], - - "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], - - "@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="], - - "@types/bonjour": ["@types/bonjour@3.5.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ=="], - - "@types/btoa-lite": ["@types/btoa-lite@1.0.2", "", {}, "sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg=="], - - "@types/caseless": ["@types/caseless@0.12.5", "", {}, "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg=="], - - "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], - - "@types/connect-history-api-fallback": ["@types/connect-history-api-fallback@1.5.4", "", { "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw=="], - - "@types/content-type": ["@types/content-type@1.1.9", "", {}, "sha512-Hq9IMnfekuOCsEmYl4QX2HBrT+XsfXiupfrLLY8Dcf3Puf4BkBOxSbWYTITSOQAhJoYPBez+b4MJRpIYL65z8A=="], - - "@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="], - - "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], - - "@types/docker-modem": ["@types/docker-modem@3.0.6", "", { "dependencies": { "@types/node": "*", "@types/ssh2": "*" } }, "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg=="], - - "@types/dockerode": ["@types/dockerode@3.3.47", "", { "dependencies": { "@types/docker-modem": "*", "@types/node": "*", "@types/ssh2": "*" } }, "sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw=="], - - "@types/eslint": ["@types/eslint@8.56.12", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g=="], - - "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], - - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - - "@types/express": ["@types/express@4.17.25", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "^1" } }, "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw=="], - - "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.7", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg=="], - - "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], - - "@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="], - - "@types/hoist-non-react-statics": ["@types/hoist-non-react-statics@3.3.7", "", { "dependencies": { "hoist-non-react-statics": "^3.3.0" }, "peerDependencies": { "@types/react": "*" } }, "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g=="], - - "@types/html-minifier-terser": ["@types/html-minifier-terser@6.1.0", "", {}, "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg=="], - - "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="], - - "@types/http-proxy": ["@types/http-proxy@1.17.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw=="], - - "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], - - "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], - - "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], - - "@types/jest": ["@types/jest@29.5.14", "", { "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" } }, "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ=="], - - "@types/js-cookie": ["@types/js-cookie@2.2.7", "", {}, "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="], - - "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], - - "@types/jsdom": ["@types/jsdom@20.0.1", "", { "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", "parse5": "^7.0.0" } }, "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ=="], - - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - - "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], - - "@types/jsonwebtoken": ["@types/jsonwebtoken@9.0.10", "", { "dependencies": { "@types/ms": "*", "@types/node": "*" } }, "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA=="], - - "@types/long": ["@types/long@4.0.2", "", {}, "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="], - - "@types/lunr": ["@types/lunr@2.3.7", "", {}, "sha512-Tb/kUm38e8gmjahQzdCKhbdsvQ9/ppzHFfsJ0dMs3ckqQsRj+P5IkSAwFTBrBxdyr3E/LoMUUrZngjDYAjiE3A=="], - - "@types/luxon": ["@types/luxon@3.7.1", "", {}, "sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg=="], - - "@types/mdast": ["@types/mdast@3.0.15", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ=="], - - "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], - - "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - - "@types/multer": ["@types/multer@1.4.13", "", { "dependencies": { "@types/express": "*" } }, "sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw=="], - - "@types/node": ["@types/node@20.19.27", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug=="], - - "@types/node-forge": ["@types/node-forge@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw=="], - - "@types/oauth": ["@types/oauth@0.9.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-H9TRCVKBNOhZZmyHLqFt9drPM9l+ShWiqqJijU1B8P3DX3ub84NjxDuy+Hjrz+fEca5Kwip3qPMKNyiLgNJtIA=="], - - "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], - - "@types/passport": ["@types/passport@1.0.17", "", { "dependencies": { "@types/express": "*" } }, "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg=="], - - "@types/passport-oauth2": ["@types/passport-oauth2@1.8.0", "", { "dependencies": { "@types/express": "*", "@types/oauth": "*", "@types/passport": "*" } }, "sha512-6//z+4orIOy/g3zx17HyQ71GSRK4bs7Sb+zFasRoc2xzlv7ZCJ+vkDBYFci8U6HY+or6Zy7ajf4mz4rK7nsWJQ=="], - - "@types/passport-strategy": ["@types/passport-strategy@0.2.38", "", { "dependencies": { "@types/express": "*", "@types/passport": "*" } }, "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA=="], - - "@types/prop-types": ["@types/prop-types@15.7.15", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="], - - "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], - - "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], - - "@types/react": ["@types/react@18.3.27", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" } }, "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w=="], - - "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="], - - "@types/react-redux": ["@types/react-redux@7.1.34", "", { "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", "hoist-non-react-statics": "^3.3.0", "redux": "^4.0.0" } }, "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ=="], - - "@types/react-sparklines": ["@types/react-sparklines@1.7.5", "", { "dependencies": { "@types/react": "*" } }, "sha512-rIAmNyRKUqWWnaQMjNrxMNkgEFi5f9PrdczSNxj5DscAa48y4i9P0fRKZ72FmNcFsdg6Jx4o6CXWZtIaC0OJOg=="], - - "@types/react-transition-group": ["@types/react-transition-group@4.4.12", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w=="], - - "@types/request": ["@types/request@2.48.13", "", { "dependencies": { "@types/caseless": "*", "@types/node": "*", "@types/tough-cookie": "*", "form-data": "^2.5.5" } }, "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg=="], - - "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], - - "@types/retry": ["@types/retry@0.12.2", "", {}, "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow=="], - - "@types/semver": ["@types/semver@7.5.8", "", {}, "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ=="], - - "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="], - - "@types/serve-index": ["@types/serve-index@1.9.4", "", { "dependencies": { "@types/express": "*" } }, "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug=="], - - "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="], - - "@types/sockjs": ["@types/sockjs@0.3.36", "", { "dependencies": { "@types/node": "*" } }, "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q=="], - - "@types/ssh2": ["@types/ssh2@1.15.5", "", { "dependencies": { "@types/node": "^18.11.18" } }, "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ=="], - - "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], - - "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="], - - "@types/styled-jsx": ["@types/styled-jsx@2.2.9", "", { "dependencies": { "@types/react": "*" } }, "sha512-W/iTlIkGEyTBGTEvZCey8EgQlQ5l0DwMqi3iOXlLs2kyBwYTXHKEiU6IZ5EwoRwngL8/dGYuzezSup89ttVHLw=="], - - "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="], - - "@types/triple-beam": ["@types/triple-beam@1.3.5", "", {}, "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="], - - "@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - - "@types/webpack-env": ["@types/webpack-env@1.18.8", "", {}, "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A=="], - - "@types/whatwg-mimetype": ["@types/whatwg-mimetype@3.0.2", "", {}, "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA=="], - - "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], - - "@types/xml-crypto": ["@types/xml-crypto@1.4.6", "", { "dependencies": { "@types/node": "*", "xpath": "0.0.27" } }, "sha512-A6jEW2FxLZo1CXsRWnZHUX2wzR3uDju2Bozt6rDbSmU/W8gkilaVbwFEVN0/NhnUdMVzwYobWtM6bU1QJJFb7Q=="], - - "@types/xml-encryption": ["@types/xml-encryption@1.2.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-I69K/WW1Dv7j6O3jh13z0X8sLWJRXbu5xnHDl9yHzUNDUBtUoBY058eb5s+x/WG6yZC1h8aKdI2EoyEPjyEh+Q=="], - - "@types/xml2js": ["@types/xml2js@0.4.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ=="], - - "@types/yargs": ["@types/yargs@17.0.35", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg=="], - - "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], - - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@7.18.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/type-utils": "7.18.0", "@typescript-eslint/utils": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "peerDependencies": { "@typescript-eslint/parser": "^7.0.0", "eslint": "^8.56.0" } }, "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw=="], - - "@typescript-eslint/parser": ["@typescript-eslint/parser@7.18.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg=="], - - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.50.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.50.1", "@typescript-eslint/types": "^8.50.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg=="], - - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], - - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.50.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw=="], - - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@7.18.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "7.18.0", "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA=="], - - "@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], - - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], - - "@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" } }, "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg=="], - - "@typespec/ts-http-runtime": ["@typespec/ts-http-runtime@0.3.2", "", { "dependencies": { "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "tslib": "^2.6.2" } }, "sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg=="], - - "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - - "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], - - "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="], - - "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="], - - "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="], - - "@webassemblyjs/helper-numbers": ["@webassemblyjs/helper-numbers@1.13.2", "", { "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="], - - "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="], - - "@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/wasm-gen": "1.14.1" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="], - - "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="], - - "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="], - - "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="], - - "@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/helper-wasm-section": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-opt": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1", "@webassemblyjs/wast-printer": "1.14.1" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="], - - "@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="], - - "@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="], - - "@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="], - - "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="], - - "@xmldom/xmldom": ["@xmldom/xmldom@0.8.11", "", {}, "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw=="], - - "@xobotyi/scrollbar-width": ["@xobotyi/scrollbar-width@1.9.5", "", {}, "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="], - - "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="], - - "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="], - - "@yarnpkg/lockfile": ["@yarnpkg/lockfile@1.1.0", "", {}, "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="], - - "@yarnpkg/parsers": ["@yarnpkg/parsers@3.0.3", "", { "dependencies": { "js-yaml": "^3.10.0", "tslib": "^2.4.0" } }, "sha512-mQZgUSgFurUtA07ceMjxrWkYz8QtDuYkvPlu0ZqncgjopQ0t6CNEo/OSealkmnagSUx8ZD5ewvezUwUuMqutQg=="], - - "abab": ["abab@2.0.6", "", {}, "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="], - - "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], - - "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], - - "acorn-globals": ["acorn-globals@7.0.1", "", { "dependencies": { "acorn": "^8.1.0", "acorn-walk": "^8.0.2" } }, "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q=="], - - "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], - - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - - "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], - - "address": ["address@1.2.2", "", {}, "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA=="], - - "adm-zip": ["adm-zip@0.5.16", "", {}, "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ=="], - - "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], - - "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - - "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="], - - "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], - - "ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], - - "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], - - "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], - - "ansi-html": ["ansi-html@0.0.9", "", { "bin": { "ansi-html": "bin/ansi-html" } }, "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg=="], - - "ansi-html-community": ["ansi-html-community@0.0.8", "", { "bin": { "ansi-html": "bin/ansi-html" } }, "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw=="], - - "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], - - "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - - "app": ["app@workspace:packages/app"], - - "append-field": ["append-field@1.0.0", "", {}, "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="], - - "archiver": ["archiver@6.0.2", "", { "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", "buffer-crc32": "^0.2.1", "readable-stream": "^3.6.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^5.0.1" } }, "sha512-UQ/2nW7NMl1G+1UnrLypQw1VdT9XZg/ECcKPq7l+STzStrSivFIXIp34D8M5zeNGW5NoOupdYCHv6VySCPNNlw=="], - - "archiver-utils": ["archiver-utils@4.0.1", "", { "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^3.6.0" } }, "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg=="], - - "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], - - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - - "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], - - "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], - - "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], - - "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], - - "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], - - "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], - - "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], - - "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], - - "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], - - "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], - - "arrify": ["arrify@2.0.1", "", {}, "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="], - - "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], - - "asn1.js": ["asn1.js@4.10.1", "", { "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw=="], - - "assert": ["assert@1.5.1", "", { "dependencies": { "object.assign": "^4.1.4", "util": "^0.10.4" } }, "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A=="], - - "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="], - - "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], - - "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], - - "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], - - "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], - - "async-lock": ["async-lock@1.4.1", "", {}, "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ=="], - - "async-mutex": ["async-mutex@0.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA=="], - - "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="], - - "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], - - "at-least-node": ["at-least-node@1.0.0", "", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], - - "atlassian-openapi": ["atlassian-openapi@1.0.21", "", { "dependencies": { "jsonpointer": "^5.0.0", "urijs": "^1.19.10" } }, "sha512-1OnnoY2CQYHgXrce/06BltL7fox+uVY7brHUInyFbMpTURjTNIGXfLQxVDRo/2On7ryyKzkX7FfNApYhXw7f+w=="], - - "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - - "aws-sign2": ["aws-sign2@0.7.0", "", {}, "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="], - - "aws-ssl-profiles": ["aws-ssl-profiles@1.1.2", "", {}, "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="], - - "aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="], - - "axe-core": ["axe-core@4.11.0", "", {}, "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ=="], - - "axios": ["axios@1.13.2", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA=="], - - "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], - - "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="], - - "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="], - - "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], - - "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.6.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg=="], - - "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], - - "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.14", "", { "dependencies": { "@babel/compat-data": "^7.27.7", "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg=="], - - "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], - - "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.5", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg=="], - - "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.2.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg=="], - - "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], - - "backend": ["backend@workspace:packages/backend"], - - "backo2": ["backo2@1.0.2", "", {}, "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA=="], - - "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], - - "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - - "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="], - - "base64-arraybuffer": ["base64-arraybuffer@0.1.5", "", {}, "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g=="], - - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - - "base64-stream": ["base64-stream@1.0.0", "", {}, "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA=="], - - "base64url": ["base64url@3.0.1", "", {}, "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A=="], - - "baseline-browser-mapping": ["baseline-browser-mapping@2.9.11", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ=="], - - "basic-auth": ["basic-auth@2.0.1", "", { "dependencies": { "safe-buffer": "5.1.2" } }, "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg=="], - - "basic-ftp": ["basic-ftp@5.0.5", "", {}, "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg=="], - - "batch": ["batch@0.6.1", "", {}, "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw=="], - - "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], - - "before-after-hook": ["before-after-hook@2.2.3", "", {}, "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="], - - "better-sqlite3": ["empty-npm-package@1.0.0", "", {}, "sha512-q4Mq/+XO7UNDdMiPpR/LIBIW1Zl4V0Z6UT9aKGqIAnBCtCb3lvZJM1KbDbdzdC8fKflwflModfjR29Nt0EpcwA=="], - - "bfj": ["bfj@8.0.0", "", { "dependencies": { "bluebird": "^3.7.2", "check-types": "^11.2.3", "hoopy": "^0.1.4", "jsonpath": "^1.1.1", "tryer": "^1.0.1" } }, "sha512-6KJe4gFrZ4lhmvWcUIj37yFAs36mi2FZXuTkw6udZ/QsX/znFypW4SatqcLA5K5T4BAWgJZD73UFEJJQxuJjoA=="], - - "big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="], - - "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], - - "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], - - "bintrees": ["bintrees@1.0.2", "", {}, "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw=="], - - "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], - - "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], - - "bn.js": ["bn.js@5.2.2", "", {}, "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw=="], - - "body-parser": ["body-parser@1.20.4", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.14.0", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA=="], - - "bonjour-service": ["bonjour-service@1.3.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } }, "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA=="], - - "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - - "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], - - "bowser": ["bowser@2.13.1", "", {}, "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw=="], - - "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - - "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - - "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="], - - "brotli-wasm": ["brotli-wasm@3.0.1", "", {}, "sha512-U3K72/JAi3jITpdhZBqzSUq+DUY697tLxOuFXB+FpAE/Ug+5C3VZrv4uA674EUZHxNAuQ9wETXNqQkxZD6oL4A=="], - - "browserify-aes": ["browserify-aes@1.2.0", "", { "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA=="], - - "browserify-cipher": ["browserify-cipher@1.0.1", "", { "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", "evp_bytestokey": "^1.0.0" } }, "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w=="], - - "browserify-des": ["browserify-des@1.0.2", "", { "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A=="], - - "browserify-rsa": ["browserify-rsa@4.1.1", "", { "dependencies": { "bn.js": "^5.2.1", "randombytes": "^2.1.0", "safe-buffer": "^5.2.1" } }, "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ=="], - - "browserify-sign": ["browserify-sign@4.2.5", "", { "dependencies": { "bn.js": "^5.2.2", "browserify-rsa": "^4.1.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "elliptic": "^6.6.1", "inherits": "^2.0.4", "parse-asn1": "^5.1.9", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1" } }, "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw=="], - - "browserify-zlib": ["browserify-zlib@0.2.0", "", { "dependencies": { "pako": "~1.0.5" } }, "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA=="], - - "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], - - "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], - - "btoa": ["btoa@1.2.1", "", { "bin": { "btoa": "bin/btoa.js" } }, "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g=="], - - "btoa-lite": ["btoa-lite@1.0.0", "", {}, "sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA=="], - - "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - - "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], - - "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], - - "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - - "buffer-xor": ["buffer-xor@1.0.3", "", {}, "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ=="], - - "buildcheck": ["buildcheck@0.0.7", "", {}, "sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA=="], - - "builtin-status-codes": ["builtin-status-codes@3.0.0", "", {}, "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ=="], - - "bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="], - - "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], - - "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], - - "byline": ["byline@5.0.0", "", {}, "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q=="], - - "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - - "cache-content-type": ["cache-content-type@1.0.1", "", { "dependencies": { "mime-types": "^2.1.18", "ylru": "^1.2.0" } }, "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA=="], - - "cacheable-lookup": ["cacheable-lookup@6.1.0", "", {}, "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww=="], - - "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], - - "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], - - "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - - "call-me-maybe": ["call-me-maybe@1.0.2", "", {}, "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="], - - "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - - "camel-case": ["camel-case@4.1.2", "", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="], - - "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - - "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], - - "caniuse-lite": ["caniuse-lite@1.0.30001761", "", {}, "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g=="], - - "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="], - - "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], - - "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - - "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], - - "character-entities": ["character-entities@1.2.4", "", {}, "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="], - - "character-entities-legacy": ["character-entities-legacy@1.1.4", "", {}, "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="], - - "character-reference-invalid": ["character-reference-invalid@1.1.4", "", {}, "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="], - - "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], - - "check-types": ["check-types@11.2.3", "", {}, "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg=="], - - "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - - "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], - - "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], - - "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], - - "cipher-base": ["cipher-base@1.0.7", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.2" } }, "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA=="], - - "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], - - "classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="], - - "clean-css": ["clean-css@5.3.3", "", { "dependencies": { "source-map": "~0.6.0" } }, "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg=="], - - "clean-git-ref": ["clean-git-ref@2.0.1", "", {}, "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw=="], - - "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], - - "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], - - "cli-width": ["cli-width@3.0.0", "", {}, "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="], - - "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], - - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="], - - "clsx": ["clsx@1.2.1", "", {}, "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="], - - "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], - - "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="], - - "codeowners-utils": ["codeowners-utils@1.0.2", "", { "dependencies": { "cross-spawn": "^7.0.2", "find-up": "^4.1.0", "ignore": "^5.1.4", "locate-path": "^5.0.0" } }, "sha512-4oLRCymV7azxGHMpM3F297D651VdwZa21hVfFCn/cOd8Fq8tFrpfpyRpSBQkaZCyFPkfOhEld9xceCF7btyiug=="], - - "collect-v8-coverage": ["collect-v8-coverage@1.0.3", "", {}, "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw=="], - - "color": ["color@5.0.3", "", { "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" } }, "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA=="], - - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - - "color-string": ["color-string@2.1.4", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg=="], - - "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="], - - "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], - - "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - - "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], - - "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - - "common-tags": ["common-tags@1.8.2", "", {}, "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA=="], - - "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], - - "compress-commons": ["compress-commons@5.0.3", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", "normalize-path": "^3.0.0", "readable-stream": "^3.6.0" } }, "sha512-/UIcLWvwAQyVibgpQDPtfNM3SvqN7G9elAPAV7GM0L53EbNWwWiCsWtK8Fwed/APEbptPHXs5PuW+y8Bq8lFTA=="], - - "compressible": ["compressible@2.0.18", "", { "dependencies": { "mime-db": ">= 1.43.0 < 2" } }, "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg=="], - - "compression": ["compression@1.8.1", "", { "dependencies": { "bytes": "3.1.2", "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" } }, "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w=="], - - "compute-gcd": ["compute-gcd@1.2.1", "", { "dependencies": { "validate.io-array": "^1.0.3", "validate.io-function": "^1.0.2", "validate.io-integer-array": "^1.0.0" } }, "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg=="], - - "compute-lcm": ["compute-lcm@1.1.2", "", { "dependencies": { "compute-gcd": "^1.2.1", "validate.io-array": "^1.0.3", "validate.io-function": "^1.0.2", "validate.io-integer-array": "^1.0.0" } }, "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ=="], - - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - - "concat-stream": ["concat-stream@2.0.0", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A=="], - - "concat-with-sourcemaps": ["concat-with-sourcemaps@1.1.0", "", { "dependencies": { "source-map": "^0.6.1" } }, "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg=="], - - "connect": ["connect@3.7.0", "", { "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ=="], - - "connect-history-api-fallback": ["connect-history-api-fallback@2.0.0", "", {}, "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA=="], - - "connect-session-knex": ["connect-session-knex@4.0.2", "", { "dependencies": { "bluebird": "^3.7.2", "knex": "3" } }, "sha512-VgrHKBUOhqqorNRLCSZcwmuzTzRdrYK2qkeYd0JMRor29G1SBWJKjVF/Fq5QB7hgGIN3oR2ee7F1LmLsjhO+aA=="], - - "console-browserify": ["console-browserify@1.2.0", "", {}, "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="], - - "constants-browserify": ["constants-browserify@1.0.0", "", {}, "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ=="], - - "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], - - "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], - - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - - "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], - - "cookie-parser": ["cookie-parser@1.4.7", "", { "dependencies": { "cookie": "0.7.2", "cookie-signature": "1.0.6" } }, "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw=="], - - "cookie-signature": ["cookie-signature@1.0.7", "", {}, "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="], - - "cookies": ["cookies@0.9.1", "", { "dependencies": { "depd": "~2.0.0", "keygrip": "~1.1.0" } }, "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw=="], - - "copy-to-clipboard": ["copy-to-clipboard@3.3.3", "", { "dependencies": { "toggle-selection": "^1.0.6" } }, "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA=="], - - "core-js": ["core-js@3.47.0", "", {}, "sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg=="], - - "core-js-compat": ["core-js-compat@3.47.0", "", { "dependencies": { "browserslist": "^4.28.0" } }, "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ=="], - - "core-js-pure": ["core-js-pure@3.47.0", "", {}, "sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw=="], - - "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], - - "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], - - "cors-gate": ["cors-gate@1.1.3", "", {}, "sha512-RFqvbbpj02lqKDhqasBEkgzmT3RseCH3DKy5sT2W9S1mhctABKQP3ktKcnKN0h8t4pJ2SneI3hPl3TGNi/VmZA=="], - - "cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], - - "cpu-features": ["cpu-features@0.0.10", "", { "dependencies": { "buildcheck": "~0.0.6", "nan": "^2.19.0" } }, "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA=="], - - "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], - - "crc32-stream": ["crc32-stream@5.0.1", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" } }, "sha512-lO1dFui+CEUh/ztYIpgpKItKW9Bb4NWakCRJrnqAbFIYD+OZAwb2VfD5T5eXMw2FNcsDHkQcNl/Wh3iVXYwU6g=="], - - "create-ecdh": ["create-ecdh@4.0.4", "", { "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" } }, "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A=="], - - "create-hash": ["create-hash@1.2.0", "", { "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="], - - "create-hmac": ["create-hmac@1.1.7", "", { "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", "ripemd160": "^2.0.0", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg=="], - - "create-jest": ["create-jest@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" }, "bin": { "create-jest": "bin/create-jest.js" } }, "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q=="], - - "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], - - "cron": ["cron@3.5.0", "", { "dependencies": { "@types/luxon": "~3.4.0", "luxon": "~3.5.0" } }, "sha512-0eYZqCnapmxYcV06uktql93wNWdlTmmBFP2iYz+JPVcQqlyFYcn1lFuIk4R54pkOmE7mcldTAPZv6X5XA4Q46A=="], - - "cron-parser": ["cron-parser@4.9.0", "", { "dependencies": { "luxon": "^3.2.1" } }, "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q=="], - - "cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], - - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - - "crypto-browserify": ["crypto-browserify@3.12.1", "", { "dependencies": { "browserify-cipher": "^1.0.1", "browserify-sign": "^4.2.3", "create-ecdh": "^4.0.4", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "diffie-hellman": "^5.0.3", "hash-base": "~3.0.4", "inherits": "^2.0.4", "pbkdf2": "^3.1.2", "public-encrypt": "^4.0.3", "randombytes": "^2.1.0", "randomfill": "^1.0.4" } }, "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ=="], - - "css-box-model": ["css-box-model@1.2.1", "", { "dependencies": { "tiny-invariant": "^1.0.6" } }, "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw=="], - - "css-declaration-sorter": ["css-declaration-sorter@6.4.1", "", { "peerDependencies": { "postcss": "^8.0.9" } }, "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g=="], - - "css-in-js-utils": ["css-in-js-utils@3.1.0", "", { "dependencies": { "hyphenate-style-name": "^1.0.3" } }, "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A=="], - - "css-loader": ["css-loader@6.11.0", "", { "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", "postcss-modules-extract-imports": "^3.1.0", "postcss-modules-local-by-default": "^4.0.5", "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g=="], - - "css-select": ["css-select@4.3.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } }, "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ=="], - - "css-tree": ["css-tree@1.1.3", "", { "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="], - - "css-vendor": ["css-vendor@2.0.8", "", { "dependencies": { "@babel/runtime": "^7.8.3", "is-in-browser": "^1.0.2" } }, "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ=="], - - "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], - - "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - - "cssnano": ["cssnano@5.1.15", "", { "dependencies": { "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw=="], - - "cssnano-preset-default": ["cssnano-preset-default@5.2.14", "", { "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.1", "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", "postcss-merge-longhand": "^5.1.7", "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", "postcss-normalize-positions": "^5.1.1", "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A=="], - - "cssnano-utils": ["cssnano-utils@3.1.0", "", { "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA=="], - - "csso": ["csso@4.2.0", "", { "dependencies": { "css-tree": "^1.1.2" } }, "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA=="], - - "cssom": ["cssom@0.5.0", "", {}, "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="], - - "cssstyle": ["cssstyle@2.3.0", "", { "dependencies": { "cssom": "~0.3.6" } }, "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A=="], - - "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - - "ctrlc-windows": ["ctrlc-windows@2.2.0", "", {}, "sha512-t9y568r+T8FUuBaqKK60YGFJdj3b3ktdJW9WXIT3CuBdQhAOYdSZu75jFUN0Ay4Yz5HHicVQqAYCwcnqhOn23g=="], - - "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], - - "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="], - - "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="], - - "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], - - "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], - - "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], - - "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="], - - "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], - - "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], - - "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="], - - "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="], - - "dagre": ["dagre@0.8.5", "", { "dependencies": { "graphlib": "^2.1.8", "lodash": "^4.17.15" } }, "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw=="], - - "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], - - "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="], - - "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], - - "data-urls": ["data-urls@3.0.2", "", { "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0" } }, "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ=="], - - "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], - - "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], - - "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], - - "dataloader": ["dataloader@2.2.3", "", {}, "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA=="], - - "date-fns": ["date-fns@2.30.0", "", { "dependencies": { "@babel/runtime": "^7.21.0" } }, "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw=="], - - "date-format": ["date-format@4.0.14", "", {}, "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="], - - "debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], - - "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - - "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], - - "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], - - "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], - - "dedent": ["dedent@1.7.1", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg=="], - - "deep-equal": ["deep-equal@2.2.3", "", { "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.5", "es-get-iterator": "^1.1.3", "get-intrinsic": "^1.2.2", "is-arguments": "^1.1.1", "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "isarray": "^2.0.5", "object-is": "^1.1.5", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", "which-typed-array": "^1.1.13" } }, "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA=="], - - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], - - "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], - - "default-browser": ["default-browser@5.4.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg=="], - - "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], - - "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], - - "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], - - "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], - - "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], - - "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], - - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], - - "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], - - "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], - - "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], - - "deprecation": ["deprecation@2.3.1", "", {}, "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="], - - "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], - - "des.js": ["des.js@1.1.0", "", { "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg=="], - - "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], - - "destroyable-server": ["destroyable-server@1.1.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-7tjgU/99QVuYSqkMXr6XdQSvXj+8TjC9NiRVWNSyGytxklZ88m+qcSvWTJ3VysE3I9wurph7dTciLEEj8aUlaQ=="], - - "detect-newline": ["detect-newline@3.1.0", "", {}, "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="], - - "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], - - "detect-port-alt": ["detect-port-alt@1.1.6", "", { "dependencies": { "address": "^1.0.1", "debug": "^2.6.0" }, "bin": { "detect": "./bin/detect-port", "detect-port": "./bin/detect-port" } }, "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q=="], - - "diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="], - - "diff-sequences": ["diff-sequences@29.6.3", "", {}, "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q=="], - - "diff3": ["diff3@0.0.3", "", {}, "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g=="], - - "diffie-hellman": ["diffie-hellman@5.0.3", "", { "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" } }, "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg=="], - - "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], - - "dns-packet": ["dns-packet@5.6.1", "", { "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" } }, "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw=="], - - "docker-modem": ["docker-modem@5.0.6", "", { "dependencies": { "debug": "^4.1.1", "readable-stream": "^3.5.0", "split-ca": "^1.0.1", "ssh2": "^1.15.0" } }, "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ=="], - - "dockerode": ["dockerode@4.0.9", "", { "dependencies": { "@balena/dockerignore": "^1.0.2", "@grpc/grpc-js": "^1.11.1", "@grpc/proto-loader": "^0.7.13", "docker-modem": "^5.0.6", "protobufjs": "^7.3.2", "tar-fs": "^2.1.4", "uuid": "^10.0.0" } }, "sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q=="], - - "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], - - "dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], - - "dom-converter": ["dom-converter@0.2.0", "", { "dependencies": { "utila": "~0.4" } }, "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA=="], - - "dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="], - - "dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], - - "domain-browser": ["domain-browser@1.2.0", "", {}, "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="], - - "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], - - "domexception": ["domexception@4.0.0", "", { "dependencies": { "webidl-conversions": "^7.0.0" } }, "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw=="], - - "domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], - - "domutils": ["domutils@2.8.0", "", { "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="], - - "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], - - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - - "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], - - "duplexify": ["duplexify@4.1.3", "", { "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", "readable-stream": "^3.1.1", "stream-shift": "^1.0.2" } }, "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA=="], - - "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], - - "ecc-jsbn": ["ecc-jsbn@0.1.2", "", { "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw=="], - - "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], - - "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - - "electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="], - - "elliptic": ["elliptic@6.6.1", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], - - "emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], - - "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - - "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="], - - "enabled": ["enabled@2.0.0", "", {}, "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="], - - "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], - - "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], - - "enhanced-resolve": ["enhanced-resolve@5.18.4", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q=="], - - "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - - "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], - - "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], - - "es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="], - - "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], - - "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - - "es-get-iterator": ["es-get-iterator@1.1.3", "", { "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "is-arguments": "^1.1.1", "is-map": "^2.0.2", "is-set": "^2.0.2", "is-string": "^1.0.7", "isarray": "^2.0.5", "stop-iteration-iterator": "^1.0.0" } }, "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw=="], - - "es-iterator-helpers": ["es-iterator-helpers@1.2.2", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" } }, "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w=="], - - "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], - - "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], - - "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], - - "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], - - "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], - - "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], - - "esbuild": ["esbuild@0.23.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.23.1", "@esbuild/android-arm": "0.23.1", "@esbuild/android-arm64": "0.23.1", "@esbuild/android-x64": "0.23.1", "@esbuild/darwin-arm64": "0.23.1", "@esbuild/darwin-x64": "0.23.1", "@esbuild/freebsd-arm64": "0.23.1", "@esbuild/freebsd-x64": "0.23.1", "@esbuild/linux-arm": "0.23.1", "@esbuild/linux-arm64": "0.23.1", "@esbuild/linux-ia32": "0.23.1", "@esbuild/linux-loong64": "0.23.1", "@esbuild/linux-mips64el": "0.23.1", "@esbuild/linux-ppc64": "0.23.1", "@esbuild/linux-riscv64": "0.23.1", "@esbuild/linux-s390x": "0.23.1", "@esbuild/linux-x64": "0.23.1", "@esbuild/netbsd-x64": "0.23.1", "@esbuild/openbsd-arm64": "0.23.1", "@esbuild/openbsd-x64": "0.23.1", "@esbuild/sunos-x64": "0.23.1", "@esbuild/win32-arm64": "0.23.1", "@esbuild/win32-ia32": "0.23.1", "@esbuild/win32-x64": "0.23.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg=="], - - "esbuild-loader": ["esbuild-loader@4.4.1", "", { "dependencies": { "esbuild": "^0.27.1", "get-tsconfig": "^4.10.1", "loader-utils": "^2.0.4", "webpack-sources": "^1.4.3" }, "peerDependencies": { "webpack": "^4.40.0 || ^5.0.0" } }, "sha512-aXMJpkrSKy/x4fvpB0uA7svGOBQFAkWvWdOtKuyWOXtUwruG3Rfr6jqjI/UKf4QDvcHjKQI6pnpKiOejpfE1jg=="], - - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - - "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], - - "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - - "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], - - "eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], - - "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], - - "eslint-formatter-friendly": ["eslint-formatter-friendly@7.0.0", "", { "dependencies": { "@babel/code-frame": "7.0.0", "chalk": "2.4.2", "extend": "3.0.2", "strip-ansi": "5.2.0", "text-table": "0.2.0" } }, "sha512-WXg2D5kMHcRxIZA3ulxdevi8/BGTXu72pfOO5vXHqcAfClfIWDSlOljROjCSOCcKvilgmHz1jDWbvFCZHjMQ5w=="], - - "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], - - "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], - - "eslint-plugin-deprecation": ["eslint-plugin-deprecation@2.0.0", "", { "dependencies": { "@typescript-eslint/utils": "^6.0.0", "tslib": "^2.3.1", "tsutils": "^3.21.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0", "typescript": "^4.2.4 || ^5.0.0" } }, "sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ=="], - - "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], - - "eslint-plugin-jest": ["eslint-plugin-jest@28.14.0", "", { "dependencies": { "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", "jest": "*" }, "optionalPeers": ["@typescript-eslint/eslint-plugin", "jest"] }, "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ=="], - - "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="], - - "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], - - "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@4.6.2", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ=="], - - "eslint-plugin-unused-imports": ["eslint-plugin-unused-imports@3.2.0", "", { "dependencies": { "eslint-rule-composer": "^0.3.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "6 - 7", "eslint": "8" }, "optionalPeers": ["@typescript-eslint/eslint-plugin"] }, "sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ=="], - - "eslint-rule-composer": ["eslint-rule-composer@0.3.0", "", {}, "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg=="], - - "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], - - "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "eslint-webpack-plugin": ["eslint-webpack-plugin@4.2.0", "", { "dependencies": { "@types/eslint": "^8.56.10", "jest-worker": "^29.7.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "schema-utils": "^4.2.0" }, "peerDependencies": { "eslint": "^8.0.0 || ^9.0.0", "webpack": "^5.0.0" } }, "sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA=="], - - "esm": ["esm@3.2.25", "", {}, "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="], - - "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], - - "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], - - "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], - - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], - - "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - - "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - - "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], - - "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], - - "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], - - "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], - - "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], - - "evp_bytestokey": ["evp_bytestokey@1.0.3", "", { "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="], - - "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], - - "exit": ["exit@0.1.2", "", {}, "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ=="], - - "expand-tilde": ["expand-tilde@2.0.2", "", { "dependencies": { "homedir-polyfill": "^1.0.1" } }, "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw=="], - - "expect": ["expect@29.7.0", "", { "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw=="], - - "express": ["express@4.22.1", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.3", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g=="], - - "express-openapi-validator": ["express-openapi-validator@5.6.0", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "^14.0.3", "@types/multer": "^1.4.13", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "json-schema-traverse": "^1.0.0", "lodash.clonedeep": "^4.5.0", "lodash.get": "^4.4.2", "media-typer": "^1.1.0", "multer": "^2.0.2", "ono": "^7.1.3", "path-to-regexp": "^8.2.0", "qs": "^6.14.0" }, "peerDependencies": { "express": "*" } }, "sha512-gNaMgDb1cAT8QKcuh9WrED9p3mqi/V7yocNrvnE1fOz7e8p8JkbYaTUcOB4VsZKerz/X+Sey7ptTGF5FwsXh8Q=="], - - "express-promise-router": ["express-promise-router@4.1.1", "", { "dependencies": { "is-promise": "^4.0.0", "lodash.flattendeep": "^4.0.0", "methods": "^1.0.0" }, "peerDependencies": { "@types/express": "^4.0.0", "express": "^4.0.0" }, "optionalPeers": ["@types/express"] }, "sha512-Lkvcy/ZGrBhzkl3y7uYBHLMtLI4D6XQ2kiFg9dq7fbktBch5gjqJ0+KovX0cvCAvTJw92raWunRLM/OM+5l4fA=="], - - "express-session": ["express-session@1.18.2", "", { "dependencies": { "cookie": "0.7.2", "cookie-signature": "1.0.7", "debug": "2.6.9", "depd": "~2.0.0", "on-headers": "~1.1.0", "parseurl": "~1.3.3", "safe-buffer": "5.2.1", "uid-safe": "~2.1.5" } }, "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A=="], - - "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], - - "extsprintf": ["extsprintf@1.3.0", "", {}, "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="], - - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - - "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], - - "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], - - "fast-json-patch": ["fast-json-patch@3.1.1", "", {}, "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ=="], - - "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], - - "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - - "fast-shallow-equal": ["fast-shallow-equal@1.0.0", "", {}, "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw=="], - - "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], - - "fast-xml-parser": ["fast-xml-parser@4.5.3", "", { "dependencies": { "strnum": "^1.1.1" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig=="], - - "fastest-stable-stringify": ["fastest-stable-stringify@2.0.2", "", {}, "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q=="], - - "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], - - "fault": ["fault@1.0.4", "", { "dependencies": { "format": "^0.2.0" } }, "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA=="], - - "faye-websocket": ["faye-websocket@0.11.4", "", { "dependencies": { "websocket-driver": ">=0.5.1" } }, "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="], - - "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], - - "fd-package-json": ["fd-package-json@2.0.0", "", { "dependencies": { "walk-up-path": "^4.0.0" } }, "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ=="], - - "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - - "fecha": ["fecha@4.2.3", "", {}, "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="], - - "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], - - "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], - - "filesize": ["filesize@8.0.7", "", {}, "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ=="], - - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - - "finalhandler": ["finalhandler@1.3.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "statuses": "~2.0.2", "unpipe": "~1.0.0" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="], - - "find-file-up": ["find-file-up@2.0.1", "", { "dependencies": { "resolve-dir": "^1.0.1" } }, "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ=="], - - "find-pkg": ["find-pkg@2.0.0", "", { "dependencies": { "find-file-up": "^2.0.1" } }, "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ=="], - - "find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="], - - "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], - - "flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], - - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - - "fn.name": ["fn.name@1.1.0", "", {}, "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="], - - "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], - - "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - - "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], - - "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="], - - "fork-ts-checker-webpack-plugin": ["fork-ts-checker-webpack-plugin@9.1.0", "", { "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", "chokidar": "^4.0.1", "cosmiconfig": "^8.2.0", "deepmerge": "^4.2.2", "fs-extra": "^10.0.0", "memfs": "^3.4.1", "minimatch": "^3.0.4", "node-abort-controller": "^3.0.1", "schema-utils": "^3.1.1", "semver": "^7.3.5", "tapable": "^2.2.1" }, "peerDependencies": { "typescript": ">3.6.0", "webpack": "^5.11.0" } }, "sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q=="], - - "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], - - "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], - - "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="], - - "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], - - "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], - - "fromentries": ["fromentries@1.3.2", "", {}, "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg=="], - - "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], - - "fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], - - "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], - - "fs-monkey": ["fs-monkey@1.1.0", "", {}, "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw=="], - - "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], - - "fscreen": ["fscreen@1.2.0", "", {}, "sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg=="], - - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - - "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], - - "functional-red-black-tree": ["functional-red-black-tree@1.0.1", "", {}, "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g=="], - - "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], - - "gaxios": ["gaxios@6.7.1", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", "node-fetch": "^2.6.9", "uuid": "^9.0.1" } }, "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ=="], - - "gcp-metadata": ["gcp-metadata@6.1.1", "", { "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" } }, "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A=="], - - "generate-function": ["generate-function@2.3.1", "", { "dependencies": { "is-property": "^1.0.2" } }, "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ=="], - - "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], - - "generic-names": ["generic-names@4.0.0", "", { "dependencies": { "loader-utils": "^3.2.0" } }, "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A=="], - - "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], - - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - - "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], - - "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], - - "get-port": ["get-port@5.1.1", "", {}, "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ=="], - - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - - "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], - - "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - - "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], - - "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], - - "getopts": ["getopts@2.3.0", "", {}, "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="], - - "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="], - - "git-up": ["git-up@7.0.0", "", { "dependencies": { "is-ssh": "^1.4.0", "parse-url": "^8.1.0" } }, "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ=="], - - "git-url-parse": ["git-url-parse@14.1.0", "", { "dependencies": { "git-up": "^7.0.0" } }, "sha512-8xg65dTxGHST3+zGpycMMFZcoTzAdZ2dOtu4vmgIfkTFnVHBxHMzBC2L1k8To7EmrSiHesT8JgPLT91VKw1B5g=="], - - "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], - - "glob-to-regex.js": ["glob-to-regex.js@1.2.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ=="], - - "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], - - "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], - - "global-modules": ["global-modules@2.0.0", "", { "dependencies": { "global-prefix": "^3.0.0" } }, "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A=="], - - "global-prefix": ["global-prefix@3.0.0", "", { "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" } }, "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg=="], - - "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], - - "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], - - "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], - - "google-auth-library": ["google-auth-library@9.15.1", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^6.1.1", "gcp-metadata": "^6.1.0", "gtoken": "^7.0.0", "jws": "^4.0.0" } }, "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng=="], - - "google-gax": ["google-gax@4.6.1", "", { "dependencies": { "@grpc/grpc-js": "^1.10.9", "@grpc/proto-loader": "^0.7.13", "@types/long": "^4.0.0", "abort-controller": "^3.0.0", "duplexify": "^4.0.0", "google-auth-library": "^9.3.0", "node-fetch": "^2.7.0", "object-hash": "^3.0.0", "proto3-json-serializer": "^2.0.2", "protobufjs": "^7.3.2", "retry-request": "^7.0.0", "uuid": "^9.0.1" } }, "sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ=="], - - "google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], - - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], - - "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - - "graphlib": ["graphlib@2.1.8", "", { "dependencies": { "lodash": "^4.17.15" } }, "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A=="], - - "graphql": ["graphql@16.12.0", "", {}, "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ=="], - - "graphql-http": ["graphql-http@1.22.4", "", { "peerDependencies": { "graphql": ">=0.11 <=16" } }, "sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA=="], - - "graphql-subscriptions": ["graphql-subscriptions@1.2.1", "", { "dependencies": { "iterall": "^1.3.0" }, "peerDependencies": { "graphql": "^0.10.5 || ^0.11.3 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" } }, "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g=="], - - "graphql-tag": ["graphql-tag@2.12.6", "", { "dependencies": { "tslib": "^2.1.0" }, "peerDependencies": { "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg=="], - - "gtoken": ["gtoken@7.1.0", "", { "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" } }, "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw=="], - - "gzip-size": ["gzip-size@6.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q=="], - - "handle-thing": ["handle-thing@2.0.1", "", {}, "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="], - - "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], - - "happy-dom": ["happy-dom@13.10.1", "", { "dependencies": { "entities": "^4.5.0", "webidl-conversions": "^7.0.0", "whatwg-mimetype": "^3.0.0" } }, "sha512-9GZLEFvQL5EgfJX2zcBgu1nsPUn98JF/EiJnSfQbdxI6YEQGqpd09lXXxOmYonRBIEFz9JlGCOiPflDzgS1p8w=="], - - "har-schema": ["har-schema@2.0.0", "", {}, "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="], - - "har-validator": ["har-validator@5.1.5", "", { "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="], - - "harmony-reflect": ["harmony-reflect@1.6.2", "", {}, "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g=="], - - "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], - - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], - - "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], - - "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], - - "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - - "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - - "hash-base": ["hash-base@3.0.5", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1" } }, "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg=="], - - "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="], - - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], - - "hast-util-parse-selector": ["hast-util-parse-selector@2.2.5", "", {}, "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="], - - "hast-util-whitespace": ["hast-util-whitespace@2.0.1", "", {}, "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng=="], - - "hastscript": ["hastscript@6.0.0", "", { "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" } }, "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w=="], - - "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], - - "headers-polyfill": ["headers-polyfill@4.0.3", "", {}, "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ=="], - - "helmet": ["helmet@6.2.0", "", {}, "sha512-DWlwuXLLqbrIOltR6tFQXShj/+7Cyp0gLi6uAb8qMdFh/YBBFbKSgQ6nbXmScYd8emMctuthmgIa7tUfo9Rtyg=="], - - "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], - - "highlightjs-vue": ["highlightjs-vue@1.0.0", "", {}, "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA=="], - - "history": ["history@5.3.0", "", { "dependencies": { "@babel/runtime": "^7.7.6" } }, "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ=="], - - "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="], - - "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], - - "homedir-polyfill": ["homedir-polyfill@1.0.3", "", { "dependencies": { "parse-passwd": "^1.0.0" } }, "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA=="], - - "hono": ["hono@4.11.2", "", {}, "sha512-o+avdUAD1v94oHkjGBhiMhBV4WBHxhbu0+CUVH78hhphKy/OKQLxtKjkmmNcrMlbYAhAbsM/9F+l3KnYxyD3Lg=="], - - "hoopy": ["hoopy@0.1.4", "", {}, "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ=="], - - "hpack.js": ["hpack.js@2.1.6", "", { "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" } }, "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ=="], - - "html-encoding-sniffer": ["html-encoding-sniffer@3.0.0", "", { "dependencies": { "whatwg-encoding": "^2.0.0" } }, "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA=="], - - "html-entities": ["html-entities@2.6.0", "", {}, "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ=="], - - "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], - - "html-minifier-terser": ["html-minifier-terser@6.1.0", "", { "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", "commander": "^8.3.0", "he": "^1.2.0", "param-case": "^3.0.4", "relateurl": "^0.2.7", "terser": "^5.10.0" }, "bin": { "html-minifier-terser": "cli.js" } }, "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw=="], - - "html-webpack-plugin": ["html-webpack-plugin@5.6.5", "", { "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", "lodash": "^4.17.21", "pretty-error": "^4.0.0", "tapable": "^2.0.0" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g=="], - - "htmlparser2": ["htmlparser2@6.1.0", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", "domutils": "^2.5.2", "entities": "^2.0.0" } }, "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A=="], - - "http-assert": ["http-assert@1.5.0", "", { "dependencies": { "deep-equal": "~1.0.1", "http-errors": "~1.8.0" } }, "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w=="], - - "http-deceiver": ["http-deceiver@1.2.7", "", {}, "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw=="], - - "http-encoding": ["http-encoding@2.1.1", "", { "dependencies": { "brotli-wasm": "^3.0.0", "pify": "^5.0.0", "zstd-codec": "^0.1.5" } }, "sha512-3QaTIBHWLcmq63sSKHVGiUExX+XnOQx1szJJH6wJgyWyXDpSdmKiaBXN/5xF74eToh0VujfJGFBF3tunaK2ZQA=="], - - "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], - - "http-parser-js": ["http-parser-js@0.5.10", "", {}, "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA=="], - - "http-proxy": ["http-proxy@1.18.1", "", { "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="], - - "http-proxy-agent": ["http-proxy-agent@5.0.0", "", { "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w=="], - - "http-proxy-middleware": ["http-proxy-middleware@2.0.9", "", { "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" }, "peerDependencies": { "@types/express": "^4.17.13" }, "optionalPeers": ["@types/express"] }, "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q=="], - - "http-signature": ["http-signature@1.2.0", "", { "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="], - - "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="], - - "https-browserify": ["https-browserify@1.0.0", "", {}, "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg=="], - - "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], - - "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], - - "hyperdyperid": ["hyperdyperid@1.2.0", "", {}, "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A=="], - - "hyphenate-style-name": ["hyphenate-style-name@1.1.0", "", {}, "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw=="], - - "i18next": ["i18next@22.5.1", "", { "dependencies": { "@babel/runtime": "^7.20.6" } }, "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA=="], - - "iconv-lite": ["iconv-lite@0.7.1", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw=="], - - "icss-replace-symbols": ["icss-replace-symbols@1.1.0", "", {}, "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg=="], - - "icss-utils": ["icss-utils@5.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="], - - "identity-obj-proxy": ["identity-obj-proxy@3.0.0", "", { "dependencies": { "harmony-reflect": "^1.4.6" } }, "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA=="], - - "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], - - "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - - "ignore-walk": ["ignore-walk@5.0.1", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw=="], - - "immer": ["immer@9.0.21", "", {}, "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="], - - "import-cwd": ["import-cwd@3.0.0", "", { "dependencies": { "import-from": "^3.0.0" } }, "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg=="], - - "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - - "import-from": ["import-from@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ=="], - - "import-local": ["import-local@3.2.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="], - - "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], - - "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], - - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - - "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], - - "inline-style-parser": ["inline-style-parser@0.1.1", "", {}, "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="], - - "inline-style-prefixer": ["inline-style-prefixer@7.0.1", "", { "dependencies": { "css-in-js-utils": "^3.1.0" } }, "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw=="], - - "inquirer": ["inquirer@8.2.7", "", { "dependencies": { "@inquirer/external-editor": "^1.0.0", "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6", "wrap-ansi": "^6.0.1" } }, "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA=="], - - "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], - - "interpret": ["interpret@2.2.0", "", {}, "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="], - - "intl-messageformat": ["intl-messageformat@10.7.18", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/fast-memoize": "2.2.7", "@formatjs/icu-messageformat-parser": "2.11.4", "tslib": "^2.8.0" } }, "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g=="], - - "ioredis": ["ioredis@5.8.2", "", { "dependencies": { "@ioredis/commands": "1.4.0", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q=="], - - "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], - - "ipaddr.js": ["ipaddr.js@2.3.0", "", {}, "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg=="], - - "is-alphabetical": ["is-alphabetical@1.0.4", "", {}, "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="], - - "is-alphanumerical": ["is-alphanumerical@1.0.4", "", { "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" } }, "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A=="], - - "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], - - "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], - - "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], - - "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], - - "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], - - "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], - - "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], - - "is-buffer": ["is-buffer@2.0.5", "", {}, "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="], - - "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], - - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], - - "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], - - "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], - - "is-decimal": ["is-decimal@1.0.4", "", {}, "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="], - - "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], - - "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], - - "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], - - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - - "is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="], - - "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], - - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - - "is-hexadecimal": ["is-hexadecimal@1.0.4", "", {}, "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="], - - "is-in-browser": ["is-in-browser@1.1.3", "", {}, "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g=="], - - "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], - - "is-interactive": ["is-interactive@1.0.0", "", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="], - - "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], - - "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], - - "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], - - "is-network-error": ["is-network-error@1.3.0", "", {}, "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw=="], - - "is-node-process": ["is-node-process@1.2.0", "", {}, "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw=="], - - "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - - "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], - - "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], - - "is-plain-obj": ["is-plain-obj@3.0.0", "", {}, "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA=="], - - "is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], - - "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], - - "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], - - "is-property": ["is-property@1.0.2", "", {}, "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="], - - "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], - - "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], - - "is-root": ["is-root@2.1.0", "", {}, "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg=="], - - "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], - - "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], - - "is-ssh": ["is-ssh@1.4.1", "", { "dependencies": { "protocols": "^2.0.1" } }, "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg=="], - - "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], - - "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], - - "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], - - "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], - - "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="], - - "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], - - "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], - - "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], - - "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], - - "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], - - "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - - "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "isomorphic-git": ["isomorphic-git@1.36.1", "", { "dependencies": { "async-lock": "^1.4.1", "clean-git-ref": "^2.0.1", "crc-32": "^1.2.0", "diff3": "0.0.3", "ignore": "^5.1.4", "minimisted": "^2.0.0", "pako": "^1.0.10", "pify": "^4.0.1", "readable-stream": "^4.0.0", "sha.js": "^2.4.12", "simple-get": "^4.0.1" }, "bin": { "isogit": "cli.cjs" } }, "sha512-fC8SRT8MwoaXDK8G4z5biPEbqf2WyEJUb2MJ2ftSd39/UIlsnoZxLGux+lae0poLZO4AEcx6aUVOh5bV+P8zFA=="], - - "isomorphic-rslog": ["isomorphic-rslog@0.0.5", "", {}, "sha512-pkU3vvajRJ0LKLaMFy8Cj7ElbFUdkQKVhUk+DQsVCYsLW4uulU65C2s3l+Sm5OtiOwprzkYYcAIJa/COwCYHWA=="], - - "isomorphic-ws": ["isomorphic-ws@5.0.0", "", { "peerDependencies": { "ws": "*" } }, "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw=="], - - "isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="], - - "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], - - "istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], - - "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="], - - "istanbul-lib-source-maps": ["istanbul-lib-source-maps@4.0.1", "", { "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" } }, "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw=="], - - "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="], - - "iterall": ["iterall@1.3.0", "", {}, "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg=="], - - "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], - - "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - - "jest": ["jest@29.7.0", "", { "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw=="], - - "jest-changed-files": ["jest-changed-files@29.7.0", "", { "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" } }, "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w=="], - - "jest-circus": ["jest-circus@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.7.0", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0", "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw=="], - - "jest-cli": ["jest-cli@29.7.0", "", { "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "create-jest": "^29.7.0", "exit": "^0.1.2", "import-local": "^3.0.2", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg=="], - - "jest-config": ["jest-config@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-circus": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-runner": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "@types/node": "*", "ts-node": ">=9.0.0" }, "optionalPeers": ["@types/node", "ts-node"] }, "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ=="], - - "jest-css-modules": ["jest-css-modules@2.1.0", "", { "dependencies": { "identity-obj-proxy": "3.0.0" } }, "sha512-my3Scnt6l2tOll/eGwNZeh1KLAFkNzdl4MyZRdpl46GO6/93JcKKdTjNqK6Nokg8A8rT84MFLOpY1pzqKBEqMw=="], - - "jest-diff": ["jest-diff@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw=="], - - "jest-docblock": ["jest-docblock@29.7.0", "", { "dependencies": { "detect-newline": "^3.0.0" } }, "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g=="], - - "jest-each": ["jest-each@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" } }, "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ=="], - - "jest-environment-jsdom": ["jest-environment-jsdom@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0", "jsdom": "^20.0.0" }, "peerDependencies": { "canvas": "^2.5.0" }, "optionalPeers": ["canvas"] }, "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA=="], - - "jest-environment-node": ["jest-environment-node@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw=="], - - "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="], - - "jest-haste-map": ["jest-haste-map@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA=="], - - "jest-leak-detector": ["jest-leak-detector@29.7.0", "", { "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw=="], - - "jest-matcher-utils": ["jest-matcher-utils@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g=="], - - "jest-message-util": ["jest-message-util@29.7.0", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w=="], - - "jest-mock": ["jest-mock@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" } }, "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw=="], - - "jest-pnp-resolver": ["jest-pnp-resolver@1.2.3", "", { "peerDependencies": { "jest-resolve": "*" }, "optionalPeers": ["jest-resolve"] }, "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w=="], - - "jest-regex-util": ["jest-regex-util@29.6.3", "", {}, "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg=="], - - "jest-resolve": ["jest-resolve@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA=="], - - "jest-resolve-dependencies": ["jest-resolve-dependencies@29.7.0", "", { "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" } }, "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA=="], - - "jest-runner": ["jest-runner@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-leak-detector": "^29.7.0", "jest-message-util": "^29.7.0", "jest-resolve": "^29.7.0", "jest-runtime": "^29.7.0", "jest-util": "^29.7.0", "jest-watcher": "^29.7.0", "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ=="], - - "jest-runtime": ["jest-runtime@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ=="], - - "jest-snapshot": ["jest-snapshot@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.7.0", "graceful-fs": "^4.2.9", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" } }, "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw=="], - - "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], - - "jest-validate": ["jest-validate@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="], - - "jest-watcher": ["jest-watcher@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" } }, "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g=="], - - "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], - - "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], - - "jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="], - - "js-base64": ["js-base64@3.7.8", "", {}, "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow=="], - - "js-cookie": ["js-cookie@2.2.1", "", {}, "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="], - - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - - "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], - - "jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="], - - "jsdom": ["jsdom@20.0.3", "", { "dependencies": { "abab": "^2.0.6", "acorn": "^8.8.1", "acorn-globals": "^7.0.0", "cssom": "^0.5.0", "cssstyle": "^2.3.0", "data-urls": "^3.0.2", "decimal.js": "^10.4.2", "domexception": "^4.0.0", "escodegen": "^2.0.0", "form-data": "^4.0.0", "html-encoding-sniffer": "^3.0.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.1", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.2", "parse5": "^7.1.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^4.1.2", "w3c-xmlserializer": "^4.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^2.0.0", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0", "ws": "^8.11.0", "xml-name-validator": "^4.0.0" }, "peerDependencies": { "canvas": "^2.5.0" }, "optionalPeers": ["canvas"] }, "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ=="], - - "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], - - "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], - - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - - "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], - - "json-schema-compare": ["json-schema-compare@0.2.2", "", { "dependencies": { "lodash": "^4.17.4" } }, "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ=="], - - "json-schema-merge-allof": ["json-schema-merge-allof@0.8.1", "", { "dependencies": { "compute-lcm": "^1.1.2", "json-schema-compare": "^0.2.2", "lodash": "^4.17.20" } }, "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w=="], - - "json-schema-to-ts": ["json-schema-to-ts@3.1.1", "", { "dependencies": { "@babel/runtime": "^7.18.3", "ts-algebra": "^2.0.0" } }, "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g=="], - - "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], - - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], - - "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], - - "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], - - "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], - - "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], - - "jsonpath": ["jsonpath@1.1.1", "", { "dependencies": { "esprima": "1.2.2", "static-eval": "2.0.2", "underscore": "1.12.1" } }, "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w=="], - - "jsonpath-plus": ["jsonpath-plus@7.2.0", "", {}, "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA=="], - - "jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="], - - "jsonwebtoken": ["jsonwebtoken@9.0.3", "", { "dependencies": { "jws": "^4.0.1", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g=="], - - "jsprim": ["jsprim@1.4.2", "", { "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" } }, "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw=="], - - "jss": ["jss@10.10.0", "", { "dependencies": { "@babel/runtime": "^7.3.1", "csstype": "^3.0.2", "is-in-browser": "^1.1.3", "tiny-warning": "^1.0.2" } }, "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw=="], - - "jss-plugin-camel-case": ["jss-plugin-camel-case@10.10.0", "", { "dependencies": { "@babel/runtime": "^7.3.1", "hyphenate-style-name": "^1.0.3", "jss": "10.10.0" } }, "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw=="], - - "jss-plugin-default-unit": ["jss-plugin-default-unit@10.10.0", "", { "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" } }, "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ=="], - - "jss-plugin-global": ["jss-plugin-global@10.10.0", "", { "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" } }, "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A=="], - - "jss-plugin-nested": ["jss-plugin-nested@10.10.0", "", { "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", "tiny-warning": "^1.0.2" } }, "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA=="], - - "jss-plugin-props-sort": ["jss-plugin-props-sort@10.10.0", "", { "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0" } }, "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg=="], - - "jss-plugin-rule-value-function": ["jss-plugin-rule-value-function@10.10.0", "", { "dependencies": { "@babel/runtime": "^7.3.1", "jss": "10.10.0", "tiny-warning": "^1.0.2" } }, "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g=="], - - "jss-plugin-vendor-prefixer": ["jss-plugin-vendor-prefixer@10.10.0", "", { "dependencies": { "@babel/runtime": "^7.3.1", "css-vendor": "^2.0.8", "jss": "10.10.0" } }, "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg=="], - - "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], - - "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], - - "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="], - - "keygrip": ["keygrip@1.1.0", "", { "dependencies": { "tsscmp": "1.0.6" } }, "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ=="], - - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], - - "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], - - "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], - - "knex": ["knex@3.1.0", "", { "dependencies": { "colorette": "2.0.19", "commander": "^10.0.0", "debug": "4.3.4", "escalade": "^3.1.1", "esm": "^3.2.25", "get-package-type": "^0.1.0", "getopts": "2.3.0", "interpret": "^2.2.0", "lodash": "^4.17.21", "pg-connection-string": "2.6.2", "rechoir": "^0.8.0", "resolve-from": "^5.0.0", "tarn": "^3.0.2", "tildify": "2.0.0" }, "bin": { "knex": "bin/cli.js" } }, "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw=="], - - "knip": ["knip@5.77.1", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", "js-yaml": "^4.1.1", "minimist": "^1.2.8", "oxc-resolver": "^11.15.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "zod": "^4.1.11" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4 <7" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-+yA/vfQUDEFUOcR0XRn/dOZmNEsS10pIMztS5JbKUhk9zvQiAFvr3Mcc3zC7Dn9gBG8LeImhaXA6/D3uhzwZvg=="], - - "koa": ["koa@2.15.3", "", { "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", "content-disposition": "~0.5.2", "content-type": "^1.0.4", "cookies": "~0.9.0", "debug": "^4.3.2", "delegates": "^1.0.0", "depd": "^2.0.0", "destroy": "^1.0.4", "encodeurl": "^1.0.2", "escape-html": "^1.0.3", "fresh": "~0.5.2", "http-assert": "^1.3.0", "http-errors": "^1.6.3", "is-generator-function": "^1.0.7", "koa-compose": "^4.1.0", "koa-convert": "^2.0.0", "on-finished": "^2.3.0", "only": "~0.0.2", "parseurl": "^1.3.2", "statuses": "^1.5.0", "type-is": "^1.6.16", "vary": "^1.1.2" } }, "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg=="], - - "koa-compose": ["koa-compose@4.1.0", "", {}, "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw=="], - - "koa-convert": ["koa-convert@2.0.0", "", { "dependencies": { "co": "^4.6.0", "koa-compose": "^4.1.0" } }, "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA=="], - - "kuler": ["kuler@2.0.0", "", {}, "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="], - - "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], - - "language-tags": ["language-tags@1.0.9", "", { "dependencies": { "language-subtag-registry": "^0.3.20" } }, "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="], - - "launch-editor": ["launch-editor@2.12.0", "", { "dependencies": { "picocolors": "^1.1.1", "shell-quote": "^1.8.3" } }, "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg=="], - - "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], - - "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], - - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], - - "lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], - - "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], - - "linkify-react": ["linkify-react@4.1.3", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-rhI3zM/fxn5BfRPHfi4r9N7zgac4vOIxub1wHIWXLA5ENTMs+BGaIaFO1D1PhmxgwhIKmJz3H7uCP0Dg5JwSlA=="], - - "linkifyjs": ["linkifyjs@4.1.3", "", {}, "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg=="], - - "loader-runner": ["loader-runner@4.3.1", "", {}, "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q=="], - - "loader-utils": ["loader-utils@2.0.4", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" } }, "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw=="], - - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], - - "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], - - "lodash-es": ["lodash-es@4.17.22", "", {}, "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q=="], - - "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], - - "lodash.clonedeep": ["lodash.clonedeep@4.5.0", "", {}, "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="], - - "lodash.clonedeepwith": ["lodash.clonedeepwith@4.5.0", "", {}, "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA=="], - - "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], - - "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], - - "lodash.flattendeep": ["lodash.flattendeep@4.4.0", "", {}, "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ=="], - - "lodash.get": ["lodash.get@4.4.2", "", {}, "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="], - - "lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="], - - "lodash.isarguments": ["lodash.isarguments@3.1.0", "", {}, "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="], - - "lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="], - - "lodash.isequal": ["lodash.isequal@4.5.0", "", {}, "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="], - - "lodash.isinteger": ["lodash.isinteger@4.0.4", "", {}, "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="], - - "lodash.isnumber": ["lodash.isnumber@3.0.3", "", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="], - - "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], - - "lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="], - - "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], - - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - - "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], - - "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], - - "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], - - "log4js": ["log4js@6.9.1", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "flatted": "^3.2.7", "rfdc": "^1.3.0", "streamroller": "^3.1.5" } }, "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g=="], - - "logform": ["logform@2.7.0", "", { "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ=="], - - "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], - - "long-timeout": ["long-timeout@0.1.1", "", {}, "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w=="], - - "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], - - "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], - - "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], - - "lowlight": ["lowlight@1.20.0", "", { "dependencies": { "fault": "^1.0.0", "highlight.js": "~10.7.0" } }, "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw=="], - - "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - - "lru.min": ["lru.min@1.1.3", "", {}, "sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q=="], - - "lunr": ["lunr@2.3.9", "", {}, "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="], - - "luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="], - - "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], - - "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], - - "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], - - "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], - - "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], - - "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], - - "markdown-to-jsx": ["markdown-to-jsx@7.7.17", "", { "peerDependencies": { "react": ">= 0.14.0" }, "optionalPeers": ["react"] }, "sha512-7mG/1feQ0TX5I7YyMZVDgCC/y2I3CiEhIRQIhyov9nGBP5eoVrOXXHuL5ZP8GRfxVZKRiXWJgwXkb9It+nQZfQ=="], - - "matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], - - "material-ui-popup-state": ["material-ui-popup-state@5.3.6", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@types/prop-types": "^15.7.3", "classnames": "^2.2.6", "prop-types": "^15.7.2" }, "peerDependencies": { "@mui/material": "^5.0.0 || ^6.0.0 || ^7.0.0", "@types/react": "^16.8.0 || ^17 || ^18 || ^19", "react": "^16.8.0 || ^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-tGpq417auecyK9iKMGxSQfyv6pwg0Wii2Isi9RuL92YDDkdnXlorl5c3+S4Zg8MH6Hk4NUa/5Y9PPEWgKakzOw=="], - - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - - "md5.js": ["md5.js@1.3.5", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="], - - "mdast-util-definitions": ["mdast-util-definitions@5.1.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "unist-util-visit": "^4.0.0" } }, "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA=="], - - "mdast-util-find-and-replace": ["mdast-util-find-and-replace@2.2.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.0.0" } }, "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw=="], - - "mdast-util-from-markdown": ["mdast-util-from-markdown@1.3.1", "", { "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "decode-named-character-reference": "^1.0.0", "mdast-util-to-string": "^3.1.0", "micromark": "^3.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-decode-string": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "unist-util-stringify-position": "^3.0.0", "uvu": "^0.5.0" } }, "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww=="], - - "mdast-util-gfm": ["mdast-util-gfm@2.0.2", "", { "dependencies": { "mdast-util-from-markdown": "^1.0.0", "mdast-util-gfm-autolink-literal": "^1.0.0", "mdast-util-gfm-footnote": "^1.0.0", "mdast-util-gfm-strikethrough": "^1.0.0", "mdast-util-gfm-table": "^1.0.0", "mdast-util-gfm-task-list-item": "^1.0.0", "mdast-util-to-markdown": "^1.0.0" } }, "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg=="], - - "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@1.0.3", "", { "dependencies": { "@types/mdast": "^3.0.0", "ccount": "^2.0.0", "mdast-util-find-and-replace": "^2.0.0", "micromark-util-character": "^1.0.0" } }, "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA=="], - - "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@1.0.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0", "micromark-util-normalize-identifier": "^1.0.0" } }, "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ=="], - - "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@1.0.3", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" } }, "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ=="], - - "mdast-util-gfm-table": ["mdast-util-gfm-table@1.0.7", "", { "dependencies": { "@types/mdast": "^3.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", "mdast-util-to-markdown": "^1.3.0" } }, "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg=="], - - "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@1.0.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" } }, "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ=="], - - "mdast-util-phrasing": ["mdast-util-phrasing@3.0.1", "", { "dependencies": { "@types/mdast": "^3.0.0", "unist-util-is": "^5.0.0" } }, "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg=="], - - "mdast-util-to-hast": ["mdast-util-to-hast@12.3.0", "", { "dependencies": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", "mdast-util-definitions": "^5.0.0", "micromark-util-sanitize-uri": "^1.1.0", "trim-lines": "^3.0.0", "unist-util-generated": "^2.0.0", "unist-util-position": "^4.0.0", "unist-util-visit": "^4.0.0" } }, "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw=="], - - "mdast-util-to-markdown": ["mdast-util-to-markdown@1.5.0", "", { "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^3.0.0", "mdast-util-to-string": "^3.0.0", "micromark-util-decode-string": "^1.0.0", "unist-util-visit": "^4.0.0", "zwitch": "^2.0.0" } }, "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A=="], - - "mdast-util-to-string": ["mdast-util-to-string@3.2.0", "", { "dependencies": { "@types/mdast": "^3.0.0" } }, "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg=="], - - "mdn-data": ["mdn-data@2.0.14", "", {}, "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="], - - "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], - - "memfs": ["memfs@3.6.0", "", { "dependencies": { "fs-monkey": "^1.0.4" } }, "sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ=="], - - "memjs": ["memjs@1.3.2", "", {}, "sha512-qUEg2g8vxPe+zPn09KidjIStHPtoBO8Cttm8bgJFWWabbsjQ9Av9Ky+6UcvKx6ue0LLb/LEhtcyQpRyKfzeXcg=="], - - "memoize-one": ["memoize-one@5.2.1", "", {}, "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="], - - "merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], - - "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], - - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], - - "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], - - "micromark": ["micromark@3.2.0", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "micromark-core-commonmark": "^1.0.1", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-chunked": "^1.0.0", "micromark-util-combine-extensions": "^1.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-encode": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-subtokenize": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.1", "uvu": "^0.5.0" } }, "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA=="], - - "micromark-core-commonmark": ["micromark-core-commonmark@1.1.0", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-factory-destination": "^1.0.0", "micromark-factory-label": "^1.0.0", "micromark-factory-space": "^1.0.0", "micromark-factory-title": "^1.0.0", "micromark-factory-whitespace": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", "micromark-util-html-tag-name": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-subtokenize": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.1", "uvu": "^0.5.0" } }, "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw=="], - - "micromark-extension-gfm": ["micromark-extension-gfm@2.0.3", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^1.0.0", "micromark-extension-gfm-footnote": "^1.0.0", "micromark-extension-gfm-strikethrough": "^1.0.0", "micromark-extension-gfm-table": "^1.0.0", "micromark-extension-gfm-tagfilter": "^1.0.0", "micromark-extension-gfm-task-list-item": "^1.0.0", "micromark-util-combine-extensions": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ=="], - - "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@1.0.5", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg=="], - - "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@1.1.2", "", { "dependencies": { "micromark-core-commonmark": "^1.0.0", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q=="], - - "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@1.0.7", "", { "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw=="], - - "micromark-extension-gfm-table": ["micromark-extension-gfm-table@1.0.7", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw=="], - - "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@1.0.2", "", { "dependencies": { "micromark-util-types": "^1.0.0" } }, "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g=="], - - "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@1.0.5", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ=="], - - "micromark-factory-destination": ["micromark-factory-destination@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg=="], - - "micromark-factory-label": ["micromark-factory-label@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w=="], - - "micromark-factory-space": ["micromark-factory-space@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ=="], - - "micromark-factory-title": ["micromark-factory-title@1.1.0", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ=="], - - "micromark-factory-whitespace": ["micromark-factory-whitespace@1.1.0", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ=="], - - "micromark-util-character": ["micromark-util-character@1.2.0", "", { "dependencies": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg=="], - - "micromark-util-chunked": ["micromark-util-chunked@1.1.0", "", { "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ=="], - - "micromark-util-classify-character": ["micromark-util-classify-character@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw=="], - - "micromark-util-combine-extensions": ["micromark-util-combine-extensions@1.1.0", "", { "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA=="], - - "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@1.1.0", "", { "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw=="], - - "micromark-util-decode-string": ["micromark-util-decode-string@1.1.0", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-symbol": "^1.0.0" } }, "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ=="], - - "micromark-util-encode": ["micromark-util-encode@1.1.0", "", {}, "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw=="], - - "micromark-util-html-tag-name": ["micromark-util-html-tag-name@1.2.0", "", {}, "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q=="], - - "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@1.1.0", "", { "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q=="], - - "micromark-util-resolve-all": ["micromark-util-resolve-all@1.1.0", "", { "dependencies": { "micromark-util-types": "^1.0.0" } }, "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA=="], - - "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@1.2.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-encode": "^1.0.0", "micromark-util-symbol": "^1.0.0" } }, "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A=="], - - "micromark-util-subtokenize": ["micromark-util-subtokenize@1.1.0", "", { "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A=="], - - "micromark-util-symbol": ["micromark-util-symbol@1.1.0", "", {}, "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag=="], - - "micromark-util-types": ["micromark-util-types@1.1.0", "", {}, "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg=="], - - "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], - - "miller-rabin": ["miller-rabin@4.0.1", "", { "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, "bin": { "miller-rabin": "bin/miller-rabin" } }, "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA=="], - - "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], - - "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - - "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], - - "mini-css-extract-plugin": ["mini-css-extract-plugin@2.9.4", "", { "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" }, "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ=="], - - "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], - - "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="], - - "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - - "minimisted": ["minimisted@2.0.1", "", { "dependencies": { "minimist": "^1.2.5" } }, "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA=="], - - "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], - - "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], - - "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - - "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], - - "mockttp": ["mockttp@3.17.1", "", { "dependencies": { "@graphql-tools/schema": "^8.5.0", "@graphql-tools/utils": "^8.8.0", "@httptoolkit/httpolyglot": "^2.2.1", "@httptoolkit/subscriptions-transport-ws": "^0.11.2", "@httptoolkit/websocket-stream": "^6.0.1", "@types/cors": "^2.8.6", "@types/node": "*", "async-mutex": "^0.5.0", "base64-arraybuffer": "^0.1.5", "body-parser": "^1.15.2", "cacheable-lookup": "^6.0.0", "common-tags": "^1.8.0", "connect": "^3.7.0", "cors": "^2.8.4", "cors-gate": "^1.1.3", "cross-fetch": "^3.1.5", "destroyable-server": "^1.1.1", "express": "^4.14.0", "fast-json-patch": "^3.1.1", "graphql": "^14.0.2 || ^15.5", "graphql-http": "^1.22.0", "graphql-subscriptions": "^1.1.0", "graphql-tag": "^2.12.6", "http-encoding": "^2.0.1", "http2-wrapper": "^2.2.1", "https-proxy-agent": "^5.0.1", "isomorphic-ws": "^4.0.1", "lodash": "^4.16.4", "lru-cache": "^7.14.0", "native-duplexpair": "^1.0.0", "node-forge": "^1.2.1", "pac-proxy-agent": "^7.0.0", "parse-multipart-data": "^1.4.0", "performance-now": "^2.1.0", "portfinder": "^1.0.32", "read-tls-client-hello": "^1.1.0", "semver": "^7.5.3", "socks-proxy-agent": "^7.0.0", "typed-error": "^3.0.2", "urlpattern-polyfill": "^8.0.0", "uuid": "^8.3.2", "ws": "^8.8.0" }, "bin": { "mockttp": "dist/admin/admin-bin.js" } }, "sha512-sW6m4uaRIGJrtrQNZbUoSisTEAq91oS9C4cUyVFpHgMcpTwsG2ZvF94qOBt4PpEf9gGCiwkxvzkEEt4W/CPHHg=="], - - "morgan": ["morgan@1.10.1", "", { "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", "depd": "~2.0.0", "on-finished": "~2.3.0", "on-headers": "~1.1.0" } }, "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A=="], - - "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], - - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - - "msw": ["msw@2.12.7", "", { "dependencies": { "@inquirer/confirm": "^5.0.0", "@mswjs/interceptors": "^0.40.0", "@open-draft/deferred-promise": "^2.2.0", "@types/statuses": "^2.0.6", "cookie": "^1.0.2", "graphql": "^16.12.0", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.7.0", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.0", "type-fest": "^5.2.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-retd5i3xCZDVWMYjHEVuKTmhqY8lSsxujjVrZiGbbdoxxIBg5S7rCuYy/YQpfrTYIxpd/o0Kyb/3H+1udBMoYg=="], - - "multer": ["multer@2.0.2", "", { "dependencies": { "append-field": "^1.0.0", "busboy": "^1.6.0", "concat-stream": "^2.0.0", "mkdirp": "^0.5.6", "object-assign": "^4.1.1", "type-is": "^1.6.18", "xtend": "^4.0.2" } }, "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw=="], - - "multicast-dns": ["multicast-dns@7.2.5", "", { "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg=="], - - "mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="], - - "mysql2": ["mysql2@3.16.0", "", { "dependencies": { "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.7.0", "long": "^5.2.1", "lru.min": "^1.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" } }, "sha512-AEGW7QLLSuSnjCS4pk3EIqOmogegmze9h8EyrndavUQnIUcfkVal/sK7QznE+a3bc6rzPbAiui9Jcb+96tPwYA=="], - - "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], - - "named-placeholders": ["named-placeholders@1.1.6", "", { "dependencies": { "lru.min": "^1.1.0" } }, "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w=="], - - "nan": ["nan@2.24.0", "", {}, "sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg=="], - - "nano-css": ["nano-css@5.6.2", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "css-tree": "^1.1.2", "csstype": "^3.1.2", "fastest-stable-stringify": "^2.0.2", "inline-style-prefixer": "^7.0.1", "rtl-css-js": "^1.16.1", "stacktrace-js": "^2.0.2", "stylis": "^4.3.0" }, "peerDependencies": { "react": "*", "react-dom": "*" } }, "sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw=="], - - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - - "native-duplexpair": ["native-duplexpair@1.0.0", "", {}, "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA=="], - - "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - - "ndjson": ["ndjson@2.0.0", "", { "dependencies": { "json-stringify-safe": "^5.0.1", "minimist": "^1.2.5", "readable-stream": "^3.6.0", "split2": "^3.0.0", "through2": "^4.0.0" }, "bin": { "ndjson": "cli.js" } }, "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ=="], - - "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], - - "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], - - "netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="], - - "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], - - "node-abort-controller": ["node-abort-controller@3.1.1", "", {}, "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="], - - "node-cache": ["node-cache@5.1.2", "", { "dependencies": { "clone": "2.x" } }, "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg=="], - - "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], - - "node-forge": ["node-forge@1.3.3", "", {}, "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg=="], - - "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], - - "node-libs-browser": ["node-libs-browser@2.2.1", "", { "dependencies": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", "buffer": "^4.3.0", "console-browserify": "^1.1.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", "readable-stream": "^2.3.3", "stream-browserify": "^2.0.1", "stream-http": "^2.7.2", "string_decoder": "^1.0.0", "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", "util": "^0.11.0", "vm-browserify": "^1.0.1" } }, "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q=="], - - "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], - - "node-schedule": ["node-schedule@2.1.1", "", { "dependencies": { "cron-parser": "^4.2.0", "long-timeout": "0.1.1", "sorted-array-functions": "^1.3.0" } }, "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ=="], - - "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - - "normalize-url": ["normalize-url@6.1.0", "", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="], - - "npm-bundled": ["npm-bundled@2.0.1", "", { "dependencies": { "npm-normalize-package-bin": "^2.0.0" } }, "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw=="], - - "npm-normalize-package-bin": ["npm-normalize-package-bin@2.0.0", "", {}, "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ=="], - - "npm-packlist": ["npm-packlist@5.1.3", "", { "dependencies": { "glob": "^8.0.1", "ignore-walk": "^5.0.1", "npm-bundled": "^2.0.0", "npm-normalize-package-bin": "^2.0.0" }, "bin": { "npm-packlist": "bin/index.js" } }, "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg=="], - - "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], - - "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], - - "nwsapi": ["nwsapi@2.2.23", "", {}, "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ=="], - - "oauth": ["oauth@0.10.2", "", {}, "sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q=="], - - "oauth-sign": ["oauth-sign@0.9.0", "", {}, "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="], - - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], - - "object-hash": ["object-hash@2.2.0", "", {}, "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="], - - "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - - "object-is": ["object-is@1.1.6", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" } }, "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q=="], - - "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], - - "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], - - "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], - - "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], - - "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], - - "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - - "obuf": ["obuf@1.1.2", "", {}, "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="], - - "oidc-token-hash": ["oidc-token-hash@5.2.0", "", {}, "sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw=="], - - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], - - "on-headers": ["on-headers@1.1.0", "", {}, "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A=="], - - "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - - "one-time": ["one-time@1.0.0", "", { "dependencies": { "fn.name": "1.x.x" } }, "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g=="], - - "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - - "only": ["only@0.0.2", "", {}, "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ=="], - - "ono": ["ono@7.1.3", "", { "dependencies": { "@jsdevtools/ono": "7.1.3" } }, "sha512-9jnfVriq7uJM4o5ganUY54ntUm+5EK21EGaQ5NWnkWg3zz5ywbbonlBguRcnmF1/HDiIe3zxNxXcO1YPBmPcQQ=="], - - "open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], - - "openapi-merge": ["openapi-merge@1.3.3", "", { "dependencies": { "atlassian-openapi": "^1.0.8", "lodash": "^4.17.15", "ts-is-present": "^1.1.1" } }, "sha512-zC6DE+ekFJwWMwssb+LOkZbYqlA/LCaFT4RdhSpDpxF4vaMoPNDuztWFkEAImhLMg4GKvoQH6gUvAKzaXDRC2A=="], - - "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], - - "openapi3-ts": ["openapi3-ts@3.2.0", "", { "dependencies": { "yaml": "^2.2.1" } }, "sha512-/ykNWRV5Qs0Nwq7Pc0nJ78fgILvOT/60OxEmB3v7yQ8a8Bwcm43D4diaYazG/KBn6czA+52XYy931WFLMCUeSg=="], - - "openid-client": ["openid-client@5.7.1", "", { "dependencies": { "jose": "^4.15.9", "lru-cache": "^6.0.0", "object-hash": "^2.2.0", "oidc-token-hash": "^5.0.3" } }, "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew=="], - - "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - - "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], - - "os-browserify": ["os-browserify@0.3.0", "", {}, "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A=="], - - "outvariant": ["outvariant@1.4.3", "", {}, "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="], - - "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], - - "oxc-resolver": ["oxc-resolver@11.16.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.16.1", "@oxc-resolver/binding-android-arm64": "11.16.1", "@oxc-resolver/binding-darwin-arm64": "11.16.1", "@oxc-resolver/binding-darwin-x64": "11.16.1", "@oxc-resolver/binding-freebsd-x64": "11.16.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.16.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.16.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.16.1", "@oxc-resolver/binding-linux-arm64-musl": "11.16.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.16.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.16.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.16.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.16.1", "@oxc-resolver/binding-linux-x64-gnu": "11.16.1", "@oxc-resolver/binding-linux-x64-musl": "11.16.1", "@oxc-resolver/binding-openharmony-arm64": "11.16.1", "@oxc-resolver/binding-wasm32-wasi": "11.16.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.16.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.16.1", "@oxc-resolver/binding-win32-x64-msvc": "11.16.1" } }, "sha512-eN5tLRx2oyyNpPyWWItuPiNLY/EpGlqXVJll+Uptds4owQ4UQK3T8rPlR+wl8xBKvQZM4drFC1nKVLeZDUWpQg=="], - - "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], - - "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - - "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - - "p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], - - "p-retry": ["p-retry@6.2.1", "", { "dependencies": { "@types/retry": "0.12.2", "is-network-error": "^1.0.0", "retry": "^0.13.1" } }, "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ=="], - - "p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="], - - "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], - - "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], - - "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], - - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], - - "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], - - "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="], - - "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - - "parse-asn1": ["parse-asn1@5.1.9", "", { "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", "evp_bytestokey": "^1.0.3", "pbkdf2": "^3.1.5", "safe-buffer": "^5.2.1" } }, "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg=="], - - "parse-entities": ["parse-entities@2.0.0", "", { "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" } }, "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ=="], - - "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - - "parse-multipart-data": ["parse-multipart-data@1.5.0", "", {}, "sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw=="], - - "parse-passwd": ["parse-passwd@1.0.0", "", {}, "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q=="], - - "parse-path": ["parse-path@7.1.0", "", { "dependencies": { "protocols": "^2.0.0" } }, "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw=="], - - "parse-url": ["parse-url@8.1.0", "", { "dependencies": { "parse-path": "^7.0.0" } }, "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w=="], - - "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], - - "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], - - "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], - - "passport": ["passport@0.7.0", "", { "dependencies": { "passport-strategy": "1.x.x", "pause": "0.0.1", "utils-merge": "^1.0.1" } }, "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ=="], - - "passport-atlassian-oauth2": ["passport-atlassian-oauth2@2.1.0", "", { "dependencies": { "passport-oauth2": "^1.4.0" } }, "sha512-uUjdoeeA0qqEedj14LzeAFGyK/eesPezQfdN1ui/7D8TYNCGVtuoYhKT64gT8KhOCz5nPYS12XWXRfoPTS6kpg=="], - - "passport-auth0": ["passport-auth0@1.4.5", "", { "dependencies": { "axios": "^1.7.4", "passport-oauth": "^1.0.0", "passport-oauth2": "^1.6.0" } }, "sha512-pfAvcAoR1HjKFygq0gGEHCy+9eqXr1CnfN3yD4kuUj1p4ek7P3s4bMn13+Q1FajqDNA8lD0Vvy6j8Od1oqF9Dg=="], - - "passport-bitbucket-oauth2": ["passport-bitbucket-oauth2@0.1.2", "", { "dependencies": { "passport-oauth2": "^1.1.2", "pkginfo": "0.2.x" } }, "sha512-bE4eQuyK2U0bumRdxfZedfoBfkHzblhui6MElz64xptn70CIrJrEKon1Ui95ML3KsvOmGGoaSZcwXwAjWF6M0Q=="], - - "passport-github2": ["passport-github2@0.1.12", "", { "dependencies": { "passport-oauth2": "1.x.x" } }, "sha512-3nPUCc7ttF/3HSP/k9sAXjz3SkGv5Nki84I05kSQPo01Jqq1NzJACgMblCK0fGcv9pKCG/KXU3AJRDGLqHLoIw=="], - - "passport-gitlab2": ["passport-gitlab2@5.0.0", "", { "dependencies": { "passport-oauth2": "^1.4.0" } }, "sha512-cXQMgM6JQx9wHVh7JLH30D8fplfwjsDwRz+zS0pqC8JS+4bNmc1J04NGp5g2M4yfwylH9kQRrMN98GxMw7q7cg=="], - - "passport-google-oauth20": ["passport-google-oauth20@2.0.0", "", { "dependencies": { "passport-oauth2": "1.x.x" } }, "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ=="], - - "passport-microsoft": ["passport-microsoft@1.1.0", "", { "dependencies": { "passport-oauth2": "1.8.0" } }, "sha512-yJyynEkGakK8SveCqILAvrpMBOKpx6TNyxL1ry+eW4m9/qqqDDOUahLdHj7wPSuDReHQ4jArGheH5v0/pNwR+g=="], - - "passport-oauth": ["passport-oauth@1.0.0", "", { "dependencies": { "passport-oauth1": "1.x.x", "passport-oauth2": "1.x.x" } }, "sha512-4IZNVsZbN1dkBzmEbBqUxDG8oFOIK81jqdksE3HEb/vI3ib3FMjbiZZ6MTtooyYZzmKu0BfovjvT1pdGgIq+4Q=="], - - "passport-oauth1": ["passport-oauth1@1.3.0", "", { "dependencies": { "oauth": "0.9.x", "passport-strategy": "1.x.x", "utils-merge": "1.x.x" } }, "sha512-8T/nX4gwKTw0PjxP1xfD0QhrydQNakzeOpZ6M5Uqdgz9/a/Ag62RmJxnZQ4LkbdXGrRehQHIAHNAu11rCP46Sw=="], - - "passport-oauth2": ["passport-oauth2@1.8.0", "", { "dependencies": { "base64url": "3.x.x", "oauth": "0.10.x", "passport-strategy": "1.x.x", "uid2": "0.0.x", "utils-merge": "1.x.x" } }, "sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA=="], - - "passport-onelogin-oauth": ["passport-onelogin-oauth@0.0.1", "", { "dependencies": { "passport-oauth": "1.0.0", "pkginfo": "0.2.x", "uid2": "0.0.3" } }, "sha512-EXFBqlJdHf5AX4QaiZsLfhgQUOR6z3zGA5479SUJF4I4rnAt7yasZEbs27pg8MRiQh/uLZEWLGMoVXr6LHV9mQ=="], - - "passport-strategy": ["passport-strategy@1.0.0", "", {}, "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA=="], - - "path-browserify": ["path-browserify@0.0.1", "", {}, "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="], - - "path-equal": ["path-equal@1.2.5", "", {}, "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g=="], - - "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], - - "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], - - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - - "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - - "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], - - "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], - - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "pause": ["pause@0.0.1", "", {}, "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="], - - "pbkdf2": ["pbkdf2@3.1.5", "", { "dependencies": { "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "ripemd160": "^2.0.3", "safe-buffer": "^5.2.1", "sha.js": "^2.4.12", "to-buffer": "^1.2.1" } }, "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ=="], - - "pct-encode": ["pct-encode@1.0.3", "", {}, "sha512-+ojEvSHApoLWF2YYxwnOM4N9DPn5e5fG+j0YJ9drKNaYtrZYOq5M9ESOaBYqOHCXOAALODJJ4wkqHAXEuLpwMw=="], - - "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], - - "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="], - - "pg": ["pg@8.16.3", "", { "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", "pg-protocol": "^1.10.3", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.2.7" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw=="], - - "pg-cloudflare": ["pg-cloudflare@1.2.7", "", {}, "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg=="], - - "pg-connection-string": ["pg-connection-string@2.9.1", "", {}, "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w=="], - - "pg-format": ["pg-format@1.0.4", "", {}, "sha512-YyKEF78pEA6wwTAqOUaHIN/rWpfzzIuMh9KdAhc3rSLQ/7zkRFcCgYBAEGatDstLyZw4g0s9SNICmaTGnBVeyw=="], - - "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], - - "pg-pool": ["pg-pool@3.10.1", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg=="], - - "pg-protocol": ["pg-protocol@1.10.3", "", {}, "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ=="], - - "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], - - "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], - - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "pify": ["pify@5.0.0", "", {}, "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA=="], - - "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], - - "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], - - "pkg-up": ["pkg-up@3.1.0", "", { "dependencies": { "find-up": "^3.0.0" } }, "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA=="], - - "pkginfo": ["pkginfo@0.2.3", "", {}, "sha512-7W7wTrE/NsY8xv/DTGjwNIyNah81EQH0MWcTzrHL6pOpMocOGZc0Mbdz9aXxSrp+U0mSmkU8jrNCDCfUs3sOBg=="], - - "playwright": ["playwright@1.57.0", "", { "dependencies": { "playwright-core": "1.57.0" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw=="], - - "playwright-core": ["playwright-core@1.57.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ=="], - - "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], - - "popper.js": ["popper.js@1.16.1-lts", "", {}, "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA=="], - - "portfinder": ["portfinder@1.0.38", "", { "dependencies": { "async": "^3.2.6", "debug": "^4.3.6" } }, "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg=="], - - "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - - "postcss-calc": ["postcss-calc@8.2.4", "", { "dependencies": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.2" } }, "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q=="], - - "postcss-colormin": ["postcss-colormin@5.3.1", "", { "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ=="], - - "postcss-convert-values": ["postcss-convert-values@5.1.3", "", { "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA=="], - - "postcss-discard-comments": ["postcss-discard-comments@5.1.2", "", { "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ=="], - - "postcss-discard-duplicates": ["postcss-discard-duplicates@5.1.0", "", { "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw=="], - - "postcss-discard-empty": ["postcss-discard-empty@5.1.1", "", { "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A=="], - - "postcss-discard-overridden": ["postcss-discard-overridden@5.1.0", "", { "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw=="], - - "postcss-load-config": ["postcss-load-config@3.1.4", "", { "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg=="], - - "postcss-merge-longhand": ["postcss-merge-longhand@5.1.7", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.1" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ=="], - - "postcss-merge-rules": ["postcss-merge-rules@5.1.4", "", { "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g=="], - - "postcss-minify-font-values": ["postcss-minify-font-values@5.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA=="], - - "postcss-minify-gradients": ["postcss-minify-gradients@5.1.1", "", { "dependencies": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw=="], - - "postcss-minify-params": ["postcss-minify-params@5.1.4", "", { "dependencies": { "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw=="], - - "postcss-minify-selectors": ["postcss-minify-selectors@5.2.1", "", { "dependencies": { "postcss-selector-parser": "^6.0.5" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg=="], - - "postcss-modules": ["postcss-modules@4.3.1", "", { "dependencies": { "generic-names": "^4.0.0", "icss-replace-symbols": "^1.1.0", "lodash.camelcase": "^4.3.0", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "string-hash": "^1.1.1" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q=="], - - "postcss-modules-extract-imports": ["postcss-modules-extract-imports@3.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q=="], - - "postcss-modules-local-by-default": ["postcss-modules-local-by-default@4.2.0", "", { "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw=="], - - "postcss-modules-scope": ["postcss-modules-scope@3.2.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA=="], - - "postcss-modules-values": ["postcss-modules-values@4.0.0", "", { "dependencies": { "icss-utils": "^5.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ=="], - - "postcss-normalize-charset": ["postcss-normalize-charset@5.1.0", "", { "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg=="], - - "postcss-normalize-display-values": ["postcss-normalize-display-values@5.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA=="], - - "postcss-normalize-positions": ["postcss-normalize-positions@5.1.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg=="], - - "postcss-normalize-repeat-style": ["postcss-normalize-repeat-style@5.1.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g=="], - - "postcss-normalize-string": ["postcss-normalize-string@5.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w=="], - - "postcss-normalize-timing-functions": ["postcss-normalize-timing-functions@5.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg=="], - - "postcss-normalize-unicode": ["postcss-normalize-unicode@5.1.1", "", { "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA=="], - - "postcss-normalize-url": ["postcss-normalize-url@5.1.0", "", { "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew=="], - - "postcss-normalize-whitespace": ["postcss-normalize-whitespace@5.1.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA=="], - - "postcss-ordered-values": ["postcss-ordered-values@5.1.3", "", { "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ=="], - - "postcss-reduce-initial": ["postcss-reduce-initial@5.1.2", "", { "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg=="], - - "postcss-reduce-transforms": ["postcss-reduce-transforms@5.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ=="], - - "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], - - "postcss-svgo": ["postcss-svgo@5.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA=="], - - "postcss-unique-selectors": ["postcss-unique-selectors@5.1.1", "", { "dependencies": { "postcss-selector-parser": "^6.0.5" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA=="], - - "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], - - "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], - - "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], - - "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], - - "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - - "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - - "pretty-error": ["pretty-error@4.0.0", "", { "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" } }, "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw=="], - - "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], - - "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], - - "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], - - "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], - - "prom-client": ["prom-client@15.1.3", "", { "dependencies": { "@opentelemetry/api": "^1.4.0", "tdigest": "^0.1.1" } }, "sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g=="], - - "promise.series": ["promise.series@0.2.0", "", {}, "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ=="], - - "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], - - "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], - - "property-expr": ["property-expr@2.0.6", "", {}, "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA=="], - - "property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="], - - "proto3-json-serializer": ["proto3-json-serializer@2.0.2", "", { "dependencies": { "protobufjs": "^7.2.5" } }, "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ=="], - - "protobufjs": ["protobufjs@7.5.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="], - - "protocols": ["protocols@2.0.2", "", {}, "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ=="], - - "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], - - "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], - - "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], - - "public-encrypt": ["public-encrypt@4.0.3", "", { "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q=="], - - "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], - - "punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], - - "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], - - "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], - - "querystring-es3": ["querystring-es3@0.2.1", "", {}, "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA=="], - - "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], - - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - - "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], - - "raf-schd": ["raf-schd@4.0.3", "", {}, "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ=="], - - "rambda": ["rambda@9.4.2", "", {}, "sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw=="], - - "random-bytes": ["random-bytes@1.0.0", "", {}, "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ=="], - - "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], - - "randomfill": ["randomfill@1.0.4", "", { "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw=="], - - "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], - - "raw-body": ["raw-body@2.5.3", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="], - - "raw-loader": ["raw-loader@4.0.2", "", { "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA=="], - - "rc-progress": ["rc-progress@3.5.1", "", { "dependencies": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.6", "rc-util": "^5.16.1" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw=="], - - "rc-util": ["rc-util@5.44.4", "", { "dependencies": { "@babel/runtime": "^7.18.3", "react-is": "^18.2.0" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w=="], - - "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], - - "react-aria": ["react-aria@3.45.0", "", { "dependencies": { "@internationalized/string": "^3.2.7", "@react-aria/breadcrumbs": "^3.5.30", "@react-aria/button": "^3.14.3", "@react-aria/calendar": "^3.9.3", "@react-aria/checkbox": "^3.16.3", "@react-aria/color": "^3.1.3", "@react-aria/combobox": "^3.14.1", "@react-aria/datepicker": "^3.15.3", "@react-aria/dialog": "^3.5.32", "@react-aria/disclosure": "^3.1.1", "@react-aria/dnd": "^3.11.4", "@react-aria/focus": "^3.21.3", "@react-aria/gridlist": "^3.14.2", "@react-aria/i18n": "^3.12.14", "@react-aria/interactions": "^3.26.0", "@react-aria/label": "^3.7.23", "@react-aria/landmark": "^3.0.8", "@react-aria/link": "^3.8.7", "@react-aria/listbox": "^3.15.1", "@react-aria/menu": "^3.19.4", "@react-aria/meter": "^3.4.28", "@react-aria/numberfield": "^3.12.3", "@react-aria/overlays": "^3.31.0", "@react-aria/progress": "^3.4.28", "@react-aria/radio": "^3.12.3", "@react-aria/searchfield": "^3.8.10", "@react-aria/select": "^3.17.1", "@react-aria/selection": "^3.27.0", "@react-aria/separator": "^3.4.14", "@react-aria/slider": "^3.8.3", "@react-aria/ssr": "^3.9.10", "@react-aria/switch": "^3.7.9", "@react-aria/table": "^3.17.9", "@react-aria/tabs": "^3.10.9", "@react-aria/tag": "^3.7.3", "@react-aria/textfield": "^3.18.3", "@react-aria/toast": "^3.0.9", "@react-aria/tooltip": "^3.9.0", "@react-aria/tree": "^3.1.5", "@react-aria/utils": "^3.32.0", "@react-aria/visually-hidden": "^3.8.29", "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-QsdWIhhm3+IAiW3SU9tEm7pmeIcveEPAO6riZ1IUF78ZCvH/47nU4zVztcdtYmwYWSL4168QxLncWKtlMva3BA=="], - - "react-aria-components": ["react-aria-components@1.14.0", "", { "dependencies": { "@internationalized/date": "^3.10.1", "@internationalized/string": "^3.2.7", "@react-aria/autocomplete": "3.0.0-rc.4", "@react-aria/collections": "^3.0.1", "@react-aria/dnd": "^3.11.4", "@react-aria/focus": "^3.21.3", "@react-aria/interactions": "^3.26.0", "@react-aria/live-announcer": "^3.4.4", "@react-aria/overlays": "^3.31.0", "@react-aria/ssr": "^3.9.10", "@react-aria/textfield": "^3.18.3", "@react-aria/toolbar": "3.0.0-beta.22", "@react-aria/utils": "^3.32.0", "@react-aria/virtualizer": "^4.1.11", "@react-stately/autocomplete": "3.0.0-beta.4", "@react-stately/layout": "^4.5.2", "@react-stately/selection": "^3.20.7", "@react-stately/table": "^3.15.2", "@react-stately/utils": "^3.11.0", "@react-stately/virtualizer": "^4.4.4", "@react-types/form": "^3.7.16", "@react-types/grid": "^3.3.6", "@react-types/shared": "^3.32.1", "@react-types/table": "^3.13.4", "@swc/helpers": "^0.5.0", "client-only": "^0.0.1", "react-aria": "^3.45.0", "react-stately": "^3.43.0", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-u21N/yS6Ozk9P9oO8wxMNZSFiPk6F3aAE9w6aN7pseGPApkjXqDyPNCnTsTTvMtVL3QRBkVbf7fJ5yi2hksVEg=="], - - "react-beautiful-dnd": ["react-beautiful-dnd@13.1.1", "", { "dependencies": { "@babel/runtime": "^7.9.2", "css-box-model": "^1.2.0", "memoize-one": "^5.1.1", "raf-schd": "^4.0.2", "react-redux": "^7.2.0", "redux": "^4.0.4", "use-memo-one": "^1.1.1" }, "peerDependencies": { "react": "^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" } }, "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ=="], - - "react-dev-utils": ["react-dev-utils@12.0.1", "", { "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", "browserslist": "^4.18.1", "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "detect-port-alt": "^1.1.6", "escape-string-regexp": "^4.0.0", "filesize": "^8.0.6", "find-up": "^5.0.0", "fork-ts-checker-webpack-plugin": "^6.5.0", "global-modules": "^2.0.0", "globby": "^11.0.4", "gzip-size": "^6.0.0", "immer": "^9.0.7", "is-root": "^2.1.0", "loader-utils": "^3.2.0", "open": "^8.4.0", "pkg-up": "^3.1.0", "prompts": "^2.4.2", "react-error-overlay": "^6.0.11", "recursive-readdir": "^2.2.2", "shell-quote": "^1.7.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" } }, "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ=="], - - "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], - - "react-double-scrollbar": ["react-double-scrollbar@0.0.15", "", { "peerDependencies": { "react": ">= 0.14.7" } }, "sha512-dLz3/WBIpgFnzFY0Kb4aIYBMT2BWomHuW2DH6/9jXfS6/zxRRBUFQ04My4HIB7Ma7QoRBpcy8NtkPeFgcGBpgg=="], - - "react-draggable": ["react-draggable@4.5.0", "", { "dependencies": { "clsx": "^2.1.1", "prop-types": "^15.8.1" }, "peerDependencies": { "react": ">= 16.3.0", "react-dom": ">= 16.3.0" } }, "sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw=="], - - "react-error-overlay": ["react-error-overlay@6.1.0", "", {}, "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ=="], - - "react-fast-compare": ["react-fast-compare@3.2.2", "", {}, "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="], - - "react-full-screen": ["react-full-screen@1.1.1", "", { "dependencies": { "fscreen": "^1.0.2" }, "peerDependencies": { "react": ">= 16.8.0" } }, "sha512-xoEgkoTiN0dw9cjYYGViiMCBYbkS97BYb4bHPhQVWXj1UnOs8PZ1rPzpX+2HMhuvQV1jA5AF9GaRbO3fA5aZtg=="], - - "react-grid-layout": ["react-grid-layout@1.3.4", "", { "dependencies": { "clsx": "^1.1.1", "lodash.isequal": "^4.0.0", "prop-types": "^15.8.1", "react-draggable": "^4.0.0", "react-resizable": "^3.0.4" }, "peerDependencies": { "react": ">= 16.3.0", "react-dom": ">= 16.3.0" } }, "sha512-sB3rNhorW77HUdOjB4JkelZTdJGQKuXLl3gNg+BI8gJkTScspL1myfZzW/EM0dLEn+1eH+xW+wNqk0oIM9o7cw=="], - - "react-helmet": ["react-helmet@6.1.0", "", { "dependencies": { "object-assign": "^4.1.1", "prop-types": "^15.7.2", "react-fast-compare": "^3.1.1", "react-side-effect": "^2.1.0" }, "peerDependencies": { "react": ">=16.3.0" } }, "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw=="], - - "react-hook-form": ["react-hook-form@7.69.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-yt6ZGME9f4F6WHwevrvpAjh42HMvocuSnSIHUGycBqXIJdhqGSPQzTpGF+1NLREk/58IdPxEMfPcFCjlMhclGw=="], - - "react-idle-timer": ["react-idle-timer@5.7.2", "", { "peerDependencies": { "react": ">=16", "react-dom": ">=16" } }, "sha512-+BaPfc7XEUU5JFkwZCx6fO1bLVK+RBlFH+iY4X34urvIzZiZINP6v2orePx3E6pAztJGE7t4DzvL7if2SL/0GQ=="], - - "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], - - "react-markdown": ["react-markdown@8.0.7", "", { "dependencies": { "@types/hast": "^2.0.0", "@types/prop-types": "^15.0.0", "@types/unist": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^2.0.0", "prop-types": "^15.0.0", "property-information": "^6.0.0", "react-is": "^18.0.0", "remark-parse": "^10.0.0", "remark-rehype": "^10.0.0", "space-separated-tokens": "^2.0.0", "style-to-object": "^0.4.0", "unified": "^10.0.0", "unist-util-visit": "^4.0.0", "vfile": "^5.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ=="], - - "react-redux": ["react-redux@7.2.9", "", { "dependencies": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", "hoist-non-react-statics": "^3.3.2", "loose-envify": "^1.4.0", "prop-types": "^15.7.2", "react-is": "^17.0.2" }, "peerDependencies": { "react": "^16.8.3 || ^17 || ^18" } }, "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ=="], - - "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], - - "react-resizable": ["react-resizable@3.0.5", "", { "dependencies": { "prop-types": "15.x", "react-draggable": "^4.0.3" }, "peerDependencies": { "react": ">= 16.3" } }, "sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w=="], - - "react-router": ["react-router@6.30.2", "", { "dependencies": { "@remix-run/router": "1.23.1" }, "peerDependencies": { "react": ">=16.8" } }, "sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA=="], - - "react-router-dom": ["react-router-dom@6.30.2", "", { "dependencies": { "@remix-run/router": "1.23.1", "react-router": "6.30.2" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q=="], - - "react-side-effect": ["react-side-effect@2.1.2", "", { "peerDependencies": { "react": "^16.3.0 || ^17.0.0 || ^18.0.0" } }, "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw=="], - - "react-sparklines": ["react-sparklines@1.7.0", "", { "dependencies": { "prop-types": "^15.5.10" }, "peerDependencies": { "react": "*", "react-dom": "*" } }, "sha512-bJFt9K4c5Z0k44G8KtxIhbG+iyxrKjBZhdW6afP+R7EnIq+iKjbWbEFISrf3WKNFsda+C46XAfnX0StS5fbDcg=="], - - "react-stately": ["react-stately@3.43.0", "", { "dependencies": { "@react-stately/calendar": "^3.9.1", "@react-stately/checkbox": "^3.7.3", "@react-stately/collections": "^3.12.8", "@react-stately/color": "^3.9.3", "@react-stately/combobox": "^3.12.1", "@react-stately/data": "^3.15.0", "@react-stately/datepicker": "^3.15.3", "@react-stately/disclosure": "^3.0.9", "@react-stately/dnd": "^3.7.2", "@react-stately/form": "^3.2.2", "@react-stately/list": "^3.13.2", "@react-stately/menu": "^3.9.9", "@react-stately/numberfield": "^3.10.3", "@react-stately/overlays": "^3.6.21", "@react-stately/radio": "^3.11.3", "@react-stately/searchfield": "^3.5.17", "@react-stately/select": "^3.9.0", "@react-stately/selection": "^3.20.7", "@react-stately/slider": "^3.7.3", "@react-stately/table": "^3.15.2", "@react-stately/tabs": "^3.8.7", "@react-stately/toast": "^3.1.2", "@react-stately/toggle": "^3.9.3", "@react-stately/tooltip": "^3.5.9", "@react-stately/tree": "^3.9.4", "@react-types/shared": "^3.32.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-dScb9fTL1tRtFODPnk/2rP0a9kp1C+7+40RArS0C7j0auAUmnrO/wDILojwQUso7/kkys4fP707fTwGJDeJ7vg=="], - - "react-syntax-highlighter": ["react-syntax-highlighter@15.6.6", "", { "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.30.0", "refractor": "^3.6.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw=="], - - "react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="], - - "react-universal-interface": ["react-universal-interface@0.6.2", "", { "peerDependencies": { "react": "*", "tslib": "*" } }, "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw=="], - - "react-use": ["react-use@17.6.0", "", { "dependencies": { "@types/js-cookie": "^2.2.6", "@xobotyi/scrollbar-width": "^1.9.5", "copy-to-clipboard": "^3.3.1", "fast-deep-equal": "^3.1.3", "fast-shallow-equal": "^1.0.0", "js-cookie": "^2.2.1", "nano-css": "^5.6.2", "react-universal-interface": "^0.6.2", "resize-observer-polyfill": "^1.5.1", "screenfull": "^5.1.0", "set-harmonic-interval": "^1.0.1", "throttle-debounce": "^3.0.1", "ts-easing": "^0.2.0", "tslib": "^2.1.0" }, "peerDependencies": { "react": "*", "react-dom": "*" } }, "sha512-OmedEScUMKFfzn1Ir8dBxiLLSOzhKe/dPZwVxcujweSj45aNM7BEGPb9BEVIgVEqEXx6f3/TsXzwIktNgUR02g=="], - - "react-virtualized-auto-sizer": ["react-virtualized-auto-sizer@1.0.26", "", { "peerDependencies": { "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-CblNyiNVw2o+hsa5/49NH2ogGxZ+t+3aweRvNSq7TVjDIlwk7ir4lencEg5HxHeSzwNarSkNkiu0qJSOXtxm5A=="], - - "react-window": ["react-window@1.8.11", "", { "dependencies": { "@babel/runtime": "^7.0.0", "memoize-one": ">=3.1.1 <6" }, "peerDependencies": { "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ=="], - - "read-tls-client-hello": ["read-tls-client-hello@1.1.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-htV8ph2jXGCVnKRwW12V1UQdfwC2jPFrDrk8Qh9P+4R/t/Jef/BNmfdX5jsxlcakUMPskwiPZT/enVbjRQqtGQ=="], - - "read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="], - - "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - - "readdir-glob": ["readdir-glob@1.1.3", "", { "dependencies": { "minimatch": "^5.1.0" } }, "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA=="], - - "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - - "rechoir": ["rechoir@0.8.0", "", { "dependencies": { "resolve": "^1.20.0" } }, "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ=="], - - "recursive-readdir": ["recursive-readdir@2.2.3", "", { "dependencies": { "minimatch": "^3.0.5" } }, "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA=="], - - "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], - - "redis-parser": ["redis-parser@3.0.0", "", { "dependencies": { "redis-errors": "^1.0.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="], - - "redux": ["redux@4.2.1", "", { "dependencies": { "@babel/runtime": "^7.9.2" } }, "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w=="], - - "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], - - "refractor": ["refractor@3.6.0", "", { "dependencies": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", "prismjs": "~1.27.0" } }, "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA=="], - - "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], - - "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.2", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g=="], - - "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], - - "regexpu-core": ["regexpu-core@6.4.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.2.1" } }, "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA=="], - - "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], - - "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="], - - "relateurl": ["relateurl@0.2.7", "", {}, "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="], - - "remark-gfm": ["remark-gfm@3.0.1", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-gfm": "^2.0.0", "micromark-extension-gfm": "^2.0.0", "unified": "^10.0.0" } }, "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig=="], - - "remark-parse": ["remark-parse@10.0.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", "unified": "^10.0.0" } }, "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw=="], - - "remark-rehype": ["remark-rehype@10.1.0", "", { "dependencies": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", "mdast-util-to-hast": "^12.1.0", "unified": "^10.0.0" } }, "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw=="], - - "renderkid": ["renderkid@3.0.0", "", { "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", "strip-ansi": "^6.0.1" } }, "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg=="], - - "replace-in-file": ["replace-in-file@7.2.0", "", { "dependencies": { "chalk": "^4.1.2", "glob": "^8.1.0", "yargs": "^17.7.2" }, "bin": { "replace-in-file": "bin/cli.js" } }, "sha512-CiLXVop3o8/h2Kd1PwKPPimmS9wUV0Ki6Fl8+1ITD35nB3Gl/PrW5IONpTE0AXk0z4v8WYcpEpdeZqMXvSnWpg=="], - - "request": ["request@2.88.2", "", { "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="], - - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], - - "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], - - "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], - - "resize-observer-polyfill": ["resize-observer-polyfill@1.5.1", "", {}, "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="], - - "resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], - - "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], - - "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="], - - "resolve-dir": ["resolve-dir@1.0.1", "", { "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" } }, "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg=="], - - "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], - - "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], - - "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="], - - "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], - - "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], - - "retry-request": ["retry-request@7.0.2", "", { "dependencies": { "@types/request": "^2.48.8", "extend": "^3.0.2", "teeny-request": "^9.0.0" } }, "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w=="], - - "rettime": ["rettime@0.7.0", "", {}, "sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw=="], - - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - - "rfc4648": ["rfc4648@1.5.4", "", {}, "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg=="], - - "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], - - "rifm": ["rifm@0.7.0", "", { "dependencies": { "@babel/runtime": "^7.3.1" }, "peerDependencies": { "react": ">=16.8" } }, "sha512-DSOJTWHD67860I5ojetXdEQRIBvF6YcpNe53j0vn1vp9EUb9N80EiZTxgP+FkDKorWC8PZw052kTF4C1GOivCQ=="], - - "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], - - "ripemd160": ["ripemd160@2.0.3", "", { "dependencies": { "hash-base": "^3.1.2", "inherits": "^2.0.4" } }, "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA=="], - - "roarr": ["roarr@2.15.4", "", { "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" } }, "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="], - - "rollup": ["rollup@4.54.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.54.0", "@rollup/rollup-android-arm64": "4.54.0", "@rollup/rollup-darwin-arm64": "4.54.0", "@rollup/rollup-darwin-x64": "4.54.0", "@rollup/rollup-freebsd-arm64": "4.54.0", "@rollup/rollup-freebsd-x64": "4.54.0", "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", "@rollup/rollup-linux-arm-musleabihf": "4.54.0", "@rollup/rollup-linux-arm64-gnu": "4.54.0", "@rollup/rollup-linux-arm64-musl": "4.54.0", "@rollup/rollup-linux-loong64-gnu": "4.54.0", "@rollup/rollup-linux-ppc64-gnu": "4.54.0", "@rollup/rollup-linux-riscv64-gnu": "4.54.0", "@rollup/rollup-linux-riscv64-musl": "4.54.0", "@rollup/rollup-linux-s390x-gnu": "4.54.0", "@rollup/rollup-linux-x64-gnu": "4.54.0", "@rollup/rollup-linux-x64-musl": "4.54.0", "@rollup/rollup-openharmony-arm64": "4.54.0", "@rollup/rollup-win32-arm64-msvc": "4.54.0", "@rollup/rollup-win32-ia32-msvc": "4.54.0", "@rollup/rollup-win32-x64-gnu": "4.54.0", "@rollup/rollup-win32-x64-msvc": "4.54.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw=="], - - "rollup-plugin-dts": ["rollup-plugin-dts@6.3.0", "", { "dependencies": { "magic-string": "^0.30.21" }, "optionalDependencies": { "@babel/code-frame": "^7.27.1" }, "peerDependencies": { "rollup": "^3.29.4 || ^4", "typescript": "^4.5 || ^5.0" } }, "sha512-d0UrqxYd8KyZ6i3M2Nx7WOMy708qsV/7fTHMHxCMCBOAe3V/U7OMPu5GkX8hC+cmkHhzGnfeYongl1IgiooddA=="], - - "rollup-plugin-esbuild": ["rollup-plugin-esbuild@6.2.1", "", { "dependencies": { "debug": "^4.4.0", "es-module-lexer": "^1.6.0", "get-tsconfig": "^4.10.0", "unplugin-utils": "^0.2.4" }, "peerDependencies": { "esbuild": ">=0.18.0", "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" } }, "sha512-jTNOMGoMRhs0JuueJrJqbW8tOwxumaWYq+V5i+PD+8ecSCVkuX27tGW7BXqDgoULQ55rO7IdNxPcnsWtshz3AA=="], - - "rollup-plugin-postcss": ["rollup-plugin-postcss@4.0.2", "", { "dependencies": { "chalk": "^4.1.0", "concat-with-sourcemaps": "^1.1.0", "cssnano": "^5.0.1", "import-cwd": "^3.0.0", "p-queue": "^6.6.2", "pify": "^5.0.0", "postcss-load-config": "^3.0.0", "postcss-modules": "^4.0.0", "promise.series": "^0.2.0", "resolve": "^1.19.0", "rollup-pluginutils": "^2.8.2", "safe-identifier": "^0.4.2", "style-inject": "^0.3.0" }, "peerDependencies": { "postcss": "8.x" } }, "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w=="], - - "rollup-pluginutils": ["rollup-pluginutils@2.8.2", "", { "dependencies": { "estree-walker": "^0.6.1" } }, "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ=="], - - "rtl-css-js": ["rtl-css-js@1.16.1", "", { "dependencies": { "@babel/runtime": "^7.1.2" } }, "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg=="], - - "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], - - "run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="], - - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - - "run-script-webpack-plugin": ["run-script-webpack-plugin@0.2.3", "", {}, "sha512-GX1JqSNAmtGMAcE3iyLFlnxWpxKBWPNkpac/02w2RF3xynTjA8LWLkFzMzlvATA3c3kARWnT2OrsnvJviB79Lg=="], - - "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], - - "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], - - "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], - - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - - "safe-identifier": ["safe-identifier@0.4.2", "", {}, "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w=="], - - "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], - - "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], - - "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], - - "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - - "sax": ["sax@1.4.3", "", {}, "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ=="], - - "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], - - "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], - - "schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], - - "screenfull": ["screenfull@5.2.0", "", {}, "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA=="], - - "select-hose": ["select-hose@2.0.0", "", {}, "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg=="], - - "selfsigned": ["selfsigned@2.4.1", "", { "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" } }, "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q=="], - - "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], - - "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], - - "send": ["send@0.19.2", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], - - "seq-queue": ["seq-queue@0.0.5", "", {}, "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="], - - "serialize-error": ["serialize-error@8.1.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ=="], - - "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], - - "serve-index": ["serve-index@1.9.1", "", { "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" } }, "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw=="], - - "serve-static": ["serve-static@1.16.3", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], - - "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], - - "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], - - "set-harmonic-interval": ["set-harmonic-interval@1.0.1", "", {}, "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g=="], - - "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], - - "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], - - "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], - - "sha.js": ["sha.js@2.4.12", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.0" }, "bin": { "sha.js": "bin.js" } }, "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w=="], - - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], - - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - - "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], - - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], - - "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], - - "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], - - "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - - "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], - - "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], - - "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], - - "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - - "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], - - "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="], - - "sockjs": ["sockjs@0.3.24", "", { "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ=="], - - "socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="], - - "socks-proxy-agent": ["socks-proxy-agent@7.0.0", "", { "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" } }, "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww=="], - - "sorted-array-functions": ["sorted-array-functions@1.3.0", "", {}, "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA=="], - - "source-list-map": ["source-list-map@2.0.1", "", {}, "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="], - - "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - - "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], - - "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], - - "spdy": ["spdy@4.0.2", "", { "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" } }, "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA=="], - - "spdy-transport": ["spdy-transport@3.0.0", "", { "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", "hpack.js": "^2.1.6", "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" } }, "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw=="], - - "split-ca": ["split-ca@1.0.1", "", {}, "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ=="], - - "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], - - "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], - - "sqlstring": ["sqlstring@2.3.3", "", {}, "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="], - - "ssh2": ["ssh2@1.17.0", "", { "dependencies": { "asn1": "^0.2.6", "bcrypt-pbkdf": "^1.0.2" }, "optionalDependencies": { "cpu-features": "~0.0.10", "nan": "^2.23.0" } }, "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ=="], - - "sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="], - - "stable": ["stable@0.1.8", "", {}, "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="], - - "stack-generator": ["stack-generator@2.0.10", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ=="], - - "stack-trace": ["stack-trace@0.0.10", "", {}, "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="], - - "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], - - "stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="], - - "stacktrace-gps": ["stacktrace-gps@3.1.2", "", { "dependencies": { "source-map": "0.5.6", "stackframe": "^1.3.4" } }, "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ=="], - - "stacktrace-js": ["stacktrace-js@2.0.2", "", { "dependencies": { "error-stack-parser": "^2.0.6", "stack-generator": "^2.0.5", "stacktrace-gps": "^3.0.4" } }, "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg=="], - - "standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="], - - "static-eval": ["static-eval@2.0.2", "", { "dependencies": { "escodegen": "^1.8.1" } }, "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg=="], - - "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - - "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], - - "stoppable": ["stoppable@1.1.0", "", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="], - - "stream-browserify": ["stream-browserify@2.0.2", "", { "dependencies": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" } }, "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg=="], - - "stream-buffers": ["stream-buffers@3.0.3", "", {}, "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw=="], - - "stream-events": ["stream-events@1.0.5", "", { "dependencies": { "stubs": "^3.0.0" } }, "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg=="], - - "stream-http": ["stream-http@2.8.3", "", { "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" } }, "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw=="], - - "stream-shift": ["stream-shift@1.0.3", "", {}, "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="], - - "streamroller": ["streamroller@3.1.5", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "fs-extra": "^8.1.0" } }, "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw=="], - - "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], - - "streamx": ["streamx@2.23.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg=="], - - "strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="], - - "string-hash": ["string-hash@1.1.3", "", {}, "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A=="], - - "string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], - - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="], - - "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], - - "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], - - "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], - - "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], - - "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], - - "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], - - "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - - "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], - - "strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], - - "stubs": ["stubs@3.0.0", "", {}, "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw=="], - - "style-inject": ["style-inject@0.3.0", "", {}, "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw=="], - - "style-loader": ["style-loader@3.3.4", "", { "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w=="], - - "style-to-object": ["style-to-object@0.4.4", "", { "dependencies": { "inline-style-parser": "0.1.1" } }, "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg=="], - - "stylehacks": ["stylehacks@5.1.1", "", { "dependencies": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "peerDependencies": { "postcss": "^8.2.15" } }, "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw=="], - - "stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="], - - "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], - - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - - "svg-parser": ["svg-parser@2.0.4", "", {}, "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="], - - "svgo": ["svgo@2.8.0", "", { "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^4.1.3", "css-tree": "^1.1.3", "csso": "^4.2.0", "picocolors": "^1.0.0", "stable": "^0.1.8" }, "bin": { "svgo": "bin/svgo" } }, "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg=="], - - "swc-loader": ["swc-loader@0.2.6", "", { "dependencies": { "@swc/counter": "^0.1.3" }, "peerDependencies": { "@swc/core": "^1.2.147", "webpack": ">=2" } }, "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg=="], - - "swr": ["swr@2.3.8", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-gaCPRVoMq8WGDcWj9p4YWzCMPHzE0WNl6W8ADIx9c3JBEIdMkJGMzW+uzXvxHMltwcYACr9jP+32H8/hgwMR7w=="], - - "symbol-observable": ["symbol-observable@1.2.0", "", {}, "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="], - - "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], - - "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], - - "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], - - "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], - - "tar-fs": ["tar-fs@2.1.4", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ=="], - - "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], - - "tarn": ["tarn@3.0.2", "", {}, "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ=="], - - "tdigest": ["tdigest@0.1.2", "", { "dependencies": { "bintrees": "1.0.2" } }, "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA=="], - - "teeny-request": ["teeny-request@9.0.0", "", { "dependencies": { "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.9", "stream-events": "^1.0.5", "uuid": "^9.0.0" } }, "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g=="], - - "terser": ["terser@5.44.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw=="], - - "terser-webpack-plugin": ["terser-webpack-plugin@5.3.16", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q=="], - - "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], - - "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], - - "text-hex": ["text-hex@1.0.0", "", {}, "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="], - - "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], - - "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], - - "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], - - "thingies": ["thingies@2.5.0", "", { "peerDependencies": { "tslib": "^2" } }, "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw=="], - - "throttle-debounce": ["throttle-debounce@3.0.1", "", {}, "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg=="], - - "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], - - "through2": ["through2@4.0.2", "", { "dependencies": { "readable-stream": "3" } }, "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw=="], - - "thunky": ["thunky@1.1.0", "", {}, "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="], - - "tildify": ["tildify@2.0.0", "", {}, "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw=="], - - "timers-browserify": ["timers-browserify@2.0.12", "", { "dependencies": { "setimmediate": "^1.0.4" } }, "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ=="], - - "tiny-case": ["tiny-case@1.0.3", "", {}, "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="], - - "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], - - "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], - - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], - - "tldts": ["tldts@7.0.19", "", { "dependencies": { "tldts-core": "^7.0.19" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA=="], - - "tldts-core": ["tldts-core@7.0.19", "", {}, "sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A=="], - - "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], - - "to-arraybuffer": ["to-arraybuffer@1.0.1", "", {}, "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA=="], - - "to-buffer": ["to-buffer@1.2.2", "", { "dependencies": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", "typed-array-buffer": "^1.0.3" } }, "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw=="], - - "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - - "toggle-selection": ["toggle-selection@1.0.6", "", {}, "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="], - - "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], - - "toposort": ["toposort@2.0.2", "", {}, "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="], - - "tosource": ["tosource@2.0.0-alpha.3", "", {}, "sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug=="], - - "tough-cookie": ["tough-cookie@6.0.0", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w=="], - - "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], - - "tree-dump": ["tree-dump@1.1.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA=="], - - "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], - - "triple-beam": ["triple-beam@1.4.1", "", {}, "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg=="], - - "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], - - "tryer": ["tryer@1.0.1", "", {}, "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA=="], - - "ts-algebra": ["ts-algebra@2.0.0", "", {}, "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw=="], - - "ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], - - "ts-easing": ["ts-easing@0.2.0", "", {}, "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="], - - "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], - - "ts-is-present": ["ts-is-present@1.2.2", "", {}, "sha512-cA5MPLWGWYXvnlJb4TamUUx858HVHBsxxdy8l7jxODOLDyGYnQOllob2A2jyDghGa5iJHs2gzFNHvwGJ0ZfR8g=="], - - "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], - - "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], - - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - - "tsscmp": ["tsscmp@1.0.6", "", {}, "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="], - - "tsutils": ["tsutils@3.21.0", "", { "dependencies": { "tslib": "^1.8.1" }, "peerDependencies": { "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA=="], - - "tty-browserify": ["tty-browserify@0.0.0", "", {}, "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw=="], - - "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], - - "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], - - "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - - "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], - - "type-fest": ["type-fest@5.3.1", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg=="], - - "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], - - "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], - - "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], - - "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], - - "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], - - "typed-error": ["typed-error@3.2.2", "", {}, "sha512-Z48LU67/qJ+vyA7lh3ozELqpTp3pvQoY5RtLi5wQ/UGSrEidBhlVSqhjr8B3iqbGpjqAoJYrtSYXWMDtidWGkA=="], - - "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], - - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - - "typescript-json-schema": ["typescript-json-schema@0.67.1", "", { "dependencies": { "@types/json-schema": "^7.0.9", "@types/node": "^18.11.9", "glob": "^7.1.7", "path-equal": "^1.2.5", "safe-stable-stringify": "^2.2.0", "ts-node": "^10.9.1", "typescript": "~5.5.0", "vm2": "^3.10.0", "yargs": "^17.1.1" }, "bin": { "typescript-json-schema": "bin/typescript-json-schema" } }, "sha512-vKTZB/RoYTIBdVP7E7vrgHMCssBuhja91wQy498QIVhvfRimaOgjc98uwAXmZ7mbLUytJmOSbF11wPz+ByQeXg=="], - - "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], - - "uid-safe": ["uid-safe@2.1.5", "", { "dependencies": { "random-bytes": "~1.0.0" } }, "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA=="], - - "uid2": ["uid2@0.0.4", "", {}, "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA=="], - - "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], - - "underscore": ["underscore@1.12.1", "", {}, "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="], - - "undici": ["undici@7.16.0", "", {}, "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g=="], - - "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], - - "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], - - "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="], - - "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.1", "", {}, "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg=="], - - "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.2.0", "", {}, "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ=="], - - "unified": ["unified@10.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "bail": "^2.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^5.0.0" } }, "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q=="], - - "unist-util-generated": ["unist-util-generated@2.0.1", "", {}, "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A=="], - - "unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="], - - "unist-util-position": ["unist-util-position@4.0.4", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg=="], - - "unist-util-stringify-position": ["unist-util-stringify-position@3.0.3", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg=="], - - "unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="], - - "unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="], - - "universal-github-app-jwt": ["universal-github-app-jwt@1.2.0", "", { "dependencies": { "@types/jsonwebtoken": "^9.0.0", "jsonwebtoken": "^9.0.2" } }, "sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g=="], - - "universal-user-agent": ["universal-user-agent@6.0.1", "", {}, "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ=="], - - "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - - "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - - "unplugin-utils": ["unplugin-utils@0.2.5", "", { "dependencies": { "pathe": "^2.0.3", "picomatch": "^4.0.3" } }, "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg=="], - - "until-async": ["until-async@3.0.2", "", {}, "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw=="], - - "upath": ["upath@2.0.1", "", {}, "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w=="], - - "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], - - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - - "uri-template": ["uri-template@2.0.0", "", { "dependencies": { "pct-encode": "~1.0.0" } }, "sha512-r/i44nPoo0ktEZDjx+hxp9PSjQuBBfsd6RgCRuuMqCP0FZEp+YE0SpihThI4UGc5ePqQEFsdyZc7UVlowp+LLw=="], - - "urijs": ["urijs@1.19.11", "", {}, "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ=="], - - "url": ["url@0.11.4", "", { "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" } }, "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg=="], - - "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], - - "urlpattern-polyfill": ["urlpattern-polyfill@8.0.2", "", {}, "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ=="], - - "use-memo-one": ["use-memo-one@1.1.3", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ=="], - - "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], - - "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], - - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - - "utila": ["utila@0.4.0", "", {}, "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA=="], - - "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], - - "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], - - "uvu": ["uvu@0.5.6", "", { "dependencies": { "dequal": "^2.0.0", "diff": "^5.0.0", "kleur": "^4.0.3", "sade": "^1.7.3" }, "bin": { "uvu": "bin.js" } }, "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA=="], - - "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], - - "v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="], - - "validate.io-array": ["validate.io-array@1.0.6", "", {}, "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg=="], - - "validate.io-function": ["validate.io-function@1.0.2", "", {}, "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ=="], - - "validate.io-integer": ["validate.io-integer@1.0.5", "", { "dependencies": { "validate.io-number": "^1.0.3" } }, "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ=="], - - "validate.io-integer-array": ["validate.io-integer-array@1.0.0", "", { "dependencies": { "validate.io-array": "^1.0.3", "validate.io-integer": "^1.0.4" } }, "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA=="], - - "validate.io-number": ["validate.io-number@1.0.3", "", {}, "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg=="], - - "value-or-promise": ["value-or-promise@1.0.11", "", {}, "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg=="], - - "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], - - "verror": ["verror@1.10.0", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw=="], - - "vfile": ["vfile@5.3.7", "", { "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "unist-util-stringify-position": "^3.0.0", "vfile-message": "^3.0.0" } }, "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g=="], - - "vfile-message": ["vfile-message@3.1.4", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^3.0.0" } }, "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw=="], - - "vm-browserify": ["vm-browserify@1.1.2", "", {}, "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="], - - "vm2": ["vm2@3.10.0", "", { "dependencies": { "acorn": "^8.14.1", "acorn-walk": "^8.3.4" }, "bin": { "vm2": "bin/vm2" } }, "sha512-3ggF4Bs0cw4M7Rxn19/Cv3nJi04xrgHwt4uLto+zkcZocaKwP/nKP9wPx6ggN2X0DSXxOOIc63BV1jvES19wXQ=="], - - "w3c-xmlserializer": ["w3c-xmlserializer@4.0.0", "", { "dependencies": { "xml-name-validator": "^4.0.0" } }, "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw=="], - - "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="], - - "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], - - "watchpack": ["watchpack@2.5.0", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA=="], - - "wbuf": ["wbuf@1.7.3", "", { "dependencies": { "minimalistic-assert": "^1.0.0" } }, "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA=="], - - "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], - - "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], - - "webpack": ["webpack@5.104.1", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.4", "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.16", "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA=="], - - "webpack-dev-middleware": ["webpack-dev-middleware@7.4.5", "", { "dependencies": { "colorette": "^2.0.10", "memfs": "^4.43.1", "mime-types": "^3.0.1", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "peerDependencies": { "webpack": "^5.0.0" }, "optionalPeers": ["webpack"] }, "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA=="], - - "webpack-dev-server": ["webpack-dev-server@5.2.2", "", { "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", "@types/express": "^4.17.21", "@types/express-serve-static-core": "^4.17.21", "@types/serve-index": "^1.9.4", "@types/serve-static": "^1.15.5", "@types/sockjs": "^0.3.36", "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.2.1", "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", "express": "^4.21.2", "graceful-fs": "^4.2.6", "http-proxy-middleware": "^2.0.9", "ipaddr.js": "^2.1.0", "launch-editor": "^2.6.1", "open": "^10.0.3", "p-retry": "^6.2.0", "schema-utils": "^4.2.0", "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^7.4.2", "ws": "^8.18.0" }, "peerDependencies": { "webpack": "^5.0.0" }, "optionalPeers": ["webpack"], "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" } }, "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg=="], - - "webpack-node-externals": ["webpack-node-externals@3.0.0", "", {}, "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ=="], - - "webpack-sources": ["webpack-sources@1.4.3", "", { "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" } }, "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ=="], - - "websocket-driver": ["websocket-driver@0.7.4", "", { "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg=="], - - "websocket-extensions": ["websocket-extensions@0.1.4", "", {}, "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="], - - "whatwg-encoding": ["whatwg-encoding@2.0.0", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg=="], - - "whatwg-mimetype": ["whatwg-mimetype@3.0.0", "", {}, "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="], - - "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - - "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], - - "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], - - "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], - - "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], - - "winston": ["winston@3.19.0", "", { "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.9.0" } }, "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA=="], - - "winston-transport": ["winston-transport@4.9.0", "", { "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" } }, "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A=="], - - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - - "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], - - "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], - - "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - - "write-file-atomic": ["write-file-atomic@4.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg=="], - - "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], - - "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="], - - "xml-crypto": ["xml-crypto@3.2.1", "", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "xpath": "0.0.32" } }, "sha512-0GUNbPtQt+PLMsC5HoZRONX+K6NBJEqpXe/lsvrFj0EqfpGPpVfJKGE7a5jCg8s2+Wkrf/2U1G41kIH+zC9eyQ=="], - - "xml-encryption": ["xml-encryption@3.1.0", "", { "dependencies": { "@xmldom/xmldom": "^0.8.5", "escape-html": "^1.0.3", "xpath": "0.0.32" } }, "sha512-PV7qnYpoAMXbf1kvQkqMScLeQpjCMixddAKq9PtqVrho8HnYbBOWNfG0kA4R7zxQDo7w9kiYAyzS/ullAyO55Q=="], - - "xml-name-validator": ["xml-name-validator@4.0.0", "", {}, "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="], - - "xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="], - - "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], - - "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], - - "xpath": ["xpath@0.0.27", "", {}, "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ=="], - - "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], - - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - - "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - - "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], - - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - - "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - - "yauzl": ["yauzl@3.2.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" } }, "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w=="], - - "ylru": ["ylru@1.4.0", "", {}, "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA=="], - - "yml-loader": ["yml-loader@2.1.0", "", { "dependencies": { "js-yaml": "^3.8.3", "loader-utils": "^1.1.0" } }, "sha512-mo42d5FQWlXxpyTEpYywPu1LzK3F69pPPCOB8WKgJi8s+aqaogQP7XnXTjSobbKzzlZ/wXm7kg9CkP4x4ZnVMw=="], - - "yn": ["yn@4.0.0", "", {}, "sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg=="], - - "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - - "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="], - - "yup": ["yup@1.7.1", "", { "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", "toposort": "^2.0.2", "type-fest": "^2.19.0" } }, "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw=="], - - "zen-observable": ["zen-observable@0.10.0", "", {}, "sha512-iI3lT0iojZhKwT5DaFy2Ce42n3yFcLdFyOh01G7H0flMY60P8MJuVFEoJoNwXlmAyQ45GrjL6AcZmmlv8A5rbw=="], - - "zip-stream": ["zip-stream@5.0.2", "", { "dependencies": { "archiver-utils": "^4.0.1", "compress-commons": "^5.0.1", "readable-stream": "^3.6.0" } }, "sha512-LfOdrUvPB8ZoXtvOBz6DlNClfvi//b5d56mSWyJi7XbH/HfhOHfUhOqxhT/rUiR7yiktlunqRo+jY6y/cWC/5g=="], - - "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - - "zod-to-json-schema": ["zod-to-json-schema@3.25.0", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ=="], - - "zod-validation-error": ["zod-validation-error@3.5.4", "", { "peerDependencies": { "zod": "^3.24.4" } }, "sha512-+hEiRIiPobgyuFlEojnqjJnhFvg4r/i3cqgcm67eehZf/WBaK3g6cD02YU9mtdVxZjv8CzCA9n/Rhrs3yAAvAw=="], - - "zstd-codec": ["zstd-codec@0.1.5", "", {}, "sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g=="], - - "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - - "@apidevtools/swagger-parser/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - - "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - - "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - - "@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.2.5", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ=="], - - "@azure/core-xml/fast-xml-parser": ["fast-xml-parser@5.3.3", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA=="], - - "@azure/identity/open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], - - "@azure/msal-node/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - - "@babel/core/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - - "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-define-polyfill-provider/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], - - "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], - - "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/template/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/app-defaults/@backstage/core-components": ["@backstage/core-components@0.18.4", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.7.1", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-full-screen": "^1.1.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-x2dy8CGXclN5sHKIn6CyxCo99Wk245mX3AsrXoHNr2BCRBL4U7Pv62hlbTtAsdyO41+Fzbc33ZXnjQSdpnGwWw=="], - - "@backstage/app-defaults/@backstage/theme": ["@backstage/theme@0.7.1", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-JC2EUqfV198SzNT0B/E7MrnQuR5ML3qCz1FMDNd1qGoXNRBtBsSlPPJMcmuRsz7tM2BN+Vnbr7KkRPNbEnCYkQ=="], - - "@backstage/backend-app-api/cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], - - "@backstage/backend-app-api/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@backstage/backend-common/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@backstage/backend-defaults/cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], - - "@backstage/backend-defaults/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@backstage/backend-openapi-utils/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/backend-openapi-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "@backstage/backend-plugin-api/@backstage/plugin-permission-common": ["@backstage/plugin-permission-common@0.8.4", "", { "dependencies": { "@backstage/config": "^1.3.2", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.1", "cross-fetch": "^4.0.0", "uuid": "^11.0.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-zZSfXadycRCP/YG2Cf4p/hxDU4fhrYDAVneo9PKZMfy3O4ERdtrYehGuOspcak2NkeMmaj2KfsFuWFuWK2xBTQ=="], - - "@backstage/catalog-model/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="], - - "@backstage/cli/@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="], - - "@backstage/config-loader/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "@backstage/frontend-defaults/@backstage/core-components": ["@backstage/core-components@0.18.4", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.7.1", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-full-screen": "^1.1.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-x2dy8CGXclN5sHKIn6CyxCo99Wk245mX3AsrXoHNr2BCRBL4U7Pv62hlbTtAsdyO41+Fzbc33ZXnjQSdpnGwWw=="], - - "@backstage/frontend-test-utils/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/integration/git-url-parse": ["git-url-parse@15.0.0", "", { "dependencies": { "git-up": "^7.0.0" } }, "sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ=="], - - "@backstage/plugin-app/@backstage/core-components": ["@backstage/core-components@0.18.4", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.7.1", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-full-screen": "^1.1.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-x2dy8CGXclN5sHKIn6CyxCo99Wk245mX3AsrXoHNr2BCRBL4U7Pv62hlbTtAsdyO41+Fzbc33ZXnjQSdpnGwWw=="], - - "@backstage/plugin-app/@backstage/theme": ["@backstage/theme@0.7.1", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-JC2EUqfV198SzNT0B/E7MrnQuR5ML3qCz1FMDNd1qGoXNRBtBsSlPPJMcmuRsz7tM2BN+Vnbr7KkRPNbEnCYkQ=="], - - "@backstage/plugin-app-backend/@backstage/backend-common": ["@backstage/backend-common@0.25.0", "", { "dependencies": { "@aws-sdk/abort-controller": "^3.347.0", "@aws-sdk/client-codecommit": "^3.350.0", "@aws-sdk/client-s3": "^3.350.0", "@aws-sdk/credential-providers": "^3.350.0", "@aws-sdk/types": "^3.347.0", "@backstage/backend-dev-utils": "^0.1.5", "@backstage/backend-plugin-api": "^1.0.0", "@backstage/cli-common": "^0.1.14", "@backstage/config": "^1.2.0", "@backstage/config-loader": "^1.9.1", "@backstage/errors": "^1.2.4", "@backstage/integration": "^1.15.0", "@backstage/integration-aws-node": "^0.1.12", "@backstage/plugin-auth-node": "^0.5.2", "@backstage/types": "^1.1.1", "@google-cloud/storage": "^7.0.0", "@keyv/memcache": "^1.3.5", "@keyv/redis": "^2.5.3", "@kubernetes/client-node": "0.20.0", "@manypkg/get-packages": "^1.1.3", "@octokit/rest": "^19.0.3", "@types/cors": "^2.8.6", "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", "@types/webpack-env": "^1.15.2", "archiver": "^7.0.0", "base64-stream": "^1.0.0", "compression": "^1.7.4", "concat-stream": "^2.0.0", "cors": "^2.8.5", "dockerode": "^4.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "git-url-parse": "^14.0.0", "helmet": "^6.0.0", "isomorphic-git": "^1.23.0", "jose": "^5.0.0", "keyv": "^4.5.2", "knex": "^3.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", "luxon": "^3.0.0", "minimatch": "^9.0.0", "minimist": "^1.2.5", "morgan": "^1.10.0", "mysql2": "^3.0.0", "node-fetch": "^2.7.0", "node-forge": "^1.3.1", "p-limit": "^3.1.0", "path-to-regexp": "^8.0.0", "pg": "^8.11.3", "pg-format": "^1.0.4", "raw-body": "^2.4.1", "selfsigned": "^2.0.0", "stoppable": "^1.1.0", "tar": "^6.1.12", "triple-beam": "^1.4.1", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0", "yauzl": "^3.0.0", "yn": "^4.0.0" }, "peerDependencies": { "pg-connection-string": "^2.3.0" }, "optionalPeers": ["pg-connection-string"] }, "sha512-TMQjoZLP80ek/NYBAcFvr8p5fioxuq6rC2Qd9FHXTifTzH9k31yJqmaTUmlJcw4+tz+3h4ss3qCwGGlgfNbGfQ=="], - - "@backstage/plugin-app-backend/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/plugin-app-node/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/plugin-auth-backend/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@backstage/plugin-auth-node/@backstage/backend-common": ["@backstage/backend-common@0.25.0", "", { "dependencies": { "@aws-sdk/abort-controller": "^3.347.0", "@aws-sdk/client-codecommit": "^3.350.0", "@aws-sdk/client-s3": "^3.350.0", "@aws-sdk/credential-providers": "^3.350.0", "@aws-sdk/types": "^3.347.0", "@backstage/backend-dev-utils": "^0.1.5", "@backstage/backend-plugin-api": "^1.0.0", "@backstage/cli-common": "^0.1.14", "@backstage/config": "^1.2.0", "@backstage/config-loader": "^1.9.1", "@backstage/errors": "^1.2.4", "@backstage/integration": "^1.15.0", "@backstage/integration-aws-node": "^0.1.12", "@backstage/plugin-auth-node": "^0.5.2", "@backstage/types": "^1.1.1", "@google-cloud/storage": "^7.0.0", "@keyv/memcache": "^1.3.5", "@keyv/redis": "^2.5.3", "@kubernetes/client-node": "0.20.0", "@manypkg/get-packages": "^1.1.3", "@octokit/rest": "^19.0.3", "@types/cors": "^2.8.6", "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", "@types/webpack-env": "^1.15.2", "archiver": "^7.0.0", "base64-stream": "^1.0.0", "compression": "^1.7.4", "concat-stream": "^2.0.0", "cors": "^2.8.5", "dockerode": "^4.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "git-url-parse": "^14.0.0", "helmet": "^6.0.0", "isomorphic-git": "^1.23.0", "jose": "^5.0.0", "keyv": "^4.5.2", "knex": "^3.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", "luxon": "^3.0.0", "minimatch": "^9.0.0", "minimist": "^1.2.5", "morgan": "^1.10.0", "mysql2": "^3.0.0", "node-fetch": "^2.7.0", "node-forge": "^1.3.1", "p-limit": "^3.1.0", "path-to-regexp": "^8.0.0", "pg": "^8.11.3", "pg-format": "^1.0.4", "raw-body": "^2.4.1", "selfsigned": "^2.0.0", "stoppable": "^1.1.0", "tar": "^6.1.12", "triple-beam": "^1.4.1", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0", "yauzl": "^3.0.0", "yn": "^4.0.0" }, "peerDependencies": { "pg-connection-string": "^2.3.0" }, "optionalPeers": ["pg-connection-string"] }, "sha512-TMQjoZLP80ek/NYBAcFvr8p5fioxuq6rC2Qd9FHXTifTzH9k31yJqmaTUmlJcw4+tz+3h4ss3qCwGGlgfNbGfQ=="], - - "@backstage/plugin-auth-node/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/plugin-catalog/@backstage/core-components": ["@backstage/core-components@0.18.4", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.7.1", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-full-screen": "^1.1.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-x2dy8CGXclN5sHKIn6CyxCo99Wk245mX3AsrXoHNr2BCRBL4U7Pv62hlbTtAsdyO41+Fzbc33ZXnjQSdpnGwWw=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common": ["@backstage/backend-common@0.25.0", "", { "dependencies": { "@aws-sdk/abort-controller": "^3.347.0", "@aws-sdk/client-codecommit": "^3.350.0", "@aws-sdk/client-s3": "^3.350.0", "@aws-sdk/credential-providers": "^3.350.0", "@aws-sdk/types": "^3.347.0", "@backstage/backend-dev-utils": "^0.1.5", "@backstage/backend-plugin-api": "^1.0.0", "@backstage/cli-common": "^0.1.14", "@backstage/config": "^1.2.0", "@backstage/config-loader": "^1.9.1", "@backstage/errors": "^1.2.4", "@backstage/integration": "^1.15.0", "@backstage/integration-aws-node": "^0.1.12", "@backstage/plugin-auth-node": "^0.5.2", "@backstage/types": "^1.1.1", "@google-cloud/storage": "^7.0.0", "@keyv/memcache": "^1.3.5", "@keyv/redis": "^2.5.3", "@kubernetes/client-node": "0.20.0", "@manypkg/get-packages": "^1.1.3", "@octokit/rest": "^19.0.3", "@types/cors": "^2.8.6", "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", "@types/webpack-env": "^1.15.2", "archiver": "^7.0.0", "base64-stream": "^1.0.0", "compression": "^1.7.4", "concat-stream": "^2.0.0", "cors": "^2.8.5", "dockerode": "^4.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "git-url-parse": "^14.0.0", "helmet": "^6.0.0", "isomorphic-git": "^1.23.0", "jose": "^5.0.0", "keyv": "^4.5.2", "knex": "^3.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", "luxon": "^3.0.0", "minimatch": "^9.0.0", "minimist": "^1.2.5", "morgan": "^1.10.0", "mysql2": "^3.0.0", "node-fetch": "^2.7.0", "node-forge": "^1.3.1", "p-limit": "^3.1.0", "path-to-regexp": "^8.0.0", "pg": "^8.11.3", "pg-format": "^1.0.4", "raw-body": "^2.4.1", "selfsigned": "^2.0.0", "stoppable": "^1.1.0", "tar": "^6.1.12", "triple-beam": "^1.4.1", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0", "yauzl": "^3.0.0", "yn": "^4.0.0" }, "peerDependencies": { "pg-connection-string": "^2.3.0" }, "optionalPeers": ["pg-connection-string"] }, "sha512-TMQjoZLP80ek/NYBAcFvr8p5fioxuq6rC2Qd9FHXTifTzH9k31yJqmaTUmlJcw4+tz+3h4ss3qCwGGlgfNbGfQ=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/plugin-catalog-backend/@backstage/plugin-events-node": ["@backstage/plugin-events-node@0.4.18", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/content-type": "^1.1.8", "@types/express": "^4.17.6", "content-type": "^1.0.5", "cross-fetch": "^4.0.0", "express": "^4.22.0", "uri-template": "^2.0.0" } }, "sha512-PHxS5X8r6cI3BglafvLL7tR7OD2axuWqj0myO/Ls58X5ZS8uplmffRuWE59t509E8MBe6fQCyO6epYWVFjvyYg=="], - - "@backstage/plugin-catalog-backend/@backstage/plugin-permission-common": ["@backstage/plugin-permission-common@0.8.4", "", { "dependencies": { "@backstage/config": "^1.3.2", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.1", "cross-fetch": "^4.0.0", "uuid": "^11.0.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-zZSfXadycRCP/YG2Cf4p/hxDU4fhrYDAVneo9PKZMfy3O4ERdtrYehGuOspcak2NkeMmaj2KfsFuWFuWK2xBTQ=="], - - "@backstage/plugin-catalog-backend/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.9.1", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.3.0", "@backstage/config": "^1.3.2", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.2", "@backstage/plugin-permission-common": "^0.8.4", "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-1Wryt2Slja3mJvRpUUjvqI11HFjDF+4cE+VsxWnj7o+GlClGS4EePj1YOlB32W0ImKaSFIr8bB7Z/lHTJ9IckA=="], - - "@backstage/plugin-catalog-backend/git-url-parse": ["git-url-parse@15.0.0", "", { "dependencies": { "git-up": "^7.0.0" } }, "sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components": ["@backstage/core-components@0.17.5", "", { "dependencies": { "@backstage/config": "^1.3.3", "@backstage/core-plugin-api": "^1.10.9", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.6.8", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-rFEeQH46BWx040aIsZ5VBmIgVzILWvQwhlCKRMZj09Yo9eLQnM6B5KTLD2wo5MeohZqwPY2Dmd/y+O8FyjvVVQ=="], - - "@backstage/plugin-catalog-graph/@backstage/frontend-plugin-api": ["@backstage/frontend-plugin-api@0.11.0", "", { "dependencies": { "@backstage/core-components": "^0.17.5", "@backstage/core-plugin-api": "^1.10.9", "@backstage/types": "^1.2.1", "@backstage/version-bridge": "^1.0.11", "@material-ui/core": "^4.12.4", "lodash": "^4.17.21", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-NOQ6c3vjwWKqU6vvbgwSQW0RvbSn1D7kIFut6sctjSkNNWzQ5nULclBap6sPQZsHwXqG+MqDdG46g4po6MRK4A=="], - - "@backstage/plugin-catalog-import/@backstage/core-compat-api": ["@backstage/core-compat-api@0.4.4", "", { "dependencies": { "@backstage/core-plugin-api": "^1.10.9", "@backstage/frontend-plugin-api": "^0.10.4", "@backstage/plugin-catalog-react": "^1.19.1", "@backstage/version-bridge": "^1.0.11", "lodash": "^4.17.21" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-Ub5W9RFnhs4HuAmdYxbhLS8qC+Yq0RNLGFDypNUh5/ZVCPq4wb2j40ADL2gLuSBsqyYYVAsWauDuiFSEQJWalw=="], - - "@backstage/plugin-catalog-import/@backstage/core-components": ["@backstage/core-components@0.17.5", "", { "dependencies": { "@backstage/config": "^1.3.3", "@backstage/core-plugin-api": "^1.10.9", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.6.8", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-rFEeQH46BWx040aIsZ5VBmIgVzILWvQwhlCKRMZj09Yo9eLQnM6B5KTLD2wo5MeohZqwPY2Dmd/y+O8FyjvVVQ=="], - - "@backstage/plugin-catalog-import/@backstage/frontend-plugin-api": ["@backstage/frontend-plugin-api@0.10.4", "", { "dependencies": { "@backstage/core-components": "^0.17.4", "@backstage/core-plugin-api": "^1.10.9", "@backstage/types": "^1.2.1", "@backstage/version-bridge": "^1.0.11", "@material-ui/core": "^4.12.4", "lodash": "^4.17.21", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-nC9IecJFbPkC0G8+GYolX3k0IE9prWelhE5N76zDmlW17niB5w270RZopGbhEOEvRiuZrIJk6iXU5ukFbdw8FQ=="], - - "@backstage/plugin-catalog-import/git-url-parse": ["git-url-parse@15.0.0", "", { "dependencies": { "git-up": "^7.0.0" } }, "sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ=="], - - "@backstage/plugin-catalog-node/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/plugin-catalog-node/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/plugin-catalog-react/@backstage/core-components": ["@backstage/core-components@0.18.4", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.7.1", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-full-screen": "^1.1.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-x2dy8CGXclN5sHKIn6CyxCo99Wk245mX3AsrXoHNr2BCRBL4U7Pv62hlbTtAsdyO41+Fzbc33ZXnjQSdpnGwWw=="], - - "@backstage/plugin-home/@backstage/core-compat-api": ["@backstage/core-compat-api@0.3.6", "", { "dependencies": { "@backstage/core-plugin-api": "^1.10.4", "@backstage/frontend-plugin-api": "^0.9.5", "@backstage/version-bridge": "^1.0.11", "lodash": "^4.17.21" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-ybXU+sYHOrhadhHr3HUrC5xGc1uIAcRafc8qFW8tAbf5jMtEZZW+Yf59p8YvHu8G4r+WEapmAwo5V8pWlSYj/g=="], - - "@backstage/plugin-home/@backstage/core-components": ["@backstage/core-components@0.15.1", "", { "dependencies": { "@backstage/config": "^1.2.0", "@backstage/core-plugin-api": "^1.10.0", "@backstage/errors": "^1.2.4", "@backstage/theme": "^0.6.0", "@backstage/version-bridge": "^1.0.10", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "dagre": "^0.8.5", "linkify-react": "4.1.3", "linkifyjs": "4.1.3", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-Vqll9vyExGln1K+M6FriWKlU1jkpwEg0X6WtxrwxcykdKQNAfiyJwU7K/NuPCUEP80TsbHycOPFHdU+SWygI8A=="], - - "@backstage/plugin-home/@backstage/frontend-plugin-api": ["@backstage/frontend-plugin-api@0.8.0", "", { "dependencies": { "@backstage/core-components": "^0.15.0", "@backstage/core-plugin-api": "^1.9.4", "@backstage/types": "^1.1.1", "@backstage/version-bridge": "^1.0.9", "@material-ui/core": "^4.12.4", "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0", "lodash": "^4.17.21", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4" }, "peerDependencies": { "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-router-dom": "6.0.0-beta.0 || ^6.3.0" } }, "sha512-LpxR2K58XVZPc4IWdsYa2l8JL6R2nX/52WmIs4kaOvLGXqiMWs78Ih+QXoDkPYnAhktygOFfHszyt1zA2y0GxQ=="], - - "@backstage/plugin-home-react/@backstage/core-components": ["@backstage/core-components@0.18.4", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.7.1", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-full-screen": "^1.1.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-x2dy8CGXclN5sHKIn6CyxCo99Wk245mX3AsrXoHNr2BCRBL4U7Pv62hlbTtAsdyO41+Fzbc33ZXnjQSdpnGwWw=="], - - "@backstage/plugin-home-react/@rjsf/utils": ["@rjsf/utils@5.24.13", "", { "dependencies": { "json-schema-merge-allof": "^0.8.1", "jsonpointer": "^5.0.1", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "react-is": "^18.2.0" }, "peerDependencies": { "react": "^16.14.0 || >=17" } }, "sha512-rNF8tDxIwTtXzz5O/U23QU73nlhgQNYJ+Sv5BAwQOIyhIE2Z3S5tUiSVMwZHt0julkv/Ryfwi+qsD4FiE5rOuw=="], - - "@backstage/plugin-permission-node/@backstage/backend-common": ["@backstage/backend-common@0.25.0", "", { "dependencies": { "@aws-sdk/abort-controller": "^3.347.0", "@aws-sdk/client-codecommit": "^3.350.0", "@aws-sdk/client-s3": "^3.350.0", "@aws-sdk/credential-providers": "^3.350.0", "@aws-sdk/types": "^3.347.0", "@backstage/backend-dev-utils": "^0.1.5", "@backstage/backend-plugin-api": "^1.0.0", "@backstage/cli-common": "^0.1.14", "@backstage/config": "^1.2.0", "@backstage/config-loader": "^1.9.1", "@backstage/errors": "^1.2.4", "@backstage/integration": "^1.15.0", "@backstage/integration-aws-node": "^0.1.12", "@backstage/plugin-auth-node": "^0.5.2", "@backstage/types": "^1.1.1", "@google-cloud/storage": "^7.0.0", "@keyv/memcache": "^1.3.5", "@keyv/redis": "^2.5.3", "@kubernetes/client-node": "0.20.0", "@manypkg/get-packages": "^1.1.3", "@octokit/rest": "^19.0.3", "@types/cors": "^2.8.6", "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", "@types/webpack-env": "^1.15.2", "archiver": "^7.0.0", "base64-stream": "^1.0.0", "compression": "^1.7.4", "concat-stream": "^2.0.0", "cors": "^2.8.5", "dockerode": "^4.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "git-url-parse": "^14.0.0", "helmet": "^6.0.0", "isomorphic-git": "^1.23.0", "jose": "^5.0.0", "keyv": "^4.5.2", "knex": "^3.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", "luxon": "^3.0.0", "minimatch": "^9.0.0", "minimist": "^1.2.5", "morgan": "^1.10.0", "mysql2": "^3.0.0", "node-fetch": "^2.7.0", "node-forge": "^1.3.1", "p-limit": "^3.1.0", "path-to-regexp": "^8.0.0", "pg": "^8.11.3", "pg-format": "^1.0.4", "raw-body": "^2.4.1", "selfsigned": "^2.0.0", "stoppable": "^1.1.0", "tar": "^6.1.12", "triple-beam": "^1.4.1", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0", "yauzl": "^3.0.0", "yn": "^4.0.0" }, "peerDependencies": { "pg-connection-string": "^2.3.0" }, "optionalPeers": ["pg-connection-string"] }, "sha512-TMQjoZLP80ek/NYBAcFvr8p5fioxuq6rC2Qd9FHXTifTzH9k31yJqmaTUmlJcw4+tz+3h4ss3qCwGGlgfNbGfQ=="], - - "@backstage/plugin-permission-node/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/plugin-permission-node/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-permission-node/@backstage/plugin-permission-common": ["@backstage/plugin-permission-common@0.8.4", "", { "dependencies": { "@backstage/config": "^1.3.2", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.1", "cross-fetch": "^4.0.0", "uuid": "^11.0.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-zZSfXadycRCP/YG2Cf4p/hxDU4fhrYDAVneo9PKZMfy3O4ERdtrYehGuOspcak2NkeMmaj2KfsFuWFuWK2xBTQ=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common": ["@backstage/backend-common@0.25.0", "", { "dependencies": { "@aws-sdk/abort-controller": "^3.347.0", "@aws-sdk/client-codecommit": "^3.350.0", "@aws-sdk/client-s3": "^3.350.0", "@aws-sdk/credential-providers": "^3.350.0", "@aws-sdk/types": "^3.347.0", "@backstage/backend-dev-utils": "^0.1.5", "@backstage/backend-plugin-api": "^1.0.0", "@backstage/cli-common": "^0.1.14", "@backstage/config": "^1.2.0", "@backstage/config-loader": "^1.9.1", "@backstage/errors": "^1.2.4", "@backstage/integration": "^1.15.0", "@backstage/integration-aws-node": "^0.1.12", "@backstage/plugin-auth-node": "^0.5.2", "@backstage/types": "^1.1.1", "@google-cloud/storage": "^7.0.0", "@keyv/memcache": "^1.3.5", "@keyv/redis": "^2.5.3", "@kubernetes/client-node": "0.20.0", "@manypkg/get-packages": "^1.1.3", "@octokit/rest": "^19.0.3", "@types/cors": "^2.8.6", "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/luxon": "^3.0.0", "@types/webpack-env": "^1.15.2", "archiver": "^7.0.0", "base64-stream": "^1.0.0", "compression": "^1.7.4", "concat-stream": "^2.0.0", "cors": "^2.8.5", "dockerode": "^4.0.0", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "^11.2.0", "git-url-parse": "^14.0.0", "helmet": "^6.0.0", "isomorphic-git": "^1.23.0", "jose": "^5.0.0", "keyv": "^4.5.2", "knex": "^3.0.0", "lodash": "^4.17.21", "logform": "^2.3.2", "luxon": "^3.0.0", "minimatch": "^9.0.0", "minimist": "^1.2.5", "morgan": "^1.10.0", "mysql2": "^3.0.0", "node-fetch": "^2.7.0", "node-forge": "^1.3.1", "p-limit": "^3.1.0", "path-to-regexp": "^8.0.0", "pg": "^8.11.3", "pg-format": "^1.0.4", "raw-body": "^2.4.1", "selfsigned": "^2.0.0", "stoppable": "^1.1.0", "tar": "^6.1.12", "triple-beam": "^1.4.1", "uuid": "^9.0.0", "winston": "^3.2.1", "winston-transport": "^4.5.0", "yauzl": "^3.0.0", "yn": "^4.0.0" }, "peerDependencies": { "pg-connection-string": "^2.3.0" }, "optionalPeers": ["pg-connection-string"] }, "sha512-TMQjoZLP80ek/NYBAcFvr8p5fioxuq6rC2Qd9FHXTifTzH9k31yJqmaTUmlJcw4+tz+3h4ss3qCwGGlgfNbGfQ=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/plugin-proxy-node/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/plugin-search/@backstage/core-components": ["@backstage/core-components@0.18.4", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.7.1", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-full-screen": "^1.1.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-x2dy8CGXclN5sHKIn6CyxCo99Wk245mX3AsrXoHNr2BCRBL4U7Pv62hlbTtAsdyO41+Fzbc33ZXnjQSdpnGwWw=="], - - "@backstage/plugin-search-backend-module-catalog/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/plugin-search-backend-node/@backstage/backend-plugin-api": ["@backstage/backend-plugin-api@1.6.0", "", { "dependencies": { "@backstage/cli-common": "^0.1.16", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@backstage/plugin-permission-node": "^0.10.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/json-schema": "^7.0.6", "@types/luxon": "^3.0.0", "json-schema": "^0.4.0", "knex": "^3.0.0", "luxon": "^3.0.0", "zod": "^3.22.4" } }, "sha512-Zkm/YG0qAC+sifpFu487y8e+8Ft+IZJxZwsRLyeLBLjwAkTNNvO25HvNKYSve3KzpTEca7So3zx146zV+lA5dA=="], - - "@backstage/plugin-search-react/@backstage/core-components": ["@backstage/core-components@0.18.4", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.7.1", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-full-screen": "^1.1.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-x2dy8CGXclN5sHKIn6CyxCo99Wk245mX3AsrXoHNr2BCRBL4U7Pv62hlbTtAsdyO41+Fzbc33ZXnjQSdpnGwWw=="], - - "@backstage/plugin-search-react/@backstage/theme": ["@backstage/theme@0.7.1", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-JC2EUqfV198SzNT0B/E7MrnQuR5ML3qCz1FMDNd1qGoXNRBtBsSlPPJMcmuRsz7tM2BN+Vnbr7KkRPNbEnCYkQ=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components": ["@backstage/core-components@0.18.4", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/core-plugin-api": "^1.12.1", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.7.1", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.3.2", "linkifyjs": "4.3.2", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-full-screen": "^1.1.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-x2dy8CGXclN5sHKIn6CyxCo99Wk245mX3AsrXoHNr2BCRBL4U7Pv62hlbTtAsdyO41+Fzbc33ZXnjQSdpnGwWw=="], - - "@backstage/test-utils/@backstage/theme": ["@backstage/theme@0.7.1", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-JC2EUqfV198SzNT0B/E7MrnQuR5ML3qCz1FMDNd1qGoXNRBtBsSlPPJMcmuRsz7tM2BN+Vnbr7KkRPNbEnCYkQ=="], - - "@backstage/test-utils/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/ui/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], - - "@davidzemon/passport-okta-oauth/pkginfo": ["pkginfo@0.4.1", "", {}, "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ=="], - - "@davidzemon/passport-okta-oauth/uid2": ["uid2@1.0.0", "", {}, "sha512-+I6aJUv63YAcY9n4mQreLUt0d4lvwkkopDNmpomkAUz0fAkEMV9pRWxN0EjhW1YfRhcuyHg2v3mwddCDW1+LFQ=="], - - "@emotion/babel-plugin/@emotion/hash": ["@emotion/hash@0.9.2", "", {}, "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="], - - "@emotion/babel-plugin/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], - - "@emotion/babel-plugin/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - - "@emotion/babel-plugin/stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], - - "@emotion/cache/stylis": ["stylis@4.2.0", "", {}, "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="], - - "@emotion/serialize/@emotion/hash": ["@emotion/hash@0.9.2", "", {}, "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="], - - "@eslint/eslintrc/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "@google-cloud/storage/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - - "@graphql-tools/merge/@graphql-tools/utils": ["@graphql-tools/utils@8.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg=="], - - "@graphql-tools/schema/@graphql-tools/utils": ["@graphql-tools/utils@8.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg=="], - - "@grpc/grpc-js/@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], - - "@happy-dom/global-registrator/happy-dom": ["happy-dom@20.0.11", "", { "dependencies": { "@types/node": "^20.0.0", "@types/whatwg-mimetype": "^3.0.2", "whatwg-mimetype": "^3.0.0" } }, "sha512-QsCdAUHAmiDeKeaNojb1OHOPF7NjcWPBR7obdu3NwH2a/oyQaLg5d0aaCy/9My6CdPChYF07dvz5chaXBGaD4g=="], - - "@httptoolkit/subscriptions-transport-ws/eventemitter3": ["eventemitter3@3.1.2", "", {}, "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="], - - "@httptoolkit/websocket-stream/duplexify": ["duplexify@3.7.1", "", { "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g=="], - - "@httptoolkit/websocket-stream/isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], - - "@humanwhocodes/config-array/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "@inquirer/core/cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="], - - "@inquirer/core/mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="], - - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - - "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], - - "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - - "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], - - "@istanbuljs/load-nyc-config/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], - - "@istanbuljs/load-nyc-config/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], - - "@jest/create-cache-key-function/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], - - "@jest/pattern/jest-regex-util": ["jest-regex-util@30.0.1", "", {}, "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="], - - "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], - - "@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], - - "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], - - "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], - - "@material-table/core/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], - - "@material-ui/styles/csstype": ["csstype@2.6.21", "", {}, "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="], - - "@material-ui/system/csstype": ["csstype@2.6.21", "", {}, "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="], - - "@module-federation/bridge-react-webpack-plugin/semver": ["semver@7.6.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], - - "@module-federation/data-prefetch/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "@module-federation/dts-plugin/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], - - "@module-federation/dts-plugin/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "@module-federation/dts-plugin/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], - - "@module-federation/managers/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "@module-federation/manifest/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], - - "@module-federation/third-party-dts-extractor/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "@module-federation/third-party-dts-extractor/resolve": ["resolve@1.22.8", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="], - - "@mui/material/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "@mui/material/react-is": ["react-is@19.2.3", "", {}, "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA=="], - - "@mui/system/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "@mui/utils/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "@mui/utils/react-is": ["react-is@19.2.3", "", {}, "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA=="], - - "@node-saml/passport-saml/passport": ["passport@0.6.0", "", { "dependencies": { "passport-strategy": "1.x.x", "pause": "0.0.1", "utils-merge": "^1.0.1" } }, "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug=="], - - "@octokit/auth-app/lru-cache": ["lru-cache@9.1.2", "", {}, "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ=="], - - "@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@10.0.0", "", { "dependencies": { "@octokit/openapi-types": "^18.0.0" } }, "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg=="], - - "@pmmmwh/react-refresh-webpack-plugin/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], - - "@pmmmwh/react-refresh-webpack-plugin/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], - - "@react-aria/focus/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "@react-aria/utils/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "@rjsf/utils/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], - - "@rjsf/validator-ajv8/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "@rollup/plugin-commonjs/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], - - "@rollup/plugin-node-resolve/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], - - "@smithy/abort-controller/@smithy/types": ["@smithy/types@1.2.0", "", { "dependencies": { "tslib": "^2.5.0" } }, "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA=="], - - "@smithy/node-http-handler/@smithy/abort-controller": ["@smithy/abort-controller@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw=="], - - "@smithy/util-waiter/@smithy/abort-controller": ["@smithy/abort-controller@4.2.7", "", { "dependencies": { "@smithy/types": "^4.11.0", "tslib": "^2.6.2" } }, "sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw=="], - - "@sucrase/webpack-loader/loader-utils": ["loader-utils@1.4.2", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } }, "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg=="], - - "@svgr/rollup/@rollup/pluginutils": ["@rollup/pluginutils@4.2.1", "", { "dependencies": { "estree-walker": "^2.0.1", "picomatch": "^2.2.2" } }, "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ=="], - - "@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@testing-library/dom/aria-query": ["aria-query@5.1.3", "", { "dependencies": { "deep-equal": "^2.0.5" } }, "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ=="], - - "@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@types/request/form-data": ["form-data@2.5.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="], - - "@types/ssh2/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], - - "@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.50.1", "", {}, "sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA=="], - - "@typespec/ts-http-runtime/http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], - - "@typespec/ts-http-runtime/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "@yarnpkg/parsers/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], - - "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - - "ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - - "ajv-draft-04/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], - - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "archiver/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "archiver-utils/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], - - "archiver-utils/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "asn1.js/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], - - "assert/util": ["util@0.10.4", "", { "dependencies": { "inherits": "2.0.3" } }, "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A=="], - - "babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], - - "babel-plugin-macros/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], - - "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "basic-auth/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - - "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], - - "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - - "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "clean-css/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "codeowners-utils/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], - - "codeowners-utils/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - - "color/color-convert": ["color-convert@3.1.3", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg=="], - - "color-string/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], - - "compress-commons/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "compressible/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - - "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "concat-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "concat-with-sourcemaps/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "connect/finalhandler": ["finalhandler@1.1.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="], - - "cookie-parser/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - - "cookie-parser/cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="], - - "cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], - - "crc32-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "create-ecdh/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], - - "cron/@types/luxon": ["@types/luxon@3.4.2", "", {}, "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA=="], - - "cron/luxon": ["luxon@3.5.0", "", {}, "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ=="], - - "css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "cssnano/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], - - "cssstyle/cssom": ["cssom@0.3.8", "", {}, "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="], - - "data-urls/whatwg-url": ["whatwg-url@11.0.0", "", { "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" } }, "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ=="], - - "decode-named-character-reference/character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], - - "deep-equal/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - - "defaults/clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], - - "detect-port-alt/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "diffie-hellman/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], - - "docker-modem/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "dockerode/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], - - "dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], - - "duplexify/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "elliptic/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], - - "es-get-iterator/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - - "esbuild-loader/esbuild": ["esbuild@0.27.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.2", "@esbuild/android-arm": "0.27.2", "@esbuild/android-arm64": "0.27.2", "@esbuild/android-x64": "0.27.2", "@esbuild/darwin-arm64": "0.27.2", "@esbuild/darwin-x64": "0.27.2", "@esbuild/freebsd-arm64": "0.27.2", "@esbuild/freebsd-x64": "0.27.2", "@esbuild/linux-arm": "0.27.2", "@esbuild/linux-arm64": "0.27.2", "@esbuild/linux-ia32": "0.27.2", "@esbuild/linux-loong64": "0.27.2", "@esbuild/linux-mips64el": "0.27.2", "@esbuild/linux-ppc64": "0.27.2", "@esbuild/linux-riscv64": "0.27.2", "@esbuild/linux-s390x": "0.27.2", "@esbuild/linux-x64": "0.27.2", "@esbuild/netbsd-arm64": "0.27.2", "@esbuild/netbsd-x64": "0.27.2", "@esbuild/openbsd-arm64": "0.27.2", "@esbuild/openbsd-x64": "0.27.2", "@esbuild/openharmony-arm64": "0.27.2", "@esbuild/sunos-x64": "0.27.2", "@esbuild/win32-arm64": "0.27.2", "@esbuild/win32-ia32": "0.27.2", "@esbuild/win32-x64": "0.27.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw=="], - - "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "eslint/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "eslint-formatter-friendly/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], - - "eslint-formatter-friendly/strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], - - "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-import-resolver-node/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], - - "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-plugin-deprecation/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="], - - "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - - "eslint-plugin-import/doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], - - "eslint-plugin-import/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "eslint-plugin-jest/@typescript-eslint/utils": ["@typescript-eslint/utils@8.50.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.50.1", "@typescript-eslint/types": "8.50.1", "@typescript-eslint/typescript-estree": "8.50.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ=="], - - "eslint-plugin-jsx-a11y/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "eslint-plugin-react/doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], - - "eslint-plugin-react/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "eslint-webpack-plugin/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], - - "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - - "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - - "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "express/path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], - - "express-openapi-validator/@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@14.2.1", "", { "dependencies": { "js-yaml": "^4.1.0" }, "peerDependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg=="], - - "express-openapi-validator/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "express-openapi-validator/ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], - - "express-openapi-validator/media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], - - "express-openapi-validator/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], - - "express-session/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - - "express-session/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "fork-ts-checker-webpack-plugin/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "fork-ts-checker-webpack-plugin/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], - - "fork-ts-checker-webpack-plugin/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], - - "fork-ts-checker-webpack-plugin/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - - "fork-ts-checker-webpack-plugin/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - - "gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "gaxios/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "generic-names/loader-utils": ["loader-utils@3.3.1", "", {}, "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg=="], - - "glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "global-agent/serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], - - "global-prefix/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], - - "globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - - "google-gax/object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], - - "google-gax/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "graphql-subscriptions/graphql": ["graphql@15.10.1", "", {}, "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg=="], - - "handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "hastscript/comma-separated-tokens": ["comma-separated-tokens@1.0.8", "", {}, "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="], - - "hastscript/property-information": ["property-information@5.6.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA=="], - - "hastscript/space-separated-tokens": ["space-separated-tokens@1.1.5", "", {}, "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="], - - "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - - "html-minifier-terser/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], - - "htmlparser2/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], - - "http-assert/deep-equal": ["deep-equal@1.0.1", "", {}, "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw=="], - - "http-assert/http-errors": ["http-errors@1.8.1", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" } }, "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g=="], - - "ignore-walk/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], - - "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - - "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], - - "isomorphic-git/pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], - - "isomorphic-git/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - - "istanbul-lib-source-maps/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "jest-config/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - - "jest-message-util/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "jest-resolve/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], - - "jest-runner/source-map-support": ["source-map-support@0.5.13", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w=="], - - "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - - "jsdom/tough-cookie": ["tough-cookie@4.1.4", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag=="], - - "jsdom/whatwg-url": ["whatwg-url@11.0.0", "", { "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" } }, "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ=="], - - "jsonpath/esprima": ["esprima@1.2.2", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A=="], - - "knex/colorette": ["colorette@2.0.19", "", {}, "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="], - - "knex/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], - - "knex/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], - - "knex/pg-connection-string": ["pg-connection-string@2.6.2", "", {}, "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA=="], - - "knip/zod": ["zod@4.2.1", "", {}, "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw=="], - - "koa/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], - - "koa/http-errors": ["http-errors@1.6.3", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", "statuses": ">= 1.4.0 < 2" } }, "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A=="], - - "koa/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], - - "md5.js/hash-base": ["hash-base@3.1.2", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.1" } }, "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg=="], - - "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], - - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "miller-rabin/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], - - "mini-css-extract-plugin/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], - - "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - - "mockttp/cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], - - "mockttp/graphql": ["graphql@15.10.1", "", {}, "sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg=="], - - "mockttp/isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], - - "mockttp/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], - - "mockttp/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - - "morgan/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "morgan/on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="], - - "multer/mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], - - "ndjson/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "ndjson/split2": ["split2@3.2.2", "", { "dependencies": { "readable-stream": "^3.0.0" } }, "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg=="], - - "node-libs-browser/buffer": ["buffer@4.9.2", "", { "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" } }, "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="], - - "node-libs-browser/util": ["util@0.11.1", "", { "dependencies": { "inherits": "2.0.3" } }, "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ=="], - - "npm-packlist/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], - - "openid-client/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], - - "pac-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "pac-proxy-agent/http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], - - "pac-proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - - "pac-proxy-agent/socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], - - "parse-json/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], - - "passport-oauth1/oauth": ["oauth@0.9.15", "", {}, "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA=="], - - "passport-onelogin-oauth/uid2": ["uid2@0.0.3", "", {}, "sha512-5gSP1liv10Gjp8cMEnFd6shzkL/D6W1uhXSFNCxDC+YI8+L8wkCYCbJ7n77Ezb4wE/xzMogecE+DtamEe9PZjg=="], - - "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - - "path-scurry/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - - "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], - - "pkg-up/find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], - - "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], - - "postcss-calc/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], - - "postcss-load-config/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], - - "postcss-merge-rules/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], - - "postcss-minify-selectors/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], - - "postcss-unique-selectors/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], - - "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], - - "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - - "proxy-addr/ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], - - "psl/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "public-encrypt/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], - - "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - - "rc-util/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], - - "react-dev-utils/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "react-dev-utils/fork-ts-checker-webpack-plugin": ["fork-ts-checker-webpack-plugin@6.5.3", "", { "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", "chalk": "^4.1.0", "chokidar": "^3.4.2", "cosmiconfig": "^6.0.0", "deepmerge": "^4.2.2", "fs-extra": "^9.0.0", "glob": "^7.1.6", "memfs": "^3.1.2", "minimatch": "^3.0.4", "schema-utils": "2.7.0", "semver": "^7.3.2", "tapable": "^1.0.0" }, "peerDependencies": { "eslint": ">= 6", "typescript": ">= 2.7", "vue-template-compiler": "*", "webpack": ">= 4" }, "optionalPeers": ["eslint", "vue-template-compiler"] }, "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ=="], - - "react-dev-utils/loader-utils": ["loader-utils@3.3.1", "", {}, "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg=="], - - "react-draggable/clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - - "react-markdown/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], - - "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], - - "read-yaml-file/pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], - - "read-yaml-file/strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], - - "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - - "readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - - "readdir-glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], - - "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "rechoir/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], - - "recursive-readdir/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "refractor/prismjs": ["prismjs@1.27.0", "", {}, "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="], - - "replace-in-file/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], - - "request/form-data": ["form-data@2.3.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="], - - "request/qs": ["qs@6.5.3", "", {}, "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="], - - "request/tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], - - "request/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], - - "resolve-dir/global-modules": ["global-modules@1.0.0", "", { "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", "resolve-dir": "^1.0.0" } }, "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg=="], - - "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - - "ripemd160/hash-base": ["hash-base@3.1.2", "", { "dependencies": { "inherits": "^2.0.4", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.1" } }, "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg=="], - - "rollup-plugin-dts/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "rollup-plugin-postcss/resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], - - "rollup-pluginutils/estree-walker": ["estree-walker@0.6.1", "", {}, "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="], - - "safe-array-concat/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - - "safe-push-apply/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - - "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], - - "serialize-error/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - - "serve-index/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], - - "serve-index/http-errors": ["http-errors@1.6.3", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", "statuses": ">= 1.4.0 < 2" } }, "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A=="], - - "sockjs/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - - "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "spdy-transport/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], - - "stacktrace-gps/source-map": ["source-map@0.5.6", "", {}, "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA=="], - - "static-eval/escodegen": ["escodegen@1.14.3", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw=="], - - "streamroller/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], - - "string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "stylehacks/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], - - "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], - - "svgo/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], - - "tar-fs/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], - - "tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], - - "teeny-request/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - - "terser-webpack-plugin/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], - - "terser-webpack-plugin/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], - - "test-exclude/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "through2/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "to-buffer/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - - "ts-node/diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], - - "ts-node/yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], - - "tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], - - "tsconfig-paths/strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], - - "tsutils/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - - "typescript-json-schema/@types/node": ["@types/node@18.19.130", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg=="], - - "typescript-json-schema/typescript": ["typescript@5.5.4", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q=="], - - "unified/is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], - - "uri-js/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "uvu/kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], - - "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], - - "webpack/es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="], - - "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], - - "webpack/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], - - "webpack/webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="], - - "webpack-dev-middleware/memfs": ["memfs@4.51.1", "", { "dependencies": { "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", "glob-to-regex.js": "^1.0.1", "thingies": "^2.5.0", "tree-dump": "^1.0.3", "tslib": "^2.0.0" } }, "sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ=="], - - "webpack-dev-middleware/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], - - "webpack-dev-middleware/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], - - "webpack-dev-server/open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], - - "webpack-dev-server/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], - - "webpack-sources/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], - - "whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], - - "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - - "winston/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "winston-transport/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - - "wsl-utils/is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], - - "xml-crypto/xpath": ["xpath@0.0.32", "", {}, "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw=="], - - "xml-encryption/xpath": ["xpath@0.0.32", "", {}, "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw=="], - - "xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], - - "yml-loader/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], - - "yml-loader/loader-utils": ["loader-utils@1.4.2", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } }, "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg=="], - - "yup/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], - - "zip-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], - - "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], - - "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], - - "@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.1.2", "", {}, "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ=="], - - "@azure/core-xml/fast-xml-parser/strnum": ["strnum@2.1.2", "", {}, "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ=="], - - "@azure/identity/open/define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], - - "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - - "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], - - "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], - - "@backstage/app-defaults/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/app-defaults/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/app-defaults/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/backend-openapi-utils/@backstage/backend-plugin-api/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/backend-openapi-utils/@backstage/backend-plugin-api/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "@backstage/cli/@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "@backstage/cli/@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@backstage/cli/@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@backstage/cli/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "@backstage/frontend-defaults/@backstage/core-components/@backstage/theme": ["@backstage/theme@0.7.1", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-JC2EUqfV198SzNT0B/E7MrnQuR5ML3qCz1FMDNd1qGoXNRBtBsSlPPJMcmuRsz7tM2BN+Vnbr7KkRPNbEnCYkQ=="], - - "@backstage/frontend-defaults/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/frontend-defaults/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/frontend-defaults/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/frontend-test-utils/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@backstage/plugin-app-backend/@backstage/backend-plugin-api/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-app-backend/@backstage/backend-plugin-api/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/plugin-app-node/@backstage/backend-plugin-api/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-app-node/@backstage/backend-plugin-api/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/plugin-app/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/plugin-app/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/plugin-app/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@backstage/plugin-auth-node/@backstage/backend-plugin-api/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-auth-node/@backstage/backend-plugin-api/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/git-url-parse": ["git-url-parse@14.1.0", "", { "dependencies": { "git-up": "^7.0.0" } }, "sha512-8xg65dTxGHST3+zGpycMMFZcoTzAdZ2dOtu4vmgIfkTFnVHBxHMzBC2L1k8To7EmrSiHesT8JgPLT91VKw1B5g=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-plugin-api/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-plugin-api/@backstage/plugin-permission-common": ["@backstage/plugin-permission-common@0.9.3", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "cross-fetch": "^4.0.0", "uuid": "^11.0.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-QB9HtU4DlKyWaQFJvwiiURej1GYeMn4fB38lsVmvHuFTxraMIwEgoHjSjzdCFBBItrOUl4FILaaIZBtJGei9vA=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-plugin-api/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/plugin-catalog-backend/@backstage/plugin-permission-node/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components/@backstage/theme": ["@backstage/theme@0.6.8", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-hNUoOjirVIVht6GbDFt6vEej4hA7Kq3trJmyWhKuAKndPD+azjhzMOnGM7Rzj5qIkJeCNB6qcC89+NV6no1HzA=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/plugin-catalog-import/@backstage/core-components/@backstage/theme": ["@backstage/theme@0.6.8", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-hNUoOjirVIVht6GbDFt6vEej4hA7Kq3trJmyWhKuAKndPD+azjhzMOnGM7Rzj5qIkJeCNB6qcC89+NV6no1HzA=="], - - "@backstage/plugin-catalog-import/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/plugin-catalog-import/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/plugin-catalog-import/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/plugin-catalog-node/@backstage/backend-plugin-api/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-catalog-node/@backstage/plugin-permission-node/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-catalog-react/@backstage/core-components/@backstage/theme": ["@backstage/theme@0.7.1", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-JC2EUqfV198SzNT0B/E7MrnQuR5ML3qCz1FMDNd1qGoXNRBtBsSlPPJMcmuRsz7tM2BN+Vnbr7KkRPNbEnCYkQ=="], - - "@backstage/plugin-catalog-react/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/plugin-catalog-react/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/plugin-catalog-react/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/plugin-catalog/@backstage/core-components/@backstage/theme": ["@backstage/theme@0.7.1", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-JC2EUqfV198SzNT0B/E7MrnQuR5ML3qCz1FMDNd1qGoXNRBtBsSlPPJMcmuRsz7tM2BN+Vnbr7KkRPNbEnCYkQ=="], - - "@backstage/plugin-catalog/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/plugin-catalog/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/plugin-catalog/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/plugin-home-react/@backstage/core-components/@backstage/theme": ["@backstage/theme@0.7.1", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-JC2EUqfV198SzNT0B/E7MrnQuR5ML3qCz1FMDNd1qGoXNRBtBsSlPPJMcmuRsz7tM2BN+Vnbr7KkRPNbEnCYkQ=="], - - "@backstage/plugin-home-react/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/plugin-home-react/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/plugin-home-react/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/plugin-home-react/@rjsf/utils/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], - - "@backstage/plugin-home/@backstage/core-compat-api/@backstage/frontend-plugin-api": ["@backstage/frontend-plugin-api@0.9.5", "", { "dependencies": { "@backstage/core-components": "^0.16.4", "@backstage/core-plugin-api": "^1.10.4", "@backstage/types": "^1.2.1", "@backstage/version-bridge": "^1.0.11", "@material-ui/core": "^4.12.4", "lodash": "^4.17.21", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-CtKX7thcCXnyYxWKjXhZttUAuS5VQv8r9u3NJpYJ8rbpqMJzchi00UvADR9dygdJWXVfMPM7k2en6ZHkwhjlZQ=="], - - "@backstage/plugin-home/@backstage/core-components/@backstage/theme": ["@backstage/theme@0.6.8", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-hNUoOjirVIVht6GbDFt6vEej4hA7Kq3trJmyWhKuAKndPD+azjhzMOnGM7Rzj5qIkJeCNB6qcC89+NV6no1HzA=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.5.6", "", { "dependencies": { "@backstage/backend-common": "^0.25.0", "@backstage/backend-plugin-api": "^1.1.1", "@backstage/catalog-client": "^1.9.1", "@backstage/catalog-model": "^1.7.3", "@backstage/config": "^1.3.2", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.1", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.17.1", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "winston": "^3.2.1", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-C3hI7gB0hQwc/NORjZYDB368UTbZe1g2md8LHfTLeIeuyoZyFGAODKZa0XCwLFAX99awttkVeuOjffNLR295Sw=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@backstage/plugin-permission-node/@backstage/backend-plugin-api/@backstage/plugin-permission-common": ["@backstage/plugin-permission-common@0.9.3", "", { "dependencies": { "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "cross-fetch": "^4.0.0", "uuid": "^11.0.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-QB9HtU4DlKyWaQFJvwiiURej1GYeMn4fB38lsVmvHuFTxraMIwEgoHjSjzdCFBBItrOUl4FILaaIZBtJGei9vA=="], - - "@backstage/plugin-permission-node/@backstage/backend-plugin-api/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-plugin-api/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-plugin-api/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/plugin-proxy-node/@backstage/backend-plugin-api/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-proxy-node/@backstage/backend-plugin-api/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/plugin-search-backend-module-catalog/@backstage/backend-plugin-api/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-search-backend-module-catalog/@backstage/backend-plugin-api/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/plugin-search-backend-node/@backstage/backend-plugin-api/@backstage/plugin-auth-node": ["@backstage/plugin-auth-node@0.6.10", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/catalog-client": "^1.12.1", "@backstage/catalog-model": "^1.7.6", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/types": "^1.2.2", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", "express": "^4.22.0", "jose": "^5.0.0", "lodash": "^4.17.21", "passport": "^0.7.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.21.4", "zod-validation-error": "^3.4.0" } }, "sha512-Hi8ZxKzs0GS37a0KTpPf3DyhQ8TdexwH+UtgNxOPn6nBuoONOeW75EQO4CoJ12oT6DmIJ0t6ZXAqIe4kt93QOw=="], - - "@backstage/plugin-search-backend-node/@backstage/backend-plugin-api/@backstage/plugin-permission-node": ["@backstage/plugin-permission-node@0.10.7", "", { "dependencies": { "@backstage/backend-plugin-api": "^1.6.0", "@backstage/config": "^1.3.6", "@backstage/errors": "^1.2.7", "@backstage/plugin-auth-node": "^0.6.10", "@backstage/plugin-permission-common": "^0.9.3", "@types/express": "^4.17.6", "express": "^4.22.0", "express-promise-router": "^4.1.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.20.4" } }, "sha512-OSDfwo9dVTHBzfJ7LKea3Bw5ZQR+VnPHMOkwyu+MtaCZ2QPrGh0ZKcri4miHshnhhnqCKF6ELuK5nYxZFhIcjg=="], - - "@backstage/plugin-search-react/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/plugin-search-react/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/plugin-search-react/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/plugin-search/@backstage/core-components/@backstage/theme": ["@backstage/theme@0.7.1", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-JC2EUqfV198SzNT0B/E7MrnQuR5ML3qCz1FMDNd1qGoXNRBtBsSlPPJMcmuRsz7tM2BN+Vnbr7KkRPNbEnCYkQ=="], - - "@backstage/plugin-search/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/plugin-search/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/plugin-search/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components/@backstage/theme": ["@backstage/theme@0.7.1", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-JC2EUqfV198SzNT0B/E7MrnQuR5ML3qCz1FMDNd1qGoXNRBtBsSlPPJMcmuRsz7tM2BN+Vnbr7KkRPNbEnCYkQ=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components/linkify-react": ["linkify-react@4.3.2", "", { "peerDependencies": { "linkifyjs": "^4.0.0", "react": ">= 15.0.0" } }, "sha512-mi744h1hf+WDsr+paJgSBBgYNLMWNSHyM9V9LVUo03RidNGdw1VpI7Twnt+K3pEh3nIzB4xiiAgZxpd61ItKpQ=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components/linkifyjs": ["linkifyjs@4.3.2", "", {}, "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA=="], - - "@backstage/test-utils/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@eslint/eslintrc/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "@humanwhocodes/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - - "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - - "@istanbuljs/load-nyc-config/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - - "@jest/create-cache-key-function/@jest/types/@jest/schemas": ["@jest/schemas@30.0.5", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA=="], - - "@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - - "@manypkg/find-root/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], - - "@manypkg/find-root/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], - - "@manypkg/get-packages/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], - - "@manypkg/get-packages/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], - - "@pmmmwh/react-refresh-webpack-plugin/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "@pmmmwh/react-refresh-webpack-plugin/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], - - "@rollup/plugin-commonjs/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - - "@sucrase/webpack-loader/loader-utils/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], - - "@svgr/rollup/@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@types/ssh2/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], - - "@typespec/ts-http-runtime/http-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "@typespec/ts-http-runtime/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "@yarnpkg/parsers/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - - "archiver-utils/glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], - - "assert/util/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], - - "babel-plugin-istanbul/istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "codeowners-utils/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - - "color/color-convert/color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], - - "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "connect/finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], - - "connect/finalhandler/on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="], - - "connect/finalhandler/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], - - "data-urls/whatwg-url/tr46": ["tr46@3.0.0", "", { "dependencies": { "punycode": "^2.1.1" } }, "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA=="], - - "detect-port-alt/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "esbuild-loader/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw=="], - - "esbuild-loader/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.2", "", { "os": "android", "cpu": "arm" }, "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA=="], - - "esbuild-loader/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.2", "", { "os": "android", "cpu": "arm64" }, "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA=="], - - "esbuild-loader/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.2", "", { "os": "android", "cpu": "x64" }, "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A=="], - - "esbuild-loader/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg=="], - - "esbuild-loader/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA=="], - - "esbuild-loader/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g=="], - - "esbuild-loader/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA=="], - - "esbuild-loader/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.2", "", { "os": "linux", "cpu": "arm" }, "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw=="], - - "esbuild-loader/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw=="], - - "esbuild-loader/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w=="], - - "esbuild-loader/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg=="], - - "esbuild-loader/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw=="], - - "esbuild-loader/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ=="], - - "esbuild-loader/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA=="], - - "esbuild-loader/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w=="], - - "esbuild-loader/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA=="], - - "esbuild-loader/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.2", "", { "os": "none", "cpu": "x64" }, "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA=="], - - "esbuild-loader/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA=="], - - "esbuild-loader/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg=="], - - "esbuild-loader/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg=="], - - "esbuild-loader/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg=="], - - "esbuild-loader/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ=="], - - "esbuild-loader/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.2", "", { "os": "win32", "cpu": "x64" }, "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ=="], - - "eslint-formatter-friendly/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], - - "eslint-formatter-friendly/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - - "eslint-formatter-friendly/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], - - "eslint-formatter-friendly/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], - - "eslint-plugin-deprecation/@typescript-eslint/utils/@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="], - - "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], - - "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "eslint-plugin-import/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.50.1", "", { "dependencies": { "@typescript-eslint/types": "8.50.1", "@typescript-eslint/visitor-keys": "8.50.1" } }, "sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.50.1", "", {}, "sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.50.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.50.1", "@typescript-eslint/tsconfig-utils": "8.50.1", "@typescript-eslint/types": "8.50.1", "@typescript-eslint/visitor-keys": "8.50.1", "debug": "^4.3.4", "minimatch": "^9.0.4", "semver": "^7.6.0", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ=="], - - "eslint-plugin-jsx-a11y/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "eslint-plugin-react/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "eslint-webpack-plugin/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "eslint-webpack-plugin/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], - - "eslint/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "express-session/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "fork-ts-checker-webpack-plugin/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], - - "fork-ts-checker-webpack-plugin/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "gaxios/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], - - "glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "global-agent/serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], - - "http-assert/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], - - "http-assert/http-errors/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], - - "jest-runner/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "jsdom/tough-cookie/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "jsdom/tough-cookie/universalify": ["universalify@0.2.0", "", {}, "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="], - - "jsdom/whatwg-url/tr46": ["tr46@3.0.0", "", { "dependencies": { "punycode": "^2.1.1" } }, "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA=="], - - "knex/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], - - "koa/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], - - "koa/http-errors/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], - - "koa/http-errors/setprototypeof": ["setprototypeof@1.1.0", "", {}, "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="], - - "mini-css-extract-plugin/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "mini-css-extract-plugin/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], - - "morgan/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "node-libs-browser/util/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], - - "npm-packlist/glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], - - "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - - "pkg-up/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], - - "react-dev-utils/fork-ts-checker-webpack-plugin/cosmiconfig": ["cosmiconfig@6.0.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.7.2" } }, "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg=="], - - "react-dev-utils/fork-ts-checker-webpack-plugin/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - - "react-dev-utils/fork-ts-checker-webpack-plugin/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "react-dev-utils/fork-ts-checker-webpack-plugin/schema-utils": ["schema-utils@2.7.0", "", { "dependencies": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", "ajv-keywords": "^3.4.1" } }, "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A=="], - - "react-dev-utils/fork-ts-checker-webpack-plugin/tapable": ["tapable@1.1.3", "", {}, "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="], - - "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - - "recursive-readdir/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "replace-in-file/glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], - - "request/tough-cookie/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "resolve-dir/global-modules/global-prefix": ["global-prefix@1.0.2", "", { "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", "ini": "^1.3.4", "is-windows": "^1.0.1", "which": "^1.2.14" } }, "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg=="], - - "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "serve-index/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "serve-index/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], - - "serve-index/http-errors/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], - - "serve-index/http-errors/setprototypeof": ["setprototypeof@1.1.0", "", {}, "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="], - - "serve-index/http-errors/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], - - "static-eval/escodegen/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], - - "static-eval/escodegen/optionator": ["optionator@0.8.3", "", { "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "word-wrap": "~1.2.3" } }, "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA=="], - - "static-eval/escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - - "streamroller/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], - - "streamroller/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], - - "tar-fs/tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "terser-webpack-plugin/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - - "terser-webpack-plugin/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "terser-webpack-plugin/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], - - "test-exclude/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "typescript-json-schema/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], - - "webpack-dev-middleware/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], - - "webpack-dev-middleware/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "webpack-dev-middleware/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], - - "webpack-dev-server/open/define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], - - "webpack-dev-server/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "webpack-dev-server/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], - - "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], - - "webpack/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], - - "webpack/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], - - "yml-loader/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - - "yml-loader/loader-utils/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], - - "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - - "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - - "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - - "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], - - "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - - "@backstage/app-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@backstage/cli/@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@backstage/frontend-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/frontend-test-utils/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/frontend-test-utils/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/frontend-test-utils/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/archiver/archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/archiver/buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/archiver/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/archiver/zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], - - "@backstage/plugin-app/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/archiver/archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/archiver/buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/archiver/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/archiver/zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/archiver/archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/archiver/buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/archiver/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/archiver/zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/plugin-catalog-import/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/plugin-catalog-react/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/plugin-catalog/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/plugin-home-react/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/plugin-home/@backstage/core-compat-api/@backstage/frontend-plugin-api/@backstage/core-components": ["@backstage/core-components@0.16.4", "", { "dependencies": { "@backstage/config": "^1.3.2", "@backstage/core-plugin-api": "^1.10.4", "@backstage/errors": "^1.2.7", "@backstage/theme": "^0.6.4", "@backstage/version-bridge": "^1.0.11", "@dagrejs/dagre": "^1.1.4", "@date-io/core": "^1.3.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.61", "@react-hookz/web": "^24.0.0", "@testing-library/react": "^16.0.0", "@types/react-sparklines": "^1.7.0", "ansi-regex": "^6.0.1", "classnames": "^2.2.6", "d3-selection": "^3.0.0", "d3-shape": "^3.0.0", "d3-zoom": "^3.0.0", "js-yaml": "^4.1.0", "linkify-react": "4.1.3", "linkifyjs": "4.1.3", "lodash": "^4.17.21", "pluralize": "^8.0.0", "qs": "^6.9.4", "rc-progress": "3.5.1", "react-helmet": "6.1.0", "react-hook-form": "^7.12.2", "react-idle-timer": "5.7.2", "react-markdown": "^8.0.0", "react-sparklines": "^1.7.0", "react-syntax-highlighter": "^15.4.5", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.11", "react-window": "^1.8.6", "remark-gfm": "^3.0.1", "zen-observable": "^0.10.0", "zod": "^3.22.4" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-wJyp+QoM8mjBgf4wZtSQIH4YbaaGnjOZbLg0CQj+fo/JN5c+Cnn9K2auu3cwTOXQIjQHzrYazhjY4h/ZbeSLgg=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/archiver/archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/archiver/buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/archiver/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/archiver/zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/archiver/archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/archiver/buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/archiver/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/archiver/zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], - - "@backstage/plugin-search-react/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/plugin-search/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/test-utils/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/test-utils/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/test-utils/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - - "@istanbuljs/load-nyc-config/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - - "@jest/create-cache-key-function/@jest/types/@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.34.45", "", {}, "sha512-qJcFVfCa5jxBFSuv7S5WYbA8XdeCPmhnaVVfX/2Y6L8WYg8sk3XY2+6W0zH+3mq1Cz+YC7Ki66HfqX6IHAwnkg=="], - - "@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - - "@yarnpkg/parsers/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - - "codeowners-utils/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - - "data-urls/whatwg-url/tr46/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "eslint-formatter-friendly/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], - - "eslint-formatter-friendly/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - - "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], - - "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.50.1", "", { "dependencies": { "@typescript-eslint/types": "8.50.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.50.1", "", { "dependencies": { "@typescript-eslint/types": "8.50.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], - - "jsdom/whatwg-url/tr46/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - - "pkg-up/find-up/locate-path/p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], - - "pkg-up/find-up/locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], - - "react-dev-utils/fork-ts-checker-webpack-plugin/cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], - - "react-dev-utils/fork-ts-checker-webpack-plugin/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - - "read-yaml-file/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - - "resolve-dir/global-modules/global-prefix/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], - - "static-eval/escodegen/optionator/levn": ["levn@0.3.0", "", { "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA=="], - - "static-eval/escodegen/optionator/prelude-ls": ["prelude-ls@1.1.2", "", {}, "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w=="], - - "static-eval/escodegen/optionator/type-check": ["type-check@0.3.2", "", { "dependencies": { "prelude-ls": "~1.1.2" } }, "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg=="], - - "yml-loader/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - - "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - - "@backstage/app-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/app-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/app-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@backstage/cli/@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], - - "@backstage/frontend-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/frontend-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/frontend-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/frontend-test-utils/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/frontend-test-utils/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/archiver/archiver-utils/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/archiver/zip-stream/compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], - - "@backstage/plugin-app/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/plugin-app/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/plugin-app/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/archiver/archiver-utils/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/archiver/zip-stream/compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/archiver/archiver-utils/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/archiver/zip-stream/compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/plugin-catalog-import/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/plugin-catalog-import/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/plugin-catalog-import/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/plugin-catalog-react/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/plugin-catalog-react/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/plugin-catalog-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/plugin-catalog/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/plugin-catalog/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/plugin-catalog/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/plugin-home-react/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/plugin-home-react/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/plugin-home-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/plugin-home/@backstage/core-compat-api/@backstage/frontend-plugin-api/@backstage/core-components/@backstage/theme": ["@backstage/theme@0.6.8", "", { "dependencies": { "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mui/material": "^5.12.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", "react-router-dom": "^6.3.0" }, "optionalPeers": ["@types/react"] }, "sha512-hNUoOjirVIVht6GbDFt6vEej4hA7Kq3trJmyWhKuAKndPD+azjhzMOnGM7Rzj5qIkJeCNB6qcC89+NV6no1HzA=="], - - "@backstage/plugin-home/@backstage/core-compat-api/@backstage/frontend-plugin-api/@backstage/core-components/@testing-library/react": ["@testing-library/react@16.3.1", "", { "dependencies": { "@babel/runtime": "^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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/archiver/archiver-utils/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/archiver/zip-stream/compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/archiver/archiver-utils/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/archiver/zip-stream/compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], - - "@backstage/plugin-search-react/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/plugin-search-react/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/plugin-search-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/plugin-search/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/plugin-search/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/plugin-search/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/test-utils/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/test-utils/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - - "@manypkg/find-root/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - - "eslint-formatter-friendly/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], - - "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - - "pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - - "@backstage/app-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/app-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/frontend-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/frontend-defaults/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/archiver/archiver-utils/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - - "@backstage/plugin-app-backend/@backstage/backend-common/archiver/zip-stream/compress-commons/crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], - - "@backstage/plugin-app/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/plugin-app/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/archiver/archiver-utils/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - - "@backstage/plugin-auth-node/@backstage/backend-common/archiver/zip-stream/compress-commons/crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/archiver/archiver-utils/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - - "@backstage/plugin-catalog-backend/@backstage/backend-common/archiver/zip-stream/compress-commons/crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/plugin-catalog-graph/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-catalog-import/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/plugin-catalog-import/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-catalog-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/plugin-catalog-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-catalog/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/plugin-catalog/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-home-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/plugin-home-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-home/@backstage/core-compat-api/@backstage/frontend-plugin-api/@backstage/core-components/@testing-library/react/@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/archiver/archiver-utils/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - - "@backstage/plugin-permission-node/@backstage/backend-common/archiver/zip-stream/compress-commons/crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/archiver/archiver-utils/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - - "@backstage/plugin-proxy-backend/@backstage/backend-common/archiver/zip-stream/compress-commons/crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], - - "@backstage/plugin-search-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/plugin-search-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-search/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/plugin-search/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/plugin-techdocs-react/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - - "@backstage/plugin-home/@backstage/core-compat-api/@backstage/frontend-plugin-api/@backstage/core-components/@testing-library/react/@testing-library/dom/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - - "@backstage/plugin-home/@backstage/core-compat-api/@backstage/frontend-plugin-api/@backstage/core-components/@testing-library/react/@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@backstage/plugin-home/@backstage/core-compat-api/@backstage/frontend-plugin-api/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - - "@backstage/plugin-home/@backstage/core-compat-api/@backstage/frontend-plugin-api/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@backstage/plugin-home/@backstage/core-compat-api/@backstage/frontend-plugin-api/@backstage/core-components/@testing-library/react/@testing-library/dom/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - } -} diff --git a/backstage-server/bunfig.toml b/backstage-server/bunfig.toml deleted file mode 100644 index d9661d42..00000000 --- a/backstage-server/bunfig.toml +++ /dev/null @@ -1,5 +0,0 @@ -[install] -minimumReleaseAge = 604800 - -[test] -preload = ["./packages/app/src/test/setup.ts"] diff --git a/backstage-server/e2e/README.md b/backstage-server/e2e/README.md deleted file mode 100644 index ee8a4802..00000000 --- a/backstage-server/e2e/README.md +++ /dev/null @@ -1,213 +0,0 @@ -# E2E Testing Guide - -This directory contains end-to-end tests for the Backstage server using Playwright. - -## Overview - -The tests verify: -- **Health endpoints**: `/health` and `/api/status` -- **Catalog page**: Page loads, headers, view toggle functionality -- **Issue Types page**: Page loads, headers, action buttons, navigation -- **Plugins page**: Page loads, plugin table, metadata display - -## Running Tests - -### Local Development - -```bash -# Build and run tests with binary (recommended) -bun run build -USE_BINARY=true bun run test:e2e - -# Or run from source (requires frontend build) -bun run build:frontend -bun run build:embeds -bun run test:e2e -``` - -### Quick Commands - -```bash -# Full build and test -bun run build && USE_BINARY=true bun run test:e2e - -# Run specific test file -USE_BINARY=true bunx playwright test e2e/catalog.spec.ts - -# Run with UI mode for debugging -USE_BINARY=true bunx playwright test --ui - -# Show test report -bunx playwright show-report -``` - -## CI Configuration - -The CI workflow (`.github/workflows/backstage.yaml`) runs e2e tests as follows: - -1. **Build job**: Compiles the binary with `bun run build` -2. **E2E job**: Downloads the binary artifact and runs tests with `USE_BINARY=true` - -The `playwright.config.ts` webServer command: -```typescript -command: process.env.USE_BINARY === 'true' - ? './dist/backstage-server' - : 'bun run start', -``` - -## How the Build System Works - -``` -bun run build:frontend → builds packages/app/dist/ (React app) -bun run build:embeds → generates src/embedded-assets.ts -bun run build:standalone → compiles binary with embedded frontend -``` - -The full `bun run build` runs all three steps. - -## Authentication - -### How Guest Auth Works - -The Backstage frontend uses a guest authentication provider that requires backend support. When a user clicks "Enter" on the login page, the frontend makes API calls to authenticate and obtain a session token. - -The standalone Hono server (`src/standalone.ts`) mocks these Backstage auth endpoints: - -| Endpoint | Purpose | -|----------|---------| -| `GET /api/auth` | Service availability check | -| `GET /api/auth/providers` | Lists available auth providers | -| `GET /api/auth/guest` | Guest provider info | -| `GET /api/auth/guest/users` | Lists available guest users | -| `GET/POST /api/auth/guest/start` | Initiates guest sign-in, returns token | -| `GET/POST /api/auth/guest/refresh` | Refreshes session token | -| `GET /api/auth/.well-known/openid-configuration` | OpenID discovery | -| `GET /api/auth/.well-known/jwks.json` | JSON Web Key Set | - -The mock endpoints return a simple base64-encoded token that satisfies the frontend's auth requirements. This token includes: -- `sub`: User entity reference (`user:development/guest`) -- `ent`: Ownership entity refs -- `iat`/`exp`: Token timestamps - -### How Auth is Tested in Playwright - -Since Backstage guest auth stores identity in memory (not cookies or localStorage), authentication doesn't persist across page navigations in Playwright. Each test handles this with the `gotoWithAuth()` helper: - -```typescript -// e2e/auth.ts -export async function gotoWithAuth(page: Page, path: string): Promise<void> { - await page.goto(path); - await loginAsGuest(page); -} - -export async function loginAsGuest(page: Page): Promise<void> { - const enterButton = page.getByRole('button', { name: 'Enter' }); - try { - await enterButton.waitFor({ state: 'visible', timeout: 3000 }); - await enterButton.click(); - await expect(enterButton).not.toBeVisible({ timeout: 10000 }); - await page.waitForTimeout(500); - } catch { - // Not on login page - already authenticated - } -} -``` - -**How it works:** -1. Navigate to the target page (e.g., `/catalog`) -2. Check if the "Enter" button (guest login) is visible -3. If visible, click it and wait for login to complete -4. If not visible, assume already authenticated and continue - -**Why this approach:** -- Backstage stores auth state in React context (memory), not browser storage -- Each Playwright test gets a fresh browser context -- Global setup with `storageState` doesn't work because there's nothing to persist -- Per-navigation auth handling ensures each test can authenticate reliably - -### Test Usage - -Tests use `gotoWithAuth()` instead of `page.goto()`: - -```typescript -test('displays Repositories header', async ({ page }) => { - await gotoWithAuth(page, '/catalog'); // Handles auth automatically - await expect(page.getByRole('heading', { name: 'Repositories' })).toBeVisible(); -}); -``` - -### Debugging Auth Issues - -If tests fail with auth errors: - -1. **Check the login page appears**: The test should see the "Enter" button -2. **Check the mock endpoints**: Server logs will show auth API calls -3. **Check the token format**: Frontend expects specific response structure -4. **Check timing**: Login may need more time to complete (adjust timeouts) - -To debug, run with headed mode: -```bash -USE_BINARY=true bunx playwright test --headed --debug -``` - -## Test Structure - -``` -e2e/ -├── auth.ts # Authentication helper (gotoWithAuth) -├── health.spec.ts # API health check tests -├── catalog.spec.ts # Catalog page tests -├── issuetypes.spec.ts # Issue Types page tests -├── plugins.spec.ts # Plugins page tests -└── README.md # This file -``` - -## Troubleshooting - -### Tests fail with "element not found" - -1. **Check if frontend is embedded**: Run the binary and visit http://localhost:7007/ - - If you see a status page instead of the React app, the frontend isn't embedded - - Rebuild with `bun run build` - -2. **Verify assets exist**: - ```bash - ls -la src/assets/ # Should have static files - ls -la packages/app/dist/ # Should have built React app - cat src/embedded-assets.ts # Should import from ./assets/ - ``` - -### Tests fail with auth errors - -The standalone server mocks Backstage's guest auth. If auth fails: - -1. Check the server logs for auth endpoint calls -2. Verify the frontend is using the expected auth flow -3. The mock endpoints are in `src/standalone.ts` - -### Tests fail in CI - -1. **Check artifact download**: Ensure the binary artifact is downloaded correctly -2. **Check executable permission**: Binary needs `chmod +x` -3. **Check environment variable**: `USE_BINARY=true` must be set - -## Key Files - -| File | Purpose | -|------|---------| -| `playwright.config.ts` | Test configuration, webServer command | -| `src/standalone.ts` | Standalone server with auth endpoints | -| `src/embedded-assets.ts` | Generated file with frontend imports | -| `packages/app/dist/` | Built React frontend | -| `.github/workflows/backstage.yaml` | CI workflow | - -## Expected Test Behavior - -### Health tests (no auth required): -- `GET /health` → `{ "status": "ok" }` -- `GET /api/status` → `{ "status": "running", "mode": "standalone" }` - -### UI tests (require guest auth): -- `/catalog` → Repositories heading, view toggle -- `/issuetypes` → Issue Types heading, Create/Collections buttons -- `/plugins` → Installed Plugins table with catalog, search, issuetypes diff --git a/backstage-server/e2e/auth.ts b/backstage-server/e2e/auth.ts deleted file mode 100644 index 6f44c688..00000000 --- a/backstage-server/e2e/auth.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Page, expect } from '@playwright/test'; - -/** - * Handle Backstage guest authentication - * - * Backstage guest auth stores identity in memory (not cookies/storage), - * so we need to handle login on each page navigation. - * - * This function: - * 1. Checks if we're on the login page - * 2. If so, clicks "Enter" to login as guest - * 3. Waits for the login to complete - */ -export async function loginAsGuest(page: Page): Promise<void> { - const enterButton = page.getByRole('button', { name: 'Enter' }); - - try { - // Short timeout - we just need to check if login button exists - await enterButton.waitFor({ state: 'visible', timeout: 3000 }); - await enterButton.click(); - - // Wait for the login page to disappear (redirected to content) - await expect(enterButton).not.toBeVisible({ timeout: 10000 }); - - // Give the app time to initialize after login - await page.waitForTimeout(500); - } catch { - // Not on login page - already authenticated or different page - } -} - -/** - * Navigate to a page and handle authentication - * - * Use this instead of bare `page.goto()` for protected pages. - * Handles the login redirect if needed. - */ -export async function gotoWithAuth(page: Page, path: string): Promise<void> { - await page.goto(path); - await loginAsGuest(page); -} diff --git a/backstage-server/e2e/catalog.spec.ts b/backstage-server/e2e/catalog.spec.ts deleted file mode 100644 index a4bbd25b..00000000 --- a/backstage-server/e2e/catalog.spec.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { test, expect } from '@playwright/test'; -import { gotoWithAuth } from './auth'; - -test.describe('Catalog Page', () => { - test('loads catalog page', async ({ page }) => { - await gotoWithAuth(page, '/catalog'); - - // Wait for the page to load - await expect(page).toHaveURL(/.*catalog/); - - // Check for main content - Repositories heading - await expect(page.getByRole('heading', { name: 'Repositories' })).toBeVisible(); - }); - - test('displays Repositories header', async ({ page }) => { - await gotoWithAuth(page, '/catalog'); - - // Check for the Repositories header (from OperatorCatalogPage) - await expect(page.getByRole('heading', { name: 'Repositories' })).toBeVisible(); - }); - - test('can toggle between Operator and Backstage views', async ({ page }) => { - await gotoWithAuth(page, '/catalog'); - - // Check for view toggle buttons - const operatorBtn = page.getByRole('button', { name: /Operator/i }); - const backstageBtn = page.getByRole('button', { name: /Backstage/i }); - - await expect(operatorBtn).toBeVisible(); - await expect(backstageBtn).toBeVisible(); - - // Click Backstage view - await backstageBtn.click(); - await expect(page).toHaveURL(/.*view=backstage/); - - // Click Operator view - await operatorBtn.click(); - await expect(page).not.toHaveURL(/.*view=backstage/); - }); -}); diff --git a/backstage-server/e2e/health.spec.ts b/backstage-server/e2e/health.spec.ts deleted file mode 100644 index 26738915..00000000 --- a/backstage-server/e2e/health.spec.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test.describe('Health Check', () => { - test('server health endpoint responds', async ({ request }) => { - const response = await request.get('/health'); - expect(response.ok()).toBeTruthy(); - - const body = await response.json(); - expect(body.status).toBe('ok'); - }); - - test('API status endpoint responds', async ({ request }) => { - const response = await request.get('/api/status'); - expect(response.ok()).toBeTruthy(); - - const body = await response.json(); - expect(body.status).toBe('running'); - expect(body.mode).toBe('standalone'); - }); -}); diff --git a/backstage-server/e2e/issuetypes.spec.ts b/backstage-server/e2e/issuetypes.spec.ts deleted file mode 100644 index e7784920..00000000 --- a/backstage-server/e2e/issuetypes.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { test, expect } from '@playwright/test'; -import { gotoWithAuth } from './auth'; - -test.describe('Issue Types Page', () => { - test('loads issue types page', async ({ page }) => { - await gotoWithAuth(page, '/issuetypes'); - - // Wait for the page to load - await expect(page).toHaveURL(/.*issuetypes/); - - // Check for main Issue Types heading - await expect(page.getByRole('heading', { name: 'Issue Types', level: 1 })).toBeVisible(); - }); - - test('displays Issue Types header', async ({ page }) => { - await gotoWithAuth(page, '/issuetypes'); - - // Check for the Issue Types header (h1, not h2 subtitle) - await expect(page.getByRole('heading', { name: 'Issue Types', level: 1 })).toBeVisible(); - }); - - test('displays action buttons', async ({ page }) => { - await gotoWithAuth(page, '/issuetypes'); - - // Check for action buttons - const createBtn = page.getByRole('button', { name: 'Create Issue Type' }); - const collectionsBtn = page.getByRole('button', { name: 'Collections' }); - - // Both should be visible when page loads - await expect(createBtn).toBeVisible({ timeout: 10000 }); - await expect(collectionsBtn).toBeVisible({ timeout: 10000 }); - }); - - test('navigates to collections page', async ({ page }) => { - await gotoWithAuth(page, '/issuetypes/collections'); - - await expect(page).toHaveURL(/.*issuetypes\/collections/); - // Check for main Collections heading (h1) - await expect(page.getByRole('heading', { name: 'Collections', level: 1 })).toBeVisible(); - }); -}); diff --git a/backstage-server/e2e/plugins.spec.ts b/backstage-server/e2e/plugins.spec.ts deleted file mode 100644 index 060c0199..00000000 --- a/backstage-server/e2e/plugins.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { test, expect } from '@playwright/test'; -import { gotoWithAuth } from './auth'; - -test.describe('Plugins Page', () => { - test('loads plugins page', async ({ page }) => { - await gotoWithAuth(page, '/plugins'); - - // Wait for the page to load - await expect(page).toHaveURL(/.*plugins/); - - // Check for the Installed Plugins header - await expect(page.getByRole('heading', { name: 'Installed Plugins' })).toBeVisible(); - }); - - test('displays Installed Plugins header', async ({ page }) => { - await gotoWithAuth(page, '/plugins'); - - // Check for the Installed Plugins header - await expect(page.getByRole('heading', { name: 'Installed Plugins' })).toBeVisible(); - }); - - test('displays plugin table with installed plugins', async ({ page }) => { - await gotoWithAuth(page, '/plugins'); - - // Check that the plugins table is visible - await expect(page.getByRole('table')).toBeVisible(); - - // Check that known plugins are listed (using table cells for specificity) - await expect(page.getByRole('cell', { name: 'catalog', exact: true })).toBeVisible(); - await expect(page.getByRole('cell', { name: 'search', exact: true })).toBeVisible(); - await expect(page.getByRole('cell', { name: 'issuetypes', exact: true })).toBeVisible(); - }); - - test('displays plugin metadata', async ({ page }) => { - await gotoWithAuth(page, '/plugins'); - - // Check for plugin descriptions in table cells - await expect(page.getByRole('cell', { name: /Software catalog/i })).toBeVisible(); - await expect(page.getByRole('cell', { name: /Full-text search/i })).toBeVisible(); - await expect(page.getByRole('cell', { name: /Manage issue types/i })).toBeVisible(); - }); -}); diff --git a/backstage-server/global.d.ts b/backstage-server/global.d.ts deleted file mode 100644 index 3d673e2e..00000000 --- a/backstage-server/global.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.module.css' { - const classes: { [key: string]: string }; - export default classes; -} diff --git a/backstage-server/knip.json b/backstage-server/knip.json deleted file mode 100644 index 4ca5f809..00000000 --- a/backstage-server/knip.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "https://unpkg.com/knip@5/schema.json", - "workspaces": { - ".": {}, - "packages/app": { - "entry": ["src/index.tsx"] - }, - "packages/backend": { - "entry": ["src/index.ts"] - }, - "packages/plugins/plugin-issuetypes": {} - }, - "ignore": [ - "**/*.d.ts", - "**/dist/**", - "**/__tests__/test-utils/**", - "src/embedded-assets.ts", - "src/standalone.ts", - "packages/app/src/test/setup.ts", - "packages/app/src/components/kanban/types.ts" - ], - "ignoreDependencies": [ - "@backstage/*", - "raw-loader", - "@happy-dom/global-registrator", - "happy-dom" - ], - "ignoreExportsUsedInFile": true -} diff --git a/backstage-server/package.json b/backstage-server/package.json deleted file mode 100644 index 4f6b1e88..00000000 --- a/backstage-server/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "operator-backstage", - "version": "0.2.2", - "author": { - "name": "Samuel Volin", - "email": "untra.sam@gmail.com", - "url": "https://untra.io" - }, - "private": true, - "engines": { - "node": ">=18" - }, - "scripts": { - "dev": "bun run --hot src/standalone.ts", - "start": "bun run src/standalone.ts", - "build": "bun run build:frontend && bun run build:embeds && bun run build:standalone", - "build:dev": "bun run build:frontend && bun run build:embeds && bun run build:standalone:dev", - "build:embeds": "bun run scripts/generate-embeds.ts", - "build:standalone": "bun build --compile --minify --asset-naming '[dir]/[name].[ext]' src/standalone.ts --outfile dist/backstage-server", - "build:standalone:dev": "bun build --compile --asset-naming '[dir]/[name].[ext]' src/standalone.ts --outfile dist/backstage-server", - "build:backstage": "bun run build:frontend && bun run build:backend && bun run build:plugin", - "build:frontend": "cd packages/app && backstage-cli package build", - "build:backend": "cd packages/backend && backstage-cli package build", - "build:plugin": "cd packages/plugins/plugin-issuetypes && backstage-cli package build", - "lint": "eslint packages/*/src packages/plugins/*/src src --ext .ts,.tsx", - "lint:fix": "eslint packages/*/src packages/plugins/*/src src --ext .ts,.tsx --fix", - "lint:app": "eslint packages/app/src --ext .ts,.tsx", - "lint:backend": "eslint packages/backend/src --ext .ts,.tsx", - "lint:plugins": "eslint packages/plugins/*/src --ext .ts,.tsx", - "typecheck": "tsc --noEmit", - "test": "bun test packages", - "test:ci": "bun test packages --coverage", - "test:app": "bun test packages/app", - "test:backend": "bun test packages/backend", - "test:plugins": "bun test packages/plugins", - "test:e2e": "playwright test", - "test:e2e:ui": "playwright test --ui", - "test:e2e:headed": "playwright test --headed", - "knip": "knip" - }, - "workspaces": { - "packages": [ - "packages/*", - "packages/plugins/*" - ] - }, - "devDependencies": { - "@backstage/cli": "^0.27.0", - "@happy-dom/global-registrator": "^20.0.11", - "@playwright/test": "^1.40.0", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "@typescript-eslint/eslint-plugin": "^7.0.0", - "@typescript-eslint/parser": "^7.0.0", - "bun-types": "^1.0.0", - "eslint": "^8.57.0", - "eslint-plugin-react": "^7.34.0", - "eslint-plugin-react-hooks": "^4.6.0", - "knip": "^5.0.0", - "typescript": "^5.0.0" - }, - "resolutions": { - "@types/react": "^18" - }, - "overrides": { - "better-sqlite3": "npm:empty-npm-package@1.0.0", - "isolated-vm": "npm:empty-npm-package@1.0.0" - }, - "dependencies": { - "hono": "^4.11.2" - } -} diff --git a/backstage-server/packages/app/package.json b/backstage-server/packages/app/package.json deleted file mode 100644 index c17335b3..00000000 --- a/backstage-server/packages/app/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "app", - "version": "0.0.0", - "private": true, - "bundled": true, - "backstage": { - "role": "frontend" - }, - "scripts": { - "start": "backstage-cli package start", - "build": "backstage-cli package build" - }, - "dependencies": { - "@backstage/app-defaults": "^1.5.0", - "@backstage/catalog-client": "^1.6.0", - "@backstage/catalog-model": "^1.6.0", - "@backstage/core-app-api": "^1.14.0", - "@backstage/core-components": "^0.14.0", - "@backstage/core-plugin-api": "^1.9.0", - "@backstage/frontend-defaults": "^0.3.4", - "@backstage/frontend-plugin-api": "^0.13.2", - "@backstage/plugin-catalog": "^1.21.0", - "@backstage/plugin-catalog-graph": "^0.4.0", - "@backstage/plugin-catalog-import": "^0.12.0", - "@backstage/plugin-catalog-react": "^1.12.0", - "@backstage/plugin-home": "^0.7.0", - "@backstage/plugin-search": "^1.4.0", - "@backstage/plugin-search-react": "^1.7.0", - "@backstage/theme": "^0.5.0", - "@backstage/ui": "^0.10.0", - "@material-ui/core": "^4.12.4", - "@material-ui/icons": "^4.11.3", - "@operator/plugin-issuetypes": "workspace:*", - "@remixicon/react": "^4.7.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.0.0", - "@tanstack/react-query": "^5.0.0" - }, - "devDependencies": { - "@backstage/cli": "^0.27.0", - "@testing-library/react": "^14.0.0", - "msw": "^2.0.0", - "happy-dom": "^13.0.0", - "raw-loader": "^4.0.2" - } -} diff --git a/backstage-server/packages/app/src/App.tsx b/backstage-server/packages/app/src/App.tsx deleted file mode 100644 index e69b4529..00000000 --- a/backstage-server/packages/app/src/App.tsx +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Operator Backstage Frontend - * - * Full Backstage portal with Home, Catalog, Search, and Issue Types. - * Uses custom theming based on Operator's branding configuration. - * - * This app uses a hybrid approach for incremental migration to the new - * frontend system. Legacy plugins (catalog, search) work alongside the - * new Blueprint-based plugin-issuetypes/alpha. - * - * Migration status: - * - [x] plugin-issuetypes: Migrated to Blueprints (alpha.ts) - * - [ ] catalog: Using legacy system - * - [ ] search: Using legacy system - * - [ ] home: Using legacy system - */ - -import React from 'react'; -import { Route } from 'react-router-dom'; -import { createApp } from '@backstage/app-defaults'; -import { FlatRoutes } from '@backstage/core-app-api'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { - CatalogEntityPage, - catalogPlugin, -} from '@backstage/plugin-catalog'; -import { searchPlugin, SearchPage } from '@backstage/plugin-search'; -import { - issueTypesPlugin, - IssueTypesPage, - IssueTypeDetailPage, - IssueTypeFormPage, - CollectionsPage, -} from '@operator/plugin-issuetypes'; - -import { Root } from './components/Root/Root'; -import { HomePage } from './components/home/HomePage'; -import { entityPage } from './components/catalog/EntityPage'; -import { OperatorCatalogPage } from './components/catalog/OperatorCatalogPage'; -import { PluginsPage } from './components/plugins'; -import { KanbanBoardPage } from './components/kanban'; -import apis from './apis'; -import { OperatorThemeProvider } from './theme'; - -const app = createApp({ - apis, - plugins: [catalogPlugin, searchPlugin, issueTypesPlugin], -}); - -const AppProvider = app.getProvider(); -const AppRouter = app.getRouter(); - -// Query client for server state management -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - // Retry once on failure - retry: 1, - // Keep data fresh for 30 seconds - staleTime: 30000, - }, - }, -}); - -const routes = ( - <FlatRoutes> - {/* Home */} - <Route path="/" element={<HomePage />} /> - - {/* Catalog - with Operator view toggle */} - <Route path="/catalog" element={<OperatorCatalogPage />} /> - <Route path="/catalog/:namespace/:kind/:name" element={<CatalogEntityPage />}> - {entityPage()} - </Route> - - {/* Search */} - <Route path="/search" element={<SearchPage />} /> - - {/* Plugins */} - <Route path="/plugins" element={<PluginsPage />} /> - - {/* Kanban Board */} - <Route path="/board" element={<KanbanBoardPage />} /> - - {/* Issue Types - flat routes (no nesting, each page is independent) */} - <Route path="/issuetypes" element={<IssueTypesPage />} /> - <Route path="/issuetypes/new" element={<IssueTypeFormPage />} /> - <Route path="/issuetypes/collections" element={<CollectionsPage />} /> - <Route path="/issuetypes/:key" element={<IssueTypeDetailPage />} /> - <Route path="/issuetypes/:key/edit" element={<IssueTypeFormPage />} /> - </FlatRoutes> -); - -export default function App() { - return ( - <QueryClientProvider client={queryClient}> - <OperatorThemeProvider> - <AppProvider> - <AppRouter> - <Root> - {routes} - </Root> - </AppRouter> - </AppProvider> - </OperatorThemeProvider> - </QueryClientProvider> - ); -} - -/** - * New Frontend System App (for future full migration) - * - * This export provides a path to fully migrate to the new frontend system. - * When ready, replace the default export with createNewApp().createRoot(). - * - * Example usage in index.tsx: - * import { createNewApp } from './App'; - * ReactDOM.createRoot(rootEl).render(createNewApp().createRoot()); - */ -export { createNewApp } from './AppNew'; diff --git a/backstage-server/packages/app/src/AppNew.tsx b/backstage-server/packages/app/src/AppNew.tsx deleted file mode 100644 index a1835c88..00000000 --- a/backstage-server/packages/app/src/AppNew.tsx +++ /dev/null @@ -1,199 +0,0 @@ -/** - * New Frontend System App - * - * This module provides a fully migrated Backstage app using the new - * frontend system with extension-based architecture. - * - * To use this app, update index.tsx: - * import { createNewApp } from './AppNew'; - * ReactDOM.createRoot(rootEl).render(createNewApp().createRoot()); - * - * Or enable via environment variable: - * REACT_APP_USE_NEW_FRONTEND=true - */ - -import React from 'react'; -import { createApp } from '@backstage/frontend-defaults'; -import { - PageBlueprint, - NavItemBlueprint, - ApiBlueprint, - createFrontendModule, - createRouteRef, -} from '@backstage/frontend-plugin-api'; -import { - discoveryApiRef, - fetchApiRef, -} from '@backstage/core-plugin-api'; -import { - catalogApiRef, - starredEntitiesApiRef, - MockStarredEntitiesApi, -} from '@backstage/plugin-catalog-react'; -import { CatalogClient } from '@backstage/catalog-client'; - -// Import the new frontend system version of our plugin -import issueTypesPlugin from '@operator/plugin-issuetypes/alpha'; - -// Import homepage extensions -import { - homeRouteRef, - homepageExtensions, -} from './extensions'; - -// Route references for custom pages (homepage has its own) -const catalogRouteRef = createRouteRef(); -const pluginsRouteRef = createRouteRef(); -const boardRouteRef = createRouteRef(); - -const operatorCatalogPageExtension = PageBlueprint.make({ - name: 'operator-catalog', - params: { - path: '/catalog', - routeRef: catalogRouteRef, - loader: () => - import('./components/catalog/OperatorCatalogPage').then(m => ( - <m.OperatorCatalogPage /> - )), - }, -}); - -const pluginsPageExtension = PageBlueprint.make({ - name: 'plugins', - params: { - path: '/plugins', - routeRef: pluginsRouteRef, - loader: () => - import('./components/plugins').then(m => <m.PluginsPage />), - }, -}); - -const boardPageExtension = PageBlueprint.make({ - name: 'board', - params: { - path: '/board', - routeRef: boardRouteRef, - loader: () => - import('./components/kanban').then(m => <m.KanbanBoardPage />), - }, -}); - -// Navigation items -const HomeIcon = () => ( - <svg viewBox="0 0 24 24" width="24" height="24" fill="currentColor"> - <path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" /> - </svg> -); - -const CatalogIcon = () => ( - <svg viewBox="0 0 24 24" width="24" height="24" fill="currentColor"> - <path d="M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z" /> - </svg> -); - -const PluginsIcon = () => ( - <svg viewBox="0 0 24 24" width="24" height="24" fill="currentColor"> - <path d="M20.5 11H19V7c0-1.1-.9-2-2-2h-4V3.5C13 2.12 11.88 1 10.5 1S8 2.12 8 3.5V5H4c-1.1 0-1.99.9-1.99 2v3.8H3.5c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-1.5c0-1.49 1.21-2.7 2.7-2.7 1.49 0 2.7 1.21 2.7 2.7V22H17c1.1 0 2-.9 2-2v-4h1.5c1.38 0 2.5-1.12 2.5-2.5S21.88 11 20.5 11z" /> - </svg> -); - -const homeNavItem = NavItemBlueprint.make({ - name: 'home', - params: { - title: 'Home', - routeRef: homeRouteRef, - icon: HomeIcon, - }, -}); - -const catalogNavItem = NavItemBlueprint.make({ - name: 'catalog', - params: { - title: 'Catalog', - routeRef: catalogRouteRef, - icon: CatalogIcon, - }, -}); - -const pluginsNavItem = NavItemBlueprint.make({ - name: 'plugins', - params: { - title: 'Plugins', - routeRef: pluginsRouteRef, - icon: PluginsIcon, - }, -}); - -const BoardIcon = () => ( - <svg viewBox="0 0 24 24" width="24" height="24" fill="currentColor"> - <path d="M14 4h2v17h-2V4zM4 4h2v17H4V4zm14 0h2v17h-2V4z" /> - </svg> -); - -const boardNavItem = NavItemBlueprint.make({ - name: 'board', - params: { - title: 'Board', - routeRef: boardRouteRef, - icon: BoardIcon, - }, -}); - -// Catalog API extension - provides catalog service for catalog components -const catalogApi = ApiBlueprint.make({ - name: 'catalog-api', - params: defineParams => - defineParams({ - api: catalogApiRef, - deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef }, - factory: ({ discoveryApi, fetchApi }) => - new CatalogClient({ discoveryApi, fetchApi }), - }), -}); - -// Starred Entities API - provides in-memory starred entity storage -const starredEntitiesApi = ApiBlueprint.make({ - name: 'starred-entities-api', - params: defineParams => - defineParams({ - api: starredEntitiesApiRef, - deps: {}, - factory: () => new MockStarredEntitiesApi(), - }), -}); - -// Custom module for Operator-specific extensions -const operatorAppModule = createFrontendModule({ - pluginId: 'app', - extensions: [ - // APIs - catalogApi, - starredEntitiesApi, - // Homepage (page + widgets) - ...homepageExtensions, - // Other pages - operatorCatalogPageExtension, - pluginsPageExtension, - boardPageExtension, - // Navigation - homeNavItem, - catalogNavItem, - pluginsNavItem, - boardNavItem, - ], -}); - -/** - * Create the new frontend system app - */ -export function createNewApp() { - return createApp({ - features: [ - // Custom plugins - issueTypesPlugin, - // App module with custom pages and nav - operatorAppModule, - ], - }); -} - diff --git a/backstage-server/packages/app/src/__tests__/smoke.test.ts b/backstage-server/packages/app/src/__tests__/smoke.test.ts deleted file mode 100644 index 9136166c..00000000 --- a/backstage-server/packages/app/src/__tests__/smoke.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { describe, test, expect } from 'bun:test'; - -describe('app smoke tests', () => { - test('app package exists', () => { - // Placeholder: App component requires browser environment (window, document) - // Backstage components use browser APIs that aren't available in Bun test - // Add React Testing Library with jsdom when component testing is needed - expect(true).toBe(true); - }); -}); diff --git a/backstage-server/packages/app/src/api/queries.ts b/backstage-server/packages/app/src/api/queries.ts deleted file mode 100644 index 1aec4517..00000000 --- a/backstage-server/packages/app/src/api/queries.ts +++ /dev/null @@ -1,131 +0,0 @@ -/** - * API Query Functions - * - * Centralized fetch functions for use with TanStack Query. - * Each function handles its own error throwing for proper error propagation. - */ - -import { useQuery } from '@tanstack/react-query'; -import type { KanbanBoardResponse } from '../components/kanban/types'; - -// ============================================================================ -// Types -// ============================================================================ - -export interface Agent { - id: string; - ticket_id: string; - ticket_type: string; - project: string; - status: string; - mode: string; - started_at: string; - current_step: string | null; -} - -export interface AgentsResponse { - agents: Agent[]; - count: number; -} - -export interface QueueStatus { - queued: number; - in_progress: number; - awaiting: number; - completed: number; - by_type: { - inv: number; - fix: number; - feat: number; - spike: number; - }; -} - -export interface IssueType { - key: string; - name: string; - mode: string; - collection?: string; -} - -// ============================================================================ -// Query Keys -// ============================================================================ - -export const queryKeys = { - kanbanBoard: ['kanban-board'] as const, - activeAgents: ['active-agents'] as const, - queueStatus: ['queue-status'] as const, - issueTypes: ['issue-types'] as const, -}; - -// ============================================================================ -// Fetch Functions -// ============================================================================ - -async function fetchKanbanBoard(): Promise<KanbanBoardResponse> { - const response = await fetch('/api/proxy/operator/api/v1/queue/kanban'); - if (!response.ok) { - throw new Error(`Failed to fetch kanban board: ${response.status}`); - } - return response.json(); -} - -async function fetchActiveAgents(): Promise<AgentsResponse> { - const response = await fetch('/api/proxy/operator/api/v1/agents/active'); - if (!response.ok) { - throw new Error(`Failed to fetch active agents: ${response.status}`); - } - return response.json(); -} - -async function fetchQueueStatus(): Promise<QueueStatus> { - const response = await fetch('/api/proxy/operator/api/v1/queue/status'); - if (!response.ok) { - throw new Error(`Failed to fetch queue status: ${response.status}`); - } - return response.json(); -} - -async function fetchIssueTypes(): Promise<IssueType[]> { - const response = await fetch('/api/proxy/operator/api/v1/issuetypes'); - if (!response.ok) { - throw new Error(`Failed to fetch issue types: ${response.status}`); - } - return response.json(); -} - -// ============================================================================ -// Query Hooks -// ============================================================================ - -export function useKanbanBoardQuery() { - return useQuery({ - queryKey: queryKeys.kanbanBoard, - queryFn: fetchKanbanBoard, - refetchInterval: 15000, // 15 seconds - }); -} - -export function useActiveAgentsQuery() { - return useQuery({ - queryKey: queryKeys.activeAgents, - queryFn: fetchActiveAgents, - refetchInterval: 10000, // 10 seconds - }); -} - -export function useQueueStatusQuery() { - return useQuery({ - queryKey: queryKeys.queueStatus, - queryFn: fetchQueueStatus, - refetchInterval: 30000, // 30 seconds - }); -} - -export function useIssueTypesQuery() { - return useQuery({ - queryKey: queryKeys.issueTypes, - queryFn: fetchIssueTypes, - }); -} diff --git a/backstage-server/packages/app/src/apis.ts b/backstage-server/packages/app/src/apis.ts deleted file mode 100644 index 52789926..00000000 --- a/backstage-server/packages/app/src/apis.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * API Factories - * - * Configures Backstage API clients to work with our Hono backend. - */ - -import { - AnyApiFactory, - createApiFactory, - discoveryApiRef, - fetchApiRef, -} from '@backstage/core-plugin-api'; -import { catalogApiRef } from '@backstage/plugin-catalog-react'; -import { CatalogClient } from '@backstage/catalog-client'; - -const apis: AnyApiFactory[] = [ - // Catalog API - uses our Hono backend - createApiFactory({ - api: catalogApiRef, - deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef }, - factory: ({ discoveryApi, fetchApi }) => - new CatalogClient({ discoveryApi, fetchApi }), - }), -]; - -export default apis; diff --git a/backstage-server/packages/app/src/components/Root/Root.tsx b/backstage-server/packages/app/src/components/Root/Root.tsx deleted file mode 100644 index 4a68cb13..00000000 --- a/backstage-server/packages/app/src/components/Root/Root.tsx +++ /dev/null @@ -1,150 +0,0 @@ -/** - * Root Layout Component - * - * Provides the sidebar navigation for the Backstage app. - * Uses dynamic branding from Operator configuration. - */ - -import { PropsWithChildren, useState, useEffect } from 'react'; -import { makeStyles } from '@material-ui/core'; -import HomeIcon from '@material-ui/icons/Home'; -import CategoryIcon from '@material-ui/icons/Category'; -import SearchIcon from '@material-ui/icons/Search'; -import AssignmentIcon from '@material-ui/icons/Assignment'; -import ExtensionIcon from '@material-ui/icons/Extension'; -import ViewColumnIcon from '@material-ui/icons/ViewColumn'; -// Tier icons -import LayersIcon from '@material-ui/icons/Layers'; // Foundation -import LibraryBooksIcon from '@material-ui/icons/LibraryBooks'; // Standards -import StorageIcon from '@material-ui/icons/Storage'; // Engines -import BuildIcon from '@material-ui/icons/Build'; // Ecosystem -import ArchiveIcon from '@material-ui/icons/Archive'; // Noncurrent -import { - Sidebar, - SidebarDivider, - SidebarGroup, - SidebarItem, - SidebarPage, - SidebarSpace, - SidebarSubmenu, - SidebarSubmenuItem, - useSidebarOpenState, -} from '@backstage/core-components'; -import { SidebarSearchModal } from '@backstage/plugin-search'; -import { useOperatorTheme } from '../../theme'; - -const useSidebarLogoStyles = makeStyles((theme) => ({ - root: { - width: '100%', - height: 50, - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - padding: '0 24px', - }, - logo: { - height: 36, - maxWidth: '100%', - objectFit: 'contain', - }, - title: { - fontSize: '1.2rem', - fontWeight: 600, - color: theme.palette.navigation?.color || theme.palette.common.white, - textDecoration: 'none', - }, - titleClosed: { - fontSize: '1rem', - }, -})); - -function SidebarLogo() { - const classes = useSidebarLogoStyles(); - const { isOpen } = useSidebarOpenState(); - const theme = useOperatorTheme(); - const [logoError, setLogoError] = useState(false); - - // Reset logo error when theme changes - useEffect(() => { - setLogoError(false); - }, [theme?.logoPath]); - - const appTitle = theme?.appTitle || 'Operator'; - const shortTitle = theme?.orgName?.substring(0, 2) || 'Op'; - const hasLogo = theme?.logoPath && !logoError; - - return ( - <div className={classes.root}> - {isOpen && hasLogo ? ( - <img - src="/branding/logo.svg" - alt={appTitle} - className={classes.logo} - onError={() => setLogoError(true)} - /> - ) : ( - <span className={`${classes.title} ${!isOpen ? classes.titleClosed : ''}`}> - {isOpen ? appTitle : shortTitle} - </span> - )} - </div> - ); -} - -export function Root({ children }: PropsWithChildren) { - return ( - <SidebarPage> - <Sidebar> - <SidebarLogo /> - <SidebarGroup label="Search" icon={<SearchIcon />} to="/search"> - <SidebarSearchModal /> - </SidebarGroup> - <SidebarDivider /> - <SidebarGroup label="Menu" icon={<HomeIcon />}> - <SidebarItem icon={HomeIcon} to="/" text="Home" /> - <SidebarItem icon={CategoryIcon} to="/catalog" text="Repositories"> - <SidebarSubmenu title="Repositories by Tier"> - <SidebarSubmenuItem - title="Foundation" - to="/catalog?filters[metadata.labels.operator-tier]=foundation" - icon={LayersIcon} - /> - <SidebarSubmenuItem - title="Standards" - to="/catalog?filters[metadata.labels.operator-tier]=standards" - icon={LibraryBooksIcon} - /> - <SidebarSubmenuItem - title="Engines" - to="/catalog?filters[metadata.labels.operator-tier]=engines" - icon={StorageIcon} - /> - <SidebarSubmenuItem - title="Ecosystem" - to="/catalog?filters[metadata.labels.operator-tier]=ecosystem" - icon={BuildIcon} - /> - <SidebarSubmenuItem - title="Noncurrent" - to="/catalog?filters[metadata.labels.operator-tier]=noncurrent" - icon={ArchiveIcon} - /> - </SidebarSubmenu> - </SidebarItem> - <SidebarItem icon={ViewColumnIcon} to="/board" text="Board" /> - <SidebarItem icon={AssignmentIcon} to="/issuetypes" text="Issue Types"> - <SidebarSubmenu title="Issue Types"> - <SidebarSubmenuItem title="All Types" to="/issuetypes" /> - <SidebarSubmenuItem title="Collections" to="/issuetypes/collections" /> - <SidebarSubmenuItem title="New Type" to="/issuetypes/new" /> - </SidebarSubmenu> - </SidebarItem> - <SidebarItem icon={ExtensionIcon} to="/plugins" text="Plugins" /> - </SidebarGroup> - <SidebarSpace /> - <SidebarDivider /> - </Sidebar> - {children} - </SidebarPage> - ); -} diff --git a/backstage-server/packages/app/src/components/catalog/ApiTypeBadge.tsx b/backstage-server/packages/app/src/components/catalog/ApiTypeBadge.tsx deleted file mode 100644 index d3a6bf9a..00000000 --- a/backstage-server/packages/app/src/components/catalog/ApiTypeBadge.tsx +++ /dev/null @@ -1,86 +0,0 @@ -/** - * API Type Badge Component - * - * Displays a colored badge indicating the API type (OpenAPI, gRPC, GraphQL, etc.) - */ - -import React from 'react'; -import { Chip, makeStyles } from '@material-ui/core'; - -// API type color mapping -const API_TYPE_COLORS: Record<string, { background: string; text: string }> = { - openapi: { background: '#2196F3', text: '#fff' }, - grpc: { background: '#9C27B0', text: '#fff' }, - graphql: { background: '#E91E63', text: '#fff' }, - soap: { background: '#FF9800', text: '#fff' }, - 'json-rpc': { background: '#009688', text: '#fff' }, - asyncapi: { background: '#4CAF50', text: '#fff' }, -}; - -const DEFAULT_COLOR = { background: '#607D8B', text: '#fff' }; - -// Human-readable labels for API types -const API_TYPE_LABELS: Record<string, string> = { - openapi: 'OpenAPI', - grpc: 'gRPC', - graphql: 'GraphQL', - soap: 'SOAP', - 'json-rpc': 'JSON-RPC', - asyncapi: 'AsyncAPI', -}; - -const useStyles = makeStyles({ - badge: { - height: 20, - fontSize: '0.7rem', - fontWeight: 600, - marginLeft: 8, - textTransform: 'uppercase', - letterSpacing: '0.5px', - }, -}); - -interface ApiTypeBadgeProps { - apiType?: string; - className?: string; -} - -export function ApiTypeBadge({ apiType, className }: ApiTypeBadgeProps) { - const classes = useStyles(); - - if (!apiType) { - return null; - } - - const normalizedType = apiType.toLowerCase(); - const colors = API_TYPE_COLORS[normalizedType] || DEFAULT_COLOR; - const label = API_TYPE_LABELS[normalizedType] || apiType.toUpperCase(); - - return ( - <Chip - label={label} - size="small" - className={`${classes.badge} ${className || ''}`} - style={{ - backgroundColor: colors.background, - color: colors.text, - }} - /> - ); -} - -// Check if an entity is an API type -export function isApiEntity(entity: { kind: string; spec?: Record<string, unknown> }): boolean { - if (entity.kind?.toLowerCase() === 'api') { - return true; - } - - // Check Operator taxonomy kinds that map to API - const specType = entity.spec?.type as string | undefined; - if (specType) { - const apiTypes = ['proto-sdk', 'api-gateway', 'api']; - return apiTypes.includes(specType.toLowerCase()); - } - - return false; -} diff --git a/backstage-server/packages/app/src/components/catalog/EntityPage.tsx b/backstage-server/packages/app/src/components/catalog/EntityPage.tsx deleted file mode 100644 index ab0e8856..00000000 --- a/backstage-server/packages/app/src/components/catalog/EntityPage.tsx +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Entity Page Component - * - * Displays detailed information about a catalog entity. - */ - -import React from 'react'; -import { Grid } from '@material-ui/core'; -import { - EntityAboutCard, - EntityHasSubcomponentsCard, - EntityLinksCard, - EntitySwitch, - EntityOrphanWarning, - EntityProcessingErrorsPanel, - isKind, -} from '@backstage/plugin-catalog'; -import { - EntityLayout, -} from '@backstage/plugin-catalog'; - -const entityWarningContent = ( - <> - <EntitySwitch> - <EntitySwitch.Case if={e => Boolean(e.metadata.annotations?.['backstage.io/orphan'])}> - <Grid item xs={12}> - <EntityOrphanWarning /> - </Grid> - </EntitySwitch.Case> - </EntitySwitch> - <EntitySwitch> - <EntitySwitch.Case if={e => Boolean(e.metadata.annotations?.['backstage.io/processing-errors'])}> - <Grid item xs={12}> - <EntityProcessingErrorsPanel /> - </Grid> - </EntitySwitch.Case> - </EntitySwitch> - </> -); - -const overviewContent = ( - <Grid container spacing={3} alignItems="stretch"> - {entityWarningContent} - <Grid item md={6}> - <EntityAboutCard variant="gridItem" /> - </Grid> - <Grid item md={6}> - <EntityLinksCard /> - </Grid> - <Grid item md={12}> - <EntityHasSubcomponentsCard variant="gridItem" /> - </Grid> - </Grid> -); - -const componentPage = ( - <EntityLayout> - <EntityLayout.Route path="/" title="Overview"> - {overviewContent} - </EntityLayout.Route> - </EntityLayout> -); - -const apiPage = ( - <EntityLayout> - <EntityLayout.Route path="/" title="Overview"> - {overviewContent} - </EntityLayout.Route> - </EntityLayout> -); - -const systemPage = ( - <EntityLayout> - <EntityLayout.Route path="/" title="Overview"> - {overviewContent} - </EntityLayout.Route> - </EntityLayout> -); - -const domainPage = ( - <EntityLayout> - <EntityLayout.Route path="/" title="Overview"> - {overviewContent} - </EntityLayout.Route> - </EntityLayout> -); - -const defaultPage = ( - <EntityLayout> - <EntityLayout.Route path="/" title="Overview"> - {overviewContent} - </EntityLayout.Route> - </EntityLayout> -); - -export function entityPage() { - return ( - <EntitySwitch> - <EntitySwitch.Case if={isKind('component')}>{componentPage}</EntitySwitch.Case> - <EntitySwitch.Case if={isKind('api')}>{apiPage}</EntitySwitch.Case> - <EntitySwitch.Case if={isKind('system')}>{systemPage}</EntitySwitch.Case> - <EntitySwitch.Case if={isKind('domain')}>{domainPage}</EntitySwitch.Case> - <EntitySwitch.Case>{defaultPage}</EntitySwitch.Case> - </EntitySwitch> - ); -} diff --git a/backstage-server/packages/app/src/components/catalog/OperatorCatalogPage.tsx b/backstage-server/packages/app/src/components/catalog/OperatorCatalogPage.tsx deleted file mode 100644 index 2a1781fd..00000000 --- a/backstage-server/packages/app/src/components/catalog/OperatorCatalogPage.tsx +++ /dev/null @@ -1,203 +0,0 @@ -/** - * Operator Catalog Page - * - * Custom catalog page that defaults to an Operator-focused view (hiding owner/system) - * with a toggle to switch to the full Backstage enterprise view. - */ - -import { useMemo } from 'react'; -import { useLocation, useNavigate } from 'react-router-dom'; -import { - Content, - ContentHeader, - PageWithHeader, - SupportButton, -} from '@backstage/core-components'; -import { CatalogTable } from '@backstage/plugin-catalog'; -import { - CatalogFilterLayout, - EntityListProvider, - EntityKindPicker, - EntityTagPicker, - EntityOwnerPicker, - EntityLifecyclePicker, - EntityTypePicker, -} from '@backstage/plugin-catalog-react'; -import { - Button, - ButtonGroup, - makeStyles, - Typography, - Box, -} from '@material-ui/core'; -import ViewModuleIcon from '@material-ui/icons/ViewModule'; -import BusinessIcon from '@material-ui/icons/Business'; -import { getOperatorColumns, getBackstageColumns } from './columns'; - -const useStyles = makeStyles((theme) => ({ - viewToggle: { - marginLeft: 'auto', - }, - toggleButton: { - textTransform: 'none', - padding: '6px 16px', - }, - activeButton: { - backgroundColor: theme.palette.primary.main, - color: theme.palette.primary.contrastText, - '&:hover': { - backgroundColor: theme.palette.primary.dark, - }, - }, - headerRow: { - display: 'flex', - alignItems: 'center', - gap: theme.spacing(2), - marginBottom: theme.spacing(2), - }, - filterSection: { - display: 'flex', - flexDirection: 'column', - gap: theme.spacing(2), - }, -})); - -type ViewMode = 'operator' | 'backstage'; - -function useViewMode(): [ViewMode, (mode: ViewMode) => void] { - const location = useLocation(); - const navigate = useNavigate(); - - const viewMode = useMemo(() => { - const params = new URLSearchParams(location.search); - const view = params.get('view'); - return view === 'backstage' ? 'backstage' : 'operator'; - }, [location.search]); - - const setViewMode = (mode: ViewMode) => { - const params = new URLSearchParams(location.search); - if (mode === 'backstage') { - params.set('view', 'backstage'); - } else { - params.delete('view'); - } - const newSearch = params.toString(); - navigate({ - pathname: location.pathname, - search: newSearch ? `?${newSearch}` : '', - }, { replace: true }); - }; - - return [viewMode, setViewMode]; -} - -function ViewModeToggle({ - viewMode, - onViewModeChange, -}: { - viewMode: ViewMode; - onViewModeChange: (mode: ViewMode) => void; -}) { - const classes = useStyles(); - - return ( - <Box className={classes.viewToggle}> - <ButtonGroup size="small" variant="outlined"> - <Button - className={`${classes.toggleButton} ${viewMode === 'operator' ? classes.activeButton : ''}`} - onClick={() => onViewModeChange('operator')} - startIcon={<ViewModuleIcon />} - > - Operator - </Button> - <Button - className={`${classes.toggleButton} ${viewMode === 'backstage' ? classes.activeButton : ''}`} - onClick={() => onViewModeChange('backstage')} - startIcon={<BusinessIcon />} - > - Backstage - </Button> - </ButtonGroup> - </Box> - ); -} - -function OperatorFilters() { - return ( - <> - <EntityKindPicker /> - <EntityTypePicker /> - <EntityTagPicker /> - </> - ); -} - -function BackstageFilters() { - return ( - <> - <EntityKindPicker /> - <EntityTypePicker /> - <EntityOwnerPicker /> - <EntityLifecyclePicker /> - <EntityTagPicker /> - </> - ); -} - -function CatalogTableView({ viewMode }: { viewMode: ViewMode }) { - const columns = useMemo(() => { - return viewMode === 'operator' ? getOperatorColumns() : getBackstageColumns(); - }, [viewMode]); - - return ( - <CatalogTable - columns={columns} - /> - ); -} - -function CatalogContent({ viewMode }: { viewMode: ViewMode }) { - return ( - <CatalogFilterLayout> - <CatalogFilterLayout.Filters> - {viewMode === 'operator' ? <OperatorFilters /> : <BackstageFilters />} - </CatalogFilterLayout.Filters> - <CatalogFilterLayout.Content> - <CatalogTableView viewMode={viewMode} /> - </CatalogFilterLayout.Content> - </CatalogFilterLayout> - ); -} - -export function OperatorCatalogPage() { - const classes = useStyles(); - const [viewMode, setViewMode] = useViewMode(); - - return ( - <PageWithHeader title="Repositories" themeId="home" data-testid="catalog-page-banner"> - <Content> - <Box className={classes.headerRow}> - <ContentHeader title=""> - <SupportButton> - {viewMode === 'operator' ? ( - <Typography> - Viewing repositories organized by Operator taxonomy. - Switch to Backstage view for owner and system information. - </Typography> - ) : ( - <Typography> - Viewing standard Backstage catalog with owner and system columns. - Switch to Operator view for tier-based organization. - </Typography> - )} - </SupportButton> - </ContentHeader> - <ViewModeToggle viewMode={viewMode} onViewModeChange={setViewMode} /> - </Box> - <EntityListProvider> - <CatalogContent viewMode={viewMode} /> - </EntityListProvider> - </Content> - </PageWithHeader> - ); -} diff --git a/backstage-server/packages/app/src/components/catalog/TierDisplay.tsx b/backstage-server/packages/app/src/components/catalog/TierDisplay.tsx deleted file mode 100644 index 4c516212..00000000 --- a/backstage-server/packages/app/src/components/catalog/TierDisplay.tsx +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Tier Display Component - * - * Displays the Operator tier with matching icon from the taxonomy. - */ - -import React from 'react'; -import { makeStyles, Typography } from '@material-ui/core'; -import LayersIcon from '@material-ui/icons/Layers'; -import LibraryBooksIcon from '@material-ui/icons/LibraryBooks'; -import StorageIcon from '@material-ui/icons/Storage'; -import BuildIcon from '@material-ui/icons/Build'; -import ArchiveIcon from '@material-ui/icons/Archive'; -import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; - -// Tier configuration matching taxonomy.toml -const TIER_CONFIG: Record<string, { - label: string; - icon: React.ElementType; - color: string; -}> = { - foundation: { - label: 'Foundation', - icon: LayersIcon, - color: '#5C6BC0', // Indigo - }, - standards: { - label: 'Standards', - icon: LibraryBooksIcon, - color: '#42A5F5', // Blue - }, - engines: { - label: 'Engines', - icon: StorageIcon, - color: '#66BB6A', // Green - }, - ecosystem: { - label: 'Ecosystem', - icon: BuildIcon, - color: '#FFA726', // Orange - }, - noncurrent: { - label: 'Noncurrent', - icon: ArchiveIcon, - color: '#78909C', // Blue Grey - }, -}; - -const useStyles = makeStyles({ - container: { - display: 'flex', - alignItems: 'center', - gap: 6, - }, - icon: { - fontSize: 18, - }, - label: { - fontSize: '0.875rem', - fontWeight: 500, - }, -}); - -interface TierDisplayProps { - tier?: string; - className?: string; -} - -export function TierDisplay({ tier, className }: TierDisplayProps) { - const classes = useStyles(); - - if (!tier) { - return ( - <Typography variant="body2" color="textSecondary"> - — - </Typography> - ); - } - - const normalizedTier = tier.toLowerCase(); - const config = TIER_CONFIG[normalizedTier]; - - if (!config) { - return ( - <div className={`${classes.container} ${className || ''}`}> - <HelpOutlineIcon className={classes.icon} style={{ color: '#9E9E9E' }} /> - <Typography className={classes.label} style={{ color: '#9E9E9E' }}> - {tier} - </Typography> - </div> - ); - } - - const IconComponent = config.icon; - - return ( - <div className={`${classes.container} ${className || ''}`}> - <IconComponent className={classes.icon} style={{ color: config.color }} /> - <Typography className={classes.label} style={{ color: config.color }}> - {config.label} - </Typography> - </div> - ); -} diff --git a/backstage-server/packages/app/src/components/catalog/columns.tsx b/backstage-server/packages/app/src/components/catalog/columns.tsx deleted file mode 100644 index 0ca775d7..00000000 --- a/backstage-server/packages/app/src/components/catalog/columns.tsx +++ /dev/null @@ -1,241 +0,0 @@ -/** - * Catalog Table Column Definitions - * - * Defines columns for Operator mode and Backstage mode views. - * Uses CatalogTableColumnsFunc pattern for compatibility with CatalogTable. - */ - -import { Link, OverflowTooltip, TableColumn } from '@backstage/core-components'; -import { Chip, makeStyles, Tooltip } from '@material-ui/core'; -import { Entity } from '@backstage/catalog-model'; -import { CatalogTableRow } from '@backstage/plugin-catalog'; -import { ApiTypeBadge, isApiEntity } from './ApiTypeBadge'; -import { TierDisplay } from './TierDisplay'; - -const useStyles = makeStyles({ - nameCell: { - display: 'flex', - alignItems: 'center', - gap: 4, - }, - tagChip: { - height: 20, - fontSize: '0.7rem', - margin: 2, - }, - tagsContainer: { - display: 'flex', - flexWrap: 'wrap', - gap: 2, - }, -}); - -// Format Operator kind from spec.type (e.g., "api-gateway" -> "API Gateway") -function formatOperatorKind(specType?: string): string { - if (!specType) {return '—';} - return specType - .split('-') - .map(word => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' '); -} - -// ============================================================================ -// Operator Mode Columns -// ============================================================================ - -function NameCellOperator({ entity }: { entity: Entity }) { - const classes = useStyles(); - const title = entity.metadata.title || entity.metadata.name; - const namespace = entity.metadata.namespace || 'default'; - const kind = entity.kind.toLowerCase(); - const isApi = isApiEntity(entity); - const apiType = entity.spec?.type as string | undefined; - - return ( - <div className={classes.nameCell}> - <Link to={`/catalog/${namespace}/${kind}/${entity.metadata.name}`}> - {title} - </Link> - {isApi && <ApiTypeBadge apiType={apiType} />} - </div> - ); -} - -function TagsCell({ entity }: { entity: Entity }) { - const classes = useStyles(); - const tags = entity.metadata.tags || []; - - if (tags.length === 0) { - return <span>—</span>; - } - - const displayTags = tags.slice(0, 3); - const remainingCount = tags.length - 3; - - return ( - <div className={classes.tagsContainer}> - {displayTags.map(tag => ( - <Chip - key={tag} - label={tag} - size="small" - className={classes.tagChip} - variant="outlined" - /> - ))} - {remainingCount > 0 && ( - <Tooltip title={tags.slice(3).join(', ')}> - <Chip - label={`+${remainingCount}`} - size="small" - className={classes.tagChip} - variant="outlined" - /> - </Tooltip> - )} - </div> - ); -} - -export function getOperatorColumns(): TableColumn<CatalogTableRow>[] { - return [ - { - title: 'Name', - field: 'resolved.name', - highlight: true, - render: (row: CatalogTableRow) => <NameCellOperator entity={row.entity} />, - }, - { - title: 'Kind', - field: 'entity.spec.type', - render: (row: CatalogTableRow) => { - const specType = row.entity.spec?.type as string | undefined; - return ( - <span style={{ textTransform: 'capitalize' }}> - {formatOperatorKind(specType)} - </span> - ); - }, - }, - { - title: 'Tier', - field: 'entity.metadata.labels.operator-tier', - render: (row: CatalogTableRow) => { - const tier = row.entity.metadata.labels?.['operator-tier']; - return <TierDisplay tier={tier} />; - }, - }, - { - title: 'Description', - field: 'entity.metadata.description', - render: (row: CatalogTableRow) => ( - <OverflowTooltip text={row.entity.metadata.description || '—'} /> - ), - }, - { - title: 'Tags', - field: 'entity.metadata.tags', - render: (row: CatalogTableRow) => <TagsCell entity={row.entity} />, - }, - ]; -} - -// ============================================================================ -// Backstage Mode Columns -// ============================================================================ - -function NameCellBackstage({ entity }: { entity: Entity }) { - const namespace = entity.metadata.namespace || 'default'; - const kind = entity.kind.toLowerCase(); - const title = entity.metadata.title || entity.metadata.name; - - return ( - <Link to={`/catalog/${namespace}/${kind}/${entity.metadata.name}`}> - {title} - </Link> - ); -} - -function OwnerCell({ entity }: { entity: Entity }) { - const owner = entity.spec?.owner as string | undefined; - if (!owner) {return <span>—</span>;} - - // Display owner as text - refs may not be fully qualified in local-file mode - return <span>{owner}</span>; -} - -function SystemCell({ entity }: { entity: Entity }) { - const system = entity.spec?.system as string | undefined; - if (!system) {return <span>—</span>;} - - // Display system as text - refs may not be fully qualified in local-file mode - return <span>{system}</span>; -} - -function LifecycleCell({ entity }: { entity: Entity }) { - const lifecycle = entity.spec?.lifecycle as string | undefined; - if (!lifecycle) {return <span>—</span>;} - - const colors: Record<string, string> = { - production: '#4CAF50', - experimental: '#FF9800', - deprecated: '#F44336', - }; - - const color = colors[lifecycle.toLowerCase()] || '#9E9E9E'; - - return ( - <Chip - label={lifecycle} - size="small" - style={{ - backgroundColor: color, - color: '#fff', - height: 20, - fontSize: '0.7rem', - textTransform: 'capitalize', - }} - /> - ); -} - -export function getBackstageColumns(): TableColumn<CatalogTableRow>[] { - return [ - { - title: 'Name', - field: 'resolved.name', - highlight: true, - render: (row: CatalogTableRow) => <NameCellBackstage entity={row.entity} />, - }, - { - title: 'Kind', - field: 'entity.kind', - render: (row: CatalogTableRow) => ( - <span style={{ textTransform: 'capitalize' }}>{row.entity.kind}</span> - ), - }, - { - title: 'Owner', - field: 'entity.spec.owner', - render: (row: CatalogTableRow) => <OwnerCell entity={row.entity} />, - }, - { - title: 'System', - field: 'entity.spec.system', - render: (row: CatalogTableRow) => <SystemCell entity={row.entity} />, - }, - { - title: 'Lifecycle', - field: 'entity.spec.lifecycle', - render: (row: CatalogTableRow) => <LifecycleCell entity={row.entity} />, - }, - { - title: 'Type', - field: 'entity.spec.type', - render: (row: CatalogTableRow) => { - const specType = row.entity.spec?.type as string | undefined; - return <span>{specType || '—'}</span>; - }, - }, - ]; -} diff --git a/backstage-server/packages/app/src/components/common/ErrorState.tsx b/backstage-server/packages/app/src/components/common/ErrorState.tsx deleted file mode 100644 index fc64ea55..00000000 --- a/backstage-server/packages/app/src/components/common/ErrorState.tsx +++ /dev/null @@ -1,75 +0,0 @@ -/** - * ErrorState Component - * - * Reusable error state display for async components. - * Shows error icon, message, and optional retry button. - */ - -import React from 'react'; -import { Card, CardBody, Flex, Text, Button } from '@backstage/ui'; -import { RiErrorWarningLine, RiRefreshLine } from '@remixicon/react'; - -interface ErrorStateProps { - title?: string; - message?: string; - onRetry?: () => void; - compact?: boolean; -} - -export function ErrorState({ - title = 'Error', - message = 'Unable to load data', - onRetry, - compact = false, -}: ErrorStateProps) { - const content = ( - <div role="alert"> - <Flex - direction="column" - align="center" - justify="center" - gap="3" - p={compact ? '3' : '4'} - > - <RiErrorWarningLine - size={compact ? 24 : 32} - color="var(--bui-color-error, #E05D44)" - /> - <Flex direction="column" align="center" gap="1"> - <Text - variant={compact ? 'body-medium' : 'title-small'} - style={{ color: 'var(--bui-color-error, #E05D44)' }} - > - {title} - </Text> - <Text variant="body-small" color="secondary"> - {message} - </Text> - </Flex> - {onRetry && ( - <Button - variant="secondary" - size="small" - onClick={onRetry} - aria-label="Retry loading" - > - <Flex align="center" gap="1"> - <RiRefreshLine size={16} /> - <span>Retry</span> - </Flex> - </Button> - )} - </Flex> - </div> - ); - - if (compact) { - return content; - } - - return ( - <Card> - <CardBody>{content}</CardBody> - </Card> - ); -} diff --git a/backstage-server/packages/app/src/components/home/HomePage.css b/backstage-server/packages/app/src/components/home/HomePage.css deleted file mode 100644 index d52a6ec8..00000000 --- a/backstage-server/packages/app/src/components/home/HomePage.css +++ /dev/null @@ -1,45 +0,0 @@ -/** - * HomePage Styles - * Uses CSS variables from operator-theme.css - */ - -/* Welcome Card - Gradient banner */ -.welcome-card { - background: linear-gradient(135deg, var(--bui-primary) 0%, var(--bui-secondary) 100%) !important; - border: none !important; -} - -.welcome-title, -.welcome-text { - color: #ffffff !important; -} - -/* Quick Link Cards */ -.quick-link-card { - text-decoration: none !important; - display: block; - height: 100%; -} - -.quick-link-card-inner { - height: 100%; - transition: transform 0.2s ease, box-shadow 0.2s ease; - cursor: pointer; -} - -.quick-link-card-inner:hover { - transform: translateY(-4px); - box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); -} - -.quick-link-icon { - color: var(--bui-primary); -} - -.quick-link-title { - text-align: center; -} - -.quick-link-description { - text-align: center; -} diff --git a/backstage-server/packages/app/src/components/home/HomePage.tsx b/backstage-server/packages/app/src/components/home/HomePage.tsx deleted file mode 100644 index cc852d42..00000000 --- a/backstage-server/packages/app/src/components/home/HomePage.tsx +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Operator Portal Home Page - * - * Landing page with quick links and overview widgets. - * Uses BUI (Backstage UI) components for consistent theming. - */ - -import { Content, Page, Header } from '@backstage/core-components'; -import { Grid, Card, CardBody, Text, Flex, Link } from '@backstage/ui'; -import { - RiDashboardLine, - RiSearchLine, - RiFileList3Line, - RiFolderLine, -} from '@remixicon/react'; -import './HomePage.css'; - -interface QuickLinkProps { - to: string; - icon: React.ReactNode; - title: string; - description: string; -} - -function QuickLinkCard({ to, icon, title, description }: QuickLinkProps) { - return ( - <Link href={to} className="quick-link-card"> - <Card className="quick-link-card-inner"> - <CardBody> - <Flex direction="column" align="center" gap="3" p="4"> - <div className="quick-link-icon">{icon}</div> - <Text variant="title-small" className="quick-link-title"> - {title} - </Text> - <Text variant="body-small" color="secondary" className="quick-link-description"> - {description} - </Text> - </Flex> - </CardBody> - </Card> - </Link> - ); -} - -function HomePage() { - return ( - <Page themeId="home"> - <Header title="Operator! Portal" subtitle="Developer portal and ticket management" /> - <Content> - <Flex direction="column" gap="6" p="6"> - {/* Welcome Card */} - <Card className="welcome-card"> - <CardBody> - <Flex direction="column" gap="2" p="4"> - <Text variant="title-large" className="welcome-title"> - Welcome to Operator - </Text> - <Text variant="body-medium" className="welcome-text"> - Your central hub for managing Claude Code agents, tickets, and software catalog. - Explore the catalog, create tickets, and track your work. - </Text> - </Flex> - </CardBody> - </Card> - - {/* Quick Links Section */} - <Flex direction="column" gap="4"> - <Text variant="title-medium">Quick Links</Text> - <Grid.Root columns={{ initial: '1', sm: '2', md: '4' }} gap="4"> - <Grid.Item> - <QuickLinkCard - to="/catalog" - icon={<RiDashboardLine size={48} />} - title="Software Catalog" - description="Browse components, APIs, and systems" - /> - </Grid.Item> - <Grid.Item> - <QuickLinkCard - to="/issuetypes" - icon={<RiFileList3Line size={48} />} - title="Issue Types" - description="Manage ticket templates and workflows" - /> - </Grid.Item> - <Grid.Item> - <QuickLinkCard - to="/issuetypes/collections" - icon={<RiFolderLine size={48} />} - title="Collections" - description="Browse issue type collections" - /> - </Grid.Item> - <Grid.Item> - <QuickLinkCard - to="/search" - icon={<RiSearchLine size={48} />} - title="Search" - description="Find anything in the catalog" - /> - </Grid.Item> - </Grid.Root> - </Flex> - </Flex> - </Content> - </Page> - ); -} - -export { HomePage }; -export default HomePage; diff --git a/backstage-server/packages/app/src/components/home/OperatorHomePage.tsx b/backstage-server/packages/app/src/components/home/OperatorHomePage.tsx deleted file mode 100644 index 4b721726..00000000 --- a/backstage-server/packages/app/src/components/home/OperatorHomePage.tsx +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Operator Home Page - * - * Main homepage container for the Operator portal. - * Supports dynamic widget slots for extension-based composition. - */ - -import React from 'react'; -import { Page, Header, Content } from '@backstage/core-components'; -import { Grid, Card, CardBody, Flex, Text, Link } from '@backstage/ui'; -import { - RiDashboardLine, - RiSearchLine, -} from '@remixicon/react'; -import { QueueStatusCard, ActiveAgentsCard, IssueTypesCard } from './widgets'; -import './HomePage.css'; - -interface QuickLinkProps { - to: string; - icon: React.ReactNode; - title: string; - description: string; -} - -function QuickLinkCard({ to, icon, title, description }: QuickLinkProps) { - return ( - <Link href={to} className="quick-link-card"> - <Card className="quick-link-card-inner"> - <CardBody> - <Flex direction="column" align="center" gap="3" p="4"> - <div className="quick-link-icon">{icon}</div> - <Text variant="title-small" className="quick-link-title"> - {title} - </Text> - <Text variant="body-small" color="secondary" className="quick-link-description"> - {description} - </Text> - </Flex> - </CardBody> - </Card> - </Link> - ); -} - -export interface OperatorHomePageProps { - /** - * Dynamic widgets passed from extension system. - * When using the new frontend system, widgets are extensions - * that attach to this page's widget input. - */ - widgets?: React.ReactNode[]; -} - -export function OperatorHomePage({ widgets }: OperatorHomePageProps) { - // Default widgets when not using extension system - const defaultWidgets = [ - <QueueStatusCard key="queue" />, - <ActiveAgentsCard key="agents" />, - <IssueTypesCard key="issuetypes" />, - ]; - - const displayWidgets = widgets && widgets.length > 0 ? widgets : defaultWidgets; - - return ( - <Page themeId="home"> - <Header - title="Operator! Portal" - subtitle="Developer portal and agent orchestration" - /> - <Content> - <Flex direction="column" gap="6" p="6"> - {/* Welcome Section */} - <Card className="welcome-card"> - <CardBody> - <Flex direction="column" gap="2" p="4"> - <Text variant="title-large" className="welcome-title"> - Welcome to Operator - </Text> - <Text variant="body-medium" className="welcome-text"> - Manage Claude Code agents, track tickets, and explore your software catalog. - Monitor your queue, launch agents, and define issue type templates. - </Text> - </Flex> - </CardBody> - </Card> - - {/* Widgets Grid */} - <Flex direction="column" gap="4"> - <Text variant="title-medium">Dashboard</Text> - <Grid.Root columns={{ initial: '1', md: '2', lg: '3' }} gap="4"> - {displayWidgets.map((widget, index) => ( - <Grid.Item key={index}>{widget}</Grid.Item> - ))} - </Grid.Root> - </Flex> - - {/* Quick Links Section */} - <Flex direction="column" gap="4"> - <Text variant="title-medium">Quick Links</Text> - <Grid.Root columns={{ initial: '1', sm: '2' }} gap="4"> - <Grid.Item> - <QuickLinkCard - to="/catalog" - icon={<RiDashboardLine size={48} />} - title="Software Catalog" - description="Browse components, APIs, and systems" - /> - </Grid.Item> - <Grid.Item> - <QuickLinkCard - to="/search" - icon={<RiSearchLine size={48} />} - title="Search" - description="Find anything in the catalog" - /> - </Grid.Item> - </Grid.Root> - </Flex> - </Flex> - </Content> - </Page> - ); -} diff --git a/backstage-server/packages/app/src/components/home/widgets/ActiveAgentsCard.test.tsx b/backstage-server/packages/app/src/components/home/widgets/ActiveAgentsCard.test.tsx deleted file mode 100644 index ecb9c1d2..00000000 --- a/backstage-server/packages/app/src/components/home/widgets/ActiveAgentsCard.test.tsx +++ /dev/null @@ -1,90 +0,0 @@ -/** - * ActiveAgentsCard Tests - * - * Tests for loading, error, empty, and success states. - */ - -import { describe, test, expect, beforeEach } from 'bun:test'; -import { waitFor } from '@testing-library/react'; -import { http, HttpResponse } from 'msw'; -import { server } from '../../../test/handlers'; -import { renderWithProviders } from '../../../test/utils'; -import { ActiveAgentsCard } from './ActiveAgentsCard'; - -describe('ActiveAgentsCard', () => { - beforeEach(() => { - server.resetHandlers(); - }); - - test('renders and loads data', async () => { - // Default handler returns empty data - const { getByText } = renderWithProviders(<ActiveAgentsCard />); - - // Wait for card to render - await waitFor(() => { - expect(getByText('Active Agents')).toBeTruthy(); - }); - }); - - test('shows error state when API fails', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/agents/active', () => { - return HttpResponse.json(null, { status: 500 }); - }) - ); - - const { getByRole, getByText } = renderWithProviders(<ActiveAgentsCard />); - - await waitFor(() => { - expect(getByRole('alert')).toBeTruthy(); - }); - - expect(getByText(/failed to load/i)).toBeTruthy(); - expect(getByRole('button', { name: /retry/i })).toBeTruthy(); - }); - - test('shows empty state when no agents running', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/agents/active', () => { - return HttpResponse.json({ agents: [], count: 0 }); - }) - ); - - const { getByText } = renderWithProviders(<ActiveAgentsCard />); - - await waitFor(() => { - expect(getByText('No agents running')).toBeTruthy(); - }); - }); - - test('shows agents when API returns data', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/agents/active', () => { - return HttpResponse.json({ - agents: [ - { - id: 'agent-1', - ticket_id: 'FEAT-1234', - ticket_type: 'FEAT', - project: 'operator', - status: 'running', - mode: 'autonomous', - started_at: new Date(Date.now() - 5 * 60 * 1000).toISOString(), - current_step: 'implement', - }, - ], - count: 1, - }); - }) - ); - - const { getByText } = renderWithProviders(<ActiveAgentsCard />); - - await waitFor(() => { - expect(getByText('FEAT-1234')).toBeTruthy(); - }); - - expect(getByText('operator')).toBeTruthy(); - expect(getByText('Auto')).toBeTruthy(); - }); -}); diff --git a/backstage-server/packages/app/src/components/home/widgets/ActiveAgentsCard.tsx b/backstage-server/packages/app/src/components/home/widgets/ActiveAgentsCard.tsx deleted file mode 100644 index 3b013a1f..00000000 --- a/backstage-server/packages/app/src/components/home/widgets/ActiveAgentsCard.tsx +++ /dev/null @@ -1,204 +0,0 @@ -/** - * Active Agents Widget - * - * Displays currently running Claude Code agents with status. - * Shows agent name, project, elapsed time, and mode. - */ - -import React from 'react'; -import { Card, CardBody, Flex, Text, Box, Link } from '@backstage/ui'; -import { Progress } from '@backstage/core-components'; -import { - RiRobot2Line, - RiTimeLine, - RiUserLine, - RiCodeLine, - RiPlayCircleLine, - RiPauseCircleLine, -} from '@remixicon/react'; -import { useActiveAgentsQuery, type Agent } from '../../../api/queries'; -import { ErrorState } from '../../common/ErrorState'; - -function formatElapsed(startedAt: string): string { - const start = new Date(startedAt).getTime(); - const now = Date.now(); - const elapsed = Math.floor((now - start) / 1000); - - if (elapsed < 60) {return `${elapsed}s`;} - if (elapsed < 3600) {return `${Math.floor(elapsed / 60)}m`;} - const hours = Math.floor(elapsed / 3600); - const mins = Math.floor((elapsed % 3600) / 60); - return `${hours}h ${mins}m`; -} - -interface AgentRowProps { - agent: Agent; -} - -function AgentRow({ agent }: AgentRowProps) { - const statusColors: Record<string, string> = { - running: '#66AA99', - awaiting_input: '#E9A820', - completing: '#6688AA', - }; - - const modeLabels: Record<string, string> = { - autonomous: 'Auto', - paired: 'Paired', - }; - - const statusColor = statusColors[agent.status] || '#6688AA'; - const StatusIcon = agent.status === 'running' ? RiPlayCircleLine : RiPauseCircleLine; - - return ( - <Flex - direction="column" - gap="1" - p="2" - style={{ - borderRadius: 4, - backgroundColor: 'var(--bui-color-surface-1)', - }} - > - <Flex align="center" justify="between"> - <Flex align="center" gap="2"> - <StatusIcon size={16} color={statusColor} /> - <Text variant="body-medium" style={{ fontWeight: 500 }}> - {agent.ticket_id} - </Text> - </Flex> - <Box - style={{ - backgroundColor: `${statusColor}20`, - color: statusColor, - fontSize: '0.75rem', - padding: '2px 8px', - borderRadius: 4, - }} - > - {modeLabels[agent.mode] || agent.mode} - </Box> - </Flex> - - <Flex align="center" gap="3" style={{ marginLeft: 24 }}> - <Flex align="center" gap="1"> - <RiCodeLine size={14} color="var(--bui-color-text-secondary)" /> - <Text variant="body-small" color="secondary"> - {agent.project} - </Text> - </Flex> - <Flex align="center" gap="1"> - <RiTimeLine size={14} color="var(--bui-color-text-secondary)" /> - <Text variant="body-small" color="secondary"> - {formatElapsed(agent.started_at)} - </Text> - </Flex> - {agent.current_step && ( - <Text variant="body-small" color="secondary"> - Step: {agent.current_step} - </Text> - )} - </Flex> - - <Flex align="center" gap="1" style={{ marginLeft: 24 }}> - <Link href={`/issuetypes/${agent.ticket_type}`}> - <Text variant="body-small" style={{ color: 'var(--bui-color-primary)' }}> - {agent.ticket_type} - </Text> - </Link> - </Flex> - </Flex> - ); -} - -export function ActiveAgentsCard() { - const { data, isLoading, error, refetch } = useActiveAgentsQuery(); - - if (isLoading) { - return ( - <Card> - <CardBody> - <Flex direction="column" gap="3" p="2"> - <Text variant="title-small">Active Agents</Text> - <Progress /> - </Flex> - </CardBody> - </Card> - ); - } - - if (error) { - return ( - <Card> - <CardBody> - <Flex direction="column" gap="3" p="2"> - <Flex align="center" justify="between"> - <Text variant="title-small">Active Agents</Text> - <RiRobot2Line size={20} color="var(--bui-color-text-secondary)" /> - </Flex> - <ErrorState - title="Failed to load" - message="Unable to load active agents" - onRetry={() => refetch()} - compact - /> - </Flex> - </CardBody> - </Card> - ); - } - - const agents = data?.agents || []; - - return ( - <Card> - <CardBody> - <Flex direction="column" gap="3" p="2"> - <Flex align="center" justify="between"> - <Flex align="center" gap="2"> - <Text variant="title-small">Active Agents</Text> - {agents.length > 0 && ( - <Box - style={{ - backgroundColor: '#66AA9920', - color: '#66AA99', - minWidth: 20, - textAlign: 'center', - padding: '2px 6px', - borderRadius: 4, - fontSize: '0.75rem', - }} - > - {agents.length} - </Box> - )} - </Flex> - <RiRobot2Line size={20} color="var(--bui-color-text-secondary)" /> - </Flex> - - {agents.length === 0 ? ( - <Flex - direction="column" - align="center" - justify="center" - gap="2" - p="4" - style={{ opacity: 0.7 }} - > - <RiUserLine size={32} color="var(--bui-color-text-secondary)" /> - <Text variant="body-small" color="secondary"> - No agents running - </Text> - </Flex> - ) : ( - <Flex direction="column" gap="2"> - {agents.map(agent => ( - <AgentRow key={agent.id} agent={agent} /> - ))} - </Flex> - )} - </Flex> - </CardBody> - </Card> - ); -} diff --git a/backstage-server/packages/app/src/components/home/widgets/IssueTypesCard.test.tsx b/backstage-server/packages/app/src/components/home/widgets/IssueTypesCard.test.tsx deleted file mode 100644 index b0fd0c1e..00000000 --- a/backstage-server/packages/app/src/components/home/widgets/IssueTypesCard.test.tsx +++ /dev/null @@ -1,89 +0,0 @@ -/** - * IssueTypesCard Tests - * - * Tests for loading, error, empty, and success states. - */ - -import { describe, test, expect, beforeEach } from 'bun:test'; -import { waitFor } from '@testing-library/react'; -import { http, HttpResponse } from 'msw'; -import { server } from '../../../test/handlers'; -import { renderWithProviders } from '../../../test/utils'; -import { IssueTypesCard } from './IssueTypesCard'; - -describe('IssueTypesCard', () => { - beforeEach(() => { - server.resetHandlers(); - }); - - test('renders and loads data', async () => { - // Default handler returns empty data - const { getByText } = renderWithProviders(<IssueTypesCard />); - - // Wait for card to render - await waitFor(() => { - expect(getByText('Issue Types')).toBeTruthy(); - }); - }); - - test('shows error state when API fails', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/issuetypes', () => { - return HttpResponse.json(null, { status: 500 }); - }) - ); - - const { getByRole, getByText } = renderWithProviders(<IssueTypesCard />); - - await waitFor(() => { - expect(getByRole('alert')).toBeTruthy(); - }); - - expect(getByText(/failed to load/i)).toBeTruthy(); - expect(getByRole('button', { name: /retry/i })).toBeTruthy(); - }); - - test('shows empty state when no issue types', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/issuetypes', () => { - return HttpResponse.json([]); - }) - ); - - const { getByText } = renderWithProviders(<IssueTypesCard />); - - // Card title should be visible - await waitFor(() => { - expect(getByText('Issue Types')).toBeTruthy(); - }); - }); - - test('shows issue types when API returns data', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/issuetypes', () => { - return HttpResponse.json([ - { - key: 'FEAT', - name: 'Feature', - mode: 'autonomous', - }, - { - key: 'FIX', - name: 'Bug Fix', - mode: 'autonomous', - }, - ]); - }) - ); - - const { getByText } = renderWithProviders(<IssueTypesCard />); - - await waitFor(() => { - expect(getByText('FEAT')).toBeTruthy(); - }); - - expect(getByText('Feature')).toBeTruthy(); - expect(getByText('FIX')).toBeTruthy(); - expect(getByText('Bug Fix')).toBeTruthy(); - }); -}); diff --git a/backstage-server/packages/app/src/components/home/widgets/IssueTypesCard.tsx b/backstage-server/packages/app/src/components/home/widgets/IssueTypesCard.tsx deleted file mode 100644 index 05312f0b..00000000 --- a/backstage-server/packages/app/src/components/home/widgets/IssueTypesCard.tsx +++ /dev/null @@ -1,176 +0,0 @@ -/** - * Issue Types Widget - * - * Quick access to issue types management. - * Shows recent/pinned types with create action. - */ - -import React from 'react'; -import { Card, CardBody, Flex, Text, Link, Button } from '@backstage/ui'; -import { Progress } from '@backstage/core-components'; -import { - RiFileList3Line, - RiAddLine, - RiFolderLine, - RiArrowRightLine, -} from '@remixicon/react'; -import { useIssueTypesQuery, type IssueType } from '../../../api/queries'; -import { ErrorState } from '../../common/ErrorState'; - -interface IssueTypeChipProps { - issueType: IssueType; -} - -function IssueTypeChip({ issueType }: IssueTypeChipProps) { - const modeColors: Record<string, string> = { - autonomous: '#66AA99', - paired: '#E9A820', - investigation: '#E05D44', - }; - - const color = modeColors[issueType.mode] || '#6688AA'; - - return ( - <Link - href={`/issuetypes/${issueType.key}`} - style={{ textDecoration: 'none' }} - > - <Flex - align="center" - gap="2" - p="2" - style={{ - borderRadius: 4, - backgroundColor: 'var(--bui-color-surface-1)', - border: `1px solid ${color}40`, - cursor: 'pointer', - transition: 'all 0.15s ease', - }} - className="issue-type-chip" - > - <div - style={{ - width: 8, - height: 8, - borderRadius: 2, - backgroundColor: color, - }} - /> - <Text variant="body-small" style={{ fontWeight: 500 }}> - {issueType.key} - </Text> - <Text variant="body-small" color="secondary"> - {issueType.name} - </Text> - </Flex> - </Link> - ); -} - -export function IssueTypesCard() { - const { data, isLoading, error, refetch } = useIssueTypesQuery(); - - if (isLoading) { - return ( - <Card> - <CardBody> - <Flex direction="column" gap="3" p="2"> - <Text variant="title-small">Issue Types</Text> - <Progress /> - </Flex> - </CardBody> - </Card> - ); - } - - if (error) { - return ( - <Card> - <CardBody> - <Flex direction="column" gap="3" p="2"> - <Flex align="center" justify="between"> - <Text variant="title-small">Issue Types</Text> - <RiFileList3Line size={20} color="var(--bui-color-text-secondary)" /> - </Flex> - <ErrorState - title="Failed to load" - message="Unable to load issue types" - onRetry={() => refetch()} - compact - /> - </Flex> - </CardBody> - </Card> - ); - } - - // Take first 5 issue types for the widget - const issueTypes = Array.isArray(data) ? data.slice(0, 5) : []; - - return ( - <Card> - <CardBody> - <Flex direction="column" gap="3" p="2"> - <Flex align="center" justify="between"> - <Text variant="title-small">Issue Types</Text> - <RiFileList3Line size={20} color="var(--bui-color-text-secondary)" /> - </Flex> - - {/* Issue type chips */} - <Flex direction="column" gap="2"> - {issueTypes.map(issueType => ( - <IssueTypeChip key={issueType.key} issueType={issueType} /> - ))} - </Flex> - - {/* Actions */} - <Flex gap="2" style={{ marginTop: 4 }}> - <Link href="/issuetypes/new" style={{ flex: 1 }}> - <Button - variant="secondary" - size="small" - style={{ width: '100%', justifyContent: 'center' }} - > - <Flex align="center" gap="1"> - <RiAddLine size={16} /> - <span>New Type</span> - </Flex> - </Button> - </Link> - <Link href="/issuetypes/collections" style={{ flex: 1 }}> - <Button - variant="secondary" - size="small" - style={{ width: '100%', justifyContent: 'center' }} - > - <Flex align="center" gap="1"> - <RiFolderLine size={16} /> - <span>Collections</span> - </Flex> - </Button> - </Link> - </Flex> - - {/* View all link */} - <Link href="/issuetypes"> - <Flex - align="center" - justify="center" - gap="1" - p="2" - style={{ - borderRadius: 4, - backgroundColor: 'var(--bui-color-surface-1)', - }} - > - <Text variant="body-small" style={{ color: 'var(--bui-color-primary)' }}> - View All Issue Types - </Text> - <RiArrowRightLine size={14} color="var(--bui-color-primary)" /> - </Flex> - </Link> - </Flex> - </CardBody> - </Card> - ); -} diff --git a/backstage-server/packages/app/src/components/home/widgets/QueueStatusCard.test.tsx b/backstage-server/packages/app/src/components/home/widgets/QueueStatusCard.test.tsx deleted file mode 100644 index f65b3b6a..00000000 --- a/backstage-server/packages/app/src/components/home/widgets/QueueStatusCard.test.tsx +++ /dev/null @@ -1,97 +0,0 @@ -/** - * QueueStatusCard Tests - * - * Tests for loading, error, empty, and success states. - */ - -import { describe, test, expect, beforeEach } from 'bun:test'; -import { waitFor } from '@testing-library/react'; -import { http, HttpResponse } from 'msw'; -import { server } from '../../../test/handlers'; -import { renderWithProviders } from '../../../test/utils'; -import { QueueStatusCard } from './QueueStatusCard'; - -describe('QueueStatusCard', () => { - beforeEach(() => { - server.resetHandlers(); - }); - - test('renders and loads data', async () => { - // Default handler returns empty data - const { getByText } = renderWithProviders(<QueueStatusCard />); - - // Wait for card to render - await waitFor(() => { - expect(getByText('Queue Status')).toBeTruthy(); - }); - }); - - test('shows error state when API fails', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/queue/status', () => { - return HttpResponse.json(null, { status: 500 }); - }) - ); - - const { getByRole, getByText } = renderWithProviders(<QueueStatusCard />); - - await waitFor(() => { - expect(getByRole('alert')).toBeTruthy(); - }); - - expect(getByText(/failed to load/i)).toBeTruthy(); - expect(getByRole('button', { name: /retry/i })).toBeTruthy(); - }); - - test('shows zero counts when queue is empty', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/queue/status', () => { - return HttpResponse.json({ - queued: 0, - in_progress: 0, - awaiting: 0, - completed: 0, - by_type: { inv: 0, fix: 0, feat: 0, spike: 0 }, - }); - }) - ); - - const { getByText } = renderWithProviders(<QueueStatusCard />); - - await waitFor(() => { - expect(getByText('Queued')).toBeTruthy(); - }); - - expect(getByText('In Progress')).toBeTruthy(); - expect(getByText('Awaiting')).toBeTruthy(); - expect(getByText('Completed')).toBeTruthy(); - }); - - test('shows status counts when API returns data', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/queue/status', () => { - return HttpResponse.json({ - queued: 5, - in_progress: 2, - awaiting: 1, - completed: 10, - by_type: { inv: 1, fix: 3, feat: 8, spike: 2 }, - }); - }) - ); - - const { getByText, getAllByText } = renderWithProviders(<QueueStatusCard />); - - await waitFor(() => { - expect(getByText('5')).toBeTruthy(); // queued count - }); - - // Check for presence of counts (some may appear multiple times) - expect(getAllByText('2').length).toBeGreaterThan(0); // in_progress and spike - expect(getByText('10')).toBeTruthy(); // completed - expect(getByText('Investigation')).toBeTruthy(); - expect(getByText('Bug Fix')).toBeTruthy(); - expect(getByText('Feature')).toBeTruthy(); - expect(getByText('Spike')).toBeTruthy(); - }); -}); diff --git a/backstage-server/packages/app/src/components/home/widgets/QueueStatusCard.tsx b/backstage-server/packages/app/src/components/home/widgets/QueueStatusCard.tsx deleted file mode 100644 index 10089a3e..00000000 --- a/backstage-server/packages/app/src/components/home/widgets/QueueStatusCard.tsx +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Queue Status Widget - * - * Displays ticket queue status with counts by priority level. - * Fetches data from the Operator REST API. - */ - -import React from 'react'; -import { Card, CardBody, Flex, Text, Box } from '@backstage/ui'; -import { Progress } from '@backstage/core-components'; -import { - RiListCheck2, - RiTimeLine, - RiCheckDoubleLine, - RiAlertLine, - RiBugLine, - RiLightbulbLine, - RiSearchLine, -} from '@remixicon/react'; -import { useQueueStatusQuery } from '../../../api/queries'; -import { ErrorState } from '../../common/ErrorState'; - -const priorityConfig = { - inv: { label: 'Investigation', icon: RiAlertLine, color: '#E05D44' }, - fix: { label: 'Bug Fix', icon: RiBugLine, color: '#E9A820' }, - feat: { label: 'Feature', icon: RiLightbulbLine, color: '#66AA99' }, - spike: { label: 'Spike', icon: RiSearchLine, color: '#6688AA' }, -} as const; - -interface PriorityBadgeProps { - type: keyof typeof priorityConfig; - count: number; -} - -function PriorityBadge({ type, count }: PriorityBadgeProps) { - const config = priorityConfig[type]; - const Icon = config.icon; - - return ( - <Flex align="center" gap="2" style={{ minWidth: 80 }}> - <Icon size={16} color={config.color} /> - <Text variant="body-small" style={{ color: config.color, fontWeight: 600 }}> - {count} - </Text> - <Text variant="body-small" color="secondary"> - {config.label} - </Text> - </Flex> - ); -} - -interface StatusRowProps { - icon: React.ReactNode; - label: string; - count: number; - color?: string; -} - -function StatusRow({ icon, label, count, color }: StatusRowProps) { - return ( - <Flex align="center" justify="between" p="2"> - <Flex align="center" gap="2"> - {icon} - <Text variant="body-medium">{label}</Text> - </Flex> - <Box - style={{ - backgroundColor: color || 'var(--bui-color-surface-2)', - minWidth: 32, - textAlign: 'center', - padding: '2px 8px', - borderRadius: 4, - fontSize: '0.875rem', - fontWeight: 500, - }} - > - {count} - </Box> - </Flex> - ); -} - -export function QueueStatusCard() { - const { data: status, isLoading, error, refetch } = useQueueStatusQuery(); - - if (isLoading) { - return ( - <Card> - <CardBody> - <Flex direction="column" gap="3" p="2"> - <Text variant="title-small">Queue Status</Text> - <Progress /> - </Flex> - </CardBody> - </Card> - ); - } - - if (error) { - return ( - <Card> - <CardBody> - <Flex direction="column" gap="3" p="2"> - <Flex align="center" justify="between"> - <Text variant="title-small">Queue Status</Text> - <RiListCheck2 size={20} color="var(--bui-color-text-secondary)" /> - </Flex> - <ErrorState - title="Failed to load" - message="Unable to load queue status" - onRetry={() => refetch()} - compact - /> - </Flex> - </CardBody> - </Card> - ); - } - - return ( - <Card> - <CardBody> - <Flex direction="column" gap="3" p="2"> - <Flex align="center" justify="between"> - <Text variant="title-small">Queue Status</Text> - <RiListCheck2 size={20} color="var(--bui-color-text-secondary)" /> - </Flex> - - {/* Status counts */} - <Flex direction="column" gap="1"> - <StatusRow - icon={<RiTimeLine size={18} color="#6688AA" />} - label="Queued" - count={status?.queued || 0} - /> - <StatusRow - icon={<RiTimeLine size={18} color="#E9A820" />} - label="In Progress" - count={status?.in_progress || 0} - color="#E9A82020" - /> - <StatusRow - icon={<RiTimeLine size={18} color="#9966AA" />} - label="Awaiting" - count={status?.awaiting || 0} - color="#9966AA20" - /> - <StatusRow - icon={<RiCheckDoubleLine size={18} color="#66AA99" />} - label="Completed" - count={status?.completed || 0} - color="#66AA9920" - /> - </Flex> - - {/* Type breakdown */} - <Flex direction="column" gap="2" style={{ marginTop: 8 }}> - <Text variant="body-small" color="secondary"> - By Type - </Text> - <Flex gap="3" style={{ flexWrap: 'wrap' }}> - <PriorityBadge type="inv" count={status?.by_type.inv || 0} /> - <PriorityBadge type="fix" count={status?.by_type.fix || 0} /> - <PriorityBadge type="feat" count={status?.by_type.feat || 0} /> - <PriorityBadge type="spike" count={status?.by_type.spike || 0} /> - </Flex> - </Flex> - </Flex> - </CardBody> - </Card> - ); -} diff --git a/backstage-server/packages/app/src/components/home/widgets/index.ts b/backstage-server/packages/app/src/components/home/widgets/index.ts deleted file mode 100644 index ecbf0dce..00000000 --- a/backstage-server/packages/app/src/components/home/widgets/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Homepage Widgets - * - * Reusable widget components for the Operator homepage. - */ - -export { QueueStatusCard } from './QueueStatusCard'; -export { ActiveAgentsCard } from './ActiveAgentsCard'; -export { IssueTypesCard } from './IssueTypesCard'; diff --git a/backstage-server/packages/app/src/components/kanban/KanbanBoard.test.tsx b/backstage-server/packages/app/src/components/kanban/KanbanBoard.test.tsx deleted file mode 100644 index e0958c56..00000000 --- a/backstage-server/packages/app/src/components/kanban/KanbanBoard.test.tsx +++ /dev/null @@ -1,107 +0,0 @@ -/** - * KanbanBoard Tests - * - * Tests for loading, error, empty, and success states. - */ - -import { describe, test, expect, beforeEach } from 'bun:test'; -import { waitFor } from '@testing-library/react'; -import { http, HttpResponse } from 'msw'; -import { server } from '../../test/handlers'; -import { renderWithProviders } from '../../test/utils'; -import { KanbanBoard } from './KanbanBoard'; - -describe('KanbanBoard', () => { - beforeEach(() => { - server.resetHandlers(); - }); - - test('renders and loads data', async () => { - // Default handler returns empty data - const { getByText } = renderWithProviders(<KanbanBoard />); - - // Wait for columns to render after data loads - await waitFor(() => { - expect(getByText('Queue')).toBeTruthy(); - }); - }); - - test('shows error state when API fails', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/queue/kanban', () => { - return HttpResponse.json(null, { status: 500 }); - }) - ); - - const { getByRole, getByText } = renderWithProviders(<KanbanBoard />); - - // Wait for error state to appear - await waitFor(() => { - expect(getByRole('alert')).toBeTruthy(); - }); - - expect(getByText(/failed to load board/i)).toBeTruthy(); - expect(getByRole('button', { name: /retry/i })).toBeTruthy(); - }); - - test('shows empty state when API returns empty data', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/queue/kanban', () => { - return HttpResponse.json({ - queue: [], - running: [], - awaiting: [], - done: [], - total_count: 0, - last_updated: new Date().toISOString(), - }); - }) - ); - - const { getByText } = renderWithProviders(<KanbanBoard />); - - // Wait for columns to render - await waitFor(() => { - expect(getByText('Queue')).toBeTruthy(); - }); - - expect(getByText('Running')).toBeTruthy(); - expect(getByText('Awaiting')).toBeTruthy(); - expect(getByText('Done')).toBeTruthy(); - }); - - test('shows data when API succeeds', async () => { - server.use( - http.get('/api/proxy/operator/api/v1/queue/kanban', () => { - return HttpResponse.json({ - queue: [ - { - id: 'FEAT-1234', - summary: 'Add new feature', - ticket_type: 'FEAT', - project: 'operator', - status: 'queued', - step: '', - priority: 'P2-medium', - timestamp: '20241229-1430', - }, - ], - running: [], - awaiting: [], - done: [], - total_count: 1, - last_updated: new Date().toISOString(), - }); - }) - ); - - const { getByText } = renderWithProviders(<KanbanBoard />); - - // Wait for ticket to appear - await waitFor(() => { - expect(getByText('FEAT-1234')).toBeTruthy(); - }); - - expect(getByText('Add new feature')).toBeTruthy(); - }); -}); diff --git a/backstage-server/packages/app/src/components/kanban/KanbanBoard.tsx b/backstage-server/packages/app/src/components/kanban/KanbanBoard.tsx deleted file mode 100644 index e2d20372..00000000 --- a/backstage-server/packages/app/src/components/kanban/KanbanBoard.tsx +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Kanban Board Container - * - * Responsive grid layout with four columns. - * Uses CSS Grid for consistent column widths. - */ - -import React from 'react'; -import { Progress } from '@backstage/core-components'; -import { Flex, Text } from '@backstage/ui'; -import { KanbanColumn } from './KanbanColumn'; -import { useKanbanBoard } from './useKanbanBoard'; -import { KANBAN_COLUMNS } from './types'; -import { ErrorState } from '../common/ErrorState'; - -export function KanbanBoard() { - const { data, loading, error, lastUpdated, refresh } = useKanbanBoard(); - - if (loading && !data) { - return <Progress />; - } - - if (error && !data) { - return ( - <ErrorState - title="Failed to load board" - message={error.message || 'Unable to load kanban board'} - onRetry={refresh} - compact - /> - ); - } - - return ( - <Flex direction="column" gap="3"> - <div - style={{ - display: 'grid', - gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))', - gap: '16px', - width: '100%', - }} - > - {KANBAN_COLUMNS.map(column => ( - <KanbanColumn - key={column.key} - config={column} - tickets={data?.[column.key] || []} - /> - ))} - </div> - {lastUpdated && ( - <Flex justify="end"> - <Text variant="body-small" color="secondary"> - Last updated: {lastUpdated.toLocaleTimeString()} - </Text> - </Flex> - )} - </Flex> - ); -} diff --git a/backstage-server/packages/app/src/components/kanban/KanbanBoardPage.tsx b/backstage-server/packages/app/src/components/kanban/KanbanBoardPage.tsx deleted file mode 100644 index f0994230..00000000 --- a/backstage-server/packages/app/src/components/kanban/KanbanBoardPage.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Kanban Board Page - * - * Full-page view displaying tickets organized by status columns. - * Read-only view with auto-refresh. - */ - -import React from 'react'; -import { Page, Header, Content } from '@backstage/core-components'; -import { Flex, Text } from '@backstage/ui'; -import { RiLayoutColumnLine } from '@remixicon/react'; -import { KanbanBoard } from './KanbanBoard'; - -export function KanbanBoardPage() { - return ( - <Page themeId="tool"> - <Header - title="Ticket Board" - subtitle="View all tickets organized by status" - /> - <Content> - <Flex direction="column" gap="4" p="4"> - <Flex align="center" gap="2"> - <RiLayoutColumnLine size={24} /> - <Text variant="title-medium">Kanban Board</Text> - </Flex> - <KanbanBoard /> - </Flex> - </Content> - </Page> - ); -} diff --git a/backstage-server/packages/app/src/components/kanban/KanbanCard.tsx b/backstage-server/packages/app/src/components/kanban/KanbanCard.tsx deleted file mode 100644 index 17a30d7d..00000000 --- a/backstage-server/packages/app/src/components/kanban/KanbanCard.tsx +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Kanban Card Component - * - * Individual ticket card with all details. - */ - -import React from 'react'; -import { Flex, Text, Box } from '@backstage/ui'; -import { RiCodeLine, RiArrowRightSLine } from '@remixicon/react'; -import { TypeBadge } from './TypeBadge'; -import { KanbanTicketCard, PRIORITY_COLORS } from './types'; - -interface KanbanCardProps { - ticket: KanbanTicketCard; -} - -export function KanbanCard({ ticket }: KanbanCardProps) { - const priorityColor = PRIORITY_COLORS[ticket.priority] || '#888888'; - - return ( - <Box - style={{ - backgroundColor: 'var(--bui-color-surface-1)', - borderRadius: 8, - padding: 12, - borderLeft: `3px solid ${priorityColor}`, - }} - > - <Flex direction="column" gap="2"> - {/* Header: ID + Type Badge */} - <Flex align="center" justify="between"> - <Text - variant="body-medium" - style={{ fontWeight: 600, fontFamily: 'monospace' }} - > - {ticket.id} - </Text> - <TypeBadge type={ticket.ticket_type} /> - </Flex> - - {/* Summary */} - <Text - variant="body-small" - style={{ - overflow: 'hidden', - textOverflow: 'ellipsis', - display: '-webkit-box', - WebkitLineClamp: 2, - WebkitBoxOrient: 'vertical', - }} - > - {ticket.summary} - </Text> - - {/* Project + Step */} - <Flex align="center" gap="2"> - <Flex align="center" gap="1"> - <RiCodeLine size={14} color="var(--bui-color-text-secondary)" /> - <Text variant="body-small" color="secondary"> - {ticket.project} - </Text> - </Flex> - {ticket.step_display_name && ( - <> - <RiArrowRightSLine - size={14} - color="var(--bui-color-text-secondary)" - /> - <Text variant="body-small" color="secondary"> - {ticket.step_display_name} - </Text> - </> - )} - </Flex> - - {/* Priority */} - <Flex align="center" gap="1"> - <Box - style={{ - width: 8, - height: 8, - borderRadius: 4, - backgroundColor: priorityColor, - }} - /> - <Text variant="body-small" color="secondary"> - {ticket.priority.split('-')[1] || ticket.priority} - </Text> - </Flex> - </Flex> - </Box> - ); -} diff --git a/backstage-server/packages/app/src/components/kanban/KanbanColumn.tsx b/backstage-server/packages/app/src/components/kanban/KanbanColumn.tsx deleted file mode 100644 index 1449e8ab..00000000 --- a/backstage-server/packages/app/src/components/kanban/KanbanColumn.tsx +++ /dev/null @@ -1,97 +0,0 @@ -/** - * Kanban Column Component - * - * Single column with header and scrollable ticket list. - */ - -import React from 'react'; -import { Card, CardBody, Flex, Text, Box } from '@backstage/ui'; -import { - RiTimeLine, - RiPlayCircleLine, - RiPauseCircleLine, - RiCheckDoubleLine, -} from '@remixicon/react'; -import { KanbanCard } from './KanbanCard'; -import type { KanbanColumnConfig, KanbanTicketCard } from './types'; - -const iconMap = { - queue: RiTimeLine, - running: RiPlayCircleLine, - awaiting: RiPauseCircleLine, - done: RiCheckDoubleLine, -}; - -interface KanbanColumnProps { - config: KanbanColumnConfig; - tickets: KanbanTicketCard[]; -} - -export function KanbanColumn({ config, tickets }: KanbanColumnProps) { - const Icon = iconMap[config.key]; - - return ( - <Card> - <CardBody> - <Flex direction="column" gap="3"> - {/* Column Header */} - <Flex align="center" justify="between" p="2"> - <Flex align="center" gap="2"> - <Box - style={{ - width: 4, - height: 24, - backgroundColor: config.color, - borderRadius: 2, - }} - /> - <Icon size={18} color={config.color} /> - <Text variant="title-small">{config.title}</Text> - </Flex> - <Box - style={{ - backgroundColor: `${config.color}20`, - color: config.color, - minWidth: 24, - textAlign: 'center', - padding: '2px 8px', - borderRadius: 12, - fontSize: '0.75rem', - fontWeight: 600, - }} - > - {tickets.length} - </Box> - </Flex> - - {/* Ticket List */} - <Flex - direction="column" - gap="2" - style={{ - maxHeight: 'calc(100vh - 300px)', - overflowY: 'auto', - }} - > - {tickets.length === 0 ? ( - <Flex - align="center" - justify="center" - p="4" - style={{ opacity: 0.5 }} - > - <Text variant="body-small" color="secondary"> - No tickets - </Text> - </Flex> - ) : ( - tickets.map(ticket => ( - <KanbanCard key={ticket.id} ticket={ticket} /> - )) - )} - </Flex> - </Flex> - </CardBody> - </Card> - ); -} diff --git a/backstage-server/packages/app/src/components/kanban/TypeBadge.tsx b/backstage-server/packages/app/src/components/kanban/TypeBadge.tsx deleted file mode 100644 index 9ed23e46..00000000 --- a/backstage-server/packages/app/src/components/kanban/TypeBadge.tsx +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Type Badge Component - * - * Displays the ticket type (FEAT/FIX/INV/SPIKE) with appropriate color. - */ - -import React from 'react'; -import { Box } from '@backstage/ui'; -import { TYPE_BADGE_CONFIG } from './types'; - -interface TypeBadgeProps { - type: string; - size?: 'small' | 'medium'; -} - -export function TypeBadge({ type, size = 'small' }: TypeBadgeProps) { - const config = TYPE_BADGE_CONFIG[type] || { - label: type, - color: '#888888', - }; - - const padding = size === 'small' ? '2px 6px' : '4px 8px'; - const fontSize = size === 'small' ? '0.625rem' : '0.75rem'; - - return ( - <Box - style={{ - backgroundColor: `${config.color}20`, - color: config.color, - padding, - borderRadius: 4, - fontSize, - fontWeight: 600, - textTransform: 'uppercase', - letterSpacing: '0.5px', - display: 'inline-block', - }} - > - {type} - </Box> - ); -} diff --git a/backstage-server/packages/app/src/components/kanban/index.ts b/backstage-server/packages/app/src/components/kanban/index.ts deleted file mode 100644 index d90ee70f..00000000 --- a/backstage-server/packages/app/src/components/kanban/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Kanban Board Components - * - * Read-only Kanban board view for ticket status visualization. - */ - -export { KanbanBoardPage } from './KanbanBoardPage'; -export { KanbanBoard } from './KanbanBoard'; -export { KanbanColumn } from './KanbanColumn'; -export { KanbanCard } from './KanbanCard'; -export { TypeBadge } from './TypeBadge'; -export { useKanbanBoard } from './useKanbanBoard'; -export * from './types'; diff --git a/backstage-server/packages/app/src/components/kanban/types.ts b/backstage-server/packages/app/src/components/kanban/types.ts deleted file mode 100644 index 5d8b5c91..00000000 --- a/backstage-server/packages/app/src/components/kanban/types.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Kanban Board TypeScript Types - * - * These types mirror the Rust DTOs from the operator backend. - */ - -/** Ticket type keys */ -export type TicketType = 'INV' | 'FIX' | 'FEAT' | 'SPIKE'; - -/** Ticket status values mapped to kanban columns */ -export type TicketStatus = 'queued' | 'running' | 'awaiting' | 'completed' | 'done'; - -/** Priority levels */ -export type Priority = 'P0-critical' | 'P1-high' | 'P2-medium' | 'P3-low'; - -/** A single ticket card on the kanban board */ -export interface KanbanTicketCard { - id: string; - summary: string; - ticket_type: string; - project: string; - status: string; - step: string; - step_display_name?: string; - priority: string; - timestamp: string; -} - -/** Kanban board response grouped by column */ -export interface KanbanBoardResponse { - queue: KanbanTicketCard[]; - running: KanbanTicketCard[]; - awaiting: KanbanTicketCard[]; - done: KanbanTicketCard[]; - total_count: number; - last_updated: string; -} - -/** Column configuration for rendering */ -export interface KanbanColumnConfig { - key: 'queue' | 'running' | 'awaiting' | 'done'; - title: string; - color: string; -} - -/** Type badge configuration */ -export const TYPE_BADGE_CONFIG: Record<string, { label: string; color: string }> = { - INV: { label: 'Investigation', color: '#E05D44' }, - FIX: { label: 'Bug Fix', color: '#E9A820' }, - FEAT: { label: 'Feature', color: '#66AA99' }, - SPIKE: { label: 'Research', color: '#6688AA' }, -}; - -/** Priority color configuration */ -export const PRIORITY_COLORS: Record<string, string> = { - 'P0-critical': '#E05D44', - 'P1-high': '#E9A820', - 'P2-medium': '#6688AA', - 'P3-low': '#888888', -}; - -/** Column definitions */ -export const KANBAN_COLUMNS: KanbanColumnConfig[] = [ - { key: 'queue', title: 'Queue', color: '#6688AA' }, - { key: 'running', title: 'Running', color: '#66AA99' }, - { key: 'awaiting', title: 'Awaiting', color: '#E9A820' }, - { key: 'done', title: 'Done', color: '#888888' }, -]; diff --git a/backstage-server/packages/app/src/components/kanban/useKanbanBoard.ts b/backstage-server/packages/app/src/components/kanban/useKanbanBoard.ts deleted file mode 100644 index 7f6676c1..00000000 --- a/backstage-server/packages/app/src/components/kanban/useKanbanBoard.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Hook for fetching kanban board data with auto-refresh. - * - * Uses TanStack Query for server state management. - * Returns loading, error, and data states for proper UI feedback. - */ - -import { useKanbanBoardQuery } from '../../api/queries'; -import type { KanbanBoardResponse } from './types'; - -interface UseKanbanBoardResult { - data: KanbanBoardResponse | undefined; - loading: boolean; - error: Error | null; - lastUpdated: Date | null; - refresh: () => void; -} - -export function useKanbanBoard(): UseKanbanBoardResult { - const { data, isLoading, error, dataUpdatedAt, refetch } = useKanbanBoardQuery(); - - return { - data, - loading: isLoading, - error: error as Error | null, - lastUpdated: dataUpdatedAt ? new Date(dataUpdatedAt) : null, - refresh: () => refetch(), - }; -} diff --git a/backstage-server/packages/app/src/components/plugins/PluginsPage.tsx b/backstage-server/packages/app/src/components/plugins/PluginsPage.tsx deleted file mode 100644 index 976e1c26..00000000 --- a/backstage-server/packages/app/src/components/plugins/PluginsPage.tsx +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Plugins Page - * - * Displays installed Backstage plugins with metadata including - * routes, APIs, and status information. - */ - -import React from 'react'; -import { - Content, - ContentHeader, - Header, - Page, - Table, - TableColumn, -} from '@backstage/core-components'; - -interface PluginInfo { - id: string; - name: string; - description: string; - routes: string[]; - apis: string[]; - status: 'active' | 'inactive'; -} - -const columns: TableColumn<PluginInfo>[] = [ - { title: 'Plugin ID', field: 'id' }, - { title: 'Name', field: 'name' }, - { title: 'Description', field: 'description' }, - { - title: 'Routes', - field: 'routes', - render: (row) => row.routes.join(', ') || 'None', - }, - { - title: 'APIs', - field: 'apis', - render: (row) => row.apis.join(', ') || 'None', - }, - { - title: 'Status', - field: 'status', - render: (row) => ( - <span style={{ color: row.status === 'active' ? '#4caf50' : '#9e9e9e' }}> - {row.status} - </span> - ), - }, -]; - -// Static plugin info based on registered plugins in App.tsx -const installedPlugins: PluginInfo[] = [ - { - id: 'catalog', - name: 'Backstage Catalog', - description: 'Software catalog for tracking components, APIs, and resources', - routes: ['/catalog', '/catalog/:namespace/:kind/:name'], - apis: ['catalogApiRef'], - status: 'active', - }, - { - id: 'search', - name: 'Backstage Search', - description: 'Full-text search across catalog entities', - routes: ['/search'], - apis: ['searchApiRef'], - status: 'active', - }, - { - id: 'issuetypes', - name: 'Operator Issue Types', - description: 'Manage issue types, workflows, and collections for Operator', - routes: ['/issuetypes', '/issuetypes/:key', '/issuetypes/new', '/issuetypes/collections'], - apis: ['operatorApiRef'], - status: 'active', - }, -]; - -export const PluginsPage = () => { - return ( - <Page themeId="tool"> - <Header - title="Installed Plugins" - subtitle="Backstage plugins configured in this portal" - data-testid="plugins-page-banner" - /> - <Content> - <ContentHeader title="Plugin Registry" /> - <Table - title="Plugins" - columns={columns} - data={installedPlugins} - options={{ - search: true, - paging: false, - }} - /> - </Content> - </Page> - ); -}; diff --git a/backstage-server/packages/app/src/components/plugins/index.ts b/backstage-server/packages/app/src/components/plugins/index.ts deleted file mode 100644 index 61e36470..00000000 --- a/backstage-server/packages/app/src/components/plugins/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { PluginsPage } from './PluginsPage'; diff --git a/backstage-server/packages/app/src/components/search/SearchPage.css b/backstage-server/packages/app/src/components/search/SearchPage.css deleted file mode 100644 index 2a8ae0c1..00000000 --- a/backstage-server/packages/app/src/components/search/SearchPage.css +++ /dev/null @@ -1,11 +0,0 @@ -/** - * SearchPage Styles - */ - -.search-bar-card { - width: 100%; -} - -.search-results { - width: 100%; -} diff --git a/backstage-server/packages/app/src/extensions/homepage.tsx b/backstage-server/packages/app/src/extensions/homepage.tsx deleted file mode 100644 index 89da23c9..00000000 --- a/backstage-server/packages/app/src/extensions/homepage.tsx +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Homepage Extensions - * - * Extension-based homepage for the new Backstage frontend system. - * Provides the homepage page extension with widget input slots. - */ - -import React from 'react'; -import { - PageBlueprint, - createRouteRef, - createExtension, - coreExtensionData, - createExtensionInput, -} from '@backstage/frontend-plugin-api'; - -// Route reference for the homepage -export const homeRouteRef = createRouteRef(); - -/** - * Homepage extension using PageBlueprint with widget inputs. - * - * This allows other extensions to attach widgets to the homepage - * by targeting the 'widgets' input. - */ -export const homePageExtension = PageBlueprint.makeWithOverrides({ - name: 'operator-home', - inputs: { - widgets: createExtensionInput([coreExtensionData.reactElement], { - singleton: false, - }), - }, - factory(originalFactory, { inputs }) { - return originalFactory({ - path: '/', - routeRef: homeRouteRef, - loader: async () => { - const { OperatorHomePage } = await import( - '../components/home/OperatorHomePage' - ); - - // Extract widget elements from inputs - const widgetElements = inputs.widgets?.map((widget, index) => { - const element = widget.get(coreExtensionData.reactElement); - return <React.Fragment key={index}>{element}</React.Fragment>; - }); - - return <OperatorHomePage widgets={widgetElements} />; - }, - }); - }, -}); - -/** - * Queue Status Widget Extension - * - * Displays ticket queue status on the homepage. - */ -export const queueStatusWidgetExtension = createExtension({ - name: 'queue-status-widget', - attachTo: { id: 'page:app/operator-home', input: 'widgets' }, - output: [coreExtensionData.reactElement], - factory() { - const LazyQueueStatus = React.lazy(() => - import('../components/home/widgets/QueueStatusCard').then(m => ({ - default: m.QueueStatusCard, - })) - ); - - return [ - coreExtensionData.reactElement( - <React.Suspense fallback={null}> - <LazyQueueStatus /> - </React.Suspense> - ), - ]; - }, -}); - -/** - * Active Agents Widget Extension - * - * Displays running Claude Code agents on the homepage. - */ -export const activeAgentsWidgetExtension = createExtension({ - name: 'active-agents-widget', - attachTo: { id: 'page:app/operator-home', input: 'widgets' }, - output: [coreExtensionData.reactElement], - factory() { - const LazyActiveAgents = React.lazy(() => - import('../components/home/widgets/ActiveAgentsCard').then(m => ({ - default: m.ActiveAgentsCard, - })) - ); - - return [ - coreExtensionData.reactElement( - <React.Suspense fallback={null}> - <LazyActiveAgents /> - </React.Suspense> - ), - ]; - }, -}); - -/** - * Issue Types Widget Extension - * - * Displays quick access to issue types management on the homepage. - */ -export const issueTypesWidgetExtension = createExtension({ - name: 'issue-types-widget', - attachTo: { id: 'page:app/operator-home', input: 'widgets' }, - output: [coreExtensionData.reactElement], - factory() { - const LazyIssueTypes = React.lazy(() => - import('../components/home/widgets/IssueTypesCard').then(m => ({ - default: m.IssueTypesCard, - })) - ); - - return [ - coreExtensionData.reactElement( - <React.Suspense fallback={null}> - <LazyIssueTypes /> - </React.Suspense> - ), - ]; - }, -}); - -// Export all homepage-related extensions -export const homepageExtensions = [ - homePageExtension, - queueStatusWidgetExtension, - activeAgentsWidgetExtension, - issueTypesWidgetExtension, -]; diff --git a/backstage-server/packages/app/src/extensions/index.ts b/backstage-server/packages/app/src/extensions/index.ts deleted file mode 100644 index 83bd30e1..00000000 --- a/backstage-server/packages/app/src/extensions/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Frontend Extensions - * - * Barrel export for all app extensions used with the new frontend system. - */ - -export { - homeRouteRef, - homePageExtension, - queueStatusWidgetExtension, - activeAgentsWidgetExtension, - issueTypesWidgetExtension, - homepageExtensions, -} from './homepage'; diff --git a/backstage-server/packages/app/src/index.tsx b/backstage-server/packages/app/src/index.tsx deleted file mode 100644 index 71beb5c9..00000000 --- a/backstage-server/packages/app/src/index.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Operator Backstage Frontend Entry Point - * - * Uses the new Backstage frontend system with extension-based architecture. - * Set localStorage key 'USE_LEGACY_APP' to 'true' to use legacy App.tsx. - */ - -// Import BUI base styles (must be first) -import '@backstage/ui/css/styles.css'; -// Import our custom theme overrides -import './theme/operator-theme.css'; - -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; - -// Query client for server state management (shared config with App.tsx) -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - retry: 1, - staleTime: 30000, - }, - }, -}); - -// Feature flag for legacy app (check localStorage only - env handled by bundler) -const useLegacyApp = localStorage.getItem('USE_LEGACY_APP') === 'true'; - -const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement -); - -if (useLegacyApp) { - // Legacy app with manual routing - import('./App').then(({ default: App }) => { - root.render( - <React.StrictMode> - <App /> - </React.StrictMode> - ); - }); -} else { - // New frontend system with extensions - import('./AppNew').then(({ createNewApp }) => { - const app = createNewApp(); - root.render( - <React.StrictMode> - <QueryClientProvider client={queryClient}> - {app.createRoot()} - </QueryClientProvider> - </React.StrictMode> - ); - }); -} diff --git a/backstage-server/packages/app/src/test/handlers.ts b/backstage-server/packages/app/src/test/handlers.ts deleted file mode 100644 index bd9cc6e5..00000000 --- a/backstage-server/packages/app/src/test/handlers.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * MSW Handlers - * - * Default mock handlers for API routes. - * Each handler returns successful responses by default. - * Tests can override handlers for error scenarios. - */ - -import { setupServer } from 'msw/node'; -import { http, HttpResponse } from 'msw'; - -// Default successful responses -export const handlers = [ - // Kanban board endpoint - http.get('/api/proxy/operator/api/v1/queue/kanban', () => { - return HttpResponse.json({ - queue: [], - running: [], - awaiting: [], - done: [], - total_count: 0, - last_updated: new Date().toISOString(), - }); - }), - - // Active agents endpoint - http.get('/api/proxy/operator/api/v1/agents/active', () => { - return HttpResponse.json({ - agents: [], - count: 0, - }); - }), - - // Queue status endpoint - http.get('/api/proxy/operator/api/v1/queue/status', () => { - return HttpResponse.json({ - queued: 0, - in_progress: 0, - awaiting: 0, - completed: 0, - by_type: { - inv: 0, - fix: 0, - feat: 0, - spike: 0, - }, - }); - }), - - // Issue types endpoint - http.get('/api/proxy/operator/api/v1/issuetypes', () => { - return HttpResponse.json([]); - }), -]; - -// Create MSW server instance -export const server = setupServer(...handlers); diff --git a/backstage-server/packages/app/src/test/setup.ts b/backstage-server/packages/app/src/test/setup.ts deleted file mode 100644 index 9f3fefa8..00000000 --- a/backstage-server/packages/app/src/test/setup.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Test Setup - * - * Global test setup for DOM, MSW and testing utilities. - * Uses @happy-dom/global-registrator for proper DOM registration. - */ - -import { GlobalRegistrator } from '@happy-dom/global-registrator'; - -// Register happy-dom globals with a base URL for relative path resolution -GlobalRegistrator.register({ - url: 'http://localhost:3000', -}); - -import { beforeAll, afterEach, afterAll } from 'bun:test'; -import { cleanup } from '@testing-library/react'; -import { server } from './handlers'; - -// Start MSW server before all tests -beforeAll(() => server.listen({ onUnhandledRequest: 'error' })); - -// Reset handlers and cleanup DOM after each test -afterEach(() => { - server.resetHandlers(); - cleanup(); -}); - -// Close MSW server after all tests -afterAll(() => server.close()); diff --git a/backstage-server/packages/app/src/test/utils.tsx b/backstage-server/packages/app/src/test/utils.tsx deleted file mode 100644 index ec7c445f..00000000 --- a/backstage-server/packages/app/src/test/utils.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Test Utilities - * - * Provides render wrapper with QueryClientProvider and other providers. - * Use renderWithProviders() instead of render() in tests. - */ - -import React, { ReactElement } from 'react'; -import { render, RenderOptions, RenderResult } from '@testing-library/react'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { MemoryRouter } from 'react-router-dom'; - -// Create a fresh QueryClient for each test to prevent state leakage -function createTestQueryClient() { - return new QueryClient({ - defaultOptions: { - queries: { - // Disable retries in tests for predictable behavior - retry: false, - // Disable caching to ensure fresh data - gcTime: 0, - staleTime: 0, - }, - }, - }); -} - -interface WrapperProps { - children: React.ReactNode; -} - -function createWrapper() { - const queryClient = createTestQueryClient(); - - return function Wrapper({ children }: WrapperProps) { - return ( - <MemoryRouter> - <QueryClientProvider client={queryClient}> - {children} - </QueryClientProvider> - </MemoryRouter> - ); - }; -} - -// Re-export everything from testing-library -export * from '@testing-library/react'; - -// Override render to use our wrapper -export function renderWithProviders( - ui: ReactElement, - options?: Omit<RenderOptions, 'wrapper'> -): RenderResult { - return render(ui, { wrapper: createWrapper(), ...options }); -} diff --git a/backstage-server/packages/app/src/theme/OperatorThemeProvider.tsx b/backstage-server/packages/app/src/theme/OperatorThemeProvider.tsx deleted file mode 100644 index 758b7822..00000000 --- a/backstage-server/packages/app/src/theme/OperatorThemeProvider.tsx +++ /dev/null @@ -1,265 +0,0 @@ -/** - * Operator Theme Provider - * - * Provides dynamic theming based on branding configuration from the Operator server. - * Fetches /api/branding on mount and creates a custom Backstage theme from the colors. - * - * Features: - * - Light/dark mode with system preference detection - * - Auto-derived dark mode colors from light palette - * - Customizable component styling (4px border radius, flat buttons) - * - Configurable via ~/.operator/backstage/branding/theme.json - */ - -import { createContext, useContext, useEffect, useState, ReactNode } from 'react'; -import { - UnifiedThemeProvider, - createUnifiedTheme, - palettes, -} from '@backstage/theme'; - -// Theme configuration from server -export interface ThemeConfig { - appTitle: string; - orgName: string; - logoPath?: string; - mode: 'light' | 'dark' | 'system'; - colors: { - // Core brand colors - primary: string; // Main action color (Terracotta) - secondary: string; // Secondary elements (Deep Pine) - accent: string; // Highlights, light surfaces (Cream) - warning: string; // Alerts - muted: string; // Subdued text (Cornflower) - // Light mode surfaces - background: string; // Page background - surface: string; // Card/paper background - text: string; // Primary text color - // Navigation scale (4 levels, L1=lightest, L4=darkest) - navL1: string; // Nav button default (Sage) - navL2: string; // Nav hover (Teal) - navL3: string; // Nav selected (Deep Pine) - navL4: string; // Nav background/darkest (Midnight) - }; - components?: { - borderRadius?: number; // Default: 4 - }; -} - -// Default theme config (matches docs/assets/css/main.css) -const defaultThemeConfig: ThemeConfig = { - appTitle: 'Operator!', - orgName: 'Operator!', - logoPath: 'logo.svg', - mode: 'system', // Respects OS light/dark preference - colors: { - // Core brand (from docs palette) - primary: '#E05D44', // Terracotta - secondary: '#115566', // Deep Pine - accent: '#F2EAC9', // Cream - warning: '#E05D44', // Terracotta - muted: '#6688AA', // Cornflower - // Light mode surfaces - background: '#faf8f5', // Warm off-white - surface: '#ffffff', // Pure white cards - text: '#115566', // Deep Pine - // Navigation green scale (L1=lightest, L4=darkest) - navL1: '#66AA99', // Sage - button default - navL2: '#448880', // Teal - hover - navL3: '#115566', // Deep Pine - selected - navL4: '#082226', // Midnight - nav background - }, - components: { - borderRadius: 4, // Subtle rounding - }, -}; - -// Context for accessing theme config -const ThemeConfigContext = createContext<ThemeConfig | null>(null); - -// Hook to access theme configuration -export function useOperatorTheme(): ThemeConfig | null { - return useContext(ThemeConfigContext); -} - -// Hook to detect system dark mode preference -function usePrefersDarkMode(): boolean { - const [prefersDark, setPrefersDark] = useState( - () => typeof window !== 'undefined' - ? window.matchMedia('(prefers-color-scheme: dark)').matches - : false - ); - - useEffect(() => { - if (typeof window === 'undefined') {return;} - - const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); - const handler = (e: MediaQueryListEvent) => setPrefersDark(e.matches); - mediaQuery.addEventListener('change', handler); - return () => mediaQuery.removeEventListener('change', handler); - }, []); - - return prefersDark; -} - -// Auto-derive dark mode colors from light palette -interface DarkColors { - background: string; - surface: string; - text: string; - navButton: string; - navHover: string; - navSelected: string; -} - -function deriveDarkColors(colors: ThemeConfig['colors']): DarkColors { - return { - background: colors.navL4, // Midnight - surface: colors.navL3, // Deep Pine - text: colors.accent, // Cream - navButton: colors.navL2, // Teal (inverted) - navHover: colors.navL1, // Sage (inverted) - navSelected: colors.accent, // Cream text on dark - }; -} - -// Create a Backstage unified theme from our config -function createOperatorTheme(config: ThemeConfig, isDark: boolean) { - const basePalette = isDark ? palettes.dark : palettes.light; - const dark = isDark ? deriveDarkColors(config.colors) : null; - const radius = config.components?.borderRadius ?? 4; - - return createUnifiedTheme({ - palette: { - ...basePalette, - primary: { main: config.colors.primary }, - secondary: { main: config.colors.secondary }, - warning: { main: config.colors.warning }, - background: { - default: isDark ? dark!.background : config.colors.background, - paper: isDark ? dark!.surface : config.colors.surface, - }, - text: { - primary: isDark ? dark!.text : config.colors.text, - secondary: config.colors.muted, - }, - navigation: { - background: config.colors.navL4, - indicator: config.colors.primary, - color: isDark ? dark!.navSelected : config.colors.accent, - selectedColor: isDark ? dark!.navSelected : '#ffffff', - navItem: { - hoverBackground: isDark ? dark!.navHover : config.colors.navL2, - }, - }, - }, - components: { - // Flat buttons with subtle rounding - MuiButton: { - styleOverrides: { - root: { - borderRadius: radius, - textTransform: 'none' as const, - boxShadow: 'none', - '&:hover': { boxShadow: 'none' }, - }, - }, - }, - // Cards with subtle shadow - MuiCard: { - styleOverrides: { - root: { - borderRadius: radius + 2, - boxShadow: isDark - ? '0 1px 3px rgba(0,0,0,0.3)' - : '0 1px 3px rgba(0,0,0,0.08)', - }, - }, - }, - // Paper surfaces - MuiPaper: { - styleOverrides: { - root: { borderRadius: radius }, - }, - }, - // Square-ish chips (not pills) - MuiChip: { - styleOverrides: { - root: { borderRadius: radius }, - }, - }, - // Text fields - MuiTextField: { - styleOverrides: { - root: { - '& .MuiOutlinedInput-root': { borderRadius: radius }, - }, - }, - }, - // Outlined inputs - MuiOutlinedInput: { - styleOverrides: { - root: { borderRadius: radius }, - }, - }, - }, - }); -} - -// Merge loaded config with defaults, handling partial configs -function mergeConfig(loaded: Partial<ThemeConfig>): ThemeConfig { - return { - ...defaultThemeConfig, - ...loaded, - colors: { - ...defaultThemeConfig.colors, - ...(loaded.colors || {}), - }, - components: { - ...defaultThemeConfig.components, - ...(loaded.components || {}), - }, - }; -} - -interface OperatorThemeProviderProps { - children: ReactNode; -} - -export function OperatorThemeProvider({ children }: OperatorThemeProviderProps) { - const [config, setConfig] = useState<ThemeConfig>(defaultThemeConfig); - const [loading, setLoading] = useState(true); - const prefersDarkMode = usePrefersDarkMode(); - - useEffect(() => { - fetch('/api/branding') - .then(res => res.json()) - .then((data: Partial<ThemeConfig>) => { - setConfig(mergeConfig(data)); - setLoading(false); - }) - .catch(() => { - // Use defaults if fetch fails - setLoading(false); - }); - }, []); - - // Show loading state briefly while fetching config - if (loading) { - return null; - } - - // Determine if dark mode should be active - const isDark = config.mode === 'dark' || - (config.mode === 'system' && prefersDarkMode); - - const theme = createOperatorTheme(config, isDark); - - return ( - <ThemeConfigContext.Provider value={config}> - <UnifiedThemeProvider theme={theme}> - {children} - </UnifiedThemeProvider> - </ThemeConfigContext.Provider> - ); -} diff --git a/backstage-server/packages/app/src/theme/index.ts b/backstage-server/packages/app/src/theme/index.ts deleted file mode 100644 index 92b646dd..00000000 --- a/backstage-server/packages/app/src/theme/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Theme module exports - */ - -export { OperatorThemeProvider, useOperatorTheme } from './OperatorThemeProvider'; diff --git a/backstage-server/packages/app/src/theme/operator-theme.css b/backstage-server/packages/app/src/theme/operator-theme.css deleted file mode 100644 index 3296ffb2..00000000 --- a/backstage-server/packages/app/src/theme/operator-theme.css +++ /dev/null @@ -1,213 +0,0 @@ -/** - * Operator Portal Theme - BUI CSS Variables - * Based on docs/assets/css/main.css color palette - * - * Color Reference: - * - Terracotta: #E05D44 (primary, actions) - * - Cornflower: #6688AA (muted text) - * - Cream: #F2EAC9 (accent, sidebar) - * - Sage: #66AA99 (nav buttons) - * - Teal: #448880 (hover) - * - Deep Pine: #115566 (text, selected) - * - Midnight: #082226 (dark mode bg) - */ - -/* Light Mode */ -[data-theme-mode='light'], :root { - /* Core backgrounds */ - --bui-bg: #faf8f5; - --bui-bg-surface-1: #ffffff; - --bui-bg-surface-2: #F2EAC9; - --bui-bg-solid: #E05D44; - - /* Foregrounds */ - --bui-fg-primary: #115566; - --bui-fg-secondary: #6688AA; - --bui-fg-muted: #6688AA; - - /* Brand colors */ - --bui-primary: #E05D44; - --bui-secondary: #115566; - --bui-accent: #F2EAC9; - - /* Borders */ - --bui-border: rgba(17, 85, 102, 0.15); - - /* Navigation sidebar (Light Cream) */ - --bui-sidebar-bg: #F2EAC9; - --bui-sidebar-fg: #115566; - --bui-sidebar-hover: #66AA99; - --bui-sidebar-selected: #115566; - --bui-sidebar-selected-bg: #66AA99; - - /* Radius - subtle rounding */ - --bui-radius-1: 4px; - --bui-radius-2: 6px; - --bui-radius-3: 8px; - - /* Gray scale (for compatibility) */ - --bui-gray-1: #faf8f5; - --bui-gray-2: #F2EAC9; - --bui-gray-3: #e0d9c0; - --bui-gray-4: #c5bda5; - --bui-gray-5: #6688AA; - --bui-gray-6: #448880; - --bui-gray-7: #115566; - --bui-gray-8: #082226; -} - -/* Dark Mode */ -[data-theme-mode='dark'] { - --bui-bg: #082226; - --bui-bg-surface-1: #115566; - --bui-bg-surface-2: #448880; - --bui-bg-solid: #E05D44; - - --bui-fg-primary: #F2EAC9; - --bui-fg-secondary: #66AA99; - --bui-fg-muted: #6688AA; - - --bui-primary: #E05D44; - --bui-border: rgba(242, 234, 201, 0.2); - - /* Dark sidebar */ - --bui-sidebar-bg: #082226; - --bui-sidebar-fg: #F2EAC9; - --bui-sidebar-hover: #448880; - --bui-sidebar-selected-bg: #115566; - - /* Gray scale inverted */ - --bui-gray-1: #082226; - --bui-gray-2: #115566; - --bui-gray-3: #448880; - --bui-gray-4: #66AA99; - --bui-gray-5: #6688AA; - --bui-gray-6: #c5bda5; - --bui-gray-7: #F2EAC9; - --bui-gray-8: #faf8f5; -} - -/* ============================================ - * BUI Component Overrides - * ============================================ */ - -.bui-Button { - border-radius: var(--bui-radius-1); - text-transform: none; -} - -.bui-Card { - border-radius: var(--bui-radius-2); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); -} - -/* ============================================ - * Backstage Sidebar Overrides (Light Cream) - * ============================================ */ - -/* Main sidebar container */ -[data-testid="sidebar-root"], -nav[aria-label="sidebar nav"] > div { - background-color: var(--bui-sidebar-bg) !important; - color: var(--bui-sidebar-fg) !important; -} - -/* Sidebar title/logo text */ -nav[aria-label="sidebar nav"] span { - color: var(--bui-sidebar-fg) !important; -} - -/* Sidebar nav items */ -nav[aria-label="sidebar nav"] a, -nav[aria-label="sidebar nav"] button { - color: var(--bui-sidebar-fg) !important; -} - -/* Sidebar item hover */ -nav[aria-label="sidebar nav"] a:hover, -nav[aria-label="sidebar nav"] button:hover { - background-color: var(--bui-sidebar-hover) !important; - color: #ffffff !important; -} - -/* Active/selected sidebar item */ -nav[aria-label="sidebar nav"] a[aria-current="page"] { - background-color: var(--bui-sidebar-selected-bg) !important; - color: #ffffff !important; -} - -/* Sidebar dividers */ -nav[aria-label="sidebar nav"] hr { - border-color: var(--bui-sidebar-fg) !important; - opacity: 0.2; -} - -/* Sidebar icons */ -nav[aria-label="sidebar nav"] svg { - fill: currentColor !important; -} - -/* ============================================ - * Main Content Area - * ============================================ */ - -/* Main background */ -main { - background-color: var(--bui-bg) !important; -} - -/* Page headers */ -header { - background: linear-gradient(135deg, var(--bui-primary) 0%, var(--bui-secondary) 100%) !important; - color: #ffffff !important; -} - -header h1, -header span { - color: #ffffff !important; -} - -/* ============================================ - * MUI Component Overrides (Legacy Support) - * ============================================ */ - -/* Cards */ -.MuiCard-root, -.MuiPaper-root { - background-color: var(--bui-bg-surface-1) !important; - border-radius: var(--bui-radius-2) !important; -} - -/* Typography */ -.MuiTypography-root { - color: var(--bui-fg-primary); -} - -.MuiTypography-colorTextSecondary { - color: var(--bui-fg-secondary) !important; -} - -/* Buttons */ -.MuiButton-root { - border-radius: var(--bui-radius-1) !important; - text-transform: none !important; -} - -.MuiButton-containedPrimary { - background-color: var(--bui-primary) !important; -} - -/* Icons */ -.MuiSvgIcon-root { - color: var(--bui-primary); -} - -/* Text fields */ -.MuiOutlinedInput-root { - border-radius: var(--bui-radius-1) !important; -} - -/* Chips */ -.MuiChip-root { - border-radius: var(--bui-radius-1) !important; -} diff --git a/backstage-server/packages/backend/package.json b/backstage-server/packages/backend/package.json deleted file mode 100644 index 0d330ca3..00000000 --- a/backstage-server/packages/backend/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "backend", - "version": "0.0.0", - "private": true, - "main": "dist/index.cjs.js", - "backstage": { - "role": "backend" - }, - "scripts": { - "start": "backstage-cli package start", - "build": "backstage-cli package build" - }, - "dependencies": { - "@backstage/backend-defaults": "^0.4.0", - "@backstage/plugin-app-backend": "^0.3.0", - "@backstage/plugin-auth-backend": "^0.22.0", - "@backstage/plugin-auth-backend-module-guest-provider": "^0.1.0", - "@backstage/plugin-catalog-backend": "^1.24.0", - "@backstage/plugin-proxy-backend": "^0.5.0" - } -} diff --git a/backstage-server/packages/backend/src/__tests__/smoke.test.ts b/backstage-server/packages/backend/src/__tests__/smoke.test.ts deleted file mode 100644 index 3be28ae7..00000000 --- a/backstage-server/packages/backend/src/__tests__/smoke.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { describe, test, expect } from 'bun:test'; - -describe('backend smoke tests', () => { - test('backend package exists', () => { - // Placeholder: backend entry point has side effects (starts server) - // Add meaningful tests when backend exports testable modules - expect(true).toBe(true); - }); -}); diff --git a/backstage-server/packages/backend/src/index.ts b/backstage-server/packages/backend/src/index.ts deleted file mode 100644 index b265e6fe..00000000 --- a/backstage-server/packages/backend/src/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Operator Backstage Backend - * - * Minimal Bun-based backend for local catalog browsing. - * Includes proxy for Operator API integration. - */ - -import { createBackend } from '@backstage/backend-defaults'; - -const backend = createBackend(); - -// Core plugins -backend.add(import('@backstage/plugin-app-backend')); -backend.add(import('@backstage/plugin-catalog-backend')); - -// Proxy for Operator REST API -backend.add(import('@backstage/plugin-proxy-backend')); - -// Auth with guest provider -backend.add(import('@backstage/plugin-auth-backend')); -backend.add(import('@backstage/plugin-auth-backend-module-guest-provider')); - -// Start the backend -backend.start(); diff --git a/backstage-server/packages/plugins/plugin-issuetypes/package.json b/backstage-server/packages/plugins/plugin-issuetypes/package.json deleted file mode 100644 index 20effd2f..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "@operator/plugin-issuetypes", - "version": "0.0.0", - "private": true, - "main": "src/index.ts", - "types": "src/index.ts", - "exports": { - ".": "./src/index.ts", - "./alpha": "./src/alpha.tsx", - "./package.json": "./package.json" - }, - "typesVersions": { - "*": { - "alpha": ["src/alpha.tsx"] - } - }, - "backstage": { - "role": "frontend-plugin", - "pluginId": "issuetypes", - "pluginPackages": ["@operator/plugin-issuetypes"] - }, - "scripts": { - "start": "backstage-cli package start", - "build": "backstage-cli package build" - }, - "dependencies": { - "@backstage/core-components": "^0.14.0", - "@backstage/core-plugin-api": "^1.9.0", - "@backstage/frontend-plugin-api": "^0.13.2", - "@backstage/theme": "^0.5.0", - "react": "^18.2.0", - "react-router-dom": "^6.0.0" - }, - "devDependencies": { - "@backstage/cli": "^0.27.0", - "@material-ui/core": "^4.12.4", - "@types/react": "^18" - }, - "peerDependencies": { - "@material-ui/core": "^4.12.0", - "react": "^18.0.0" - } -} diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/routing.test.tsx b/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/routing.test.tsx deleted file mode 100644 index 07eaf123..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/routing.test.tsx +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Routing Tests - * - * Tests that verify route configuration and component exports for navigation. - * Uses bun:test for smoke-style testing. - * - * These tests verify that: - * 1. Components are properly exported from the plugin - * 2. Navigation patterns use relative paths (for flat routes) - * 3. The App.tsx uses flat routes (not nested) - */ - -import { describe, test, expect } from 'bun:test'; -import * as fs from 'fs'; -import * as path from 'path'; - -describe('IssueTypes Route Configuration', () => { - test('App.tsx uses flat routes for issuetypes', () => { - // Read the App.tsx file to verify routes are flat - const appPath = path.resolve( - __dirname, - '../../../../app/src/App.tsx', - ); - const content = fs.readFileSync(appPath, 'utf-8'); - - // Should have flat routes (each route is independent, not nested) - expect(content).toContain('path="/issuetypes"'); - expect(content).toContain('path="/issuetypes/new"'); - expect(content).toContain('path="/issuetypes/collections"'); - expect(content).toContain('path="/issuetypes/:key"'); - expect(content).toContain('path="/issuetypes/:key/edit"'); - - // Each route should use its own element prop (not nested children) - expect(content).toContain('element={<IssueTypesPage />}'); - expect(content).toContain('element={<IssueTypeFormPage />}'); - expect(content).toContain('element={<CollectionsPage />}'); - expect(content).toContain('element={<IssueTypeDetailPage />}'); - }); - - test('plugin exports all page components', async () => { - // Read the plugin index.ts to verify exports - const indexPath = path.resolve(__dirname, '../index.ts'); - const content = fs.readFileSync(indexPath, 'utf-8'); - - expect(content).toContain('IssueTypesPage'); - expect(content).toContain('IssueTypeDetailPage'); - expect(content).toContain('IssueTypeFormPage'); - expect(content).toContain('CollectionsPage'); - }); -}); - -describe('Navigation Patterns', () => { - test('IssueTypesPage uses relative links for navigation', () => { - const componentPath = path.resolve( - __dirname, - '../components/IssueTypesPage.tsx', - ); - const content = fs.readFileSync(componentPath, 'utf-8'); - - // Check that the Create Issue Type button uses relative "new" path - expect(content).toContain('to="new"'); - - // Check that Collections button uses relative "collections" path - expect(content).toContain('to="collections"'); - - // Check that row links use relative paths (just the key) - expect(content).toContain('to={row.key}'); - }); - - test('IssueTypeFormPage uses navigate for programmatic navigation', () => { - const componentPath = path.resolve( - __dirname, - '../components/IssueTypeFormPage.tsx', - ); - const content = fs.readFileSync(componentPath, 'utf-8'); - - // Uses useNavigate hook - expect(content).toContain('useNavigate'); - - // Navigates back with relative path - expect(content).toContain("navigate('..')"); - }); - - test('IssueTypeDetailPage exists and handles key param', () => { - const componentPath = path.resolve( - __dirname, - '../components/IssueTypeDetailPage.tsx', - ); - const content = fs.readFileSync(componentPath, 'utf-8'); - - // Should use useParams to get the key - expect(content).toContain('useParams'); - expect(content).toContain('key'); - }); -}); - -describe('Route Priority (flat routes ensure specificity)', () => { - test('/issuetypes/new is more specific than /issuetypes/:key', () => { - const appPath = path.resolve( - __dirname, - '../../../../app/src/App.tsx', - ); - const content = fs.readFileSync(appPath, 'utf-8'); - - // Get positions of routes - const newRoutePos = content.indexOf('path="/issuetypes/new"'); - const keyRoutePos = content.indexOf('path="/issuetypes/:key"'); - - // /issuetypes/new should come before /issuetypes/:key for proper matching - expect(newRoutePos).toBeLessThan(keyRoutePos); - }); - - test('/issuetypes/collections is more specific than /issuetypes/:key', () => { - const appPath = path.resolve( - __dirname, - '../../../../app/src/App.tsx', - ); - const content = fs.readFileSync(appPath, 'utf-8'); - - // Get positions of routes - const collectionsRoutePos = content.indexOf('path="/issuetypes/collections"'); - const keyRoutePos = content.indexOf('path="/issuetypes/:key"'); - - // /issuetypes/collections should come before /issuetypes/:key - expect(collectionsRoutePos).toBeLessThan(keyRoutePos); - }); -}); diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/smoke.test.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/smoke.test.ts deleted file mode 100644 index 4f77b63a..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/smoke.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { describe, test, expect } from 'bun:test'; - -describe('plugin-issuetypes smoke tests', () => { - test('plugin exports are defined', async () => { - const plugin = await import('../index'); - expect(plugin).toBeDefined(); - expect(plugin.issueTypesPlugin).toBeDefined(); - expect(plugin.operatorApiRef).toBeDefined(); - }); - - test('Chip component renders', async () => { - const { Chip } = await import('../components/ui'); - expect(Chip).toBeDefined(); - expect(typeof Chip).toBe('function'); - }); - - test('API types are exported', async () => { - const types = await import('../api/types'); - expect(types.STEP_OUTPUTS).toBeDefined(); - expect(types.ALLOWED_TOOLS).toBeDefined(); - }); - - test('hooks are exported', async () => { - const hooks = await import('../hooks'); - expect(hooks.useIssueTypes).toBeDefined(); - expect(hooks.useIssueType).toBeDefined(); - expect(hooks.useCreateIssueType).toBeDefined(); - expect(hooks.useCollections).toBeDefined(); - expect(hooks.useSteps).toBeDefined(); - }); - - test('mock API works', async () => { - const { createMockOperatorApi, mockIssueTypeSummaries } = await import( - './test-utils' - ); - const api = createMockOperatorApi(); - - const issueTypes = await api.listIssueTypes(); - expect(issueTypes).toEqual(mockIssueTypeSummaries); - expect(issueTypes.length).toBe(4); - - const feat = await api.getIssueType('FEAT'); - expect(feat.key).toBe('FEAT'); - expect(feat.mode).toBe('autonomous'); - - const collections = await api.listCollections(); - expect(collections.length).toBe(2); - }); -}); diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/test-utils/index.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/test-utils/index.ts deleted file mode 100644 index 7ea4c192..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/test-utils/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Test utilities exports. - */ - -export { - createMockOperatorApi, - mockIssueTypeSummaries, - mockIssueTypeResponse, - mockFields, - mockSteps, - mockCollections, - mockStatus, -} from './mockApi'; - -export { renderWithProviders, renderWithRoutes } from './renderWithProviders'; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/test-utils/mockApi.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/test-utils/mockApi.ts deleted file mode 100644 index c969eb5e..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/test-utils/mockApi.ts +++ /dev/null @@ -1,282 +0,0 @@ -/** - * Mock Operator API for testing. - */ -import type { OperatorApi } from '../../api'; -import type { - IssueTypeSummary, - IssueTypeResponse, - CollectionResponse, - StepResponse, - StatusResponse, - FieldResponse, -} from '../../api/types'; - -/** Mock issue type summaries */ -export const mockIssueTypeSummaries: IssueTypeSummary[] = [ - { - key: 'FEAT', - name: 'Feature', - description: 'New feature implementation', - mode: 'autonomous', - glyph: '*', - source: 'builtin', - step_count: 5, - }, - { - key: 'FIX', - name: 'Fix', - description: 'Bug fix', - mode: 'autonomous', - glyph: '#', - source: 'builtin', - step_count: 3, - }, - { - key: 'TASK', - name: 'Task', - description: 'Simple task', - mode: 'autonomous', - glyph: '>', - source: 'builtin', - step_count: 1, - }, - { - key: 'SPIKE', - name: 'Spike', - description: 'Research spike', - mode: 'paired', - glyph: '?', - source: 'builtin', - step_count: 3, - }, -]; - -/** Mock fields for an issue type */ -export const mockFields: FieldResponse[] = [ - { - name: 'id', - description: 'Unique ticket ID', - field_type: 'string', - required: true, - options: [], - user_editable: false, - }, - { - name: 'summary', - description: 'Brief summary of the task', - field_type: 'string', - required: true, - placeholder: 'Enter a brief summary', - max_length: 120, - options: [], - user_editable: true, - }, - { - name: 'priority', - description: 'Task priority', - field_type: 'enum', - required: true, - default: 'P2-medium', - options: ['P0-critical', 'P1-high', 'P2-medium', 'P3-low'], - user_editable: true, - }, -]; - -/** Mock steps for an issue type */ -export const mockSteps: StepResponse[] = [ - { - name: 'plan', - display_name: 'Plan', - prompt: 'Create a plan for implementing the feature', - outputs: ['plan'], - allowed_tools: ['Read', 'Glob', 'Grep'], - requires_review: true, - next_step: 'build', - permission_mode: 'plan', - }, - { - name: 'build', - display_name: 'Build', - prompt: 'Implement the feature according to the plan', - outputs: ['code'], - allowed_tools: ['Read', 'Write', 'Edit', 'Glob', 'Grep', 'Bash'], - requires_review: false, - next_step: 'test', - permission_mode: 'default', - }, - { - name: 'test', - display_name: 'Test', - prompt: 'Write and run tests for the implementation', - outputs: ['test', 'code'], - allowed_tools: ['Read', 'Write', 'Edit', 'Glob', 'Grep', 'Bash'], - requires_review: false, - permission_mode: 'default', - }, -]; - -/** Mock full issue type response */ -export const mockIssueTypeResponse: IssueTypeResponse = { - key: 'FEAT', - name: 'Feature', - description: 'New feature implementation', - mode: 'autonomous', - glyph: '*', - color: 'green', - project_required: true, - source: 'builtin', - fields: mockFields, - steps: mockSteps, -}; - -/** Mock collections */ -export const mockCollections: CollectionResponse[] = [ - { - name: 'default', - description: 'Default collection with all issue types', - types: ['FEAT', 'FIX', 'TASK', 'SPIKE', 'INV'], - is_active: true, - }, - { - name: 'minimal', - description: 'Minimal collection for simple tasks', - types: ['TASK', 'FIX'], - is_active: false, - }, -]; - -/** Mock status response */ -export const mockStatus: StatusResponse = { - status: 'ok', - version: '0.1.0', - issuetype_count: 4, - collection_count: 2, - active_collection: 'default', -}; - -/** Create a mock OperatorApi */ -export function createMockOperatorApi( - overrides: Partial<OperatorApi> = {}, -): OperatorApi { - return { - getStatus: async () => mockStatus, - listIssueTypes: async () => mockIssueTypeSummaries, - getIssueType: async (key: string) => { - const found = mockIssueTypeSummaries.find((t) => t.key === key); - if (!found) { - throw new Error(`Issue type not found: ${key}`); - } - return { - ...mockIssueTypeResponse, - key: found.key, - name: found.name, - description: found.description, - mode: found.mode, - glyph: found.glyph, - source: found.source, - }; - }, - createIssueType: async (request) => ({ - key: request.key, - name: request.name, - description: request.description, - mode: request.mode || 'autonomous', - glyph: request.glyph, - color: request.color, - project_required: request.project_required ?? true, - source: 'user', - fields: (request.fields || []).map((f) => ({ - name: f.name, - description: f.description, - field_type: f.field_type || 'string', - required: f.required || false, - default: f.default, - options: f.options || [], - placeholder: f.placeholder, - max_length: f.max_length, - user_editable: f.user_editable ?? true, - })), - steps: request.steps.map((s) => ({ - name: s.name, - display_name: s.display_name, - prompt: s.prompt, - outputs: s.outputs || [], - allowed_tools: s.allowed_tools || [], - requires_review: s.requires_review || false, - next_step: s.next_step, - on_reject: s.on_reject, - permission_mode: s.permission_mode || 'default', - })), - }), - updateIssueType: async (key, request) => ({ - ...mockIssueTypeResponse, - key, - name: request.name ?? mockIssueTypeResponse.name, - description: request.description ?? mockIssueTypeResponse.description, - mode: request.mode ?? mockIssueTypeResponse.mode, - glyph: request.glyph ?? mockIssueTypeResponse.glyph, - color: request.color, - project_required: request.project_required ?? mockIssueTypeResponse.project_required, - fields: request.fields - ? request.fields.map((f) => ({ - name: f.name, - description: f.description, - field_type: f.field_type || 'string', - required: f.required || false, - default: f.default, - options: f.options || [], - placeholder: f.placeholder, - max_length: f.max_length, - user_editable: f.user_editable ?? true, - })) - : mockIssueTypeResponse.fields, - steps: request.steps - ? request.steps.map((s) => ({ - name: s.name, - display_name: s.display_name, - prompt: s.prompt, - outputs: s.outputs || [], - allowed_tools: s.allowed_tools || [], - requires_review: s.requires_review || false, - next_step: s.next_step, - on_reject: s.on_reject, - permission_mode: s.permission_mode || 'default', - })) - : mockIssueTypeResponse.steps, - }), - deleteIssueType: async () => {}, - getSteps: async () => mockSteps, - getStep: async (_key, stepName) => { - const found = mockSteps.find((s) => s.name === stepName); - if (!found) { - throw new Error(`Step not found: ${stepName}`); - } - return found; - }, - updateStep: async (_key, stepName, request) => { - const found = mockSteps.find((s) => s.name === stepName); - if (!found) { - throw new Error(`Step not found: ${stepName}`); - } - return { ...found, ...request }; - }, - listCollections: async () => mockCollections, - getActiveCollection: async () => - mockCollections.find((c) => c.is_active) || mockCollections[0], - getCollection: async (name) => { - const found = mockCollections.find((c) => c.name === name); - if (!found) { - throw new Error(`Collection not found: ${name}`); - } - return found; - }, - activateCollection: async (name) => { - const found = mockCollections.find((c) => c.name === name); - if (!found) { - throw new Error(`Collection not found: ${name}`); - } - return { ...found, is_active: true }; - }, - ...overrides, - }; -} diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/test-utils/renderWithProviders.tsx b/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/test-utils/renderWithProviders.tsx deleted file mode 100644 index 6870e9c1..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/__tests__/test-utils/renderWithProviders.tsx +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Test utilities for rendering components with all required providers. - * - * NOTE: These utilities require @testing-library/react and @backstage/test-utils - * to be installed. They are intended for future integration tests in a browser-like - * environment. For now, use the simpler bun:test smoke tests. - * - * Usage (when dependencies are installed): - * import { renderWithProviders } from './test-utils'; - * const { getByText } = renderWithProviders(<MyComponent />, { route: '/issuetypes' }); - */ - -import type React from 'react'; - -/** - * Type definitions for test utilities. - * These mirror the APIs from @testing-library/react and @backstage/test-utils. - */ -interface RenderOptions { - route?: string; - mockApi?: unknown; - routes?: React.ReactNode; -} - -interface RenderResult { - container: HTMLElement; - getByText: (text: string) => HTMLElement; - queryByText: (text: string) => HTMLElement | null; - findByText: (text: string) => Promise<HTMLElement>; -} - -/** - * Placeholder for renderWithProviders. - * - * This function requires @testing-library/react and @backstage/test-utils. - * Install them to enable integration testing: - * bun add -d @testing-library/react @backstage/test-utils - */ -function renderWithProviders( - _ui: React.ReactElement, - _options: RenderOptions = {}, -): RenderResult { - throw new Error( - 'renderWithProviders requires @testing-library/react and @backstage/test-utils. ' + - 'Install them with: bun add -d @testing-library/react @backstage/test-utils', - ); -} - -/** - * Placeholder for renderWithRoutes. - * - * This function requires @testing-library/react and @backstage/test-utils. - */ -function renderWithRoutes( - _routeConfig: Array<{ path: string; element: React.ReactElement }>, - _options: Omit<RenderOptions, 'routes'> = {}, -): RenderResult { - throw new Error( - 'renderWithRoutes requires @testing-library/react and @backstage/test-utils. ' + - 'Install them with: bun add -d @testing-library/react @backstage/test-utils', - ); -} - -export { renderWithProviders, renderWithRoutes }; -export type { RenderOptions, RenderResult }; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/alpha.tsx b/backstage-server/packages/plugins/plugin-issuetypes/src/alpha.tsx deleted file mode 100644 index f04369b7..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/alpha.tsx +++ /dev/null @@ -1,166 +0,0 @@ -/** - * New Frontend System Plugin (Alpha) - * - * This module exports the plugin using Backstage's new frontend system - * with PageBlueprint, NavItemBlueprint, and ApiBlueprint. - * - * Usage: - * import issueTypesPlugin from '@operator/plugin-issuetypes/alpha'; - * - * const app = createApp({ - * features: [issueTypesPlugin], - * }); - */ - -import React from 'react'; -import { - createFrontendPlugin, - PageBlueprint, - NavItemBlueprint, - ApiBlueprint, - createRouteRef, -} from '@backstage/frontend-plugin-api'; -import { - discoveryApiRef, - fetchApiRef, -} from '@backstage/core-plugin-api'; -import { operatorApiRef, OperatorApiClient } from './api'; - -// Route References for the new frontend system -const rootRouteRef = createRouteRef(); -const detailRouteRef = createRouteRef({ params: ['key'] }); -const formRouteRef = createRouteRef(); -const editRouteRef = createRouteRef({ params: ['key'] }); -const collectionsRouteRef = createRouteRef(); - -// Icons for navigation -const IssueTypesIcon = () => ( - <svg viewBox="0 0 24 24" width="24" height="24" fill="currentColor"> - <path d="M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z" /> - </svg> -); - -const CollectionsIcon = () => ( - <svg viewBox="0 0 24 24" width="24" height="24" fill="currentColor"> - <path d="M3 3h8v8H3zm10 0h8v8h-8zM3 13h8v8H3zm10 0h8v8h-8z" /> - </svg> -); - -// Page Extensions using PageBlueprint -const issueTypesPage = PageBlueprint.make({ - params: { - path: '/issuetypes', - routeRef: rootRouteRef, - loader: () => - import('./components/IssueTypesPage').then(m => <m.IssueTypesPage />), - }, -}); - -const issueTypeDetailPage = PageBlueprint.make({ - name: 'detail', - params: { - path: '/issuetypes/:key', - routeRef: detailRouteRef, - loader: () => - import('./components/IssueTypeDetailPage').then(m => ( - <m.IssueTypeDetailPage /> - )), - }, -}); - -const issueTypeFormPage = PageBlueprint.make({ - name: 'form', - params: { - path: '/issuetypes/new', - routeRef: formRouteRef, - loader: () => - import('./components/IssueTypeFormPage').then(m => <m.IssueTypeFormPage />), - }, -}); - -const issueTypeEditPage = PageBlueprint.make({ - name: 'edit', - params: { - path: '/issuetypes/:key/edit', - routeRef: editRouteRef, - loader: () => - import('./components/IssueTypeFormPage').then(m => <m.IssueTypeFormPage />), - }, -}); - -const collectionsPage = PageBlueprint.make({ - name: 'collections', - params: { - path: '/issuetypes/collections', - routeRef: collectionsRouteRef, - loader: () => - import('./components/CollectionsPage').then(m => <m.CollectionsPage />), - }, -}); - -// Navigation Items using NavItemBlueprint -const issueTypesNavItem = NavItemBlueprint.make({ - params: { - title: 'Issue Types', - routeRef: rootRouteRef, - icon: IssueTypesIcon, - }, -}); - -const collectionsNavItem = NavItemBlueprint.make({ - name: 'collections', - params: { - title: 'Collections', - routeRef: collectionsRouteRef, - icon: CollectionsIcon, - }, -}); - -// API Extension using ApiBlueprint with defineParams pattern -const operatorApi = ApiBlueprint.make({ - params: defineParams => - defineParams({ - api: operatorApiRef, - deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef }, - factory: ({ discoveryApi, fetchApi }) => - new OperatorApiClient({ discoveryApi, fetchApi }), - }), -}); - -// Plugin Definition -export default createFrontendPlugin({ - pluginId: 'issuetypes', - routes: { - root: rootRouteRef, - detail: detailRouteRef, - form: formRouteRef, - edit: editRouteRef, - collections: collectionsRouteRef, - }, - extensions: [ - // Pages - issueTypesPage, - issueTypeDetailPage, - issueTypeFormPage, - issueTypeEditPage, - collectionsPage, - // Navigation - issueTypesNavItem, - collectionsNavItem, - // API - operatorApi, - ], -}); - -// Re-export route refs for external use -export { - rootRouteRef, - detailRouteRef, - formRouteRef, - editRouteRef, - collectionsRouteRef, -}; - -// Re-export API ref for convenience -export { operatorApiRef } from './api'; -export type { OperatorApi } from './api'; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/api/OperatorApi.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/api/OperatorApi.ts deleted file mode 100644 index 0f229a2c..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/api/OperatorApi.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Operator API interface definition. - */ -import { createApiRef } from '@backstage/core-plugin-api'; -import type { - IssueTypeSummary, - IssueTypeResponse, - CollectionResponse, - StepResponse, - StatusResponse, - CreateIssueTypeRequest, - UpdateIssueTypeRequest, - UpdateStepRequest, -} from './types'; - -/** Interface for the Operator API */ -export interface OperatorApi { - // Health & Status - getStatus(): Promise<StatusResponse>; - - // Issue Types - listIssueTypes(): Promise<IssueTypeSummary[]>; - getIssueType(key: string): Promise<IssueTypeResponse>; - createIssueType(request: CreateIssueTypeRequest): Promise<IssueTypeResponse>; - updateIssueType( - key: string, - request: UpdateIssueTypeRequest, - ): Promise<IssueTypeResponse>; - deleteIssueType(key: string): Promise<void>; - - // Steps - getSteps(issueTypeKey: string): Promise<StepResponse[]>; - getStep(issueTypeKey: string, stepName: string): Promise<StepResponse>; - updateStep( - issueTypeKey: string, - stepName: string, - request: UpdateStepRequest, - ): Promise<StepResponse>; - - // Collections - listCollections(): Promise<CollectionResponse[]>; - getActiveCollection(): Promise<CollectionResponse>; - getCollection(name: string): Promise<CollectionResponse>; - activateCollection(name: string): Promise<CollectionResponse>; -} - -/** API ref for dependency injection */ -export const operatorApiRef = createApiRef<OperatorApi>({ - id: 'plugin.operator.api', -}); diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/api/OperatorApiClient.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/api/OperatorApiClient.ts deleted file mode 100644 index b3b4a628..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/api/OperatorApiClient.ts +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Operator API client implementation. - * Communicates with the Operator REST API via Backstage proxy. - */ -import type { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api'; -import type { OperatorApi } from './OperatorApi'; -import type { - IssueTypeSummary, - IssueTypeResponse, - CollectionResponse, - StepResponse, - StatusResponse, - CreateIssueTypeRequest, - UpdateIssueTypeRequest, - UpdateStepRequest, - ErrorResponse, -} from './types'; - -/** Options for creating the Operator API client */ -export interface OperatorApiClientOptions { - discoveryApi: DiscoveryApi; - fetchApi: FetchApi; -} - -/** API client error with status code */ -export class OperatorApiError extends Error { - constructor( - message: string, - public readonly status: number, - public readonly errorCode?: string, - ) { - super(message); - this.name = 'OperatorApiError'; - } -} - -/** Implementation of the Operator API */ -export class OperatorApiClient implements OperatorApi { - private readonly discoveryApi: DiscoveryApi; - private readonly fetchApi: FetchApi; - - constructor(options: OperatorApiClientOptions) { - this.discoveryApi = options.discoveryApi; - this.fetchApi = options.fetchApi; - } - - /** Get the base URL for the Operator API via proxy */ - private async getBaseUrl(): Promise<string> { - const proxyUrl = await this.discoveryApi.getBaseUrl('proxy'); - return `${proxyUrl}/operator`; - } - - /** Make a request to the Operator API */ - private async request<T>(path: string, options?: RequestInit): Promise<T> { - const baseUrl = await this.getBaseUrl(); - const url = `${baseUrl}${path}`; - - const response = await this.fetchApi.fetch(url, { - ...options, - headers: { - 'Content-Type': 'application/json', - ...options?.headers, - }, - }); - - if (!response.ok) { - let errorMessage = `API error: ${response.status} ${response.statusText}`; - let errorCode: string | undefined; - - try { - const errorBody: ErrorResponse = await response.json(); - errorMessage = errorBody.message; - errorCode = errorBody.error; - } catch { - // Use default error message if parsing fails - } - - throw new OperatorApiError(errorMessage, response.status, errorCode); - } - - // Handle empty responses (e.g., DELETE) - const contentType = response.headers.get('content-type'); - if (contentType && contentType.includes('application/json')) { - return response.json(); - } - - return undefined as T; - } - - // Health & Status - - async getStatus(): Promise<StatusResponse> { - return this.request('/api/v1/status'); - } - - // Issue Types - - async listIssueTypes(): Promise<IssueTypeSummary[]> { - return this.request('/api/v1/issuetypes'); - } - - async getIssueType(key: string): Promise<IssueTypeResponse> { - return this.request(`/api/v1/issuetypes/${encodeURIComponent(key)}`); - } - - async createIssueType( - request: CreateIssueTypeRequest, - ): Promise<IssueTypeResponse> { - return this.request('/api/v1/issuetypes', { - method: 'POST', - body: JSON.stringify(request), - }); - } - - async updateIssueType( - key: string, - request: UpdateIssueTypeRequest, - ): Promise<IssueTypeResponse> { - return this.request(`/api/v1/issuetypes/${encodeURIComponent(key)}`, { - method: 'PUT', - body: JSON.stringify(request), - }); - } - - async deleteIssueType(key: string): Promise<void> { - await this.request(`/api/v1/issuetypes/${encodeURIComponent(key)}`, { - method: 'DELETE', - }); - } - - // Steps - - async getSteps(issueTypeKey: string): Promise<StepResponse[]> { - return this.request( - `/api/v1/issuetypes/${encodeURIComponent(issueTypeKey)}/steps`, - ); - } - - async getStep(issueTypeKey: string, stepName: string): Promise<StepResponse> { - return this.request( - `/api/v1/issuetypes/${encodeURIComponent(issueTypeKey)}/steps/${encodeURIComponent(stepName)}`, - ); - } - - async updateStep( - issueTypeKey: string, - stepName: string, - request: UpdateStepRequest, - ): Promise<StepResponse> { - return this.request( - `/api/v1/issuetypes/${encodeURIComponent(issueTypeKey)}/steps/${encodeURIComponent(stepName)}`, - { - method: 'PUT', - body: JSON.stringify(request), - }, - ); - } - - // Collections - - async listCollections(): Promise<CollectionResponse[]> { - return this.request('/api/v1/collections'); - } - - async getActiveCollection(): Promise<CollectionResponse> { - return this.request('/api/v1/collections/active'); - } - - async getCollection(name: string): Promise<CollectionResponse> { - return this.request(`/api/v1/collections/${encodeURIComponent(name)}`); - } - - async activateCollection(name: string): Promise<CollectionResponse> { - return this.request( - `/api/v1/collections/${encodeURIComponent(name)}/activate`, - { - method: 'PUT', - }, - ); - } -} diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/api/index.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/api/index.ts deleted file mode 100644 index 8b1d5eb5..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/api/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * API module exports. - */ - -// API ref and interface -export { operatorApiRef } from './OperatorApi'; -export type { OperatorApi } from './OperatorApi'; - -// API client implementation -export { OperatorApiClient, OperatorApiError } from './OperatorApiClient'; -export type { OperatorApiClientOptions } from './OperatorApiClient'; - -// Types -export * from './types'; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/api/types.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/api/types.ts deleted file mode 100644 index 5985918e..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/api/types.ts +++ /dev/null @@ -1,201 +0,0 @@ -/** - * TypeScript types for the Operator REST API. - * These mirror the Rust DTOs in src/rest/dto.rs - */ - -/** Execution mode for issue types */ -export type ExecutionMode = 'autonomous' | 'paired'; - -/** Permission mode for steps */ -export type PermissionMode = 'default' | 'plan' | 'acceptEdits' | 'delegate'; - -/** Field types for issue type fields */ -export type FieldType = 'string' | 'enum' | 'bool' | 'date' | 'text'; - -/** Step output types */ -export type StepOutput = - | 'plan' - | 'code' - | 'test' - | 'pr' - | 'ticket' - | 'review' - | 'report' - | 'documentation'; - -/** All available step output types */ -export const STEP_OUTPUTS: StepOutput[] = [ - 'plan', - 'code', - 'test', - 'pr', - 'ticket', - 'review', - 'report', - 'documentation', -]; - -/** Common allowed tools for Claude Code */ -export const ALLOWED_TOOLS = [ - 'Read', - 'Write', - 'Edit', - 'Glob', - 'Grep', - 'Bash', - 'Task', - 'WebFetch', - 'WebSearch', - 'LSP', - 'NotebookEdit', - 'TodoWrite', -] as const; - -/** Summary response for listing issue types */ -export interface IssueTypeSummary { - key: string; - name: string; - description: string; - mode: ExecutionMode; - glyph: string; - source: string; - step_count: number; -} - -/** Full response for a single issue type */ -export interface IssueTypeResponse { - key: string; - name: string; - description: string; - mode: ExecutionMode; - glyph: string; - color?: string; - project_required: boolean; - source: string; - fields: FieldResponse[]; - steps: StepResponse[]; -} - -/** Response for a field within an issue type */ -export interface FieldResponse { - name: string; - description: string; - field_type: FieldType; - required: boolean; - default?: string; - options: string[]; - placeholder?: string; - max_length?: number; - user_editable: boolean; -} - -/** Response for a step within an issue type */ -export interface StepResponse { - name: string; - display_name?: string; - prompt: string; - outputs: StepOutput[]; - allowed_tools: string[]; - requires_review: boolean; - next_step?: string; - on_reject?: OnRejectConfig; - permission_mode: PermissionMode; -} - -/** On reject configuration for review steps */ -export interface OnRejectConfig { - goto_step: string; - prompt?: string; -} - -/** Response for a collection of issue types */ -export interface CollectionResponse { - name: string; - description: string; - types: string[]; - is_active: boolean; -} - -/** Request to create a new issue type */ -export interface CreateIssueTypeRequest { - key: string; - name: string; - description: string; - mode?: ExecutionMode; - glyph: string; - color?: string; - project_required?: boolean; - fields?: CreateFieldRequest[]; - steps: CreateStepRequest[]; -} - -/** Request to update an existing issue type */ -export interface UpdateIssueTypeRequest { - name?: string; - description?: string; - mode?: ExecutionMode; - glyph?: string; - color?: string; - project_required?: boolean; - fields?: CreateFieldRequest[]; - steps?: CreateStepRequest[]; -} - -/** Request to create a field */ -export interface CreateFieldRequest { - name: string; - description: string; - field_type?: FieldType; - required?: boolean; - default?: string; - options?: string[]; - placeholder?: string; - max_length?: number; - user_editable?: boolean; -} - -/** Request to create a step */ -export interface CreateStepRequest { - name: string; - display_name?: string; - prompt: string; - outputs?: StepOutput[]; - allowed_tools?: string[]; - requires_review?: boolean; - next_step?: string; - on_reject?: OnRejectConfig; - permission_mode?: PermissionMode; -} - -/** Request to update a step */ -export interface UpdateStepRequest { - display_name?: string; - prompt?: string; - outputs?: StepOutput[]; - allowed_tools?: string[]; - requires_review?: boolean; - next_step?: string; - on_reject?: OnRejectConfig; - permission_mode?: PermissionMode; -} - -/** Health check response */ -export interface HealthResponse { - status: string; - version: string; -} - -/** Status response with registry info */ -export interface StatusResponse { - status: string; - version: string; - issuetype_count: number; - collection_count: number; - active_collection: string; -} - -/** Error response from the API */ -export interface ErrorResponse { - error: string; - message: string; -} diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/CollectionsPage.tsx b/backstage-server/packages/plugins/plugin-issuetypes/src/components/CollectionsPage.tsx deleted file mode 100644 index 961294c0..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/CollectionsPage.tsx +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Collections Page - * - * Manage issue type collections (sets of issue types for different workflows). - */ - -import React from 'react'; -import { Link as RouterLink } from 'react-router-dom'; -import { - Content, - ContentHeader, - Header, - HeaderLabel, - Page, - Table, - TableColumn, -} from '@backstage/core-components'; -import { useCollections, useActivateCollection } from '../hooks'; -import type { CollectionResponse } from '../api/types'; -import { Chip } from './ui'; - -export const CollectionsPage = () => { - const { collections, loading, error, retry } = useCollections(); - const { activateCollection, activating } = useActivateCollection(); - - const handleActivate = async (name: string) => { - try { - await activateCollection(name); - retry(); // Refresh the list - } catch { - // Error is handled by the hook - } - }; - - const columns: TableColumn<CollectionResponse>[] = [ - { - title: 'Name', - field: 'name', - render: (row) => ( - <span style={{ fontWeight: row.is_active ? 'bold' : 'normal' }}> - {row.name} - {row.is_active && ( - <Chip - label="Active" - variant="primary" - size="small" - style={{ marginLeft: '8px' }} - /> - )} - </span> - ), - }, - { title: 'Description', field: 'description' }, - { - title: 'Types', - field: 'types', - render: (row) => ( - <div style={{ display: 'flex', flexWrap: 'wrap', gap: '4px' }}> - {row.types.map((type) => ( - <RouterLink - key={type} - to={`../${type}`} - style={{ textDecoration: 'none' }} - > - <Chip label={type} size="small" variant="default" /> - </RouterLink> - ))} - </div> - ), - }, - { - title: 'Actions', - field: 'name', - render: (row) => - !row.is_active ? ( - <button - onClick={() => handleActivate(row.name)} - disabled={activating} - style={{ - padding: '4px 12px', - backgroundColor: '#1976d2', - color: 'white', - border: 'none', - borderRadius: '4px', - cursor: activating ? 'not-allowed' : 'pointer', - }} - > - {activating ? 'Activating...' : 'Activate'} - </button> - ) : ( - <span style={{ color: '#4caf50' }}>Current</span> - ), - }, - ]; - - return ( - <Page themeId="tool"> - <Header - title="Collections" - subtitle="Issue type collections for different workflows" - > - <HeaderLabel label="Source" value="Operator REST API" /> - </Header> - <Content> - <ContentHeader title="All Collections" /> - {error ? ( - <div style={{ color: 'red', padding: '16px' }}> - <p>Error: {error.message}</p> - <button onClick={retry}>Retry</button> - </div> - ) : ( - <Table - title="Collections" - columns={columns} - data={collections || []} - isLoading={loading} - options={{ - search: true, - paging: true, - pageSize: 10, - }} - /> - )} - </Content> - </Page> - ); -}; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeDetailPage.module.css b/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeDetailPage.module.css deleted file mode 100644 index 610fca59..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeDetailPage.module.css +++ /dev/null @@ -1,42 +0,0 @@ -.grid { - display: grid; - grid-template-columns: repeat(12, 1fr); - gap: 24px; -} - -.gridItemHalf { - grid-column: span 12; -} - -@media (min-width: 960px) { - .gridItemHalf { - grid-column: span 6; - } -} - -.body1 { - font-size: 1rem; - line-height: 1.5; - margin-bottom: 16px; -} - -.subtitle { - font-size: 0.875rem; - font-weight: 500; - margin: 0; - margin-bottom: 8px; - color: rgba(0, 0, 0, 0.6); -} - -.subtitleSpaced { - font-size: 0.875rem; - font-weight: 500; - margin: 0; - margin-top: 16px; - margin-bottom: 8px; - color: rgba(0, 0, 0, 0.6); -} - -.error { - color: #f44336; -} diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeDetailPage.tsx b/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeDetailPage.tsx deleted file mode 100644 index aafc9ed5..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeDetailPage.tsx +++ /dev/null @@ -1,233 +0,0 @@ -/** - * Issue Type Detail Page - * - * Displays detailed information about a specific issue type. - */ - -import React, { useState } from 'react'; -import { useParams, useNavigate } from 'react-router-dom'; -import { - Content, - ContentHeader, - Header, - Page, - InfoCard, - LinkButton, - Table, - TableColumn, -} from '@backstage/core-components'; -import { useIssueType, useDeleteIssueType } from '../hooks'; -import type { FieldResponse, StepResponse } from '../api/types'; -import { Chip } from './ui'; -import styles from './IssueTypeDetailPage.module.css'; - -const fieldColumns: TableColumn<FieldResponse>[] = [ - { title: 'Name', field: 'name' }, - { title: 'Type', field: 'field_type' }, - { - title: 'Required', - field: 'required', - render: (row) => (row.required ? 'Yes' : 'No'), - }, - { title: 'Default', field: 'default', emptyValue: '-' }, - { - title: 'Editable', - field: 'user_editable', - render: (row) => (row.user_editable ? 'Yes' : 'No'), - }, -]; - -const stepColumns: TableColumn<StepResponse>[] = [ - { title: 'Name', field: 'name' }, - { title: 'Display Name', field: 'display_name', emptyValue: '-' }, - { - title: 'Outputs', - field: 'outputs', - render: (row) => row.outputs.join(', ') || '-', - }, - { - title: 'Review', - field: 'requires_review', - render: (row) => (row.requires_review ? 'Yes' : 'No'), - }, - { title: 'Next Step', field: 'next_step', emptyValue: '(end)' }, - { title: 'Mode', field: 'permission_mode' }, -]; - -export const IssueTypeDetailPage = () => { - const { key } = useParams<{ key: string }>(); - const navigate = useNavigate(); - const { issueType, loading, error, retry } = useIssueType(key || ''); - const { deleteIssueType, deleting } = useDeleteIssueType(); - const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); - - const isBuiltin = issueType?.source === 'builtin'; - - const handleDelete = async () => { - if (!issueType) {return;} - try { - await deleteIssueType(issueType.key); - navigate('..'); - } catch { - // Error is handled by the hook - } - }; - - if (loading) { - return ( - <Page themeId="tool"> - <Content>Loading...</Content> - </Page> - ); - } - - if (error || !issueType) { - return ( - <Page themeId="tool"> - <Content> - <p className={styles.error}>{error?.message || 'Issue type not found'}</p> - <button onClick={retry}>Retry</button> - </Content> - </Page> - ); - } - - return ( - <Page themeId="tool"> - <Header - title={`${issueType.glyph} ${issueType.name}`} - subtitle={issueType.key} - /> - <Content> - <ContentHeader title="Issue Type Details"> - {!isBuiltin && ( - <> - <LinkButton to="edit" color="primary" variant="contained"> - Edit - </LinkButton> - <button - onClick={() => setShowDeleteConfirm(true)} - disabled={deleting} - style={{ - marginLeft: '8px', - padding: '8px 16px', - backgroundColor: '#d32f2f', - color: 'white', - border: 'none', - borderRadius: '4px', - cursor: deleting ? 'not-allowed' : 'pointer', - }} - > - {deleting ? 'Deleting...' : 'Delete'} - </button> - </> - )} - {isBuiltin && ( - <Chip label="Read-only (builtin)" variant="default" size="small" /> - )} - </ContentHeader> - - {showDeleteConfirm && ( - <div - style={{ - padding: '16px', - marginBottom: '16px', - backgroundColor: '#fff3e0', - border: '1px solid #ff9800', - borderRadius: '4px', - }} - > - <p> - Are you sure you want to delete <strong>{issueType.key}</strong>? - </p> - <button - onClick={handleDelete} - style={{ - marginRight: '8px', - padding: '8px 16px', - backgroundColor: '#d32f2f', - color: 'white', - border: 'none', - borderRadius: '4px', - cursor: 'pointer', - }} - > - Confirm Delete - </button> - <button - onClick={() => setShowDeleteConfirm(false)} - style={{ - padding: '8px 16px', - backgroundColor: '#e0e0e0', - border: 'none', - borderRadius: '4px', - cursor: 'pointer', - }} - > - Cancel - </button> - </div> - )} - - <div className={styles.grid}> - <div className={styles.gridItemHalf}> - <InfoCard title="Overview"> - <p className={styles.body1}>{issueType.description}</p> - <h4 className={styles.subtitle}>Mode</h4> - <Chip - label={issueType.mode} - variant={issueType.mode === 'autonomous' ? 'primary' : 'secondary'} - size="small" - /> - <h4 className={styles.subtitleSpaced}>Source</h4> - <Chip label={issueType.source} size="small" /> - <h4 className={styles.subtitleSpaced}>Project Required</h4> - <span>{issueType.project_required ? 'Yes' : 'No'}</span> - {issueType.color && ( - <> - <h4 className={styles.subtitleSpaced}>Color</h4> - <span - style={{ - display: 'inline-block', - width: '20px', - height: '20px', - backgroundColor: issueType.color, - borderRadius: '4px', - verticalAlign: 'middle', - marginRight: '8px', - }} - /> - {issueType.color} - </> - )} - </InfoCard> - </div> - </div> - - {issueType.fields && issueType.fields.length > 0 && ( - <div style={{ marginTop: '16px' }}> - <InfoCard title="Fields"> - <Table - columns={fieldColumns} - data={issueType.fields} - options={{ search: false, paging: false }} - /> - </InfoCard> - </div> - )} - - {issueType.steps && issueType.steps.length > 0 && ( - <div style={{ marginTop: '16px' }}> - <InfoCard title="Workflow Steps"> - <Table - columns={stepColumns} - data={issueType.steps} - options={{ search: false, paging: false }} - /> - </InfoCard> - </div> - )} - </Content> - </Page> - ); -}; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeFormPage.module.css b/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeFormPage.module.css deleted file mode 100644 index 48706488..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeFormPage.module.css +++ /dev/null @@ -1,12 +0,0 @@ -.body1 { - font-size: 1rem; - line-height: 1.5; - margin-bottom: 16px; -} - -.body2 { - font-size: 0.875rem; - line-height: 1.43; - color: rgba(0, 0, 0, 0.6); - margin-top: 16px; -} diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeFormPage.tsx b/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeFormPage.tsx deleted file mode 100644 index 4c4dd79a..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypeFormPage.tsx +++ /dev/null @@ -1,717 +0,0 @@ -/** - * Issue Type Form Page - * - * Create or edit an issue type. - * Supports Simple and Advanced modes (URL-persisted). - * In create mode, defaults come from the TASK issuetype template. - */ - -import React, { useState, useEffect, useMemo } from 'react'; -import { useParams, useNavigate, useLocation } from 'react-router-dom'; -import { - Content, - ContentHeader, - Header, - Page, - InfoCard, -} from '@backstage/core-components'; -import { - Button, - ButtonGroup, - makeStyles, -} from '@material-ui/core'; -import { - useIssueType, - useCreateIssueType, - useUpdateIssueType, -} from '../hooks'; -import type { - CreateIssueTypeRequest, - CreateFieldRequest, - CreateStepRequest, - ExecutionMode, -} from '../api/types'; -import { FieldEditor, StepEditor } from './editors'; -import { Chip } from './ui'; - -const GLYPH_OPTIONS = ['*', '#', '>', '?', '!', 'A', 'S', 'I', 'X']; -const COLOR_OPTIONS = [ - 'blue', - 'cyan', - 'green', - 'yellow', - 'magenta', - 'red', -] as const; -const MODE_OPTIONS: ExecutionMode[] = ['autonomous', 'paired']; - -const useStyles = makeStyles((theme) => ({ - toggleContainer: { - marginLeft: 'auto', - }, - toggleButton: { - textTransform: 'none', - padding: '6px 16px', - }, - activeButton: { - backgroundColor: theme.palette.primary.main, - color: theme.palette.primary.contrastText, - '&:hover': { - backgroundColor: theme.palette.primary.dark, - }, - }, - headerRow: { - display: 'flex', - alignItems: 'center', - gap: theme.spacing(2), - marginBottom: theme.spacing(2), - }, - label: { - display: 'block', - marginBottom: 4, - color: theme.palette.text.primary, - }, - input: { - width: '100%', - padding: 8, - border: `1px solid ${theme.palette.divider}`, - borderRadius: 4, - backgroundColor: theme.palette.background.paper, - color: theme.palette.text.primary, - fontSize: 14, - '&:disabled': { - backgroundColor: theme.palette.action.disabledBackground, - color: theme.palette.text.secondary, - }, - }, - textarea: { - width: '100%', - padding: 8, - border: `1px solid ${theme.palette.divider}`, - borderRadius: 4, - backgroundColor: theme.palette.background.paper, - color: theme.palette.text.primary, - fontSize: 14, - resize: 'vertical', - }, - select: { - width: '100%', - padding: 8, - border: `1px solid ${theme.palette.divider}`, - borderRadius: 4, - backgroundColor: theme.palette.background.paper, - color: theme.palette.text.primary, - fontSize: 14, - }, - checkboxLabel: { - display: 'flex', - alignItems: 'center', - gap: 8, - color: theme.palette.text.primary, - }, - addButton: { - padding: '8px 16px', - backgroundColor: theme.palette.primary.main, - color: theme.palette.primary.contrastText, - border: 'none', - borderRadius: 4, - cursor: 'pointer', - '&:hover': { - backgroundColor: theme.palette.primary.dark, - }, - }, - submitButton: { - padding: '12px 24px', - backgroundColor: theme.palette.success.main, - color: theme.palette.success.contrastText, - border: 'none', - borderRadius: 4, - cursor: 'pointer', - fontSize: 16, - '&:disabled': { - cursor: 'not-allowed', - opacity: 0.6, - }, - }, - cancelButton: { - padding: '12px 24px', - backgroundColor: theme.palette.action.hover, - color: theme.palette.text.primary, - border: 'none', - borderRadius: 4, - cursor: 'pointer', - fontSize: 16, - }, - errorBox: { - padding: 16, - marginBottom: 16, - backgroundColor: theme.palette.error.light, - border: `1px solid ${theme.palette.error.main}`, - borderRadius: 4, - color: theme.palette.error.contrastText, - }, - grid: { - display: 'grid', - gridTemplateColumns: '1fr 1fr 1fr', - gap: 16, - }, - fullWidth: { - gridColumn: '1 / -1', - }, -})); - -type ViewMode = 'simple' | 'advanced'; - -/** - * URL-persisted view mode toggle. - */ -function useViewMode(): [ViewMode, (mode: ViewMode) => void] { - const location = useLocation(); - const navigate = useNavigate(); - - const viewMode = useMemo(() => { - const params = new URLSearchParams(location.search); - return params.get('mode') === 'advanced' ? 'advanced' : 'simple'; - }, [location.search]); - - const setViewMode = (mode: ViewMode) => { - const params = new URLSearchParams(location.search); - if (mode === 'advanced') { - params.set('mode', 'advanced'); - } else { - params.delete('mode'); - } - const newSearch = params.toString(); - navigate( - { - pathname: location.pathname, - search: newSearch ? `?${newSearch}` : '', - }, - { replace: true }, - ); - }; - - return [viewMode, setViewMode]; -} - -/** - * Generate KEY from name + timestamp. - * Format: {NAME}-{YYYYMMDDHHMMSS} - */ -function generateKey(name: string): string { - if (!name.trim()) {return '';} - - const prefix = name - .replace(/[^a-zA-Z]/g, '') // Remove non-letters - .toUpperCase() - .slice(0, 8); // First 8 chars - - if (!prefix) {return '';} - - const timestamp = new Date() - .toISOString() - .replace(/[-:T.Z]/g, '') // YYYYMMDDHHMMSS - .slice(0, 14); - - return `${prefix}-${timestamp}`; -} - -const createEmptyField = (): CreateFieldRequest => ({ - name: '', - description: '', - field_type: 'string', - required: false, - user_editable: true, -}); - -const createEmptyStep = (): CreateStepRequest => ({ - name: '', - prompt: '', - outputs: [], - allowed_tools: ['Read', 'Write', 'Edit', 'Glob', 'Grep', 'Bash'], - requires_review: false, - permission_mode: 'default', -}); - -export const IssueTypeFormPage = () => { - const classes = useStyles(); - const { key } = useParams<{ key?: string }>(); - const navigate = useNavigate(); - const isEditing = Boolean(key); - const [viewMode, setViewMode] = useViewMode(); - - // Hooks for loading and saving - const { issueType, loading: loadingIssueType } = useIssueType(key || ''); - const { issueType: taskTemplate, loading: loadingTask } = useIssueType('TASK'); - const { createIssueType, creating, error: createError } = useCreateIssueType(); - const { updateIssueType, updating, error: updateError } = useUpdateIssueType(); - - // Track if form has been initialized with defaults - const [formInitialized, setFormInitialized] = useState(false); - - // Form state - defaults to paired mode - const [formData, setFormData] = useState<CreateIssueTypeRequest>({ - key: '', - name: '', - description: '', - glyph: '>', - mode: 'paired', // Default to paired - project_required: true, - fields: [], - steps: [], - }); - - const [validationErrors, setValidationErrors] = useState<string[]>([]); - - // Populate form with TASK defaults when creating new - useEffect(() => { - if (!isEditing && taskTemplate && !formInitialized) { - // Get user-editable fields only - const userEditableFields = taskTemplate.fields - .filter((f) => f.user_editable !== false) - .map((f) => ({ - name: f.name, - description: f.description, - field_type: f.field_type, - required: f.required, - default: f.default, - options: f.options, - placeholder: f.placeholder, - max_length: f.max_length, - user_editable: true, - })); - - setFormData((prev) => ({ - ...prev, - fields: userEditableFields, - steps: taskTemplate.steps.map((s) => ({ - name: s.name, - display_name: s.display_name, - prompt: s.prompt, - outputs: s.outputs, - allowed_tools: s.allowed_tools, - requires_review: s.requires_review, - next_step: s.next_step, - permission_mode: s.permission_mode, - })), - })); - setFormInitialized(true); - } - }, [isEditing, taskTemplate, formInitialized]); - - // Populate form when editing - useEffect(() => { - if (isEditing && issueType) { - setFormData({ - key: issueType.key, - name: issueType.name, - description: issueType.description, - glyph: issueType.glyph, - mode: issueType.mode, - color: issueType.color, - project_required: issueType.project_required, - fields: issueType.fields.map((f) => ({ - name: f.name, - description: f.description, - field_type: f.field_type, - required: f.required, - default: f.default, - options: f.options, - placeholder: f.placeholder, - max_length: f.max_length, - user_editable: f.user_editable, - })), - steps: issueType.steps.map((s) => ({ - name: s.name, - display_name: s.display_name, - prompt: s.prompt, - outputs: s.outputs, - allowed_tools: s.allowed_tools, - requires_review: s.requires_review, - next_step: s.next_step, - on_reject: s.on_reject, - permission_mode: s.permission_mode, - })), - }); - setFormInitialized(true); - } - }, [isEditing, issueType]); - - const isBuiltin = issueType?.source === 'builtin'; - - const handleChange = ( - field: keyof CreateIssueTypeRequest, - value: string | boolean | undefined, - ) => { - setFormData((prev) => ({ ...prev, [field]: value })); - }; - - // Handle name change - auto-generate KEY in create mode - const handleNameChange = (name: string) => { - setFormData((prev) => ({ - ...prev, - name, - key: isEditing ? prev.key : generateKey(name), - })); - }; - - const handleFieldChange = (index: number, field: CreateFieldRequest) => { - setFormData((prev) => ({ - ...prev, - fields: prev.fields?.map((f, i) => (i === index ? field : f)), - })); - }; - - const handleFieldDelete = (index: number) => { - setFormData((prev) => ({ - ...prev, - fields: prev.fields?.filter((_, i) => i !== index), - })); - }; - - const handleAddField = () => { - setFormData((prev) => ({ - ...prev, - fields: [...(prev.fields || []), createEmptyField()], - })); - }; - - const handleStepChange = (index: number, step: CreateStepRequest) => { - setFormData((prev) => ({ - ...prev, - steps: prev.steps.map((s, i) => (i === index ? step : s)), - })); - }; - - const handleStepDelete = (index: number) => { - setFormData((prev) => ({ - ...prev, - steps: prev.steps.filter((_, i) => i !== index), - })); - }; - - const handleAddStep = () => { - setFormData((prev) => ({ - ...prev, - steps: [...prev.steps, createEmptyStep()], - })); - }; - - const validate = (): boolean => { - const errors: string[] = []; - - if (!formData.key) { - errors.push('Key is required - enter a name to generate it'); - } - if (!formData.name) { - errors.push('Name is required'); - } - if (!formData.description) { - errors.push('Description is required'); - } - if (!formData.glyph) { - errors.push('Glyph is required'); - } - if (formData.steps.length === 0) { - errors.push('At least one step is required'); - } - - // Validate steps - formData.steps.forEach((step, i) => { - if (!step.name || !/^[a-z_]+$/.test(step.name)) { - errors.push(`Step ${i + 1}: Name must be lowercase with underscores only`); - } - if (!step.prompt) { - errors.push(`Step ${i + 1}: Prompt is required`); - } - }); - - // Validate fields - formData.fields?.forEach((field, i) => { - if (!field.name || !/^[a-z_]+$/.test(field.name)) { - errors.push( - `Field ${i + 1}: Name must be lowercase with underscores only`, - ); - } - if (!field.description) { - errors.push(`Field ${i + 1}: Description is required`); - } - if (field.field_type === 'enum' && (!field.options || field.options.length === 0)) { - errors.push(`Field ${i + 1}: Enum fields require at least one option`); - } - // Required fields must have a non-falsey default - if (field.required && !field.default) { - errors.push(`Field ${i + 1}: Required fields must have a default value`); - } - }); - - setValidationErrors(errors); - return errors.length === 0; - }; - - const handleSubmit = async () => { - if (!validate()) { - return; - } - - try { - if (isEditing && key) { - await updateIssueType(key, { - name: formData.name, - description: formData.description, - glyph: formData.glyph, - mode: formData.mode, - color: formData.color, - project_required: formData.project_required, - fields: formData.fields, - steps: formData.steps, - }); - } else { - await createIssueType(formData); - } - navigate('..'); - } catch { - // Error is handled by the hook - } - }; - - const stepNames = formData.steps.map((s) => s.name).filter(Boolean); - const isSaving = creating || updating; - const saveError = createError || updateError; - const isLoading = (isEditing && loadingIssueType) || (!isEditing && loadingTask && !formInitialized); - - if (isLoading) { - return ( - <Page themeId="tool"> - <Content>Loading...</Content> - </Page> - ); - } - - return ( - <Page themeId="tool"> - <Header - title={isEditing ? `Edit ${key}` : 'New Issue Type'} - subtitle="Configure issue type settings" - /> - <Content> - <div className={classes.headerRow}> - <ContentHeader title={isEditing ? 'Edit Issue Type' : 'Create Issue Type'}> - {isBuiltin && ( - <Chip - label="Read-only (builtin types cannot be modified)" - variant="default" - size="small" - /> - )} - </ContentHeader> - <div className={classes.toggleContainer}> - <ButtonGroup size="small" variant="outlined"> - <Button - className={`${classes.toggleButton} ${viewMode === 'simple' ? classes.activeButton : ''}`} - onClick={() => setViewMode('simple')} - > - Simple - </Button> - <Button - className={`${classes.toggleButton} ${viewMode === 'advanced' ? classes.activeButton : ''}`} - onClick={() => setViewMode('advanced')} - > - Advanced - </Button> - </ButtonGroup> - </div> - </div> - - {validationErrors.length > 0 && ( - <div className={classes.errorBox}> - <strong>Validation Errors:</strong> - <ul style={{ margin: '8px 0 0 0', paddingLeft: '20px' }}> - {validationErrors.map((error, i) => ( - <li key={i}>{error}</li> - ))} - </ul> - </div> - )} - - {saveError && ( - <div className={classes.errorBox}> - <strong>Error:</strong> {saveError.message} - </div> - )} - - <InfoCard title="Basic Information"> - <div className={classes.grid}> - <div> - <label className={classes.label}>Name *</label> - <input - type="text" - value={formData.name} - onChange={(e) => handleNameChange(e.target.value)} - placeholder="My Custom Type" - disabled={isBuiltin} - className={classes.input} - /> - </div> - - <div> - <label className={classes.label}>Key (auto-generated)</label> - <input - type="text" - value={formData.key} - readOnly - disabled - placeholder="Generated from name" - className={classes.input} - /> - </div> - - {viewMode === 'advanced' && ( - <div> - <label className={classes.label}>Glyph *</label> - <select - value={formData.glyph} - onChange={(e) => handleChange('glyph', e.target.value)} - disabled={isBuiltin} - className={classes.select} - > - {GLYPH_OPTIONS.map((g) => ( - <option key={g} value={g}> - {g} - </option> - ))} - </select> - </div> - )} - - <div className={classes.fullWidth}> - <label className={classes.label}>Description *</label> - <textarea - value={formData.description} - onChange={(e) => handleChange('description', e.target.value)} - placeholder="Describe what this issue type is for..." - disabled={isBuiltin} - rows={2} - className={classes.textarea} - /> - </div> - - {viewMode === 'advanced' && ( - <> - <div> - <label className={classes.label}>Mode</label> - <select - value={formData.mode || 'paired'} - onChange={(e) => - handleChange('mode', e.target.value as ExecutionMode) - } - disabled={isBuiltin} - className={classes.select} - > - {MODE_OPTIONS.map((m) => ( - <option key={m} value={m}> - {m} - </option> - ))} - </select> - </div> - - <div> - <label className={classes.label}>Color</label> - <select - value={formData.color || ''} - onChange={(e) => - handleChange('color', e.target.value || undefined) - } - disabled={isBuiltin} - className={classes.select} - > - <option value="">None</option> - {COLOR_OPTIONS.map((c) => ( - <option key={c} value={c}> - {c} - </option> - ))} - </select> - </div> - - <div> - <label className={classes.checkboxLabel}> - <input - type="checkbox" - checked={formData.project_required !== false} - onChange={(e) => - handleChange('project_required', e.target.checked) - } - disabled={isBuiltin} - /> - Project Required - </label> - </div> - </> - )} - </div> - </InfoCard> - - <div style={{ marginTop: '16px' }}> - <InfoCard title="Fields"> - {formData.fields?.map((field, index) => ( - <FieldEditor - key={index} - field={field} - onChange={(f) => handleFieldChange(index, f)} - onDelete={() => handleFieldDelete(index)} - index={index} - showAdvanced={viewMode === 'advanced'} - /> - ))} - {!isBuiltin && ( - <button onClick={handleAddField} className={classes.addButton}> - + Add Field - </button> - )} - </InfoCard> - </div> - - <div style={{ marginTop: '16px' }}> - <InfoCard title="Workflow Steps"> - {formData.steps.map((step, index) => ( - <StepEditor - key={index} - step={step} - onChange={(s) => handleStepChange(index, s)} - onDelete={() => handleStepDelete(index)} - index={index} - stepNames={stepNames} - /> - ))} - {!isBuiltin && ( - <button onClick={handleAddStep} className={classes.addButton}> - + Add Step - </button> - )} - </InfoCard> - </div> - - <div style={{ marginTop: '24px', display: 'flex', gap: '16px' }}> - {!isBuiltin && ( - <button - onClick={handleSubmit} - disabled={isSaving} - className={classes.submitButton} - > - {isSaving - ? 'Saving...' - : isEditing - ? 'Update Issue Type' - : 'Create Issue Type'} - </button> - )} - <button onClick={() => navigate('..')} className={classes.cancelButton}> - Cancel - </button> - </div> - </Content> - </Page> - ); -}; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypesPage.tsx b/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypesPage.tsx deleted file mode 100644 index bd5a30d0..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/IssueTypesPage.tsx +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Issue Types List Page - * - * Displays all available issue types from the Operator REST API. - */ - -import React from 'react'; -import { Link as RouterLink } from 'react-router-dom'; -import { - Content, - ContentHeader, - Header, - HeaderLabel, - Page, - Table, - TableColumn, - LinkButton, -} from '@backstage/core-components'; -import { useIssueTypes } from '../hooks'; -import type { IssueTypeSummary } from '../api/types'; -import { Chip } from './ui'; - -const columns: TableColumn<IssueTypeSummary>[] = [ - { - title: 'Glyph', - field: 'glyph', - width: '60px', - render: (row) => ( - <span style={{ fontFamily: 'monospace', fontSize: '1.2em' }}> - {row.glyph} - </span> - ), - }, - { - title: 'Key', - field: 'key', - render: (row) => ( - <RouterLink - to={row.key} - style={{ textDecoration: 'none', color: 'inherit', fontWeight: 'bold' }} - > - {row.key} - </RouterLink> - ), - }, - { title: 'Name', field: 'name' }, - { - title: 'Mode', - field: 'mode', - render: (row) => ( - <Chip - label={row.mode} - variant={row.mode === 'autonomous' ? 'primary' : 'secondary'} - size="small" - /> - ), - }, - { - title: 'Source', - field: 'source', - render: (row) => ( - <Chip - label={row.source} - variant={row.source === 'builtin' ? 'default' : 'primary'} - size="small" - /> - ), - }, - { title: 'Steps', field: 'step_count', width: '80px' }, -]; - -export const IssueTypesPage = () => { - const { issueTypes, loading, error, retry } = useIssueTypes(); - - return ( - <Page themeId="tool"> - <Header - title="Issue Types" - subtitle="Manage Operator issue types and workflows" - data-testid="issuetypes-page-banner" - > - <HeaderLabel label="Source" value="Operator REST API" /> - </Header> - <Content> - <ContentHeader title="All Issue Types"> - <LinkButton to="new" color="primary" variant="contained"> - Create Issue Type - </LinkButton> - <LinkButton - to="collections" - color="default" - variant="outlined" - style={{ marginLeft: '8px' }} - > - Collections - </LinkButton> - </ContentHeader> - {error ? ( - <div style={{ color: 'red', padding: '16px' }}> - <p>Error: {error.message}</p> - <button onClick={retry}>Retry</button> - </div> - ) : ( - <Table - title="Issue Types" - columns={columns} - data={issueTypes || []} - isLoading={loading} - options={{ - search: true, - paging: true, - pageSize: 10, - }} - /> - )} - </Content> - </Page> - ); -}; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/editors/FieldEditor.tsx b/backstage-server/packages/plugins/plugin-issuetypes/src/components/editors/FieldEditor.tsx deleted file mode 100644 index d06da750..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/editors/FieldEditor.tsx +++ /dev/null @@ -1,258 +0,0 @@ -/** - * Field Editor Component - * - * Form for editing a single field within an issue type. - * Uses theme-aware styling for dark mode support. - */ - -import React from 'react'; -import { makeStyles } from '@material-ui/core'; -import type { CreateFieldRequest, FieldType } from '../../api/types'; - -const FIELD_TYPES: FieldType[] = ['string', 'text', 'enum', 'bool', 'date']; - -const useStyles = makeStyles((theme) => ({ - container: { - border: `1px solid ${theme.palette.divider}`, - borderRadius: 8, - padding: 16, - marginBottom: 16, - backgroundColor: theme.palette.background.default, - }, - header: { - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 16, - }, - title: { - margin: 0, - color: theme.palette.text.primary, - }, - removeButton: { - padding: '4px 12px', - backgroundColor: theme.palette.error.main, - color: theme.palette.error.contrastText, - border: 'none', - borderRadius: 4, - cursor: 'pointer', - '&:hover': { - backgroundColor: theme.palette.error.dark, - }, - }, - grid: { - display: 'grid', - gridTemplateColumns: '1fr 1fr', - gap: 16, - }, - fullWidth: { - gridColumn: '1 / -1', - }, - label: { - display: 'block', - marginBottom: 4, - color: theme.palette.text.primary, - }, - checkboxLabel: { - display: 'flex', - alignItems: 'center', - gap: 8, - color: theme.palette.text.primary, - cursor: 'pointer', - }, - input: { - width: '100%', - padding: 8, - border: `1px solid ${theme.palette.divider}`, - borderRadius: 4, - backgroundColor: theme.palette.background.paper, - color: theme.palette.text.primary, - fontSize: 14, - '&::placeholder': { - color: theme.palette.text.secondary, - opacity: 0.7, - }, - '&:focus': { - outline: 'none', - borderColor: theme.palette.primary.main, - }, - }, - select: { - width: '100%', - padding: 8, - border: `1px solid ${theme.palette.divider}`, - borderRadius: 4, - backgroundColor: theme.palette.background.paper, - color: theme.palette.text.primary, - fontSize: 14, - '&:focus': { - outline: 'none', - borderColor: theme.palette.primary.main, - }, - }, -})); - -export interface FieldEditorProps { - field: CreateFieldRequest; - onChange: (field: CreateFieldRequest) => void; - onDelete: () => void; - index: number; - /** Whether to show advanced options like user_editable */ - showAdvanced?: boolean; -} - -export const FieldEditor: React.FC<FieldEditorProps> = ({ - field, - onChange, - onDelete, - index, - showAdvanced = true, -}) => { - const classes = useStyles(); - - const handleChange = ( - key: keyof CreateFieldRequest, - value: string | boolean | string[] | number | undefined, - ) => { - onChange({ ...field, [key]: value }); - }; - - const handleOptionsChange = (optionsStr: string) => { - const options = optionsStr - .split(',') - .map((o) => o.trim()) - .filter(Boolean); - handleChange('options', options); - }; - - return ( - <div className={classes.container}> - <div className={classes.header}> - <h4 className={classes.title}>Field {index + 1}</h4> - <button onClick={onDelete} className={classes.removeButton}> - Remove - </button> - </div> - - <div className={classes.grid}> - <div> - <label className={classes.label}>Name *</label> - <input - type="text" - value={field.name} - onChange={(e) => handleChange('name', e.target.value)} - placeholder="field_name" - pattern="^[a-z_]+$" - className={classes.input} - /> - </div> - - <div> - <label className={classes.label}>Type</label> - <select - value={field.field_type || 'string'} - onChange={(e) => handleChange('field_type', e.target.value as FieldType)} - className={classes.select} - > - {FIELD_TYPES.map((type) => ( - <option key={type} value={type}> - {type} - </option> - ))} - </select> - </div> - - <div className={classes.fullWidth}> - <label className={classes.label}>Description *</label> - <input - type="text" - value={field.description} - onChange={(e) => handleChange('description', e.target.value)} - placeholder="Description of this field" - className={classes.input} - /> - </div> - - <div> - <label className={classes.checkboxLabel}> - <input - type="checkbox" - checked={field.required || false} - onChange={(e) => handleChange('required', e.target.checked)} - /> - Required - </label> - </div> - - {showAdvanced && ( - <div> - <label className={classes.checkboxLabel}> - <input - type="checkbox" - checked={field.user_editable !== false} - onChange={(e) => handleChange('user_editable', e.target.checked)} - /> - User Editable - </label> - </div> - )} - - <div> - <label className={classes.label}>Default Value</label> - <input - type="text" - value={field.default || ''} - onChange={(e) => handleChange('default', e.target.value || undefined)} - placeholder="Default value" - className={classes.input} - /> - </div> - - <div> - <label className={classes.label}>Placeholder</label> - <input - type="text" - value={field.placeholder || ''} - onChange={(e) => - handleChange('placeholder', e.target.value || undefined) - } - placeholder="Placeholder text" - className={classes.input} - /> - </div> - - {field.field_type === 'enum' && ( - <div className={classes.fullWidth}> - <label className={classes.label}>Options (comma-separated) *</label> - <input - type="text" - value={(field.options || []).join(', ')} - onChange={(e) => handleOptionsChange(e.target.value)} - placeholder="option1, option2, option3" - className={classes.input} - /> - </div> - )} - - {(field.field_type === 'string' || field.field_type === 'text') && ( - <div> - <label className={classes.label}>Max Length</label> - <input - type="number" - value={field.max_length || ''} - onChange={(e) => - handleChange( - 'max_length', - e.target.value ? parseInt(e.target.value, 10) : undefined, - ) - } - placeholder="No limit" - min={1} - className={classes.input} - /> - </div> - )} - </div> - </div> - ); -}; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/editors/StepEditor.tsx b/backstage-server/packages/plugins/plugin-issuetypes/src/components/editors/StepEditor.tsx deleted file mode 100644 index c2d499a9..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/editors/StepEditor.tsx +++ /dev/null @@ -1,379 +0,0 @@ -/** - * Step Editor Component - * - * Form for editing a single workflow step within an issue type. - * Uses theme-aware styling for dark mode support. - */ - -import React from 'react'; -import { makeStyles, alpha } from '@material-ui/core'; -import type { - CreateStepRequest, - StepOutput, - PermissionMode, -} from '../../api/types'; -import { STEP_OUTPUTS, ALLOWED_TOOLS } from '../../api/types'; - -const PERMISSION_MODES: PermissionMode[] = [ - 'default', - 'plan', - 'acceptEdits', - 'delegate', -]; - -const useStyles = makeStyles((theme) => ({ - container: { - border: `1px solid ${theme.palette.divider}`, - borderRadius: 8, - padding: 16, - marginBottom: 16, - backgroundColor: theme.palette.background.default, - }, - header: { - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - marginBottom: 16, - }, - title: { - margin: 0, - color: theme.palette.text.primary, - }, - removeButton: { - padding: '4px 12px', - backgroundColor: theme.palette.error.main, - color: theme.palette.error.contrastText, - border: 'none', - borderRadius: 4, - cursor: 'pointer', - '&:hover': { - backgroundColor: theme.palette.error.dark, - }, - }, - grid: { - display: 'grid', - gridTemplateColumns: '1fr 1fr', - gap: 16, - }, - fullWidth: { - gridColumn: '1 / -1', - }, - label: { - display: 'block', - marginBottom: 4, - color: theme.palette.text.primary, - }, - sectionLabel: { - display: 'block', - marginBottom: 8, - color: theme.palette.text.primary, - }, - checkboxLabel: { - display: 'flex', - alignItems: 'center', - gap: 8, - color: theme.palette.text.primary, - cursor: 'pointer', - }, - helperText: { - color: theme.palette.text.secondary, - display: 'block', - marginTop: 4, - fontSize: '0.75rem', - }, - input: { - width: '100%', - padding: 8, - border: `1px solid ${theme.palette.divider}`, - borderRadius: 4, - backgroundColor: theme.palette.background.paper, - color: theme.palette.text.primary, - fontSize: 14, - '&::placeholder': { - color: theme.palette.text.secondary, - opacity: 0.7, - }, - '&:focus': { - outline: 'none', - borderColor: theme.palette.primary.main, - }, - }, - textarea: { - width: '100%', - padding: 8, - border: `1px solid ${theme.palette.divider}`, - borderRadius: 4, - backgroundColor: theme.palette.background.paper, - color: theme.palette.text.primary, - fontSize: 14, - fontFamily: 'monospace', - resize: 'vertical', - '&::placeholder': { - color: theme.palette.text.secondary, - opacity: 0.7, - }, - '&:focus': { - outline: 'none', - borderColor: theme.palette.primary.main, - }, - }, - select: { - width: '100%', - padding: 8, - border: `1px solid ${theme.palette.divider}`, - borderRadius: 4, - backgroundColor: theme.palette.background.paper, - color: theme.palette.text.primary, - fontSize: 14, - '&:focus': { - outline: 'none', - borderColor: theme.palette.primary.main, - }, - }, - chipContainer: { - display: 'flex', - flexWrap: 'wrap', - gap: 8, - }, - chip: { - display: 'flex', - alignItems: 'center', - gap: 4, - padding: '4px 8px', - borderRadius: 4, - cursor: 'pointer', - color: theme.palette.text.primary, - transition: 'background-color 0.15s ease', - }, - chipUnselected: { - backgroundColor: theme.palette.action.hover, - }, - outputChipSelected: { - backgroundColor: alpha(theme.palette.primary.main, 0.15), - }, - toolChipSelected: { - backgroundColor: alpha(theme.palette.success.main, 0.15), - }, -})); - -export interface StepEditorProps { - step: CreateStepRequest; - onChange: (step: CreateStepRequest) => void; - onDelete: () => void; - index: number; - stepNames: string[]; // All step names for next_step dropdown -} - -export const StepEditor: React.FC<StepEditorProps> = ({ - step, - onChange, - onDelete, - index, - stepNames, -}) => { - const classes = useStyles(); - - const handleChange = <K extends keyof CreateStepRequest>( - key: K, - value: CreateStepRequest[K], - ) => { - onChange({ ...step, [key]: value }); - }; - - const handleOutputToggle = (output: StepOutput) => { - const current = step.outputs || []; - const newOutputs = current.includes(output) - ? current.filter((o) => o !== output) - : [...current, output]; - handleChange('outputs', newOutputs as StepOutput[]); - }; - - const handleToolToggle = (tool: string) => { - const current = step.allowed_tools || []; - const newTools = current.includes(tool) - ? current.filter((t) => t !== tool) - : [...current, tool]; - handleChange('allowed_tools', newTools); - }; - - // Filter out current step from next_step options - const availableNextSteps = stepNames.filter((name) => name !== step.name); - - return ( - <div className={classes.container}> - <div className={classes.header}> - <h4 className={classes.title}> - Step {index + 1} - {step.name && `: ${step.name}`} - </h4> - <button onClick={onDelete} className={classes.removeButton}> - Remove - </button> - </div> - - <div className={classes.grid}> - <div> - <label className={classes.label}>Name *</label> - <input - type="text" - value={step.name} - onChange={(e) => handleChange('name', e.target.value)} - placeholder="step_name" - pattern="^[a-z_]+$" - className={classes.input} - /> - </div> - - <div> - <label className={classes.label}>Display Name</label> - <input - type="text" - value={step.display_name || ''} - onChange={(e) => - handleChange('display_name', e.target.value || undefined) - } - placeholder="Human-readable name" - className={classes.input} - /> - </div> - - <div className={classes.fullWidth}> - <label className={classes.label}>Prompt *</label> - <textarea - value={step.prompt} - onChange={(e) => handleChange('prompt', e.target.value)} - placeholder="Instructions for the agent..." - rows={4} - className={classes.textarea} - /> - <small className={classes.helperText}> - Supports Handlebars templates: {'{{ id }}'}, {'{{ project }}'},{' '} - {'{{ summary }}'} - </small> - </div> - - <div> - <label className={classes.label}>Permission Mode</label> - <select - value={step.permission_mode || 'default'} - onChange={(e) => - handleChange('permission_mode', e.target.value as PermissionMode) - } - className={classes.select} - > - {PERMISSION_MODES.map((mode) => ( - <option key={mode} value={mode}> - {mode} - </option> - ))} - </select> - </div> - - <div> - <label className={classes.label}>Next Step</label> - <select - value={step.next_step || ''} - onChange={(e) => - handleChange('next_step', e.target.value || undefined) - } - className={classes.select} - > - <option value="">(End of workflow)</option> - {availableNextSteps.map((name) => ( - <option key={name} value={name}> - {name} - </option> - ))} - </select> - </div> - - <div> - <label className={classes.checkboxLabel}> - <input - type="checkbox" - checked={step.requires_review || false} - onChange={(e) => handleChange('requires_review', e.target.checked)} - /> - Requires Review - </label> - <small className={classes.helperText}> - Pause workflow for human approval - </small> - </div> - - {step.requires_review && ( - <div> - <label className={classes.label}>On Reject (go to step)</label> - <select - value={step.on_reject?.goto_step || ''} - onChange={(e) => - handleChange( - 'on_reject', - e.target.value - ? { goto_step: e.target.value } - : undefined, - ) - } - className={classes.select} - > - <option value="">(End workflow on reject)</option> - {stepNames.map((name) => ( - <option key={name} value={name}> - {name} - </option> - ))} - </select> - </div> - )} - - <div className={classes.fullWidth}> - <label className={classes.sectionLabel}>Outputs</label> - <div className={classes.chipContainer}> - {STEP_OUTPUTS.map((output) => { - const isSelected = (step.outputs || []).includes(output); - return ( - <label - key={output} - className={`${classes.chip} ${ - isSelected ? classes.outputChipSelected : classes.chipUnselected - }`} - > - <input - type="checkbox" - checked={isSelected} - onChange={() => handleOutputToggle(output)} - /> - {output} - </label> - ); - })} - </div> - </div> - - <div className={classes.fullWidth}> - <label className={classes.sectionLabel}>Allowed Tools</label> - <div className={classes.chipContainer}> - {ALLOWED_TOOLS.map((tool) => { - const isSelected = (step.allowed_tools || []).includes(tool); - return ( - <label - key={tool} - className={`${classes.chip} ${ - isSelected ? classes.toolChipSelected : classes.chipUnselected - }`} - > - <input - type="checkbox" - checked={isSelected} - onChange={() => handleToolToggle(tool)} - /> - {tool} - </label> - ); - })} - </div> - </div> - </div> - </div> - ); -}; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/editors/index.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/components/editors/index.ts deleted file mode 100644 index 6257bb28..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/editors/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Editor components exports. - */ - -export { FieldEditor } from './FieldEditor'; -export type { FieldEditorProps } from './FieldEditor'; - -export { StepEditor } from './StepEditor'; -export type { StepEditorProps } from './StepEditor'; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/ui/Chip.module.css b/backstage-server/packages/plugins/plugin-issuetypes/src/components/ui/Chip.module.css deleted file mode 100644 index 131772d3..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/ui/Chip.module.css +++ /dev/null @@ -1,30 +0,0 @@ -.chip { - display: inline-flex; - align-items: center; - padding: 4px 12px; - border-radius: 16px; - font-size: 0.8125rem; - font-weight: 500; - line-height: 1.4; - white-space: nowrap; -} - -.default { - background-color: #e0e0e0; - color: rgba(0, 0, 0, 0.87); -} - -.primary { - background-color: #1976d2; - color: #fff; -} - -.secondary { - background-color: #dc004e; - color: #fff; -} - -.small { - padding: 2px 8px; - font-size: 0.75rem; -} diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/ui/Chip.tsx b/backstage-server/packages/plugins/plugin-issuetypes/src/components/ui/Chip.tsx deleted file mode 100644 index fd2aec79..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/ui/Chip.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; -import styles from './Chip.module.css'; - -export interface ChipProps { - label: string; - variant?: 'default' | 'primary' | 'secondary'; - size?: 'small' | 'medium'; - style?: React.CSSProperties; -} - -export const Chip: React.FC<ChipProps> = ({ - label, - variant = 'default', - size = 'medium', - style, -}) => { - const classNames = [ - styles.chip, - styles[variant], - size === 'small' ? styles.small : '', - ] - .filter(Boolean) - .join(' '); - - return ( - <span className={classNames} style={style}> - {label} - </span> - ); -}; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/components/ui/index.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/components/ui/index.ts deleted file mode 100644 index cbdcf055..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/components/ui/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { Chip } from './Chip'; -export type { ChipProps } from './Chip'; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/index.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/index.ts deleted file mode 100644 index db64516f..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Hooks module exports. - */ - -export { - useIssueTypes, - useIssueType, - useCreateIssueType, - useUpdateIssueType, - useDeleteIssueType, -} from './useIssueTypes'; - -export { - useCollections, - useActiveCollection, - useActivateCollection, -} from './useCollections'; - -export { useSteps, useStep, useUpdateStep } from './useSteps'; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/useCollections.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/useCollections.ts deleted file mode 100644 index 94bacec3..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/useCollections.ts +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Hooks for fetching and managing collections. - */ -import { useState, useEffect, useCallback } from 'react'; -import { useApi } from '@backstage/core-plugin-api'; -import { operatorApiRef } from '../api'; -import type { CollectionResponse } from '../api/types'; - -/** Hook to fetch the list of all collections */ -export function useCollections() { - const api = useApi(operatorApiRef); - const [collections, setCollections] = useState<CollectionResponse[]>(); - const [loading, setLoading] = useState(true); - const [error, setError] = useState<Error>(); - - const load = useCallback(async () => { - setLoading(true); - setError(undefined); - try { - const data = await api.listCollections(); - setCollections(data); - } catch (err) { - setError(err instanceof Error ? err : new Error(String(err))); - } finally { - setLoading(false); - } - }, [api]); - - useEffect(() => { - load(); - }, [load]); - - return { - collections, - loading, - error, - retry: load, - }; -} - -/** Hook to fetch the active collection */ -export function useActiveCollection() { - const api = useApi(operatorApiRef); - const [collection, setCollection] = useState<CollectionResponse>(); - const [loading, setLoading] = useState(true); - const [error, setError] = useState<Error>(); - - const load = useCallback(async () => { - setLoading(true); - setError(undefined); - try { - const data = await api.getActiveCollection(); - setCollection(data); - } catch (err) { - setError(err instanceof Error ? err : new Error(String(err))); - } finally { - setLoading(false); - } - }, [api]); - - useEffect(() => { - load(); - }, [load]); - - return { - collection, - loading, - error, - retry: load, - }; -} - -/** Hook to activate a collection */ -export function useActivateCollection() { - const api = useApi(operatorApiRef); - const [activating, setActivating] = useState(false); - const [error, setError] = useState<Error>(); - const [activatedCollection, setActivatedCollection] = - useState<CollectionResponse>(); - - const activateCollection = useCallback( - async (name: string) => { - setActivating(true); - setError(undefined); - try { - const result = await api.activateCollection(name); - setActivatedCollection(result); - return result; - } catch (err) { - const error = err instanceof Error ? err : new Error(String(err)); - setError(error); - throw error; - } finally { - setActivating(false); - } - }, - [api], - ); - - return { - activateCollection, - activating, - error, - activatedCollection, - }; -} diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/useIssueTypes.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/useIssueTypes.ts deleted file mode 100644 index 2c2bb894..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/useIssueTypes.ts +++ /dev/null @@ -1,178 +0,0 @@ -/** - * Hooks for fetching and managing issue types. - */ -import { useState, useEffect, useCallback } from 'react'; -import { useApi } from '@backstage/core-plugin-api'; -import { operatorApiRef } from '../api'; -import type { - IssueTypeSummary, - IssueTypeResponse, - CreateIssueTypeRequest, - UpdateIssueTypeRequest, -} from '../api/types'; - -/** Hook to fetch the list of all issue types */ -export function useIssueTypes() { - const api = useApi(operatorApiRef); - const [issueTypes, setIssueTypes] = useState<IssueTypeSummary[]>(); - const [loading, setLoading] = useState(true); - const [error, setError] = useState<Error>(); - - const load = useCallback(async () => { - setLoading(true); - setError(undefined); - try { - const data = await api.listIssueTypes(); - setIssueTypes(data); - } catch (err) { - setError(err instanceof Error ? err : new Error(String(err))); - } finally { - setLoading(false); - } - }, [api]); - - useEffect(() => { - load(); - }, [load]); - - return { - issueTypes, - loading, - error, - retry: load, - }; -} - -/** Hook to fetch a single issue type by key */ -export function useIssueType(key: string) { - const api = useApi(operatorApiRef); - const [issueType, setIssueType] = useState<IssueTypeResponse>(); - const [loading, setLoading] = useState(true); - const [error, setError] = useState<Error>(); - - const load = useCallback(async () => { - setLoading(true); - setError(undefined); - try { - const data = await api.getIssueType(key); - setIssueType(data); - } catch (err) { - setError(err instanceof Error ? err : new Error(String(err))); - } finally { - setLoading(false); - } - }, [api, key]); - - useEffect(() => { - load(); - }, [load]); - - return { - issueType, - loading, - error, - retry: load, - }; -} - -/** Hook to create a new issue type */ -export function useCreateIssueType() { - const api = useApi(operatorApiRef); - const [creating, setCreating] = useState(false); - const [error, setError] = useState<Error>(); - const [createdIssueType, setCreatedIssueType] = useState<IssueTypeResponse>(); - - const createIssueType = useCallback( - async (request: CreateIssueTypeRequest) => { - setCreating(true); - setError(undefined); - try { - const result = await api.createIssueType(request); - setCreatedIssueType(result); - return result; - } catch (err) { - const error = err instanceof Error ? err : new Error(String(err)); - setError(error); - throw error; - } finally { - setCreating(false); - } - }, - [api], - ); - - return { - createIssueType, - creating, - error, - createdIssueType, - }; -} - -/** Hook to update an existing issue type */ -export function useUpdateIssueType() { - const api = useApi(operatorApiRef); - const [updating, setUpdating] = useState(false); - const [error, setError] = useState<Error>(); - const [updatedIssueType, setUpdatedIssueType] = useState<IssueTypeResponse>(); - - const updateIssueType = useCallback( - async (key: string, request: UpdateIssueTypeRequest) => { - setUpdating(true); - setError(undefined); - try { - const result = await api.updateIssueType(key, request); - setUpdatedIssueType(result); - return result; - } catch (err) { - const error = err instanceof Error ? err : new Error(String(err)); - setError(error); - throw error; - } finally { - setUpdating(false); - } - }, - [api], - ); - - return { - updateIssueType, - updating, - error, - updatedIssueType, - }; -} - -/** Hook to delete an issue type */ -export function useDeleteIssueType() { - const api = useApi(operatorApiRef); - const [deleting, setDeleting] = useState(false); - const [error, setError] = useState<Error>(); - const [deletedKey, setDeletedKey] = useState<string>(); - - const deleteIssueType = useCallback( - async (key: string) => { - setDeleting(true); - setError(undefined); - try { - await api.deleteIssueType(key); - setDeletedKey(key); - return key; - } catch (err) { - const error = err instanceof Error ? err : new Error(String(err)); - setError(error); - throw error; - } finally { - setDeleting(false); - } - }, - [api], - ); - - return { - deleteIssueType, - deleting, - error, - deletedKey, - }; -} diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/useSteps.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/useSteps.ts deleted file mode 100644 index b9b24e62..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/hooks/useSteps.ts +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Hooks for fetching and managing steps. - */ -import { useState, useEffect, useCallback } from 'react'; -import { useApi } from '@backstage/core-plugin-api'; -import { operatorApiRef } from '../api'; -import type { StepResponse, UpdateStepRequest } from '../api/types'; - -/** Hook to fetch steps for an issue type */ -export function useSteps(issueTypeKey: string) { - const api = useApi(operatorApiRef); - const [steps, setSteps] = useState<StepResponse[]>(); - const [loading, setLoading] = useState(true); - const [error, setError] = useState<Error>(); - - const load = useCallback(async () => { - setLoading(true); - setError(undefined); - try { - const data = await api.getSteps(issueTypeKey); - setSteps(data); - } catch (err) { - setError(err instanceof Error ? err : new Error(String(err))); - } finally { - setLoading(false); - } - }, [api, issueTypeKey]); - - useEffect(() => { - load(); - }, [load]); - - return { - steps, - loading, - error, - retry: load, - }; -} - -/** Hook to fetch a single step */ -export function useStep(issueTypeKey: string, stepName: string) { - const api = useApi(operatorApiRef); - const [step, setStep] = useState<StepResponse>(); - const [loading, setLoading] = useState(true); - const [error, setError] = useState<Error>(); - - const load = useCallback(async () => { - setLoading(true); - setError(undefined); - try { - const data = await api.getStep(issueTypeKey, stepName); - setStep(data); - } catch (err) { - setError(err instanceof Error ? err : new Error(String(err))); - } finally { - setLoading(false); - } - }, [api, issueTypeKey, stepName]); - - useEffect(() => { - load(); - }, [load]); - - return { - step, - loading, - error, - retry: load, - }; -} - -/** Hook to update a step */ -export function useUpdateStep() { - const api = useApi(operatorApiRef); - const [updating, setUpdating] = useState(false); - const [error, setError] = useState<Error>(); - const [updatedStep, setUpdatedStep] = useState<StepResponse>(); - - const updateStep = useCallback( - async ( - issueTypeKey: string, - stepName: string, - request: UpdateStepRequest, - ) => { - setUpdating(true); - setError(undefined); - try { - const result = await api.updateStep(issueTypeKey, stepName, request); - setUpdatedStep(result); - return result; - } catch (err) { - const error = err instanceof Error ? err : new Error(String(err)); - setError(error); - throw error; - } finally { - setUpdating(false); - } - }, - [api], - ); - - return { - updateStep, - updating, - error, - updatedStep, - }; -} diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/index.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/index.ts deleted file mode 100644 index a8ae7a91..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @operator/plugin-issuetypes - * - * Backstage plugin for managing Operator issue types and collections. - */ - -export { - issueTypesPlugin, - IssueTypesPage, - IssueTypeDetailPage, - IssueTypeFormPage, - CollectionsPage, - rootRouteRef, - detailRouteRef, - formRouteRef, - collectionsRouteRef, -} from './plugin'; - -// API exports -export { operatorApiRef } from './api'; -export type { OperatorApi } from './api'; -export * from './api/types'; - -// Hooks exports -export * from './hooks'; diff --git a/backstage-server/packages/plugins/plugin-issuetypes/src/plugin.ts b/backstage-server/packages/plugins/plugin-issuetypes/src/plugin.ts deleted file mode 100644 index cc8f2c2d..00000000 --- a/backstage-server/packages/plugins/plugin-issuetypes/src/plugin.ts +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Operator Issue Types Plugin - * - * Backstage plugin for managing issue types and collections. - */ - -import { - createPlugin, - createRoutableExtension, - createRouteRef, - createApiFactory, - discoveryApiRef, - fetchApiRef, -} from '@backstage/core-plugin-api'; -import { operatorApiRef, OperatorApiClient } from './api'; - -// Route references -export const rootRouteRef = createRouteRef({ - id: 'issuetypes', -}); - -export const detailRouteRef = createRouteRef({ - id: 'issuetypes:detail', - params: ['key'], -}); - -export const formRouteRef = createRouteRef({ - id: 'issuetypes:form', - params: ['key'], -}); - -export const collectionsRouteRef = createRouteRef({ - id: 'issuetypes:collections', -}); - -// Plugin definition -export const issueTypesPlugin = createPlugin({ - id: 'issuetypes', - routes: { - root: rootRouteRef, - detail: detailRouteRef, - form: formRouteRef, - collections: collectionsRouteRef, - }, - apis: [ - createApiFactory({ - api: operatorApiRef, - deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef }, - factory: ({ discoveryApi, fetchApi }) => - new OperatorApiClient({ discoveryApi, fetchApi }), - }), - ], -}); - -// Routable extensions -export const IssueTypesPage = issueTypesPlugin.provide( - createRoutableExtension({ - name: 'IssueTypesPage', - component: () => - import('./components/IssueTypesPage').then((m) => m.IssueTypesPage), - mountPoint: rootRouteRef, - }), -); - -export const IssueTypeDetailPage = issueTypesPlugin.provide( - createRoutableExtension({ - name: 'IssueTypeDetailPage', - component: () => - import('./components/IssueTypeDetailPage').then( - (m) => m.IssueTypeDetailPage, - ), - mountPoint: detailRouteRef, - }), -); - -export const IssueTypeFormPage = issueTypesPlugin.provide( - createRoutableExtension({ - name: 'IssueTypeFormPage', - component: () => - import('./components/IssueTypeFormPage').then((m) => m.IssueTypeFormPage), - mountPoint: formRouteRef, - }), -); - -export const CollectionsPage = issueTypesPlugin.provide( - createRoutableExtension({ - name: 'CollectionsPage', - component: () => - import('./components/CollectionsPage').then((m) => m.CollectionsPage), - mountPoint: collectionsRouteRef, - }), -); diff --git a/backstage-server/playwright.config.ts b/backstage-server/playwright.config.ts deleted file mode 100644 index d06063cc..00000000 --- a/backstage-server/playwright.config.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { defineConfig, devices } from '@playwright/test'; - -/** - * Playwright configuration for Backstage Server E2E tests - * - * Starts the backstage server before running tests and verifies - * key pages load with expected data-testid attributes. - * - * Note: Backstage guest auth uses in-memory state, so each test - * handles login via the gotoWithAuth() helper in auth.ts. - */ -export default defineConfig({ - testDir: './e2e', - fullyParallel: true, - forbidOnly: !!process.env.CI, - retries: process.env.CI ? 2 : 0, - workers: process.env.CI ? 1 : undefined, - reporter: 'html', - - use: { - baseURL: 'http://localhost:7007', - trace: 'on-first-retry', - }, - - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - ], - - // Start the Backstage server before running tests - // In CI, use the compiled binary; locally, run from source - webServer: { - command: process.env.USE_BINARY === 'true' - ? './dist/backstage-server' - : 'bun run start', - url: 'http://localhost:7007/health', - reuseExistingServer: !process.env.CI, - timeout: 120000, // 2 minutes to start - }, -}); diff --git a/backstage-server/scripts/generate-embeds.ts b/backstage-server/scripts/generate-embeds.ts deleted file mode 100644 index d39b8ed4..00000000 --- a/backstage-server/scripts/generate-embeds.ts +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Generate Embedded Assets - * - * This script: - * 1. Scans packages/app/dist/ for built frontend files - * 2. Copies them to src/assets/ (for Bun to embed) - * 3. Generates src/embedded-assets.ts with import statements - * - * Run with: bun run scripts/generate-embeds.ts - */ - -import { readdir, mkdir, rm, copyFile, writeFile, readFile } from "node:fs/promises"; -import { join, relative } from "node:path"; - -const DIST_DIR = "packages/app/dist"; -const ASSETS_DIR = "src/assets"; -const OUTPUT_FILE = "src/embedded-assets.ts"; - -// File extensions to exclude (source maps increase binary size) -const EXCLUDE_EXTENSIONS = [".map"]; - -/** - * Copy file with retry logic for Windows file locking issues. - * On Windows, EPERM errors can occur when files are temporarily locked. - * This function retries with exponential backoff and falls back to read+write. - */ -async function copyFileWithRetry( - src: string, - dest: string, - maxRetries = 3 -): Promise<void> { - for (let attempt = 1; attempt <= maxRetries; attempt++) { - try { - await copyFile(src, dest); - return; - } catch (err: unknown) { - const error = err as NodeJS.ErrnoException; - // On Windows, EPERM can occur if file is temporarily locked - if (error.code === "EPERM" && attempt < maxRetries) { - console.warn( - `Retry ${attempt}/${maxRetries} for ${src}: ${error.code}` - ); - await new Promise((resolve) => setTimeout(resolve, 100 * attempt)); - continue; - } - // Fallback: read source and write to destination - // This handles Windows dotfile issues where copyFile fails with EPERM - if (error.code === "EPERM") { - console.warn(`Using read+write fallback for ${src}`); - // Small delay for Windows to release file locks from failed copyFile - await new Promise((resolve) => setTimeout(resolve, 100)); - // Remove destination file if it exists (may have been partially created by failed copyFile) - // recursive: true is required to enable maxRetries for EPERM errors on Windows - try { - await rm(dest, { force: true, recursive: true, maxRetries: 3, retryDelay: 100 }); - } catch { - // Continue anyway - file might not exist - } - const content = await readFile(src); - await writeFile(dest, content); - return; - } - throw err; - } - } -} - -async function getAllFiles(dir: string): Promise<string[]> { - const files: string[] = []; - const entries = await readdir(dir, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = join(dir, entry.name); - if (entry.isDirectory()) { - files.push(...(await getAllFiles(fullPath))); - } else { - // Skip excluded extensions - const shouldExclude = EXCLUDE_EXTENSIONS.some((ext) => - entry.name.endsWith(ext) - ); - if (!shouldExclude) { - files.push(fullPath); - } - } - } - - return files; -} - -async function main() { - console.log("Generating embedded assets..."); - - // Clean up existing assets directory - try { - await rm(ASSETS_DIR, { recursive: true }); - } catch { - // Directory doesn't exist, that's fine - } - await mkdir(ASSETS_DIR, { recursive: true }); - - // Get all files from dist - const distFiles = await getAllFiles(DIST_DIR); - console.log(`Found ${distFiles.length} files to embed`); - - // Copy files and collect import paths - const importPaths: string[] = []; - - for (const file of distFiles) { - // Get relative path from dist directory - const relativePath = relative(DIST_DIR, file); - const destPath = join(ASSETS_DIR, relativePath); - - // Create destination directory if needed - const destDir = join(ASSETS_DIR, relative(DIST_DIR, file.replace(/[/\\][^/\\]+$/, ""))); - await mkdir(destDir, { recursive: true }).catch(() => {}); - - // Copy file (with retry for Windows file locking) - await copyFileWithRetry(file, destPath); - - // Add to import paths (relative to src/) - // Normalize to forward slashes for ES module imports (required regardless of OS) - importPaths.push(`./assets/${relativePath.replace(/\\/g, '/')}`); - } - - // Generate embedded-assets.ts - const imports = importPaths - .map((path) => `import "${path}" with { type: "file" };`) - .join("\n"); - - const content = `/** - * Embedded Frontend Assets - * - * AUTO-GENERATED FILE - DO NOT EDIT MANUALLY - * Regenerate with: bun run build:embeds - * - * This file imports all frontend assets so they get embedded - * into the compiled Bun binary via \`with { type: "file" }\` syntax. - */ - -${imports} - -// Export empty object to ensure this module is included -export {}; -`; - - await writeFile(OUTPUT_FILE, content); - - console.log(`Generated ${OUTPUT_FILE} with ${importPaths.length} imports`); - console.log(`Copied assets to ${ASSETS_DIR}/`); -} - -main().catch(console.error); diff --git a/backstage-server/src/catalog/index.ts b/backstage-server/src/catalog/index.ts deleted file mode 100644 index 490f91fd..00000000 --- a/backstage-server/src/catalog/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Catalog Module - */ - -export { CatalogStorage } from './storage'; -export { createCatalogRoutes } from './routes'; -export * from './types'; diff --git a/backstage-server/src/catalog/routes.ts b/backstage-server/src/catalog/routes.ts deleted file mode 100644 index d084ee65..00000000 --- a/backstage-server/src/catalog/routes.ts +++ /dev/null @@ -1,217 +0,0 @@ -/** - * Catalog REST API Routes - * - * Implements the Backstage Catalog API endpoints for the React frontend. - * @see https://backstage.io/docs/features/software-catalog/software-catalog-api - */ - -import { Hono } from 'hono'; -import { CatalogStorage } from './storage'; -import type { EntitiesQuery, Entity } from './types'; -import { parseEntityRef } from './types'; - -export function createCatalogRoutes(storage: CatalogStorage): Hono { - const app = new Hono(); - - // GET /entities/by-query - Query entities with filtering - app.get('/entities/by-query', async (c) => { - const url = new URL(c.req.url); - - // Collect filters from both formats: - // - Standard: filter=field=value - // - Backstage: filters[field]=value - const filters: string[] = url.searchParams.getAll('filter'); - - // Parse Backstage-style filters[field]=value - for (const [key, value] of url.searchParams.entries()) { - const match = key.match(/^filters\[(.+)\]$/); - if (match) { - const field = match[1]; - filters.push(`${field}=${value}`); - } - } - - const query: EntitiesQuery = { - filter: filters, - fields: url.searchParams.getAll('fields'), - offset: parseInt(url.searchParams.get('offset') || '0', 10), - limit: parseInt(url.searchParams.get('limit') || '20', 10), - }; - - // Parse orderField if present - const orderFields = url.searchParams.getAll('orderField'); - if (orderFields.length > 0) { - query.orderField = orderFields.map((f) => { - const [field, order] = f.split(','); - return { field, order: (order as 'asc' | 'desc') || 'asc' }; - }); - } - - const result = storage.queryEntities(query); - return c.json(result); - }); - - // GET /entities - List all entities (legacy endpoint) - app.get('/entities', async (c) => { - const url = new URL(c.req.url); - - // Collect filters from both formats - const filters: string[] = url.searchParams.getAll('filter'); - for (const [key, value] of url.searchParams.entries()) { - const match = key.match(/^filters\[(.+)\]$/); - if (match) { - filters.push(`${match[1]}=${value}`); - } - } - - const query: EntitiesQuery = { - filter: filters, - offset: parseInt(url.searchParams.get('offset') || '0', 10), - limit: parseInt(url.searchParams.get('limit') || '500', 10), - }; - - const result = storage.queryEntities(query); - return c.json(result.items); - }); - - // GET /entities/by-uid/:uid - Get entity by UID - app.get('/entities/by-uid/:uid', async (c) => { - const uid = c.req.param('uid'); - const entity = storage.getEntityByUid(uid); - - if (!entity) { - return c.json({ error: 'Entity not found' }, 404); - } - - return c.json(entity); - }); - - // GET /entities/by-name/:kind/:namespace/:name - Get entity by name - app.get('/entities/by-name/:kind/:namespace/:name', async (c) => { - const { kind, namespace, name } = c.req.param(); - const entity = storage.getEntityByName(kind, namespace, name); - - if (!entity) { - return c.json({ error: 'Entity not found' }, 404); - } - - return c.json(entity); - }); - - // POST /entities/by-refs - Batch get entities by refs - app.post('/entities/by-refs', async (c) => { - const body = await c.req.json<{ entityRefs: string[]; fields?: string[] }>(); - const { entityRefs } = body; - - const items = entityRefs.map((ref) => { - const parsed = parseEntityRef(ref); - if (parsed.kind) { - return storage.getEntityByName( - parsed.kind, - parsed.namespace, - parsed.name - ); - } - return storage.getEntityByRef(ref); - }); - - return c.json({ items: items.filter(Boolean) }); - }); - - // GET /entity-facets - Get facet counts - app.get('/entity-facets', async (c) => { - const url = new URL(c.req.url); - const facets = url.searchParams.getAll('facet'); - - if (facets.length === 0) { - return c.json({ facets: {} }); - } - - const result = storage.getFacets(facets); - return c.json(result); - }); - - // GET /locations - List all locations - app.get('/locations', async (c) => { - const locations = storage.listLocations(); - return c.json(locations); - }); - - // POST /locations - Register a new location - app.post('/locations', async (c) => { - const body = await c.req.json<{ type: string; target: string }>(); - const { type, target } = body; - - if (!type || !target) { - return c.json({ error: 'type and target are required' }, 400); - } - - const location = storage.addLocation(type, target); - return c.json(location, 201); - }); - - // DELETE /locations/:id - Remove a location - app.delete('/locations/:id', async (c) => { - const id = c.req.param('id'); - const removed = storage.removeLocation(id); - - if (!removed) { - return c.json({ error: 'Location not found' }, 404); - } - - return c.json({ success: true }); - }); - - // POST /refresh - Refresh an entity (trigger re-ingestion) - app.post('/refresh', async (c) => { - const body = await c.req.json<{ entityRef: string }>(); - const { entityRef } = body; - - // For now, just acknowledge the refresh request - // In a full implementation, this would trigger re-ingestion - console.log(`Refresh requested for: ${entityRef}`); - - return c.json({ success: true }); - }); - - // POST /entities - Create/update entity directly - app.post('/entities', async (c) => { - const entity = await c.req.json<Entity>(); - - if (!entity.apiVersion || !entity.kind || !entity.metadata?.name) { - return c.json( - { error: 'apiVersion, kind, and metadata.name are required' }, - 400 - ); - } - - const saved = storage.addEntity(entity); - return c.json(saved, 201); - }); - - // DELETE /entities/by-uid/:uid - Delete entity by UID - app.delete('/entities/by-uid/:uid', async (c) => { - const uid = c.req.param('uid'); - const entity = storage.getEntityByUid(uid); - - if (!entity) { - return c.json({ error: 'Entity not found' }, 404); - } - - const ref = `${entity.kind.toLowerCase()}:${entity.metadata.namespace || 'default'}/${entity.metadata.name}`; - storage.removeEntity(ref); - - return c.json({ success: true }); - }); - - // GET / - Catalog info - app.get('/', async (c) => { - const stats = storage.getStats(); - return c.json({ - status: 'ok', - ...stats, - }); - }); - - return app; -} diff --git a/backstage-server/src/catalog/storage.ts b/backstage-server/src/catalog/storage.ts deleted file mode 100644 index dea0ef88..00000000 --- a/backstage-server/src/catalog/storage.ts +++ /dev/null @@ -1,317 +0,0 @@ -/** - * Catalog Entity Storage - * - * In-memory storage with optional JSON file persistence. - * Provides CRUD operations for Backstage catalog entities. - */ - -import { readFile, writeFile, mkdir } from 'node:fs/promises'; -import { dirname } from 'node:path'; -import { randomUUID } from 'node:crypto'; -import type { - Entity, - EntityEnvelope, - Location, - EntitiesQuery, - EntitiesResponse, - EntityFacetsResponse, -} from './types'; -import { stringifyEntityRef } from './types'; - -interface StorageState { - entities: EntityEnvelope[]; - locations: Location[]; -} - -export class CatalogStorage { - private entities: Map<string, EntityEnvelope> = new Map(); - private entitiesByUid: Map<string, EntityEnvelope> = new Map(); - private locations: Map<string, Location> = new Map(); - private persistPath?: string; - private dirty = false; - private saveTimeout?: ReturnType<typeof setTimeout>; - - constructor(persistPath?: string) { - this.persistPath = persistPath; - } - - async load(): Promise<void> { - if (!this.persistPath) {return;} - - try { - const data = await readFile(this.persistPath, 'utf-8'); - const state: StorageState = JSON.parse(data); - - for (const envelope of state.entities) { - this.indexEntity(envelope); - } - for (const location of state.locations) { - this.locations.set(location.id, location); - } - - console.log(`Loaded ${this.entities.size} entities from ${this.persistPath}`); - } catch (err) { - if ((err as NodeJS.ErrnoException).code !== 'ENOENT') { - console.error('Failed to load catalog state:', err); - } - } - } - - private async save(): Promise<void> { - if (!this.persistPath || !this.dirty) {return;} - - try { - await mkdir(dirname(this.persistPath), { recursive: true }); - - const state: StorageState = { - entities: Array.from(this.entities.values()), - locations: Array.from(this.locations.values()), - }; - - await writeFile(this.persistPath, JSON.stringify(state, null, 2)); - this.dirty = false; - } catch (err) { - console.error('Failed to save catalog state:', err); - } - } - - private scheduleSave(): void { - this.dirty = true; - if (this.saveTimeout) {clearTimeout(this.saveTimeout);} - this.saveTimeout = setTimeout(() => this.save(), 1000); - } - - private indexEntity(envelope: EntityEnvelope): void { - const ref = stringifyEntityRef(envelope.entity); - this.entities.set(ref, envelope); - - if (envelope.entity.metadata.uid) { - this.entitiesByUid.set(envelope.entity.metadata.uid, envelope); - } - } - - private unindexEntity(envelope: EntityEnvelope): void { - const ref = stringifyEntityRef(envelope.entity); - this.entities.delete(ref); - - if (envelope.entity.metadata.uid) { - this.entitiesByUid.delete(envelope.entity.metadata.uid); - } - } - - // Add or update an entity - addEntity(entity: Entity, locationKey?: string): Entity { - // Ensure defaults - entity.metadata.namespace = entity.metadata.namespace || 'default'; - entity.metadata.uid = entity.metadata.uid || randomUUID(); - entity.metadata.etag = randomUUID().slice(0, 8); - - const envelope: EntityEnvelope = { entity, locationKey }; - this.indexEntity(envelope); - this.scheduleSave(); - - return entity; - } - - // Remove an entity - removeEntity(ref: string): boolean { - const envelope = this.entities.get(ref); - if (!envelope) {return false;} - - this.unindexEntity(envelope); - this.scheduleSave(); - return true; - } - - // Get entity by reference (kind:namespace/name) - getEntityByRef(ref: string): Entity | undefined { - return this.entities.get(ref)?.entity; - } - - // Get entity by UID - getEntityByUid(uid: string): Entity | undefined { - return this.entitiesByUid.get(uid)?.entity; - } - - // Get entity by kind/namespace/name - getEntityByName( - kind: string, - namespace: string, - name: string - ): Entity | undefined { - const ref = `${kind.toLowerCase()}:${namespace}/${name}`; - return this.entities.get(ref)?.entity; - } - - // Query entities with filtering - queryEntities(query: EntitiesQuery): EntitiesResponse { - let items = Array.from(this.entities.values()).map((e) => e.entity); - - // Apply filters - if (query.filter) { - for (const filter of query.filter) { - items = this.applyFilter(items, filter); - } - } - - // Sort - if (query.orderField && query.orderField.length > 0) { - items = this.sortEntities(items, query.orderField); - } - - const totalItems = items.length; - - // Pagination - const offset = query.offset || 0; - const limit = query.limit || 20; - items = items.slice(offset, offset + limit); - - return { - items, - totalItems, - pageInfo: { - nextCursor: - offset + limit < totalItems ? String(offset + limit) : undefined, - prevCursor: offset > 0 ? String(Math.max(0, offset - limit)) : undefined, - }, - }; - } - - private applyFilter(entities: Entity[], filter: string): Entity[] { - // Filter format: field=value or field!=value - const match = filter.match(/^([^=!]+)(=|!=)(.*)$/); - if (!match) {return entities;} - - const [, field, operator, value] = match; - - return entities.filter((entity) => { - const fieldValue = this.getFieldValue(entity, field); - const matches = - Array.isArray(fieldValue) - ? fieldValue.includes(value) - : String(fieldValue) === value; - - return operator === '=' ? matches : !matches; - }); - } - - private getFieldValue(entity: Entity, field: string): unknown { - const parts = field.split('.'); - - // Handle special fields - if (parts[0] === 'kind') {return entity.kind.toLowerCase();} - if (parts[0] === 'metadata') { - const key = parts.slice(1).join('.'); - return this.getNestedValue(entity.metadata, key); - } - if (parts[0] === 'spec') { - const key = parts.slice(1).join('.'); - return this.getNestedValue(entity.spec || {}, key); - } - - return undefined; - } - - private getNestedValue(obj: unknown, path: string): unknown { - const parts = path.split('.'); - let current: unknown = obj; - - for (const part of parts) { - if (current == null || typeof current !== 'object') {return undefined;} - current = (current as Record<string, unknown>)[part]; - } - - return current; - } - - private sortEntities( - entities: Entity[], - orderFields: Array<{ field: string; order: 'asc' | 'desc' }> - ): Entity[] { - return [...entities].sort((a, b) => { - for (const { field, order } of orderFields) { - const aVal = String(this.getFieldValue(a, field) ?? ''); - const bVal = String(this.getFieldValue(b, field) ?? ''); - const cmp = aVal.localeCompare(bVal); - if (cmp !== 0) {return order === 'asc' ? cmp : -cmp;} - } - return 0; - }); - } - - // Get facet counts - getFacets(facets: string[]): EntityFacetsResponse { - const result: Record<string, Array<{ value: string; count: number }>> = {}; - - for (const facet of facets) { - const counts = new Map<string, number>(); - - for (const envelope of this.entities.values()) { - const value = this.getFieldValue(envelope.entity, facet); - const values = Array.isArray(value) ? value : [value]; - - for (const v of values) { - if (v != null) { - const key = String(v); - counts.set(key, (counts.get(key) || 0) + 1); - } - } - } - - result[facet] = Array.from(counts.entries()) - .map(([value, count]) => ({ value, count })) - .sort((a, b) => b.count - a.count); - } - - return { facets: result }; - } - - // Location management - addLocation(type: string, target: string): Location { - const id = randomUUID(); - const location: Location = { id, type, target }; - this.locations.set(id, location); - this.scheduleSave(); - return location; - } - - removeLocation(id: string): boolean { - const removed = this.locations.delete(id); - if (removed) {this.scheduleSave();} - return removed; - } - - getLocation(id: string): Location | undefined { - return this.locations.get(id); - } - - listLocations(): Location[] { - return Array.from(this.locations.values()); - } - - // Remove all entities from a location - removeEntitiesByLocation(locationKey: string): number { - let removed = 0; - for (const [, envelope] of this.entities) { - if (envelope.locationKey === locationKey) { - this.unindexEntity(envelope); - removed++; - } - } - if (removed > 0) {this.scheduleSave();} - return removed; - } - - // Get all entities (for search indexing) - getAllEntities(): Entity[] { - return Array.from(this.entities.values()).map((e) => e.entity); - } - - // Stats - getStats(): { entityCount: number; locationCount: number } { - return { - entityCount: this.entities.size, - locationCount: this.locations.size, - }; - } -} diff --git a/backstage-server/src/catalog/types.ts b/backstage-server/src/catalog/types.ts deleted file mode 100644 index 75252221..00000000 --- a/backstage-server/src/catalog/types.ts +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Backstage Catalog Entity Types - * - * Minimal type definitions matching the Backstage catalog API. - * @see https://backstage.io/docs/features/software-catalog/descriptor-format - */ - -export interface EntityMeta { - uid?: string; - etag?: string; - name: string; - namespace?: string; - title?: string; - description?: string; - labels?: Record<string, string>; - annotations?: Record<string, string>; - tags?: string[]; - links?: Array<{ - url: string; - title?: string; - icon?: string; - type?: string; - }>; -} - -export interface EntityRelation { - type: string; - targetRef: string; -} - -export interface Entity { - apiVersion: string; - kind: string; - metadata: EntityMeta; - spec?: Record<string, unknown>; - relations?: EntityRelation[]; -} - -export interface EntityEnvelope { - entity: Entity; - locationKey?: string; -} - -export interface Location { - id: string; - type: string; - target: string; -} - -// Entity reference format: [kind:]namespace/name -export function parseEntityRef(ref: string): { - kind?: string; - namespace: string; - name: string; -} { - const parts = ref.split('/'); - if (parts.length === 1) { - return { namespace: 'default', name: parts[0] }; - } - if (parts.length === 2) { - const [kindOrNs, name] = parts; - if (kindOrNs.includes(':')) { - const [kind, namespace] = kindOrNs.split(':'); - return { kind, namespace, name }; - } - return { namespace: kindOrNs, name }; - } - return { namespace: 'default', name: ref }; -} - -export function stringifyEntityRef(entity: Entity): string { - const namespace = entity.metadata.namespace || 'default'; - return `${entity.kind.toLowerCase()}:${namespace}/${entity.metadata.name}`; -} - -// Query parameters for catalog API -export interface EntitiesQuery { - filter?: string[]; - fields?: string[]; - offset?: number; - limit?: number; - after?: string; - orderField?: Array<{ field: string; order: 'asc' | 'desc' }>; -} - -// API response types -export interface EntitiesResponse { - items: Entity[]; - totalItems: number; - pageInfo: { - nextCursor?: string; - prevCursor?: string; - }; -} - -export interface EntityFacetsResponse { - facets: Record<string, Array<{ value: string; count: number }>>; -} diff --git a/backstage-server/src/search/index.ts b/backstage-server/src/search/index.ts deleted file mode 100644 index 581a5a09..00000000 --- a/backstage-server/src/search/index.ts +++ /dev/null @@ -1,227 +0,0 @@ -/** - * Search Index - * - * Simple in-memory text search index for catalog entities. - */ - -import type { Entity } from '../catalog/types'; -import { stringifyEntityRef } from '../catalog/types'; - -interface IndexedDocument { - entityRef: string; - kind: string; - namespace: string; - name: string; - title: string; - description: string; - tags: string[]; - tier?: string; // Operator taxonomy tier - kindType?: string; // spec.type (taxonomy kind) - text: string; // Combined searchable text -} - -export interface SearchResult { - type: string; - document: { - title: string; - text: string; - location: string; - kind: string; - namespace: string; - name: string; - }; - rank: number; -} - -export interface SearchQuery { - term: string; - types?: string[]; - filters?: Record<string, string | string[]>; -} - -export class SearchIndex { - private documents: Map<string, IndexedDocument> = new Map(); - - // Index an entity - indexEntity(entity: Entity): void { - const ref = stringifyEntityRef(entity); - const meta = entity.metadata; - const labels = meta.labels || {}; - - // Extract tier and kind type from labels/spec - const tier = labels['operator-tier']; - const kindType = entity.spec?.type as string | undefined; - - // Build searchable text from all relevant fields - const textParts = [ - meta.name, - meta.title || '', - meta.description || '', - ...(meta.tags || []), - entity.kind, - ]; - - // Add tier to searchable text - if (tier) { - textParts.push(tier); - } - - // Add kindType to searchable text - if (kindType) { - textParts.push(kindType); - } - - // Add spec fields if they're strings - if (entity.spec) { - for (const [, value] of Object.entries(entity.spec)) { - if (typeof value === 'string') { - textParts.push(value); - } - } - } - - const doc: IndexedDocument = { - entityRef: ref, - kind: entity.kind.toLowerCase(), - namespace: meta.namespace || 'default', - name: meta.name, - title: meta.title || meta.name, - description: meta.description || '', - tags: meta.tags || [], - tier, - kindType, - text: textParts.join(' ').toLowerCase(), - }; - - this.documents.set(ref, doc); - } - - // Remove an entity from the index - removeEntity(entityRef: string): void { - this.documents.delete(entityRef); - } - - // Clear and rebuild index - rebuildIndex(entities: Entity[]): void { - this.documents.clear(); - for (const entity of entities) { - this.indexEntity(entity); - } - } - - // Search for entities - search(query: SearchQuery): SearchResult[] { - const term = query.term.toLowerCase().trim(); - const results: SearchResult[] = []; - - for (const doc of this.documents.values()) { - // Apply type filter if specified - if (query.types && query.types.length > 0) { - const typeMatch = query.types.some( - (t) => t.toLowerCase() === `software-catalog.${doc.kind}` - ); - if (!typeMatch) {continue;} - } - - // Apply kind filter if in filters - if (query.filters?.kind) { - const kinds = Array.isArray(query.filters.kind) - ? query.filters.kind - : [query.filters.kind]; - if (!kinds.some((k) => k.toLowerCase() === doc.kind)) {continue;} - } - - // Apply tier filter if in filters - if (query.filters?.['metadata.labels.operator-tier']) { - const tiers = Array.isArray(query.filters['metadata.labels.operator-tier']) - ? query.filters['metadata.labels.operator-tier'] - : [query.filters['metadata.labels.operator-tier']]; - if (!doc.tier || !tiers.includes(doc.tier)) {continue;} - } - - // Apply kindType (spec.type) filter if in filters - if (query.filters?.['spec.type']) { - const kindTypes = Array.isArray(query.filters['spec.type']) - ? query.filters['spec.type'] - : [query.filters['spec.type']]; - if (!doc.kindType || !kindTypes.includes(doc.kindType)) {continue;} - } - - // Calculate relevance score - let rank = 0; - - if (!term) { - // No search term - return all (with base rank) - rank = 1; - } else { - // Exact name match - if (doc.name.toLowerCase() === term) { - rank += 100; - } - // Name starts with term - else if (doc.name.toLowerCase().startsWith(term)) { - rank += 50; - } - // Name contains term - else if (doc.name.toLowerCase().includes(term)) { - rank += 25; - } - - // Title match - if (doc.title.toLowerCase().includes(term)) { - rank += 20; - } - - // Description match - if (doc.description.toLowerCase().includes(term)) { - rank += 10; - } - - // Tags match - if (doc.tags.some((t) => t.toLowerCase().includes(term))) { - rank += 15; - } - - // Tier match - if (doc.tier?.toLowerCase().includes(term)) { - rank += 12; - } - - // Kind type match - if (doc.kindType?.toLowerCase().includes(term)) { - rank += 12; - } - - // General text match - if (doc.text.includes(term)) { - rank += 5; - } - } - - if (rank > 0) { - results.push({ - type: `software-catalog.${doc.kind}`, - document: { - title: doc.title, - text: doc.description, - location: `/catalog/${doc.namespace}/${doc.kind}/${doc.name}`, - kind: doc.kind, - namespace: doc.namespace, - name: doc.name, - }, - rank, - }); - } - } - - // Sort by rank (descending) - results.sort((a, b) => b.rank - a.rank); - - return results; - } - - // Get stats - getStats(): { documentCount: number } { - return { documentCount: this.documents.size }; - } -} diff --git a/backstage-server/src/search/routes.ts b/backstage-server/src/search/routes.ts deleted file mode 100644 index de229ff3..00000000 --- a/backstage-server/src/search/routes.ts +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Search REST API Routes - * - * Implements the Backstage Search API endpoints. - */ - -import { Hono } from 'hono'; -import { SearchIndex, type SearchQuery } from './index'; - -export function createSearchRoutes(searchIndex: SearchIndex): Hono { - const app = new Hono(); - - // POST /query - Search query - app.post('/query', async (c) => { - const body = await c.req.json<{ - term: string; - types?: string[]; - filters?: Record<string, string | string[]>; - pageLimit?: number; - pageCursor?: string; - }>(); - - const query: SearchQuery = { - term: body.term || '', - types: body.types, - filters: body.filters, - }; - - let results = searchIndex.search(query); - - // Apply pagination - const pageLimit = body.pageLimit || 25; - const offset = body.pageCursor ? parseInt(body.pageCursor, 10) : 0; - - const totalResults = results.length; - results = results.slice(offset, offset + pageLimit); - - const nextCursor = - offset + pageLimit < totalResults ? String(offset + pageLimit) : undefined; - - return c.json({ - results, - nextCursor, - previousCursor: offset > 0 ? String(Math.max(0, offset - pageLimit)) : undefined, - numberOfResults: totalResults, - }); - }); - - // GET /query - Alternative GET endpoint - app.get('/query', async (c) => { - const url = new URL(c.req.url); - const term = url.searchParams.get('term') || ''; - const types = url.searchParams.getAll('types'); - const pageLimit = parseInt(url.searchParams.get('pageLimit') || '25', 10); - const pageCursor = url.searchParams.get('pageCursor') || undefined; - - const query: SearchQuery = { term, types }; - - let results = searchIndex.search(query); - - // Apply pagination - const offset = pageCursor ? parseInt(pageCursor, 10) : 0; - const totalResults = results.length; - results = results.slice(offset, offset + pageLimit); - - const nextCursor = - offset + pageLimit < totalResults ? String(offset + pageLimit) : undefined; - - return c.json({ - results, - nextCursor, - previousCursor: offset > 0 ? String(Math.max(0, offset - pageLimit)) : undefined, - numberOfResults: totalResults, - }); - }); - - // GET / - Search info - app.get('/', async (c) => { - const stats = searchIndex.getStats(); - return c.json({ - status: 'ok', - ...stats, - }); - }); - - return app; -} diff --git a/backstage-server/src/standalone.ts b/backstage-server/src/standalone.ts deleted file mode 100644 index dde9907d..00000000 --- a/backstage-server/src/standalone.ts +++ /dev/null @@ -1,671 +0,0 @@ -/** - * Operator Backstage Standalone Server - * - * Bun-based server for the Backstage catalog and developer portal. - * Uses Hono for HTTP instead of @backstage/backend-defaults - * to enable bun build --compile. - * - * Features: - * - In-memory catalog with file persistence - * - Search index for catalog entities - * - Proxy to Operator REST API - * - Embedded React frontend - */ - -// Import embedded assets first - enables Bun to embed frontend files into the binary -import './embedded-assets'; - -import { Hono } from 'hono'; -import { cors } from 'hono/cors'; -import { join } from 'node:path'; -import { homedir } from 'node:os'; -import { readFile } from 'node:fs/promises'; - -import { CatalogStorage, createCatalogRoutes } from './catalog'; -import { SearchIndex } from './search/index'; -import { createSearchRoutes } from './search/routes'; - -// Branding/theme configuration interface -interface ThemeConfig { - appTitle: string; - orgName: string; - logoPath?: string; - mode: 'light' | 'dark' | 'system'; - colors: { - // Core brand colors - primary: string; // Main action color (Terracotta) - secondary: string; // Secondary elements (Deep Pine) - accent: string; // Highlights, light surfaces (Cream) - warning: string; // Alerts - muted: string; // Subdued text (Cornflower) - // Light mode surfaces - background: string; // Page background - surface: string; // Card/paper background - text: string; // Primary text color - // Navigation scale (4 levels, L1=lightest, L4=darkest) - navL1: string; // Nav button default (Sage) - navL2: string; // Nav hover (Teal) - navL3: string; // Nav selected (Deep Pine) - navL4: string; // Nav background/darkest (Midnight) - }; - components?: { - borderRadius?: number; // Default: 4 - }; -} - -// Build asset map from embedded files -const assetMap = new Map<string, Blob>(); - -// Bun embeds files with a `name` property containing the path -interface BunBlob extends Blob { - name: string; -} - -const embeddedFiles = ( - (globalThis as unknown as { Bun?: { embeddedFiles?: readonly BunBlob[] } }).Bun?.embeddedFiles ?? [] -) as BunBlob[]; - -for (const blob of embeddedFiles) { - // Bun embeds with paths like "./assets/static/main.js" or "assets/index.html" - // Normalize to URL path by removing leading "./" and "assets/" prefix - const name = blob.name - .replace(/^\.\//, '') // Remove leading ./ - .replace(/^assets\//, ''); // Remove assets/ prefix - assetMap.set(name, blob); -} - -const hasEmbeddedFrontend = assetMap.has('index.html'); - -// Initialize catalog storage with persistence -const catalogPersistPath = join(homedir(), '.operator', 'backstage-catalog.json'); -const catalogStorage = new CatalogStorage(catalogPersistPath); -await catalogStorage.load(); - -// Initialize search index -const searchIndex = new SearchIndex(); - -// Index existing entities -for (const entity of catalogStorage.getAllEntities()) { - searchIndex.indexEntity(entity); -} - -// Load branding configuration from ~/.operator/backstage/branding/theme.json -const brandingPath = join(homedir(), '.operator', 'backstage', 'branding'); -const themePath = join(brandingPath, 'theme.json'); - -// Default theme config (matches docs/assets/css/main.css) -let themeConfig: ThemeConfig = { - appTitle: 'Operator!', - orgName: 'Operator', - logoPath: 'logo.svg', - mode: 'system', // Respects OS light/dark preference - colors: { - // Core brand (from docs palette) - primary: '#E05D44', // Terracotta - secondary: '#115566', // Deep Pine - accent: '#F2EAC9', // Cream - warning: '#E05D44', // Terracotta - muted: '#6688AA', // Cornflower - // Light mode surfaces - background: '#faf8f5', // Warm off-white - surface: '#ffffff', // Pure white cards - text: '#115566', // Deep Pine - // Navigation green scale (L1=lightest, L4=darkest) - navL1: '#66AA99', // Sage - button default - navL2: '#448880', // Teal - hover - navL3: '#115566', // Deep Pine - selected - navL4: '#082226', // Midnight - nav background - }, - components: { - borderRadius: 4, // Subtle rounding - }, -}; - -// Try to load custom theme config (deep merge for partial configs) -try { - const data = await readFile(themePath, 'utf-8'); - const loaded = JSON.parse(data); - themeConfig = { - ...themeConfig, - ...loaded, - colors: { - ...themeConfig.colors, - ...(loaded.colors || {}), - }, - components: { - ...themeConfig.components, - ...(loaded.components || {}), - }, - }; - console.log(`Loaded branding config from ${themePath}`); -} catch { - console.log('Using default branding config (no theme.json found)'); -} - -// Add sample entities if catalog is empty (for demo purposes) -// These demonstrate the 5-tier taxonomy model -if (catalogStorage.getStats().entityCount === 0) { - const sampleEntities = [ - // Ecosystem tier - CLI/Developer Tools (ID 21) - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'operator', - namespace: 'default', - title: 'Operator TUI', - description: 'Rust TUI application for orchestrating Claude Code agents', - labels: { - 'operator-tier': 'ecosystem', - 'operator-tier-id': '4', - 'operator-kind-id': '21', - }, - tags: ['rust', 'tui', 'cli', 'ratatui'], - }, - spec: { - type: 'cli-devtool', - lifecycle: 'production', - owner: 'team-platform', - }, - }, - // Engines tier - Internal Tooling (ID 16) - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'backstage-server', - namespace: 'default', - title: 'Backstage Server', - description: 'Bun-compiled Backstage server with embedded frontend', - labels: { - 'operator-tier': 'engines', - 'operator-tier-id': '3', - 'operator-kind-id': '16', - }, - tags: ['typescript', 'bun', 'backstage', 'hono'], - }, - spec: { - type: 'internal-tool', - lifecycle: 'development', - owner: 'team-platform', - }, - }, - // Foundation tier - Infrastructure (ID 1) - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'infrastructure', - namespace: 'default', - title: 'Infrastructure (IaC)', - description: 'Cloud resources and Terraform configurations', - labels: { - 'operator-tier': 'foundation', - 'operator-tier-id': '1', - 'operator-kind-id': '1', - }, - tags: ['terraform', 'aws', 'iac'], - }, - spec: { - type: 'infrastructure', - lifecycle: 'production', - owner: 'team-platform', - }, - }, - // Standards tier - Software Library (ID 6) - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'shared-utils', - namespace: 'default', - title: 'Shared Utilities', - description: 'Reusable internal logic packages and utilities', - labels: { - 'operator-tier': 'standards', - 'operator-tier-id': '2', - 'operator-kind-id': '6', - }, - tags: ['library', 'utils', 'shared'], - }, - spec: { - type: 'software-library', - lifecycle: 'production', - owner: 'team-platform', - }, - }, - // Noncurrent tier - Reference/Example (ID 22) - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'Component', - metadata: { - name: 'examples', - namespace: 'default', - title: 'Example Projects', - description: 'Best-practice implementation examples and tutorials', - labels: { - 'operator-tier': 'noncurrent', - 'operator-tier-id': '5', - 'operator-kind-id': '22', - }, - tags: ['examples', 'tutorials', 'reference'], - }, - spec: { - type: 'reference-example', - lifecycle: 'experimental', - owner: 'team-platform', - }, - }, - ]; - - for (const entity of sampleEntities) { - catalogStorage.addEntity(entity); - searchIndex.indexEntity(entity); - } - console.log('Added sample catalog entities with taxonomy tiers'); -} - -// MIME type mapping for static assets -function getMimeType(path: string): string { - const ext = path.split('.').pop()?.toLowerCase(); - const mimeTypes: Record<string, string> = { - 'html': 'text/html', - 'css': 'text/css', - 'js': 'application/javascript', - 'json': 'application/json', - 'png': 'image/png', - 'jpg': 'image/jpeg', - 'jpeg': 'image/jpeg', - 'gif': 'image/gif', - 'svg': 'image/svg+xml', - 'ico': 'image/x-icon', - 'woff': 'font/woff', - 'woff2': 'font/woff2', - 'ttf': 'font/ttf', - 'eot': 'application/vnd.ms-fontobject', - }; - return mimeTypes[ext || ''] || 'application/octet-stream'; -} - -const app = new Hono(); - -// Enable CORS for Operator REST API integration -app.use('/*', cors({ - origin: ['http://localhost:7007', 'http://localhost:7008'], - allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], -})); - -// Health check endpoint -app.get('/health', (c) => c.json({ status: 'ok', timestamp: new Date().toISOString() })); - -// Status endpoint -app.get('/api/status', (c) => { - const catalogStats = catalogStorage.getStats(); - const searchStats = searchIndex.getStats(); - return c.json({ - status: 'running', - version: '1.0.0', - mode: 'standalone', - catalog: catalogStats, - search: searchStats, - branding: { - appTitle: themeConfig.appTitle, - orgName: themeConfig.orgName, - }, - }); -}); - -// Mount catalog API routes -const catalogRoutes = createCatalogRoutes(catalogStorage); -app.route('/api/catalog', catalogRoutes); - -// Mount search API routes -const searchRoutes = createSearchRoutes(searchIndex); -app.route('/api/search', searchRoutes); - -// Guest authentication endpoints -// These mock the Backstage auth backend for guest sign-in -// See: https://backstage.io/docs/auth/guest/provider/ - -// Generate a mock Backstage token (simple base64, not a real JWT) -function generateGuestToken() { - const payload = { - sub: 'user:development/guest', - ent: ['user:development/guest'], - iat: Math.floor(Date.now() / 1000), - exp: Math.floor(Date.now() / 1000) + 3600, - }; - // Create a fake JWT-like structure (header.payload.signature) - const header = Buffer.from(JSON.stringify({ alg: 'none', typ: 'JWT' })).toString('base64url'); - const body = Buffer.from(JSON.stringify(payload)).toString('base64url'); - return `${header}.${body}.`; -} - -// Auth OpenID configuration (discovery endpoint) -app.get('/api/auth/.well-known/openid-configuration', (c) => { - const baseUrl = 'http://localhost:7007'; - return c.json({ - issuer: baseUrl, - authorization_endpoint: `${baseUrl}/api/auth/guest/start`, - token_endpoint: `${baseUrl}/api/auth/guest/refresh`, - userinfo_endpoint: `${baseUrl}/api/auth/guest/refresh`, - jwks_uri: `${baseUrl}/api/auth/.well-known/jwks.json`, - }); -}); - -// Mock JWKS (JSON Web Key Set) -app.get('/api/auth/.well-known/jwks.json', (c) => { - return c.json({ keys: [] }); -}); - -// Auth providers list - tells frontend what providers are available -app.get('/api/auth/providers', (c) => { - return c.json({ - guest: { - providerId: 'guest', - title: 'Guest', - message: 'Sign in as a guest user', - }, - }); -}); - -// Guest provider info endpoint -app.get('/api/auth/guest', (c) => { - return c.json({ - providerId: 'guest', - // Tell the frontend that guest sign-in is allowed - signIn: { - supported: true, - }, - }); -}); - -// Auth service check - tells frontend the auth backend is available -app.get('/api/auth', (c) => { - return c.json({ - status: 'ok', - providers: ['guest'], - }); -}); - -// List available guest users (for multi-user guest setups) -app.get('/api/auth/guest/users', (c) => { - return c.json([ - { id: 'guest', displayName: 'Guest User' }, - ]); -}); - -// Start guest authentication - GET variant used by some Backstage versions -app.get('/api/auth/guest/start', (c) => { - const token = generateGuestToken(); - - return c.json({ - backstageIdentity: { - token, - expiresInSeconds: 3600, - identity: { - type: 'user', - userEntityRef: 'user:development/guest', - ownershipEntityRefs: ['user:development/guest'], - }, - }, - profile: { - email: 'guest@example.com', - displayName: 'Guest User', - }, - providerInfo: {}, - }); -}); - -// Start guest authentication session - POST variant -app.post('/api/auth/guest/start', async (c) => { - const token = generateGuestToken(); - - return c.json({ - backstageIdentity: { - token, - expiresInSeconds: 3600, - identity: { - type: 'user', - userEntityRef: 'user:development/guest', - ownershipEntityRefs: ['user:development/guest'], - }, - }, - profile: { - email: 'guest@example.com', - displayName: 'Guest User', - }, - providerInfo: {}, - }); -}); - -// Handle OAuth-style refresh -app.get('/api/auth/guest/refresh', (c) => { - const token = generateGuestToken(); - - return c.json({ - backstageIdentity: { - token, - expiresInSeconds: 3600, - identity: { - type: 'user', - userEntityRef: 'user:development/guest', - ownershipEntityRefs: ['user:development/guest'], - }, - }, - profile: { - email: 'guest@example.com', - displayName: 'Guest User', - }, - providerInfo: {}, - }); -}); - -app.post('/api/auth/guest/refresh', async (c) => { - const token = generateGuestToken(); - - return c.json({ - backstageIdentity: { - token, - expiresInSeconds: 3600, - identity: { - type: 'user', - userEntityRef: 'user:development/guest', - ownershipEntityRefs: ['user:development/guest'], - }, - }, - profile: { - email: 'guest@example.com', - displayName: 'Guest User', - }, - providerInfo: {}, - }); -}); - -// Proxy to Operator REST API (default port 7008) -const operatorApiUrl = process.env.OPERATOR_API_URL || 'http://localhost:7008'; - -app.all('/api/operator/*', async (c) => { - const path = c.req.path.replace('/api/operator', ''); - const url = `${operatorApiUrl}${path}`; - - try { - const response = await fetch(url, { - method: c.req.method, - headers: c.req.header(), - body: c.req.method !== 'GET' ? await c.req.text() : undefined, - }); - - const data = await response.text(); - return new Response(data, { - status: response.status, - headers: { 'Content-Type': response.headers.get('Content-Type') || 'application/json' }, - }); - } catch (error) { - return c.json({ error: 'Operator API unavailable', details: String(error) }, 502); - } -}); - -// Proxy route for Backstage proxy plugin convention (/api/proxy/operator/*) -// Used by OperatorApiClient and homepage widgets -app.all('/api/proxy/operator/*', async (c) => { - const path = c.req.path.replace('/api/proxy/operator', ''); - const url = `${operatorApiUrl}${path}`; - - try { - const response = await fetch(url, { - method: c.req.method, - headers: c.req.header(), - body: c.req.method !== 'GET' ? await c.req.text() : undefined, - }); - - const data = await response.text(); - return new Response(data, { - status: response.status, - headers: { 'Content-Type': response.headers.get('Content-Type') || 'application/json' }, - }); - } catch (error) { - return c.json({ error: 'Operator API unavailable', details: String(error) }, 502); - } -}); - -// Issue types endpoint - proxy to operator -app.get('/api/issuetypes', async (c) => { - try { - const response = await fetch(`${operatorApiUrl}/api/v1/issuetypes`); - const data = await response.json(); - return c.json(data); - } catch (error) { - return c.json({ error: 'Failed to fetch issue types' }, 500); - } -}); - -// Collections endpoint - proxy to operator -app.get('/api/collections', async (c) => { - try { - const response = await fetch(`${operatorApiUrl}/api/v1/collections`); - const data = await response.json(); - return c.json(data); - } catch (error) { - return c.json({ error: 'Failed to fetch collections' }, 500); - } -}); - -// Branding configuration endpoint - used by frontend for theming -app.get('/api/branding', (c) => c.json(themeConfig)); - -// Serve logo from branding directory -app.get('/branding/logo.svg', async (c) => { - if (!themeConfig.logoPath) { - return c.notFound(); - } - - const logoFullPath = join(brandingPath, themeConfig.logoPath); - try { - const logo = await readFile(logoFullPath); - return new Response(logo, { - headers: { - 'Content-Type': 'image/svg+xml', - 'Cache-Control': 'public, max-age=3600', - }, - }); - } catch { - return c.notFound(); - } -}); - -// Serve embedded static assets -app.get('/static/*', async (c) => { - const path = c.req.path.slice(1); // Remove leading / - const blob = assetMap.get(path); - - if (blob) { - return new Response(blob, { - headers: { - 'Content-Type': getMimeType(path), - 'Cache-Control': 'public, max-age=31536000, immutable', - }, - }); - } - - return c.notFound(); -}); - -// Fallback status page (shown when no frontend is embedded) -const statusPage = (apiUrl: string, stats: { entityCount: number; locationCount: number }) => ` -<!DOCTYPE html> -<html> -<head> - <title>Operator Backstage - - - -

Operator Backstage Server

-
-

Status: Running

-

Mode: Standalone (compiled binary)

-

Operator API: ${apiUrl}

-

Frontend: Not embedded (build with bun run build)

-
-
-
-
${stats.entityCount}
-
Catalog Entities
-
-
-
${stats.locationCount}
-
Locations
-
-
-

Available Endpoints

-
    -
  • GET /health - Health check
  • -
  • GET /api/status - Server status
  • -
  • GET /api/catalog/entities - List catalog entities
  • -
  • GET /api/catalog/entities/by-query - Query entities
  • -
  • POST /api/search/query - Search entities
  • -
  • GET /api/issuetypes - List issue types
  • -
  • GET /api/collections - List collections
  • -
  • ALL /api/operator/* - Proxy to Operator REST API
  • -
- - -`; - -// SPA fallback - serve index.html for all non-API routes -app.get('*', async (c) => { - // If we have embedded frontend, serve index.html for SPA routing - if (hasEmbeddedFrontend) { - const indexBlob = assetMap.get('index.html'); - if (indexBlob) { - return c.html(await indexBlob.text()); - } - } - - // Fallback to status page if no frontend embedded - const stats = catalogStorage.getStats(); - return c.html(statusPage(operatorApiUrl, stats)); -}); - -// Start server -const port = parseInt(process.env.PORT || '7007'); -const catalogStats = catalogStorage.getStats(); -console.log(`Operator Backstage Server starting on port ${port}...`); -console.log(`Operator API: ${operatorApiUrl}`); -console.log(`Catalog: ${catalogStats.entityCount} entities, ${catalogStats.locationCount} locations`); -console.log(`Embedded assets: ${assetMap.size} files${hasEmbeddedFrontend ? ' (frontend ready)' : ' (no frontend)'}`); -console.log(`Persistence: ${catalogPersistPath}`); -console.log(`Branding: "${themeConfig.appTitle}" (${themeConfig.orgName})`); - -export default { - port, - fetch: app.fetch, -}; diff --git a/backstage-server/tsconfig.json b/backstage-server/tsconfig.json deleted file mode 100644 index 6b0f4466..00000000 --- a/backstage-server/tsconfig.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "bundler", - "lib": ["ES2022", "DOM"], - "jsx": "react-jsx", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "outDir": "./dist", - "rootDir": ".", - "baseUrl": ".", - "types": ["bun-types"], - "paths": { - "@operator/*": ["packages/plugins/*"] - } - }, - "include": [ - "global.d.ts", - "packages/*/src/**/*", - "packages/plugins/*/src/**/*", - "src/standalone.ts", - "src/index.ts" - ], - "exclude": ["node_modules", "dist", "**/dist"] -} diff --git a/bindings/AutoGenStrategy.ts b/bindings/AutoGenStrategy.ts new file mode 100644 index 00000000..4fc27988 --- /dev/null +++ b/bindings/AutoGenStrategy.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Auto-generation strategies for fields + */ +export type AutoGenStrategy = "id" | "date" | "branch" | "status"; diff --git a/bindings/BackstageConfig.ts b/bindings/BackstageConfig.ts deleted file mode 100644 index 9a228769..00000000 --- a/bindings/BackstageConfig.ts +++ /dev/null @@ -1,44 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { BrandingConfig } from "./BrandingConfig"; - -/** - * Backstage integration configuration - */ -export type BackstageConfig = { -/** - * Whether Backstage integration is enabled - */ -enabled: boolean, -/** - * Whether to show Backstage in the Connections status section - */ -display: boolean, -/** - * Port for the Backstage server - */ -port: number, -/** - * Auto-start Backstage server when TUI launches - */ -auto_start: boolean, -/** - * Subdirectory within `state_path` for Backstage installation - */ -subpath: string, -/** - * Subdirectory within backstage path for branding customization - */ -branding_subpath: string, -/** - * Base URL for downloading backstage-server binary - */ -release_url: string, -/** - * Optional local path to backstage-server binary - * If set, this is used instead of downloading from `release_url` - */ -local_binary_path: string | null, -/** - * Branding and theming configuration - */ -branding: BrandingConfig, }; diff --git a/bindings/BrandingConfig.ts b/bindings/BrandingConfig.ts deleted file mode 100644 index aad0c590..00000000 --- a/bindings/BrandingConfig.ts +++ /dev/null @@ -1,23 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { ThemeColors } from "./ThemeColors"; - -/** - * Branding configuration for Backstage portal - */ -export type BrandingConfig = { -/** - * App title shown in header - */ -app_title: string, -/** - * Organization name - */ -org_name: string, -/** - * Path to logo SVG (relative to branding path) - */ -logo_path: string | null, -/** - * Theme colors (uses Operator defaults if not set) - */ -colors: ThemeColors, }; diff --git a/bindings/ClassifierConfig.ts b/bindings/ClassifierConfig.ts new file mode 100644 index 00000000..7210672f --- /dev/null +++ b/bindings/ClassifierConfig.ts @@ -0,0 +1,23 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ClassifierOutputType } from "./ClassifierOutputType"; + +/** + * Configuration for classifier steps that return structured typed output + */ +export type ClassifierConfig = { +/** + * What type of answer the classifier returns + */ +output_type: ClassifierOutputType, +/** + * For enum type: the allowed options + */ +options?: Array | null, +/** + * For `short_string`: max character length (default 255) + */ +max_length?: number | null, +/** + * Agent/delegator to use (overrides issuetype default) + */ +agent?: string | null, }; diff --git a/bindings/ClassifierOutputType.ts b/bindings/ClassifierOutputType.ts new file mode 100644 index 00000000..a69bfdc3 --- /dev/null +++ b/bindings/ClassifierOutputType.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Output types for classifier steps + */ +export type ClassifierOutputType = "boolean" | "number" | "short_string" | "big_text" | "enum"; diff --git a/bindings/CollectionResponse.ts b/bindings/CollectionResponse.ts index 6c4ca395..674ece99 100644 --- a/bindings/CollectionResponse.ts +++ b/bindings/CollectionResponse.ts @@ -13,6 +13,34 @@ version?: string | null, * Publisher identifier (present for hosted collections). */ publisher?: string | null, +/** + * Human author/attribution (present for hosted collections). + */ +author?: string | null, +/** + * Link to the collection's source repository or project page. + */ +url?: string | null, +/** + * SPDX license id. + */ +license?: string | null, +/** + * Provenance tier: `official` or `community`. + */ +tier: string, +/** + * Bare filename of the collection's SVG icon, next to its manifest. + */ +icon_path?: string | null, +/** + * ISO-8601 date the collection was first published. + */ +created?: string | null, +/** + * ISO-8601 date of the last substantive revision. + */ +updated?: string | null, /** * Descriptive workflow hints (present for hosted collections). */ diff --git a/bindings/CreateIssueTypeRequest.ts b/bindings/CreateIssueTypeRequest.ts index 58eca141..52e85cb8 100644 --- a/bindings/CreateIssueTypeRequest.ts +++ b/bindings/CreateIssueTypeRequest.ts @@ -5,4 +5,8 @@ import type { CreateStepRequest } from "./CreateStepRequest"; /** * Request to create a new issue type */ -export type CreateIssueTypeRequest = { key: string, name: string, description: string, mode: string, glyph: string, color: string | null, project_required: boolean, fields: Array, steps: Array, }; +export type CreateIssueTypeRequest = { key: string, name: string, description: string, mode: string, glyph: string, color: string | null, project_required: boolean, fields: Array, steps: Array, +/** + * Target collection (defaults to the active collection) + */ +collection?: string, }; diff --git a/bindings/CustomFlags.ts b/bindings/CustomFlags.ts new file mode 100644 index 00000000..ff8b85e7 --- /dev/null +++ b/bindings/CustomFlags.ts @@ -0,0 +1,19 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { JsonValue } from "./serde_json/JsonValue"; + +/** + * Per-provider custom configuration flags + */ +export type CustomFlags = { +/** + * Claude-specific configuration flags + */ +claude: { [key in string]: JsonValue }, +/** + * Gemini-specific configuration flags + */ +gemini: { [key in string]: JsonValue }, +/** + * Codex-specific configuration flags + */ +codex: { [key in string]: JsonValue }, }; diff --git a/bindings/DelegatorStepConfig.ts b/bindings/DelegatorStepConfig.ts new file mode 100644 index 00000000..5cfd1864 --- /dev/null +++ b/bindings/DelegatorStepConfig.ts @@ -0,0 +1,23 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { StepPermissions } from "./StepPermissions"; + +/** + * Configuration for delegator steps that run with a specific model+flavor + */ +export type DelegatorStepConfig = { +/** + * Named delegator reference (from config.delegators) + */ +delegator: string, +/** + * Additional prompt flavor text prepended to the step prompt + */ +prompt_flavor?: string | null, +/** + * Tools allowed + */ +allowed_tools: Array, +/** + * Permissions + */ +permissions?: StepPermissions | null, }; diff --git a/bindings/DirectoryPermissions.ts b/bindings/DirectoryPermissions.ts new file mode 100644 index 00000000..2edb7ea8 --- /dev/null +++ b/bindings/DirectoryPermissions.ts @@ -0,0 +1,14 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Directory-level permissions + */ +export type DirectoryPermissions = { +/** + * Additional directories to allow access to (glob patterns) + */ +allow: Array, +/** + * Directories to deny access to (glob patterns) + */ +deny: Array, }; diff --git a/bindings/ExecutionMode.ts b/bindings/ExecutionMode.ts new file mode 100644 index 00000000..2b90fa7a --- /dev/null +++ b/bindings/ExecutionMode.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Execution mode for an issuetype + */ +export type ExecutionMode = "autonomous" | "paired"; diff --git a/bindings/FieldSchema.ts b/bindings/FieldSchema.ts new file mode 100644 index 00000000..bd48032d --- /dev/null +++ b/bindings/FieldSchema.ts @@ -0,0 +1,52 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { AutoGenStrategy } from "./AutoGenStrategy"; +import type { FieldType } from "./FieldType"; + +/** + * Schema definition for a single field in a template + */ +export type FieldSchema = { +/** + * Field identifier (matches handlebar variable name) + */ +name: string, +/** + * Help text for the field + */ +description: string, +/** + * Type of the field + */ +type: FieldType, +/** + * Whether this field must be filled + */ +required: boolean, +/** + * Default value if any + */ +default?: string | null, +/** + * Auto-generation strategy for this field + */ +auto?: AutoGenStrategy | null, +/** + * Options for enum fields + */ +options: Array, +/** + * Placeholder text shown in template + */ +placeholder?: string | null, +/** + * Maximum length for string fields + */ +max_length?: number | null, +/** + * Display order in form (lower = first) + */ +display_order?: number | null, +/** + * Whether the user can edit this field (false for auto-generated) + */ +user_editable: boolean, }; diff --git a/bindings/FieldType.ts b/bindings/FieldType.ts new file mode 100644 index 00000000..357d3515 --- /dev/null +++ b/bindings/FieldType.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Types of fields supported in template schemas + */ +export type FieldType = "string" | "enum" | "bool" | "date" | "text" | "integer"; diff --git a/bindings/IssueType.ts b/bindings/IssueType.ts new file mode 100644 index 00000000..6acd81d4 --- /dev/null +++ b/bindings/IssueType.ts @@ -0,0 +1,62 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ExecutionMode } from "./ExecutionMode"; +import type { FieldSchema } from "./FieldSchema"; +import type { IssueTypeSource } from "./IssueTypeSource"; +import type { StepSchema } from "./StepSchema"; + +/** + * An issue type definition (dynamic version of `TemplateSchema`) + */ +export type IssueType = { +/** + * Unique issuetype key (e.g., FEAT, FIX, STORY, BUG) + */ +key: string, +/** + * Display name of the issue type + */ +name: string, +/** + * Brief description of when to use this issue type + */ +description: string, +/** + * Whether this issue type runs autonomously or requires human pairing + */ +mode: ExecutionMode, +/** + * Glyph character displayed in UI for this issue type + */ +glyph: string, +/** + * Optional color for glyph display in TUI + */ +color?: string | null, +/** + * Whether a project must be specified for this issue type + */ +project_required: boolean, +/** + * Field definitions for this issue type + */ +fields: Array, +/** + * Lifecycle steps for completing this ticket type + */ +steps: Array, +/** + * Prompt for generating this issue type's operator agent via `claude -p` + */ +agent_prompt?: string | null, +/** + * Default delegator name for this issuetype (overridden by step.agent) + */ +agent?: string | null, +/** + * Source of this issue type (builtin, user, import) + */ +source: IssueTypeSource, +/** + * Original external ID (for imported types) + */ +external_id?: string | null, }; diff --git a/bindings/IssueTypeResponse.ts b/bindings/IssueTypeResponse.ts index 23adaab3..f764158e 100644 --- a/bindings/IssueTypeResponse.ts +++ b/bindings/IssueTypeResponse.ts @@ -5,4 +5,8 @@ import type { StepResponse } from "./StepResponse"; /** * Response for a single issue type */ -export type IssueTypeResponse = { key: string, name: string, description: string, mode: string, glyph: string, color: string | null, project_required: boolean, source: string, fields: Array, steps: Array, }; +export type IssueTypeResponse = { key: string, name: string, description: string, mode: string, glyph: string, color: string | null, project_required: boolean, source: string, +/** + * Owning collection under resolution-order lookup + */ +collection?: string, fields: Array, steps: Array, }; diff --git a/bindings/IssueTypeSource.ts b/bindings/IssueTypeSource.ts new file mode 100644 index 00000000..9c151a5f --- /dev/null +++ b/bindings/IssueTypeSource.ts @@ -0,0 +1,14 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Source of an issue type definition + */ +export type IssueTypeSource = "builtin" | "user" | { "import": { +/** + * Provider name (e.g., "jira", "linear") + */ +provider: string, +/** + * Project/team identifier + */ +project: string, } }; diff --git a/bindings/IssueTypeSummary.ts b/bindings/IssueTypeSummary.ts index ea40e6f6..3ca38fae 100644 --- a/bindings/IssueTypeSummary.ts +++ b/bindings/IssueTypeSummary.ts @@ -3,4 +3,8 @@ /** * Summary response for listing issue types */ -export type IssueTypeSummary = { key: string, name: string, description: string, mode: string, glyph: string, color?: string, source: string, stepCount: number, }; +export type IssueTypeSummary = { key: string, name: string, description: string, mode: string, glyph: string, color?: string, source: string, +/** + * Owning collection under resolution-order lookup + */ +collection?: string, stepCount: number, }; diff --git a/bindings/ItemSource.ts b/bindings/ItemSource.ts new file mode 100644 index 00000000..7bba7b5e --- /dev/null +++ b/bindings/ItemSource.ts @@ -0,0 +1,24 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Where a pipeline's iterated items come from. The variant determines *when* + * the list resolves: export-time (a literal array → static fan-out width in + * the compiled graph) vs runtime (an identifier → symbolic width). + */ +export type ItemSource = { "type": "projects" } | { "type": "from_step", +/** + * Name of the prior step whose (array) output is iterated. + */ +step: string, } | { "type": "glob", +/** + * Glob pattern, relative to the project root. + */ +pattern: string, } | { "type": "static", +/** + * The items to iterate. + */ +items: Array, } | { "type": "field", +/** + * Name of the ticket field to read. + */ +name: string, }; diff --git a/bindings/KanbanStatusMapping.ts b/bindings/KanbanStatusMapping.ts new file mode 100644 index 00000000..f5678e20 --- /dev/null +++ b/bindings/KanbanStatusMapping.ts @@ -0,0 +1,25 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Explicit mapping from operator's strict todo/doing/done states to the + * external board's column/status names. + * + * Drives bidirectional sync: issues are pulled from the `todo` column, + * pushed to `doing` when a ticket is claimed, to `done` when completed, and + * back to `todo` when requeued. Unset fields fall back per-transition + * (`doing` → "In Progress", `done` → "Done"); requeue only pushes when + * `todo` is explicitly mapped. + */ +export type KanbanStatusMapping = { +/** + * External column for operator "todo" (queued work; also the pull source) + */ +todo?: string | null, +/** + * External column for operator "doing" (claimed/launched tickets) + */ +doing?: string | null, +/** + * External column for operator "done" (completed tickets) + */ +done?: string | null, }; diff --git a/bindings/ListKanbanStatusesRequest.ts b/bindings/ListKanbanStatusesRequest.ts new file mode 100644 index 00000000..682eb237 --- /dev/null +++ b/bindings/ListKanbanStatusesRequest.ts @@ -0,0 +1,15 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { GithubCredentials } from "./GithubCredentials"; +import type { JiraCredentials } from "./JiraCredentials"; +import type { KanbanProviderKind } from "./KanbanProviderKind"; +import type { LinearCredentials } from "./LinearCredentials"; + +/** + * Request to list workflow statuses/columns for a specific project using + * ephemeral creds (onboarding wizard — before any config is persisted). + */ +export type ListKanbanStatusesRequest = { provider: KanbanProviderKind, +/** + * Project/team key to list statuses for + */ +project_key: string, jira?: JiraCredentials | null, linear?: LinearCredentials | null, github?: GithubCredentials | null, }; diff --git a/bindings/ListKanbanStatusesResponse.ts b/bindings/ListKanbanStatusesResponse.ts new file mode 100644 index 00000000..78a75571 --- /dev/null +++ b/bindings/ListKanbanStatusesResponse.ts @@ -0,0 +1,7 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Response wrapper for list-statuses: the external board's column names, + * in board order, for populating todo/doing/done mapping dropdowns. + */ +export type ListKanbanStatusesResponse = { statuses: Array, }; diff --git a/bindings/MatrixedConfig.ts b/bindings/MatrixedConfig.ts new file mode 100644 index 00000000..ab2c51cc --- /dev/null +++ b/bindings/MatrixedConfig.ts @@ -0,0 +1,23 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { MatrixedOutputFormat } from "./MatrixedOutputFormat"; + +/** + * Configuration for matrixed work output steps (N x M delegators x prompts) + */ +export type MatrixedConfig = { +/** + * Named delegator references (N), minimum 2 + */ +delegators: Array, +/** + * Prompt variations (M) — Handlebars templates, minimum 2 + */ +prompt_variations: Array, +/** + * How to organize/present the N x M output + */ +output_format: MatrixedOutputFormat, +/** + * Optional aggregation prompt (receives the full matrix of results) + */ +aggregation_prompt?: string | null, }; diff --git a/bindings/MatrixedOutputFormat.ts b/bindings/MatrixedOutputFormat.ts new file mode 100644 index 00000000..245407e9 --- /dev/null +++ b/bindings/MatrixedOutputFormat.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Output format for matrixed steps + */ +export type MatrixedOutputFormat = "directory" | "structured"; diff --git a/bindings/McpServerPermissions.ts b/bindings/McpServerPermissions.ts new file mode 100644 index 00000000..69cbb68c --- /dev/null +++ b/bindings/McpServerPermissions.ts @@ -0,0 +1,14 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * MCP server permissions (server-level enable/disable only) + */ +export type McpServerPermissions = { +/** + * MCP servers to enable for this step + */ +enable: Array, +/** + * MCP servers to disable for this step + */ +disable: Array, }; diff --git a/bindings/McpStepConfig.ts b/bindings/McpStepConfig.ts new file mode 100644 index 00000000..c03069ab --- /dev/null +++ b/bindings/McpStepConfig.ts @@ -0,0 +1,23 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { McpToolRef } from "./McpToolRef"; + +/** + * Configuration for MCP steps that require specific MCP tools + */ +export type McpStepConfig = { +/** + * MCP tools that MUST be available (step fails if missing) + */ +required_tools: Array, +/** + * MCP tools that SHOULD be available (warning if missing) + */ +optional_tools: Array, +/** + * Agent/delegator to use + */ +agent?: string | null, +/** + * Tools allowed (in addition to MCP tools) + */ +allowed_tools: Array, }; diff --git a/bindings/McpToolRef.ts b/bindings/McpToolRef.ts new file mode 100644 index 00000000..bd3eb874 --- /dev/null +++ b/bindings/McpToolRef.ts @@ -0,0 +1,14 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Reference to a specific MCP server tool + */ +export type McpToolRef = { +/** + * MCP server name + */ +server: string, +/** + * Specific tool name (None = all tools from this server) + */ +tool?: string | null, }; diff --git a/bindings/MultiModelConfig.ts b/bindings/MultiModelConfig.ts new file mode 100644 index 00000000..22a680a7 --- /dev/null +++ b/bindings/MultiModelConfig.ts @@ -0,0 +1,28 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { VotingMode } from "./VotingMode"; +import type { VotingStrategy } from "./VotingStrategy"; + +/** + * Configuration for multi-model delegation steps (fan-out + vote) + */ +export type MultiModelConfig = { +/** + * Named delegator references (from config.delegators), minimum 2 + */ +delegators: Array, +/** + * How to aggregate/select the final answer + */ +voting_strategy: VotingStrategy, +/** + * Whether to share all answers with all models in the voting round + */ +share_answers: boolean, +/** + * Prompt for the voting round (Handlebars, receives {{ answers }} array) + */ +voting_prompt?: string | null, +/** + * How the voting round executes + */ +voting_mode: VotingMode, }; diff --git a/bindings/MultiPromptConfig.ts b/bindings/MultiPromptConfig.ts new file mode 100644 index 00000000..39a9cc1c --- /dev/null +++ b/bindings/MultiPromptConfig.ts @@ -0,0 +1,23 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { SelectionStrategy } from "./SelectionStrategy"; + +/** + * Configuration for multi-prompt interrogation steps (N variations, select best) + */ +export type MultiPromptConfig = { +/** + * Prompt variations (Handlebars templates), minimum 2 + */ +prompt_variations: Array, +/** + * How to select the best result + */ +selection_strategy: SelectionStrategy, +/** + * Agent/delegator to use for all variations + */ +agent?: string | null, +/** + * Prompt for the selection/review round + */ +selection_prompt?: string | null, }; diff --git a/bindings/OnReject.ts b/bindings/OnReject.ts new file mode 100644 index 00000000..8b209cce --- /dev/null +++ b/bindings/OnReject.ts @@ -0,0 +1,14 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Action to take when a step is rejected + */ +export type OnReject = { +/** + * Step name to return to on rejection + */ +goto_step: string, +/** + * Prompt to use when restarting after rejection + */ +prompt: string, }; diff --git a/bindings/PermissionMode.ts b/bindings/PermissionMode.ts new file mode 100644 index 00000000..8ac0d84a --- /dev/null +++ b/bindings/PermissionMode.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Permission mode for LLM interaction + */ +export type PermissionMode = "default" | "plan" | "acceptEdits" | "delegate"; diff --git a/bindings/PipelineConfig.ts b/bindings/PipelineConfig.ts new file mode 100644 index 00000000..4b69cf04 --- /dev/null +++ b/bindings/PipelineConfig.ts @@ -0,0 +1,21 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ItemSource } from "./ItemSource"; +import type { PipelineStage } from "./PipelineStage"; + +/** + * Configuration for pipeline steps: iterate a list of items through ordered + * stages with no barrier (each item flows through all stages independently). + * + * The step graph stays linear — a pipeline step still has exactly one + * `next_step`. The fan-out (N items x M stages) lives entirely inside this one + * step; iteration is an intra-step concern, never a step-to-step edge. + */ +export type PipelineConfig = { +/** + * Where the iterated items come from. + */ +item_source: ItemSource, +/** + * Ordered mini-steps each item flows through. Must be non-empty. + */ +stages: Array, }; diff --git a/bindings/PipelineStage.ts b/bindings/PipelineStage.ts new file mode 100644 index 00000000..463bec91 --- /dev/null +++ b/bindings/PipelineStage.ts @@ -0,0 +1,31 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { JsonValue } from "./serde_json/JsonValue"; + +/** + * A single stage in a pipeline — deliberately flat (not a recursive + * `StepSchema`): "prompt + optional agent/model/schema" only. It has no + * `next_step`/`review_type`/`on_reject`, so a stage cannot reopen the + * step-graph linearity question. + */ +export type PipelineStage = { +/** + * Handlebars prompt. The per-item value is appended as a JS binding at + * export time (see `workflow_gen::export`), not via a Handlebars variable. + */ +prompt: string, +/** + * Optional agent/delegator name (falls back to the step/issuetype agent). + */ +agent?: string | null, +/** + * Optional model pin (emitted as `{ model: … }`). + */ +model?: string | null, +/** + * Optional structured-output JSON schema (emitted as `{ schema: … }`). + */ +jsonSchema?: JsonValue | null, +/** + * Optional display label override (defaults to `:`). + */ +label?: string | null, }; diff --git a/bindings/ProjectSyncConfig.ts b/bindings/ProjectSyncConfig.ts index 60a1c500..b8b26074 100644 --- a/bindings/ProjectSyncConfig.ts +++ b/bindings/ProjectSyncConfig.ts @@ -1,4 +1,5 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { KanbanStatusMapping } from "./KanbanStatusMapping"; /** * Per-project/team sync configuration for a kanban provider @@ -12,9 +13,9 @@ export type ProjectSyncConfig = { */ sync_user_id: string, /** - * Workflow statuses to sync (empty = default/first status only) + * Mapping of operator todo/doing/done to external board columns */ -sync_statuses: Array, +status_mapping?: KanbanStatusMapping, /** * Optional `IssueTypeCollection` name this project maps to. * Not required for kanban onboarding or sync. diff --git a/bindings/ProviderCliArgs.ts b/bindings/ProviderCliArgs.ts new file mode 100644 index 00000000..db19b48b --- /dev/null +++ b/bindings/ProviderCliArgs.ts @@ -0,0 +1,18 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Arbitrary CLI arguments per provider + */ +export type ProviderCliArgs = { +/** + * CLI arguments for Claude + */ +claude: Array, +/** + * CLI arguments for Gemini + */ +gemini: Array, +/** + * CLI arguments for Codex + */ +codex: Array, }; diff --git a/bindings/RagConfig.ts b/bindings/RagConfig.ts new file mode 100644 index 00000000..fbc973e0 --- /dev/null +++ b/bindings/RagConfig.ts @@ -0,0 +1,23 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { RagSource } from "./RagSource"; + +/** + * Configuration for RAG (retrieval-augmented generation) steps + */ +export type RagConfig = { +/** + * Context sources to retrieve before running the prompt + */ +sources: Array, +/** + * Maximum tokens of context to inject (default: 50000) + */ +max_context_tokens?: number | null, +/** + * Agent/delegator to use + */ +agent?: string | null, +/** + * Tools allowed for the agent + */ +allowed_tools: Array, }; diff --git a/bindings/RagSource.ts b/bindings/RagSource.ts new file mode 100644 index 00000000..2375d780 --- /dev/null +++ b/bindings/RagSource.ts @@ -0,0 +1,26 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * A source of context for RAG steps + */ +export type RagSource = { "type": "glob", +/** + * Glob pattern relative to project root + */ +pattern: string, } | { "type": "file", +/** + * File path relative to project root + */ +path: string, } | { "type": "mcp", +/** + * MCP server name + */ +server: string, +/** + * Tool name on the MCP server + */ +tool: string, +/** + * Optional query template (Handlebars) + */ +query: string | null, }; diff --git a/bindings/ReviewType.ts b/bindings/ReviewType.ts new file mode 100644 index 00000000..63e513b3 --- /dev/null +++ b/bindings/ReviewType.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Type of review required for a step + */ +export type ReviewType = "none" | "plan" | "visual" | "pr"; diff --git a/bindings/SelectionStrategy.ts b/bindings/SelectionStrategy.ts new file mode 100644 index 00000000..3ee34946 --- /dev/null +++ b/bindings/SelectionStrategy.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Selection strategy for multi-prompt steps + */ +export type SelectionStrategy = "model_choice" | "scored"; diff --git a/bindings/StepOutput.ts b/bindings/StepOutput.ts new file mode 100644 index 00000000..26a0a12d --- /dev/null +++ b/bindings/StepOutput.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Types of outputs a step can produce + */ +export type StepOutput = "plan" | "code" | "test" | "pr" | "ticket" | "review" | "report" | "documentation"; diff --git a/bindings/StepPermissions.ts b/bindings/StepPermissions.ts new file mode 100644 index 00000000..6771417b --- /dev/null +++ b/bindings/StepPermissions.ts @@ -0,0 +1,26 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { CustomFlags } from "./CustomFlags"; +import type { DirectoryPermissions } from "./DirectoryPermissions"; +import type { McpServerPermissions } from "./McpServerPermissions"; +import type { ToolPermissions } from "./ToolPermissions"; + +/** + * Complete permission set for a step (as defined in issuetype schema) + */ +export type StepPermissions = { +/** + * Tool-level allow/deny lists + */ +tools: ToolPermissions, +/** + * Directory-level allow/deny lists + */ +directories: DirectoryPermissions, +/** + * MCP server enable/disable configuration + */ +mcp_servers: McpServerPermissions, +/** + * Per-provider custom configuration flags + */ +custom_flags: CustomFlags, }; diff --git a/bindings/StepSchema.ts b/bindings/StepSchema.ts new file mode 100644 index 00000000..1f06fb89 --- /dev/null +++ b/bindings/StepSchema.ts @@ -0,0 +1,123 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ClassifierConfig } from "./ClassifierConfig"; +import type { DelegatorStepConfig } from "./DelegatorStepConfig"; +import type { MatrixedConfig } from "./MatrixedConfig"; +import type { McpStepConfig } from "./McpStepConfig"; +import type { MultiModelConfig } from "./MultiModelConfig"; +import type { MultiPromptConfig } from "./MultiPromptConfig"; +import type { OnReject } from "./OnReject"; +import type { PermissionMode } from "./PermissionMode"; +import type { PipelineConfig } from "./PipelineConfig"; +import type { ProviderCliArgs } from "./ProviderCliArgs"; +import type { RagConfig } from "./RagConfig"; +import type { ReviewType } from "./ReviewType"; +import type { StepOutput } from "./StepOutput"; +import type { StepPermissions } from "./StepPermissions"; +import type { StepTypeTag } from "./StepTypeTag"; +import type { VisualReviewConfig } from "./VisualReviewConfig"; +import type { JsonValue } from "./serde_json/JsonValue"; + +/** + * Schema definition for a lifecycle step + */ +export type StepSchema = { +/** + * Step identifier (lowercase) + */ +name: string, +/** + * Human-readable step name + */ +display_name?: string | null, +/** + * Step type discriminator (defaults to "task" for backward compatibility) + */ +type: StepTypeTag, +/** + * Types of outputs this step produces + */ +outputs: Array, +/** + * Initial prompt template for the Claude agent + */ +prompt: string, +/** + * Type of review required for this step (none, plan, visual, pr) + */ +review_type: ReviewType, +/** + * Configuration for visual review (required when `review_type` is "visual") + */ +visual_config?: VisualReviewConfig | null, +/** + * What to do if step output is rejected + */ +on_reject?: OnReject | null, +/** + * Name of the next step (None for final step) + */ +next_step?: string | null, +/** + * Claude Code tools allowed in this step + */ +allowed_tools: Array, +/** + * Optional agent (delegator) name for this step (overrides ticket's default agent) + */ +agent?: string | null, +/** + * Provider-agnostic permissions for this step + */ +permissions?: StepPermissions | null, +/** + * Arbitrary CLI arguments per provider + */ +cli_args?: ProviderCliArgs | null, +/** + * Preferred LLM permission mode for this step + */ +permission_mode: PermissionMode, +/** + * Inline JSON schema for structured output (Claude-specific) + */ +jsonSchema?: JsonValue | null, +/** + * Path to JSON schema file for structured output (Claude-specific) + */ +jsonSchemaFile?: string | null, +/** + * File glob patterns in the worktree that signal this step is complete + */ +artifact_patterns: Array, +/** + * Configuration for classifier steps (required when type=classifier) + */ +classifier_config?: ClassifierConfig | null, +/** + * Configuration for RAG steps (required when type=rag) + */ +rag_config?: RagConfig | null, +/** + * Configuration for delegator steps (required when type=delegator) + */ +delegator_config?: DelegatorStepConfig | null, +/** + * Configuration for MCP steps (required when type=mcp) + */ +mcp_config?: McpStepConfig | null, +/** + * Configuration for multi-model steps (required when `type=multi_model`) + */ +multi_model_config?: MultiModelConfig | null, +/** + * Configuration for multi-prompt steps (required when `type=multi_prompt`) + */ +multi_prompt_config?: MultiPromptConfig | null, +/** + * Configuration for matrixed steps (required when type=matrixed) + */ +matrixed_config?: MatrixedConfig | null, +/** + * Configuration for pipeline steps (required when type=pipeline) + */ +pipeline_config?: PipelineConfig | null, }; diff --git a/bindings/StepTypeTag.ts b/bindings/StepTypeTag.ts new file mode 100644 index 00000000..a2ebeb16 --- /dev/null +++ b/bindings/StepTypeTag.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Discriminator tag for step types + */ +export type StepTypeTag = "task" | "classifier" | "rag" | "delegator" | "mcp" | "multi_model" | "multi_prompt" | "matrixed" | "pipeline"; diff --git a/bindings/TemplateSchema.ts b/bindings/TemplateSchema.ts new file mode 100644 index 00000000..a2bd683f --- /dev/null +++ b/bindings/TemplateSchema.ts @@ -0,0 +1,57 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ExecutionMode } from "./ExecutionMode"; +import type { FieldSchema } from "./FieldSchema"; +import type { StepSchema } from "./StepSchema"; + +/** + * Schema definition for an issuetype template + */ +export type TemplateSchema = { +/** + * Unique issuetype key (e.g., FEAT, FIX, SPIKE, INV, TASK) + */ +key: string, +/** + * Display name of the template type + */ +name: string, +/** + * Brief description of when to use this template + */ +description: string, +/** + * Whether this issuetype runs autonomously or requires human pairing + */ +mode: ExecutionMode, +/** + * Glyph character displayed in UI for this issuetype + */ +glyph: string, +/** + * Optional color for glyph display in TUI + */ +color?: string | null, +/** + * Whether a project must be specified for this issuetype + */ +project_required: boolean, +/** + * Field definitions for this template + */ +fields: Array, +/** + * Lifecycle steps for completing this ticket type + */ +steps: Array, +/** + * Optional prompt for work launching (interpolated with handlebars) + */ +prompt?: string | null, +/** + * Prompt for generating this issue type's operator agent via `claude -p` + */ +agent_prompt?: string | null, +/** + * Default delegator name for this issuetype (overridden by step.agent) + */ +agent?: string | null, }; diff --git a/bindings/ThemeColors.ts b/bindings/ThemeColors.ts deleted file mode 100644 index 5033c42f..00000000 --- a/bindings/ThemeColors.ts +++ /dev/null @@ -1,27 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Theme color configuration for Backstage - * Default colors match Operator's tmux theme - */ -export type ThemeColors = { -/** - * Primary/accent color (default: salmon #cc6c55) - */ -primary: string, -/** - * Secondary color (default: dark teal #114145) - */ -secondary: string, -/** - * Accent/highlight color (default: cream #f4dbb7) - */ -accent: string, -/** - * Warning/error color (default: coral #d46048) - */ -warning: string, -/** - * Muted text color (default: darker salmon #8a4a3a) - */ -muted: string, }; diff --git a/bindings/ToolPattern.ts b/bindings/ToolPattern.ts new file mode 100644 index 00000000..17f1ca71 --- /dev/null +++ b/bindings/ToolPattern.ts @@ -0,0 +1,14 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Provider-agnostic tool pattern + */ +export type ToolPattern = { +/** + * Tool name: Read, Write, Edit, Bash, Glob, Grep, `WebFetch`, etc. + */ +tool: string, +/** + * Optional pattern for tool arguments (e.g., "cargo test:*" for Bash) + */ +pattern?: string | null, }; diff --git a/bindings/ToolPermissions.ts b/bindings/ToolPermissions.ts new file mode 100644 index 00000000..da57ed3d --- /dev/null +++ b/bindings/ToolPermissions.ts @@ -0,0 +1,15 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { ToolPattern } from "./ToolPattern"; + +/** + * Tool-level permissions (allow/deny lists) + */ +export type ToolPermissions = { +/** + * Tools/patterns to allow + */ +allow: Array, +/** + * Tools/patterns to deny + */ +deny: Array, }; diff --git a/bindings/VisualReviewConfig.ts b/bindings/VisualReviewConfig.ts new file mode 100644 index 00000000..284d605e --- /dev/null +++ b/bindings/VisualReviewConfig.ts @@ -0,0 +1,18 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Configuration for visual review steps + */ +export type VisualReviewConfig = { +/** + * URL to open for visual check (supports handlebars templates) + */ +url: string, +/** + * Optional startup command (e.g., dev server) to run before opening browser + */ +startup_command?: string | null, +/** + * Timeout in seconds for server startup (default: 30) + */ +startup_timeout_secs?: number | null, }; diff --git a/bindings/VotingMode.ts b/bindings/VotingMode.ts new file mode 100644 index 00000000..b2e8dea7 --- /dev/null +++ b/bindings/VotingMode.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * How the voting round is executed in multi-model steps + */ +export type VotingMode = "single_judge" | "multi_voter"; diff --git a/bindings/VotingStrategy.ts b/bindings/VotingStrategy.ts new file mode 100644 index 00000000..983d231d --- /dev/null +++ b/bindings/VotingStrategy.ts @@ -0,0 +1,6 @@ +// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. + +/** + * Voting strategy for multi-model steps + */ +export type VotingStrategy = "majority" | "ranked" | "unanimous"; diff --git a/bindings/WriteGithubConfigBody.ts b/bindings/WriteGithubConfigBody.ts index 116ff8ae..db645fed 100644 --- a/bindings/WriteGithubConfigBody.ts +++ b/bindings/WriteGithubConfigBody.ts @@ -1,4 +1,5 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { KanbanStatusMapping } from "./KanbanStatusMapping"; /** * Body for writing a GitHub Projects v2 config section. @@ -21,4 +22,8 @@ project_key: string, /** * Numeric GitHub `databaseId` of the user whose items to sync */ -sync_user_id: string, }; +sync_user_id: string, +/** + * Mapping of operator todo/doing/done to external board columns + */ +status_mapping?: KanbanStatusMapping | null, }; diff --git a/bindings/WriteJiraConfigBody.ts b/bindings/WriteJiraConfigBody.ts index bb7b1fdb..9069358f 100644 --- a/bindings/WriteJiraConfigBody.ts +++ b/bindings/WriteJiraConfigBody.ts @@ -1,6 +1,11 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { KanbanStatusMapping } from "./KanbanStatusMapping"; /** * Body for writing a Jira project config section. */ -export type WriteJiraConfigBody = { domain: string, email: string, api_key_env: string, project_key: string, sync_user_id: string, }; +export type WriteJiraConfigBody = { domain: string, email: string, api_key_env: string, project_key: string, sync_user_id: string, +/** + * Mapping of operator todo/doing/done to external board columns + */ +status_mapping?: KanbanStatusMapping | null, }; diff --git a/bindings/WriteLinearConfigBody.ts b/bindings/WriteLinearConfigBody.ts index b9ae3e73..d07a051b 100644 --- a/bindings/WriteLinearConfigBody.ts +++ b/bindings/WriteLinearConfigBody.ts @@ -1,6 +1,11 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. +import type { KanbanStatusMapping } from "./KanbanStatusMapping"; /** * Body for writing a Linear project/team config section. */ -export type WriteLinearConfigBody = { workspace_key: string, api_key_env: string, project_key: string, sync_user_id: string, }; +export type WriteLinearConfigBody = { workspace_key: string, api_key_env: string, project_key: string, sync_user_id: string, +/** + * Mapping of operator todo/doing/done to external board columns + */ +status_mapping?: KanbanStatusMapping | null, }; diff --git a/catalog-info.yaml b/catalog-info.yaml deleted file mode 100644 index 9ed7c4b7..00000000 --- a/catalog-info.yaml +++ /dev/null @@ -1,74 +0,0 @@ -# Backstage Catalog Entity for operator -# Generated by assess agent -# Kind detected: cli-devtool (CLIs / Developer Tools) -# Tier: Ecosystem - -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: operator - title: Operator - description: Multi-agent orchestration dashboard for kanban shaped software development - TUI application for managing ticket queues, launching Claude Code agents, and tracking progress across projects. - annotations: - backstage.io/techdocs-ref: dir:. - github.com/project-slug: untra/operator - tags: - - rust - - cli - - tui - - developer-tools - - agent-orchestration - links: - - url: https://github.com/untra/operator - title: GitHub Repository - icon: github -spec: - type: tool - lifecycle: production - owner: platform-devops - system: untra - providesApis: - - operator-rest-api - dependsOn: - - resource:claude-code - - resource:tmux ---- -apiVersion: backstage.io/v1alpha1 -kind: API -metadata: - name: operator-rest-api - title: Operator REST API - description: REST API for issue type management, collections, and health checks. - tags: - - rest - - openapi -spec: - type: openapi - lifecycle: production - owner: platform-devops - system: untra - definition: | - openapi: 3.0.0 - info: - title: Operator REST API - version: 0.1.7 - paths: - /api/v1/health: - get: - summary: Health check - /api/v1/status: - get: - summary: Server status - /api/v1/issuetypes: - get: - summary: List issue types - post: - summary: Create issue type - /api/v1/issuetypes/{key}: - get: - summary: Get issue type - put: - summary: Update issue type - /api/v1/collections: - get: - summary: List collections diff --git a/codecov.yml b/codecov.yml index c0799ef8..bf4815bd 100644 --- a/codecov.yml +++ b/codecov.yml @@ -47,5 +47,4 @@ comment: ignore: - "tests/**" - - "backstage-server/**" - "vscode-extension/test/**" diff --git a/collections/README.md b/collections/README.md new file mode 100644 index 00000000..8a9f9d4d --- /dev/null +++ b/collections/README.md @@ -0,0 +1,52 @@ +# Community Collections + +This directory hosts **community-contributed issuetype collections** — shareable +AI workflow shapes that operator instances can browse and install from +[operator.untra.io/collections](https://operator.untra.io/collections/). + +Community collections are **hosted-only**: they are published to the docs site +by the docs generator but are never compiled into the operator binary. The +curated embedded set lives in `src/collections/`. + +## Contributing a collection + +> Working with an AI agent? Point it at +> [`.claude/commands/new-collection.md`](../.claude/commands/new-collection.md) +> (or run `/new-collection`) — it covers the design questions to answer first, +> the full schema, and the validation loop. + +1. Create `collections/community//` where `` matches + `^[a-z0-9_]{3,64}$` (e.g. `gastown_loop`). +2. Add a `collection.json` manifest conforming to + [the collection schema](https://operator.untra.io/collections/schema.json): + - `schema_version: 1` + - `id` equal to the directory name + - `tier: "community"` with **`author`, `url`, and `license`** (SPDX id) — + required for community submissions + - `issue_types`: 1–32 entries; keys match `^[A-Z][A-Z0-9_]{1,15}$` + (hyphens are reserved for the `{KEY}-{number}` ticket-id separator); + paths are bare filenames next to the manifest + - optional `workflow_hints` (loop shape, memory surfaces, review gates, + stop conditions) and `kanban_defaults.suggested_type_mappings` + (descriptive only — they inform users and onboarding, not execution) +3. Add one `.json` per issuetype conforming to + [the issuetype schema](https://operator.untra.io/schemas/issuetype.json), + plus an optional `.md` ticket template. +4. Add an `icon.svg` following the Operator icon standard — a single-path 24×24 + glyph with no `fill`/`stroke`/`width`/`height`, titled with the collection's + display name. Rules and rationale in `docs/design-system/`. +5. Do **not** set checksums — the docs generator computes them at publish time. Run the CI gates locally before opening a PR to ensure the collection is correctly structured: + + ```bash + cargo test --test community_collections + cargo test --test svg_icon_standard + ``` + +See `community/example_chores/` for a minimal working example. + +## Review expectations + +Submissions are reviewed for prompt quality and safety, not just schema +validity. A good collection describes a *workflow shape worth sharing*: +what loop it runs, what memory it keeps, what gates it enforces, and when +it stops. diff --git a/collections/community/example_chores/CHORE.json b/collections/community/example_chores/CHORE.json new file mode 100644 index 00000000..5db5f457 --- /dev/null +++ b/collections/community/example_chores/CHORE.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://operator.untra.io/schemas/issuetype.json", + "key": "CHORE", + "name": "Chore", + "description": "Small recurring maintenance task with a verification step", + "mode": "autonomous", + "glyph": "*", + "color": "cyan", + "project_required": true, + "fields": [ + { + "name": "id", + "description": "Ticket identifier", + "type": "string", + "required": true, + "auto": "id", + "display_order": 0 + }, + { + "name": "summary", + "description": "One-line description of the chore", + "type": "string", + "required": false, + "placeholder": "e.g. rotate dependency lockfiles", + "display_order": 1 + } + ], + "steps": [ + { + "name": "execute", + "display_name": "Executing", + "outputs": ["code", "report"], + "prompt": "Complete this maintenance chore:\n\n1. Read the ticket summary and context\n2. Make the smallest change that completes the chore\n3. Note anything that should become a follow-up ticket\n", + "review_type": "none", + "next_step": "verify" + }, + { + "name": "verify", + "display_name": "Verifying", + "outputs": ["report"], + "prompt": "Verify the chore is complete: run the project's test or lint command and summarize the result.\n", + "review_type": "none" + } + ] +} diff --git a/collections/community/example_chores/CHORE.md b/collections/community/example_chores/CHORE.md new file mode 100644 index 00000000..ef1ac300 --- /dev/null +++ b/collections/community/example_chores/CHORE.md @@ -0,0 +1,14 @@ +# Chore: {{ summary }} + +**Project**: {{ project }} +**Created**: {{ date }} + +## Context + +Describe why this chore matters and any constraints. + +## Definition of Done + +- [ ] The change is made and minimal +- [ ] Project checks pass +- [ ] Follow-ups (if any) are filed as new tickets diff --git a/collections/community/example_chores/collection.json b/collections/community/example_chores/collection.json new file mode 100644 index 00000000..a90a476d --- /dev/null +++ b/collections/community/example_chores/collection.json @@ -0,0 +1,44 @@ +{ + "schema_version": 1, + "id": "example_chores", + "name": "Example Chores", + "description": "Minimal example community collection demonstrating the shareable format.", + "version": "0.1.0", + "author": "untra", + "url": "https://github.com/untra/operator", + "license": "MIT", + "tags": [ + "example", + "starter" + ], + "tier": "community", + "icon_path": "icon.svg", + "created": "2026-07-01", + "updated": "2026-07-01", + "issue_types": [ + { + "key": "CHORE", + "schema_path": "CHORE.json", + "template_path": "CHORE.md" + } + ], + "workflow_hints": { + "loop_kind": "single_pass", + "memory_surfaces": [ + "ticket" + ], + "review_gates": [ + "test_suite" + ], + "external_tools": [ + "git" + ], + "stop_conditions": [ + "tests_green" + ], + "runner_semantics": "prompt_driven" + }, + "default_selected": [ + "CHORE" + ] +} diff --git a/collections/community/example_chores/icon.svg b/collections/community/example_chores/icon.svg new file mode 100644 index 00000000..13c68dc8 --- /dev/null +++ b/collections/community/example_chores/icon.svg @@ -0,0 +1 @@ +Example Chores diff --git a/docs/.tool-versions b/docs/.tool-versions new file mode 100644 index 00000000..d942ba84 --- /dev/null +++ b/docs/.tool-versions @@ -0,0 +1 @@ +ruby 3.1.7 diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index e2a3c2d2..b6f0842f 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -6,7 +6,7 @@ GEM base64 (0.3.0) bigdecimal (4.0.1) colorator (1.1.0) - concurrent-ruby (1.3.6) + concurrent-ruby (1.3.7) csv (3.3.5) em-websocket (0.5.3) eventmachine (>= 0.12.9) @@ -51,7 +51,7 @@ GEM jekyll (>= 3.7, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - json (2.19.5) + json (2.21.2) kramdown (2.5.1) rexml (>= 3.3.9) kramdown-parser-gfm (1.1.0) diff --git a/docs/_config.yml b/docs/_config.yml index 72ad07ce..70c9733a 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -27,6 +27,7 @@ exclude: - Gemfile.lock - vendor - typescript + - collections # Plugins plugins: diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index 83a63e4e..d1fc08f8 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -9,6 +9,8 @@ docs: url: /getting-started/platform-support/ - title: Installation url: /getting-started/installation/ + - title: Tickets + url: /getting-started/tickets/ - title: Supported Session Management url: /getting-started/sessions/ children: @@ -101,23 +103,6 @@ docs: children: - title: AGNT.gg url: /getting-started/integrations/agnt/ - - title: Core - children: - - title: Kanban - url: /kanban/ - codicon: layout - - title: Issue Types - url: /issue-types/ - codicon: issues - - title: Tickets - url: /tickets/ - codicon: note - - title: Agents - url: /agents/ - codicon: robot - children: - - title: Artifact Detection - url: /agents/artifact-detection/ - title: Reference children: - title: CLI @@ -135,6 +120,9 @@ docs: - title: Design System url: /design-system/ codicon: symbol-color + - title: Artifact Detection + url: /artifact-detection/ + codicon: file-binary - title: Taxonomy codicon: type-hierarchy children: diff --git a/docs/_includes/head.html b/docs/_includes/head.html index 80c70368..076c3fc4 100644 --- a/docs/_includes/head.html +++ b/docs/_includes/head.html @@ -23,5 +23,11 @@ + + {% if page.section == 'workflows' %} + + + {% endif %} + {% seo %} diff --git a/docs/_includes/sidebar.html b/docs/_includes/sidebar.html index 90d7b0dc..8263caaa 100644 --- a/docs/_includes/sidebar.html +++ b/docs/_includes/sidebar.html @@ -64,14 +64,15 @@ {% endfor %} +

Currently v{{ site.version }} |
diff --git a/docs/agents/index.md b/docs/agents/index.md deleted file mode 100644 index d95b7eab..00000000 --- a/docs/agents/index.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: Agents -description: "Understand agent lifecycle, states, autonomous vs paired modes, parallelism rules, and session tracking." -layout: doc ---- - -Agents are LLM-powered workers that execute tickets. Operator! manages their lifecycle and coordinates their work. - -## Agent Lifecycle - -``` -Created -> Running -> Completed - | - v - Awaiting Input -``` - -### States - -| State | Description | -|-------|-------------| -| **Created** | Agent initialized, not yet started | -| **Running** | Actively working on ticket | -| **Awaiting Input** | Needs human response | -| **Completed** | Work finished successfully | -| **Failed** | Error occurred | - -## Agent Modes - -### Autonomous Mode - -Used for: **FEAT**, **FIX** - -- Launch and monitor -- Minimal intervention -- Can run in parallel - -### Paired Mode - -Used for: **INV**, **SPIKE** - -- Active human participation -- Back-and-forth discussion -- One at a time per operator - -## Parallelism - -Operator! enforces parallelism rules: - -``` -Max agents = min(configured_max, cpu_cores - reserved) -``` - -### Rules - -1. **Different projects** - Autonomous agents can run in parallel -2. **Same project** - Sequential only (avoid conflicts) -3. **Paired agents** - One at a time - -## Tracking - -Operator! tracks agents in real-time: - -```json -{ - "agents": [ - { - "id": "agent-123", - "ticket": "FEAT-042", - "project": "backend", - "status": "running", - "started_at": "2024-01-15T10:30:00Z" - } - ] -} -``` - -## Sessions - -Agent sessions persist in `.operator/sessions/`: - -``` -.operator/ -├── state.json -├── sessions/ -│ ├── agent-123.json -│ └── agent-456.json -└── history.json -``` - -Session files contain: -- Ticket information -- Start/end times -- Status history -- Output logs - -## Best Practices - -1. **Monitor paired agents** - Stay engaged with INV/SPIKE -2. **Review autonomous work** - Check completed FEAT/FIX -3. **Handle failures promptly** - Address failed agents quickly -4. **Balance load** - Don't overload with too many agents diff --git a/docs/agents/artifact-detection.md b/docs/artifact-detection/index.md similarity index 96% rename from docs/agents/artifact-detection.md rename to docs/artifact-detection/index.md index 9909406b..a30ca7c6 100644 --- a/docs/agents/artifact-detection.md +++ b/docs/artifact-detection/index.md @@ -122,4 +122,4 @@ The `artifact_patterns` field is defined in the [Issue Type Schema](/schemas/iss } ``` -See [Issue Types](/issue-types/) for more on configuring steps. +See the [issue type schema](/schemas/issuetype/) for the full step structure, and [Workflows](/workflows/) for the collections that ship these steps. diff --git a/docs/assets/css/main.css b/docs/assets/css/main.css index 0c2b8cae..1af23e51 100644 --- a/docs/assets/css/main.css +++ b/docs/assets/css/main.css @@ -302,6 +302,28 @@ summary.nav-item-row::-webkit-details-marker { color: inherit; } +/* Workflows nav button — the collection catalog. + * A shade apart from both the sage (--color-green-l1) used by every ordinary + * nav link and the salmon Downloads button below it, so the two read as a pair + * of distinct calls to action rather than one repeated. */ +.sidebar-nav .workflows-link { + margin-top: 16px; +} + +.sidebar-nav .workflows-link a { + background: var(--color-green-l2); + color: var(--color-cream); + font-weight: 600; +} + +.sidebar-nav .workflows-link a:hover { + background: var(--color-cornflower); +} + +.sidebar-nav .workflows-link a.active { + background: var(--color-green-l3); +} + /* Downloads nav link - highlighted */ .sidebar-nav .downloads-link { margin-top: 16px; @@ -595,3 +617,164 @@ tr:hover { background-size: 92px 92px; } } + +/* ── Collection catalog (/workflows/) ───────────────────────────────────────── + * Cards and the table are both rendered statically by the collections-pages + * generator; `data-view` on the container decides which one is shown, and + * flips it. Without JavaScript the default view + * still renders in full. */ + +.collection-search { + display: flex; + flex-wrap: wrap; + gap: 8px; + align-items: center; + margin: 24px 0 16px; +} + +.collection-search input[type="search"] { + flex: 1 1 18rem; + min-width: 0; + padding: 8px 12px; + font: inherit; + font-size: 0.95rem; + color: var(--color-teal); + background: var(--color-white); + border: 1px solid var(--color-cornflower); + border-radius: 4px; +} + +.collection-search input[type="search"]:focus { + outline: 2px solid var(--color-green-l2); + outline-offset: 1px; +} + +.collection-view-toggle { + padding: 8px 14px; + font: inherit; + font-weight: 600; + color: var(--color-cream); + cursor: pointer; + background: var(--color-green-l1); + border: none; + border-radius: 4px; +} + +.collection-view-toggle:hover { + background: var(--color-green-l2); +} + +.collection-search-count { + font-size: 0.85rem; + color: var(--color-cornflower); +} + +/* One view at a time. Both are in the DOM so filtering keeps them in sync. */ +[data-view="cards"] > .collection-table, +[data-view="table"] > .collection-grid { + display: none; +} + +.collection-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr)); + gap: 16px; +} + +.collection-card { + display: flex; + flex-direction: column; + gap: 8px; + padding: 16px; + background: var(--color-white); + border: 1px solid var(--color-cornflower); + border-radius: 8px; +} + +.collection-card:hover { + border-color: var(--color-salmon); +} + +.collection-card-link { + display: flex; + gap: 10px; + align-items: center; + text-decoration: none; +} + +/* Inlined SVG, so it tints from the link color in both themes. */ +.collection-icon { + flex: none; + width: 28px; + height: 28px; + color: var(--color-salmon); + fill: currentColor; +} + +.collection-card-title { + margin: 0; + font-size: 1.05rem; + color: var(--color-green-l3); +} + +.collection-card-description, +.collection-card-types, +.collection-card-meta { + margin: 0; + font-size: 0.85rem; +} + +.collection-card-description { + flex: 1; + color: var(--color-teal); +} + +.collection-card-types code { + font-size: 0.75rem; +} + +.collection-card-meta { + display: flex; + flex-wrap: wrap; + gap: 8px; + align-items: center; + color: var(--color-cornflower); +} + +/* The table is wide by design; let it scroll rather than the page. */ +.collection-table { + display: table; + width: 100%; + overflow-x: auto; +} + +.collection-table .collection-icon { + width: 18px; + height: 18px; + margin-right: 6px; + vertical-align: -3px; +} + +#collection-catalog[data-empty="true"]::after { + display: block; + padding: 24px 0; + color: var(--color-cornflower); + content: "No collections match that filter."; +} + +/* Split view on a collection page: issue-type rail beside the graph. The + * component owns its internal layout; this only bounds it on the page. */ +.workflow-explorer { + margin: 16px 0 24px; +} + +[data-theme="dark"] .collection-card, +[data-theme="dark"] .collection-search input[type="search"] { + background-color: #1a2426; +} + +@media (max-width: 768px) { + .collection-grid { + grid-template-columns: 1fr; + } +} diff --git a/docs/assets/icons/anthropic.svg b/docs/assets/icons/anthropic.svg index c917480d..3408b26e 100644 --- a/docs/assets/icons/anthropic.svg +++ b/docs/assets/icons/anthropic.svg @@ -1 +1 @@ -Anthropic \ No newline at end of file +Anthropic diff --git a/docs/assets/icons/claude-dark.svg b/docs/assets/icons/claude-dark.svg deleted file mode 100644 index 96be6003..00000000 --- a/docs/assets/icons/claude-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - C - diff --git a/docs/assets/icons/claude-light.svg b/docs/assets/icons/claude-light.svg deleted file mode 100644 index 5797ebf5..00000000 --- a/docs/assets/icons/claude-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - C - diff --git a/docs/assets/icons/claude.svg b/docs/assets/icons/claude.svg index c33100cb..0f8385a6 100644 --- a/docs/assets/icons/claude.svg +++ b/docs/assets/icons/claude.svg @@ -1,3 +1 @@ - - - +Claude diff --git a/docs/assets/icons/cmux.svg b/docs/assets/icons/cmux.svg index 32f2b8f5..9e005499 100644 --- a/docs/assets/icons/cmux.svg +++ b/docs/assets/icons/cmux.svg @@ -1,3 +1 @@ - - - +cmux diff --git a/docs/assets/icons/coder.svg b/docs/assets/icons/coder.svg index a0acff3a..5356a1cb 100644 --- a/docs/assets/icons/coder.svg +++ b/docs/assets/icons/coder.svg @@ -1 +1 @@ -Coder \ No newline at end of file +Coder diff --git a/docs/assets/icons/codex.svg b/docs/assets/icons/codex.svg index 7997b3d2..99844e1d 100644 --- a/docs/assets/icons/codex.svg +++ b/docs/assets/icons/codex.svg @@ -1,3 +1 @@ - - - +Codex diff --git a/docs/assets/icons/cursor.svg b/docs/assets/icons/cursor.svg index 61303fbc..b9672494 100644 --- a/docs/assets/icons/cursor.svg +++ b/docs/assets/icons/cursor.svg @@ -1 +1 @@ -Cursor \ No newline at end of file +Cursor diff --git a/docs/assets/icons/gemini.svg b/docs/assets/icons/gemini.svg index a801d939..b21e43aa 100644 --- a/docs/assets/icons/gemini.svg +++ b/docs/assets/icons/gemini.svg @@ -1,3 +1 @@ - - - +Gemini diff --git a/docs/assets/icons/github.svg b/docs/assets/icons/github.svg index 8d44456c..23349765 100644 --- a/docs/assets/icons/github.svg +++ b/docs/assets/icons/github.svg @@ -1,3 +1 @@ - - - +GitHub diff --git a/docs/assets/icons/gitlab.svg b/docs/assets/icons/gitlab.svg index d99593fb..ab1286a2 100644 --- a/docs/assets/icons/gitlab.svg +++ b/docs/assets/icons/gitlab.svg @@ -1,3 +1 @@ - - - +GitLab diff --git a/docs/assets/icons/google.svg b/docs/assets/icons/google.svg index 2eaf9155..75543e0c 100644 --- a/docs/assets/icons/google.svg +++ b/docs/assets/icons/google.svg @@ -1 +1 @@ -Google \ No newline at end of file +Google diff --git a/docs/assets/icons/jira.svg b/docs/assets/icons/jira.svg index bb652f5a..8cc91ccf 100644 --- a/docs/assets/icons/jira.svg +++ b/docs/assets/icons/jira.svg @@ -1,3 +1 @@ - - - +Jira diff --git a/docs/assets/icons/linear.svg b/docs/assets/icons/linear.svg index 5c114d7c..ada2e9da 100644 --- a/docs/assets/icons/linear.svg +++ b/docs/assets/icons/linear.svg @@ -1,3 +1 @@ - - - +Linear diff --git a/docs/assets/icons/notification.svg b/docs/assets/icons/notification.svg index 72f41c13..3b0ebdf0 100644 --- a/docs/assets/icons/notification.svg +++ b/docs/assets/icons/notification.svg @@ -1,3 +1 @@ - - - +Notification diff --git a/docs/assets/icons/ollama.svg b/docs/assets/icons/ollama.svg index bc368e99..1c0ab7b6 100644 --- a/docs/assets/icons/ollama.svg +++ b/docs/assets/icons/ollama.svg @@ -1 +1 @@ -Ollama \ No newline at end of file +Ollama diff --git a/docs/assets/icons/openrouter.svg b/docs/assets/icons/openrouter.svg index 83ec807b..1d1e68cb 100644 --- a/docs/assets/icons/openrouter.svg +++ b/docs/assets/icons/openrouter.svg @@ -1 +1 @@ -OpenRouter \ No newline at end of file +OpenRouter diff --git a/docs/assets/icons/tmux.svg b/docs/assets/icons/tmux.svg index f22913b9..921c63bb 100644 --- a/docs/assets/icons/tmux.svg +++ b/docs/assets/icons/tmux.svg @@ -1,3 +1 @@ - - - +tmux diff --git a/docs/assets/icons/vscode.svg b/docs/assets/icons/vscode.svg index cfcccfc6..92f3ae83 100644 --- a/docs/assets/icons/vscode.svg +++ b/docs/assets/icons/vscode.svg @@ -1,3 +1 @@ - - - +Visual Studio Code diff --git a/docs/assets/icons/webhook.svg b/docs/assets/icons/webhook.svg index be5ace01..6bfc9efb 100644 --- a/docs/assets/icons/webhook.svg +++ b/docs/assets/icons/webhook.svg @@ -1,3 +1 @@ - - - +Webhook diff --git a/docs/assets/icons/zed.svg b/docs/assets/icons/zed.svg index 02327fd1..5c3fe595 100644 --- a/docs/assets/icons/zed.svg +++ b/docs/assets/icons/zed.svg @@ -1 +1 @@ -Zed Industries \ No newline at end of file +Zed diff --git a/docs/assets/icons/zellij.svg b/docs/assets/icons/zellij.svg index 0d4abed2..160b3c07 100644 --- a/docs/assets/icons/zellij.svg +++ b/docs/assets/icons/zellij.svg @@ -1,3 +1 @@ - - - +Zellij diff --git a/docs/collections/full/FIX.json b/docs/collections/coder/BUG.json similarity index 54% rename from docs/collections/full/FIX.json rename to docs/collections/coder/BUG.json index 39320e99..9a1a54a9 100644 --- a/docs/collections/full/FIX.json +++ b/docs/collections/coder/BUG.json @@ -1,14 +1,14 @@ { "$schema": "../../schemas/issuetype_schema.json", - "key": "FIX", - "name": "Fix", - "description": "Bug fix, follow-up work, tech debt, or refactoring ticket", + "key": "BUG", + "name": "Bug", + "description": "Defect report synced from the Linear Bug label with reproduce-first workflow", "mode": "autonomous", - "glyph": "#", - "color": "magenta", + "glyph": "x", + "color": "red", "project_required": true, - "agent_prompt": "Review this project and prepare to create an agent for bug fixes. The agent should read tickets from .tickets/, reproduce issues, implement minimal fixes, verify with tests, and create PRs. Output ONLY the agent system prompt.", - "prompt": "You are fixing a bug or addressing technical debt in the {{ project }} project.\n\nBefore starting, review the acceptance criteria and understand the root cause.\n\n## Acceptance Criteria\n{{ acceptance_criteria }}\n\n## Definition of Done\nFollow this definition of done before claiming success:\n{{ definition_of_done }}", + "agent_prompt": "Review this project and prepare to create an agent for fixing bugs. The agent should read tickets from .tickets/, reproduce issues with failing tests, implement minimal fixes, verify with tests, and create PRs. Output ONLY the agent system prompt.", + "prompt": "You are fixing a bug in the {{ project }} project.\n\nThis ticket may have been synced from Linear; the ticket body carries the source description and a link back to the Linear issue.\n\n## Current Behavior\n{{ current_behavior }}\n\n## Expected Behavior\n{{ expected_behavior }}\n\n## Steps to Reproduce\n{{ steps_to_reproduce }}\n\nReproduce first, then fix the root cause with the smallest change that resolves it.", "fields": [ { "name": "id", @@ -30,7 +30,7 @@ }, { "name": "severity", - "description": "Bug severity (if applicable)", + "description": "Bug severity", "type": "enum", "required": false, "default": "N/A", @@ -46,41 +46,41 @@ "display_order": 3, "user_editable": false }, - { - "name": "fix_type", - "description": "Type of fix work", - "type": "enum", - "required": false, - "default": "Bug fix", - "options": ["Bug fix", "Follow-up work", "Technical debt", "Refactoring", "Test coverage", "Documentation"], - "display_order": 4 - }, { "name": "summary", - "description": "name or summary of this bugfix", + "description": "Name or summary of this bug", "type": "string", "required": true, "default": "", - "placeholder": "Brief description of what needs to be fixed", + "placeholder": "Brief description of the defect", "max_length": 120, + "display_order": 4 + }, + { + "name": "current_behavior", + "description": "What happens today (the defect)", + "type": "text", + "required": false, + "default": "", + "placeholder": "Observed behavior, error messages, log excerpts", "display_order": 5 }, { - "name": "parent", - "description": "Parent / Epic ticket ID", - "type": "string", + "name": "expected_behavior", + "description": "What should happen instead", + "type": "text", "required": false, "default": "", - "placeholder": "Parent ticket ID if applicable", + "placeholder": "Correct behavior once fixed", "display_order": 6 }, { - "name": "user_story", - "description": "Context for the fix (steps to reproduce, background)", + "name": "steps_to_reproduce", + "description": "How to trigger the defect", "type": "text", "required": false, "default": "", - "placeholder": "Steps to reproduce bug, or context for tech debt", + "placeholder": "1. Do X\n2. Do Y\n3. Observe Z", "display_order": 7 } ], @@ -89,9 +89,10 @@ "name": "plan", "display_name": "Planning", "outputs": ["plan"], - "prompt": "Assess the project and plan reproduction:\n\n1. Understand the project structure\n2. Find how to run the project and tests\n3. Locate applicable test code\n4. Create a plan to reproduce the bug\n\nWrite plan to `.tickets/plans/{{ id }}.md` with:\n- How to run the project\n- Relevant test commands\n- Steps to reproduce the issue\n- Initial hypotheses about the root cause", + "prompt": "Assess the project and plan reproduction:\n\n1. Understand the project structure\n2. Find how to run the project and tests\n3. Locate code likely involved in the defect\n\n## Current Behavior\n{{ current_behavior }}\n\n## Expected Behavior\n{{ expected_behavior }}\n\n## Steps to Reproduce\n{{ steps_to_reproduce }}\n\nWrite a plan to `.tickets/plans/{{ id }}.md` with:\n- How to run the project and relevant test commands\n- Steps to reproduce the issue\n- Initial hypotheses about the root cause", "allowed_tools": ["Read", "Glob", "Grep", "Write", "Bash"], "review_type": "plan", + "artifact_patterns": [".tickets/plans/{{ id }}.md"], "on_reject": { "goto_step": "plan", "prompt": "Plan rejected: {{ rejection_reason }}\n\nRevise the reproduction plan." @@ -102,7 +103,7 @@ "name": "reproduce", "display_name": "Reproducing", "outputs": ["test", "report"], - "prompt": "Reproduce the bug:\n\n1. Follow the plan to reproduce the issue\n2. Write a failing test that demonstrates the bug\n3. Document the reproduction in `.tickets/notes/{{ id }}.md`\n4. Confirm the test fails as expected", + "prompt": "Reproduce the bug:\n\n1. Follow the plan to reproduce the issue\n2. Write a failing test that demonstrates the defect\n3. Document the reproduction in `.tickets/notes/{{ id }}.md`\n4. Confirm the test fails for the expected reason", "allowed_tools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"], "next_step": "test" }, @@ -110,7 +111,7 @@ "name": "test", "display_name": "Baseline Testing", "outputs": ["report"], - "prompt": "Establish test baseline:\n\n1. Run full test suite to understand current state\n2. Document which tests pass/fail\n3. Identify any related test coverage gaps\n4. Note any flaky or slow tests", + "prompt": "Establish test baseline:\n\n1. Run the full test suite to understand current state\n2. Document which tests pass/fail\n3. Identify any related test coverage gaps\n4. Note any flaky or slow tests", "allowed_tools": ["Read", "Bash"], "next_step": "fix" }, @@ -118,17 +119,17 @@ "name": "fix", "display_name": "Fixing", "outputs": ["code"], - "prompt": "Implement the fix:\n\n1. Apply minimal fix to address the root cause\n2. Verify the previously failing test now passes\n3. Run full test suite: `cargo test`\n4. Run linting: `cargo clippy`\n5. Run formatting: `cargo fmt`\n\nKeep the fix focused and minimal.", + "prompt": "Implement the fix:\n\n1. Apply a minimal fix addressing the root cause\n2. Verify the previously failing test now passes\n3. Run the project's full test suite\n4. Run the project's linter and formatter\n\nKeep the fix focused and minimal.", "allowed_tools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"], "next_step": "deploy" }, { "name": "deploy", "display_name": "Deploying", - "outputs": ["review"], - "prompt": "Create a pull request for the fix:\n\n1. Commit all changes with message: `fix({{ project }}): {{ summary }}`\n2. Push the fix branch\n3. Create a PR with:\n - Root cause analysis\n - Description of the fix\n - Test verification\n - Link to ticket: {{ id }}\n\nFix complete. Move ticket to completed after PR is merged.", + "outputs": ["pr"], + "prompt": "Create a pull request for the fix:\n\n1. Commit all changes with message: `fix({{ project }}): {{ summary }}`\n2. Push the fix branch\n3. Create a PR with:\n - Root cause analysis\n - Description of the fix\n - Test verification\n - Link to ticket: {{ id }}\n\nIf the ticket links a Linear issue, reference it in the PR body so Linear links the PR.\n\nFix complete. Move ticket to completed after PR is merged.", "allowed_tools": ["Bash", "Read"], - "review_type": "plan", + "review_type": "pr", "on_reject": { "goto_step": "fix", "prompt": "Deploy rejected: {{ rejection_reason }}\n\nAddress feedback and revise the fix." diff --git a/docs/collections/coder/BUG.md b/docs/collections/coder/BUG.md new file mode 100644 index 00000000..e054b47d --- /dev/null +++ b/docs/collections/coder/BUG.md @@ -0,0 +1,23 @@ +--- +id: {{ id }} +{{#if step }}step: {{ step }} +{{/if}}status: {{ status }} +created: {{ created_datetime }} +branch: {{ branch }} +{{#if priority }}priority: {{ priority }} +{{/if}}--- + +# Bug: {{ summary }} + +{{#if current_behavior }} +## Current Behavior +{{ current_behavior }} +{{/if}} +{{#if expected_behavior }} +## Expected Behavior +{{ expected_behavior }} +{{/if}} +{{#if steps_to_reproduce }} +## Steps to Reproduce +{{ steps_to_reproduce }} +{{/if}} diff --git a/docs/collections/full/FEAT.json b/docs/collections/coder/FEATURE.json similarity index 75% rename from docs/collections/full/FEAT.json rename to docs/collections/coder/FEATURE.json index 1574db95..e79eeacd 100644 --- a/docs/collections/full/FEAT.json +++ b/docs/collections/coder/FEATURE.json @@ -1,14 +1,14 @@ { "$schema": "../../schemas/issuetype_schema.json", - "key": "FEAT", + "key": "FEATURE", "name": "Feature", - "description": "New feature or enhancement ticket", + "description": "New functionality synced from the Linear Feature label", "mode": "autonomous", - "glyph": "*", + "glyph": "+", "color": "green", "project_required": true, "agent_prompt": "Review this project and prepare to create an agent for implementing new features. The agent should read tickets from .tickets/, create feature branches, implement code following existing patterns, run tests and linting, and create PRs. Output ONLY the agent system prompt.", - "prompt": "You are implementing a new feature for the {{ project }} project.\n\nBefore starting, review the acceptance criteria and understand the requirements.\n\n## Acceptance Criteria\n{{ acceptance_criteria }}\n\n## Definition of Done\nFollow this definition of done before claiming success:\n{{ definition_of_done }}", + "prompt": "You are implementing a new feature for the {{ project }} project.\n\nThis ticket may have been synced from Linear; the ticket body carries the source description and a link back to the Linear issue.\n\n## User Story\n{{ user_story }}\n\nBefore starting, understand the requirements and how success will be judged.", "fields": [ { "name": "id", @@ -39,7 +39,7 @@ }, { "name": "summary", - "description": "name or summary of this feature", + "description": "Name or summary of this feature", "type": "string", "required": true, "default": "", @@ -55,6 +55,22 @@ "default": "", "placeholder": "As a USER, I want to X, so I can Y", "display_order": 4 + }, + { + "name": "estimate", + "description": "Estimate points (from Linear)", + "type": "integer", + "required": false, + "display_order": 5 + }, + { + "name": "customer", + "description": "Requesting customer (from Linear)", + "type": "string", + "required": false, + "default": "", + "placeholder": "Customer name if applicable", + "display_order": 6 } ], "steps": [ @@ -65,6 +81,7 @@ "prompt": "You are implementing a new feature. First, read the ticket and explore the codebase to understand:\n1. Where the feature should be implemented\n2. What existing code/patterns to follow\n3. What tests need to be added\n\nCreate a detailed implementation plan in `.tickets/plans/{{ id }}.md` with:\n- Files to create/modify\n- Key implementation steps\n- Test coverage requirements\n- Any dependencies or risks", "allowed_tools": ["Read", "Glob", "Grep", "Write"], "review_type": "plan", + "artifact_patterns": [".tickets/plans/{{ id }}.md"], "on_reject": { "goto_step": "plan", "prompt": "Plan rejected: {{ rejection_reason }}\n\nRevise the plan based on feedback." @@ -83,16 +100,15 @@ "name": "code", "display_name": "Coding", "outputs": ["code"], - "prompt": "Implement the feature logic based on the plan and structure.\n\nGuidelines:\n- Follow existing code patterns and conventions\n- Add appropriate comments for complex logic\n- Keep changes minimal and focused\n- Run formatters after making changes", + "prompt": "Implement the feature logic based on the plan and structure.\n\nGuidelines:\n- Follow existing code patterns and conventions\n- Keep changes minimal and focused\n- Run formatters after making changes", "allowed_tools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"], - "agent": "claude-opus", "next_step": "test" }, { "name": "test", "display_name": "Testing", "outputs": ["test", "code"], - "prompt": "Add tests for the new feature and ensure all tests pass.\n\n1. Write unit tests for new functions/modules\n2. Add integration tests if applicable\n3. Run the full test suite: `cargo test`\n4. Run linting: `cargo clippy`\n5. Run formatting: `cargo fmt`\n\nFix any failures before proceeding.", + "prompt": "Add tests for the new feature and ensure all tests pass.\n\n1. Write unit tests for new functions/modules\n2. Add integration tests if applicable\n3. Run the project's full test suite\n4. Run the project's linter and formatter\n\nFix any failures before proceeding.", "allowed_tools": ["Read", "Write", "Edit", "Bash"], "next_step": "deploy" }, @@ -100,7 +116,7 @@ "name": "deploy", "display_name": "Deploying", "outputs": ["pr"], - "prompt": "Create a pull request for the feature:\n\n1. Commit all changes with a descriptive message\n2. Push the feature branch\n3. Create a PR with:\n - Clear title: `feat({{ project }}): {{ summary }}`\n - Description of changes\n - Link to ticket: {{ id }}\n - Test instructions\n\nFeature complete. Move ticket to completed after PR is merged.", + "prompt": "Create a pull request for the feature:\n\n1. Commit all changes with a descriptive message\n2. Push the feature branch\n3. Create a PR with:\n - Clear title: `feat({{ project }}): {{ summary }}`\n - Description of changes\n - Link to ticket: {{ id }}\n - Test instructions\n\nIf the ticket links a Linear issue, reference it in the PR body so Linear links the PR.\n\nFeature complete. Move ticket to completed after PR is merged.", "allowed_tools": ["Bash", "Read"], "review_type": "pr", "on_reject": { diff --git a/docs/collections/full/FEAT.md b/docs/collections/coder/FEATURE.md similarity index 67% rename from docs/collections/full/FEAT.md rename to docs/collections/coder/FEATURE.md index 10d13ae3..7c5d680b 100644 --- a/docs/collections/full/FEAT.md +++ b/docs/collections/coder/FEATURE.md @@ -9,7 +9,11 @@ branch: {{ branch }} # Feature: {{ summary }} -{{#if context }} -## Context -{{ context }} +{{#if user_story }} +## User Story +{{ user_story }} +{{/if}} +{{#if customer }} +## Customer +{{ customer }} {{/if}} diff --git a/docs/collections/coder/IMPROVEMENT.json b/docs/collections/coder/IMPROVEMENT.json new file mode 100644 index 00000000..959d5094 --- /dev/null +++ b/docs/collections/coder/IMPROVEMENT.json @@ -0,0 +1,120 @@ +{ + "$schema": "../../schemas/issuetype_schema.json", + "key": "IMPROVEMENT", + "name": "Improvement", + "description": "Enhancement to existing behavior synced from the Linear Improvement label", + "mode": "autonomous", + "glyph": "^", + "color": "blue", + "project_required": true, + "agent_prompt": "Review this project and prepare to create an agent for improving existing functionality. The agent should read tickets from .tickets/, scope the smallest change that delivers the improvement, implement it following existing patterns, run tests and linting, and create PRs. Output ONLY the agent system prompt.", + "prompt": "You are improving existing functionality in the {{ project }} project.\n\nThis ticket may have been synced from Linear; the ticket body carries the source description and a link back to the Linear issue.\n\n## Motivation\n{{ motivation }}\n\nPrefer the smallest change that delivers the improvement. Do not expand scope.", + "fields": [ + { + "name": "id", + "description": "Unique ticket identifier", + "type": "string", + "required": true, + "auto": "id", + "display_order": 0, + "user_editable": false + }, + { + "name": "priority", + "description": "Ticket priority level", + "type": "enum", + "required": false, + "default": "P2-medium", + "options": ["P0-critical", "P1-high", "P2-medium", "P3-low"], + "display_order": 1 + }, + { + "name": "branch", + "description": "Git branch name", + "type": "string", + "required": true, + "auto": "branch", + "display_order": 2, + "user_editable": false + }, + { + "name": "summary", + "description": "Name or summary of this improvement", + "type": "string", + "required": true, + "default": "", + "placeholder": "Brief description of the improvement", + "max_length": 120, + "display_order": 3 + }, + { + "name": "motivation", + "description": "What is inadequate today, and what does better look like?", + "type": "text", + "required": false, + "default": "", + "placeholder": "Current shortcoming and the expected improvement", + "display_order": 4 + }, + { + "name": "estimate", + "description": "Estimate points (from Linear)", + "type": "integer", + "required": false, + "display_order": 5 + }, + { + "name": "customer", + "description": "Requesting customer (from Linear)", + "type": "string", + "required": false, + "default": "", + "placeholder": "Customer name if applicable", + "display_order": 6 + } + ], + "steps": [ + { + "name": "plan", + "display_name": "Planning", + "outputs": ["plan"], + "prompt": "You are improving existing functionality. First, read the ticket and locate the current behavior in the codebase:\n1. Find the code that implements today's behavior\n2. Understand why it is inadequate ({{ motivation }})\n3. Identify the smallest change that delivers the improvement\n\nCreate a focused plan in `.tickets/plans/{{ id }}.md` with:\n- The current behavior and where it lives\n- The proposed change, scoped minimally - no scope creep\n- How existing tests must change, and what new coverage is needed\n- Any behavior changes callers/users will notice", + "allowed_tools": ["Read", "Glob", "Grep", "Write"], + "review_type": "plan", + "artifact_patterns": [".tickets/plans/{{ id }}.md"], + "on_reject": { + "goto_step": "plan", + "prompt": "Plan rejected: {{ rejection_reason }}\n\nRevise the plan based on feedback." + }, + "next_step": "code" + }, + { + "name": "code", + "display_name": "Coding", + "outputs": ["code"], + "prompt": "Implement the improvement per the plan in `.tickets/plans/{{ id }}.md`.\n\nGuidelines:\n- Change only what the plan scoped; resist adjacent cleanups\n- Follow existing code patterns and conventions\n- Preserve existing behavior outside the improvement\n- Run formatters after making changes", + "allowed_tools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"], + "next_step": "test" + }, + { + "name": "test", + "display_name": "Testing", + "outputs": ["test", "code"], + "prompt": "Verify the improvement and guard against regressions.\n\n1. Update tests that asserted the old behavior\n2. Add tests demonstrating the improved behavior\n3. Run the project's full test suite\n4. Run the project's linter and formatter\n\nFix any failures before proceeding.", + "allowed_tools": ["Read", "Write", "Edit", "Bash"], + "next_step": "deploy" + }, + { + "name": "deploy", + "display_name": "Deploying", + "outputs": ["pr"], + "prompt": "Create a pull request for the improvement:\n\n1. Commit all changes with a descriptive message\n2. Push the branch\n3. Create a PR with:\n - Clear title: `improve({{ project }}): {{ summary }}`\n - Before/after description of the behavior\n - Link to ticket: {{ id }}\n - Test instructions\n\nIf the ticket links a Linear issue, reference it in the PR body so Linear links the PR.\n\nImprovement complete. Move ticket to completed after PR is merged.", + "allowed_tools": ["Bash", "Read"], + "review_type": "pr", + "on_reject": { + "goto_step": "code", + "prompt": "Deploy rejected: {{ rejection_reason }}\n\nAddress feedback and revise the implementation." + } + } + ] +} diff --git a/docs/collections/coder/IMPROVEMENT.md b/docs/collections/coder/IMPROVEMENT.md new file mode 100644 index 00000000..13b5e7ef --- /dev/null +++ b/docs/collections/coder/IMPROVEMENT.md @@ -0,0 +1,19 @@ +--- +id: {{ id }} +{{#if step }}step: {{ step }} +{{/if}}status: {{ status }} +created: {{ created_datetime }} +branch: {{ branch }} +{{#if priority }}priority: {{ priority }} +{{/if}}--- + +# Improvement: {{ summary }} + +{{#if motivation }} +## Motivation +{{ motivation }} +{{/if}} +{{#if customer }} +## Customer +{{ customer }} +{{/if}} diff --git a/docs/collections/coder/collection.json b/docs/collections/coder/collection.json new file mode 100644 index 00000000..fd0c9d51 --- /dev/null +++ b/docs/collections/coder/collection.json @@ -0,0 +1,80 @@ +{ + "schema_version": 1, + "id": "coder", + "name": "Coder", + "description": "Linear-synced engineering flow: Feature, Improvement, and Bug work delegated to coding agents.", + "version": "1.0.0", + "publisher": "untra", + "author": "untra", + "url": "https://github.com/untra/operator", + "license": "MIT", + "tags": [ + "community", + "linear", + "kanban", + "engineering" + ], + "compatibility": null, + "tier": "community", + "icon_path": "icon.svg", + "created": "2026-08-01", + "updated": "2026-08-01", + "kanban_defaults": { + "suggested_type_mappings": { + "Bug": "BUG", + "Feature": "FEATURE", + "Improvement": "IMPROVEMENT" + } + }, + "issue_types": [ + { + "key": "FEATURE", + "schema_path": "FEATURE.json", + "schema_checksum": "1d8146f05bacf6db3c568eebb040c2082a3f64b71e7b6c2eb8d0895357ed99a4", + "template_path": "FEATURE.md", + "template_checksum": "57bd76a8423725e27520a89ed8704f47e7a620a5d6d8c044058f492311027786" + }, + { + "key": "IMPROVEMENT", + "schema_path": "IMPROVEMENT.json", + "schema_checksum": "810c73ac51239e6f7327529b9b48ca0ba0522a0fdeadff76cdc6835d074ee440", + "template_path": "IMPROVEMENT.md", + "template_checksum": "9140c8c2ee7833c0158596a43f8e492cff24f5400631c161b5e8226699a7268a" + }, + { + "key": "BUG", + "schema_path": "BUG.json", + "schema_checksum": "7f5b5d4682893d9f6ba4da2f461893bafa8e93d88eace3f5f068caf32589c37e", + "template_path": "BUG.md", + "template_checksum": "f03d4a2fc843553d42d281c6af9054348f42e0ebf11c0562e37c97a0b7261467" + } + ], + "workflow_hints": { + "loop_kind": "kanban_synced_single_pass", + "memory_surfaces": [ + "ticket", + ".tickets/plans/{{ id }}.md" + ], + "review_gates": [ + "plan_review", + "test_suite", + "pr_review" + ], + "external_tools": [ + "git", + "gh", + "linear" + ], + "stop_conditions": [ + "tests_green", + "pr_created" + ], + "runner_semantics": "prompt_driven" + }, + "default_selected": [ + "FEATURE", + "IMPROVEMENT", + "BUG" + ], + "checksum": "b677f89b72755cc2314622bb8148065527f83b7a31c83859b043f8bbb18bda38" +} diff --git a/docs/collections/coder/icon.svg b/docs/collections/coder/icon.svg new file mode 100644 index 00000000..5356a1cb --- /dev/null +++ b/docs/collections/coder/icon.svg @@ -0,0 +1 @@ +Coder diff --git a/docs/collections/dev_kanban/collection.json b/docs/collections/dev_kanban/collection.json index 76d13a50..1f361b19 100644 --- a/docs/collections/dev_kanban/collection.json +++ b/docs/collections/dev_kanban/collection.json @@ -14,6 +14,11 @@ "dev" ], "compatibility": null, + "tier": "official", + "icon_path": "icon.svg", + "created": "2026-01-08", + "updated": "2026-06-16", + "kanban_defaults": null, "issue_types": [ { "key": "TASK", diff --git a/docs/collections/dev_kanban/icon.svg b/docs/collections/dev_kanban/icon.svg new file mode 100644 index 00000000..13516744 --- /dev/null +++ b/docs/collections/dev_kanban/icon.svg @@ -0,0 +1 @@ +Dev Kanban diff --git a/docs/collections/devops_kanban/collection.json b/docs/collections/devops_kanban/collection.json index 3866784d..3f88b247 100644 --- a/docs/collections/devops_kanban/collection.json +++ b/docs/collections/devops_kanban/collection.json @@ -14,6 +14,11 @@ "devops" ], "compatibility": null, + "tier": "official", + "icon_path": "icon.svg", + "created": "2026-01-08", + "updated": "2026-06-16", + "kanban_defaults": null, "issue_types": [ { "key": "TASK", diff --git a/docs/collections/devops_kanban/icon.svg b/docs/collections/devops_kanban/icon.svg new file mode 100644 index 00000000..db59a314 --- /dev/null +++ b/docs/collections/devops_kanban/icon.svg @@ -0,0 +1 @@ +DevOps Kanban diff --git a/docs/collections/elves_overnight/collection.json b/docs/collections/elves_overnight/collection.json index 70c6661d..4c6490f7 100644 --- a/docs/collections/elves_overnight/collection.json +++ b/docs/collections/elves_overnight/collection.json @@ -15,6 +15,11 @@ "elves" ], "compatibility": null, + "tier": "community", + "icon_path": "icon.svg", + "created": "2026-06-16", + "updated": "2026-07-01", + "kanban_defaults": null, "issue_types": [ { "key": "ELVSTAGE", diff --git a/docs/collections/elves_overnight/icon.svg b/docs/collections/elves_overnight/icon.svg new file mode 100644 index 00000000..0e288457 --- /dev/null +++ b/docs/collections/elves_overnight/icon.svg @@ -0,0 +1 @@ +Elves Overnight diff --git a/docs/collections/example_chores/CHORE.json b/docs/collections/example_chores/CHORE.json new file mode 100644 index 00000000..5db5f457 --- /dev/null +++ b/docs/collections/example_chores/CHORE.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://operator.untra.io/schemas/issuetype.json", + "key": "CHORE", + "name": "Chore", + "description": "Small recurring maintenance task with a verification step", + "mode": "autonomous", + "glyph": "*", + "color": "cyan", + "project_required": true, + "fields": [ + { + "name": "id", + "description": "Ticket identifier", + "type": "string", + "required": true, + "auto": "id", + "display_order": 0 + }, + { + "name": "summary", + "description": "One-line description of the chore", + "type": "string", + "required": false, + "placeholder": "e.g. rotate dependency lockfiles", + "display_order": 1 + } + ], + "steps": [ + { + "name": "execute", + "display_name": "Executing", + "outputs": ["code", "report"], + "prompt": "Complete this maintenance chore:\n\n1. Read the ticket summary and context\n2. Make the smallest change that completes the chore\n3. Note anything that should become a follow-up ticket\n", + "review_type": "none", + "next_step": "verify" + }, + { + "name": "verify", + "display_name": "Verifying", + "outputs": ["report"], + "prompt": "Verify the chore is complete: run the project's test or lint command and summarize the result.\n", + "review_type": "none" + } + ] +} diff --git a/docs/collections/example_chores/CHORE.md b/docs/collections/example_chores/CHORE.md new file mode 100644 index 00000000..ef1ac300 --- /dev/null +++ b/docs/collections/example_chores/CHORE.md @@ -0,0 +1,14 @@ +# Chore: {{ summary }} + +**Project**: {{ project }} +**Created**: {{ date }} + +## Context + +Describe why this chore matters and any constraints. + +## Definition of Done + +- [ ] The change is made and minimal +- [ ] Project checks pass +- [ ] Follow-ups (if any) are filed as new tickets diff --git a/docs/collections/example_chores/collection.json b/docs/collections/example_chores/collection.json new file mode 100644 index 00000000..eb21c176 --- /dev/null +++ b/docs/collections/example_chores/collection.json @@ -0,0 +1,50 @@ +{ + "schema_version": 1, + "id": "example_chores", + "name": "Example Chores", + "description": "Minimal example community collection demonstrating the shareable format.", + "version": "0.1.0", + "publisher": null, + "author": "untra", + "url": "https://github.com/untra/operator", + "license": "MIT", + "tags": [ + "example", + "starter" + ], + "compatibility": null, + "tier": "community", + "icon_path": "icon.svg", + "created": "2026-07-01", + "updated": "2026-07-01", + "kanban_defaults": null, + "issue_types": [ + { + "key": "CHORE", + "schema_path": "CHORE.json", + "schema_checksum": "feeabd2aef3de61dfd7b5760d58f104519cc5f8152718b0dfa1221da8c5852d7", + "template_path": "CHORE.md", + "template_checksum": "7e85067ba98ce97c0dd632704c744d2d7da60248051b1a0db7c18b524a018496" + } + ], + "workflow_hints": { + "loop_kind": "single_pass", + "memory_surfaces": [ + "ticket" + ], + "review_gates": [ + "test_suite" + ], + "external_tools": [ + "git" + ], + "stop_conditions": [ + "tests_green" + ], + "runner_semantics": "prompt_driven" + }, + "default_selected": [ + "CHORE" + ], + "checksum": "f16a9b3bf3e907358a73af2904e755cf42ba8179d8967a8130943e8c5042c157" +} diff --git a/docs/collections/example_chores/icon.svg b/docs/collections/example_chores/icon.svg new file mode 100644 index 00000000..13c68dc8 --- /dev/null +++ b/docs/collections/example_chores/icon.svg @@ -0,0 +1 @@ +Example Chores diff --git a/docs/collections/full/ASSESS.json b/docs/collections/full/ASSESS.json deleted file mode 100644 index 4b2c4671..00000000 --- a/docs/collections/full/ASSESS.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "$schema": "../../schemas/issuetype_schema.json", - "key": "ASSESS", - "name": "Project Assessment", - "description": "Analyze project structure and generate project-context.json and catalog-info.yaml", - "mode": "autonomous", - "glyph": "~", - "color": "magenta", - "project_required": true, - "agent_prompt": "Review this project to create an agent for project assessment. The agent analyzes project structure, detects the project Kind from file patterns (using the 25-Kind taxonomy), identifies commands/entry points/environment variables, and generates both project-context.json (for AI agents) and catalog-info.yaml (for project catalog). Output ONLY the agent system prompt.", - "fields": [ - { - "name": "id", - "description": "Unique ticket identifier", - "type": "string", - "required": true, - "auto": "id", - "display_order": 0, - "user_editable": false - }, - { - "name": "summary", - "description": "Assessment description", - "type": "string", - "required": true, - "default": "", - "placeholder": "Assess project structure", - "max_length": 120, - "display_order": 1 - }, - { - "name": "kind_override", - "description": "Override detected Kind (optional)", - "type": "string", - "required": false, - "default": "", - "placeholder": "e.g., microservice, infrastructure", - "display_order": 2 - } - ], - "steps": [ - { - "name": "analyze", - "display_name": "Analyzing", - "outputs": ["report"], - "jsonSchemaFile": ".tickets/schemas/project_analysis.schema.json", - "prompt": "Analyze the project structure and output structured JSON conforming to the schema:\n\n1. **Kind Detection**: Match file patterns against the 25-Kind taxonomy:\n - Foundation: infrastructure, identity-access, config-policy, monorepo-meta\n - Standards: design-system, software-library, proto-sdk, blueprint, security-tooling, compliance-audit\n - Engines: ml-model, data-etl, microservice, api-gateway, ui-frontend, internal-tool\n - Ecosystem: build-tool, e2e-test, docs-site, playbook, cli-devtool\n - Noncurrent: reference-example, experiment-sandbox, archival-fork, test-data-fixtures\n\n2. **Languages/Frameworks/Databases**: Detect from manifest files (package.json, Cargo.toml, requirements.txt, go.mod), imports, and file extensions.\n\n3. **Commands**: Extract from:\n - package.json scripts (start, dev, test, build, lint)\n - Makefile targets\n - Cargo.toml [[bin]] sections\n - Scripts in bin/ or scripts/\n\n4. **Entry Points**: Identify key files:\n - binary_entry: src/main.rs, index.js, main.py\n - library_entry: src/lib.rs, lib/index.js\n - config: config/*.toml, .env.example\n - routes: src/routes.rs, routes/*.ts\n - main_component: src/App.tsx, src/App.vue\n\n5. **Environment Variables**: Scan .env.example, docker-compose.yml, config files for required env vars.\n\nIf kind_override is set, use that instead of auto-detection.", - "allowed_tools": ["Read", "Glob", "Grep"], - "next_step": "generate" - }, - { - "name": "generate", - "display_name": "Generating", - "outputs": ["code"], - "prompt": "Generate output files from the analysis JSON:\n\n1. **Write `project-context.json`** (for AI agents):\n - Save the complete structured analysis JSON to project root\n - This is the primary output for AI consumption\n\n2. **Write `catalog-info.yaml`** (for project catalog):\n ```yaml\n apiVersion: backstage.io/v1alpha1\n kind: Component\n metadata:\n name: {{ project }}\n description: \n annotations:\n backstage.io/techdocs-ref: dir:.\n tags:\n - \n - \n spec:\n type: \n lifecycle: production\n owner: \n ```\n\n3. **Document assessment** in `.tickets/assessments/{{ id }}.md`:\n - Kind detected with confidence score\n - Key technologies found\n - Commands available\n - Entry points identified", - "allowed_tools": ["Read", "Write", "Edit"], - "review_type": "plan", - "on_reject": { - "goto_step": "analyze", - "prompt": "Re-analyze the project with feedback: {{ rejection_reason }}" - } - } - ] -} diff --git a/docs/collections/full/ASSESS.md b/docs/collections/full/ASSESS.md deleted file mode 100644 index 4772d288..00000000 --- a/docs/collections/full/ASSESS.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: {{ id }} -{{#if step }}step: {{ step }} -{{/if}}status: {{ status }} -created: {{ created_datetime }} -{{#if kind_override }}kind_override: {{ kind_override }} -{{/if}}--- - -# Assessment: {{ summary }} - -{{#if kind_override }} -## Kind Override -{{ kind_override }} -{{/if}} diff --git a/docs/collections/full/FIX.md b/docs/collections/full/FIX.md deleted file mode 100644 index e23158ff..00000000 --- a/docs/collections/full/FIX.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: {{ id }} -{{#if step }}step: {{ step }} -{{/if}}status: {{ status }} -created: {{ created_datetime }} -branch: {{ branch }} -{{#if priority }}priority: {{ priority }} -{{/if}}{{#if severity }}severity: {{ severity }} -{{/if}}{{#if fix_type }}fix_type: {{ fix_type }} -{{/if}}{{#if parent }}parent: {{ parent }} -{{/if}}--- - -# Fix: {{ summary }} - -{{#if context }} -## Context -{{ context }} -{{/if}} diff --git a/docs/collections/full/INIT.json b/docs/collections/full/INIT.json deleted file mode 100644 index 1c2bf388..00000000 --- a/docs/collections/full/INIT.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "$schema": "../../schemas/issuetype_schema.json", - "key": "INIT", - "name": "Workspace Init", - "description": "Initialize workspace structure", - "mode": "paired", - "glyph": "%", - "color": "green", - "project_required": false, - "agent_prompt": "Review this workspace to create an agent for workspace initialization. The agent scaffolds the workspace directory structure in .tickets/operator/workspace/, configures project locations and authentication, and verifies tool installation. It works in paired mode with the operator for configuration decisions. Output ONLY the agent system prompt.", - "fields": [ - { - "name": "id", - "description": "Unique ticket identifier", - "type": "string", - "required": true, - "auto": "id", - "display_order": 0, - "user_editable": false - }, - { - "name": "workspace", - "description": "Workspace root path", - "type": "string", - "required": true, - "default": "", - "placeholder": "Path to workspace root", - "display_order": 1 - }, - { - "name": "branding_name", - "description": "Custom branding name", - "type": "string", - "required": false, - "default": "", - "placeholder": "e.g., My Company Portal", - "display_order": 2 - }, - { - "name": "summary", - "description": "Initialization description", - "type": "string", - "required": true, - "default": "", - "placeholder": "Initialize workspace", - "max_length": 120, - "display_order": 3 - } - ], - "steps": [ - { - "name": "scaffold", - "display_name": "Scaffolding", - "outputs": ["code"], - "prompt": "Create the workspace directory structure:\n\n1. Create `.tickets/operator/workspace/` directory\n2. Generate workspace configuration files\n3. Create standard directory structure\n4. Set up branding directory with defaults\n\nAsk operator for branding preferences if not specified.", - "allowed_tools": ["Read", "Write", "Bash"], - "next_step": "configure" - }, - { - "name": "configure", - "display_name": "Configuring", - "outputs": ["code"], - "prompt": "Configure workspace for local development:\n\n1. Generate workspace configuration with:\n - File-based catalog locations\n - Local database (SQLite)\n2. Scan workspace for existing catalog-info.yaml files\n3. Add all discovered locations to config\n4. Configure branding if branding_name is set\n\nReview configuration with operator before proceeding.", - "allowed_tools": ["Read", "Write", "Glob"], - "review_type": "plan", - "on_reject": { - "goto_step": "configure", - "prompt": "Revise configuration based on feedback: {{ rejection_reason }}" - }, - "next_step": "verify" - }, - { - "name": "verify", - "display_name": "Verifying", - "outputs": ["report"], - "prompt": "Verify the workspace setup:\n\n1. Verify configuration is valid\n2. Check all referenced projects exist\n3. Document setup in `.tickets/operator/workspace/README.md`\n\nReport any issues that need manual resolution.", - "allowed_tools": ["Read", "Write", "Bash"], - "review_type": "plan", - "on_reject": { - "goto_step": "scaffold", - "prompt": "Setup verification failed. Re-scaffold with feedback: {{ rejection_reason }}" - } - } - ] -} diff --git a/docs/collections/full/INIT.md b/docs/collections/full/INIT.md deleted file mode 100644 index 05ef2b5d..00000000 --- a/docs/collections/full/INIT.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: {{ id }} -{{#if step }}step: {{ step }} -{{/if}}workspace: {{ workspace }} -{{#if branding_name }}branding_name: {{ branding_name }} -{{/if}}status: {{ status }} -created: {{ created_datetime }} ---- - -# Workspace Init: {{ summary }} - -## Workspace -{{ workspace }} - -{{#if branding_name }} -## Branding -{{ branding_name }} -{{/if}} diff --git a/docs/collections/full/INV.json b/docs/collections/full/INV.json deleted file mode 100644 index 480e502b..00000000 --- a/docs/collections/full/INV.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "$schema": "../../schemas/issuetype_schema.json", - "key": "INV", - "name": "Investigation", - "description": "Incident investigation ticket (paired mode)", - "mode": "paired", - "glyph": "!", - "color": "yellow", - "project_required": false, - "agent_prompt": "Review this project and prepare to create an agent for incident investigations. The agent triages issues, investigates root causes, coordinates remediation, and documents postmortems. It works in paired mode with the operator. Output ONLY the agent system prompt.", - "fields": [ - { - "name": "id", - "description": "Unique ticket identifier", - "type": "string", - "required": true, - "auto": "id", - "display_order": 0, - "user_editable": false - }, - { - "name": "scope", - "description": "Affected scope/project", - "type": "enum", - "required": false, - "default": "global", - "options": ["global", "adminsvc", "apisvc", "gamesvc", "g", "hushsvc", "uzersvc", "outboundsvc", "www", "iac", "proto", "e2e", "operator"], - "display_order": 1 - }, - { - "name": "severity", - "description": "Incident severity", - "type": "enum", - "required": false, - "default": "S1-major", - "options": ["S0-outage", "S1-major", "S2-minor"], - "display_order": 2 - }, - { - "name": "source", - "description": "How the incident was detected", - "type": "enum", - "required": false, - "default": "monitoring", - "options": ["alert", "user-report", "monitoring", "deploy-failure", "test-failure"], - "display_order": 3 - }, - { - "name": "summary", - "description": "named summary of the failure investigation", - "type": "string", - "required": true, - "default": "", - "placeholder": "Brief description of the observed failure", - "max_length": 120, - "display_order": 4 - }, - { - "name": "observed_behavior", - "description": "What is happening? Include error messages, logs", - "type": "text", - "required": false, - "default": "", - "placeholder": "Error messages, log excerpts, metrics", - "display_order": 5 - }, - { - "name": "expected_behavior", - "description": "What should be happening instead?", - "type": "text", - "required": false, - "default": "", - "placeholder": "Expected behavior under normal conditions", - "display_order": 6 - }, - { - "name": "impact", - "description": "Users/services affected", - "type": "string", - "required": false, - "default": "", - "placeholder": "Affected users, services, or systems", - "display_order": 7 - } - ], - "steps": [ - { - "name": "triage", - "display_name": "Triage", - "outputs": ["report"], - "prompt": "Triage the incident:\n\n1. Confirm the issue is real and ongoing\n2. Assess severity and impact\n3. Identify affected systems\n4. Begin documenting in `.tickets/incidents/{{ id }}.md`\n\nWork with the operator to gather initial information.", - "allowed_tools": ["Read", "Glob", "Grep", "Bash", "Write"], - "next_step": "investigate" - }, - { - "name": "investigate", - "display_name": "Investigating", - "outputs": ["report"], - "prompt": "Investigate the root cause:\n\n1. Search logs and metrics for anomalies\n2. Trace the error path through the code\n3. Identify recent changes that might be related\n4. Form hypotheses and test them\n5. Update `.tickets/incidents/{{ id }}.md` with findings", - "allowed_tools": ["Read", "Glob", "Grep", "Bash", "Write"], - "next_step": "remediate" - }, - { - "name": "remediate", - "display_name": "Remediating", - "outputs": ["code", "ticket"], - "prompt": "Determine remediation:\n\n1. If a quick fix is possible, implement it\n2. If a hotfix is needed, create a FIX ticket\n3. If a rollback is needed, coordinate with the operator\n4. Document the resolution in the incident report", - "allowed_tools": ["Read", "Write", "Edit", "Bash"], - "review_type": "plan", - "on_reject": { - "goto_step": "investigate", - "prompt": "More investigation needed. Continue searching for the root cause." - }, - "next_step": "postmortem" - }, - { - "name": "postmortem", - "display_name": "Postmortem", - "outputs": ["report", "ticket"], - "prompt": "Complete the postmortem:\n\n1. Finalize the incident report with:\n - Timeline of events\n - Root cause analysis\n - Remediation taken\n - Lessons learned\n2. Create follow-up tickets for preventive measures", - "allowed_tools": ["Read", "Write", "Bash"], - "review_type": "plan", - "on_reject": { - "goto_step": "postmortem", - "prompt": "Postmortem needs more detail. Expand the analysis." - }, - "next_step": "done" - }, - { - "name": "done", - "display_name": "Complete", - "outputs": ["review"], - "prompt": "Investigation complete. Move ticket to completed.", - "allowed_tools": ["Bash"] - } - ] -} diff --git a/docs/collections/full/INV.md b/docs/collections/full/INV.md deleted file mode 100644 index b03380c9..00000000 --- a/docs/collections/full/INV.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: {{ id }} -{{#if step }}step: {{ step }} -{{/if}}{{#if scope }}scope: {{ scope }} -{{/if}}status: {{ status }} -created: {{ created_datetime }} -{{#if severity }}severity: {{ severity }} -{{/if}}{{#if source }}source: {{ source }} -{{/if}}--- - -# Investigation: {{ summary }} - -{{#if observed_behavior }} -## Observed Behavior -{{ observed_behavior }} -{{/if}} - -{{#if expected_behavior }} -## Expected Behavior -{{ expected_behavior }} -{{/if}} - -{{#if impact }} -## Impact -{{ impact }} -{{/if}} - -## Timeline -| Time | Event | -|------|-------| -| {{ created_datetime }} | Investigation opened | - -## Findings - diff --git a/docs/collections/full/SPIKE.json b/docs/collections/full/SPIKE.json deleted file mode 100644 index a4577402..00000000 --- a/docs/collections/full/SPIKE.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "$schema": "../../schemas/issuetype_schema.json", - "key": "SPIKE", - "name": "Spike", - "description": "Research or exploration ticket (paired mode)", - "mode": "paired", - "glyph": "?", - "color": "blue", - "project_required": false, - "agent_prompt": "Review this project and prepare to create an agent for research spikes. The agent works in paired mode, explores the codebase, researches external docs, and documents findings. It should ask questions when uncertain. Output ONLY the agent system prompt.", - "fields": [ - { - "name": "id", - "description": "Unique ticket identifier", - "type": "string", - "required": true, - "auto": "id", - "display_order": 0, - "user_editable": false - }, - { - "name": "scope", - "description": "Scope of the spike", - "type": "enum", - "required": false, - "default": "global", - "options": ["global", "adminsvc", "apisvc", "gamesvc", "g", "hushsvc", "uzersvc", "outboundsvc", "www", "iac", "proto", "e2e", "operator"], - "display_order": 1 - }, - { - "name": "priority", - "description": "Ticket priority level", - "type": "enum", - "required": false, - "default": "P2-medium", - "options": ["P0-critical", "P1-high", "P2-medium", "P3-low"], - "display_order": 2 - }, - { - "name": "summary", - "description": "Research question or topic", - "type": "string", - "required": true, - "default": "", - "placeholder": "What needs to be researched or explored?", - "max_length": 120, - "display_order": 3 - }, - { - "name": "user_story", - "description": "Why is this spike needed? What decision does it inform?", - "type": "text", - "required": false, - "default": "", - "placeholder": "Background context and what decisions depend on this research", - "display_order": 4 - }, - { - "name": "success_criteria", - "description": "How will we know the spike is complete?", - "type": "text", - "required": false, - "default": "", - "placeholder": "Questions to answer, deliverables expected", - "display_order": 5 - } - ], - "steps": [ - { - "name": "explore", - "display_name": "Exploration", - "outputs": ["report"], - "prompt": "This is a research spike. Work with the operator to explore:\n\n1. Read and understand the research question\n2. Search the codebase for relevant patterns\n3. Research external documentation if needed\n4. Discuss findings with the operator\n\nDocument discoveries in `.tickets/spikes/{{ id }}.md`", - "allowed_tools": ["Read", "Glob", "Grep", "WebFetch", "WebSearch", "Write"], - "next_step": "summarize" - }, - { - "name": "summarize", - "display_name": "Summarizing", - "outputs": ["report", "ticket"], - "prompt": "Summarize findings from the spike:\n\n1. Update `.tickets/spikes/{{ id }}.md` with:\n - Key findings\n - Recommendations\n - Trade-offs identified\n - Open questions\n2. If follow-up work is identified, create ticket(s)", - "allowed_tools": ["Read", "Write", "Bash"], - "review_type": "plan", - "on_reject": { - "goto_step": "explore", - "prompt": "More research is needed. Continue exploring with the operator." - }, - "next_step": "done" - }, - { - "name": "done", - "display_name": "Complete", - "outputs": ["review"], - "prompt": "Spike complete. Move ticket to completed.", - "allowed_tools": ["Bash"] - } - ] -} diff --git a/docs/collections/full/SPIKE.md b/docs/collections/full/SPIKE.md deleted file mode 100644 index bfe6f136..00000000 --- a/docs/collections/full/SPIKE.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: {{ id }} -{{#if step }}step: {{ step }} -{{/if}}{{#if scope }}scope: {{ scope }} -{{/if}}status: {{ status }} -created: {{ created_datetime }} -{{#if priority }}priority: {{ priority }} -{{/if}}--- - -# Spike: {{ summary }} - -{{#if context }} -## Context -{{ context }} -{{/if}} - -{{#if success_criteria }} -## Success Criteria -{{ success_criteria }} -{{/if}} - -## Conversation Log -### Session: {{ created_date }} - -## Findings - diff --git a/docs/collections/full/SYNC.json b/docs/collections/full/SYNC.json deleted file mode 100644 index 519cd3b5..00000000 --- a/docs/collections/full/SYNC.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "$schema": "../../schemas/issuetype_schema.json", - "key": "SYNC", - "name": "Catalog Sync", - "description": "Refresh catalog entries from projects", - "mode": "autonomous", - "glyph": "@", - "color": "blue", - "project_required": false, - "agent_prompt": "Review this workspace to create an agent for catalog synchronization. The agent discovers all projects with catalog-info.yaml files, validates them against the catalog schema, checks for inconsistencies, and updates catalog entries as needed. It can run across the entire workspace or target specific projects. Output ONLY the agent system prompt.", - "fields": [ - { - "name": "id", - "description": "Unique ticket identifier", - "type": "string", - "required": true, - "auto": "id", - "display_order": 0, - "user_editable": false - }, - { - "name": "scope", - "description": "Sync scope", - "type": "enum", - "required": false, - "default": "all", - "options": ["all", "changed", "project"], - "display_order": 1 - }, - { - "name": "summary", - "description": "Sync description", - "type": "string", - "required": true, - "default": "", - "placeholder": "Sync catalog entries", - "max_length": 120, - "display_order": 2 - } - ], - "steps": [ - { - "name": "scan", - "display_name": "Scanning", - "outputs": ["report"], - "prompt": "Discover all catalog entries in the workspace:\n\n1. Find all catalog-info.yaml files in projects\n2. Parse each file and validate structure\n3. Build a dependency graph from relations\n4. Identify:\n - New entries (not in catalog)\n - Changed entries (modified since last sync)\n - Removed entries (catalog-info.yaml deleted)\n5. Document findings in `.tickets/syncs/{{ id }}.md`", - "allowed_tools": ["Read", "Glob", "Grep", "Write"], - "next_step": "validate" - }, - { - "name": "validate", - "display_name": "Validating", - "outputs": ["report"], - "prompt": "Validate all catalog entries:\n\n1. Check each catalog-info.yaml against schema\n2. Verify all referenced entities exist\n3. Check for circular dependencies\n4. Validate owner references\n5. Report any validation errors\n\nUpdate `.tickets/syncs/{{ id }}.md` with validation results.", - "allowed_tools": ["Read", "Write"], - "next_step": "update" - }, - { - "name": "update", - "display_name": "Updating", - "outputs": ["report"], - "prompt": "Update the project catalog:\n\n1. If catalog server is running, trigger catalog refresh\n2. If file-based, update the locations config\n3. Log all changes made\n4. Verify catalog is consistent after update\n\nComplete the sync report in `.tickets/syncs/{{ id }}.md`.", - "allowed_tools": ["Read", "Write", "Bash"], - "review_type": "plan", - "on_reject": { - "goto_step": "validate", - "prompt": "Re-validate with feedback: {{ rejection_reason }}" - } - } - ] -} diff --git a/docs/collections/full/SYNC.md b/docs/collections/full/SYNC.md deleted file mode 100644 index 6838583b..00000000 --- a/docs/collections/full/SYNC.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: {{ id }} -{{#if step }}step: {{ step }} -{{/if}}scope: {{ scope }} -status: {{ status }} -created: {{ created_datetime }} ---- - -# Catalog Sync: {{ summary }} - -## Scope -{{ scope }} diff --git a/docs/collections/full/TASK.json b/docs/collections/full/TASK.json deleted file mode 100644 index 04b95bd2..00000000 --- a/docs/collections/full/TASK.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "$schema": "../../schemas/issuetype_schema.json", - "key": "TASK", - "name": "Task", - "description": "Focused task that executes one specific thing", - "mode": "autonomous", - "glyph": ">", - "color": "cyan", - "project_required": false, - "fields": [ - { - "name": "id", - "description": "Unique ticket identifier", - "type": "string", - "required": true, - "auto": "id", - "display_order": 0, - "user_editable": false - }, - { - "name": "priority", - "description": "Ticket priority level", - "type": "enum", - "required": false, - "default": "P2-medium", - "options": ["P0-critical", "P1-high", "P2-medium", "P3-low"], - "display_order": 1 - }, - { - "name": "summary", - "description": "One-line description of the task", - "type": "string", - "required": true, - "default": "", - "placeholder": "Brief description of the task", - "max_length": 120, - "display_order": 2 - }, - { - "name": "description", - "description": "Detailed description of the task", - "type": "text", - "required": true, - "default": "", - "placeholder": "Full description of what needs to be done", - "display_order": 3 - }, - { - "name": "points", - "description": "Story points estimate", - "type": "integer", - "required": false, - "default": "0", - "display_order": 4 - }, - { - "name": "user_story", - "description": "User story or background context", - "type": "text", - "required": false, - "default": "", - "placeholder": "As a USER, I want to X, so I can Y", - "display_order": 5 - } - ], - "steps": [ - { - "name": "execute", - "display_name": "Executing", - "outputs": ["code", "report"], - "prompt": "Execute this task:\n\n1. Read the ticket summary and context\n2. Explore the codebase as needed\n3. Complete the task as specified\n4. Document what was done\n\nThis is a focused task - complete it directly without creating follow-up tickets or plans.", - "allowed_tools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"] - } - ] -} diff --git a/docs/collections/full/TASK.md b/docs/collections/full/TASK.md deleted file mode 100644 index b764c240..00000000 --- a/docs/collections/full/TASK.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: {{ id }} -{{#if step }}step: {{ step }} -{{/if}}status: {{ status }} -created: {{ created_datetime }} -{{#if priority }}priority: {{ priority }} -{{/if}}{{#if points }}points: {{ points }} -{{/if}}--- - -# Task: {{ summary }} - -## Description -{{ description }} - -{{#if user_story }} -## User Story -{{ user_story }} -{{/if}} - -{{#if acceptance_criteria }} -## Acceptance Criteria -{{ acceptance_criteria }} -{{/if}} - -## Plan -*Plan will be written to `.tickets/plans/{{ id }}.md`* diff --git a/docs/collections/full/collection.json b/docs/collections/full/collection.json deleted file mode 100644 index 521155bb..00000000 --- a/docs/collections/full/collection.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "schema_version": 1, - "id": "full", - "name": "Full", - "description": "Full workflow: all issue types combined", - "version": "1.0.0", - "publisher": "untra", - "author": "Operator!", - "url": "https://github.com/untra/operator", - "license": "MIT", - "tags": [ - "builtin" - ], - "compatibility": null, - "issue_types": [ - { - "key": "TASK", - "schema_path": "TASK.json", - "schema_checksum": "f654229454da050ca038c273cc74884c2dbe68f09b293eee3764f23d6771b939", - "template_path": "TASK.md", - "template_checksum": "7a71bf692588af1d1ac5d9192edd64316353ada616e22019dfff7683ab5d09c4" - }, - { - "key": "FEAT", - "schema_path": "FEAT.json", - "schema_checksum": "f647a5aaec7514f3dfbaad70bc757e3360e49ba7e35ce496e98dec010ea9e51b", - "template_path": "FEAT.md", - "template_checksum": "fbc7e17641d8e796dad14c09fe20ffcbbdbdb8f58199b0d29d9e9729b51b4d5a" - }, - { - "key": "FIX", - "schema_path": "FIX.json", - "schema_checksum": "4deafa08b2dcf1c94462d7079574be05d2efd6ff0abb6036b8fde955dca0e0a1", - "template_path": "FIX.md", - "template_checksum": "5237e1faf9b2c49d80fc9efff5a0d3e184f86c4fa5a34ff4dfed26ee883856bf" - }, - { - "key": "SPIKE", - "schema_path": "SPIKE.json", - "schema_checksum": "1f69f05190fdff5545371c042c388e276accbbb50179ce65365f17dac042c0b5", - "template_path": "SPIKE.md", - "template_checksum": "030d37b1b4b3b8a26db62bd590a61fb5b9e01d5a39be6ab771bd56e31179f2c4" - }, - { - "key": "INV", - "schema_path": "INV.json", - "schema_checksum": "42129e41c6c735adb47061a7d99478a1e4ed9ca5ca9f42b3c300c4a833f9265b", - "template_path": "INV.md", - "template_checksum": "65ef45c01d30b93f9d81b830896f20fe4eb9645e82d8e16ea1bd77ac4f359050" - }, - { - "key": "ASSESS", - "schema_path": "ASSESS.json", - "schema_checksum": "63d218368c58df22606fbd654920edeb304ebc1bc7282501be38ae14027aa9e1", - "template_path": "ASSESS.md", - "template_checksum": "e2fb41d771ccf37af6189cdc0ef9b2752d3e1ddb1fa193f0264fbbdd432e7e0f" - }, - { - "key": "SYNC", - "schema_path": "SYNC.json", - "schema_checksum": "6e52fb05db6e09cd723becb8ffe0388957c639b39fb81efe38d7e9cb8d725e55", - "template_path": "SYNC.md", - "template_checksum": "fc5cf44f553720b44ef328c560155fda137102cee28d60505b289d35e45d79cf" - }, - { - "key": "INIT", - "schema_path": "INIT.json", - "schema_checksum": "bd7387742f9d81e49dcbe05cf25d3db0544e2f48843fb855df881d7ab094a0d6", - "template_path": "INIT.md", - "template_checksum": "ff54445fb446a8ba8155e00259ebf44860c2e8d1865df6943ceec648fe3650e8" - } - ], - "workflow_hints": null, - "default_selected": [ - "TASK", - "FEAT", - "FIX", - "SPIKE", - "INV", - "ASSESS", - "SYNC", - "INIT" - ], - "checksum": "e1f9940d1c3f84b26ec6e574bc4f4804d2f9e6dc64298344ef3c06ec9dabbb77" -} diff --git a/docs/collections/index.json b/docs/collections/index.json index d410a91c..5e9fa533 100644 --- a/docs/collections/index.json +++ b/docs/collections/index.json @@ -11,7 +11,9 @@ "builtin" ], "manifest_path": "simple/collection.json", - "checksum": "fce81369f98e00ee6fe35194076055b59f4882d8d1613a914bbce660593a05b4" + "checksum": "355275423b6acfa32690263fe566ae11641b406db2802c48ac95afdf5733ae0e", + "tier": "official", + "docs_path": "/workflows/simple/" }, { "id": "dev_kanban", @@ -24,7 +26,9 @@ "dev" ], "manifest_path": "dev_kanban/collection.json", - "checksum": "87460062d63068e9e96f6ee628cc466bec6951c0b766f338178b66cb5ac1d23f" + "checksum": "62de8ec80b4355bf598df21ab11fabf9c4eb96b0a59b0cb9b188666ab70fa7f0", + "tier": "official", + "docs_path": "/workflows/dev_kanban/" }, { "id": "devops_kanban", @@ -37,7 +41,9 @@ "devops" ], "manifest_path": "devops_kanban/collection.json", - "checksum": "068c5112a615ccc4f9a1c11e0b90c1a193b07e5b07565100880750f1624edaa4" + "checksum": "a22d7aabb3f038e9fec83a2559b4f2aead1499abc12419678387a2e47124db1a", + "tier": "official", + "docs_path": "/workflows/devops_kanban/" }, { "id": "operator", @@ -49,18 +55,9 @@ "automation" ], "manifest_path": "operator/collection.json", - "checksum": "9a5aa2ac773bd4e445cb951f870b7e78ff3e0002be9a66bba05c14e9abe9c4f3" - }, - { - "id": "full", - "name": "Full", - "description": "Full workflow: all issue types combined", - "version": "1.0.0", - "tags": [ - "builtin" - ], - "manifest_path": "full/collection.json", - "checksum": "305830707c108a825bd5aab14aaf9e489e0d7b286e36c77269ad0da94420f2d4" + "checksum": "af7b34cd0103edd1b3d4d47ca26e9721f7374b4b8d3d94d77b23dc8de19bcf71", + "tier": "official", + "docs_path": "/workflows/operator/" }, { "id": "ralph_loop", @@ -74,7 +71,9 @@ "ralph" ], "manifest_path": "ralph_loop/collection.json", - "checksum": "f37e1379c1ffea6208d25add591daa468b680c2a796b04fc490c0a4e30f96c39" + "checksum": "09276da66290f1faf69bc658a050c2f166e831510ac90800e59654f62aee4da4", + "tier": "community", + "docs_path": "/workflows/ralph_loop/" }, { "id": "jr_orchestration", @@ -88,7 +87,9 @@ "jr" ], "manifest_path": "jr_orchestration/collection.json", - "checksum": "e89a9ec49af83f5c431fc95e0418943d7aedc3fd087b5b05ee12b339007c0f39" + "checksum": "7deebf57f6542592c30cd633577cdb6ebcee1227dab9adcf9cc0980e155eeaea", + "tier": "community", + "docs_path": "/workflows/jr_orchestration/" }, { "id": "elves_overnight", @@ -102,7 +103,39 @@ "elves" ], "manifest_path": "elves_overnight/collection.json", - "checksum": "1078479804ba0d581bff29d7e153904dee0d46cfb41d4f05841891814a9f62eb" + "checksum": "c005292f4779fab887c23bcaf5095cd19ad5aebba221d1ddf41b3895e33143cf", + "tier": "community", + "docs_path": "/workflows/elves_overnight/" + }, + { + "id": "coder", + "name": "Coder", + "description": "Linear-synced engineering flow: Feature, Improvement, and Bug work delegated to coding agents.", + "version": "1.0.0", + "tags": [ + "community", + "linear", + "kanban", + "engineering" + ], + "manifest_path": "coder/collection.json", + "checksum": "27d0ec62188589d54326a913128217b14431b810e8280923d9bf2c4193207284", + "tier": "community", + "docs_path": "/workflows/coder/" + }, + { + "id": "example_chores", + "name": "Example Chores", + "description": "Minimal example community collection demonstrating the shareable format.", + "version": "0.1.0", + "tags": [ + "example", + "starter" + ], + "manifest_path": "example_chores/collection.json", + "checksum": "648c10ee77d24be1c2589538663ef4ff30173f74b91fcaa4b4b12adaa90eed46", + "tier": "community", + "docs_path": "/workflows/example_chores/" } ] } diff --git a/docs/collections/jr_orchestration/collection.json b/docs/collections/jr_orchestration/collection.json index 889dfba2..fbc78e18 100644 --- a/docs/collections/jr_orchestration/collection.json +++ b/docs/collections/jr_orchestration/collection.json @@ -15,6 +15,11 @@ "jr" ], "compatibility": null, + "tier": "community", + "icon_path": "icon.svg", + "created": "2026-06-16", + "updated": "2026-07-01", + "kanban_defaults": null, "issue_types": [ { "key": "JRPLAN", diff --git a/docs/collections/jr_orchestration/icon.svg b/docs/collections/jr_orchestration/icon.svg new file mode 100644 index 00000000..2ebdb4bb --- /dev/null +++ b/docs/collections/jr_orchestration/icon.svg @@ -0,0 +1 @@ +JR Orchestration diff --git a/src/collections/operator/AGENT-SETUP.json b/docs/collections/operator/AGENT_SETUP.json similarity index 97% rename from src/collections/operator/AGENT-SETUP.json rename to docs/collections/operator/AGENT_SETUP.json index 3826b811..0ff04e9b 100644 --- a/src/collections/operator/AGENT-SETUP.json +++ b/docs/collections/operator/AGENT_SETUP.json @@ -1,6 +1,6 @@ { "$schema": "../../schemas/issuetype_schema.json", - "key": "AGENT-SETUP", + "key": "AGENT_SETUP", "name": "Agent Setup", "description": "Set up Claude agent configuration for a project", "mode": "paired", @@ -32,7 +32,7 @@ "name": "agent_tool", "description": "Target agent tool (claude, aider, etc.)", "type": "enum", - "values": ["claude", "aider", "gemini"], + "options": ["claude", "aider", "gemini"], "required": true, "default": "claude", "display_order": 2 diff --git a/docs/collections/operator/AGENT-SETUP.md b/docs/collections/operator/AGENT_SETUP.md similarity index 100% rename from docs/collections/operator/AGENT-SETUP.md rename to docs/collections/operator/AGENT_SETUP.md diff --git a/src/collections/operator/PROJECT-INIT.json b/docs/collections/operator/PROJECT_INIT.json similarity index 98% rename from src/collections/operator/PROJECT-INIT.json rename to docs/collections/operator/PROJECT_INIT.json index 66c72848..b9f5aafb 100644 --- a/src/collections/operator/PROJECT-INIT.json +++ b/docs/collections/operator/PROJECT_INIT.json @@ -1,6 +1,6 @@ { "$schema": "../../schemas/issuetype_schema.json", - "key": "PROJECT-INIT", + "key": "PROJECT_INIT", "name": "Project Initialization", "description": "Initialize project with Operator conventions", "mode": "autonomous", diff --git a/docs/collections/operator/PROJECT-INIT.md b/docs/collections/operator/PROJECT_INIT.md similarity index 100% rename from docs/collections/operator/PROJECT-INIT.md rename to docs/collections/operator/PROJECT_INIT.md diff --git a/docs/collections/operator/collection.json b/docs/collections/operator/collection.json index bfc8425f..4dfe0365 100644 --- a/docs/collections/operator/collection.json +++ b/docs/collections/operator/collection.json @@ -13,6 +13,11 @@ "automation" ], "compatibility": null, + "tier": "official", + "icon_path": "icon.svg", + "created": "2026-01-08", + "updated": "2026-07-01", + "kanban_defaults": null, "issue_types": [ { "key": "ASSESS", @@ -36,25 +41,42 @@ "template_checksum": "ff54445fb446a8ba8155e00259ebf44860c2e8d1865df6943ceec648fe3650e8" }, { - "key": "AGENT-SETUP", - "schema_path": "AGENT-SETUP.json", - "schema_checksum": "c611e58617b180838b286ec0907ef11d17e25581f56699cedef4d31c1223b15a", - "template_path": "AGENT-SETUP.md", + "key": "AGENT_SETUP", + "schema_path": "AGENT_SETUP.json", + "schema_checksum": "6f934f8a688058d85453cf97c39a79a83f71ddce2a1493b9fcfe441ded485d5e", + "template_path": "AGENT_SETUP.md", "template_checksum": "528f9437434e5ed8f8ca2f8e09c3acb04d021e8fa2fbb978cb6aed5c005aa8f7" }, { - "key": "PROJECT-INIT", - "schema_path": "PROJECT-INIT.json", - "schema_checksum": "0fa43b3dbb839b0a440c2e702a9fd499ebd172bfcaaa4266a20aed7db7c90072", - "template_path": "PROJECT-INIT.md", + "key": "PROJECT_INIT", + "schema_path": "PROJECT_INIT.json", + "schema_checksum": "3d942d60f658e477043ae294ed8006e5d7d4964771c47470c409ce4ab114b684", + "template_path": "PROJECT_INIT.md", "template_checksum": "767a9a6481908826809222e87a36c840f759047170b0ff9d917ffa2846a19805" } ], - "workflow_hints": null, + "workflow_hints": { + "loop_kind": "single_pass", + "memory_surfaces": [ + "ticket", + "catalog-info.yaml", + ".claude/agents/" + ], + "review_gates": [ + "human" + ], + "external_tools": [ + "git" + ], + "stop_conditions": [ + "setup_artifacts_written" + ], + "runner_semantics": "prompt_driven" + }, "default_selected": [ "ASSESS", "SYNC", "INIT" ], - "checksum": "4f8f40dde1b85d01d5da929ff4329ea126ffbf9da94c5e5de60154101d1881bd" + "checksum": "ec34f16fbf1571e7662b85074f857f19656ae704569a5be083e49d1c5f741069" } diff --git a/docs/collections/operator/icon.svg b/docs/collections/operator/icon.svg new file mode 100644 index 00000000..7ce0d33f --- /dev/null +++ b/docs/collections/operator/icon.svg @@ -0,0 +1 @@ +Operator diff --git a/docs/collections/ralph_loop/collection.json b/docs/collections/ralph_loop/collection.json index b75a4d14..f5f05ad4 100644 --- a/docs/collections/ralph_loop/collection.json +++ b/docs/collections/ralph_loop/collection.json @@ -15,6 +15,11 @@ "ralph" ], "compatibility": null, + "tier": "community", + "icon_path": "icon.svg", + "created": "2026-06-16", + "updated": "2026-07-01", + "kanban_defaults": null, "issue_types": [ { "key": "PRD", diff --git a/docs/collections/ralph_loop/icon.svg b/docs/collections/ralph_loop/icon.svg new file mode 100644 index 00000000..55e80009 --- /dev/null +++ b/docs/collections/ralph_loop/icon.svg @@ -0,0 +1 @@ +Ralph Loop diff --git a/docs/collections/schema.json b/docs/collections/schema.json index d889f9dc..c0826f6c 100644 --- a/docs/collections/schema.json +++ b/docs/collections/schema.json @@ -21,6 +21,38 @@ "url": { "type": ["string", "null"], "description": "Link to the collection's source (GitHub repo or project page)." }, "license": { "type": ["string", "null"], "description": "SPDX license id." }, "tags": { "type": "array", "items": { "type": "string" } }, + "tier": { + "type": "string", + "enum": ["official", "community"], + "default": "official", + "description": "Provenance tier: who authored and maintains the collection. Orthogonal to distribution (curated community-authored collections may ship embedded)." + }, + "icon_path": { + "type": ["string", "null"], + "description": "Bare filename of the collection's SVG icon, next to the manifest. Must satisfy the Simple Icons shape (24x24 viewBox, single path, no fill/stroke so it inherits currentColor). Deliberately not checksummed: presentational, never executed. Required for community-tier collections." + }, + "created": { + "type": ["string", "null"], + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "description": "ISO-8601 date (YYYY-MM-DD) the collection was first published." + }, + "updated": { + "type": ["string", "null"], + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "description": "ISO-8601 date (YYYY-MM-DD) of the last substantive revision." + }, + "kanban_defaults": { + "type": ["object", "null"], + "description": "Descriptive kanban onboarding defaults. v1 is metadata only: suggestions seed the onboarding mapping UI but do not drive sync behavior.", + "additionalProperties": false, + "properties": { + "suggested_type_mappings": { + "type": "object", + "additionalProperties": { "type": "string" }, + "description": "Suggested provider issue-type NAME -> collection issuetype key." + } + } + }, "compatibility": { "type": ["object", "null"], "additionalProperties": false, diff --git a/docs/collections/search.json b/docs/collections/search.json new file mode 100644 index 00000000..2341a0e2 --- /dev/null +++ b/docs/collections/search.json @@ -0,0 +1,592 @@ +{ + "schema_version": 1, + "collections": [ + { + "id": "simple", + "name": "Simple", + "description": "Simple workflow with TASK only", + "version": "1.0.0", + "tier": "official", + "author": "Operator!", + "publisher": "untra", + "url": "https://github.com/untra/operator", + "license": "MIT", + "tags": [ + "builtin" + ], + "created": "2026-01-08", + "updated": "2026-07-01", + "icon_path": "simple/icon.svg", + "docs_path": "/workflows/simple/", + "manifest_path": "simple/collection.json", + "issue_type_count": 1, + "issue_types": [ + { + "key": "TASK", + "name": "Task", + "mode": "autonomous", + "glyph": ">", + "step_count": 1, + "schema_path": "TASK.json" + } + ], + "loop_kind": "single_pass", + "review_gates": [], + "stop_conditions": [ + "task_complete" + ], + "memory_surfaces": [ + "ticket" + ], + "search_text": "autonomous builtin mit official only operator simple single_pass task untra with workflow" + }, + { + "id": "dev_kanban", + "name": "Dev Kanban", + "description": "Developer kanban with TASK, FEAT, FIX", + "version": "1.0.0", + "tier": "official", + "author": "Operator!", + "publisher": "untra", + "url": "https://github.com/untra/operator", + "license": "MIT", + "tags": [ + "builtin", + "kanban", + "dev" + ], + "created": "2026-01-08", + "updated": "2026-06-16", + "icon_path": "dev_kanban/icon.svg", + "docs_path": "/workflows/dev_kanban/", + "manifest_path": "dev_kanban/collection.json", + "issue_type_count": 3, + "issue_types": [ + { + "key": "TASK", + "name": "Task", + "mode": "autonomous", + "glyph": ">", + "step_count": 1, + "schema_path": "TASK.json" + }, + { + "key": "FEAT", + "name": "Feature", + "mode": "autonomous", + "glyph": "*", + "step_count": 5, + "schema_path": "FEAT.json" + }, + { + "key": "FIX", + "name": "Fix", + "mode": "autonomous", + "glyph": "#", + "step_count": 5, + "schema_path": "FIX.json" + } + ], + "loop_kind": "single_pass", + "review_gates": [ + "test_suite" + ], + "stop_conditions": [ + "tests_green" + ], + "memory_surfaces": [ + "ticket" + ], + "search_text": "autonomous builtin dev dev_kanban developer feat feature fix kanban mit official operator single_pass task test_suite untra with" + }, + { + "id": "devops_kanban", + "name": "DevOps Kanban", + "description": "DevOps kanban with TASK, FEAT, FIX, SPIKE, INV", + "version": "1.0.0", + "tier": "official", + "author": "Operator!", + "publisher": "untra", + "url": "https://github.com/untra/operator", + "license": "MIT", + "tags": [ + "builtin", + "kanban", + "devops" + ], + "created": "2026-01-08", + "updated": "2026-06-16", + "icon_path": "devops_kanban/icon.svg", + "docs_path": "/workflows/devops_kanban/", + "manifest_path": "devops_kanban/collection.json", + "issue_type_count": 5, + "issue_types": [ + { + "key": "TASK", + "name": "Task", + "mode": "autonomous", + "glyph": ">", + "step_count": 1, + "schema_path": "TASK.json" + }, + { + "key": "FEAT", + "name": "Feature", + "mode": "autonomous", + "glyph": "*", + "step_count": 5, + "schema_path": "FEAT.json" + }, + { + "key": "FIX", + "name": "Fix", + "mode": "autonomous", + "glyph": "#", + "step_count": 5, + "schema_path": "FIX.json" + }, + { + "key": "SPIKE", + "name": "Spike", + "mode": "paired", + "glyph": "?", + "step_count": 3, + "schema_path": "SPIKE.json" + }, + { + "key": "INV", + "name": "Investigation", + "mode": "paired", + "glyph": "!", + "step_count": 5, + "schema_path": "INV.json" + } + ], + "loop_kind": "review_loop", + "review_gates": [ + "human", + "test_suite" + ], + "stop_conditions": [ + "tests_green", + "review_approved" + ], + "memory_surfaces": [ + "ticket", + "scratchpad" + ], + "search_text": "autonomous builtin devops devops_kanban feat feature fix human inv investigation kanban mit official operator paired review_loop spike task test_suite untra with" + }, + { + "id": "operator", + "name": "Operator", + "description": "Operator automation tasks: ASSESS, SYNC, INIT", + "version": "1.0.0", + "tier": "official", + "author": "Operator!", + "publisher": "untra", + "url": "https://github.com/untra/operator", + "license": "MIT", + "tags": [ + "builtin", + "automation" + ], + "created": "2026-01-08", + "updated": "2026-07-01", + "icon_path": "operator/icon.svg", + "docs_path": "/workflows/operator/", + "manifest_path": "operator/collection.json", + "issue_type_count": 5, + "issue_types": [ + { + "key": "ASSESS", + "name": "Project Assessment", + "mode": "autonomous", + "glyph": "~", + "step_count": 2, + "schema_path": "ASSESS.json" + }, + { + "key": "SYNC", + "name": "Catalog Sync", + "mode": "autonomous", + "glyph": "@", + "step_count": 3, + "schema_path": "SYNC.json" + }, + { + "key": "INIT", + "name": "Workspace Init", + "mode": "paired", + "glyph": "%", + "step_count": 3, + "schema_path": "INIT.json" + }, + { + "key": "AGENT_SETUP", + "name": "Agent Setup", + "mode": "paired", + "glyph": "@", + "step_count": 3, + "schema_path": "AGENT_SETUP.json" + }, + { + "key": "PROJECT_INIT", + "name": "Project Initialization", + "mode": "autonomous", + "glyph": "*", + "step_count": 2, + "schema_path": "PROJECT_INIT.json" + } + ], + "loop_kind": "single_pass", + "review_gates": [ + "human" + ], + "stop_conditions": [ + "setup_artifacts_written" + ], + "memory_surfaces": [ + "ticket", + "catalog-info.yaml", + ".claude/agents/" + ], + "search_text": "agent agent_setup assess assessment automation autonomous builtin catalog human init initialization mit official operator paired project project_init setup single_pass sync tasks untra workspace" + }, + { + "id": "ralph_loop", + "name": "Ralph Loop", + "description": "PRD-to-story loop for completing one right-sized story per fresh agent context.", + "version": "1.0.0", + "tier": "community", + "author": "snarktank", + "publisher": "untra", + "url": "https://github.com/snarktank/ralph", + "license": "MIT", + "tags": [ + "agentic-loop", + "prd", + "stories", + "ralph" + ], + "created": "2026-06-16", + "updated": "2026-07-01", + "icon_path": "ralph_loop/icon.svg", + "docs_path": "/workflows/ralph_loop/", + "manifest_path": "ralph_loop/collection.json", + "issue_type_count": 3, + "issue_types": [ + { + "key": "PRD", + "name": "Product Requirements Document", + "mode": "paired", + "glyph": "P", + "step_count": 4, + "schema_path": "PRD.json" + }, + { + "key": "STORY", + "name": "Ralph Story", + "mode": "autonomous", + "glyph": "S", + "step_count": 5, + "schema_path": "STORY.json" + }, + { + "key": "RLOOP", + "name": "Ralph Loop Coordinator", + "mode": "paired", + "glyph": "R", + "step_count": 4, + "schema_path": "RLOOP.json" + } + ], + "loop_kind": "fresh_context_story_loop", + "review_gates": [ + "plan_review", + "test_suite", + "story_completion_check" + ], + "stop_conditions": [ + "all stories have passes=true", + "blocked story documented", + "quality gates fail repeatedly", + "max_iterations reached (advisory; outer story loop is operator-queue-driven)" + ], + "memory_surfaces": [ + ".tickets/workflows/{{ id }}/prd.json", + ".tickets/workflows/{{ id }}/progress.txt", + "AGENTS.md" + ], + "search_text": "agent agentic-loop autonomous community completing context coordinator document for fresh fresh_context_story_loop loop mit one paired per plan_review prd prd-to-story product ralph ralph_loop requirements right-sized rloop snarktank stories story story_completion_check test_suite untra" + }, + { + "id": "jr_orchestration", + "name": "JR Orchestration", + "description": "Feature/task orchestration with coder, reviewer, architect, and rebase work units.", + "version": "1.0.0", + "tier": "community", + "author": "snapwich", + "publisher": "untra", + "url": "https://github.com/snapwich/jr", + "license": "MIT", + "tags": [ + "agentic-loop", + "feature-graph", + "review", + "jr" + ], + "created": "2026-06-16", + "updated": "2026-07-01", + "icon_path": "jr_orchestration/icon.svg", + "docs_path": "/workflows/jr_orchestration/", + "manifest_path": "jr_orchestration/collection.json", + "issue_type_count": 5, + "issue_types": [ + { + "key": "JRPLAN", + "name": "JR Plan", + "mode": "paired", + "glyph": "J", + "step_count": 4, + "schema_path": "JRPLAN.json" + }, + { + "key": "JRFEAT", + "name": "JR Feature", + "mode": "paired", + "glyph": "F", + "step_count": 4, + "schema_path": "JRFEAT.json" + }, + { + "key": "JRTASK", + "name": "JR Task", + "mode": "autonomous", + "glyph": "T", + "step_count": 5, + "schema_path": "JRTASK.json" + }, + { + "key": "JRREV", + "name": "JR Review", + "mode": "paired", + "glyph": "V", + "step_count": 4, + "schema_path": "JRREV.json" + }, + { + "key": "JRREBASE", + "name": "JR Rebase", + "mode": "autonomous", + "glyph": "B", + "step_count": 4, + "schema_path": "JRREBASE.json" + } + ], + "loop_kind": "feature_task_review_graph", + "review_gates": [ + "code_review", + "architect_review", + "human_pr_review" + ], + "stop_conditions": [ + "feature PR ready for human review", + "review changes requested", + "blocked dependency documented", + "review escalated to human after repeated changes (operator stops; no auto-handoff)" + ], + "memory_surfaces": [ + ".tickets/jr/{{ id }}/plan.md", + ".tickets/jr/{{ feature_id }}/handoff.md", + "ticket parent/dependency notes" + ], + "search_text": "agentic-loop and architect architect_review autonomous code_review coder community feature feature-graph feature/task feature_task_review_graph human_pr_review jr jr_orchestration jrfeat jrplan jrrebase jrrev jrtask mit orchestration paired plan rebase review reviewer snapwich task units untra with work" + }, + { + "id": "elves_overnight", + "name": "Elves Overnight", + "description": "Long-running staged batch workflow with durable memory, validation, PR review, and reporting.", + "version": "1.0.0", + "tier": "community", + "author": "Aigora", + "publisher": "untra", + "url": "https://github.com/aigorahub/elves", + "license": "MIT", + "tags": [ + "agentic-loop", + "overnight", + "batch", + "elves" + ], + "created": "2026-06-16", + "updated": "2026-07-01", + "icon_path": "elves_overnight/icon.svg", + "docs_path": "/workflows/elves_overnight/", + "manifest_path": "elves_overnight/collection.json", + "issue_type_count": 4, + "issue_types": [ + { + "key": "ELVSTAGE", + "name": "Elves Stage", + "mode": "paired", + "glyph": "E", + "step_count": 4, + "schema_path": "ELVSTAGE.json" + }, + { + "key": "ELVBATCH", + "name": "Elves Batch", + "mode": "autonomous", + "glyph": "B", + "step_count": 9, + "schema_path": "ELVBATCH.json" + }, + { + "key": "LANDPR", + "name": "Land Pull Request", + "mode": "paired", + "glyph": "L", + "step_count": 6, + "schema_path": "LANDPR.json" + }, + { + "key": "ELVRPT", + "name": "Elves Report", + "mode": "paired", + "glyph": "R", + "step_count": 3, + "schema_path": "ELVRPT.json" + } + ], + "loop_kind": "staged_long_running_batch_loop", + "review_gates": [ + "stage_review", + "batch_validation", + "fresh_review", + "judge_verdict", + "human_land_gate" + ], + "stop_conditions": [ + "batch complete and checkpointed", + "validation cannot be repaired safely", + "PR has unresolved requested changes", + "time/risk budget exhausted" + ], + "memory_surfaces": [ + "docs/elves/survival-guide.md", + "docs/elves/execution-log.md", + "docs/elves/learnings.md", + ".elves-session.json", + "PR comments and checks" + ], + "search_text": "agentic-loop aigora and autonomous batch batch_validation community durable elvbatch elves elves_overnight elvrpt elvstage fresh_review human_land_gate judge_verdict land landpr long-running memory mit overnight paired pr pull report reporting request review stage stage_review staged staged_long_running_batch_loop untra validation with workflow" + }, + { + "id": "coder", + "name": "Coder", + "description": "Linear-synced engineering flow: Feature, Improvement, and Bug work delegated to coding agents.", + "version": "1.0.0", + "tier": "community", + "author": "untra", + "publisher": "untra", + "url": "https://github.com/untra/operator", + "license": "MIT", + "tags": [ + "community", + "linear", + "kanban", + "engineering" + ], + "created": "2026-08-01", + "updated": "2026-08-01", + "icon_path": "coder/icon.svg", + "docs_path": "/workflows/coder/", + "manifest_path": "coder/collection.json", + "issue_type_count": 3, + "issue_types": [ + { + "key": "FEATURE", + "name": "Feature", + "mode": "autonomous", + "glyph": "+", + "step_count": 5, + "schema_path": "FEATURE.json" + }, + { + "key": "IMPROVEMENT", + "name": "Improvement", + "mode": "autonomous", + "glyph": "^", + "step_count": 4, + "schema_path": "IMPROVEMENT.json" + }, + { + "key": "BUG", + "name": "Bug", + "mode": "autonomous", + "glyph": "x", + "step_count": 5, + "schema_path": "BUG.json" + } + ], + "loop_kind": "kanban_synced_single_pass", + "review_gates": [ + "plan_review", + "test_suite", + "pr_review" + ], + "stop_conditions": [ + "tests_green", + "pr_created" + ], + "memory_surfaces": [ + "ticket", + ".tickets/plans/{{ id }}.md" + ], + "search_text": "agents and autonomous bug coder coding community delegated engineering feature flow improvement kanban kanban_synced_single_pass linear linear-synced mit plan_review pr_review test_suite to untra work" + }, + { + "id": "example_chores", + "name": "Example Chores", + "description": "Minimal example community collection demonstrating the shareable format.", + "version": "0.1.0", + "tier": "community", + "author": "untra", + "publisher": null, + "url": "https://github.com/untra/operator", + "license": "MIT", + "tags": [ + "example", + "starter" + ], + "created": "2026-07-01", + "updated": "2026-07-01", + "icon_path": "example_chores/icon.svg", + "docs_path": "/workflows/example_chores/", + "manifest_path": "example_chores/collection.json", + "issue_type_count": 1, + "issue_types": [ + { + "key": "CHORE", + "name": "Chore", + "mode": "autonomous", + "glyph": "*", + "step_count": 2, + "schema_path": "CHORE.json" + } + ], + "loop_kind": "single_pass", + "review_gates": [ + "test_suite" + ], + "stop_conditions": [ + "tests_green" + ], + "memory_surfaces": [ + "ticket" + ], + "search_text": "autonomous chore chores collection community demonstrating example example_chores format minimal mit shareable single_pass starter test_suite the untra" + } + ] +} diff --git a/docs/collections/simple/collection.json b/docs/collections/simple/collection.json index 79d68938..b5d80e68 100644 --- a/docs/collections/simple/collection.json +++ b/docs/collections/simple/collection.json @@ -12,6 +12,11 @@ "builtin" ], "compatibility": null, + "tier": "official", + "icon_path": "icon.svg", + "created": "2026-01-08", + "updated": "2026-07-01", + "kanban_defaults": null, "issue_types": [ { "key": "TASK", @@ -21,7 +26,18 @@ "template_checksum": "7a71bf692588af1d1ac5d9192edd64316353ada616e22019dfff7683ab5d09c4" } ], - "workflow_hints": null, + "workflow_hints": { + "loop_kind": "single_pass", + "memory_surfaces": [ + "ticket" + ], + "review_gates": [], + "external_tools": [], + "stop_conditions": [ + "task_complete" + ], + "runner_semantics": "prompt_driven" + }, "default_selected": [ "TASK" ], diff --git a/docs/collections/simple/icon.svg b/docs/collections/simple/icon.svg new file mode 100644 index 00000000..35bac239 --- /dev/null +++ b/docs/collections/simple/icon.svg @@ -0,0 +1 @@ +Simple diff --git a/docs/design-system/index.md b/docs/design-system/index.md index 375812de..22d49edf 100644 --- a/docs/design-system/index.md +++ b/docs/design-system/index.md @@ -65,7 +65,7 @@ identically. | **Docs site** (Jekyll) | `docs/assets/css/main.css` | Links `tokens.css`; style with `var(--...)`, never raw hex. | | **Embedded SPA** (Vite/React) | `ui/src/index.css` + `*.module.css` | Imports `tokens.css`; uses semantic tokens, never raw hex. | | **Ratatui TUI** | `src/ui/*.rs` | Terminal can't render hex — map a semantic **role to ANSI** (danger→Red, success→Green, warning→Yellow, focus→Cyan). | -| **VS Code webview** (MUI) | `vscode-extension/webview-ui/` | Defers to the VS Code host theme; brand only as accents via `OPERATOR_BRAND`. Never overrides the editor theme. | +| **VS Code webview** | `vscode-extension/webview-ui/` | Defers to the VS Code host theme via raw `var(--vscode-*)` custom properties (`styles/webview.css`); brand only as `--op-*` accents. Never overrides the editor theme. No MUI/CSS-in-JS. | ## Concept icons (codicons) @@ -118,6 +118,46 @@ was resolved as kanban→`layout`, projects→`project`. > the font/CSS **code** is MIT, © Microsoft. The webfont is vendored under > `docs/assets/` and bundled into the SPA via `@vscode/codicons`. +## Brand & collection icons (SVG) + +Codicons cover concepts. Everything else — provider logos, collection glyphs — is a hand-shipped SVG, and every one of them follows the **Operator icon standard**: a single monochrome `` on a 24×24 canvas carrying no color or +size of its own. + +That shape is what makes one file work on all four surfaces at once. The docs +site inlines collection icons directly into generated HTML, the SPA loads them +through ``, and both themes recolor them from context. + +| Rule | Why | +|------|-----| +| `viewBox="0 0 24 24"` | One coordinate space, so icons are interchangeable and align optically when mixed | +| `role="img"` + exactly one `` | The glyph is content, not decoration; assistive tech needs a name | +| Exactly one `<path>` | A single shape can be recolored, masked, or inlined as a unit | +| No other elements | `<text>` depends on per-surface fonts; `<image>`/`<use>` pull in external documents; `<style>`/`<script>` do not survive inlining | +| No `fill` / `stroke` / `style` | Color comes from `currentColor`, so the icon follows the theme. A hardcoded fill is invisible in light or dark | +| No `width` / `height` | Size is the container's decision | +| No `on*` handlers or external refs | These files are inlined verbatim into generated pages | + +```svg +<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Ralph Loop +``` + +**Where icons live.** `icons/` is the canonical set; `docs/assets/icons/` and +`ui/public/icons/` are the per-surface copies; each collection ships its own +`icon.svg` beside its `collection.json`, titled with the collection's display +name. + +**Adding one.** Copy the shape from [Simple Icons](https://simpleicons.org) +where one exists, or draw a single path on a 24×24 grid. Then: + +```bash +cargo test --test svg_icon_standard +``` + +That test governs every directory above and catches a missing title, a stray +`fill`, a second ``, a wrong viewBox, or embedded script. The only +exemption is `docs/assets/img/operator_logo.svg` — a full-color wordmark, not a +glyph — and the test also asserts that exemption is still needed. + ## Issue type glyphs & colors Issue type color + glyph are defined once in the collection JSON schemas and diff --git a/docs/getting-started/agents/index.md b/docs/getting-started/agents/index.md index d78283ec..26bec423 100644 --- a/docs/getting-started/agents/index.md +++ b/docs/getting-started/agents/index.md @@ -29,3 +29,59 @@ Each agent can: ## Choosing an Agent **Claude** is recommended for most users due to its strong code understanding and generation capabilities. See individual agent pages for setup instructions and specific features. + +## Agent Lifecycle + +Operator tracks every agent it launches through these states: + +``` +Created -> Running -> Completed + | + v + Awaiting Input +``` + +| State | Description | +|-------|-------------| +| **Created** | Agent initialized, not yet started | +| **Running** | Actively working on a ticket | +| **Awaiting Input** | Needs a human response | +| **Completed** | Work finished successfully | +| **Failed** | An error occurred | + +## Autonomous and Paired Modes + +Every issue type declares a `mode`, and that decides how much of your attention +its tickets need: + +- **Autonomous** — launch and monitor. Minimal intervention, and several can run + in parallel across different projects. +- **Paired** — active human participation, with back-and-forth discussion. One at + a time, because they compete for the same operator: you. + +Mode is a property of the issue type, not of the agent, so a collection decides +which of its work types are hands-off. See [Workflows](/workflows/). + +## Sessions + +Agent sessions persist under `.operator/`: + +``` +.operator/ +├── state.json +├── sessions/ +│ ├── agent-123.json +│ └── agent-456.json +└── history.json +``` + +Session files record ticket information, start and end times, status history, and +output logs. Operator can also detect completion from files an agent produces — +see [Artifact Detection](/artifact-detection/). + +## Best Practices + +1. **Monitor paired agents** — stay engaged with paired work +2. **Review autonomous work** — check completed tickets +3. **Handle failures promptly** — address failed agents quickly +4. **Balance load** — don't overload with too many agents diff --git a/docs/getting-started/kanban/github.md b/docs/getting-started/kanban/github.md index 320f5b1e..bcf2ebbe 100644 --- a/docs/getting-started/kanban/github.md +++ b/docs/getting-started/kanban/github.md @@ -72,8 +72,12 @@ api_key_env = "OPERATOR_GITHUB_TOKEN" # default [kanban.github."my-org".projects.PVT_kwDOABcdefg] sync_user_id = "12345678" # numeric GitHub `databaseId` -sync_statuses = ["In Progress", "Todo"] collection_name = "dev_kanban" + +[kanban.github."my-org".projects.PVT_kwDOABcdefg.status_mapping] +todo = "Todo" # Status option pulled into operator's queue (and requeue target) +doing = "In Progress" # Status pushed when a ticket is launched/claimed +done = "Done" # Status pushed when a ticket completes ``` The hashmap key under `[kanban.github.""]` is the GitHub owner login (user or org). Project keys inside `projects` are **GraphQL node IDs** (e.g. `PVT_kwDOABcdefg`) — not project numbers — because every Projects v2 mutation needs the node ID and storing it directly avoids an extra lookup per call. @@ -171,15 +175,29 @@ Operator's `kanban_issuetype_service` syncs the available types into a local cat ```toml [kanban.github."my-org".projects.PVT_kwDOABcdefg] sync_user_id = "12345678" # your numeric GitHub databaseId -sync_statuses = ["In Progress", "Todo"] # Status field option names to sync collection_name = "dev_kanban" # IssueTypeCollection to use +[kanban.github."my-org".projects.PVT_kwDOABcdefg.status_mapping] +todo = "Todo" # Status option pulled into operator's queue (and requeue target) +doing = "In Progress" # Status pushed when a ticket is launched/claimed +done = "Done" # Status pushed when a ticket completes + [kanban.github."my-org".projects.PVT_kwDOABcdefg.type_mappings] "L_bug" = "FIX" "L_feature" = "FEAT" "L_spike" = "SPIKE" ``` +`status_mapping` maps operator's strict todo/doing/done states to the project's +`Status` single-select option names. Issues are pulled from the `todo` (and +`doing`) columns; with `bidirectional = true`, ticket transitions push the card +to the mapped column (requeue → `todo` only fires when `todo` is mapped; +unmapped `doing`/`done` fall back to `"In Progress"`/`"Done"`). Discover the +real option names via `GET /api/v1/kanban/github/PVT_kwDOABcdefg/statuses`. + +> **Migrating from `sync_statuses`:** the old list is no longer read (the key +> is silently ignored). Re-express it as the `status_mapping` table above. + The keys in `type_mappings` are the GraphQL label IDs (or issue type IDs) returned by `get_issue_types()` — they're persisted in the local issue type catalog after the first sync, and you can find them with: ```bash @@ -194,7 +212,7 @@ Pull issues from GitHub Projects: operator sync ``` -The provider client-side filters by your `sync_user_id` (project items don't support server-side assignee filtering in the GraphQL API), so very large projects may pull a few extra pages before applying the filter. Status filtering uses the `Status` single-select field's option names — make sure the values in `sync_statuses` exactly match the names defined in your project (case-insensitive). +The provider client-side filters by your `sync_user_id` (project items don't support server-side assignee filtering in the GraphQL API), so very large projects may pull a few extra pages before applying the filter. Status filtering uses the `Status` single-select field's option names — make sure the values in `status_mapping` exactly match the names defined in your project (case-insensitive). ### What gets synced @@ -249,7 +267,7 @@ If `project` (or `read:project`) is missing, that's your problem. - Confirm `sync_user_id` is the numeric `databaseId`, **not** your login. `gh api user --jq .id` returns the right value. - Confirm the issue is actually assigned to that user. Operator filters client-side after fetching, so unassigned items are dropped silently. -- Confirm the issue's Status field value appears in `sync_statuses`. Match is case-insensitive but must otherwise be exact. +- Confirm the issue's Status field value matches the `status_mapping` `todo` (or `doing`) column. Match is case-insensitive but must otherwise be exact. - For huge projects (>500 items), check the operator logs for pagination warnings. ### "No GitHub Projects v2 found for this token" diff --git a/docs/getting-started/kanban/index.md b/docs/getting-started/kanban/index.md index fb89a881..88464f63 100644 --- a/docs/getting-started/kanban/index.md +++ b/docs/getting-started/kanban/index.md @@ -24,6 +24,64 @@ Operator syncs tickets from your kanban provider: 3. **Assign**: Dispatches tickets to available agents 4. **Update**: Pushes status changes back to your provider +## The Ticket Lifecycle + +Whether tickets come from a provider or from `.tickets/`, Operator moves them +through the same three directories: + +``` +.tickets/queue/ -> Work waiting to be picked up +.tickets/in-progress/ -> Currently being worked on +.tickets/completed/ -> Finished work +``` + +**Queue.** New tickets land in `.tickets/queue/` and are ordered by their issue +type's position in the active collection, then FIFO by timestamp within the same +type. The ordering is a property of the collection, not a hard-coded table — see +[Workflows](/workflows/). + +**Assignment.** When an agent slot frees up, Operator selects the next ticket, +prompts for launch confirmation, and moves it to `in-progress/`. + +**In progress.** Agent status is tracked, progress notifications are sent, and +Operator watches for completion or for the agent awaiting input. + +**Completion.** The ticket moves to `completed/`, a notification is sent, and the +slot is freed for the next ticket. + +## Parallelism Rules + +Operator bounds concurrent work so agents do not collide: + +- **Max agents** = min(configured_max, cpu_cores - reserved_cores) +- **Autonomous agents** can run in parallel across different projects +- **Paired agents** run one at a time — they need your attention +- **Same project** is sequential, to avoid conflicting edits + +Whether an issue type is autonomous or paired is declared by its `mode`. See +[Supported Coding Agents](/getting-started/agents/) for what each mode means in +practice. + +## Column Mapping (todo / doing / done) + +Operator is strict about its three internal states — **todo**, **doing**, +**done** — because they represent the work actually inflight at operator's +level. External boards have flexible columns, so each synced project declares +a `status_mapping` linking the two: + +```toml +[kanban.."".projects..status_mapping] +todo = "To Do" # pulled into the queue; requeue pushes back here +doing = "In Progress" # pushed when a ticket is launched/claimed +done = "Done" # pushed when a ticket completes +``` + +With `bidirectional = true`, a synced ticket moves on the external board as +operator works it: launch → `doing`, complete → `done`, return-to-queue → +`todo`. The board's real column names are discoverable via the +`/api/v1/kanban/statuses` endpoints, and the VS Code config panel offers them +as dropdowns. See the per-provider guides for details. + ## Choosing a Provider Both Jira Cloud and Linear are fully supported kanban providers: @@ -33,4 +91,4 @@ Both Jira Cloud and Linear are fully supported kanban providers: ## Local Tickets -Operator also supports local-only tickets in `.tickets/queue/` for projects without external issue tracking. See [Tickets](/tickets/) for details. +Operator also supports local-only tickets in `.tickets/queue/` for projects without external issue tracking. See [Tickets](/getting-started/tickets/) for details. diff --git a/docs/getting-started/kanban/jira.md b/docs/getting-started/kanban/jira.md index 15845bae..78781c6e 100644 --- a/docs/getting-started/kanban/jira.md +++ b/docs/getting-started/kanban/jira.md @@ -87,10 +87,35 @@ Configure sync settings for each project: ```toml [kanban.jira."your-org.atlassian.net".projects.PROJ] sync_user_id = "5e3f7acd9876543210abcdef" # Your Jira accountId -sync_statuses = ["To Do", "In Progress"] # Statuses to sync (empty = default only) collection_name = "dev_kanban" # IssueTypeCollection to use + +[kanban.jira."your-org.atlassian.net".projects.PROJ.status_mapping] +todo = "To Do" # Column pulled into operator's queue (and requeue target) +doing = "In Progress" # Column pushed when a ticket is launched/claimed +done = "Done" # Column pushed when a ticket completes ``` +### Column Mapping (todo / doing / done) + +Operator is strict about its three internal states — todo, doing, done — while +Jira boards have arbitrary columns. `status_mapping` declares which Jira status +corresponds to each operator state: + +- Issues are **pulled** from the `todo` (and `doing`) columns into the queue. +- With `bidirectional = true`, launching a ticket moves the Jira issue to + `doing`, completing it moves it to `done`, and returning it to the queue + moves it back to `todo` (requeue only pushes when `todo` is mapped). +- Unmapped `doing`/`done` fall back to `"In Progress"`/`"Done"` on push. + +Discover the board's real column names via +`POST /api/v1/kanban/statuses` (onboarding) or +`GET /api/v1/kanban/jira/PROJ/statuses` (configured project) — the VS Code +config panel uses these to populate the mapping dropdowns. + +> **Migrating from `sync_statuses`:** the old +> `sync_statuses = ["To Do", "In Progress"]` list is no longer read (the key is +> silently ignored). Re-express it as the explicit `status_mapping` table above. + ## Troubleshooting ### Authentication errors diff --git a/docs/getting-started/kanban/linear.md b/docs/getting-started/kanban/linear.md index 5da6e2bc..4d4cab7e 100644 --- a/docs/getting-started/kanban/linear.md +++ b/docs/getting-started/kanban/linear.md @@ -92,10 +92,28 @@ Configure sync settings for each team: ```toml [kanban.linear."team-uuid-here".projects.default] sync_user_id = "user-uuid-here" # Your Linear user ID -sync_statuses = ["Todo", "In Progress"] # Statuses to sync (empty = default only) collection_name = "dev_kanban" # IssueTypeCollection to use + +[kanban.linear."team-uuid-here".projects.default.status_mapping] +todo = "Todo" # Workflow state pulled into operator's queue (and requeue target) +doing = "In Progress" # State pushed when a ticket is launched/claimed +done = "Done" # State pushed when a ticket completes ``` +### Column Mapping (todo / doing / done) + +`status_mapping` declares which Linear workflow state corresponds to each of +operator's strict todo/doing/done states. Issues are pulled from the `todo` +(and `doing`) states; with `bidirectional = true`, ticket transitions are +pushed back to the mapped states (requeue → `todo` only fires when `todo` is +mapped; unmapped `doing`/`done` fall back to `"In Progress"`/`"Done"`). + +Discover the team's real state names via `POST /api/v1/kanban/statuses` +(onboarding) or `GET /api/v1/kanban/linear/TEAM/statuses` (configured team). + +> **Migrating from `sync_statuses`:** the old list is no longer read (the key +> is silently ignored). Re-express it as the `status_mapping` table above. + ## Troubleshooting ### Authentication errors diff --git a/docs/getting-started/platform-support.md b/docs/getting-started/platform-support.md index d52b60b9..4072d658 100644 --- a/docs/getting-started/platform-support.md +++ b/docs/getting-started/platform-support.md @@ -72,7 +72,7 @@ These gaps apply on every operating system because the integration itself is not | Kanban: GitHub Issues | ⚠️ Detection only | GitHub Issues is detected as a provider but full two-way sync (create, update, close) is not implemented. Only Jira Cloud and Linear have full sync. | | Git: GitLab (`glab`) | ⚠️ Detection only | GitLab is detected via the `glab` CLI for branch and PR metadata, but PR creation and status webhooks are not implemented. | | Git: Bitbucket, Azure DevOps | ⚠️ Detection only | Detected via their respective CLIs; no PR workflow integration. | -| Agent: Gemini CLI | ⚠️ Experimental | Session detection and artifact parsing are less battle-tested than Claude Code. Some multi-step issue-type flows may behave unexpectedly. | +| Agent: Gemini CLI | ⚠️ Experimental | Session detection and artifact parsing are less tested than Claude Code. Some multi-step issue-type flows may behave unexpectedly. | --- diff --git a/docs/getting-started/sessions/cmux.md b/docs/getting-started/sessions/cmux.md index 61133b6e..7e0cb485 100644 --- a/docs/getting-started/sessions/cmux.md +++ b/docs/getting-started/sessions/cmux.md @@ -22,7 +22,8 @@ Operator uses cmux workspaces to run LLM agent sessions, allowing you to focus a 1. **macOS** — cmux is a macOS-only application 2. **cmux installed** — by default, Operator looks for the binary at `/Applications/cmux.app/Contents/Resources/bin/cmux` -3. **Running inside cmux** — Operator must be launched from within a cmux session (the `CMUX_WORKSPACE_ID` environment variable must be present) +3. **cmux 0.64.8 or newer** — Operator's placement policies rely on `new-workspace --window`, which landed in cmux 0.64.8. Older versions are rejected at startup with an explicit `Unsupported version` error — update cmux to resolve it. +4. **Running inside cmux** — Operator must be launched from within a cmux session (the `CMUX_WORKSPACE_ID` environment variable must be present) ## Configuration diff --git a/docs/tickets/index.md b/docs/getting-started/tickets/index.md similarity index 66% rename from docs/tickets/index.md rename to docs/getting-started/tickets/index.md index 27d85cb7..43d9424d 100644 --- a/docs/tickets/index.md +++ b/docs/getting-started/tickets/index.md @@ -1,10 +1,12 @@ --- -title: Tickets +title: "Tickets" description: "Create and manage tickets with markdown format, naming conventions, and best practices for LLM agents." layout: doc --- -Tickets are the core unit of work in Operator!. They describe tasks for LLM agents to complete. +# Tickets + +Tickets are the unit of work in Operator!. Each one describes a task for an agent to complete, and carries an **issue type** that decides *how* the work is done — see [Workflows](/workflows/) for the process behind the ticket. ## Ticket Format @@ -14,6 +16,8 @@ Tickets are markdown files with a specific naming convention: {TYPE}-{ID}-{project}-{description}.md ``` +`{TYPE}` is the issue type key (`FEAT`, `FIX`, `PRD`, …), which is why keys never contain hyphens — the hyphen separates the key from the ticket number. + ### Examples ``` @@ -48,6 +52,9 @@ Implement a dark mode toggle in the application settings. See design mockup in Figma: [link] ``` +The exact fields a ticket carries are defined by its issue type. See the +[ticket metadata schema](/schemas/metadata/) for the YAML frontmatter format. + ## Creating Tickets ### Manual Creation @@ -56,7 +63,7 @@ See design mockup in Figma: [link] 2. Follow the naming convention 3. Add ticket content -### Using Operator! CLI +### Using the CLI ```bash # Show current queue @@ -66,6 +73,11 @@ cargo run -- queue cargo run -- launch ``` +### From a Kanban Provider + +Tickets can also be synced from Jira, Linear, or GitHub Projects rather than +authored by hand. See [Supported Kanban Providers](/getting-started/kanban/). + ## Ticket Directories ``` @@ -78,7 +90,7 @@ cargo run -- launch ## Ticket Lifecycle 1. **Created** - Ticket added to `queue/` -2. **Assigned** - Moved to `in-progress/` when agent starts +2. **Assigned** - Moved to `in-progress/` when an agent starts 3. **Completed** - Moved to `completed/` when done ## Best Practices diff --git a/docs/getting-started/workflows/index.md b/docs/getting-started/workflows/index.md index cc997db2..187115f0 100644 --- a/docs/getting-started/workflows/index.md +++ b/docs/getting-started/workflows/index.md @@ -1,16 +1,20 @@ --- -title: "Workflow Formats" -description: "Render an Operator ticket + issue type into a workflow another LLM tool or model can run." +title: "Workflow Export Formats" +description: "Export an Operator workflow into a format another LLM tool or model can run." layout: doc --- -# Workflow Formats +# Workflow Export Formats Operator is a kanban-shaped orchestrator: each **ticket** carries the work, and -its **issue type** carries the *shape* of the work — an ordered set of steps -(tasks, classifiers, delegators, fan-outs, pipelines, human review gates). A -**workflow export** renders that `ticket + issue type` pair into a concrete -orchestration format another tool or model can execute. +its **issue type** carries an **Operator workflow** — an ordered graph of steps +(tasks, classifiers, delegators, fan-outs, pipelines, human review gates). That +JSON-defined workflow is the *native* format, and it is what +[collections](/workflows/) share. + +A **workflow export** renders a `ticket + issue type` pair into a concrete +orchestration format some *other* tool or model can execute. Exports are +derived from the native workflow — never the other way round. This is **export-only and lossy-by-design**: Operator emits the format; it does not parse one back. Shapes a target can't represent natively (human review diff --git a/docs/index.md b/docs/index.md index 2fde473e..a1378e06 100644 --- a/docs/index.md +++ b/docs/index.md @@ -29,11 +29,12 @@ Welcome friend! Operator! is an application ## Quick Links -- [Kanban](/kanban/) - Understand the kanban workflow +- [Workflows](/workflows/) - Browse shareable collections of AI composed workflows +- [Supported Kanban Providers](/getting-started/kanban/) - Sync work from Jira, Linear, or GitHub Projects +- [Tickets](/getting-started/tickets/) - Create and manage work tickets +- [Supported Coding Agents](/getting-started/agents/) - Agent lifecycle and modes - [LLM Tools](/llm-tools/) - Configure LLM integration -- [Tickets](/tickets/) - Create and manage work tickets -- [Agents](/agents/) - Agent lifecycle and modes -- [Tmux](/tmux/) - Terminal session management +- [Session Management](/getting-started/sessions/) - tmux, cmux, Zellij, and editors ## Similar diff --git a/docs/issue-types/index.md b/docs/issue-types/index.md deleted file mode 100644 index fbb4a6ec..00000000 --- a/docs/issue-types/index.md +++ /dev/null @@ -1,282 +0,0 @@ ---- -title: Issue Types -description: "Learn about INV, FIX, FEAT, SPIKE, and TASK issue types, custom definitions, and Jira imports." -layout: doc ---- - -Operator! supports five built-in issue types, organized into collections for different workflows. You can also define custom issue types and import from external kanban systems. - -## Built-in Issue Types - -### INV - Investigation - -**Priority:** 1 (highest) -**Mode:** Paired - -Investigation tickets are for diagnosing failures, understanding bugs, or exploring issues. They require human interaction and are worked on with operator pairing. - -``` -INV-001-project-investigate-login-failure.md -``` - -### FIX - Bug Fix - -**Priority:** 2 -**Mode:** Autonomous - -Bug fixes are addressed after investigations. Agents can work autonomously once the problem is understood. - -``` -FIX-042-project-fix-null-pointer-exception.md -``` - -### FEAT - Feature - -**Priority:** 3 -**Mode:** Autonomous - -New features are implemented after critical bugs are addressed. Agents can work autonomously with clear requirements. - -``` -FEAT-123-project-add-dark-mode.md -``` - -### SPIKE - Research - -**Priority:** 4 -**Mode:** Paired - -Spikes are for research, exploration, and proof-of-concept work. They require human interaction and discussion. - -``` -SPIKE-007-project-evaluate-new-framework.md -``` - -### TASK - General Task - -**Priority:** 5 (lowest) -**Mode:** Autonomous - -Tasks are general work items that don't fit other categories. Used in simple workflows or as a catch-all. - -``` -TASK-099-project-update-dependencies.md -``` - -## Collections - -Collections are named groupings of issue types that define which types are available and their priority order. This allows teams to customize their workflow. - -### Built-in Presets - -| Preset | Issue Types | Priority Order | -|--------|-------------|----------------| -| `simple` | TASK | TASK | -| `dev_kanban` | TASK, FEAT, FIX | FIX, FEAT, TASK | -| `devops_kanban` | TASK, SPIKE, INV, FEAT, FIX | INV, FIX, FEAT, SPIKE, TASK | - -The default collection is `devops_kanban`. - -### Using Collections - -Collections can be activated via configuration: - -```toml -# config.toml -[templates] -active_collection = "dev_kanban" -``` - -Or create a custom collection in `.tickets/operator/issuetypes/collections.toml`: - -```toml -[collections.agile] -name = "agile" -description = "Agile development workflow" -types = ["STORY", "BUG", "TASK", "SPIKE"] -priority_order = ["BUG", "STORY", "TASK", "SPIKE"] -``` - -## Custom Issue Types - -Define custom issue types in `.tickets/operator/issuetypes/`: - -``` -.tickets/operator/issuetypes/ - STORY.json # User-defined type - BUG.json # User-defined type - collections.toml # Collection definitions - imports/ # Imported types from Jira -``` - -### Issue Type Schema - -```json -{ - "key": "STORY", - "name": "User Story", - "description": "A user-facing feature from the user's perspective", - "mode": "autonomous", - "glyph": "S", - "color": "cyan", - "project_required": true, - "fields": [ - {"name": "id", "type": "string", "required": true, "auto": "id"}, - {"name": "summary", "type": "string", "required": true, "default": ""}, - {"name": "acceptance_criteria", "type": "string", "required": false} - ], - "steps": [ - { - "name": "plan", - "outputs": ["acceptance_criteria"], - "prompt": "Create a plan for this user story", - "allowed_tools": ["Read", "Grep", "Glob"] - }, - { - "name": "implement", - "outputs": ["code"], - "prompt": "Implement the user story", - "allowed_tools": ["*"] - } - ] -} -``` - -## Importing from Kanban Systems - -Import issue types from Jira to use their type definitions locally. - -### Environment Variables - -```bash -# Jira -export OPERATOR_JIRA_DOMAIN=your-domain.atlassian.net -export OPERATOR_JIRA_EMAIL=you@example.com -export OPERATOR_JIRA_TOKEN=your-api-token -``` - -### Imported Type Structure - -Imported types have fields from the external system but use a single default step: - -```json -{ - "key": "STORY", - "name": "Story", - "description": "Imported from Jira", - "mode": "autonomous", - "glyph": "S", - "fields": [ - {"name": "id", "type": "string", "required": true, "auto": "id"}, - {"name": "summary", "type": "string", "required": true, "default": ""} - ], - "steps": [ - {"name": "execute", "outputs": [], "prompt": "Execute this task", "allowed_tools": ["*"]} - ], - "source": {"import": {"provider": "jira", "project": "MYPROJECT"}}, - "external_id": "10001" -} -``` - -Imported types are stored in: -``` -.tickets/operator/issuetypes/imports/{provider}/{project}/ - Story.json - Bug.json -``` - -## Agent Modes - -### Autonomous Mode (FEAT, FIX, TASK) - -- Launch and monitor progress -- Minimal human intervention -- Can run multiple agents in parallel - -### Paired Mode (SPIKE, INV) - -- Requires active human participation -- Tracks "awaiting input" states -- One paired agent at a time per operator - -## Step Permissions - -Each step in an issue type can define permissions that control the LLM agent's access to tools, directories, and MCP servers. Permissions are provider-agnostic and translated to the appropriate format for Claude, Gemini, or Codex at runtime. - -### Permission Fields - -Steps can include these optional permission fields: - -```json -{ - "name": "build", - "outputs": ["code"], - "prompt": "Implement the feature...", - "allowed_tools": ["Read", "Write", "Edit", "Bash"], - "permissions": { - "tools": { - "allow": [ - { "tool": "Bash", "pattern": "cargo:*" }, - { "tool": "Bash", "pattern": "npm:*" } - ], - "deny": [ - { "tool": "Bash", "pattern": "rm -rf:*" }, - { "tool": "Bash", "pattern": "sudo:*" } - ] - }, - "directories": { - "allow": ["../shared-libs/"], - "deny": ["./.env", "./secrets/"] - }, - "mcp_servers": { - "enable": ["memory"], - "disable": ["filesystem"] - } - }, - "cli_args": { - "claude": ["--output-format", "json"], - "gemini": ["--sandbox", "docker"], - "codex": ["--approval-policy", "on-failure"] - } -} -``` - -### Permission Composition - -Step permissions are **additive** with project-level permissions: - -1. Project permissions are loaded from `.operator/permissions.json` -2. Step permissions are added to project permissions -3. Both allow and deny lists are concatenated -4. Custom flags: step values override project values for the same key - -### Provider Translation - -Permissions are automatically translated to each provider's format: - -| Provider | Config Format | Tool Syntax | -|----------|--------------|-------------| -| Claude | CLI flags | `--allowedTools "Bash(cargo:*)"` | -| Gemini | `.gemini/settings.json` | `"ShellTool(cargo:*)"` | -| Codex | `.codex/config.toml` | `[tools.exec].allow_patterns` | - -### Session Config Persistence - -All generated configs are stored for auditing at: -``` -.tickets/operator/sessions/{ticket-id}/ - claude-audit.txt - settings.json # Gemini config - config.toml # Codex config - launch-command.txt # Full command used -``` - -## Validation - -When loading collections, Operator! validates that all referenced issue types exist. Missing types are logged as warnings and skipped: - -``` -WARN: Collection 'agile' references unknown type 'STORY', skipping -``` - -This allows collections to reference types that may not yet be defined, enabling gradual adoption. diff --git a/docs/kanban/index.md b/docs/kanban/index.md deleted file mode 100644 index 10897024..00000000 --- a/docs/kanban/index.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Kanban Workflow -description: "Understand the kanban-style workflow for managing tickets through queue, in-progress, and completed stages." -layout: doc ---- - -Operator! uses a **Kanban** style workflow to manage tickets through their lifecycle. Kanban is a visual framework used to organize workby displaying tasks on a board, organized into categories of _todo_, _doing_, and _done_. - -## Ticket Lifecycle - -Tickets flow through these stages: - -``` -.tickets/queue/ -> Work waiting to be picked up -.tickets/in-progress/ -> Currently being worked on -.tickets/completed/ -> Finished work -``` - -## Workflow Steps - -### 1. Queue - -New tickets are created in `.tickets/queue/`. They are sorted by: -1. **Priority** - INV > FIX > FEAT > SPIKE -2. **Timestamp** - FIFO within same priority - -### 2. Assignment - -When an agent slot is available, Operator!: -1. Selects the next ticket by priority -2. Prompts for launch confirmation -3. Moves ticket to `in-progress/` - -### 3. In Progress - -While work is in progress: -- Agent status is tracked -- Progress notifications are sent -- Operator! monitors for completion or awaiting input - -### 4. Completion - -When work finishes: -- Ticket moves to `completed/` -- Notification is sent -- Agent slot is freed for next ticket - -## Parallelism Rules - -Operator! enforces these rules for concurrent work: - -- **Max agents** = min(configured_max, cpu_cores - reserved_cores) -- **Autonomous agents** (FEAT, FIX) can run in parallel on different projects -- **Paired agents** (SPIKE, INV) run one at a time per operator -- **Same project** = sequential execution to avoid conflicts - -## External Providers - -In addition to the local `.tickets/` queue described above, Operator! can sync items from external kanban systems: - -- [**Jira Cloud**](../getting-started/kanban/jira.md) — REST API, project + issue type sync -- [**Linear**](../getting-started/kanban/linear.md) — GraphQL API, team-scoped sync -- [**GitHub Projects v2**](../getting-started/kanban/github.md) — GraphQL API, project node ID sync - -GitHub Projects integration uses a **separate token** from Operator!'s PR/git workflows — the kanban provider needs the `project` scope while the git provider needs `repo`. See the [GitHub Projects guide](../getting-started/kanban/github.md) for the full disambiguation. diff --git a/docs/llms.txt b/docs/llms.txt index da8843bd..88b83bcd 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -9,13 +9,14 @@ Operator runs from the root of your work directory, discovers projects by LLM ma ## Getting Started - [Getting Started](https://operator.untra.io/getting-started/): Install and configure Operator! for managing AI-assisted development workflows. +- [Tickets](https://operator.untra.io/getting-started/tickets/): Create and manage tickets with markdown format, naming conventions, and best practices for LLM agents. +- [Supported Kanban Providers](https://operator.untra.io/getting-started/kanban/): Kanban and issue tracking integrations for Operator. +- [Supported Coding Agents](https://operator.untra.io/getting-started/agents/): AI coding agents compatible with Operator. - [Downloads](https://operator.untra.io/downloads/): Download Operator! binaries for macOS, Linux, and Windows. -## Core Concepts -- [Kanban Workflow](https://operator.untra.io/kanban/): Understand the kanban-style workflow for managing tickets through queue, in-progress, and completed stages. -- [Tickets](https://operator.untra.io/tickets/): Create and manage tickets with markdown format, naming conventions, and best practices for LLM agents. -- [Issue Types](https://operator.untra.io/issue-types/): Learn about INV, FIX, FEAT, SPIKE, and TASK issue types, custom definitions, and Jira imports. -- [Agents](https://operator.untra.io/agents/): Understand agent lifecycle, states, autonomous vs paired modes, parallelism rules, and session tracking. +## Workflows +- [Workflows](https://operator.untra.io/workflows/): Shareable collections of Operator workflows. +- [Workflow Export Formats](https://operator.untra.io/getting-started/workflows/): Export an Operator workflow into a format another LLM tool or model can run. - [Delegators](https://operator.untra.io/delegators/): Named LLM tool + model pairings for autonomous ticket launching. ## Integrations @@ -28,7 +29,7 @@ Operator runs from the root of your work directory, discovers projects by LLM ma - [Schema Reference](https://operator.untra.io/schemas/): Ticket metadata, issue type, and OpenAPI schema reference. - [Keyboard Shortcuts](https://operator.untra.io/shortcuts/): TUI keyboard shortcuts by context. - [Project Taxonomy](https://operator.untra.io/taxonomy/): Project Kinds across five tiers. +- [Artifact Detection](https://operator.untra.io/artifact-detection/): How Operator uses file artifacts as positive signals for step completion. ## Optional -- [Architecture](https://operator.untra.io/architecture/): System design overview. - [GitHub Repository](https://github.com/untra/operator): Source code (Rust, MIT). diff --git a/docs/maturity/index.md b/docs/maturity/index.md index 1445b4eb..7cf22bed 100644 --- a/docs/maturity/index.md +++ b/docs/maturity/index.md @@ -83,7 +83,7 @@ Operator integrates with many providers and tools across several **verticals**. |---|---|---| | AGNT | ![Alpha](https://img.shields.io/badge/Alpha-6495ED) | [AGNT](https://operator.untra.io/getting-started/integrations/agnt/) | -## Workflow Format +## Workflow Export Format | Integration | Status | Docs | |---|---|---| diff --git a/docs/schemas/config.json b/docs/schemas/config.json index 6e87c1e9..682a9c35 100644 --- a/docs/schemas/config.json +++ b/docs/schemas/config.json @@ -1283,13 +1283,9 @@ "type": "string", "default": "" }, - "sync_statuses": { - "description": "Workflow statuses to sync (empty = default/first status only)", - "type": "array", - "items": { - "type": "string" - }, - "default": [] + "status_mapping": { + "description": "Mapping of operator todo/doing/done to external board columns", + "$ref": "#/$defs/KanbanStatusMapping" }, "collection_name": { "description": "Optional `IssueTypeCollection` name this project maps to.\nNot required for kanban onboarding or sync.", @@ -1313,6 +1309,33 @@ } } }, + "KanbanStatusMapping": { + "description": "Explicit mapping from operator's strict todo/doing/done states to the\nexternal board's column/status names.\n\nDrives bidirectional sync: issues are pulled from the `todo` column,\npushed to `doing` when a ticket is claimed, to `done` when completed, and\nback to `todo` when requeued. Unset fields fall back per-transition\n(`doing` → \"In Progress\", `done` → \"Done\"); requeue only pushes when\n`todo` is explicitly mapped.", + "type": "object", + "properties": { + "todo": { + "description": "External column for operator \"todo\" (queued work; also the pull source)", + "type": [ + "string", + "null" + ] + }, + "doing": { + "description": "External column for operator \"doing\" (claimed/launched tickets)", + "type": [ + "string", + "null" + ] + }, + "done": { + "description": "External column for operator \"done\" (completed tickets)", + "type": [ + "string", + "null" + ] + } + } + }, "LinearConfig": { "description": "Linear provider configuration\n\nThe workspace slug is specified as the `HashMap` key in KanbanConfig.linear", "type": "object", diff --git a/docs/schemas/config.md b/docs/schemas/config.md index 197b7aa3..60f5df94 100644 --- a/docs/schemas/config.md +++ b/docs/schemas/config.md @@ -443,11 +443,28 @@ Per-project/team sync configuration for a kanban provider | Property | Type | Required | Description | | --- | --- | --- | --- | | `sync_user_id` | `string` | No | User ID to sync issues for (provider-specific format) - Jira: accountId (e.g., "5e3f7acd9876543210abcdef") - Linear: user ID (e.g., "abc12345-6789-0abc-def0-123456789abc") - GitHub Projects: numeric GitHub `databaseId` (e.g., "12345678") | -| `sync_statuses` | `array` | No | Workflow statuses to sync (empty = default/first status only) | +| `status_mapping` | → `KanbanStatusMapping` | No | Mapping of operator todo/doing/done to external board columns | | `collection_name` | `string` \| `null` | No | Optional `IssueTypeCollection` name this project maps to. Not required for kanban onboarding or sync. | | `type_mappings` | `object` | No | Explicit mapping: kanban issue type ID → operator issue type key (e.g., TASK, FEAT, FIX). Multiple kanban types can map to the same operator template. | | `bidirectional` | `boolean` | No | When true, operator pushes status changes and activity logs back to this kanban project. Ticket state changes (todo→doing, doing→done) and step completions with delegator info are reflected upstream. Default: false. | +### KanbanStatusMapping + +Explicit mapping from operator's strict todo/doing/done states to the +external board's column/status names. + +Drives bidirectional sync: issues are pulled from the `todo` column, +pushed to `doing` when a ticket is claimed, to `done` when completed, and +back to `todo` when requeued. Unset fields fall back per-transition +(`doing` → "In Progress", `done` → "Done"); requeue only pushes when +`todo` is explicitly mapped. + +| Property | Type | Required | Description | +| --- | --- | --- | --- | +| `todo` | `string` \| `null` | No | External column for operator "todo" (queued work; also the pull source) | +| `doing` | `string` \| `null` | No | External column for operator "doing" (claimed/launched tickets) | +| `done` | `string` \| `null` | No | External column for operator "done" (completed tickets) | + ### LinearConfig Linear provider configuration diff --git a/docs/schemas/metadata.md b/docs/schemas/metadata.md index 84503d71..c7aa5df7 100644 --- a/docs/schemas/metadata.md +++ b/docs/schemas/metadata.md @@ -25,8 +25,9 @@ Schema for operator-tracked ticket metadata in YAML frontmatter. This schema doc | Property | Type | Required | Description | | --- | --- | --- | --- | -| `id` | `string` | Yes | Kanban ticket ID (e.g., FEAT-1234). Also used for tmux session name derivation. | +| `id` | `string` | Yes | Kanban ticket ID (e.g., FEAT-1234). Also used for tmux session name derivation. Key grammar: uppercase start, then uppercase letters, digits, or underscores (hyphen is reserved as the key/number separator). | | `status` | `string` | Yes | Operator workflow status | +| `collection` | `string` | No | Issuetype collection the ticket's type resolves within. Stamped at creation (active collection) or kanban sync (the project sync's collection). Absent on legacy tickets — resolution falls back to the active collection, then a deterministic search. | | `step` | `string` | No | Current workflow step name (e.g., plan, build, code, test, deploy) | | `priority` | `string` | No | Ticket priority level | | `project` | `string` | No | Target project name (subdirectory in projects root) | @@ -41,10 +42,10 @@ Schema for operator-tracked ticket metadata in YAML frontmatter. This schema doc ### id -- **Description**: Kanban ticket ID (e.g., FEAT-1234). Also used for tmux session name derivation. +- **Description**: Kanban ticket ID (e.g., FEAT-1234). Also used for tmux session name derivation. Key grammar: uppercase start, then uppercase letters, digits, or underscores (hyphen is reserved as the key/number separator). - **Type**: `string` -- **Pattern**: `^[A-Z]+-\d+$` -- **Examples**: `FEAT-1234`, `FIX-5678`, `SPIKE-0001`, `INV-0042`, `TASK-9999` +- **Pattern**: `^[A-Z][A-Z0-9_]*-\d+$` +- **Examples**: `FEAT-1234`, `FIX-5678`, `SPIKE-0001`, `INV-0042`, `TASK-9999`, `AGENT_SETUP-0001` ### status @@ -53,6 +54,13 @@ Schema for operator-tracked ticket metadata in YAML frontmatter. This schema doc - **Default**: `"queued"` - **Allowed Values**: `queued`, `running`, `awaiting`, `completed` +### collection + +- **Description**: Issuetype collection the ticket's type resolves within. Stamped at creation (active collection) or kanban sync (the project sync's collection). Absent on legacy tickets — resolution falls back to the active collection, then a deterministic search. +- **Type**: `string` +- **Pattern**: `^[a-z0-9_]{3,64}$` +- **Examples**: `dev_kanban`, `ralph_loop`, `custom` + ### step - **Description**: Current workflow step name (e.g., plan, build, code, test, deploy) diff --git a/docs/schemas/openapi.json b/docs/schemas/openapi.json index ba45f550..0d903302 100644 --- a/docs/schemas/openapi.json +++ b/docs/schemas/openapi.json @@ -738,11 +738,25 @@ "tags": [ "Issue Types" ], - "summary": "List all issue types", + "summary": "List issue types (all collections deduped, or one collection via `?collection=`)", "operationId": "issuetypes_list", + "parameters": [ + { + "name": "collection", + "in": "query", + "description": "Collection to scope the lookup to (defaults to resolution-order lookup)", + "required": false, + "schema": { + "type": [ + "string", + "null" + ] + } + } + ], "responses": { "200": { - "description": "List of all issue types", + "description": "List of issue types", "content": { "application/json": { "schema": { @@ -753,6 +767,16 @@ } } } + }, + "404": { + "description": "Unknown collection", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } } } }, @@ -822,6 +846,18 @@ "schema": { "type": "string" } + }, + { + "name": "collection", + "in": "query", + "description": "Collection to scope the lookup to (defaults to resolution-order lookup)", + "required": false, + "schema": { + "type": [ + "string", + "null" + ] + } } ], "responses": { @@ -961,6 +997,59 @@ } } }, + "/api/v1/issuetypes/{key}/document": { + "get": { + "tags": [ + "Issue Types" + ], + "summary": "Get an issue type's Operator workflow document", + "description": "Returns the issue type verbatim, in the same shape as the `.json` files\nin a hosted collection bundle (`/schemas/issuetype.json`). This is the\n*native* Operator workflow — the ordered step graph every export format is\nderived from — so the web UI and the docs site render identical graphs from\nidentical bytes. Prefer [`get_one`] for display metadata; use this when you\nneed the full step structure including step types, reject edges, and\nper-type fan-out configuration.", + "operationId": "issuetypes_get_document", + "parameters": [ + { + "name": "key", + "in": "path", + "description": "Issue type key (e.g., FEAT, FIX)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "collection", + "in": "query", + "description": "Collection to scope the lookup to (defaults to resolution-order lookup)", + "required": false, + "schema": { + "type": [ + "string", + "null" + ] + } + } + ], + "responses": { + "200": { + "description": "Operator workflow document", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Issue type not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, "/api/v1/issuetypes/{key}/steps": { "get": { "tags": [ @@ -1309,6 +1398,38 @@ } } }, + "/api/v1/kanban/statuses": { + "post": { + "tags": [ + "Kanban" + ], + "summary": "POST /`api/v1/kanban/statuses`", + "description": "List the workflow statuses/columns of a specific project using ephemeral\ncredentials, so onboarding UIs can offer real column names in the\ntodo/doing/done mapping dropdowns. No persistence side effects.", + "operationId": "kanban_list_statuses", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListKanbanStatusesRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Workflow statuses/columns for the project", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListKanbanStatusesResponse" + } + } + } + } + } + } + }, "/api/v1/kanban/validate": { "post": { "tags": [ @@ -1440,6 +1561,54 @@ } } }, + "/api/v1/kanban/{provider}/{project_key}/statuses": { + "get": { + "tags": [ + "Kanban" + ], + "summary": "GET /`api/v1/kanban/:provider/:project_key/statuses`", + "description": "Returns the external board's workflow statuses/columns for an\nalready-configured provider/project, using the stored config's\ncredentials. Used by config UIs (e.g. the VS Code `ProjectRow`) to populate\nthe todo/doing/done mapping dropdowns after onboarding.", + "operationId": "kanban_project_statuses", + "parameters": [ + { + "name": "provider", + "in": "path", + "description": "Kanban provider name (e.g. jira, linear, github)", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "project_key", + "in": "path", + "description": "Provider project/team key", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Workflow statuses/columns for the project", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListKanbanStatusesResponse" + } + } + } + }, + "400": { + "description": "Unknown provider/project" + }, + "500": { + "description": "Failed to fetch statuses from provider" + } + } + } + }, "/api/v1/llm-tools": { "get": { "tags": [ @@ -2726,15 +2895,44 @@ "name", "description", "types", - "is_active" + "is_active", + "tier" ], "properties": { + "author": { + "type": [ + "string", + "null" + ], + "description": "Human author/attribution (present for hosted collections)." + }, + "created": { + "type": [ + "string", + "null" + ], + "description": "ISO-8601 date the collection was first published." + }, "description": { "type": "string" }, + "icon_path": { + "type": [ + "string", + "null" + ], + "description": "Bare filename of the collection's SVG icon, next to its manifest." + }, "is_active": { "type": "boolean" }, + "license": { + "type": [ + "string", + "null" + ], + "description": "SPDX license id." + }, "name": { "type": "string" }, @@ -2745,12 +2943,30 @@ ], "description": "Publisher identifier (present for hosted collections)." }, + "tier": { + "type": "string", + "description": "Provenance tier: `official` or `community`." + }, "types": { "type": "array", "items": { "type": "string" } }, + "updated": { + "type": [ + "string", + "null" + ], + "description": "ISO-8601 date of the last substantive revision." + }, + "url": { + "type": [ + "string", + "null" + ], + "description": "Link to the collection's source repository or project page." + }, "version": { "type": [ "string", @@ -3001,6 +3217,13 @@ "steps" ], "properties": { + "collection": { + "type": [ + "string", + "null" + ], + "description": "Target collection (defaults to the active collection)" + }, "color": { "type": [ "string", @@ -3774,6 +3997,13 @@ "steps" ], "properties": { + "collection": { + "type": [ + "string", + "null" + ], + "description": "Owning collection under resolution-order lookup" + }, "color": { "type": [ "string", @@ -3828,6 +4058,13 @@ "stepCount" ], "properties": { + "collection": { + "type": [ + "string", + "null" + ], + "description": "Owning collection under resolution-order lookup" + }, "color": { "type": [ "string", @@ -4093,6 +4330,33 @@ "github" ] }, + "KanbanStatusMapping": { + "type": "object", + "description": "Explicit mapping from operator's strict todo/doing/done states to the\nexternal board's column/status names.\n\nDrives bidirectional sync: issues are pulled from the `todo` column,\npushed to `doing` when a ticket is claimed, to `done` when completed, and\nback to `todo` when requeued. Unset fields fall back per-transition\n(`doing` → \"In Progress\", `done` → \"Done\"); requeue only pushes when\n`todo` is explicitly mapped.", + "properties": { + "doing": { + "type": [ + "string", + "null" + ], + "description": "External column for operator \"doing\" (claimed/launched tickets)" + }, + "done": { + "type": [ + "string", + "null" + ], + "description": "External column for operator \"done\" (completed tickets)" + }, + "todo": { + "type": [ + "string", + "null" + ], + "description": "External column for operator \"todo\" (queued work; also the pull source)" + } + } + }, "KanbanSyncResponse": { "type": "object", "description": "Response for kanban sync operations", @@ -4455,6 +4719,68 @@ } } }, + "ListKanbanStatusesRequest": { + "type": "object", + "description": "Request to list workflow statuses/columns for a specific project using\nephemeral creds (onboarding wizard — before any config is persisted).", + "required": [ + "provider", + "project_key" + ], + "properties": { + "github": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/GithubCredentials" + } + ] + }, + "jira": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/JiraCredentials" + } + ] + }, + "linear": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/LinearCredentials" + } + ] + }, + "project_key": { + "type": "string", + "description": "Project/team key to list statuses for" + }, + "provider": { + "$ref": "#/components/schemas/KanbanProviderKind" + } + } + }, + "ListKanbanStatusesResponse": { + "type": "object", + "description": "Response wrapper for list-statuses: the external board's column names,\nin board order, for populating todo/doing/done mapping dropdowns.", + "required": [ + "statuses" + ], + "properties": { + "statuses": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, "LlmToolsResponse": { "type": "object", "description": "Response listing detected LLM tools", @@ -6242,6 +6568,17 @@ "type": "string", "description": "`GraphQL` project node ID (e.g., `PVT_kwDOABcdefg`)" }, + "status_mapping": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/KanbanStatusMapping", + "description": "Mapping of operator todo/doing/done to external board columns" + } + ] + }, "sync_user_id": { "type": "string", "description": "Numeric GitHub `databaseId` of the user whose items to sync" @@ -6271,6 +6608,17 @@ "project_key": { "type": "string" }, + "status_mapping": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/KanbanStatusMapping", + "description": "Mapping of operator todo/doing/done to external board columns" + } + ] + }, "sync_user_id": { "type": "string" } @@ -6352,6 +6700,17 @@ "project_key": { "type": "string" }, + "status_mapping": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/KanbanStatusMapping", + "description": "Mapping of operator todo/doing/done to external board columns" + } + ] + }, "sync_user_id": { "type": "string" }, diff --git a/docs/startup/index.md b/docs/startup/index.md index 4853e041..64cf4d0f 100644 --- a/docs/startup/index.md +++ b/docs/startup/index.md @@ -53,7 +53,7 @@ This gives you an overview of your development environment before proceeding. Choose how Operator will manage coding agent sessions: - **tmux**: Terminal multiplexer, recommended for most setups - **VS Code**: Launch agents as VS Code tasks (requires extension) -- **cmux**: Lightweight tmux wrapper with operator defaults pre-applied +- **cmux**: Native macOS terminal for AI agents, organized into windows and workspaces - **Zellij**: Modern terminal workspace with built-in layouts Your choice determines which setup steps follow. @@ -101,9 +101,9 @@ Install the extension from the VS Code marketplace if prompted. *cmux session wrapper setup (shown if cmux selected)* -cmux is a lightweight tmux wrapper that pre-applies Operator's preferred session defaults. +cmux is a native macOS terminal that organizes AI agent sessions into windows and workspaces. -This step verifies cmux is installed and accessible in your PATH. +This step verifies the cmux app's CLI binary exists at the configured binary_path (by default inside /Applications/cmux.app) and meets the minimum supported version. **Navigation**: Enter to continue, Esc to go back @@ -198,8 +198,8 @@ The default criteria cover formatting, tests, and lint checks. You can customize Create startup tickets to help initialize your projects: - **ASSESS tickets**: Scan projects for catalog-info.yaml, create if missing -- **AGENT-SETUP tickets**: Configure Claude agents for each project -- **PROJECT-INIT tickets**: Run both ASSESS and AGENT-SETUP for each project +- **AGENT_SETUP tickets**: Configure Claude agents for each project +- **PROJECT_INIT tickets**: Run both ASSESS and AGENT_SETUP for each project These tickets are optional and help automate common setup tasks. diff --git a/docs/workflows/coder/index.md b/docs/workflows/coder/index.md new file mode 100644 index 00000000..a3032666 --- /dev/null +++ b/docs/workflows/coder/index.md @@ -0,0 +1,49 @@ +--- +title: "Coder" +layout: doc +section: workflows +--- + + + + +Linear-synced engineering flow: Feature, Improvement, and Bug work delegated to coding agents. + +| | | +|---|---| +| **Tier** | community | +| **Author** | [untra](https://github.com/untra/operator) | +| **License** | MIT | +| **Version** | 1.0.0 | +| **Created** | 2026-08-01 | +| **Updated** | 2026-08-01 | +| **Loop shape** | `kanban_synced_single_pass` | +| **Review gates** | `plan_review`, `test_suite`, `pr_review` | +| **Stops when** | tests_green; pr_created | +| **Manifest** | [`collection.json`](/collections/coder/collection.json) | + +## Issue types + +| Key | Name | Mode | Steps | +|---|---|---|---| +| `FEATURE` | Feature | autonomous | 5 | +| `IMPROVEMENT` | Improvement | autonomous | 4 | +| `BUG` | Bug | autonomous | 5 | + +## Workflows + +Select an issue type to see the Operator workflow it defines. This is the same graph the Operator app draws, rendered from the same published JSON. + +
+ +
+ +## Install + +Operator reads the hosted catalog on startup, so this collection appears in the setup picker. To pin it explicitly: + +```toml +# config.toml +[templates] +active_collection = "coder" +``` diff --git a/docs/workflows/dev_kanban/index.md b/docs/workflows/dev_kanban/index.md new file mode 100644 index 00000000..efd1c59d --- /dev/null +++ b/docs/workflows/dev_kanban/index.md @@ -0,0 +1,49 @@ +--- +title: "Dev Kanban" +layout: doc +section: workflows +--- + + + + +Developer kanban with TASK, FEAT, FIX + +| | | +|---|---| +| **Tier** | official | +| **Author** | [Operator!](https://github.com/untra/operator) | +| **License** | MIT | +| **Version** | 1.0.0 | +| **Created** | 2026-01-08 | +| **Updated** | 2026-06-16 | +| **Loop shape** | `single_pass` | +| **Review gates** | `test_suite` | +| **Stops when** | tests_green | +| **Manifest** | [`collection.json`](/collections/dev_kanban/collection.json) | + +## Issue types + +| Key | Name | Mode | Steps | +|---|---|---|---| +| `TASK` | Task | autonomous | 1 | +| `FEAT` | Feature | autonomous | 5 | +| `FIX` | Fix | autonomous | 5 | + +## Workflows + +Select an issue type to see the Operator workflow it defines. This is the same graph the Operator app draws, rendered from the same published JSON. + +
+ +
+ +## Install + +Operator reads the hosted catalog on startup, so this collection appears in the setup picker. To pin it explicitly: + +```toml +# config.toml +[templates] +active_collection = "dev_kanban" +``` diff --git a/docs/workflows/devops_kanban/index.md b/docs/workflows/devops_kanban/index.md new file mode 100644 index 00000000..bef92fcb --- /dev/null +++ b/docs/workflows/devops_kanban/index.md @@ -0,0 +1,51 @@ +--- +title: "DevOps Kanban" +layout: doc +section: workflows +--- + + + + +DevOps kanban with TASK, FEAT, FIX, SPIKE, INV + +| | | +|---|---| +| **Tier** | official | +| **Author** | [Operator!](https://github.com/untra/operator) | +| **License** | MIT | +| **Version** | 1.0.0 | +| **Created** | 2026-01-08 | +| **Updated** | 2026-06-16 | +| **Loop shape** | `review_loop` | +| **Review gates** | `human`, `test_suite` | +| **Stops when** | tests_green; review_approved | +| **Manifest** | [`collection.json`](/collections/devops_kanban/collection.json) | + +## Issue types + +| Key | Name | Mode | Steps | +|---|---|---|---| +| `TASK` | Task | autonomous | 1 | +| `FEAT` | Feature | autonomous | 5 | +| `FIX` | Fix | autonomous | 5 | +| `SPIKE` | Spike | paired | 3 | +| `INV` | Investigation | paired | 5 | + +## Workflows + +Select an issue type to see the Operator workflow it defines. This is the same graph the Operator app draws, rendered from the same published JSON. + +
+ +
+ +## Install + +Operator reads the hosted catalog on startup, so this collection appears in the setup picker. To pin it explicitly: + +```toml +# config.toml +[templates] +active_collection = "devops_kanban" +``` diff --git a/docs/workflows/elves_overnight/index.md b/docs/workflows/elves_overnight/index.md new file mode 100644 index 00000000..e7ac0353 --- /dev/null +++ b/docs/workflows/elves_overnight/index.md @@ -0,0 +1,50 @@ +--- +title: "Elves Overnight" +layout: doc +section: workflows +--- + + + + +Long-running staged batch workflow with durable memory, validation, PR review, and reporting. + +| | | +|---|---| +| **Tier** | community | +| **Author** | [Aigora](https://github.com/aigorahub/elves) | +| **License** | MIT | +| **Version** | 1.0.0 | +| **Created** | 2026-06-16 | +| **Updated** | 2026-07-01 | +| **Loop shape** | `staged_long_running_batch_loop` | +| **Review gates** | `stage_review`, `batch_validation`, `fresh_review`, `judge_verdict`, `human_land_gate` | +| **Stops when** | batch complete and checkpointed; validation cannot be repaired safely; PR has unresolved requested changes; time/risk budget exhausted | +| **Manifest** | [`collection.json`](/collections/elves_overnight/collection.json) | + +## Issue types + +| Key | Name | Mode | Steps | +|---|---|---|---| +| `ELVSTAGE` | Elves Stage | paired | 4 | +| `ELVBATCH` | Elves Batch | autonomous | 9 | +| `LANDPR` | Land Pull Request | paired | 6 | +| `ELVRPT` | Elves Report | paired | 3 | + +## Workflows + +Select an issue type to see the Operator workflow it defines. This is the same graph the Operator app draws, rendered from the same published JSON. + +
+ +
+ +## Install + +Operator reads the hosted catalog on startup, so this collection appears in the setup picker. To pin it explicitly: + +```toml +# config.toml +[templates] +active_collection = "elves_overnight" +``` diff --git a/docs/workflows/example_chores/index.md b/docs/workflows/example_chores/index.md new file mode 100644 index 00000000..77a2d067 --- /dev/null +++ b/docs/workflows/example_chores/index.md @@ -0,0 +1,47 @@ +--- +title: "Example Chores" +layout: doc +section: workflows +--- + + + + +Minimal example community collection demonstrating the shareable format. + +| | | +|---|---| +| **Tier** | community | +| **Author** | [untra](https://github.com/untra/operator) | +| **License** | MIT | +| **Version** | 0.1.0 | +| **Created** | 2026-07-01 | +| **Updated** | 2026-07-01 | +| **Loop shape** | `single_pass` | +| **Review gates** | `test_suite` | +| **Stops when** | tests_green | +| **Manifest** | [`collection.json`](/collections/example_chores/collection.json) | + +## Issue types + +| Key | Name | Mode | Steps | +|---|---|---|---| +| `CHORE` | Chore | autonomous | 2 | + +## Workflows + +Select an issue type to see the Operator workflow it defines. This is the same graph the Operator app draws, rendered from the same published JSON. + +
+ +
+ +## Install + +Operator reads the hosted catalog on startup, so this collection appears in the setup picker. To pin it explicitly: + +```toml +# config.toml +[templates] +active_collection = "example_chores" +``` diff --git a/docs/workflows/index.md b/docs/workflows/index.md new file mode 100644 index 00000000..321b236f --- /dev/null +++ b/docs/workflows/index.md @@ -0,0 +1,287 @@ +--- +title: "Workflows" +layout: doc +section: workflows +--- + + + + + +An **Operator workflow** is a process defined once in JSON: an ordered graph of +typed steps, review gates, and retry edges that an LLM agent can follow. It is +the native format — Operator runs it directly, and every +[export format](/getting-started/workflows/) (Claude, AGNT) is derived from it. + +Three terms, three different things: + +| Term | What it is | +|------|-----------| +| **Operator workflow** | The step graph itself. Lives in an issue type's `steps`. | +| **Issue type** | One kind of work — `FEAT`, `PRD`, `ELVSTAGE`. Carries identity, input fields, and exactly one Operator workflow. | +| **Collection** | A named, versioned bundle of issue types: a complete, shareable way of working. This page lists them. | + +Collections are deliberately separate from your **kanban issue types**. Jira, +Linear, and GitHub Projects types describe how *your* team labels work; a +collection describes how the *agents* do it. Map one onto the other once, and +the workflow travels between projects, teams, and providers unchanged. + +Every collection below is installable from Operator directly — they are published from this site as a [machine-readable index](/collections/index.json) that operator instances read on startup. + + + +
+
+
+ + +

Simple

+
+

Simple workflow with TASK only

+

TASK

+

+ official + 1 issue type + Operator! + updated 2026-07-01 +

+
+
+ + +

Dev Kanban

+
+

Developer kanban with TASK, FEAT, FIX

+

TASK FEAT FIX

+

+ official + 3 issue types + Operator! + updated 2026-06-16 +

+
+
+ + +

DevOps Kanban

+
+

DevOps kanban with TASK, FEAT, FIX, SPIKE, INV

+

TASK FEAT FIX SPIKE INV

+

+ official + 5 issue types + Operator! + updated 2026-06-16 +

+
+
+ + +

Operator

+
+

Operator automation tasks: ASSESS, SYNC, INIT

+

ASSESS SYNC INIT AGENT_SETUP PROJECT_INIT

+

+ official + 5 issue types + Operator! + updated 2026-07-01 +

+
+
+ + +

Ralph Loop

+
+

PRD-to-story loop for completing one right-sized story per fresh agent context.

+

PRD STORY RLOOP

+

+ community + 3 issue types + snarktank + updated 2026-07-01 +

+
+
+ + +

JR Orchestration

+
+

Feature/task orchestration with coder, reviewer, architect, and rebase work units.

+

JRPLAN JRFEAT JRTASK JRREV JRREBASE

+

+ community + 5 issue types + snapwich + updated 2026-07-01 +

+
+
+ + +

Elves Overnight

+
+

Long-running staged batch workflow with durable memory, validation, PR review, and reporting.

+

ELVSTAGE ELVBATCH LANDPR ELVRPT

+

+ community + 4 issue types + Aigora + updated 2026-07-01 +

+
+
+ + +

Coder

+
+

Linear-synced engineering flow: Feature, Improvement, and Bug work delegated to coding agents.

+

FEATURE IMPROVEMENT BUG

+

+ community + 3 issue types + untra + updated 2026-08-01 +

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CollectionDescriptionIssue typesLoopAuthorTierCreatedUpdated
SimpleSimple workflow with TASK only1single_passOperator!official2026-01-082026-07-01
Dev KanbanDeveloper kanban with TASK, FEAT, FIX3single_passOperator!official2026-01-082026-06-16
DevOps KanbanDevOps kanban with TASK, FEAT, FIX, SPIKE, INV5review_loopOperator!official2026-01-082026-06-16
OperatorOperator automation tasks: ASSESS, SYNC, INIT5single_passOperator!official2026-01-082026-07-01
Ralph LoopPRD-to-story loop for completing one right-sized story per fresh agent context.3fresh_context_story_loopsnarktankcommunity2026-06-162026-07-01
JR OrchestrationFeature/task orchestration with coder, reviewer, architect, and rebase work units.5feature_task_review_graphsnapwichcommunity2026-06-162026-07-01
Elves OvernightLong-running staged batch workflow with durable memory, validation, PR review, and reporting.4staged_long_running_batch_loopAigoracommunity2026-06-162026-07-01
CoderLinear-synced engineering flow: Feature, Improvement, and Bug work delegated to coding agents.3kanban_synced_single_passuntracommunity2026-08-012026-08-01
Example ChoresMinimal example community collection demonstrating the shareable format.1single_passuntracommunity2026-07-012026-07-01
+
+ +## Contribute a collection + +There is no single best way to run agents — the right loop depends on the work. +That is exactly why these are shareable: a workflow that works for you is worth +publishing, and one that does not fit is worth forking. + +Official collections live in the [operator repository](https://github.com/untra/operator/tree/main/collections): + +1. Create `collections/community//`, where `` matches `^[a-z0-9_]{3,64}$`. +2. Add a `collection.json` conforming to [the collection schema](/collections/schema.json), + with `tier: "community"` plus `author`, `url`, and `license`. +3. Add one `.json` per issue type — see [the issue type schema](/schemas/issuetype/) — + and an optional `.md` ticket template. +4. Add an `icon.svg` following the + [Simple Icons](https://github.com/simple-icons/simple-icons) shape: a 24×24 + viewBox, a single ``, and no `fill` or `stroke` so it inherits the + page's color. +5. Leave checksums out — they are computed at publish time. +6. Run the CI gate locally, then open a pull request: + +```bash +cargo test --test community_collections +``` + +Submissions are reviewed for prompt quality and safety, not just schema +validity. A good collection describes a workflow shape worth sharing: what loop +it runs, what memory it keeps, what gates it enforces, and when it stops. diff --git a/docs/workflows/jr_orchestration/index.md b/docs/workflows/jr_orchestration/index.md new file mode 100644 index 00000000..220f61a3 --- /dev/null +++ b/docs/workflows/jr_orchestration/index.md @@ -0,0 +1,51 @@ +--- +title: "JR Orchestration" +layout: doc +section: workflows +--- + + + + +Feature/task orchestration with coder, reviewer, architect, and rebase work units. + +| | | +|---|---| +| **Tier** | community | +| **Author** | [snapwich](https://github.com/snapwich/jr) | +| **License** | MIT | +| **Version** | 1.0.0 | +| **Created** | 2026-06-16 | +| **Updated** | 2026-07-01 | +| **Loop shape** | `feature_task_review_graph` | +| **Review gates** | `code_review`, `architect_review`, `human_pr_review` | +| **Stops when** | feature PR ready for human review; review changes requested; blocked dependency documented; review escalated to human after repeated changes (operator stops; no auto-handoff) | +| **Manifest** | [`collection.json`](/collections/jr_orchestration/collection.json) | + +## Issue types + +| Key | Name | Mode | Steps | +|---|---|---|---| +| `JRPLAN` | JR Plan | paired | 4 | +| `JRFEAT` | JR Feature | paired | 4 | +| `JRTASK` | JR Task | autonomous | 5 | +| `JRREV` | JR Review | paired | 4 | +| `JRREBASE` | JR Rebase | autonomous | 4 | + +## Workflows + +Select an issue type to see the Operator workflow it defines. This is the same graph the Operator app draws, rendered from the same published JSON. + +
+ +
+ +## Install + +Operator reads the hosted catalog on startup, so this collection appears in the setup picker. To pin it explicitly: + +```toml +# config.toml +[templates] +active_collection = "jr_orchestration" +``` diff --git a/docs/workflows/operator/index.md b/docs/workflows/operator/index.md new file mode 100644 index 00000000..d1447d0c --- /dev/null +++ b/docs/workflows/operator/index.md @@ -0,0 +1,51 @@ +--- +title: "Operator" +layout: doc +section: workflows +--- + + + + +Operator automation tasks: ASSESS, SYNC, INIT + +| | | +|---|---| +| **Tier** | official | +| **Author** | [Operator!](https://github.com/untra/operator) | +| **License** | MIT | +| **Version** | 1.0.0 | +| **Created** | 2026-01-08 | +| **Updated** | 2026-07-01 | +| **Loop shape** | `single_pass` | +| **Review gates** | `human` | +| **Stops when** | setup_artifacts_written | +| **Manifest** | [`collection.json`](/collections/operator/collection.json) | + +## Issue types + +| Key | Name | Mode | Steps | +|---|---|---|---| +| `ASSESS` | Project Assessment | autonomous | 2 | +| `SYNC` | Catalog Sync | autonomous | 3 | +| `INIT` | Workspace Init | paired | 3 | +| `AGENT_SETUP` | Agent Setup | paired | 3 | +| `PROJECT_INIT` | Project Initialization | autonomous | 2 | + +## Workflows + +Select an issue type to see the Operator workflow it defines. This is the same graph the Operator app draws, rendered from the same published JSON. + +
+ +
+ +## Install + +Operator reads the hosted catalog on startup, so this collection appears in the setup picker. To pin it explicitly: + +```toml +# config.toml +[templates] +active_collection = "operator" +``` diff --git a/docs/workflows/ralph_loop/index.md b/docs/workflows/ralph_loop/index.md new file mode 100644 index 00000000..11a10d93 --- /dev/null +++ b/docs/workflows/ralph_loop/index.md @@ -0,0 +1,49 @@ +--- +title: "Ralph Loop" +layout: doc +section: workflows +--- + + + + +PRD-to-story loop for completing one right-sized story per fresh agent context. + +| | | +|---|---| +| **Tier** | community | +| **Author** | [snarktank](https://github.com/snarktank/ralph) | +| **License** | MIT | +| **Version** | 1.0.0 | +| **Created** | 2026-06-16 | +| **Updated** | 2026-07-01 | +| **Loop shape** | `fresh_context_story_loop` | +| **Review gates** | `plan_review`, `test_suite`, `story_completion_check` | +| **Stops when** | all stories have passes=true; blocked story documented; quality gates fail repeatedly; max_iterations reached (advisory; outer story loop is operator-queue-driven) | +| **Manifest** | [`collection.json`](/collections/ralph_loop/collection.json) | + +## Issue types + +| Key | Name | Mode | Steps | +|---|---|---|---| +| `PRD` | Product Requirements Document | paired | 4 | +| `STORY` | Ralph Story | autonomous | 5 | +| `RLOOP` | Ralph Loop Coordinator | paired | 4 | + +## Workflows + +Select an issue type to see the Operator workflow it defines. This is the same graph the Operator app draws, rendered from the same published JSON. + +
+ +
+ +## Install + +Operator reads the hosted catalog on startup, so this collection appears in the setup picker. To pin it explicitly: + +```toml +# config.toml +[templates] +active_collection = "ralph_loop" +``` diff --git a/docs/workflows/simple/index.md b/docs/workflows/simple/index.md new file mode 100644 index 00000000..1cafd6c8 --- /dev/null +++ b/docs/workflows/simple/index.md @@ -0,0 +1,46 @@ +--- +title: "Simple" +layout: doc +section: workflows +--- + + + + +Simple workflow with TASK only + +| | | +|---|---| +| **Tier** | official | +| **Author** | [Operator!](https://github.com/untra/operator) | +| **License** | MIT | +| **Version** | 1.0.0 | +| **Created** | 2026-01-08 | +| **Updated** | 2026-07-01 | +| **Loop shape** | `single_pass` | +| **Stops when** | task_complete | +| **Manifest** | [`collection.json`](/collections/simple/collection.json) | + +## Issue types + +| Key | Name | Mode | Steps | +|---|---|---|---| +| `TASK` | Task | autonomous | 1 | + +## Workflows + +Select an issue type to see the Operator workflow it defines. This is the same graph the Operator app draws, rendered from the same published JSON. + +
+ +
+ +## Install + +Operator reads the hosted catalog on startup, so this collection appears in the setup picker. To pin it explicitly: + +```toml +# config.toml +[templates] +active_collection = "simple" +``` diff --git a/scripts/check-bindings-fresh.sh b/scripts/check-bindings-fresh.sh new file mode 100755 index 00000000..3b5a0d11 --- /dev/null +++ b/scripts/check-bindings-fresh.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# Regenerate the ts-rs TypeScript bindings and fail if the result differs from +# what is on disk (in CI, the committed checkout). A modified type changes its +# file's hash; a newly exported type adds a line to the "after" manifest. +# ts-rs never deletes files, so a removed export is undetectable by any +# before/after comparison. +# +# Called by .github/workflows/build.yaml (lint-test) and scripts/cicdprep.sh +# so CI and the local pre-flight can never disagree about freshness. +set -euo pipefail +cd "$(dirname "${BASH_SOURCE[0]}")/.." + +manifest() { find bindings -type f -name '*.ts' -exec shasum {} + | sort; } + +before="$(manifest)" +cargo test --locked export_bindings_ +after="$(manifest)" + +if [ "$before" != "$after" ]; then + echo "bindings/ is out of date. Run 'make bindings' and commit the result." >&2 + diff <(echo "$before") <(echo "$after") >&2 || true + exit 1 +fi diff --git a/scripts/cicdprep.sh b/scripts/cicdprep.sh index c9731f9d..af6f92b2 100755 --- a/scripts/cicdprep.sh +++ b/scripts/cicdprep.sh @@ -128,10 +128,11 @@ if [ -z "$MERGE_BASE" ]; then RUN_ALL=true CHANGED_FILES="" else - CHANGED_FILES=$(git diff --name-only "$MERGE_BASE"...HEAD 2>/dev/null || "") - UNSTAGED=$(git diff --name-only 2>/dev/null || "") - STAGED=$(git diff --name-only --cached 2>/dev/null || "") - CHANGED_FILES=$(echo -e "${CHANGED_FILES}\n${UNSTAGED}\n${STAGED}" | sort -u | grep -v '^$' || true) + CHANGED_FILES=$(git diff --name-only "$MERGE_BASE"...HEAD 2>/dev/null || true) + UNSTAGED=$(git diff --name-only 2>/dev/null || true) + STAGED=$(git diff --name-only --cached 2>/dev/null || true) + UNTRACKED=$(git ls-files --others --exclude-standard 2>/dev/null || true) + CHANGED_FILES=$(echo -e "${CHANGED_FILES}\n${UNSTAGED}\n${STAGED}\n${UNTRACKED}" | sort -u | grep -v '^$' || true) fi if [ "$RUN_ALL" = true ]; then @@ -164,12 +165,13 @@ needs_operator() { needs_opr8r() { has_changes '^opr8r/'; } needs_vscode() { has_changes '^(vscode-extension/|icons/)'; } needs_zed() { has_changes '^zed-extension/'; } -needs_docs() { has_changes '^(docs/|src/docs_gen/|src/taxonomy/taxonomy\.toml|src/templates/.*\.json)'; } +needs_docs() { has_changes '^(docs/|src/docs_gen/|src/taxonomy/taxonomy\.toml|src/templates/.*\.json|src/collections/|collections/|src/schemas/|webcomponents/|src/workflow_gen/)'; } # A bun project needs a lockfile check whenever its package.json or bun.lock # changed. Root project lives at the repo root; others under their dir. needs_bun_root() { has_changes '^(package\.json|bun\.lock)$'; } needs_bun_ui() { has_changes '^ui/(package\.json|bun\.lock)$'; } +needs_bun_webcomp() { has_changes '^webcomponents/(package\.json|bun\.lock)$'; } needs_bun_backstage() { has_changes '^backstage-server/(.*/)?(package\.json|bun\.lock)$'; } # --- 0. Bun lockfiles --- @@ -179,12 +181,13 @@ needs_bun_backstage() { has_changes '^backstage-server/(.*/)?(package\.json|bun # `bun install --frozen-lockfile`, and additionally covers the root and # backstage-server lockfiles that CI does not currently enforce. -if needs_bun_root || needs_bun_ui || needs_bun_backstage; then +if needs_bun_root || needs_bun_ui || needs_bun_webcomp || needs_bun_backstage; then section "Bun lockfiles" require_tool bun "bun lockfile sync" if needs_bun_root; then check_bun_lockfile "."; else skip "Lockfile sync: . (no changes)"; fi if needs_bun_ui; then check_bun_lockfile "ui"; else skip "Lockfile sync: ui (no changes)"; fi + if needs_bun_webcomp; then check_bun_lockfile "webcomponents"; else skip "Lockfile sync: webcomponents (no changes)"; fi if needs_bun_backstage; then check_bun_lockfile "backstage-server"; else skip "Lockfile sync: backstage-server (no changes)"; fi else skip "Bun lockfiles" @@ -198,10 +201,31 @@ if needs_operator; then require_tool bun "operator UI build" require_tool cargo-deny "operator dependency audit" + # The frontend is typed against types generated from Rust, so bindings come + # first — the same script .github/workflows/build.yaml runs as its gate. + run_step "Bindings fresh" scripts/check-bindings-fresh.sh + + # CI additionally requires them committed; surface that here as a reminder + BINDING_CHANGES="$(git status --porcelain --untracked-files=all bindings/ || true)" + if [ -n "$BINDING_CHANGES" ]; then + echo -e " ${YELLOW}note: bindings/ has uncommitted changes — CI requires them committed:${RESET}" + echo "$BINDING_CHANGES" | sed 's/^/ /' + fi + + step "Web components build" + ( + cd webcomponents + bun install --frozen-lockfile + bun run typecheck + bun test + bun run build + ) && pass "Web components build" || fail "Web components build" + step "UI build" ( cd ui bun install --frozen-lockfile + bun run typecheck bun run build DIST_SIZE=$(du -sk dist/ | awk '{print $1 * 1024}') echo " UI dist size: ${DIST_SIZE}B ($(echo "scale=1; $DIST_SIZE/1048576" | bc)MB)" @@ -280,9 +304,41 @@ if needs_docs; then require_tool cargo "docs generation" require_tool bundle "docs Jekyll build" + require_tool bun "docs web components" + + # docs.yml order: bindings -> webcomponents -> generated docs -> gem audit -> Jekyll + step "Docs web components" + ( + cargo test --locked export_bindings_ >/dev/null + cd webcomponents && bun install --frozen-lockfile && bun run typecheck && bun test && bun run build + ) && pass "Docs web components" || fail "Docs web components" + run_step "docs generate" cargo run --locked -- docs + + # Same advisory gate docs.yml runs against docs/Gemfile.lock ("Audit gems") + step "Gem audit" + ( + cd docs + bundle install >/dev/null + if ! command -v bundle-audit &>/dev/null; then + gem install bundler-audit >/dev/null + fi + bundle-audit check --update + ) && pass "Gem audit" || fail "Gem audit" + step "Jekyll build" - (cd docs && bundle install && bundle exec jekyll build) && pass "Jekyll build" || fail "Jekyll build" + ( + mkdir -p docs/assets/js + cp webcomponents/dist/elements.js webcomponents/dist/elements.css docs/assets/js/ + cd docs && bundle install && bundle exec jekyll build + ) && pass "Jekyll build" || fail "Jekyll build" + + # The hosted collection bundle is excluded from Jekyll and copied in verbatim + step "Collection bundle served verbatim" + ( + cp -R docs/collections docs/_site/ + diff -r docs/collections docs/_site/collections + ) && pass "Collection bundle served verbatim" || fail "Collection bundle served verbatim" else skip "docs" fi diff --git a/src/acp/agent.rs b/src/acp/agent.rs index 061ea956..0420a876 100644 --- a/src/acp/agent.rs +++ b/src/acp/agent.rs @@ -7,7 +7,7 @@ use std::process::Stdio as ProcStdio; use std::sync::Arc; -use agent_client_protocol::schema::{ +use agent_client_protocol::schema::v1::{ AgentCapabilities, CancelNotification, ContentBlock, Implementation, InitializeRequest, InitializeResponse, NewSessionRequest, NewSessionResponse, PromptRequest, PromptResponse, SessionId, SessionNotification, StopReason, @@ -106,14 +106,16 @@ pub async fn run_stdio(config: Config) -> agent_client_protocol::Result<()> { agent_client_protocol::on_receive_notification!(), ) .on_receive_dispatch( - async move |message: Dispatch, cx: ConnectionTo| { + async move |message: Dispatch, _cx: ConnectionTo| { let method = message.method().to_string(); - message.respond_with_error( - agent_client_protocol::util::internal_error(format!( - "ACP method not implemented: {method}" - )), - cx, - ) + match message { + Dispatch::Request(_, responder) => responder.respond_with_error( + agent_client_protocol::util::internal_error(format!( + "ACP method not implemented: {method}" + )), + ), + Dispatch::Notification(_) | Dispatch::Response(_, _) => Ok(()), + } }, agent_client_protocol::on_receive_dispatch!(), ) diff --git a/src/acp/session.rs b/src/acp/session.rs index a567871f..a353b6d6 100644 --- a/src/acp/session.rs +++ b/src/acp/session.rs @@ -9,7 +9,7 @@ use std::collections::HashMap; use std::path::{Path, PathBuf}; use std::sync::{Arc, Mutex}; -use agent_client_protocol::schema::SessionId; +use agent_client_protocol::schema::v1::SessionId; use anyhow::{anyhow, Context, Result}; use tokio::sync::oneshot; diff --git a/src/acp/translator.rs b/src/acp/translator.rs index 928f7c8d..b6187c70 100644 --- a/src/acp/translator.rs +++ b/src/acp/translator.rs @@ -5,7 +5,7 @@ //! stream-json`) and plain text (fallback). `line_to_update` tries JSON //! first, falls back to plain text on parse failure. -use agent_client_protocol::schema::{ContentBlock, ContentChunk, SessionUpdate, TextContent}; +use agent_client_protocol::schema::v1::{ContentBlock, ContentChunk, SessionUpdate, TextContent}; /// Map a single line of delegator stdout to an optional ACP `SessionUpdate`. /// diff --git a/src/agents/agent_switcher.rs b/src/agents/agent_switcher.rs index b7fa6e49..2215a565 100644 --- a/src/agents/agent_switcher.rs +++ b/src/agents/agent_switcher.rs @@ -54,8 +54,9 @@ struct CmuxOps(Arc); impl TerminalOps for CmuxOps { fn send_text(&self, workspace_ref: &str, text: &str, press_enter: bool) -> Result<()> { + // cmux passes text raw to the PTY; \r is Enter for raw-mode REPLs let text_to_send = if press_enter { - format!("{text}\n") + format!("{text}\r") } else { text.to_string() }; diff --git a/src/agents/cmux.rs b/src/agents/cmux.rs index e70dab86..00c74c0a 100644 --- a/src/agents/cmux.rs +++ b/src/agents/cmux.rs @@ -24,6 +24,14 @@ use crate::agents::terminal_wrapper::{ }; use crate::config::{CmuxPlacementPolicy, SessionsCmuxConfig}; +/// Minimum cmux version operator supports: `new-workspace --window` landed in 0.64.8. +pub const MIN_SUPPORTED_CMUX_VERSION: (u32, u32, u32) = (0, 64, 8); + +fn min_supported_version_string() -> String { + let (major, minor, patch) = MIN_SUPPORTED_CMUX_VERSION; + format!("{major}.{minor}.{patch}") +} + /// Errors specific to cmux operations #[derive(Error, Debug)] pub enum CmuxError { @@ -33,6 +41,11 @@ pub enum CmuxError { #[error("not running inside cmux (CMUX_WORKSPACE_ID not set)")] NotInCmux, + #[error( + "cmux {found} is not supported; operator requires cmux >= {minimum} — please update cmux" + )] + UnsupportedVersion { found: String, minimum: String }, + #[error("cmux command failed: {0}")] CommandFailed(String), @@ -46,6 +59,77 @@ pub enum CmuxError { Io(#[from] std::io::Error), } +/// Parsed cmux version, from `cmux --version` output like `cmux 0.64.20 (77) [6c203b5]`. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct CmuxVersion { + pub major: u32, + pub minor: u32, + pub patch: u32, + pub raw: String, +} + +impl CmuxVersion { + /// Parse the second whitespace token as `major.minor.patch`, tolerating + /// non-numeric suffixes per component (mirrors `TmuxVersion::parse`). + pub fn parse(output: &str) -> Option { + let token = output.split_whitespace().nth(1)?; + let mut parts = token.split('.'); + let component = |part: Option<&str>| -> Option { + let digits: String = part?.chars().take_while(char::is_ascii_digit).collect(); + digits.parse().ok() + }; + let major = component(parts.next())?; + let minor = component(parts.next())?; + let patch = component(parts.next()).unwrap_or(0); + Some(Self { + major, + minor, + patch, + raw: token.to_string(), + }) + } + + pub fn meets_minimum(&self, min: (u32, u32, u32)) -> bool { + (self.major, self.minor, self.patch) >= min + } +} + +/// Parse `new-workspace` stdout (`OK workspace:3` or `OK `) into the ref. +fn parse_ok_ref(stdout: &str) -> Result { + let trimmed = stdout.trim(); + let reference = trimmed.strip_prefix("OK ").unwrap_or(trimmed).trim(); + if reference.is_empty() || reference == "OK" { + return Err(CmuxError::CommandFailed(format!( + "cmux did not return a workspace ref (got '{trimmed}')" + ))); + } + Ok(reference.to_string()) +} + +/// Parse `list-windows --json` output: a JSON array of window objects. +fn parse_windows_json(stdout: &str) -> Result, CmuxError> { + let value: serde_json::Value = serde_json::from_str(stdout.trim()) + .map_err(|e| CmuxError::CommandFailed(format!("failed to parse list-windows JSON: {e}")))?; + let items = value + .as_array() + .ok_or_else(|| CmuxError::CommandFailed("list-windows JSON is not an array".to_string()))?; + items + .iter() + .map(|item| { + let id = match item.get("id") { + Some(serde_json::Value::String(s)) => s.clone(), + Some(serde_json::Value::Number(n)) => n.to_string(), + _ => { + return Err(CmuxError::CommandFailed( + "list-windows entry missing 'id'".to_string(), + )) + } + }; + Ok(CmuxWindow { id, name: None }) + }) + .collect() +} + /// Information about a cmux window #[derive(Debug, Clone)] pub struct CmuxWindow { @@ -63,8 +147,8 @@ pub struct CmuxWorkspace { /// Trait abstracting cmux operations for testability pub trait CmuxClient: Send + Sync { - /// Check if cmux is available (binary exists and can run) - fn check_available(&self) -> Result<(), CmuxError>; + /// Check cmux is available and meets [`MIN_SUPPORTED_CMUX_VERSION`] + fn check_available(&self) -> Result; /// Check if we're running inside cmux (env vars present) fn check_in_cmux(&self) -> Result<(), CmuxError>; @@ -83,8 +167,8 @@ pub trait CmuxClient: Send + Sync { name: Option<&str>, ) -> Result; - /// Create a new window - fn create_window(&self, name: Option<&str>) -> Result; + /// Create a new window (cmux `new-window` supports no name) + fn create_window(&self) -> Result; /// Send text to a workspace fn send_text(&self, workspace_ref: &str, text: &str) -> Result<(), CmuxError>; @@ -103,15 +187,6 @@ pub trait CmuxClient: Send + Sync { /// Get the active window ID fn active_window_id(&self) -> Result; - - /// Rename a workspace - fn rename_workspace(&self, workspace_ref: &str, name: &str) -> Result<(), CmuxError>; - - /// Rename a window - fn rename_window(&self, window_ref: &str, name: &str) -> Result<(), CmuxError>; - - /// Set the subtitle/metadata for a workspace (shown in cmux sidebar) - fn set_workspace_subtitle(&self, workspace_ref: &str, subtitle: &str) -> Result<(), CmuxError>; } // ============================================================================ @@ -137,6 +212,8 @@ impl SystemCmuxClient { fn run_cmux(&self, args: &[&str]) -> Result { Command::new(&self.binary_path) .args(args) + // Silence cmux's legacy-verb deprecation notice on stderr + .env("CMUX_QUIET", "1") .output() .map_err(|e| { if e.kind() == std::io::ErrorKind::NotFound { @@ -162,13 +239,25 @@ impl SystemCmuxClient { } impl CmuxClient for SystemCmuxClient { - fn check_available(&self) -> Result<(), CmuxError> { - // Check binary exists and runs + fn check_available(&self) -> Result { let output = self.run_cmux(&["--version"])?; if !output.status.success() { return Err(CmuxError::NotInstalled(self.binary_path.clone())); } - Ok(()) + let stdout = String::from_utf8_lossy(&output.stdout); + let version = CmuxVersion::parse(&stdout).ok_or_else(|| { + CmuxError::CommandFailed(format!( + "could not parse cmux version from '{}'", + stdout.trim() + )) + })?; + if !version.meets_minimum(MIN_SUPPORTED_CMUX_VERSION) { + return Err(CmuxError::UnsupportedVersion { + found: version.raw, + minimum: min_supported_version_string(), + }); + } + Ok(version) } fn check_in_cmux(&self) -> Result<(), CmuxError> { @@ -180,17 +269,7 @@ impl CmuxClient for SystemCmuxClient { fn list_windows(&self) -> Result, CmuxError> { let output = self.run_cmux_success(&["list-windows", "--json"])?; - // Parse JSON output — each line is a window - // For now, parse simple newline-delimited IDs - let windows = output - .lines() - .filter(|l| !l.is_empty()) - .map(|line| CmuxWindow { - id: line.trim().to_string(), - name: None, - }) - .collect(); - Ok(windows) + parse_windows_json(&output) } fn window_count(&self) -> Result { @@ -204,7 +283,7 @@ impl CmuxClient for SystemCmuxClient { name: Option<&str>, ) -> Result { let mut args = vec![ - "create-workspace", + "new-workspace", "--window", window_ref, "--cwd", @@ -214,20 +293,16 @@ impl CmuxClient for SystemCmuxClient { args.push("--name"); args.push(n); } - self.run_cmux_success(&args) + let output = self.run_cmux_success(&args)?; + parse_ok_ref(&output) } - fn create_window(&self, name: Option<&str>) -> Result { - let mut args = vec!["create-window"]; - if let Some(n) = name { - args.push("--name"); - args.push(n); - } - self.run_cmux_success(&args) + fn create_window(&self) -> Result { + self.run_cmux_success(&["new-window"]) } fn send_text(&self, workspace_ref: &str, text: &str) -> Result<(), CmuxError> { - self.run_cmux_success(&["send-text", "--workspace", workspace_ref, text])?; + self.run_cmux_success(&["send", "--workspace", workspace_ref, text])?; Ok(()) } @@ -240,7 +315,7 @@ impl CmuxClient for SystemCmuxClient { } fn focus_workspace(&self, workspace_ref: &str) -> Result<(), CmuxError> { - self.run_cmux_success(&["focus-workspace", "--workspace", workspace_ref])?; + self.run_cmux_success(&["select-workspace", "--workspace", workspace_ref])?; Ok(()) } @@ -255,45 +330,7 @@ impl CmuxClient for SystemCmuxClient { } fn active_window_id(&self) -> Result { - self.run_cmux_success(&["active-window-id"]) - } - - fn rename_workspace(&self, workspace_ref: &str, name: &str) -> Result<(), CmuxError> { - self.run_cmux_success(&[ - "rename-workspace", - "--workspace", - workspace_ref, - "--name", - name, - ])?; - Ok(()) - } - - fn rename_window(&self, window_ref: &str, name: &str) -> Result<(), CmuxError> { - self.run_cmux_success(&["rename-window", "--window", window_ref, "--name", name])?; - Ok(()) - } - - fn set_workspace_subtitle(&self, workspace_ref: &str, subtitle: &str) -> Result<(), CmuxError> { - let output = std::process::Command::new(&self.binary_path) - .args([ - "set-workspace-subtitle", - "--workspace", - workspace_ref, - "--subtitle", - subtitle, - ]) - .output() - .map_err(|e| CmuxError::CommandFailed(format!("failed to run cmux: {e}")))?; - - if !output.status.success() { - // cmux may not support this command yet — log and continue - tracing::debug!( - "cmux set-workspace-subtitle not supported or failed: {}", - String::from_utf8_lossy(&output.stderr) - ); - } - Ok(()) + self.run_cmux_success(&["current-window"]) } } @@ -325,13 +362,13 @@ struct MockWindow { struct MockState { available: bool, in_cmux: bool, + version: CmuxVersion, windows: Vec, workspaces: Vec, next_workspace_id: u32, next_window_id: u32, active_window_id: String, sent_texts: Vec<(String, String)>, // (workspace_ref, text) - subtitles: HashMap, } /// Mock implementation for testing @@ -346,6 +383,12 @@ impl MockCmuxClient { state: Mutex::new(MockState { available: true, in_cmux: true, + version: CmuxVersion { + major: 0, + minor: 64, + patch: 20, + raw: "0.64.20".to_string(), + }, windows: vec![MockWindow { id: "win-1".to_string(), name: Some("Main".to_string()), @@ -356,7 +399,6 @@ impl MockCmuxClient { next_window_id: 2, active_window_id: "win-1".to_string(), sent_texts: vec![], - subtitles: HashMap::new(), }), } } @@ -425,10 +467,16 @@ impl MockCmuxClient { }) } - /// Get the subtitle set for a workspace (for test assertions) - pub fn get_subtitle(&self, workspace_ref: &str) -> Option { - let state = self.state.lock().unwrap(); - state.subtitles.get(workspace_ref).cloned() + /// Set the reported cmux version (for version-gate tests) + pub fn set_version(&self, major: u32, minor: u32, patch: u32) { + if let Ok(mut state) = self.state.lock() { + state.version = CmuxVersion { + major, + minor, + patch, + raw: format!("{major}.{minor}.{patch}"), + }; + } } } @@ -439,7 +487,7 @@ impl Default for MockCmuxClient { } impl CmuxClient for MockCmuxClient { - fn check_available(&self) -> Result<(), CmuxError> { + fn check_available(&self) -> Result { let state = self .state .lock() @@ -447,7 +495,13 @@ impl CmuxClient for MockCmuxClient { if !state.available { return Err(CmuxError::NotInstalled("mock".to_string())); } - Ok(()) + if !state.version.meets_minimum(MIN_SUPPORTED_CMUX_VERSION) { + return Err(CmuxError::UnsupportedVersion { + found: state.version.raw.clone(), + minimum: min_supported_version_string(), + }); + } + Ok(state.version.clone()) } fn check_in_cmux(&self) -> Result<(), CmuxError> { @@ -513,7 +567,7 @@ impl CmuxClient for MockCmuxClient { Ok(id) } - fn create_window(&self, name: Option<&str>) -> Result { + fn create_window(&self) -> Result { let mut state = self .state .lock() @@ -523,7 +577,7 @@ impl CmuxClient for MockCmuxClient { state.next_window_id += 1; state.windows.push(MockWindow { id: id.clone(), - name: name.map(std::string::ToString::to_string), + name: None, focused: false, }); Ok(id) @@ -615,46 +669,6 @@ impl CmuxClient for MockCmuxClient { .map_err(|e| CmuxError::CommandFailed(format!("lock poisoned: {e}")))?; Ok(state.active_window_id.clone()) } - - fn rename_workspace(&self, workspace_ref: &str, name: &str) -> Result<(), CmuxError> { - let mut state = self - .state - .lock() - .map_err(|e| CmuxError::CommandFailed(format!("lock poisoned: {e}")))?; - - let ws = state - .workspaces - .iter_mut() - .find(|ws| ws.id == workspace_ref) - .ok_or_else(|| CmuxError::WorkspaceNotFound(workspace_ref.to_string()))?; - - ws.name = Some(name.to_string()); - Ok(()) - } - - fn rename_window(&self, window_ref: &str, name: &str) -> Result<(), CmuxError> { - let mut state = self - .state - .lock() - .map_err(|e| CmuxError::CommandFailed(format!("lock poisoned: {e}")))?; - - let w = state - .windows - .iter_mut() - .find(|w| w.id == window_ref) - .ok_or_else(|| CmuxError::WindowNotFound(window_ref.to_string()))?; - - w.name = Some(name.to_string()); - Ok(()) - } - - fn set_workspace_subtitle(&self, workspace_ref: &str, subtitle: &str) -> Result<(), CmuxError> { - let mut state = self.state.lock().unwrap(); - state - .subtitles - .insert(workspace_ref.to_string(), subtitle.to_string()); - Ok(()) - } } // ============================================================================ @@ -724,7 +738,7 @@ impl CmuxWrapper { } CmuxPlacementPolicy::Window => { // Always create a new window - let window_id = self.client.create_window(None)?; + let window_id = self.client.create_window()?; Ok((window_id, true)) } CmuxPlacementPolicy::Auto => { @@ -734,7 +748,7 @@ impl CmuxWrapper { let window_id = self.client.active_window_id()?; Ok((window_id, false)) } else { - let window_id = self.client.create_window(None)?; + let window_id = self.client.create_window()?; Ok((window_id, true)) } } @@ -914,6 +928,80 @@ impl SessionWrapper for CmuxWrapper { mod tests { use super::*; + // ======================================================================== + // Pure helper tests + // ======================================================================== + + #[test] + fn test_cmux_version_parse_full_output() { + let v = CmuxVersion::parse("cmux 0.64.20 (77) [6c203b514]").unwrap(); + assert_eq!((v.major, v.minor, v.patch), (0, 64, 20)); + assert_eq!(v.raw, "0.64.20"); + } + + #[test] + fn test_cmux_version_parse_tolerates_component_suffix() { + let v = CmuxVersion::parse("cmux 0.65.1-beta").unwrap(); + assert_eq!((v.major, v.minor, v.patch), (0, 65, 1)); + } + + #[test] + fn test_cmux_version_parse_missing_patch_defaults_zero() { + let v = CmuxVersion::parse("cmux 1.2").unwrap(); + assert_eq!((v.major, v.minor, v.patch), (1, 2, 0)); + } + + #[test] + fn test_cmux_version_parse_garbage_returns_none() { + assert!(CmuxVersion::parse("").is_none()); + assert!(CmuxVersion::parse("cmux").is_none()); + assert!(CmuxVersion::parse("cmux beta").is_none()); + } + + #[test] + fn test_cmux_version_meets_minimum_boundaries() { + let parse = |s: &str| CmuxVersion::parse(s).unwrap(); + assert!(parse("cmux 0.64.8").meets_minimum(MIN_SUPPORTED_CMUX_VERSION)); + assert!(parse("cmux 0.64.20").meets_minimum(MIN_SUPPORTED_CMUX_VERSION)); + assert!(parse("cmux 1.0.0").meets_minimum(MIN_SUPPORTED_CMUX_VERSION)); + assert!(!parse("cmux 0.64.7").meets_minimum(MIN_SUPPORTED_CMUX_VERSION)); + assert!(!parse("cmux 0.62.2").meets_minimum(MIN_SUPPORTED_CMUX_VERSION)); + } + + #[test] + fn test_parse_ok_ref_strips_prefix() { + assert_eq!(parse_ok_ref("OK workspace:3\n").unwrap(), "workspace:3"); + assert_eq!(parse_ok_ref("workspace:3").unwrap(), "workspace:3"); + } + + #[test] + fn test_parse_ok_ref_rejects_empty() { + assert!(parse_ok_ref("OK ").is_err()); + assert!(parse_ok_ref("OK").is_err()); + assert!(parse_ok_ref(" \n").is_err()); + } + + #[test] + fn test_parse_windows_json_array() { + let json = r#"[{"index":0,"id":"win-uuid-1","key":"window:1","workspace_count":2,"selected_workspace_id":null},{"index":1,"id":42,"key":"window:2","workspace_count":0}]"#; + let windows = parse_windows_json(json).unwrap(); + assert_eq!(windows.len(), 2); + assert_eq!(windows[0].id, "win-uuid-1"); + assert_eq!(windows[1].id, "42"); + } + + #[test] + fn test_parse_windows_json_empty_array() { + assert!(parse_windows_json("[]").unwrap().is_empty()); + } + + #[test] + fn test_parse_windows_json_invalid() { + assert!(parse_windows_json("win-1\nwin-2").is_err()); + assert!(parse_windows_json(r#"{"id":"x"}"#).is_err()); + assert!(parse_windows_json(r#"[{"index":0}]"#).is_err()); + } + // ======================================================================== // CmuxClient trait tests (via MockCmuxClient) // ======================================================================== @@ -921,7 +1009,18 @@ mod tests { #[test] fn test_cmux_check_available_success() { let client = MockCmuxClient::new(); - assert!(client.check_available().is_ok()); + let version = client.check_available().unwrap(); + assert!(version.meets_minimum(MIN_SUPPORTED_CMUX_VERSION)); + } + + #[test] + fn test_cmux_check_available_unsupported_version() { + let client = MockCmuxClient::new(); + client.set_version(0, 62, 2); + let err = client.check_available().unwrap_err(); + assert!(matches!(err, CmuxError::UnsupportedVersion { .. })); + assert!(err.to_string().contains("0.62.2")); + assert!(err.to_string().contains("0.64.8")); } #[test] @@ -947,7 +1046,7 @@ mod tests { assert_eq!(client.window_count().unwrap(), 1); // Create another - let win_id = client.create_window(Some("Second")).unwrap(); + let win_id = client.create_window().unwrap(); assert!(win_id.starts_with("win-")); assert_eq!(client.window_count().unwrap(), 2); @@ -986,9 +1085,6 @@ mod tests { // Focus workspace assert!(client.focus_workspace(&ws_id).is_ok()); - // Rename workspace - assert!(client.rename_workspace(&ws_id, "renamed").is_ok()); - // Close workspace assert!(client.close_workspace(&ws_id).is_ok()); @@ -1012,34 +1108,6 @@ mod tests { assert!(client.read_screen("ws-999", false).is_err()); assert!(client.focus_workspace("ws-999").is_err()); assert!(client.close_workspace("ws-999").is_err()); - assert!(client.rename_workspace("ws-999", "x").is_err()); - } - - #[tokio::test] - async fn test_cmux_set_workspace_subtitle() { - let client = MockCmuxClient::new(); - let client_arc: Arc = Arc::new(client); - let config = SessionsCmuxConfig { - binary_path: "/mock/cmux".to_string(), - require_in_cmux: true, - placement: CmuxPlacementPolicy::Auto, - }; - let wrapper = CmuxWrapper::new(client_arc.clone(), &config); - - wrapper - .create_session("op-TASK-030", "/tmp/project") - .await - .unwrap(); - - let ws_ref = wrapper.workspace_ref("op-TASK-030").unwrap(); - client_arc - .set_workspace_subtitle(&ws_ref, "implement | ▶") - .unwrap(); - - assert_eq!( - client_arc.get_subtitle(&ws_ref).as_deref(), - Some("implement | ▶") - ); } // ======================================================================== diff --git a/src/agents/launcher/cmux_session.rs b/src/agents/launcher/cmux_session.rs index 82456238..647059b7 100644 --- a/src/agents/launcher/cmux_session.rs +++ b/src/agents/launcher/cmux_session.rs @@ -47,7 +47,7 @@ fn resolve_placement( } CmuxPlacementPolicy::Window => { let window_id = cmux - .create_window(None) + .create_window() .map_err(|e| anyhow::anyhow!("Failed to create window: {e}"))?; Ok((window_id, true)) } @@ -62,7 +62,7 @@ fn resolve_placement( Ok((window_id, false)) } else { let window_id = cmux - .create_window(None) + .create_window() .map_err(|e| anyhow::anyhow!("Failed to create window: {e}"))?; Ok((window_id, true)) } @@ -186,14 +186,14 @@ pub fn launch_in_cmux_with_options( // Inject relay env vars so agents can find the hub and register with their ticket ID if let Ok(socket_path) = std::env::var("RELAY_HUB_SOCKET") { let export_cmd = format!( - "export RELAY_HUB_SOCKET={socket_path} RELAY_AGENT_NAME={}\n", + "export RELAY_HUB_SOCKET={socket_path} RELAY_AGENT_NAME={}\r", ticket.id ); let _ = cmux.send_text(&workspace_ref, &export_cmd); } // Send the command to the cmux workspace - let bash_cmd = format!("bash {}\n", command_file.display()); + let bash_cmd = format!("bash {}\r", command_file.display()); if let Err(e) = cmux.send_text(&workspace_ref, &bash_cmd) { // Clean up workspace on failure let _ = cmux.close_workspace(&workspace_ref); @@ -353,12 +353,12 @@ pub fn launch_in_cmux_with_relaunch_options( )?; if let Ok(socket_path) = std::env::var("RELAY_HUB_SOCKET") { let export_cmd = format!( - "export RELAY_HUB_SOCKET={socket_path} RELAY_AGENT_NAME={}\n", + "export RELAY_HUB_SOCKET={socket_path} RELAY_AGENT_NAME={}\r", ticket.id ); let _ = cmux.send_text(&workspace_ref, &export_cmd); } - let bash_cmd = format!("bash {}\n", command_file.display()); + let bash_cmd = format!("bash {}\r", command_file.display()); if let Err(e) = cmux.send_text(&workspace_ref, &bash_cmd) { let _ = cmux.close_workspace(&workspace_ref); anyhow::bail!("Failed to start LLM agent in cmux workspace: {e}"); diff --git a/src/agents/launcher/interpolation.rs b/src/agents/launcher/interpolation.rs index 89a61eb7..b3eb2216 100644 --- a/src/agents/launcher/interpolation.rs +++ b/src/agents/launcher/interpolation.rs @@ -300,6 +300,7 @@ mod tests { external_id: None, external_url: None, external_provider: None, + collection: None, } } diff --git a/src/agents/launcher/step_config.rs b/src/agents/launcher/step_config.rs index 980fa199..6a47d96b 100644 --- a/src/agents/launcher/step_config.rs +++ b/src/agents/launcher/step_config.rs @@ -176,6 +176,7 @@ mod tests { external_id: None, external_url: None, external_provider: None, + collection: None, } } diff --git a/src/agents/launcher/tests.rs b/src/agents/launcher/tests.rs index ef674c6e..e9ea915c 100644 --- a/src/agents/launcher/tests.rs +++ b/src/agents/launcher/tests.rs @@ -325,6 +325,7 @@ fn make_test_ticket(project: &str) -> Ticket { external_id: None, external_url: None, external_provider: None, + collection: None, } } diff --git a/src/agents/launcher/worktree_setup.rs b/src/agents/launcher/worktree_setup.rs index 4ee3d016..dcbbed69 100644 --- a/src/agents/launcher/worktree_setup.rs +++ b/src/agents/launcher/worktree_setup.rs @@ -348,6 +348,7 @@ mod tests { external_id: None, external_url: None, external_provider: None, + collection: None, } } diff --git a/src/agents/mod.rs b/src/agents/mod.rs index cf908ccc..12f1238f 100644 --- a/src/agents/mod.rs +++ b/src/agents/mod.rs @@ -64,7 +64,8 @@ pub use tmux::{ // Cmux implementation pub use cmux::{ - CmuxClient, CmuxError, CmuxWindow, CmuxWorkspace, CmuxWrapper, MockCmuxClient, SystemCmuxClient, + CmuxClient, CmuxError, CmuxVersion, CmuxWindow, CmuxWorkspace, CmuxWrapper, MockCmuxClient, + SystemCmuxClient, MIN_SUPPORTED_CMUX_VERSION, }; /// Lowercase-hex encode bytes (e.g. a SHA-256 digest) without pulling in a diff --git a/src/agents/sync.rs b/src/agents/sync.rs index 27a05c3e..05316902 100644 --- a/src/agents/sync.rs +++ b/src/agents/sync.rs @@ -871,6 +871,7 @@ mod tests { external_id: None, external_url: None, external_provider: None, + collection: None, }; let action = sync.determine_action(&ticket, "op-FEAT-123", &health); @@ -908,6 +909,7 @@ mod tests { external_id: None, external_url: None, external_provider: None, + collection: None, }; let action = sync.determine_action(&ticket, "op-FEAT-123", &health); @@ -945,6 +947,7 @@ mod tests { external_id: None, external_url: None, external_provider: None, + collection: None, }; let action = sync.determine_action(&ticket, "op-FEAT-456", &health); @@ -984,6 +987,7 @@ mod tests { external_id: None, external_url: None, external_provider: None, + collection: None, }; let action = sync.determine_action(&ticket, "op-FEAT-789", &health); @@ -1023,6 +1027,7 @@ mod tests { external_id: None, external_url: None, external_provider: None, + collection: None, }; let action = sync.determine_action(&ticket, "op-FEAT-123", &health); @@ -1061,6 +1066,7 @@ mod tests { external_id: None, external_url: None, external_provider: None, + collection: None, }; let action = sync.determine_action(&ticket, "op-FEAT-123", &health); diff --git a/src/api/kanban_sync.rs b/src/api/kanban_sync.rs index ae0e9e37..1165865c 100644 --- a/src/api/kanban_sync.rs +++ b/src/api/kanban_sync.rs @@ -58,6 +58,18 @@ impl KanbanBidirectionalSync { } } + /// Called when a ticket is returned to the queue (doing → todo). Pushes the + /// mapped "todo" status to the provider — no-op unless `status_mapping.todo` + /// is explicitly configured (there is no safe universal default column). + pub async fn on_ticket_requeued(&self, ticket: &Ticket) { + if let Some((provider, sync_cfg)) = self.resolve(ticket) { + if let Some(status) = todo_status(&sync_cfg) { + let status = status.to_string(); + self.push_status(ticket, &*provider, &status).await; + } + } + } + /// Called when a step completes. Appends an activity log entry to the upstream issue. pub async fn on_step_completed( &self, @@ -235,20 +247,20 @@ impl KanbanBidirectionalSync { } } +fn todo_status(sync_cfg: &ProjectSyncConfig) -> Option<&str> { + sync_cfg.status_mapping.todo.as_deref() +} + fn doing_status(sync_cfg: &ProjectSyncConfig) -> &str { sync_cfg - .sync_statuses - .first() - .map(String::as_str) + .status_mapping + .doing + .as_deref() .unwrap_or("In Progress") } fn done_status(sync_cfg: &ProjectSyncConfig) -> &str { - sync_cfg - .sync_statuses - .last() - .map(String::as_str) - .unwrap_or("Done") + sync_cfg.status_mapping.done.as_deref().unwrap_or("Done") } fn build_create_request(ticket: &Ticket, sync_cfg: &ProjectSyncConfig) -> CreateIssueRequest { @@ -268,46 +280,98 @@ fn build_create_request(ticket: &Ticket, sync_cfg: &ProjectSyncConfig) -> Create #[cfg(test)] mod tests { use super::*; + use crate::config::KanbanStatusMapping; - fn make_sync_cfg(statuses: Vec<&str>) -> ProjectSyncConfig { + fn make_sync_cfg( + todo: Option<&str>, + doing: Option<&str>, + done: Option<&str>, + ) -> ProjectSyncConfig { ProjectSyncConfig { - sync_statuses: statuses.into_iter().map(ToString::to_string).collect(), + status_mapping: KanbanStatusMapping { + todo: todo.map(ToString::to_string), + doing: doing.map(ToString::to_string), + done: done.map(ToString::to_string), + }, bidirectional: true, ..Default::default() } } #[test] - fn test_doing_status_from_sync_statuses() { - let cfg = make_sync_cfg(vec!["Started", "In Review", "Completed"]); + fn test_doing_status_from_mapping() { + let cfg = make_sync_cfg(Some("Backlog"), Some("Started"), Some("Completed")); assert_eq!(doing_status(&cfg), "Started"); } #[test] - fn test_done_status_from_sync_statuses() { - let cfg = make_sync_cfg(vec!["Started", "In Review", "Completed"]); + fn test_done_status_from_mapping() { + let cfg = make_sync_cfg(Some("Backlog"), Some("Started"), Some("Completed")); assert_eq!(done_status(&cfg), "Completed"); } #[test] - fn test_doing_status_default() { - let cfg = make_sync_cfg(vec![]); + fn test_doing_status_default_when_unmapped() { + let cfg = make_sync_cfg(None, None, None); assert_eq!(doing_status(&cfg), "In Progress"); } #[test] - fn test_done_status_default() { - let cfg = make_sync_cfg(vec![]); + fn test_done_status_default_when_unmapped() { + let cfg = make_sync_cfg(None, None, None); assert_eq!(done_status(&cfg), "Done"); } + #[test] + fn test_todo_status_none_without_mapping() { + // No fallback: requeue push must stay silent when todo is unmapped. + let cfg = make_sync_cfg(None, Some("Started"), Some("Completed")); + assert_eq!(todo_status(&cfg), None); + } + + #[test] + fn test_todo_status_some_with_mapping() { + let cfg = make_sync_cfg(Some("Backlog"), None, None); + assert_eq!(todo_status(&cfg), Some("Backlog")); + } + #[test] fn test_skips_non_bidirectional_projects() { - let mut cfg = make_sync_cfg(vec!["In Progress", "Done"]); + let mut cfg = make_sync_cfg(Some("To Do"), Some("In Progress"), Some("Done")); cfg.bidirectional = false; // sync service would not resolve a provider for this config // (we test the flag is respected by verifying bidirectional=false // is explicitly handled in resolve()) assert!(!cfg.bidirectional); } + + #[tokio::test] + async fn test_on_ticket_requeued_noop_without_todo_mapping() { + // Ticket without external linkage + empty config: resolve() returns + // None and the call must be a silent no-op. + let sync = KanbanBidirectionalSync::new(Arc::new(crate::config::Config::default())); + let ticket = Ticket { + filename: String::new(), + filepath: String::new(), + timestamp: String::new(), + ticket_type: "FIX".to_string(), + project: "demo".to_string(), + id: "FIX-1".to_string(), + summary: String::new(), + priority: String::new(), + status: "queued".to_string(), + step: String::new(), + content: String::new(), + sessions: std::collections::HashMap::default(), + llm_task: crate::queue::LlmTask::default(), + worktree_path: None, + branch: None, + external_id: None, + external_url: None, + external_provider: None, + collection: None, + step_delegators: std::collections::HashMap::default(), + }; + sync.on_ticket_requeued(&ticket).await; + } } diff --git a/src/app/data_sync.rs b/src/app/data_sync.rs index ef195577..15d502fc 100644 --- a/src/app/data_sync.rs +++ b/src/app/data_sync.rs @@ -59,12 +59,22 @@ impl App { } } SessionWrapperType::Cmux => { - let binary_path = &self.config.sessions.cmux.binary_path; - let binary_available = std::path::Path::new(binary_path).exists(); + use crate::agents::CmuxClient as _; + let client = + crate::agents::SystemCmuxClient::from_config(&self.config.sessions.cmux); let in_cmux = std::env::var("CMUX_WORKSPACE_ID").is_ok(); + let (binary_available, version, version_ok) = match client.check_available() { + Ok(v) => (true, Some(v.raw), true), + Err(crate::agents::CmuxError::UnsupportedVersion { found, .. }) => { + (true, Some(found), false) + } + Err(_) => (false, None, true), + }; WrapperConnectionStatus::Cmux { binary_available, in_cmux, + version, + version_ok, } } SessionWrapperType::Zellij => { diff --git a/src/app/kanban_onboarding.rs b/src/app/kanban_onboarding.rs index e577177d..f254aea4 100644 --- a/src/app/kanban_onboarding.rs +++ b/src/app/kanban_onboarding.rs @@ -248,6 +248,8 @@ impl App { api_key_env: api_key_env.clone(), project_key: project_key.clone(), sync_user_id: account_id, + // TUI wizard has no column-mapping step; map via web/VS Code config UI. + status_mapping: None, }), linear: None, github: None, @@ -297,6 +299,7 @@ impl App { api_key_env: api_key_env.clone(), project_key: project_key.clone(), sync_user_id: user_id, + status_mapping: None, }), github: None, }; diff --git a/src/app/mod.rs b/src/app/mod.rs index f8b07885..28792293 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -212,11 +212,10 @@ impl App { // Initialize REST API server lifecycle manager let rest_api_server = RestApiServer::new(config.clone(), config.rest_api.port); - // Initialize issue type registry - let mut issue_type_registry = IssueTypeRegistry::new(); - if let Err(e) = issue_type_registry.load_all(&config.tickets_path()) { - tracing::warn!("Failed to load issue types: {}", e); - } + // Initialize issue type registry via the canonical loader shared with + // the REST API and CLI (collection-scoped .tickets/templates/ store). + let mut issue_type_registry = + crate::startup::templates::load_registry(&config.tickets_path()); // Activate configured collection if specified if let Some(ref active) = config.templates.active_collection { diff --git a/src/app/session.rs b/src/app/session.rs index 5bb5f678..53020e29 100644 --- a/src/app/session.rs +++ b/src/app/session.rs @@ -131,7 +131,9 @@ impl App { .get_in_progress_ticket(ticket_id)? .ok_or_else(|| anyhow::anyhow!("Ticket not found: {ticket_id}"))?; - // Move ticket back to queue + // Move ticket back to queue. Upstream kanban requeue-push (doing→todo) + // is wired on the MCP return_to_queue path; this sync recovery path + // stays local-only to avoid blocking on provider calls. queue.return_to_queue(&ticket)?; // Remove agent from state diff --git a/src/app/tests.rs b/src/app/tests.rs index bd3a3072..fb91f3f5 100644 --- a/src/app/tests.rs +++ b/src/app/tests.rs @@ -699,6 +699,7 @@ Test content external_id: None, external_url: None, external_provider: None, + collection: None, }; // Return to queue diff --git a/src/app/tickets.rs b/src/app/tickets.rs index 8a699f45..3e708c87 100644 --- a/src/app/tickets.rs +++ b/src/app/tickets.rs @@ -92,23 +92,17 @@ impl App { .map(|s| { s.selected_hosted_collections() .into_iter() - .map(|r| (r.manifest.clone(), r.files.clone())) + .map(|r| (r.manifest.clone(), r.files.clone(), r.icon_svg.clone())) .collect() }) .unwrap_or_default(); - for (manifest, files) in &hosted { - let dir = tickets_path.join("templates").join(&manifest.id); - fs::create_dir_all(&dir)?; - fs::write( - dir.join("collection.json"), - format!("{}\n", manifest.to_json()?), + for (manifest, files, icon_svg) in &hosted { + crate::startup::templates::write_fetched_collection( + &tickets_path.join("templates"), + manifest, + files, + icon_svg.as_deref(), )?; - for (key, schema_json, template_md) in files { - fs::write(dir.join(format!("{key}.json")), schema_json)?; - if let Some(md) = template_md { - fs::write(dir.join(format!("{key}.md")), md)?; - } - } } if let [single] = hosted.as_slice() { self.config.templates.active_collection = Some(single.0.id.clone()); @@ -129,10 +123,7 @@ impl App { // Reload the issue type registry so the chosen collection is active // without requiring a restart (mirrors App::new's load path). - let mut registry = crate::issuetypes::IssueTypeRegistry::new(); - if let Err(e) = registry.load_all(&tickets_path) { - tracing::warn!("Failed to reload issue types after setup: {}", e); - } + let mut registry = crate::startup::templates::load_registry(&tickets_path); if let Some(ref active) = self.config.templates.active_collection { if let Err(e) = registry.activate_collection(active) { tracing::warn!("Failed to activate collection '{}': {}", active, e); @@ -155,7 +146,7 @@ impl App { for project in &discovered_projects { let project_path = projects_path.join(project); - // ASSESS or PROJECT-INIT creates assess tickets + // ASSESS or PROJECT_INIT creates assess tickets if startup_tickets.contains(&"assess".to_string()) || startup_tickets.contains(&"project_init".to_string()) { @@ -189,7 +180,7 @@ impl App { } } - // AGENT-SETUP or PROJECT-INIT creates agent tickets + // AGENT_SETUP or PROJECT_INIT creates agent tickets if startup_tickets.contains(&"agent_setup".to_string()) || startup_tickets.contains(&"project_init".to_string()) { @@ -203,12 +194,12 @@ impl App { tracing::info!( created = ?result.created, project = %project, - "Created AGENT-SETUP startup tickets" + "Created AGENT_SETUP startup tickets" ); } } Err(e) => { - tracing::warn!(project = %project, error = %e, "Failed to create AGENT-SETUP tickets"); + tracing::warn!(project = %project, error = %e, "Failed to create AGENT_SETUP tickets"); } } } diff --git a/src/collections/coder/BUG.json b/src/collections/coder/BUG.json new file mode 100644 index 00000000..9a1a54a9 --- /dev/null +++ b/src/collections/coder/BUG.json @@ -0,0 +1,139 @@ +{ + "$schema": "../../schemas/issuetype_schema.json", + "key": "BUG", + "name": "Bug", + "description": "Defect report synced from the Linear Bug label with reproduce-first workflow", + "mode": "autonomous", + "glyph": "x", + "color": "red", + "project_required": true, + "agent_prompt": "Review this project and prepare to create an agent for fixing bugs. The agent should read tickets from .tickets/, reproduce issues with failing tests, implement minimal fixes, verify with tests, and create PRs. Output ONLY the agent system prompt.", + "prompt": "You are fixing a bug in the {{ project }} project.\n\nThis ticket may have been synced from Linear; the ticket body carries the source description and a link back to the Linear issue.\n\n## Current Behavior\n{{ current_behavior }}\n\n## Expected Behavior\n{{ expected_behavior }}\n\n## Steps to Reproduce\n{{ steps_to_reproduce }}\n\nReproduce first, then fix the root cause with the smallest change that resolves it.", + "fields": [ + { + "name": "id", + "description": "Unique ticket identifier", + "type": "string", + "required": true, + "auto": "id", + "display_order": 0, + "user_editable": false + }, + { + "name": "priority", + "description": "Ticket priority level", + "type": "enum", + "required": false, + "default": "P2-medium", + "options": ["P0-critical", "P1-high", "P2-medium", "P3-low"], + "display_order": 1 + }, + { + "name": "severity", + "description": "Bug severity", + "type": "enum", + "required": false, + "default": "N/A", + "options": ["S0-outage", "S1-major", "S2-minor", "S3-cosmetic", "N/A"], + "display_order": 2 + }, + { + "name": "branch", + "description": "Git branch name", + "type": "string", + "required": true, + "auto": "branch", + "display_order": 3, + "user_editable": false + }, + { + "name": "summary", + "description": "Name or summary of this bug", + "type": "string", + "required": true, + "default": "", + "placeholder": "Brief description of the defect", + "max_length": 120, + "display_order": 4 + }, + { + "name": "current_behavior", + "description": "What happens today (the defect)", + "type": "text", + "required": false, + "default": "", + "placeholder": "Observed behavior, error messages, log excerpts", + "display_order": 5 + }, + { + "name": "expected_behavior", + "description": "What should happen instead", + "type": "text", + "required": false, + "default": "", + "placeholder": "Correct behavior once fixed", + "display_order": 6 + }, + { + "name": "steps_to_reproduce", + "description": "How to trigger the defect", + "type": "text", + "required": false, + "default": "", + "placeholder": "1. Do X\n2. Do Y\n3. Observe Z", + "display_order": 7 + } + ], + "steps": [ + { + "name": "plan", + "display_name": "Planning", + "outputs": ["plan"], + "prompt": "Assess the project and plan reproduction:\n\n1. Understand the project structure\n2. Find how to run the project and tests\n3. Locate code likely involved in the defect\n\n## Current Behavior\n{{ current_behavior }}\n\n## Expected Behavior\n{{ expected_behavior }}\n\n## Steps to Reproduce\n{{ steps_to_reproduce }}\n\nWrite a plan to `.tickets/plans/{{ id }}.md` with:\n- How to run the project and relevant test commands\n- Steps to reproduce the issue\n- Initial hypotheses about the root cause", + "allowed_tools": ["Read", "Glob", "Grep", "Write", "Bash"], + "review_type": "plan", + "artifact_patterns": [".tickets/plans/{{ id }}.md"], + "on_reject": { + "goto_step": "plan", + "prompt": "Plan rejected: {{ rejection_reason }}\n\nRevise the reproduction plan." + }, + "next_step": "reproduce" + }, + { + "name": "reproduce", + "display_name": "Reproducing", + "outputs": ["test", "report"], + "prompt": "Reproduce the bug:\n\n1. Follow the plan to reproduce the issue\n2. Write a failing test that demonstrates the defect\n3. Document the reproduction in `.tickets/notes/{{ id }}.md`\n4. Confirm the test fails for the expected reason", + "allowed_tools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"], + "next_step": "test" + }, + { + "name": "test", + "display_name": "Baseline Testing", + "outputs": ["report"], + "prompt": "Establish test baseline:\n\n1. Run the full test suite to understand current state\n2. Document which tests pass/fail\n3. Identify any related test coverage gaps\n4. Note any flaky or slow tests", + "allowed_tools": ["Read", "Bash"], + "next_step": "fix" + }, + { + "name": "fix", + "display_name": "Fixing", + "outputs": ["code"], + "prompt": "Implement the fix:\n\n1. Apply a minimal fix addressing the root cause\n2. Verify the previously failing test now passes\n3. Run the project's full test suite\n4. Run the project's linter and formatter\n\nKeep the fix focused and minimal.", + "allowed_tools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"], + "next_step": "deploy" + }, + { + "name": "deploy", + "display_name": "Deploying", + "outputs": ["pr"], + "prompt": "Create a pull request for the fix:\n\n1. Commit all changes with message: `fix({{ project }}): {{ summary }}`\n2. Push the fix branch\n3. Create a PR with:\n - Root cause analysis\n - Description of the fix\n - Test verification\n - Link to ticket: {{ id }}\n\nIf the ticket links a Linear issue, reference it in the PR body so Linear links the PR.\n\nFix complete. Move ticket to completed after PR is merged.", + "allowed_tools": ["Bash", "Read"], + "review_type": "pr", + "on_reject": { + "goto_step": "fix", + "prompt": "Deploy rejected: {{ rejection_reason }}\n\nAddress feedback and revise the fix." + } + } + ] +} diff --git a/src/collections/coder/BUG.md b/src/collections/coder/BUG.md new file mode 100644 index 00000000..e054b47d --- /dev/null +++ b/src/collections/coder/BUG.md @@ -0,0 +1,23 @@ +--- +id: {{ id }} +{{#if step }}step: {{ step }} +{{/if}}status: {{ status }} +created: {{ created_datetime }} +branch: {{ branch }} +{{#if priority }}priority: {{ priority }} +{{/if}}--- + +# Bug: {{ summary }} + +{{#if current_behavior }} +## Current Behavior +{{ current_behavior }} +{{/if}} +{{#if expected_behavior }} +## Expected Behavior +{{ expected_behavior }} +{{/if}} +{{#if steps_to_reproduce }} +## Steps to Reproduce +{{ steps_to_reproduce }} +{{/if}} diff --git a/src/collections/coder/FEATURE.json b/src/collections/coder/FEATURE.json new file mode 100644 index 00000000..e79eeacd --- /dev/null +++ b/src/collections/coder/FEATURE.json @@ -0,0 +1,128 @@ +{ + "$schema": "../../schemas/issuetype_schema.json", + "key": "FEATURE", + "name": "Feature", + "description": "New functionality synced from the Linear Feature label", + "mode": "autonomous", + "glyph": "+", + "color": "green", + "project_required": true, + "agent_prompt": "Review this project and prepare to create an agent for implementing new features. The agent should read tickets from .tickets/, create feature branches, implement code following existing patterns, run tests and linting, and create PRs. Output ONLY the agent system prompt.", + "prompt": "You are implementing a new feature for the {{ project }} project.\n\nThis ticket may have been synced from Linear; the ticket body carries the source description and a link back to the Linear issue.\n\n## User Story\n{{ user_story }}\n\nBefore starting, understand the requirements and how success will be judged.", + "fields": [ + { + "name": "id", + "description": "Unique ticket identifier", + "type": "string", + "required": true, + "auto": "id", + "display_order": 0, + "user_editable": false + }, + { + "name": "priority", + "description": "Ticket priority level", + "type": "enum", + "required": false, + "default": "P2-medium", + "options": ["P0-critical", "P1-high", "P2-medium", "P3-low"], + "display_order": 1 + }, + { + "name": "branch", + "description": "Git branch name", + "type": "string", + "required": true, + "auto": "branch", + "display_order": 2, + "user_editable": false + }, + { + "name": "summary", + "description": "Name or summary of this feature", + "type": "string", + "required": true, + "default": "", + "placeholder": "Brief description of the feature", + "max_length": 120, + "display_order": 3 + }, + { + "name": "user_story", + "description": "Why is this feature needed? User story format preferred", + "type": "text", + "required": false, + "default": "", + "placeholder": "As a USER, I want to X, so I can Y", + "display_order": 4 + }, + { + "name": "estimate", + "description": "Estimate points (from Linear)", + "type": "integer", + "required": false, + "display_order": 5 + }, + { + "name": "customer", + "description": "Requesting customer (from Linear)", + "type": "string", + "required": false, + "default": "", + "placeholder": "Customer name if applicable", + "display_order": 6 + } + ], + "steps": [ + { + "name": "plan", + "display_name": "Planning", + "outputs": ["plan"], + "prompt": "You are implementing a new feature. First, read the ticket and explore the codebase to understand:\n1. Where the feature should be implemented\n2. What existing code/patterns to follow\n3. What tests need to be added\n\nCreate a detailed implementation plan in `.tickets/plans/{{ id }}.md` with:\n- Files to create/modify\n- Key implementation steps\n- Test coverage requirements\n- Any dependencies or risks", + "allowed_tools": ["Read", "Glob", "Grep", "Write"], + "review_type": "plan", + "artifact_patterns": [".tickets/plans/{{ id }}.md"], + "on_reject": { + "goto_step": "plan", + "prompt": "Plan rejected: {{ rejection_reason }}\n\nRevise the plan based on feedback." + }, + "next_step": "build" + }, + { + "name": "build", + "display_name": "Building", + "outputs": ["code"], + "prompt": "Build the feature structure based on the plan in `.tickets/plans/{{ id }}.md`.\n\nIn this step, focus on:\n- Creating new files and modules\n- Setting up the basic structure\n- Adding type definitions and interfaces\n- Creating stub implementations\n\nDo not implement full logic yet - that comes in the next step.", + "allowed_tools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"], + "next_step": "code" + }, + { + "name": "code", + "display_name": "Coding", + "outputs": ["code"], + "prompt": "Implement the feature logic based on the plan and structure.\n\nGuidelines:\n- Follow existing code patterns and conventions\n- Keep changes minimal and focused\n- Run formatters after making changes", + "allowed_tools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"], + "next_step": "test" + }, + { + "name": "test", + "display_name": "Testing", + "outputs": ["test", "code"], + "prompt": "Add tests for the new feature and ensure all tests pass.\n\n1. Write unit tests for new functions/modules\n2. Add integration tests if applicable\n3. Run the project's full test suite\n4. Run the project's linter and formatter\n\nFix any failures before proceeding.", + "allowed_tools": ["Read", "Write", "Edit", "Bash"], + "next_step": "deploy" + }, + { + "name": "deploy", + "display_name": "Deploying", + "outputs": ["pr"], + "prompt": "Create a pull request for the feature:\n\n1. Commit all changes with a descriptive message\n2. Push the feature branch\n3. Create a PR with:\n - Clear title: `feat({{ project }}): {{ summary }}`\n - Description of changes\n - Link to ticket: {{ id }}\n - Test instructions\n\nIf the ticket links a Linear issue, reference it in the PR body so Linear links the PR.\n\nFeature complete. Move ticket to completed after PR is merged.", + "allowed_tools": ["Bash", "Read"], + "review_type": "pr", + "on_reject": { + "goto_step": "code", + "prompt": "Deploy rejected: {{ rejection_reason }}\n\nAddress feedback and revise the implementation." + } + } + ] +} diff --git a/src/collections/coder/FEATURE.md b/src/collections/coder/FEATURE.md new file mode 100644 index 00000000..7c5d680b --- /dev/null +++ b/src/collections/coder/FEATURE.md @@ -0,0 +1,19 @@ +--- +id: {{ id }} +{{#if step }}step: {{ step }} +{{/if}}status: {{ status }} +created: {{ created_datetime }} +branch: {{ branch }} +{{#if priority }}priority: {{ priority }} +{{/if}}--- + +# Feature: {{ summary }} + +{{#if user_story }} +## User Story +{{ user_story }} +{{/if}} +{{#if customer }} +## Customer +{{ customer }} +{{/if}} diff --git a/src/collections/coder/IMPROVEMENT.json b/src/collections/coder/IMPROVEMENT.json new file mode 100644 index 00000000..959d5094 --- /dev/null +++ b/src/collections/coder/IMPROVEMENT.json @@ -0,0 +1,120 @@ +{ + "$schema": "../../schemas/issuetype_schema.json", + "key": "IMPROVEMENT", + "name": "Improvement", + "description": "Enhancement to existing behavior synced from the Linear Improvement label", + "mode": "autonomous", + "glyph": "^", + "color": "blue", + "project_required": true, + "agent_prompt": "Review this project and prepare to create an agent for improving existing functionality. The agent should read tickets from .tickets/, scope the smallest change that delivers the improvement, implement it following existing patterns, run tests and linting, and create PRs. Output ONLY the agent system prompt.", + "prompt": "You are improving existing functionality in the {{ project }} project.\n\nThis ticket may have been synced from Linear; the ticket body carries the source description and a link back to the Linear issue.\n\n## Motivation\n{{ motivation }}\n\nPrefer the smallest change that delivers the improvement. Do not expand scope.", + "fields": [ + { + "name": "id", + "description": "Unique ticket identifier", + "type": "string", + "required": true, + "auto": "id", + "display_order": 0, + "user_editable": false + }, + { + "name": "priority", + "description": "Ticket priority level", + "type": "enum", + "required": false, + "default": "P2-medium", + "options": ["P0-critical", "P1-high", "P2-medium", "P3-low"], + "display_order": 1 + }, + { + "name": "branch", + "description": "Git branch name", + "type": "string", + "required": true, + "auto": "branch", + "display_order": 2, + "user_editable": false + }, + { + "name": "summary", + "description": "Name or summary of this improvement", + "type": "string", + "required": true, + "default": "", + "placeholder": "Brief description of the improvement", + "max_length": 120, + "display_order": 3 + }, + { + "name": "motivation", + "description": "What is inadequate today, and what does better look like?", + "type": "text", + "required": false, + "default": "", + "placeholder": "Current shortcoming and the expected improvement", + "display_order": 4 + }, + { + "name": "estimate", + "description": "Estimate points (from Linear)", + "type": "integer", + "required": false, + "display_order": 5 + }, + { + "name": "customer", + "description": "Requesting customer (from Linear)", + "type": "string", + "required": false, + "default": "", + "placeholder": "Customer name if applicable", + "display_order": 6 + } + ], + "steps": [ + { + "name": "plan", + "display_name": "Planning", + "outputs": ["plan"], + "prompt": "You are improving existing functionality. First, read the ticket and locate the current behavior in the codebase:\n1. Find the code that implements today's behavior\n2. Understand why it is inadequate ({{ motivation }})\n3. Identify the smallest change that delivers the improvement\n\nCreate a focused plan in `.tickets/plans/{{ id }}.md` with:\n- The current behavior and where it lives\n- The proposed change, scoped minimally - no scope creep\n- How existing tests must change, and what new coverage is needed\n- Any behavior changes callers/users will notice", + "allowed_tools": ["Read", "Glob", "Grep", "Write"], + "review_type": "plan", + "artifact_patterns": [".tickets/plans/{{ id }}.md"], + "on_reject": { + "goto_step": "plan", + "prompt": "Plan rejected: {{ rejection_reason }}\n\nRevise the plan based on feedback." + }, + "next_step": "code" + }, + { + "name": "code", + "display_name": "Coding", + "outputs": ["code"], + "prompt": "Implement the improvement per the plan in `.tickets/plans/{{ id }}.md`.\n\nGuidelines:\n- Change only what the plan scoped; resist adjacent cleanups\n- Follow existing code patterns and conventions\n- Preserve existing behavior outside the improvement\n- Run formatters after making changes", + "allowed_tools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"], + "next_step": "test" + }, + { + "name": "test", + "display_name": "Testing", + "outputs": ["test", "code"], + "prompt": "Verify the improvement and guard against regressions.\n\n1. Update tests that asserted the old behavior\n2. Add tests demonstrating the improved behavior\n3. Run the project's full test suite\n4. Run the project's linter and formatter\n\nFix any failures before proceeding.", + "allowed_tools": ["Read", "Write", "Edit", "Bash"], + "next_step": "deploy" + }, + { + "name": "deploy", + "display_name": "Deploying", + "outputs": ["pr"], + "prompt": "Create a pull request for the improvement:\n\n1. Commit all changes with a descriptive message\n2. Push the branch\n3. Create a PR with:\n - Clear title: `improve({{ project }}): {{ summary }}`\n - Before/after description of the behavior\n - Link to ticket: {{ id }}\n - Test instructions\n\nIf the ticket links a Linear issue, reference it in the PR body so Linear links the PR.\n\nImprovement complete. Move ticket to completed after PR is merged.", + "allowed_tools": ["Bash", "Read"], + "review_type": "pr", + "on_reject": { + "goto_step": "code", + "prompt": "Deploy rejected: {{ rejection_reason }}\n\nAddress feedback and revise the implementation." + } + } + ] +} diff --git a/src/collections/coder/IMPROVEMENT.md b/src/collections/coder/IMPROVEMENT.md new file mode 100644 index 00000000..13b5e7ef --- /dev/null +++ b/src/collections/coder/IMPROVEMENT.md @@ -0,0 +1,19 @@ +--- +id: {{ id }} +{{#if step }}step: {{ step }} +{{/if}}status: {{ status }} +created: {{ created_datetime }} +branch: {{ branch }} +{{#if priority }}priority: {{ priority }} +{{/if}}--- + +# Improvement: {{ summary }} + +{{#if motivation }} +## Motivation +{{ motivation }} +{{/if}} +{{#if customer }} +## Customer +{{ customer }} +{{/if}} diff --git a/src/collections/coder/collection.json b/src/collections/coder/collection.json new file mode 100644 index 00000000..ca03a839 --- /dev/null +++ b/src/collections/coder/collection.json @@ -0,0 +1,72 @@ +{ + "schema_version": 1, + "id": "coder", + "name": "Coder", + "description": "Linear-synced engineering flow: Feature, Improvement, and Bug work delegated to coding agents.", + "version": "1.0.0", + "publisher": "untra", + "author": "untra", + "url": "https://github.com/untra/operator", + "license": "MIT", + "tags": [ + "community", + "linear", + "kanban", + "engineering" + ], + "tier": "community", + "icon_path": "icon.svg", + "created": "2026-08-01", + "updated": "2026-08-01", + "kanban_defaults": { + "suggested_type_mappings": { + "Feature": "FEATURE", + "Improvement": "IMPROVEMENT", + "Bug": "BUG" + } + }, + "issue_types": [ + { + "key": "FEATURE", + "schema_path": "FEATURE.json", + "template_path": "FEATURE.md" + }, + { + "key": "IMPROVEMENT", + "schema_path": "IMPROVEMENT.json", + "template_path": "IMPROVEMENT.md" + }, + { + "key": "BUG", + "schema_path": "BUG.json", + "template_path": "BUG.md" + } + ], + "workflow_hints": { + "loop_kind": "kanban_synced_single_pass", + "memory_surfaces": [ + "ticket", + ".tickets/plans/{{ id }}.md" + ], + "review_gates": [ + "plan_review", + "test_suite", + "pr_review" + ], + "external_tools": [ + "git", + "gh", + "linear" + ], + "stop_conditions": [ + "tests_green", + "pr_created" + ], + "runner_semantics": "prompt_driven" + }, + "default_selected": [ + "FEATURE", + "IMPROVEMENT", + "BUG" + ] +} diff --git a/src/collections/coder/icon.svg b/src/collections/coder/icon.svg new file mode 100644 index 00000000..5356a1cb --- /dev/null +++ b/src/collections/coder/icon.svg @@ -0,0 +1 @@ +Coder diff --git a/src/collections/dev_kanban/collection.json b/src/collections/dev_kanban/collection.json index 407d6af7..c1145b1d 100644 --- a/src/collections/dev_kanban/collection.json +++ b/src/collections/dev_kanban/collection.json @@ -9,6 +9,9 @@ "url": "https://github.com/untra/operator", "license": "MIT", "tags": ["builtin", "kanban", "dev"], + "icon_path": "icon.svg", + "created": "2026-01-08", + "updated": "2026-06-16", "issue_types": [ { "key": "TASK", "schema_path": "TASK.json", "template_path": "TASK.md" }, { "key": "FEAT", "schema_path": "FEAT.json", "template_path": "FEAT.md" }, diff --git a/src/collections/dev_kanban/icon.svg b/src/collections/dev_kanban/icon.svg new file mode 100644 index 00000000..13516744 --- /dev/null +++ b/src/collections/dev_kanban/icon.svg @@ -0,0 +1 @@ +Dev Kanban diff --git a/src/collections/devops_kanban/collection.json b/src/collections/devops_kanban/collection.json index bbcd3e08..a430f3d8 100644 --- a/src/collections/devops_kanban/collection.json +++ b/src/collections/devops_kanban/collection.json @@ -9,6 +9,9 @@ "url": "https://github.com/untra/operator", "license": "MIT", "tags": ["builtin", "kanban", "devops"], + "icon_path": "icon.svg", + "created": "2026-01-08", + "updated": "2026-06-16", "issue_types": [ { "key": "TASK", "schema_path": "TASK.json", "template_path": "TASK.md" }, { "key": "FEAT", "schema_path": "FEAT.json", "template_path": "FEAT.md" }, diff --git a/src/collections/devops_kanban/icon.svg b/src/collections/devops_kanban/icon.svg new file mode 100644 index 00000000..db59a314 --- /dev/null +++ b/src/collections/devops_kanban/icon.svg @@ -0,0 +1 @@ +DevOps Kanban diff --git a/src/collections/elves_overnight/collection.json b/src/collections/elves_overnight/collection.json index ccde1304..abe5e3e6 100644 --- a/src/collections/elves_overnight/collection.json +++ b/src/collections/elves_overnight/collection.json @@ -8,20 +8,72 @@ "author": "Aigora", "url": "https://github.com/aigorahub/elves", "license": "MIT", - "tags": ["agentic-loop", "overnight", "batch", "elves"], + "tags": [ + "agentic-loop", + "overnight", + "batch", + "elves" + ], + "tier": "community", + "icon_path": "icon.svg", + "created": "2026-06-16", + "updated": "2026-07-01", "issue_types": [ - { "key": "ELVSTAGE", "schema_path": "ELVSTAGE.json", "template_path": "ELVSTAGE.md" }, - { "key": "ELVBATCH", "schema_path": "ELVBATCH.json", "template_path": "ELVBATCH.md" }, - { "key": "LANDPR", "schema_path": "LANDPR.json", "template_path": "LANDPR.md" }, - { "key": "ELVRPT", "schema_path": "ELVRPT.json", "template_path": "ELVRPT.md" } + { + "key": "ELVSTAGE", + "schema_path": "ELVSTAGE.json", + "template_path": "ELVSTAGE.md" + }, + { + "key": "ELVBATCH", + "schema_path": "ELVBATCH.json", + "template_path": "ELVBATCH.md" + }, + { + "key": "LANDPR", + "schema_path": "LANDPR.json", + "template_path": "LANDPR.md" + }, + { + "key": "ELVRPT", + "schema_path": "ELVRPT.json", + "template_path": "ELVRPT.md" + } ], "workflow_hints": { "loop_kind": "staged_long_running_batch_loop", - "memory_surfaces": ["docs/elves/survival-guide.md", "docs/elves/execution-log.md", "docs/elves/learnings.md", ".elves-session.json", "PR comments and checks"], - "review_gates": ["stage_review", "batch_validation", "fresh_review", "judge_verdict", "human_land_gate"], - "external_tools": ["git", "gh", "project test command", "optional browser or visual review command"], - "stop_conditions": ["batch complete and checkpointed", "validation cannot be repaired safely", "PR has unresolved requested changes", "time/risk budget exhausted"], + "memory_surfaces": [ + "docs/elves/survival-guide.md", + "docs/elves/execution-log.md", + "docs/elves/learnings.md", + ".elves-session.json", + "PR comments and checks" + ], + "review_gates": [ + "stage_review", + "batch_validation", + "fresh_review", + "judge_verdict", + "human_land_gate" + ], + "external_tools": [ + "git", + "gh", + "project test command", + "optional browser or visual review command" + ], + "stop_conditions": [ + "batch complete and checkpointed", + "validation cannot be repaired safely", + "PR has unresolved requested changes", + "time/risk budget exhausted" + ], "runner_semantics": "prompt_driven" }, - "default_selected": ["ELVSTAGE", "ELVBATCH", "LANDPR", "ELVRPT"] + "default_selected": [ + "ELVSTAGE", + "ELVBATCH", + "LANDPR", + "ELVRPT" + ] } diff --git a/src/collections/elves_overnight/icon.svg b/src/collections/elves_overnight/icon.svg new file mode 100644 index 00000000..0e288457 --- /dev/null +++ b/src/collections/elves_overnight/icon.svg @@ -0,0 +1 @@ +Elves Overnight diff --git a/src/collections/fetch.rs b/src/collections/fetch.rs index 7052c43a..99141ee3 100644 --- a/src/collections/fetch.rs +++ b/src/collections/fetch.rs @@ -100,6 +100,11 @@ pub struct FetchedCollection { pub manifest: CollectionManifest, /// (key, `schema_json`, `template_md`) for each issue type, in manifest order. pub files: Vec<(String, String, Option)>, + /// The collection's SVG icon, if it declared one and the fetch succeeded. + /// + /// Best-effort and unverified by design: the icon is presentational and + /// never executed, so a missing or malformed one must not fail an install. + pub icon_svg: Option, } fn http_client(timeout_secs: u64) -> Result { @@ -212,7 +217,27 @@ pub async fn fetch_collection( files.push((it.key.clone(), schema_json, template_md)); } - Ok(FetchedCollection { manifest, files }) + // 5. The icon, best-effort. Deliberately after verification and outside it: + // a collection that renders without its glyph is still a good install. + let icon_svg = match &manifest.icon_path { + Some(path) => { + let url = resolve_url(&manifest_url, path); + match get_bytes(&client, &url).await { + Ok(bytes) => String::from_utf8(bytes).ok(), + Err(e) => { + tracing::debug!(error = %e, collection = %entry.id, "collection icon fetch failed"); + None + } + } + } + None => None, + }; + + Ok(FetchedCollection { + manifest, + files, + icon_svg, + }) } /// Where a resolved collection's definition came from. @@ -232,6 +257,8 @@ pub struct ResolvedCollection { pub origin: CollectionOrigin, /// Why we fell back to embedded, if applicable (e.g. checksum failure). pub note: Option, + /// The collection's SVG icon, if available (best-effort, unverified). + pub icon_svg: Option, } /// Build a [`FetchedCollection`] from an embedded collection, computing @@ -256,7 +283,11 @@ pub fn embedded_fetched(embedded: &EmbeddedCollection) -> Result { @@ -295,6 +327,7 @@ pub async fn resolve_for_setup( files: fc.files, origin: CollectionOrigin::Embedded, note: Some(e.to_string()), + icon_svg: fc.icon_svg, }); } } @@ -315,6 +348,7 @@ pub async fn resolve_for_setup( files: fc.files, origin: CollectionOrigin::Embedded, note: None, + icon_svg: fc.icon_svg, }); } } diff --git a/src/collections/full/collection.json b/src/collections/full/collection.json index c9af00bc..398ecaa1 100644 --- a/src/collections/full/collection.json +++ b/src/collections/full/collection.json @@ -9,6 +9,9 @@ "url": "https://github.com/untra/operator", "license": "MIT", "tags": ["builtin"], + "icon_path": "icon.svg", + "created": "2026-05-27", + "updated": "2026-06-16", "issue_types": [ { "key": "TASK", "schema_path": "TASK.json", "template_path": "TASK.md" }, { "key": "FEAT", "schema_path": "FEAT.json", "template_path": "FEAT.md" }, diff --git a/src/collections/full/icon.svg b/src/collections/full/icon.svg new file mode 100644 index 00000000..86889735 --- /dev/null +++ b/src/collections/full/icon.svg @@ -0,0 +1 @@ +Full diff --git a/src/collections/jr_orchestration/collection.json b/src/collections/jr_orchestration/collection.json index 7516ca94..156c618c 100644 --- a/src/collections/jr_orchestration/collection.json +++ b/src/collections/jr_orchestration/collection.json @@ -8,21 +8,73 @@ "author": "snapwich", "url": "https://github.com/snapwich/jr", "license": "MIT", - "tags": ["agentic-loop", "feature-graph", "review", "jr"], + "tags": [ + "agentic-loop", + "feature-graph", + "review", + "jr" + ], + "tier": "community", + "icon_path": "icon.svg", + "created": "2026-06-16", + "updated": "2026-07-01", "issue_types": [ - { "key": "JRPLAN", "schema_path": "JRPLAN.json", "template_path": "JRPLAN.md" }, - { "key": "JRFEAT", "schema_path": "JRFEAT.json", "template_path": "JRFEAT.md" }, - { "key": "JRTASK", "schema_path": "JRTASK.json", "template_path": "JRTASK.md" }, - { "key": "JRREV", "schema_path": "JRREV.json", "template_path": "JRREV.md" }, - { "key": "JRREBASE", "schema_path": "JRREBASE.json", "template_path": "JRREBASE.md" } + { + "key": "JRPLAN", + "schema_path": "JRPLAN.json", + "template_path": "JRPLAN.md" + }, + { + "key": "JRFEAT", + "schema_path": "JRFEAT.json", + "template_path": "JRFEAT.md" + }, + { + "key": "JRTASK", + "schema_path": "JRTASK.json", + "template_path": "JRTASK.md" + }, + { + "key": "JRREV", + "schema_path": "JRREV.json", + "template_path": "JRREV.md" + }, + { + "key": "JRREBASE", + "schema_path": "JRREBASE.json", + "template_path": "JRREBASE.md" + } ], "workflow_hints": { "loop_kind": "feature_task_review_graph", - "memory_surfaces": [".tickets/jr/{{ id }}/plan.md", ".tickets/jr/{{ feature_id }}/handoff.md", "ticket parent/dependency notes"], - "review_gates": ["code_review", "architect_review", "human_pr_review"], - "external_tools": ["git", "gh", "project test command"], - "stop_conditions": ["feature PR ready for human review", "review changes requested", "blocked dependency documented", "review escalated to human after repeated changes (operator stops; no auto-handoff)"], + "memory_surfaces": [ + ".tickets/jr/{{ id }}/plan.md", + ".tickets/jr/{{ feature_id }}/handoff.md", + "ticket parent/dependency notes" + ], + "review_gates": [ + "code_review", + "architect_review", + "human_pr_review" + ], + "external_tools": [ + "git", + "gh", + "project test command" + ], + "stop_conditions": [ + "feature PR ready for human review", + "review changes requested", + "blocked dependency documented", + "review escalated to human after repeated changes (operator stops; no auto-handoff)" + ], "runner_semantics": "prompt_driven" }, - "default_selected": ["JRPLAN", "JRFEAT", "JRTASK", "JRREV", "JRREBASE"] + "default_selected": [ + "JRPLAN", + "JRFEAT", + "JRTASK", + "JRREV", + "JRREBASE" + ] } diff --git a/src/collections/jr_orchestration/icon.svg b/src/collections/jr_orchestration/icon.svg new file mode 100644 index 00000000..2ebdb4bb --- /dev/null +++ b/src/collections/jr_orchestration/icon.svg @@ -0,0 +1 @@ +JR Orchestration diff --git a/src/collections/manifest.rs b/src/collections/manifest.rs index 24882f47..ec9a1e80 100644 --- a/src/collections/manifest.rs +++ b/src/collections/manifest.rs @@ -11,11 +11,27 @@ //! embedded in the binary. use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; /// Current manifest schema version. Manifests with an unknown version are /// rejected by the fetcher and fall back to the embedded copy. pub const SCHEMA_VERSION: u32 = 1; +/// Provenance tier of a collection: who authored and maintains it. +/// +/// Orthogonal to distribution — curated community-authored collections may +/// ship embedded in the binary, while community submissions under +/// `collections/community/` are hosted-only. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum CollectionTier { + /// Authored and maintained by the operator project. + #[default] + Official, + /// Community-authored (attribution via `author`/`url`/`license`). + Community, +} + /// Top-level index listing the available collections. This is what the /// configurable `collections_manifest_url` points at. #[derive(Debug, Clone, Serialize, Deserialize)] @@ -50,6 +66,13 @@ pub struct CollectionIndexEntry { pub manifest_path: String, /// SHA-256 (lowercase hex) of the referenced `collection.json` bytes. pub checksum: String, + /// Provenance tier (defaults to official for older indexes). + #[serde(default)] + pub tier: CollectionTier, + /// Path to the collection's docs page, relative to the site root + /// `/collections/` (e.g. `dev_kanban/`). Informational, for deep links. + #[serde(default)] + pub docs_path: Option, } /// A single collection manifest (`collection.json`). @@ -88,6 +111,22 @@ pub struct CollectionManifest { /// Compatibility constraints. #[serde(default)] pub compatibility: Option, + /// Provenance tier (defaults to official for older manifests). + #[serde(default)] + pub tier: CollectionTier, + /// Bare filename of the collection's Simple Icons-shaped SVG, next to the + /// manifest. Deliberately not checksummed; icon must pass standards. + #[serde(default)] + pub icon_path: Option, + /// ISO-8601 date (`YYYY-MM-DD`) the collection was first published. + #[serde(default)] + pub created: Option, + /// ISO-8601 date (`YYYY-MM-DD`) of the last substantive revision. + #[serde(default)] + pub updated: Option, + /// Descriptive kanban onboarding defaults (v1: metadata only). + #[serde(default)] + pub kanban_defaults: Option, /// Issue types in this collection (display order). pub issue_types: Vec, /// Descriptive workflow hints (v1: metadata only, no execution behavior). @@ -130,6 +169,19 @@ pub struct IssueTypeEntry { pub template_checksum: Option, } +/// Descriptive kanban onboarding defaults for a collection. +/// +/// v1 is metadata only: suggestions seed the onboarding mapping UI but do +/// not drive sync behavior. +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +pub struct KanbanDefaults { + /// Suggested provider issue-type NAME -> collection issuetype key. + /// `BTreeMap` keeps serialization order deterministic so the hosted + /// bundle's manifest checksum is stable across generation runs. + #[serde(default)] + pub suggested_type_mappings: BTreeMap, +} + /// Descriptive metadata about a collection's intended agentic loop shape. /// /// v1 is metadata only: these fields are stored and displayed but do not @@ -284,4 +336,230 @@ mod tests { assert_eq!(m.id, m2.id); assert_eq!(m.type_keys(), m2.type_keys()); } + + #[test] + fn test_manifest_tier_defaults_to_official() { + // Older manifests without a tier field stay valid and are official. + let m = CollectionManifest::from_json(DEV_KANBAN_JSON).unwrap(); + assert_eq!(m.tier, CollectionTier::Official); + } + + #[test] + fn test_manifest_tier_community_round_trip() { + let json = r#"{ + "schema_version": 1, + "id": "gastown", + "name": "Gastown", + "tier": "community", + "author": "someone", + "issue_types": [ + {"key": "TASK", "schema_path": "TASK.json"} + ] + }"#; + let m = CollectionManifest::from_json(json).unwrap(); + assert_eq!(m.tier, CollectionTier::Community); + let serialized = m.to_json().unwrap(); + assert!(serialized.contains("\"tier\": \"community\"")); + let m2 = CollectionManifest::from_json(&serialized).unwrap(); + assert_eq!(m2.tier, CollectionTier::Community); + } + + #[test] + fn test_index_entry_tier_and_docs_path_default() { + let json = r#"{ + "schema_version": 1, + "collections": [ + {"id": "simple", "name": "Simple", "manifest_path": "simple/collection.json", "checksum": "abc"} + ] + }"#; + let index: CollectionIndex = serde_json::from_str(json).unwrap(); + let entry = &index.collections[0]; + assert_eq!(entry.tier, CollectionTier::Official); + assert!(entry.docs_path.is_none()); + } + + #[test] + fn test_index_entry_tier_and_docs_path_round_trip() { + let json = r#"{ + "schema_version": 1, + "collections": [ + {"id": "gastown", "name": "Gastown", "manifest_path": "gastown/collection.json", "checksum": "abc", "tier": "community", "docs_path": "gastown/"} + ] + }"#; + let index: CollectionIndex = serde_json::from_str(json).unwrap(); + let entry = &index.collections[0]; + assert_eq!(entry.tier, CollectionTier::Community); + assert_eq!(entry.docs_path.as_deref(), Some("gastown/")); + let round: CollectionIndex = + serde_json::from_str(&serde_json::to_string(&index).unwrap()).unwrap(); + assert_eq!(round.collections[0].tier, CollectionTier::Community); + assert_eq!(round.collections[0].docs_path.as_deref(), Some("gastown/")); + } + + #[test] + fn test_manifest_icon_and_dates_default_to_none() { + // Older manifests without icon/date fields stay valid. + let m = CollectionManifest::from_json(DEV_KANBAN_JSON).unwrap(); + assert!(m.icon_path.is_none()); + assert!(m.created.is_none()); + assert!(m.updated.is_none()); + } + + #[test] + fn test_manifest_icon_and_dates_round_trip() { + let json = r#"{ + "schema_version": 1, + "id": "ralph_loop", + "name": "Ralph Loop", + "icon_path": "icon.svg", + "created": "2026-05-01", + "updated": "2026-08-01", + "issue_types": [ + {"key": "PRD", "schema_path": "PRD.json"} + ] + }"#; + let m = CollectionManifest::from_json(json).unwrap(); + assert_eq!(m.icon_path.as_deref(), Some("icon.svg")); + assert_eq!(m.created.as_deref(), Some("2026-05-01")); + assert_eq!(m.updated.as_deref(), Some("2026-08-01")); + let m2 = CollectionManifest::from_json(&m.to_json().unwrap()).unwrap(); + assert_eq!(m2.icon_path, m.icon_path); + assert_eq!(m2.created, m.created); + assert_eq!(m2.updated, m.updated); + } + + #[test] + fn test_icon_and_dates_are_outside_the_manifest_checksum() { + // The checksum derives from issue-type file checksums only, so changing + // presentational metadata must not invalidate a hosted collection. + let mut m = CollectionManifest::from_json(DEV_KANBAN_JSON).unwrap(); + let before = crate::collections::fetch::derive_manifest_checksum(&m.issue_types); + + m.icon_path = Some("icon.svg".to_string()); + m.created = Some("2026-05-01".to_string()); + m.updated = Some("2026-08-01".to_string()); + let after = crate::collections::fetch::derive_manifest_checksum(&m.issue_types); + + assert_eq!(before, after); + } + + /// Every field of a fully-populated manifest, so the parity tests below + /// compare complete key sets rather than whatever `DEV_KANBAN_JSON` happens + /// to set. + fn fully_populated() -> CollectionManifest { + let mut m = CollectionManifest::from_json(DEV_KANBAN_JSON).unwrap(); + m.author = Some("Operator!".to_string()); + m.url = Some("https://github.com/untra/operator".to_string()); + m.license = Some("MIT".to_string()); + m.compatibility = Some(Compatibility { + operator_version: Some(">=0.2.0".to_string()), + }); + m.icon_path = Some("icon.svg".to_string()); + m.created = Some("2026-01-15".to_string()); + m.updated = Some("2026-08-01".to_string()); + m.kanban_defaults = Some(KanbanDefaults::default()); + m.checksum = Some("deadbeef".to_string()); + m + } + + fn schema_properties(pointer: &str) -> serde_json::Map { + let schema: serde_json::Value = + serde_json::from_str(include_str!("../schemas/issuetype_collection_schema.json")) + .expect("schema parses"); + schema + .pointer(pointer) + .and_then(|v| v.as_object()) + .cloned() + .unwrap_or_else(|| panic!("schema has no properties at {pointer}")) + } + + /// The published schema sets `additionalProperties: false`, so a Rust-side + /// field addition that is not mirrored there silently breaks validation of + /// every hosted manifest. Compare the key sets in both directions. + #[test] + fn test_manifest_fields_match_published_json_schema() { + let serialized = serde_json::to_value(fully_populated()).unwrap(); + let rust_keys: Vec<&str> = serialized + .as_object() + .unwrap() + .keys() + .map(|k| &**k) + .collect(); + let schema_props = schema_properties("/properties"); + + for key in &rust_keys { + assert!( + schema_props.contains_key(*key), + "CollectionManifest field '{key}' is missing from \ + src/schemas/issuetype_collection_schema.json" + ); + } + for key in schema_props.keys() { + assert!( + rust_keys.contains(&&**key), + "schema property '{key}' has no CollectionManifest field" + ); + } + } + + #[test] + fn test_issue_type_entry_fields_match_published_json_schema() { + let entry = IssueTypeEntry { + key: "TASK".to_string(), + schema_path: "TASK.json".to_string(), + schema_checksum: "aaa".to_string(), + template_path: Some("TASK.md".to_string()), + template_checksum: Some("bbb".to_string()), + }; + let serialized = serde_json::to_value(&entry).unwrap(); + let rust_keys: Vec<&str> = serialized + .as_object() + .unwrap() + .keys() + .map(|k| &**k) + .collect(); + let schema_props = schema_properties("/properties/issue_types/items/properties"); + + for key in &rust_keys { + assert!( + schema_props.contains_key(*key), + "IssueTypeEntry field '{key}' is missing from the published schema" + ); + } + for key in schema_props.keys() { + assert!( + rust_keys.contains(&&**key), + "schema property '{key}' has no IssueTypeEntry field" + ); + } + } + + #[test] + fn test_kanban_defaults_default_to_none() { + let m = CollectionManifest::from_json(DEV_KANBAN_JSON).unwrap(); + assert!(m.kanban_defaults.is_none()); + } + + #[test] + fn test_kanban_defaults_round_trip() { + let json = r#"{ + "schema_version": 1, + "id": "dev_kanban", + "name": "Dev Kanban", + "issue_types": [ + {"key": "TASK", "schema_path": "TASK.json"} + ], + "kanban_defaults": { + "suggested_type_mappings": {"Story": "FEAT", "Bug": "FIX"} + } + }"#; + let m = CollectionManifest::from_json(json).unwrap(); + let defaults = m.kanban_defaults.as_ref().expect("kanban_defaults"); + assert_eq!( + defaults.suggested_type_mappings.get("Story"), + Some(&"FEAT".to_string()) + ); + let m2 = CollectionManifest::from_json(&m.to_json().unwrap()).unwrap(); + assert_eq!(m2.kanban_defaults.unwrap().suggested_type_mappings.len(), 2); + } } diff --git a/src/collections/mod.rs b/src/collections/mod.rs index 65ecceaf..21ae2548 100644 --- a/src/collections/mod.rs +++ b/src/collections/mod.rs @@ -6,6 +6,11 @@ pub mod fetch; pub mod manifest; +// Community-collection validation: consumed by the community_collections +// integration test today and the docs generator in an upcoming change; +// nothing in the bin calls it, so its items read as dead there. +#[allow(dead_code)] +pub mod validate; /// A single embedded issuetype with JSON schema and markdown template #[derive(Debug, Clone)] @@ -15,11 +20,14 @@ pub struct EmbeddedIssueType { pub template_md: &'static str, } -/// An embedded collection with manifest and issuetypes +/// An embedded collection with manifest, icon, and issuetypes #[derive(Debug, Clone)] pub struct EmbeddedCollection { pub name: &'static str, pub manifest: &'static str, + /// Simple Icons-shaped SVG identifying the collection, matching the + /// manifest's `icon_path`. Shape is enforced by `tests/collection_icons.rs`. + pub icon_svg: &'static str, pub issuetypes: &'static [EmbeddedIssueType], } @@ -36,6 +44,7 @@ pub static EMBEDDED_COLLECTIONS: &[EmbeddedCollection] = &[ EmbeddedCollection { name: "simple", manifest: include_str!("simple/collection.json"), + icon_svg: include_str!("simple/icon.svg"), issuetypes: &[EmbeddedIssueType { key: "TASK", schema_json: include_str!("simple/TASK.json"), @@ -46,6 +55,7 @@ pub static EMBEDDED_COLLECTIONS: &[EmbeddedCollection] = &[ EmbeddedCollection { name: "dev_kanban", manifest: include_str!("dev_kanban/collection.json"), + icon_svg: include_str!("dev_kanban/icon.svg"), issuetypes: &[ EmbeddedIssueType { key: "TASK", @@ -68,6 +78,7 @@ pub static EMBEDDED_COLLECTIONS: &[EmbeddedCollection] = &[ EmbeddedCollection { name: "devops_kanban", manifest: include_str!("devops_kanban/collection.json"), + icon_svg: include_str!("devops_kanban/icon.svg"), issuetypes: &[ EmbeddedIssueType { key: "TASK", @@ -96,10 +107,11 @@ pub static EMBEDDED_COLLECTIONS: &[EmbeddedCollection] = &[ }, ], }, - // Operator collection: ASSESS, SYNC, INIT, AGENT-SETUP, PROJECT-INIT + // Operator collection: ASSESS, SYNC, INIT, AGENT_SETUP, PROJECT_INIT EmbeddedCollection { name: "operator", manifest: include_str!("operator/collection.json"), + icon_svg: include_str!("operator/icon.svg"), issuetypes: &[ EmbeddedIssueType { key: "ASSESS", @@ -117,68 +129,25 @@ pub static EMBEDDED_COLLECTIONS: &[EmbeddedCollection] = &[ template_md: include_str!("operator/INIT.md"), }, EmbeddedIssueType { - key: "AGENT-SETUP", - schema_json: include_str!("operator/AGENT-SETUP.json"), - template_md: include_str!("operator/AGENT-SETUP.md"), - }, - EmbeddedIssueType { - key: "PROJECT-INIT", - schema_json: include_str!("operator/PROJECT-INIT.json"), - template_md: include_str!("operator/PROJECT-INIT.md"), - }, - ], - }, - // Full collection: All 8 issuetypes - EmbeddedCollection { - name: "full", - manifest: include_str!("full/collection.json"), - issuetypes: &[ - EmbeddedIssueType { - key: "TASK", - schema_json: include_str!("full/TASK.json"), - template_md: include_str!("full/TASK.md"), - }, - EmbeddedIssueType { - key: "FEAT", - schema_json: include_str!("full/FEAT.json"), - template_md: include_str!("full/FEAT.md"), - }, - EmbeddedIssueType { - key: "FIX", - schema_json: include_str!("full/FIX.json"), - template_md: include_str!("full/FIX.md"), - }, - EmbeddedIssueType { - key: "SPIKE", - schema_json: include_str!("full/SPIKE.json"), - template_md: include_str!("full/SPIKE.md"), - }, - EmbeddedIssueType { - key: "INV", - schema_json: include_str!("full/INV.json"), - template_md: include_str!("full/INV.md"), - }, - EmbeddedIssueType { - key: "ASSESS", - schema_json: include_str!("full/ASSESS.json"), - template_md: include_str!("full/ASSESS.md"), - }, - EmbeddedIssueType { - key: "SYNC", - schema_json: include_str!("full/SYNC.json"), - template_md: include_str!("full/SYNC.md"), + key: "AGENT_SETUP", + schema_json: include_str!("operator/AGENT_SETUP.json"), + template_md: include_str!("operator/AGENT_SETUP.md"), }, EmbeddedIssueType { - key: "INIT", - schema_json: include_str!("full/INIT.json"), - template_md: include_str!("full/INIT.md"), + key: "PROJECT_INIT", + schema_json: include_str!("operator/PROJECT_INIT.json"), + template_md: include_str!("operator/PROJECT_INIT.md"), }, ], }, + // NOTE: `full` is deliberately not embedded as a collection. Its files + // (src/collections/full/) remain the source for the builtin + // TemplateType glyph/color maps in src/templates/mod.rs. // Ralph Loop collection: PRD, STORY, RLOOP EmbeddedCollection { name: "ralph_loop", manifest: include_str!("ralph_loop/collection.json"), + icon_svg: include_str!("ralph_loop/icon.svg"), issuetypes: &[ EmbeddedIssueType { key: "PRD", @@ -201,6 +170,7 @@ pub static EMBEDDED_COLLECTIONS: &[EmbeddedCollection] = &[ EmbeddedCollection { name: "jr_orchestration", manifest: include_str!("jr_orchestration/collection.json"), + icon_svg: include_str!("jr_orchestration/icon.svg"), issuetypes: &[ EmbeddedIssueType { key: "JRPLAN", @@ -233,6 +203,7 @@ pub static EMBEDDED_COLLECTIONS: &[EmbeddedCollection] = &[ EmbeddedCollection { name: "elves_overnight", manifest: include_str!("elves_overnight/collection.json"), + icon_svg: include_str!("elves_overnight/icon.svg"), issuetypes: &[ EmbeddedIssueType { key: "ELVSTAGE", @@ -256,6 +227,29 @@ pub static EMBEDDED_COLLECTIONS: &[EmbeddedCollection] = &[ }, ], }, + // Coder collection: Linear-synced FEATURE, IMPROVEMENT, BUG + EmbeddedCollection { + name: "coder", + manifest: include_str!("coder/collection.json"), + icon_svg: include_str!("coder/icon.svg"), + issuetypes: &[ + EmbeddedIssueType { + key: "FEATURE", + schema_json: include_str!("coder/FEATURE.json"), + template_md: include_str!("coder/FEATURE.md"), + }, + EmbeddedIssueType { + key: "IMPROVEMENT", + schema_json: include_str!("coder/IMPROVEMENT.json"), + template_md: include_str!("coder/IMPROVEMENT.md"), + }, + EmbeddedIssueType { + key: "BUG", + schema_json: include_str!("coder/BUG.json"), + template_md: include_str!("coder/BUG.md"), + }, + ], + }, ]; /// Embedded schema files for issue types that need structured output @@ -312,6 +306,53 @@ mod tests { assert_eq!(EMBEDDED_COLLECTIONS.len(), 8); } + #[test] + fn test_full_collection_not_embedded() { + // `full` was demoted: its files remain as the static glyph/color-map + // source (src/templates/mod.rs) but it is not offered as a collection. + assert!(get_embedded_collection("full").is_none()); + } + + #[test] + fn test_embedded_tiers_match_provenance() { + use manifest::CollectionTier; + for collection in EMBEDDED_COLLECTIONS { + let m = collection.manifest_parsed().unwrap(); + let expected = match collection.name { + "ralph_loop" | "jr_orchestration" | "elves_overnight" | "coder" => { + CollectionTier::Community + } + _ => CollectionTier::Official, + }; + assert_eq!(m.tier, expected, "tier mismatch for {}", collection.name); + } + } + + #[test] + fn test_embedded_community_collections_have_attribution() { + use manifest::CollectionTier; + for collection in EMBEDDED_COLLECTIONS { + let m = collection.manifest_parsed().unwrap(); + if m.tier == CollectionTier::Community { + assert!(m.author.is_some(), "{} needs an author", collection.name); + assert!(m.url.is_some(), "{} needs a url", collection.name); + assert!(m.license.is_some(), "{} needs a license", collection.name); + } + } + } + + #[test] + fn test_all_embedded_collections_have_workflow_hints() { + for collection in EMBEDDED_COLLECTIONS { + let m = collection.manifest_parsed().unwrap(); + assert!( + m.workflow_hints.is_some(), + "{} needs workflow_hints so the docs hints table renders", + collection.name + ); + } + } + #[test] fn test_get_embedded_collection() { let simple = get_embedded_collection("simple").unwrap(); @@ -330,10 +371,6 @@ mod tests { assert_eq!(operator.name, "operator"); assert_eq!(operator.issuetypes.len(), 5); - let full = get_embedded_collection("full").unwrap(); - assert_eq!(full.name, "full"); - assert_eq!(full.issuetypes.len(), 8); - let ralph = get_embedded_collection("ralph_loop").unwrap(); assert_eq!(ralph.name, "ralph_loop"); assert_eq!(ralph.issuetypes.len(), 3); @@ -345,6 +382,10 @@ mod tests { let elves = get_embedded_collection("elves_overnight").unwrap(); assert_eq!(elves.name, "elves_overnight"); assert_eq!(elves.issuetypes.len(), 4); + + let coder = get_embedded_collection("coder").unwrap(); + assert_eq!(coder.name, "coder"); + assert_eq!(coder.issuetypes.len(), 3); } #[test] @@ -359,7 +400,7 @@ mod tests { assert!(names.contains(&"dev_kanban")); assert!(names.contains(&"devops_kanban")); assert!(names.contains(&"operator")); - assert!(names.contains(&"full")); + assert!(!names.contains(&"full")); } #[test] @@ -391,9 +432,12 @@ mod tests { } #[test] - fn test_agentic_loop_collections_have_valid_issuetypes() { - for name in ["ralph_loop", "jr_orchestration", "elves_overnight"] { - let collection = get_embedded_collection(name).unwrap(); + fn test_all_embedded_collections_have_valid_issuetypes() { + // Every embedded issuetype must pass validation, otherwise the disk + // loader silently drops it when the collection is scaffolded to + // .tickets/templates/ and reloaded. + for collection in EMBEDDED_COLLECTIONS { + let name = collection.name; for issue_type in collection.issuetypes { let schema = TemplateSchema::from_json(issue_type.schema_json) .unwrap_or_else(|e| panic!("{name}/{} schema must parse: {e}", issue_type.key)); diff --git a/docs/collections/operator/AGENT-SETUP.json b/src/collections/operator/AGENT_SETUP.json similarity index 97% rename from docs/collections/operator/AGENT-SETUP.json rename to src/collections/operator/AGENT_SETUP.json index 3826b811..0ff04e9b 100644 --- a/docs/collections/operator/AGENT-SETUP.json +++ b/src/collections/operator/AGENT_SETUP.json @@ -1,6 +1,6 @@ { "$schema": "../../schemas/issuetype_schema.json", - "key": "AGENT-SETUP", + "key": "AGENT_SETUP", "name": "Agent Setup", "description": "Set up Claude agent configuration for a project", "mode": "paired", @@ -32,7 +32,7 @@ "name": "agent_tool", "description": "Target agent tool (claude, aider, etc.)", "type": "enum", - "values": ["claude", "aider", "gemini"], + "options": ["claude", "aider", "gemini"], "required": true, "default": "claude", "display_order": 2 diff --git a/src/collections/operator/AGENT-SETUP.md b/src/collections/operator/AGENT_SETUP.md similarity index 100% rename from src/collections/operator/AGENT-SETUP.md rename to src/collections/operator/AGENT_SETUP.md diff --git a/docs/collections/operator/PROJECT-INIT.json b/src/collections/operator/PROJECT_INIT.json similarity index 98% rename from docs/collections/operator/PROJECT-INIT.json rename to src/collections/operator/PROJECT_INIT.json index 66c72848..b9f5aafb 100644 --- a/docs/collections/operator/PROJECT-INIT.json +++ b/src/collections/operator/PROJECT_INIT.json @@ -1,6 +1,6 @@ { "$schema": "../../schemas/issuetype_schema.json", - "key": "PROJECT-INIT", + "key": "PROJECT_INIT", "name": "Project Initialization", "description": "Initialize project with Operator conventions", "mode": "autonomous", diff --git a/src/collections/operator/PROJECT-INIT.md b/src/collections/operator/PROJECT_INIT.md similarity index 100% rename from src/collections/operator/PROJECT-INIT.md rename to src/collections/operator/PROJECT_INIT.md diff --git a/src/collections/operator/collection.json b/src/collections/operator/collection.json index 50a914d6..01be66e0 100644 --- a/src/collections/operator/collection.json +++ b/src/collections/operator/collection.json @@ -8,13 +8,61 @@ "author": "Operator!", "url": "https://github.com/untra/operator", "license": "MIT", - "tags": ["builtin", "automation"], + "tags": [ + "builtin", + "automation" + ], + "icon_path": "icon.svg", + "created": "2026-01-08", + "updated": "2026-07-01", "issue_types": [ - { "key": "ASSESS", "schema_path": "ASSESS.json", "template_path": "ASSESS.md" }, - { "key": "SYNC", "schema_path": "SYNC.json", "template_path": "SYNC.md" }, - { "key": "INIT", "schema_path": "INIT.json", "template_path": "INIT.md" }, - { "key": "AGENT-SETUP", "schema_path": "AGENT-SETUP.json", "template_path": "AGENT-SETUP.md" }, - { "key": "PROJECT-INIT", "schema_path": "PROJECT-INIT.json", "template_path": "PROJECT-INIT.md" } + { + "key": "ASSESS", + "schema_path": "ASSESS.json", + "template_path": "ASSESS.md" + }, + { + "key": "SYNC", + "schema_path": "SYNC.json", + "template_path": "SYNC.md" + }, + { + "key": "INIT", + "schema_path": "INIT.json", + "template_path": "INIT.md" + }, + { + "key": "AGENT_SETUP", + "schema_path": "AGENT_SETUP.json", + "template_path": "AGENT_SETUP.md" + }, + { + "key": "PROJECT_INIT", + "schema_path": "PROJECT_INIT.json", + "template_path": "PROJECT_INIT.md" + } ], - "default_selected": ["ASSESS", "SYNC", "INIT"] + "workflow_hints": { + "loop_kind": "single_pass", + "memory_surfaces": [ + "ticket", + "catalog-info.yaml", + ".claude/agents/" + ], + "review_gates": [ + "human" + ], + "external_tools": [ + "git" + ], + "stop_conditions": [ + "setup_artifacts_written" + ], + "runner_semantics": "prompt_driven" + }, + "default_selected": [ + "ASSESS", + "SYNC", + "INIT" + ] } diff --git a/src/collections/operator/icon.svg b/src/collections/operator/icon.svg new file mode 100644 index 00000000..7ce0d33f --- /dev/null +++ b/src/collections/operator/icon.svg @@ -0,0 +1 @@ +Operator diff --git a/src/collections/ralph_loop/collection.json b/src/collections/ralph_loop/collection.json index 30b1b49c..65519ea7 100644 --- a/src/collections/ralph_loop/collection.json +++ b/src/collections/ralph_loop/collection.json @@ -8,19 +8,60 @@ "author": "snarktank", "url": "https://github.com/snarktank/ralph", "license": "MIT", - "tags": ["agentic-loop", "prd", "stories", "ralph"], + "tags": [ + "agentic-loop", + "prd", + "stories", + "ralph" + ], + "tier": "community", + "icon_path": "icon.svg", + "created": "2026-06-16", + "updated": "2026-07-01", "issue_types": [ - { "key": "PRD", "schema_path": "PRD.json", "template_path": "PRD.md" }, - { "key": "STORY", "schema_path": "STORY.json", "template_path": "STORY.md" }, - { "key": "RLOOP", "schema_path": "RLOOP.json", "template_path": "RLOOP.md" } + { + "key": "PRD", + "schema_path": "PRD.json", + "template_path": "PRD.md" + }, + { + "key": "STORY", + "schema_path": "STORY.json", + "template_path": "STORY.md" + }, + { + "key": "RLOOP", + "schema_path": "RLOOP.json", + "template_path": "RLOOP.md" + } ], "workflow_hints": { "loop_kind": "fresh_context_story_loop", - "memory_surfaces": [".tickets/workflows/{{ id }}/prd.json", ".tickets/workflows/{{ id }}/progress.txt", "AGENTS.md"], - "review_gates": ["plan_review", "test_suite", "story_completion_check"], - "external_tools": ["git", "project test command"], - "stop_conditions": ["all stories have passes=true", "blocked story documented", "quality gates fail repeatedly", "max_iterations reached (advisory; outer story loop is operator-queue-driven)"], + "memory_surfaces": [ + ".tickets/workflows/{{ id }}/prd.json", + ".tickets/workflows/{{ id }}/progress.txt", + "AGENTS.md" + ], + "review_gates": [ + "plan_review", + "test_suite", + "story_completion_check" + ], + "external_tools": [ + "git", + "project test command" + ], + "stop_conditions": [ + "all stories have passes=true", + "blocked story documented", + "quality gates fail repeatedly", + "max_iterations reached (advisory; outer story loop is operator-queue-driven)" + ], "runner_semantics": "prompt_driven" }, - "default_selected": ["PRD", "STORY", "RLOOP"] + "default_selected": [ + "PRD", + "STORY", + "RLOOP" + ] } diff --git a/src/collections/ralph_loop/icon.svg b/src/collections/ralph_loop/icon.svg new file mode 100644 index 00000000..55e80009 --- /dev/null +++ b/src/collections/ralph_loop/icon.svg @@ -0,0 +1 @@ +Ralph Loop diff --git a/src/collections/simple/collection.json b/src/collections/simple/collection.json index cfdb3ffc..15819539 100644 --- a/src/collections/simple/collection.json +++ b/src/collections/simple/collection.json @@ -8,9 +8,32 @@ "author": "Operator!", "url": "https://github.com/untra/operator", "license": "MIT", - "tags": ["builtin"], + "tags": [ + "builtin" + ], + "icon_path": "icon.svg", + "created": "2026-01-08", + "updated": "2026-07-01", "issue_types": [ - { "key": "TASK", "schema_path": "TASK.json", "template_path": "TASK.md" } + { + "key": "TASK", + "schema_path": "TASK.json", + "template_path": "TASK.md" + } ], - "default_selected": ["TASK"] + "workflow_hints": { + "loop_kind": "single_pass", + "memory_surfaces": [ + "ticket" + ], + "review_gates": [], + "external_tools": [], + "stop_conditions": [ + "task_complete" + ], + "runner_semantics": "prompt_driven" + }, + "default_selected": [ + "TASK" + ] } diff --git a/src/collections/simple/icon.svg b/src/collections/simple/icon.svg new file mode 100644 index 00000000..35bac239 --- /dev/null +++ b/src/collections/simple/icon.svg @@ -0,0 +1 @@ +Simple diff --git a/src/collections/validate.rs b/src/collections/validate.rs new file mode 100644 index 00000000..aa2bde2a --- /dev/null +++ b/src/collections/validate.rs @@ -0,0 +1,456 @@ +//! Validation for shareable collection directories. +//! +//! Community collections (`collections/community//`) are validated at +//! docs-generation time so a broken submission fails a PR's CI, never a +//! user's install. Rules are intentionally stricter than what the loader +//! tolerates for local collections. + +use anyhow::{bail, Context, Result}; +use std::path::Path; +use std::sync::OnceLock; + +use regex::Regex; + +use super::manifest::{CollectionManifest, CollectionTier, SCHEMA_VERSION}; +use crate::issuetypes::loader::load_issuetype_file; + +/// Collection ids: lowercase alphanumeric + underscore, 3-64 chars. +fn id_regex() -> &'static Regex { + static RE: OnceLock = OnceLock::new(); + RE.get_or_init(|| Regex::new(r"^[a-z0-9_]{3,64}$").expect("valid regex")) +} + +/// Issue type keys: uppercase start, then uppercase/digit/underscore, 2-16 chars. +fn key_regex() -> &'static Regex { + static RE: OnceLock = OnceLock::new(); + RE.get_or_init(|| Regex::new(r"^[A-Z][A-Z0-9_]{1,15}$").expect("valid regex")) +} + +/// Publication dates: ISO-8601 calendar dates, `YYYY-MM-DD`. +fn date_regex() -> &'static Regex { + static RE: OnceLock = OnceLock::new(); + RE.get_or_init(|| Regex::new(r"^\d{4}-\d{2}-\d{2}$").expect("valid regex")) +} + +/// Validate a manifest against the shareable-collection rules. +/// +/// `dir_name` is the name of the directory holding `collection.json`; the +/// manifest `id` must match it so hosted paths stay consistent. +pub fn validate_manifest(manifest: &CollectionManifest, dir_name: &str) -> Result<()> { + if !id_regex().is_match(&manifest.id) { + bail!( + "invalid collection id '{}': must match ^[a-z0-9_]{{3,64}}$", + manifest.id + ); + } + if manifest.id != dir_name { + bail!( + "collection id '{}' does not match its directory name '{dir_name}'", + manifest.id + ); + } + if manifest.schema_version != SCHEMA_VERSION { + bail!( + "unsupported schema_version {} (expected {SCHEMA_VERSION})", + manifest.schema_version + ); + } + if manifest.name.trim().is_empty() { + bail!("collection name must not be empty"); + } + if manifest.description.trim().is_empty() { + bail!("collection description must not be empty"); + } + if manifest.issue_types.is_empty() || manifest.issue_types.len() > 32 { + bail!( + "collection must contain between 1 and 32 issue types (found {})", + manifest.issue_types.len() + ); + } + + let mut seen = std::collections::HashSet::new(); + for entry in &manifest.issue_types { + if !key_regex().is_match(&entry.key) { + bail!( + "invalid issue type key '{}': must match ^[A-Z][A-Z0-9_]{{1,15}}$", + entry.key + ); + } + if !seen.insert(entry.key.as_str()) { + bail!("duplicate issue type key '{}'", entry.key); + } + validate_path(&entry.schema_path)?; + if let Some(template) = &entry.template_path { + validate_path(template)?; + } + } + + if let Some(icon) = &manifest.icon_path { + validate_path(icon)?; + // Extensions are matched exactly: hosted paths are served verbatim, so + // `icon.SVG` would 404 against the manifest's own reference. + if std::path::Path::new(icon) + .extension() + .is_none_or(|e| e != "svg") + { + bail!("icon_path '{icon}' must be an .svg file"); + } + } + for (value, field) in [ + (&manifest.created, "created"), + (&manifest.updated, "updated"), + ] { + if let Some(date) = value { + if !date_regex().is_match(date) { + bail!("invalid {field} date '{date}': must be YYYY-MM-DD"); + } + } + } + + if manifest.tier == CollectionTier::Community { + for (value, field) in [ + (&manifest.license, "license"), + (&manifest.author, "author"), + (&manifest.url, "url"), + // Every hosted card needs an icon; community submissions are + // hosted-only, so this is where the requirement bites. + (&manifest.icon_path, "icon_path"), + ] { + if value.as_deref().is_none_or(|v| v.trim().is_empty()) { + bail!("community collections require a {field}"); + } + } + } + + Ok(()) +} + +/// File references must be bare filenames next to the manifest — no +/// separators or traversal, matching the flat hosted/embedded layout. +fn validate_path(path: &str) -> Result<()> { + if path.is_empty() + || path.contains('/') + || path.contains('\\') + || path.contains("..") + || path.starts_with('.') + { + bail!("unsafe path '{path}': must be a bare relative filename"); + } + Ok(()) +} + +/// Parse and validate a collection directory: manifest rules, referenced +/// files exist, and every issuetype schema parses and validates. +pub fn validate_collection_dir(dir: &Path) -> Result { + let dir_name = dir + .file_name() + .and_then(|n| n.to_str()) + .with_context(|| format!("invalid collection directory: {}", dir.display()))?; + + let manifest_path = dir.join("collection.json"); + let manifest_json = std::fs::read_to_string(&manifest_path) + .with_context(|| format!("missing collection.json in {}", dir.display()))?; + let manifest = CollectionManifest::from_json(&manifest_json) + .with_context(|| format!("invalid collection.json in {}", dir.display()))?; + + validate_manifest(&manifest, dir_name)?; + + for entry in &manifest.issue_types { + let schema_path = dir.join(&entry.schema_path); + if !schema_path.is_file() { + bail!("missing schema file '{}'", entry.schema_path); + } + let issue_type = load_issuetype_file(&schema_path) + .with_context(|| format!("invalid issuetype schema '{}'", entry.schema_path))?; + if issue_type.key != entry.key { + bail!( + "schema key '{}' does not match manifest key '{}'", + issue_type.key, + entry.key + ); + } + if let Some(template) = &entry.template_path { + if !dir.join(template).is_file() { + bail!("missing template file '{template}'"); + } + } + } + + Ok(manifest) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fs; + use tempfile::TempDir; + + const VALID_TASK_JSON: &str = r#"{ + "key": "TASK", + "name": "Task", + "description": "A focused task", + "mode": "autonomous", + "glyph": ">", + "fields": [], + "steps": [{"name": "execute", "outputs": ["report"], "prompt": "Do the task."}] + }"#; + + fn manifest_json(id: &str) -> String { + format!( + r#"{{ + "schema_version": 1, + "id": "{id}", + "name": "Example", + "description": "An example collection", + "tier": "community", + "author": "someone", + "url": "https://example.com/repo", + "license": "MIT", + "icon_path": "icon.svg", + "created": "2026-01-15", + "updated": "2026-08-01", + "issue_types": [ + {{"key": "TASK", "schema_path": "TASK.json", "template_path": "TASK.md"}} + ] + }}"# + ) + } + + fn write_collection(dir: &Path, id: &str) { + let cdir = dir.join(id); + fs::create_dir_all(&cdir).unwrap(); + fs::write(cdir.join("collection.json"), manifest_json(id)).unwrap(); + fs::write(cdir.join("TASK.json"), VALID_TASK_JSON).unwrap(); + fs::write(cdir.join("TASK.md"), "# Task: {{ summary }}\n").unwrap(); + } + + fn parse(json: &str) -> CollectionManifest { + CollectionManifest::from_json(json).unwrap() + } + + #[test] + fn test_valid_community_collection_dir_passes() { + let tmp = TempDir::new().unwrap(); + write_collection(tmp.path(), "example_loop"); + let manifest = validate_collection_dir(&tmp.path().join("example_loop")).unwrap(); + assert_eq!(manifest.id, "example_loop"); + assert_eq!(manifest.tier, CollectionTier::Community); + } + + #[test] + fn test_id_must_match_directory() { + let m = parse(&manifest_json("example_loop")); + let err = validate_manifest(&m, "other_dir").unwrap_err(); + assert!(err.to_string().contains("does not match its directory")); + } + + #[test] + fn test_invalid_id_rejected() { + for bad in ["ab", "Has-Hyphen", "UPPER", "a b"] { + let mut m = parse(&manifest_json("example_loop")); + m.id = bad.to_string(); + let err = validate_manifest(&m, bad).unwrap_err(); + assert!( + err.to_string().contains("invalid collection id"), + "id '{bad}' should be rejected, got: {err}" + ); + } + } + + #[test] + fn test_unsupported_schema_version_rejected() { + let mut m = parse(&manifest_json("example_loop")); + m.schema_version = 99; + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!(err.to_string().contains("unsupported schema_version")); + } + + #[test] + fn test_empty_name_and_description_rejected() { + let mut m = parse(&manifest_json("example_loop")); + m.name = " ".to_string(); + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!(err.to_string().contains("name must not be empty")); + + let mut m = parse(&manifest_json("example_loop")); + m.description = String::new(); + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!(err.to_string().contains("description must not be empty")); + } + + #[test] + fn test_issue_type_count_bounds() { + let mut m = parse(&manifest_json("example_loop")); + m.issue_types.clear(); + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!(err.to_string().contains("between 1 and 32")); + + let mut m = parse(&manifest_json("example_loop")); + let entry = m.issue_types[0].clone(); + m.issue_types = (0..33) + .map(|i| { + let mut e = entry.clone(); + e.key = format!("K{i}"); + e + }) + .collect(); + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!(err.to_string().contains("between 1 and 32")); + } + + #[test] + fn test_invalid_and_duplicate_keys_rejected() { + let mut m = parse(&manifest_json("example_loop")); + m.issue_types[0].key = "bad-key".to_string(); + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!(err.to_string().contains("invalid issue type key")); + + let mut m = parse(&manifest_json("example_loop")); + let dup = m.issue_types[0].clone(); + m.issue_types.push(dup); + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!(err.to_string().contains("duplicate issue type key")); + } + + #[test] + fn test_unsafe_paths_rejected() { + for bad in ["../TASK.json", "/etc/passwd", "sub/TASK.json", ".hidden"] { + let mut m = parse(&manifest_json("example_loop")); + m.issue_types[0].schema_path = bad.to_string(); + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!( + err.to_string().contains("unsafe path"), + "path '{bad}' should be rejected, got: {err}" + ); + } + } + + #[test] + fn test_community_requires_license_author_url_and_icon() { + for field in ["license", "author", "url", "icon_path"] { + let mut m = parse(&manifest_json("example_loop")); + match field { + "license" => m.license = None, + "author" => m.author = Some(" ".to_string()), + "icon_path" => m.icon_path = None, + _ => m.url = None, + } + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!( + err.to_string() + .contains(&format!("community collections require a {field}")), + "missing {field} should be rejected, got: {err}" + ); + } + } + + #[test] + fn test_official_tier_does_not_require_attribution() { + let mut m = parse(&manifest_json("example_loop")); + m.tier = CollectionTier::Official; + m.license = None; + m.author = None; + m.url = None; + m.icon_path = None; + assert!(validate_manifest(&m, "example_loop").is_ok()); + } + + #[test] + fn test_unsafe_icon_path_rejected() { + for bad in ["../icon.svg", "/etc/icon.svg", "sub/icon.svg", ".icon.svg"] { + let mut m = parse(&manifest_json("example_loop")); + m.icon_path = Some(bad.to_string()); + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!( + err.to_string().contains("unsafe path"), + "icon path '{bad}' should be rejected, got: {err}" + ); + } + } + + #[test] + fn test_non_svg_icon_path_rejected() { + let mut m = parse(&manifest_json("example_loop")); + m.icon_path = Some("icon.png".to_string()); + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!(err.to_string().contains("must be an .svg file")); + } + + #[test] + fn test_malformed_dates_rejected() { + for (field, bad) in [("created", "2026-1-5"), ("updated", "01/15/2026")] { + let mut m = parse(&manifest_json("example_loop")); + match field { + "created" => m.created = Some(bad.to_string()), + _ => m.updated = Some(bad.to_string()), + } + let err = validate_manifest(&m, "example_loop").unwrap_err(); + assert!( + err.to_string() + .contains(&format!("invalid {field} date '{bad}'")), + "date '{bad}' should be rejected, got: {err}" + ); + } + } + + #[test] + fn test_dates_are_optional() { + let mut m = parse(&manifest_json("example_loop")); + m.created = None; + m.updated = None; + assert!(validate_manifest(&m, "example_loop").is_ok()); + } + + #[test] + fn test_dir_missing_manifest_rejected() { + let tmp = TempDir::new().unwrap(); + fs::create_dir_all(tmp.path().join("example_loop")).unwrap(); + let err = validate_collection_dir(&tmp.path().join("example_loop")).unwrap_err(); + assert!(err.to_string().contains("missing collection.json")); + } + + #[test] + fn test_dir_missing_schema_file_rejected() { + let tmp = TempDir::new().unwrap(); + write_collection(tmp.path(), "example_loop"); + fs::remove_file(tmp.path().join("example_loop/TASK.json")).unwrap(); + let err = validate_collection_dir(&tmp.path().join("example_loop")).unwrap_err(); + assert!(err.to_string().contains("missing schema file")); + } + + #[test] + fn test_dir_broken_schema_rejected() { + let tmp = TempDir::new().unwrap(); + write_collection(tmp.path(), "example_loop"); + // Steps are required: an issuetype without steps must fail validation. + fs::write( + tmp.path().join("example_loop/TASK.json"), + r#"{"key": "TASK", "name": "Task", "description": "d", "mode": "autonomous", "glyph": ">", "fields": [], "steps": []}"#, + ) + .unwrap(); + let err = validate_collection_dir(&tmp.path().join("example_loop")).unwrap_err(); + assert!(err.to_string().contains("invalid issuetype schema")); + } + + #[test] + fn test_dir_key_mismatch_rejected() { + let tmp = TempDir::new().unwrap(); + write_collection(tmp.path(), "example_loop"); + fs::write( + tmp.path().join("example_loop/TASK.json"), + VALID_TASK_JSON.replace("\"TASK\"", "\"OTHER\""), + ) + .unwrap(); + let err = validate_collection_dir(&tmp.path().join("example_loop")).unwrap_err(); + assert!(err.to_string().contains("does not match manifest key")); + } + + #[test] + fn test_dir_missing_template_rejected() { + let tmp = TempDir::new().unwrap(); + write_collection(tmp.path(), "example_loop"); + fs::remove_file(tmp.path().join("example_loop/TASK.md")).unwrap(); + let err = validate_collection_dir(&tmp.path().join("example_loop")).unwrap_err(); + assert!(err.to_string().contains("missing template file")); + } +} diff --git a/src/config/config_tests.rs b/src/config/config_tests.rs index f60d5551..fc28ae98 100644 --- a/src/config/config_tests.rs +++ b/src/config/config_tests.rs @@ -319,6 +319,7 @@ fn test_upsert_jira_project_inserts_new_workspace() { "OPERATOR_JIRA_API_KEY", "PROJ", "acct-123", + KanbanStatusMapping::default(), ); let ws = kanban @@ -343,6 +344,7 @@ fn test_upsert_jira_project_adds_to_existing_workspace_without_clobber() { "OPERATOR_JIRA_API_KEY", "EXISTING", "acct-existing", + KanbanStatusMapping::default(), ); // Add a second project to the same workspace @@ -352,6 +354,7 @@ fn test_upsert_jira_project_adds_to_existing_workspace_without_clobber() { "OPERATOR_JIRA_API_KEY", "NEWONE", "acct-new", + KanbanStatusMapping::default(), ); let ws = kanban.jira.get("acme.atlassian.net").unwrap(); @@ -369,6 +372,7 @@ fn test_upsert_jira_project_replaces_existing_project_entry() { "OPERATOR_JIRA_API_KEY", "PROJ", "acct-old", + KanbanStatusMapping::default(), ); // Upsert same project with new sync_user_id kanban.upsert_jira_project( @@ -377,6 +381,7 @@ fn test_upsert_jira_project_replaces_existing_project_entry() { "OPERATOR_JIRA_API_KEY", "PROJ", "acct-new", + KanbanStatusMapping::default(), ); let ws = kanban.jira.get("acme.atlassian.net").unwrap(); @@ -392,6 +397,7 @@ fn test_upsert_linear_project_inserts_new_workspace() { "OPERATOR_LINEAR_API_KEY", "ENG", "user-uuid-1", + KanbanStatusMapping::default(), ); let ws = kanban.linear.get("myworkspace").unwrap(); @@ -403,8 +409,20 @@ fn test_upsert_linear_project_inserts_new_workspace() { #[test] fn test_upsert_linear_project_adds_to_existing_workspace_without_clobber() { let mut kanban = KanbanConfig::default(); - kanban.upsert_linear_project("myworkspace", "OPERATOR_LINEAR_API_KEY", "ENG", "user-a"); - kanban.upsert_linear_project("myworkspace", "OPERATOR_LINEAR_API_KEY", "DESIGN", "user-b"); + kanban.upsert_linear_project( + "myworkspace", + "OPERATOR_LINEAR_API_KEY", + "ENG", + "user-a", + KanbanStatusMapping::default(), + ); + kanban.upsert_linear_project( + "myworkspace", + "OPERATOR_LINEAR_API_KEY", + "DESIGN", + "user-b", + KanbanStatusMapping::default(), + ); let ws = kanban.linear.get("myworkspace").unwrap(); assert_eq!(ws.projects.len(), 2); @@ -421,6 +439,7 @@ fn test_upsert_jira_does_not_touch_other_workspaces() { "OPERATOR_JIRA_API_KEY", "FIRST", "acct-1", + KanbanStatusMapping::default(), ); kanban.upsert_jira_project( "second.atlassian.net", @@ -428,6 +447,7 @@ fn test_upsert_jira_does_not_touch_other_workspaces() { "OPERATOR_JIRA_SECOND_API_KEY", "SECOND", "acct-2", + KanbanStatusMapping::default(), ); assert_eq!(kanban.jira.len(), 2); @@ -552,6 +572,106 @@ fn test_upsert_project_github() { assert_eq!(proj.sync_user_id, "12345678"); } +#[test] +fn test_status_mapping_defaults_all_none_from_legacy_toml() { + // Legacy configs carry a `sync_statuses` list; serde must ignore the + // unknown key and leave the new mapping empty. + let toml_str = r#" + sync_user_id = "acct-1" + sync_statuses = ["To Do", "In Progress", "Done"] + "#; + let cfg: ProjectSyncConfig = toml::from_str(toml_str).unwrap(); + assert!(cfg.status_mapping.is_empty()); + assert_eq!(cfg.sync_user_id, "acct-1"); +} + +#[test] +fn test_status_mapping_is_empty_and_mapped_count() { + let mut mapping = KanbanStatusMapping::default(); + assert!(mapping.is_empty()); + assert_eq!(mapping.mapped_count(), 0); + + mapping.doing = Some("In Progress".to_string()); + assert!(!mapping.is_empty()); + assert_eq!(mapping.mapped_count(), 1); + + mapping.todo = Some("To Do".to_string()); + mapping.done = Some("Done".to_string()); + assert_eq!(mapping.mapped_count(), 3); +} + +#[test] +fn test_project_sync_config_omits_empty_status_mapping_on_serialize() { + let cfg = ProjectSyncConfig { + sync_user_id: "acct-1".to_string(), + ..Default::default() + }; + let toml_str = toml::to_string(&cfg).unwrap(); + assert!(!toml_str.contains("status_mapping")); +} + +#[test] +fn test_project_sync_config_status_mapping_roundtrip() { + let cfg = ProjectSyncConfig { + sync_user_id: "acct-1".to_string(), + status_mapping: KanbanStatusMapping { + todo: Some("Backlog".to_string()), + doing: Some("In Progress".to_string()), + done: Some("Shipped".to_string()), + }, + ..Default::default() + }; + let toml_str = toml::to_string(&cfg).unwrap(); + let parsed: ProjectSyncConfig = toml::from_str(&toml_str).unwrap(); + assert_eq!(parsed.status_mapping, cfg.status_mapping); +} + +#[test] +fn test_pull_statuses_returns_todo_and_doing_some_values() { + let cfg = ProjectSyncConfig { + status_mapping: KanbanStatusMapping { + todo: Some("Backlog".to_string()), + doing: Some("In Progress".to_string()), + done: Some("Shipped".to_string()), + }, + ..Default::default() + }; + assert_eq!(cfg.pull_statuses(), vec!["Backlog", "In Progress"]); + + let partial = ProjectSyncConfig { + status_mapping: KanbanStatusMapping { + todo: Some("Backlog".to_string()), + ..Default::default() + }, + ..Default::default() + }; + assert_eq!(partial.pull_statuses(), vec!["Backlog"]); + + assert!(ProjectSyncConfig::default().pull_statuses().is_empty()); +} + +#[test] +fn test_upsert_jira_project_persists_status_mapping() { + let mut kanban = KanbanConfig::default(); + kanban.upsert_jira_project( + "acme.atlassian.net", + "user@acme.com", + "OPERATOR_JIRA_API_KEY", + "PROJ", + "acct-123", + KanbanStatusMapping { + todo: Some("To Do".to_string()), + doing: Some("In Progress".to_string()), + done: Some("Done".to_string()), + }, + ); + + let project = &kanban.jira["acme.atlassian.net"].projects["PROJ"]; + assert_eq!(project.status_mapping.todo.as_deref(), Some("To Do")); + assert_eq!(project.status_mapping.doing.as_deref(), Some("In Progress")); + assert_eq!(project.status_mapping.done.as_deref(), Some("Done")); +} + #[test] fn test_relay_config_default_auto_inject_is_false() { let config = Config::default(); diff --git a/src/config/kanban.rs b/src/config/kanban.rs index d35b4a0f..b4226495 100644 --- a/src/config/kanban.rs +++ b/src/config/kanban.rs @@ -152,6 +152,7 @@ impl KanbanConfig { api_key_env: &str, project_key: &str, sync_user_id: &str, + status_mapping: KanbanStatusMapping, ) { let entry = self.jira.entry(domain.to_string()).or_default(); entry.enabled = true; @@ -161,7 +162,7 @@ impl KanbanConfig { project_key.to_string(), ProjectSyncConfig { sync_user_id: sync_user_id.to_string(), - sync_statuses: Vec::new(), + status_mapping, collection_name: None, type_mappings: std::collections::HashMap::new(), bidirectional: false, @@ -181,6 +182,7 @@ impl KanbanConfig { api_key_env: &str, project_key: &str, sync_user_id: &str, + status_mapping: KanbanStatusMapping, ) { let entry = self.linear.entry(workspace.to_string()).or_default(); entry.enabled = true; @@ -189,7 +191,7 @@ impl KanbanConfig { project_key.to_string(), ProjectSyncConfig { sync_user_id: sync_user_id.to_string(), - sync_statuses: Vec::new(), + status_mapping, collection_name: None, type_mappings: std::collections::HashMap::new(), bidirectional: false, @@ -212,6 +214,7 @@ impl KanbanConfig { api_key_env: &str, project_key: &str, sync_user_id: &str, + status_mapping: KanbanStatusMapping, ) { let entry = self.github.entry(owner.to_string()).or_default(); entry.enabled = true; @@ -220,7 +223,7 @@ impl KanbanConfig { project_key.to_string(), ProjectSyncConfig { sync_user_id: sync_user_id.to_string(), - sync_statuses: Vec::new(), + status_mapping, collection_name: None, type_mappings: std::collections::HashMap::new(), bidirectional: false, @@ -246,23 +249,65 @@ impl KanbanConfig { &workspace.api_key_env, &project.project_key, &workspace.sync_user_id, + KanbanStatusMapping::default(), ), WorkspaceExtra::Linear => self.upsert_linear_project( &workspace.workspace_key, &workspace.api_key_env, &project.project_key, &workspace.sync_user_id, + KanbanStatusMapping::default(), ), WorkspaceExtra::Github => self.upsert_github_project( &workspace.workspace_key, &workspace.api_key_env, &project.project_key, &workspace.sync_user_id, + KanbanStatusMapping::default(), ), } } } +/// Explicit mapping from operator's strict todo/doing/done states to the +/// external board's column/status names. +/// +/// Drives bidirectional sync: issues are pulled from the `todo` column, +/// pushed to `doing` when a ticket is claimed, to `done` when completed, and +/// back to `todo` when requeued. Unset fields fall back per-transition +/// (`doing` → "In Progress", `done` → "Done"); requeue only pushes when +/// `todo` is explicitly mapped. +#[derive( + Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema, TS, utoipa::ToSchema, +)] +#[ts(export)] +pub struct KanbanStatusMapping { + /// External column for operator "todo" (queued work; also the pull source) + #[serde(default, skip_serializing_if = "Option::is_none")] + pub todo: Option, + /// External column for operator "doing" (claimed/launched tickets) + #[serde(default, skip_serializing_if = "Option::is_none")] + pub doing: Option, + /// External column for operator "done" (completed tickets) + #[serde(default, skip_serializing_if = "Option::is_none")] + pub done: Option, +} + +impl KanbanStatusMapping { + /// True when no column is mapped (used to omit the table from TOML). + pub fn is_empty(&self) -> bool { + self.todo.is_none() && self.doing.is_none() && self.done.is_none() + } + + /// Number of mapped columns. + pub fn mapped_count(&self) -> usize { + [&self.todo, &self.doing, &self.done] + .iter() + .filter(|s| s.is_some()) + .count() + } +} + /// Per-project/team sync configuration for a kanban provider #[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, TS)] #[ts(export)] @@ -273,9 +318,9 @@ pub struct ProjectSyncConfig { /// - GitHub Projects: numeric GitHub `databaseId` (e.g., "12345678") #[serde(default)] pub sync_user_id: String, - /// Workflow statuses to sync (empty = default/first status only) - #[serde(default)] - pub sync_statuses: Vec, + /// Mapping of operator todo/doing/done to external board columns + #[serde(default, skip_serializing_if = "KanbanStatusMapping::is_empty")] + pub status_mapping: KanbanStatusMapping, /// Optional `IssueTypeCollection` name this project maps to. /// Not required for kanban onboarding or sync. #[serde(default, skip_serializing_if = "Option::is_none")] @@ -290,3 +335,16 @@ pub struct ProjectSyncConfig { #[serde(default)] pub bidirectional: bool, } + +impl ProjectSyncConfig { + /// Statuses to pull from the external board: the mapped `todo` column + /// (queued work) plus `doing` (resume in-flight). Empty when unmapped — + /// providers then fall back to their default status filter. + pub fn pull_statuses(&self) -> Vec { + [&self.status_mapping.todo, &self.status_mapping.doing] + .into_iter() + .flatten() + .cloned() + .collect() + } +} diff --git a/src/docs_gen/collections_manifest.rs b/src/docs_gen/collections_manifest.rs index 6a722aa1..f17ef3af 100644 --- a/src/docs_gen/collections_manifest.rs +++ b/src/docs_gen/collections_manifest.rs @@ -7,24 +7,38 @@ //! ├── index.json (CollectionIndex of all collections) //! └── / //! ├── collection.json (CollectionManifest with checksums) +//! ├── icon.svg (Simple Icons-shaped collection glyph) //! ├── .json (issuetype schema, byte-identical to embedded) //! └── .md (issuetype template) -//! ``` //! -//! The per-issuetype files are written byte-for-byte from the embedded -//! collections, and their SHA-256 checksums are computed and recorded in the -//! manifest. The runtime fetcher verifies these checksums, so the hosted bundle -//! is guaranteed identical to the offline fallback. +//! Two sources feed the bundle: +//! +//! * **Embedded** collections (`src/collections/`) are compiled into the binary +//! and republished here byte-for-byte, so the hosted copy is guaranteed +//! identical to the offline fallback. +//! * **Community** collections (`collections/community/`) are hosted-only. They +//! are validated during generation, so a broken submission fails a PR's CI +//! rather than a user's install. +//! +//! Per-issuetype SHA-256 checksums are computed and recorded in each manifest; +//! the runtime fetcher verifies them before trusting any fetched bytes. Icons +//! are deliberately excluded: they are presentational and never executed, and a +//! malformed one must not be able to fail an install. +//! +//! No workflow previews are emitted. The graph renders from `.json` — the +//! native Operator workflow that is already published and already checksummed — +//! so there is nothing per-workflow to pre-generate. -use std::path::Path; +use std::path::{Path, PathBuf}; -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, Context, Result}; use super::DocGenerator; use crate::collections::fetch::{derive_manifest_checksum, sha256_hex}; use crate::collections::manifest::{ CollectionIndex, CollectionIndexEntry, CollectionManifest, SCHEMA_VERSION, }; +use crate::collections::validate::validate_collection_dir; use crate::collections::{EmbeddedCollection, EMBEDDED_COLLECTIONS}; /// Generates the hosted collection bundle under `docs/collections/`. @@ -33,58 +47,150 @@ pub struct CollectionsManifestGenerator; /// A fully-resolved hosted manifest plus the byte payloads it references. struct HostedCollection { manifest: CollectionManifest, - /// (relative path, bytes) for each issuetype schema/template file. + /// (relative path, bytes) for each issuetype schema/template file, plus the + /// collection icon when the manifest declares one. files: Vec<(String, Vec)>, } -/// Build a hosted manifest for `embedded`: copy metadata from the embedded -/// `collection.json`, fill in per-file checksums from the embedded bytes, and -/// derive the manifest-level checksum. -fn build_hosted(embedded: &EmbeddedCollection) -> Result { +/// Where community submissions live, relative to the repo root. +/// +/// Resolved from the crate directory rather than the process CWD: this is a +/// repo-maintenance generator, and a missing directory is a no-op rather than +/// an error so the bundle still builds outside a checkout. +fn community_dir() -> PathBuf { + Path::new(env!("CARGO_MANIFEST_DIR")).join("collections/community") +} + +/// The docs-site path a collection's page is served from. +fn docs_path_for(id: &str) -> String { + format!("/workflows/{id}/") +} + +/// Fill in per-file checksums and the derived manifest checksum, given a way to +/// resolve each referenced file's bytes. +/// +/// Shared by the embedded and community paths so both produce byte-identical +/// manifest structure and identical checksum derivation. +fn finalize(manifest: &mut CollectionManifest, mut read: F) -> Result)>> +where + F: FnMut(&str) -> Result>, +{ + let mut files = Vec::new(); + + for entry in &mut manifest.issue_types { + let schema_bytes = read(&entry.schema_path)?; + entry.schema_checksum = sha256_hex(&schema_bytes); + files.push((entry.schema_path.clone(), schema_bytes)); + + if let Some(template_path) = entry.template_path.clone() { + let md_bytes = read(&template_path)?; + entry.template_checksum = Some(sha256_hex(&md_bytes)); + files.push((template_path, md_bytes)); + } + } + + // Icon last, and outside the checksum derivation below. + if let Some(icon_path) = manifest.icon_path.clone() { + let icon_bytes = read(&icon_path)?; + files.push((icon_path, icon_bytes)); + } + + manifest.checksum = Some(derive_manifest_checksum(&manifest.issue_types)); + Ok(files) +} + +/// Build a hosted manifest for an embedded collection, resolving files from the +/// bytes compiled into the binary. +fn build_embedded(embedded: &EmbeddedCollection) -> Result { let mut manifest = embedded .manifest_parsed() .map_err(|e| anyhow!("parsing embedded manifest for {}: {e}", embedded.name))?; - let mut files = Vec::new(); + let icon_path = manifest.icon_path.clone(); - for entry in &mut manifest.issue_types { + let files = finalize(&mut manifest, |path| { + if Some(path) == icon_path.as_deref() { + return Ok(embedded.icon_svg.as_bytes().to_vec()); + } + let key = path.rsplit_once('.').map_or(path, |(stem, _)| stem); let it = embedded .issuetypes .iter() - .find(|it| it.key == entry.key) + .find(|it| it.key == key) .ok_or_else(|| { anyhow!( - "collection {} manifest references {} but no embedded file exists", - embedded.name, - entry.key + "collection {} manifest references {path} but no embedded file exists", + embedded.name ) })?; + // Manifest paths are exact filenames, so an exact extension match is + // what we want: `TASK.MD` is a different reference, not the template. + let is_template = std::path::Path::new(path) + .extension() + .is_some_and(|ext| ext == "md"); + Ok(if is_template { + it.template_md.as_bytes().to_vec() + } else { + it.schema_json.as_bytes().to_vec() + }) + })?; - let schema_bytes = it.schema_json.as_bytes().to_vec(); - entry.schema_checksum = sha256_hex(&schema_bytes); - files.push((entry.schema_path.clone(), schema_bytes)); + Ok(HostedCollection { manifest, files }) +} - if let Some(template_path) = entry.template_path.clone() { - let md_bytes = it.template_md.as_bytes().to_vec(); - entry.template_checksum = Some(sha256_hex(&md_bytes)); - files.push((template_path, md_bytes)); - } - } +/// Build a hosted manifest for a community collection, resolving files from +/// disk. The directory is validated first, so an invalid submission fails +/// generation (and therefore CI) rather than shipping. +fn build_community(dir: &Path) -> Result { + let mut manifest = validate_collection_dir(dir) + .with_context(|| format!("invalid community collection at {}", dir.display()))?; + + let files = finalize(&mut manifest, |path| { + std::fs::read(dir.join(path)) + .with_context(|| format!("reading {path} in {}", dir.display())) + })?; - manifest.checksum = Some(derive_manifest_checksum(&manifest.issue_types)); Ok(HostedCollection { manifest, files }) } +/// Every community collection directory, sorted by id so generation is +/// deterministic. A missing `collections/community/` yields an empty list. +fn community_collections() -> Result> { + let base = community_dir(); + let Ok(entries) = std::fs::read_dir(&base) else { + return Ok(Vec::new()); + }; + + let mut dirs: Vec = entries + .flatten() + .map(|e| e.path()) + .filter(|p| p.join("collection.json").is_file()) + .collect(); + dirs.sort(); + + dirs.iter().map(|dir| build_community(dir)).collect() +} + /// Serialize a hosted manifest to its canonical on-disk form (pretty JSON, /// trailing newline). fn manifest_json(manifest: &CollectionManifest) -> Result { Ok(format!("{}\n", manifest.to_json()?)) } -/// Build the top-level index over all embedded collections. +/// Every collection to publish: embedded first (in `EMBEDDED_COLLECTIONS` +/// order), then community (sorted by id). +fn all_hosted() -> Result> { + let mut hosted: Vec = EMBEDDED_COLLECTIONS + .iter() + .map(build_embedded) + .collect::>()?; + hosted.extend(community_collections()?); + Ok(hosted) +} + +/// Build the top-level index over every published collection. fn build_index() -> Result { let mut collections = Vec::new(); - for embedded in EMBEDDED_COLLECTIONS { - let hosted = build_hosted(embedded)?; + for hosted in all_hosted()? { let json = manifest_json(&hosted.manifest)?; collections.push(CollectionIndexEntry { id: hosted.manifest.id.clone(), @@ -94,6 +200,8 @@ fn build_index() -> Result { tags: hosted.manifest.tags.clone(), manifest_path: format!("{}/collection.json", hosted.manifest.id), checksum: sha256_hex(json.as_bytes()), + tier: hosted.manifest.tier, + docs_path: Some(docs_path_for(&hosted.manifest.id)), }); } Ok(CollectionIndex { @@ -110,7 +218,7 @@ impl DocGenerator for CollectionsManifestGenerator { } fn source(&self) -> &'static str { - "src/collections/*/collection.json (EMBEDDED_COLLECTIONS)" + "src/collections/*/collection.json + collections/community/*/collection.json" } fn output_path(&self) -> &'static str { @@ -126,8 +234,7 @@ impl DocGenerator for CollectionsManifestGenerator { let collections_dir = docs_dir.join("collections"); // Per-collection bundles. - for embedded in EMBEDDED_COLLECTIONS { - let hosted = build_hosted(embedded)?; + for hosted in all_hosted()? { let dir = collections_dir.join(&hosted.manifest.id); std::fs::create_dir_all(&dir)?; std::fs::write( @@ -160,6 +267,7 @@ impl DocGenerator for CollectionsManifestGenerator { mod tests { use super::*; use crate::collections::get_embedded_collection; + use crate::collections::manifest::CollectionTier; #[test] fn test_index_lists_all_embedded_collections() { @@ -171,10 +279,60 @@ mod tests { assert_eq!(index.schema_version, SCHEMA_VERSION); } + #[test] + fn test_index_publishes_community_collections() { + let index = build_index().unwrap(); + let community: Vec<&str> = index + .collections + .iter() + .filter(|c| c.tier == CollectionTier::Community && c.id == "example_chores") + .map(|c| c.id.as_str()) + .collect(); + assert_eq!( + community, + vec!["example_chores"], + "collections/community/ must reach the published index" + ); + } + + #[test] + fn test_index_orders_embedded_before_community_and_sorts_community() { + let index = build_index().unwrap(); + let embedded_count = EMBEDDED_COLLECTIONS.len(); + let (embedded, community) = index.collections.split_at(embedded_count); + + let embedded_ids: Vec<&str> = embedded.iter().map(|c| c.id.as_str()).collect(); + assert_eq!( + embedded_ids, + crate::collections::embedded_collection_names(), + "embedded collections must keep EMBEDDED_COLLECTIONS order" + ); + + let community_ids: Vec<&str> = community.iter().map(|c| c.id.as_str()).collect(); + let mut sorted = community_ids.clone(); + sorted.sort_unstable(); + assert_eq!( + community_ids, sorted, + "community entries must be sorted by id" + ); + } + + #[test] + fn test_every_index_entry_links_to_its_docs_page() { + for entry in build_index().unwrap().collections { + assert_eq!( + entry.docs_path.as_deref(), + Some(format!("/workflows/{}/", entry.id).as_str()), + "{} must deep-link to its docs page", + entry.id + ); + } + } + #[test] fn test_hosted_files_are_byte_identical_to_embedded() { let embedded = get_embedded_collection("dev_kanban").unwrap(); - let hosted = build_hosted(embedded).unwrap(); + let hosted = build_embedded(embedded).unwrap(); for entry in &hosted.manifest.issue_types { let it = embedded .issuetypes @@ -193,12 +351,45 @@ mod tests { } } + #[test] + fn test_every_collection_publishes_its_icon() { + for hosted in all_hosted().unwrap() { + let icon_path = hosted + .manifest + .icon_path + .clone() + .unwrap_or_else(|| panic!("{} declares no icon_path", hosted.manifest.id)); + let (_, bytes) = hosted + .files + .iter() + .find(|(p, _)| p == &icon_path) + .unwrap_or_else(|| panic!("{} did not publish {icon_path}", hosted.manifest.id)); + let svg = std::str::from_utf8(bytes).unwrap(); + assert!( + svg.contains(r#"viewBox="0 0 24 24""#), + "{} published a non-Simple-Icons icon", + hosted.manifest.id + ); + } + } + + #[test] + fn test_icons_are_excluded_from_the_manifest_checksum() { + // Icons are presentational and unverified; the derived checksum must + // cover only the issue-type files the fetcher validates. + let embedded = get_embedded_collection("ralph_loop").unwrap(); + let hosted = build_embedded(embedded).unwrap(); + assert_eq!( + hosted.manifest.checksum.as_deref(), + Some(derive_manifest_checksum(&hosted.manifest.issue_types).as_str()) + ); + } + #[test] fn test_manifest_checksum_matches_verifier_derivation() { // The producer's manifest.checksum must equal the value the runtime // verifier derives from the same entries. - for embedded in EMBEDDED_COLLECTIONS { - let hosted = build_hosted(embedded).unwrap(); + for hosted in all_hosted().unwrap() { let derived = derive_manifest_checksum(&hosted.manifest.issue_types); assert_eq!(hosted.manifest.checksum.as_deref(), Some(derived.as_str())); } @@ -215,4 +406,10 @@ mod tests { assert_eq!(entry.checksum.len(), 64); } } + + #[test] + fn test_generation_is_deterministic() { + let generator = CollectionsManifestGenerator; + assert_eq!(generator.generate().unwrap(), generator.generate().unwrap()); + } } diff --git a/src/docs_gen/collections_pages.rs b/src/docs_gen/collections_pages.rs new file mode 100644 index 00000000..0859fdf8 --- /dev/null +++ b/src/docs_gen/collections_pages.rs @@ -0,0 +1,459 @@ +//! Workflow catalog page generator. +//! +//! Emits the browsable face of the hosted collection bundle: +//! +//! ```text +//! docs/workflows/ +//! ├── index.md the catalog: vocabulary, cards, table, contributor CTA +//! └── /index.md one collection: metadata + the split-view explorer +//! ``` +//! +//! Cards and table rows are rendered **here**, at generation time, each carrying +//! a `data-search` haystack. `` then filters the DOM +//! that already exists, so the catalog renders in full with `JavaScript` +//! disabled +//! and the search never depends on a fetch. +//! +//! The graph is the one exception: `` loads the +//! collection's `.json` at runtime and draws it with the same component the +//! SPA uses. Nothing per-workflow is pre-rendered. + +use anyhow::Result; +use std::path::Path; + +use super::{format_header, DocGenerator}; +use crate::docs_gen::collections_search::{build_catalog, CatalogEntry}; + +/// The vocabulary preamble. "Workflow" is overloaded across the ecosystem, so +/// the catalog opens by saying exactly what each term means here. +const VOCABULARY: &str = r" +An **Operator workflow** is a process defined once in JSON: an ordered graph of +typed steps, review gates, and retry edges that an LLM agent can follow. It is +the native format — Operator runs it directly, and every +[export format](/getting-started/workflows/) (Claude, AGNT) is derived from it. + +Three terms, three different things: + +| Term | What it is | +|------|-----------| +| **Operator workflow** | The step graph itself. Lives in an issue type's `steps`. | +| **Issue type** | One kind of work — `FEAT`, `PRD`, `ELVSTAGE`. Carries identity, input fields, and exactly one Operator workflow. | +| **Collection** | A named, versioned bundle of issue types: a complete, shareable way of working. This page lists them. | + +Collections are deliberately separate from your **kanban issue types**. Jira, +Linear, and GitHub Projects types describe how *your* team labels work; a +collection describes how the *agents* do it. Map one onto the other once, and +the workflow travels between projects, teams, and providers unchanged. +"; + +/// The contributor call to action, mirroring `collections/README.md`. +const CONTRIBUTING: &str = r#" +## Contribute a collection + +There is no single best way to run agents — the right loop depends on the work. +That is exactly why these are shareable: a workflow that works for you is worth +publishing, and one that does not fit is worth forking. + +Official collections live in the [operator repository](https://github.com/untra/operator/tree/main/collections): + +1. Create `collections/community//`, where `` matches `^[a-z0-9_]{3,64}$`. +2. Add a `collection.json` conforming to [the collection schema](/collections/schema.json), + with `tier: "community"` plus `author`, `url`, and `license`. +3. Add one `.json` per issue type — see [the issue type schema](/schemas/issuetype/) — + and an optional `.md` ticket template. +4. Add an `icon.svg` following the + [Simple Icons](https://github.com/simple-icons/simple-icons) shape: a 24×24 + viewBox, a single ``, and no `fill` or `stroke` so it inherits the + page's color. +5. Leave checksums out — they are computed at publish time. +6. Run the CI gate locally, then open a pull request: + +```bash +cargo test --test community_collections +``` + +Submissions are reviewed for prompt quality and safety, not just schema +validity. A good collection describes a workflow shape worth sharing: what loop +it runs, what memory it keeps, what gates it enforces, and when it stops. +"#; + +/// Generates `docs/workflows/index.md` and the per-collection pages. +pub struct CollectionsPagesGenerator; + +/// Escape text destined for an HTML attribute or text node. +fn escape(value: &str) -> String { + value + .replace('&', "&") + .replace('<', "<") + .replace('>', ">") + .replace('"', """) +} + +/// `1 issue type` / `3 issue types`. +fn issue_type_count(count: usize) -> String { + if count == 1 { + "1 issue type".to_string() + } else { + format!("{count} issue types") + } +} + +/// The provenance badge shown on a card and in the table. +fn tier_badge(tier: &str) -> String { + let class = if tier == "community" { + "badge alpha" + } else { + "badge recommended" + }; + format!(r#"{tier}"#) +} + +/// The collection's icon, inlined into the page. +/// +/// Inlined rather than linked with an ``: an `` loads the SVG as a +/// separate document where `currentColor` cannot resolve, so a linked icon +/// would stay black and vanish against the dark theme. Inline, it tints from +/// the surrounding text color. Marked `aria-hidden` because the collection name +/// sits right beside it. +/// +/// The markup is the same file published at `/collections//icon.svg`, and +/// `tests/collection_icons.rs` constrains it to a single `` with no +/// scripting, so inlining introduces nothing the bundle does not already serve. +fn icon_svg(entry: &CatalogEntry) -> String { + let Some(svg) = crate::docs_gen::collections_search::icon_svg_for(&entry.id) else { + return String::new(); + }; + svg.trim().replacen( + "{}", escape(&it.key))) + .collect::>() + .join(" "); + + format!( + r#"
+ + {icon} +

{name}

+
+

{description}

+

{types}

+

+ {badge} + {count} + {author} + updated {updated} +

+
+"#, + search = escape(&entry.search_text), + docs_path = escape(&entry.docs_path), + icon = icon_svg(entry), + name = escape(&entry.name), + description = escape(&entry.description), + types = types, + badge = tier_badge(&entry.tier), + count = issue_type_count(entry.issue_type_count), + author = escape(entry.author.as_deref().unwrap_or("Operator!")), + updated = escape(entry.updated.as_deref().unwrap_or("—")), + ) +} + +fn table_row(entry: &CatalogEntry) -> String { + format!( + r#" + {icon}{name} + {description} + {count} + {loop_kind} + {author} + {badge} + {created} + {updated} + +"#, + search = escape(&entry.search_text), + icon = icon_svg(entry), + docs_path = escape(&entry.docs_path), + name = escape(&entry.name), + description = escape(&entry.description), + count = entry.issue_type_count, + loop_kind = escape(entry.loop_kind.as_deref().unwrap_or("—")), + author = escape(entry.author.as_deref().unwrap_or("Operator!")), + badge = tier_badge(&entry.tier), + created = escape(entry.created.as_deref().unwrap_or("—")), + updated = escape(entry.updated.as_deref().unwrap_or("—")), + ) +} + +/// The catalog page: vocabulary, the two statically-rendered views, the CTA. +fn hub_page(entries: &[CatalogEntry]) -> String { + let mut out = format_header("Workflows", "src/collections/ + collections/community/"); + // Drives the sidebar's active state without matching on URL substrings, + // which would also light up /getting-started/workflows/. + out = out.replace("layout: doc\n", "layout: doc\nsection: workflows\n"); + + out.push_str(VOCABULARY); + out.push_str( + "\nEvery collection below is installable from Operator directly — they are \ + published from this site as a [machine-readable index](/collections/index.json) \ + that operator instances read on startup.\n\n", + ); + + out.push_str(&format!( + "\n\n\ +
\n\ +
\n{}
\n", + entries.iter().map(card).collect::() + )); + + out.push_str( + "\n \n \ + \ + \n \n \n", + ); + out.push_str(&entries.iter().map(table_row).collect::()); + out.push_str(" \n
CollectionDescriptionIssue typesLoopAuthorTierCreatedUpdated
\n
\n"); + + out.push_str(CONTRIBUTING); + out +} + +/// A single collection's page: metadata, then the split-view explorer. +fn detail_page(entry: &CatalogEntry) -> String { + let mut out = format_header( + &entry.name, + &format!("the {} collection manifest", entry.id), + ); + out = out.replace("layout: doc\n", "layout: doc\nsection: workflows\n"); + + out.push_str(&format!("{}\n\n", entry.description)); + + out.push_str("| | |\n|---|---|\n"); + out.push_str(&format!("| **Tier** | {} |\n", entry.tier)); + if let Some(author) = &entry.author { + let rendered = entry + .url + .as_ref() + .map_or_else(|| author.clone(), |url| format!("[{author}]({url})")); + out.push_str(&format!("| **Author** | {rendered} |\n")); + } + if let Some(license) = &entry.license { + out.push_str(&format!("| **License** | {license} |\n")); + } + out.push_str(&format!("| **Version** | {} |\n", entry.version)); + if let Some(created) = &entry.created { + out.push_str(&format!("| **Created** | {created} |\n")); + } + if let Some(updated) = &entry.updated { + out.push_str(&format!("| **Updated** | {updated} |\n")); + } + if let Some(loop_kind) = &entry.loop_kind { + out.push_str(&format!("| **Loop shape** | `{loop_kind}` |\n")); + } + if !entry.review_gates.is_empty() { + out.push_str(&format!( + "| **Review gates** | {} |\n", + entry + .review_gates + .iter() + .map(|g| format!("`{g}`")) + .collect::>() + .join(", ") + )); + } + if !entry.stop_conditions.is_empty() { + out.push_str(&format!( + "| **Stops when** | {} |\n", + entry.stop_conditions.join("; ") + )); + } + out.push_str(&format!( + "| **Manifest** | [`collection.json`](/collections/{}) |\n\n", + entry.manifest_path + )); + + out.push_str("## Issue types\n\n| Key | Name | Mode | Steps |\n|---|---|---|---|\n"); + for it in &entry.issue_types { + out.push_str(&format!( + "| `{}` | {} | {} | {} |\n", + it.key, it.name, it.mode, it.step_count + )); + } + + out.push_str( + "\n## Workflows\n\nSelect an issue type to see the Operator workflow it defines. \ + This is the same graph the Operator app draws, rendered from the same \ + published JSON.\n\n", + ); + out.push_str(&format!( + "
\n \ + \n\ +
\n\n", + entry.id + )); + + out.push_str(&format!( + "## Install\n\nOperator reads the hosted catalog on startup, so this collection \ + appears in the setup picker. To pin it explicitly:\n\n\ + ```toml\n# config.toml\n[templates]\nactive_collection = \"{}\"\n```\n", + entry.id + )); + + out +} + +impl DocGenerator for CollectionsPagesGenerator { + fn name(&self) -> &'static str { + "collections-pages" + } + + fn source(&self) -> &'static str { + "src/collections/*/collection.json + collections/community/*/collection.json" + } + + fn output_path(&self) -> &'static str { + "workflows/index.md" + } + + fn generate(&self) -> Result { + Ok(hub_page(&build_catalog()?.collections)) + } + + fn write(&self, docs_dir: &Path) -> Result<()> { + let catalog = build_catalog()?; + let workflows_dir = docs_dir.join("workflows"); + std::fs::create_dir_all(&workflows_dir)?; + + std::fs::write( + workflows_dir.join("index.md"), + hub_page(&catalog.collections), + )?; + + for entry in &catalog.collections { + let dir = workflows_dir.join(&entry.id); + std::fs::create_dir_all(&dir)?; + std::fs::write(dir.join("index.md"), detail_page(entry))?; + } + + tracing::info!( + generator = self.name(), + output = %workflows_dir.display(), + collections = catalog.collections.len(), + "Generated workflow catalog pages" + ); + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn catalog() -> Vec { + build_catalog().unwrap().collections + } + + #[test] + fn test_hub_page_renders_every_collection_in_both_views() { + let entries = catalog(); + let page = hub_page(&entries); + for entry in &entries { + // Once as a card, once as a table row — both filterable. + assert_eq!( + page.matches(&format!("data-search=\"{}\"", escape(&entry.search_text))) + .count(), + 2, + "{} should appear in both the card grid and the table", + entry.id + ); + assert!(page.contains(&entry.docs_path), "{} needs a link", entry.id); + } + } + + #[test] + fn test_hub_page_works_without_javascript() { + // The search element only filters DOM that is already present; if cards + // were rendered client-side this assertion would fail. + let page = hub_page(&catalog()); + assert!(page.contains("class=\"collection-grid\"")); + assert!(page.contains("class=\"collection-card\"")); + assert!( + !page.contains("fetch("), + "the catalog must not be fetched at runtime" + ); + } + + #[test] + fn test_hub_page_states_the_vocabulary() { + let page = hub_page(&catalog()); + for term in ["Operator workflow", "Issue type", "Collection"] { + assert!(page.contains(term), "vocabulary must define '{term}'"); + } + // The distinction from kanban types is the point of the page. + assert!(page.contains("kanban issue types")); + } + + #[test] + fn test_pages_are_tagged_for_the_sidebar() { + let page = hub_page(&catalog()); + assert!( + page.contains("section: workflows"), + "front matter must carry the section flag the sidebar keys on" + ); + let detail = detail_page(&catalog()[0]); + assert!(detail.contains("section: workflows")); + } + + #[test] + fn test_detail_page_mounts_the_explorer_at_the_published_bundle() { + let ralph = catalog() + .into_iter() + .find(|c| c.id == "ralph_loop") + .unwrap(); + let page = detail_page(&ralph); + assert!(page.contains(r#""#)); + assert!(page.contains("| `PRD` |")); + assert!(page.contains("snarktank")); + assert!(page.contains("active_collection = \"ralph_loop\"")); + } + + #[test] + fn test_icons_are_inlined_so_they_tint_with_the_theme() { + let page = hub_page(&catalog()); + // An would load the SVG as its own document, where currentColor + // cannot resolve — the icon would stay black and vanish in dark mode. + assert!( + !page.contains("alert("x") & more"#.to_string(); + let page = card(&entry); + assert!(!page.contains("