diff --git a/.github/skills/tui-test/SKILL.md b/.github/skills/tui-test/SKILL.md new file mode 100644 index 0000000..73058e6 --- /dev/null +++ b/.github/skills/tui-test/SKILL.md @@ -0,0 +1,487 @@ +--- +name: tui-test +description: "Drive, inspect, assert on, record, and watch a real terminal from the command line with the tui-test cli. Use when running shells (bash, zsh, fish, PowerShell, pwsh, cmd, xonsh, elvish, nushell) or TUI programs (vim, less, top, etc.) in a headless PTY; sending keystrokes, key combos, or mouse input; resizing, writing raw bytes, or signaling the child; waiting for a command to finish or the screen to settle; asserting on terminal text, colors, exit codes, output, or snapshots; capturing text or full-color SVG screenshots; recording and replaying asciinema sessions; watching a live cli session while an agent drives it; or driving process-local sessions from Rust, Python, or Node." +--- + +# tui-test + +`tui-test` controls a real terminal from the command line. It runs shells and +TUI programs in a headless PTY behind a background daemon: a stateless cli front +end talks to a daemon that owns the PTY and renders it into a full terminal +emulator. Each call connects, acts, and exits, and they all share one live +session. With it you can spawn a session, read the rendered screen, send keys +and mouse input, wait for a condition, assert on the result, and record the +session. + +## Built for agents: self-documenting commands + +Three commands let an agent look up the rest of the surface instead of guessing: + +- `tui-test agent-context`: versioned JSON describing every command, flag, + enum, default, and the exit-code taxonomy. It is generated from the cli, so it + stays in sync. Read this first when you need exact argument shapes. +- `tui-test usage`: a one-screen command cheatsheet. +- `tui-test skill`: this guide. + +## Core model + +- **Sessions.** `--session ` (default `default`, env `TUI_TEST_SESSION`) + selects a terminal. The first command auto-starts that session's daemon; the + session persists across calls until `close`. Sessions are independent. +- **Stateless calls.** Each invocation connects to the daemon, acts, and exits. + State (screen, cwd, last command) lives in the daemon, not the cli. +- **JSON.** Pass `--json` on any command for machine-readable output. Data goes + to stdout, diagnostics to stderr. On failure the JSON carries a `"kind"` + (`assertion` / `usage` / `no_session` / `internal`). +- **Verbose.** `--verbose` / `-v` starts the daemon with a full PTY traffic log + (see [Debugging](#debugging)). Only takes effect when the daemon starts. +- **Daemon upgrades.** A client automatically replaces a daemon from another + `tui-test` version. Per-session locking prevents concurrent clients from + racing the restart. +- **Defaults.** New sessions are `80x30`. Timeouts come in five classes: `text` + and `idle` default to 5s; `command`, `exit`, and `ready` to 30s. Set a session + default in the selected config profile or with `open --timeout- `, + or override one call with `--timeout`. `state` reports the effective values. + +## Exit codes + +Every command returns a stable exit code so you can branch on the failure class +without parsing text: + +| Code | Meaning | +| ---- | ------------------------------------------------------- | +| `0` | success | +| `1` | assertion or wait condition not met (`expect` / `wait`) | +| `2` | usage / invalid argument | +| `3` | no active session (run `open` / `run` first) | +| `4` | daemon or IPC error | +| `5` | internal error | + +## Command reference + +### Session & lifecycle + +| Command | Description | +| ------------------------------------------------------------------------ | ---------------------------------------------------------------------- | +| `open [--shell S] [--backend B] [--cols N] [--rows N] [--cwd D] [--env K=V]... [--config F] [--profile P] [--restart]` | Spawn or reuse a shell session. `--env` is repeatable. | +| `run [--backend B] [--cols N] [--rows N] [--cwd D] [--env K=V]... [--config F] [--profile P] [--restart] [args...]` | Spawn or reuse a session running a program directly. | +| `sessions` | List active sessions. | +| `close [--all]` | Close the current session (or every session with `--all`). | +| `daemon start` | Start this session's daemon. Most commands start one on demand. | +| `daemon status` | Inspect a session's daemon (pid, log path). Exit 3 if none is running. | +| `daemon stop --session N \| --all` | Stop one session's daemon, or every daemon. Needs a target. | + +`open` and `run` reuse an existing live child for the selected session. Pass +`--restart` (or `--force`) to replace it. + +### Inspection + +| Command | Description | +| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| `state` | cwd, size, cursor, window title, last command + exit code, bell count, timeouts, and a text snapshot. | +| `text [--full]` | Rendered viewport text, or full scrollback with `--full`. | +| `screenshot [PATH] [-o FILE] [--full] [--zoom N]` | Terminal text to stdout, or a full-color SVG scaled without changing its terminal cells. | +| `cells X Y [W H]` | Per-cell attributes (char, fg, bg, flags) for a region. | +| `get command\|output\|exit-code\|cwd\|cursor\|size\|title\|bells\|bell-events` | One structured field. | + +### Input + +| Command | Description | +| -------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| `type "text"` | Type literal text (no return key). | +| `submit ["text"]` | Type text then press the shell's return key. Omit text to just submit. | +| `key press ` | Simulate key presses, e.g. `key press Ctrl+C`. | +| `key down ` / `key up ` | Simulate explicit keydown and keyup events. | +| `key repeat ` | Send repeat events (press-equivalent in legacy mode). | +| `mouse click X Y` / `mouse click --on-text "OK" [--button N] [--clicks N]` | Click by coordinates or by visible label. | +| `mouse move\|down\|up\|drag\|scroll ...` | Full mouse control (`--button` default 0=left, `scroll --amount` default 3). | + +Key input automatically follows the Kitty keyboard protocol flags negotiated by +the child application. A `key press` sends the normal press input and adds a +release only when the child requests event-type reporting. Text-producing keys +also require report-all-keys mode before repeat and release events can be +represented. Modifiers are `Ctrl`, `Alt` / `Option`, `Shift`, `Super`, `Hyper`, +and `Meta`. Top-level `press` remains a compatibility alias for `key press`. + +### PTY control + +| Command | Description | +| ------------------------------ | ---------------------------------------------------- | +| `resize COLS ROWS` | Resize the PTY and emulator. | +| `write ` | Write raw bytes to the PTY (no return key appended). | +| `signal INT\|TERM\|KILL\|QUIT` | Send a signal to the session's child process. | +| `kill` | Kill the session's child process. | + +### Wait (block until a condition holds) + +| Command | Description | +| --------------------------------------------------- | ------------------------------------------------------------------------------------------ | +| `wait text "T" [--regex --full --not --timeout MS]` | Until text/regex is (with `--not`, is not) visible. Most precise wait. | +| `wait title "T" [--regex --not --timeout MS]` | Until the window title (`OSC 0`/`OSC 2`) matches. Programs announce progress there. | +| `wait idle [--timeout MS]` | Until the screen stops repainting (~250ms quiet). | +| `wait command [--timeout MS]` | Until the current foreground command finishes (needs shell integration). | +| `wait exit [--timeout MS]` | Until the session's program/shell itself exits. | +| `wait ready [--timeout MS]` | Until the shell reports a ready prompt (needs shell integration). `open` waits by default. | +| `wait bell [--timeout MS]` | Until the next terminal bell event. | + +### Expect (exit 0 = pass, 1 = fail) + +| Command | Description | +| ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | +| `expect text "T" [--regex --full --no-strict --not --fg C --bg C --timeout MS]` | Visibility plus optional color. `--no-strict` relaxes a strict single-match. | +| `expect title "T" [--regex --not --timeout MS]` | The window title set with `OSC 0`/`OSC 2`. An unset title matches nothing. | +| `expect exit-code N [--timeout MS]` | The last command's exit code. Waits for the command to finish first. | +| `expect output "T" [--regex]` | The last command's captured output. | +| `expect bell N [--timeout MS]` | The cumulative bell count reaches at least N. | +| `expect snapshot NAME [-u] [--include-colors --include-title]` | Compare the screen against `__snapshots__/NAME.snap`; `-u` writes/updates it. `--include-title` records the window title in the frame; off by default because a prompt often sets it to a host and path. | + +Colors accept ansi-256 (`9`), hex (`#ff0000`), or rgb (`255,0,0`). + +### Recording, monitor & self-docs + +| Command | Description | +| ----------------------------------- | ---------------------------------------------------------------------------- | +| `record start OUT [options]` | Start APNG, GIF, MP4, or asciicast recording; `--zoom N` scales image/video output. | +| `record stop` | Finish the active recording. | +| `get-recording [session]` | Print the always-on asciinema v2 cast (works even after the session stopped).| +| `monitor` | Watch the session live, full-color, in another terminal. | +| `usage` / `agent-context` / `skill` | Self-documentation (see top of guide). | + +## Workflow: run a command and check the result + +```sh +tui-test open # start a shell session +tui-test submit "echo hello" # type text + Enter +tui-test wait command # block until the command finishes +tui-test expect text "hello" # assert it appeared (exit 1 if not) +tui-test expect exit-code 0 # assert the command succeeded +tui-test close +``` + +`submit` types text then presses Enter; `type` types without Enter; `key press` +simulates key presses (`key press Escape : w q Enter`, `key press Ctrl+C`); +`key down` and `key up` simulate explicit keydown and keyup events, and +`key repeat` sends repeat events. + +## Workflow: drive a TUI program + +```sh +tui-test run vim file.txt +tui-test wait idle # let the screen finish rendering +tui-test key press i # enter insert mode +tui-test type "some text" +tui-test key press Escape : w q Enter # save and quit +tui-test wait exit +``` + +## Workflow: mouse interaction + +```sh +tui-test mouse click --on-text "OK" # click a label, no coordinates needed +tui-test mouse click 10 5 --clicks 2 # double-click at column 10, row 5 +tui-test mouse scroll down --amount 5 # scroll the wheel +tui-test mouse drag 2 2 20 2 # drag from (2,2) to (20,2) +``` + +## Workflow: assert colors + +```sh +tui-test cells 0 0 10 1 # inspect char/fg/bg/flags +tui-test expect text "ERROR" --fg "#ff0000" # text present AND red +tui-test expect text "OK" --fg 2 --bg 0 # ansi-256 fg/bg +tui-test expect text "plain" --fg default # asserts the cell set no color +``` + +## Workflow: snapshot testing + +```sh +tui-test expect snapshot main-view -u # create/update the snapshot +tui-test expect snapshot main-view # later: assert it still matches +tui-test expect snapshot main-view --include-colors # also compare per-cell colors +``` + +Snapshots live in `__snapshots__/.snap` next to where you run the command. + +## Waiting: pick the right one + +- `wait text "T"`: waits until text/regex is visible. The most precise wait; use + it whenever you know what output to look for. `--not` waits for it to disappear. +- `wait command`: waits until the current command finishes, via the shell's OSC + integration markers. Use it after `submit`. Without shell integration it falls + back to "screen idle". Bump `--timeout` for long commands (default 30s). +- `wait idle`: waits until the screen stops repainting. This tracks visual + quiescence, not completion: a silent command like `sleep 100` counts as idle + almost immediately. Use it to let a TUI finish drawing. +- `wait exit`: waits until the program/session itself exits. Use for + `run ` sessions or after sending `exit`. +- `wait ready`: waits until the shell reports a ready prompt. `open` does this + for you. + +## Recording + +Every session records automatically from the moment it opens, in asciinema v2 +cast format, stored in your XDG cache by session name. The path is reported in +the `open` / `run` response. Recordings persist after the session ends; stale +ones are swept when a daemon next starts (recordings of still-running sessions +are kept). + +```sh +tui-test get-recording > demo.cast # current session's recording to stdout +tui-test get-recording work > w.cast # a specific session by name (even if stopped) +``` + +Record a selected span directly to APNG, GIF, MP4, or cast: + +```sh +tui-test record start demo.png --zoom 0.5 +tui-test submit "echo hello" +tui-test wait command +tui-test record stop +``` + +APNG, GIF, and MP4 render at 2x pixel density. `--zoom` multiplies the output +dimensions without changing the rows or columns; `--zoom 0.5` produces a 1x +export. Resize events change the terminal window size inside a centered, +opaque canvas sized for the recording's largest frame. Use `--fps`, `--speed`, +and `--idle-time-limit` to tune playback. `.cast` output does not use zoom and +interoperates with the asciicast ecosystem without adding any GPL dependency +to tui-test. If a process exits before `record stop`, an APNG/GIF/MP4 capture +remains beside the target as `OUT.tui-test.cast`. + +## Live monitor + +Watch a session live in a second terminal while an agent drives it; both share +the same daemon. `monitor` takes over an alternate screen and streams the +session in full color at ~20fps. Press `q`, `Esc`, or `Ctrl-C` to detach. + +```sh +tui-test --session work monitor # watch the 'work' session live +``` + +It needs an interactive terminal (exit `2` otherwise) and an existing session +(exit `3` if none). It only reads shared screen state, so watching never blocks +the commands the agent runs; resizing the window re-fits the frame. + +This works only with standalone CLI sessions. + +## Programmatic use (Rust, Python, and JavaScript) + +The Rust crate and the Python and JavaScript packages run the terminal engine +in-process. Session names, registries, and recordings are process-local. A +native session cannot be listed, attached to, controlled, or monitored from +another process, including by the standalone CLI. + +These programmatic APIs do not install or require the `tui-test` CLI. Only +the standalone CLI uses the daemon and JSON-over-local-socket protocol +described elsewhere in this guide. + +Node is the supported JavaScript runtime. Bun and Deno compatibility is best +effort and does not gate releases. Deno requires a local `node_modules` +directory and `--allow-ffi` in addition to read/write permissions. + +```sh +cargo add tui-test # Rust 1.88+ +pip install tui-test # Python 3.8+, imported as `tui_test` +npm install @microsoft/tui-test # Node 20+ (ESM only) +bun add @microsoft/tui-test # Bun (best effort) +deno add npm:@microsoft/tui-test # Deno 2 (best effort) +``` + +Rust: + +```rust +use tui_test::{OpenOptions, Operation, Session}; + +fn main() -> Result<(), Box> { + let session = Session::new(format!("rust-example-{}", std::process::id())); + session.open(OpenOptions::default())?; + session.execute(Operation::Submit { + data: Some("echo hello".into()), + })?; + session.execute(Operation::WaitCommand { + timeout_ms: Some(30_000), + })?; + session.execute(Operation::ExpectText { + text: "hello".into(), + regex: false, + full: false, + strict: false, + not: false, + fg: None, + bg: None, + timeout_ms: Some(5_000), + })?; + session.execute(Operation::ExpectExitCode { + code: 0, + timeout_ms: Some(5_000), + })?; + session.close()?; + Ok(()) +} +``` + +Python: + +```python +import asyncio +from tui_test import TuiTest + +async def main(): + async with TuiTest() as su: # closes the session on exit + await su.open() + await su.submit("echo hello") + await su.wait_command() + await su.expect_text("hello", strict=False) # command echo + output both match + await su.expect_exit_code(0) + +asyncio.run(main()) +``` + +Node (the same API may work on Bun and Deno): + +```js +import { TuiTest } from "@microsoft/tui-test"; + +const su = new TuiTest(); +await su.open(); +await su.submit("echo hello"); +await su.waitCommand(); +await su.expectText("hello", { strict: false }); +await su.expectExitCode(0); +await su.close(); +``` + +The Rust crate exposes `Session` and `SessionRegistry` for terminal ownership, +plus the `Operation` and `OperationResult` enums for the command surface. + +Python and JavaScript methods mirror the cli commands: `open` / `run`, `submit` +/ `type` / `write`, `keyboard.press|down|repeat|up`, compatibility +`press`, +`mouse.click|move|down|up|drag|scroll`, +`resize`, `signal` / `kill`, `state`, `text`, `cells`, the dedicated +`get_command` / `get_output` / `get_exit_code` / `get_cwd` / `get_cursor` / +`get_size` / `get_title` / `get_bell_count` / `get_bell_events` methods, +`screenshot`, `start_recording` / `stop_recording`, `wait_text` / `wait_title` / `wait_idle` / `wait_command` / +`wait_exit` / `wait_ready` / `wait_bell`, `expect_text` / `expect_title` / +`expect_exit_code` / `expect_output` / `expect_bell_count` / `expect_snapshot`, +and `close`. Python module-level helpers are `sessions`, +`close_all`, and `get_recording`; JavaScript exports `sessions`, `closeAll`, +and `getRecording`. The JavaScript client otherwise uses the same names in +camelCase (`startRecording`, `stopRecording`, `waitCommand`, `expectText`, +`getExitCode`, etc.). + +The constructors accept a session name plus backend, profile, timeout, and +artifact options: `TuiTest(session="default", *, backend=None, timeouts=None, +profile=None, artifacts=None)` in Python and `new TuiTest(session?, { +backend?, profile?, timeouts?, artifacts? })` in JavaScript. `run` takes the +program then its arguments +(`await su.run("vim", "file.txt")` in Python, `await su.run("vim", +["file.txt"])` in JavaScript). + +Python and JavaScript failures raise typed errors instead of returning exit +codes, one class per row of the applicable [exit-code table](#exit-codes): +`ExpectationError` (1), `UsageError` (2), `NoSessionError` (3), and +`InternalError` (5), all subclasses of `TuiTestError`. + +## Terminal backends + +`open` and `run` accept `--backend alacritty|ghostty|rio`; Alacritty is the +default. The Python and JavaScript constructors accept the same canonical +strings as a client default, and each `open`/`run` can override it. + +```sh +tui-test open --backend ghostty +tui-test run --backend rio -- vim file.txt +``` + +Every enabled backend satisfies the same cell-grid contract. Ghostty preserves +the blink attribute, while Alacritty and Rio cannot report it. Command +boundaries, exit codes, cwd, and captured command output are parsed separately +from the raw PTY stream, so switching emulators does not change shell +integration behavior. + +## Configuration + +`tui-test.toml` holds named profiles; `--profile NAME` selects one and +`--config PATH` picks the file. Looked up nearest first: `./tui-test.toml` +then the platform config directory (`$XDG_CONFIG_HOME/tui-test/tui-test.toml` +on Unix), then `~/.tui-test/tui-test.toml`. No discovered file is fine; +`--config` and `TUI_TEST_CONFIG` are explicit and error when their path is +missing. + +```toml +[profiles.ci] +scrollback = 500 + +[profiles.ci.timeouts] +text = 15000 +ready = 60000 + +[profiles.ci.colors] +red = "#ff0000" +``` + +A profile sets timeout defaults, `scrollback` (default 10000), and colors: +`foreground`, `background`, `cursor`, and the 16 ANSI slots by name (`red`, +`bright_red`, ...). Indices 16-255 are spec-defined and not configurable, so +`--fg 196` is stable across profiles. Unknown settings and invalid colors are +rejected before a session starts. + +Named profiles do not inherit from `[profiles.default]`; omitted fields use +tui-test's built-in defaults. The in-process APIs accept profile objects: +Rust passes `Profile` directly, Python uses `Profile` / `Colors`, and +JavaScript uses `{ scrollback, colors }`. A profile can be a client default or +a per-`open` / per-`run` override. The bindings do not load `tui-test.toml`. + +The palette is what a screenshot paints **and** what `expect --fg/--bg` matches +a `#rrggbb` against, so the two always agree. + +Programs can also set and query colours at runtime with `OSC 4/10/11/12` and +reset them with `OSC 104/110/111/112`. A query is answered with the colour +currently showing; a reset restores the profile's colour, which no escape +sequence can change. Note that a program setting a colour also changes what a +screenshot of that session looks like. + +## Supported shells & integration + +`open --shell S` accepts: `bash`, `zsh`, `fish`, `powershell`, `pwsh`, `cmd`, +`xonsh`, `elvish`, `nushell`. Omit `--shell` to use the platform default. + +`tui-test` injects shell integration (standard OSC 133 semantic-prompt markers, +plus OSC 7 for cwd) so it can track command boundaries, exit codes, cwd, and +command/output text across shells. This is what powers `wait command`, +`expect exit-code`, `get cwd`, and `get command|output`. + +Integration coverage varies by shell: `powershell` has no native pre-exec hook +so command/output text is best-effort (exit code and cwd still track); `cmd` is +prompt-only. + +## Debugging + +By default the daemon writes no log. Start it with `--verbose` to record every +byte read from and written to the PTY, plus lifecycle events, to +`~/.tui-test/.log`. Logging is fixed when the daemon starts, so enable +it on a fresh daemon (close any existing one first): + +```sh +tui-test --session work close # stop any existing daemon +tui-test --session work --verbose open # start one with logging on +tui-test --session work submit "ls" +cat ~/.tui-test/work.log +``` + +`tui-test daemon status` reports the active log path. + +**Stuck session?** If the screen is frozen and input seems ignored (e.g. after +`git log` / `git diff`), a full-screen pager such as `less` is likely holding the +terminal, and `Ctrl+C` won't quit it. Confirm with `tui-test state` +(`"ready": false` and a stale last command). Quit the pager with +`tui-test key press q`, or avoid it with `git --no-pager ` or +`GIT_PAGER=cat`. + +**Platform note.** On Windows ConPTY, `get output` and `get command` text can on some rare occasions be +unreliable due to screen repainting; grid-based checks (`expect text`, +`expect exit-code`) are unaffected. ConPTY also gives a session a window title +before anything runs (the program's path, e.g. `C:\Program Files\Git\bin\bash.EXE`), +where a unix PTY starts with none, so treat `get title` on a fresh session as +platform-dependent and assert on a title only after a program sets one. diff --git a/package-lock.json b/package-lock.json index 46876ff..225136c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "is": "build/index.js" }, "devDependencies": { - "@microsoft/shell-use": "^0.0.1-beta.6", + "@microsoft/tui-test": "^0.1.0-beta.2", "@tsconfig/node18": "^18.2.2", "@types/color-convert": "^2.0.3", "@types/jest": "^29.5.5", @@ -71,7 +71,7 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/code-frame/-/code-frame-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha1-8vu/6ofESiFZDsUVt3iywm2IZuc=", "dev": true, "dependencies": { @@ -85,7 +85,7 @@ }, "node_modules/@babel/compat-data": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/compat-data/-/compat-data-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha1-bwI38PNtLlHAVwpjb67Z0tDv5ik=", "dev": true, "engines": { @@ -94,7 +94,7 @@ }, "node_modules/@babel/core": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/core/-/core-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha1-gMELFySAgpaLV6hXuRZAlx8gcPc=", "dev": true, "dependencies": { @@ -133,7 +133,7 @@ }, "node_modules/@babel/generator": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/generator/-/generator-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", "integrity": "sha1-zKC4gn5rzzuhdniOfzsYCtbbL6M=", "dev": true, "dependencies": { @@ -149,7 +149,7 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha1-eh3vcEMCQBxH9k+oVYnpdK4hcEI=", "dev": true, "dependencies": { @@ -165,7 +165,7 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-6.3.1.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha1-VW0u+GiRRuRtzqS/3QlfNDTf/LQ=", "dev": true, "bin": { @@ -174,7 +174,7 @@ }, "node_modules/@babel/helper-globals": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha1-8EqW+9hHMkGxB5JD9bPwOjAQq3s=", "dev": true, "engines": { @@ -183,7 +183,7 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", "integrity": "sha1-7yUEilGOgo1zk/rFiC3dc5Idc5Y=", "dev": true, "dependencies": { @@ -196,7 +196,7 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha1-sGJ0elmXuhOGNyATKLv/d5YFdK4=", "dev": true, "dependencies": { @@ -222,7 +222,7 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha1-fwhx2Zgk0jE31g+G/PYTD9WhtR8=", "dev": true, "engines": { @@ -231,7 +231,7 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha1-vYcITO0MeW7Ea9pJLeboPSnon8I=", "dev": true, "engines": { @@ -240,7 +240,7 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha1-zzFb6UAhOzVOtKvMC9Aevj9zvCo=", "dev": true, "engines": { @@ -249,7 +249,7 @@ }, "node_modules/@babel/helpers": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helpers/-/helpers-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha1-Rav951SJl+NDdsPmn+tHXP+0pgc=", "dev": true, "dependencies": { @@ -262,7 +262,7 @@ }, "node_modules/@babel/parser": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/parser/-/parser-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", "integrity": "sha1-g3uHOHy/XsVTDLY0s8Yi9o7bkzQ=", "dev": true, "dependencies": { @@ -454,7 +454,7 @@ }, "node_modules/@babel/template": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/template/-/template-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha1-TZ1ABPZFzdME3pWMclFieE7KxwA=", "dev": true, "dependencies": { @@ -468,7 +468,7 @@ }, "node_modules/@babel/traverse": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/traverse/-/traverse-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", "integrity": "sha1-xHsHpBuV2gkH0Ca13YlNmN59Ly0=", "dev": true, "dependencies": { @@ -486,7 +486,7 @@ }, "node_modules/@babel/types": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/types/-/types-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", "integrity": "sha1-gAXjHYJxLuetrvbiPGO3GmJ3CpI=", "dev": true, "dependencies": { @@ -1032,7 +1032,7 @@ }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.3.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-yaml/-/js-yaml-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", "integrity": "sha1-0ZAFcqf3zwtfVAyDZz5gutNDZZI=", "dev": true, "funding": [ @@ -1679,7 +1679,7 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha1-Y0Khn0Q0dRjJPkOxrGnes8Rlah8=", "dev": true, "dependencies": { @@ -1689,7 +1689,7 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha1-N1xHbRlylHhRuh4Vro8SMEdEWqE=", "dev": true, "dependencies": { @@ -1708,13 +1708,13 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha1-aRKwDSxjHA0Vzhp6tXzWV/Ko+Lo=", "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha1-2xXWeByTHzolGj2sOVAcmKYIL9A=", "dev": true, "dependencies": { @@ -1722,30 +1722,29 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@microsoft/shell-use": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use/-/shell-use-0.0.1-beta.6.tgz", - "integrity": "sha512-3aVyFiTJgLUEv1qkBSX77+7BUTl5mpURVOZovntBCzTPaLUbFrehp1ti5069t87K+6S3AJnPni0Vh48K3Z0TEQ==", + "node_modules/@microsoft/tui-test": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test/-/tui-test-0.1.0-beta.2.tgz", + "integrity": "sha512-xSnK4OUPjBHP/bfKgDiNB6AZNbGwHdGpDw/owR2uCdeCKBB/knraDWxMraPRFQcreMEtph0vWfOii4ESXIuSrg==", "dev": true, "license": "MIT", "engines": { "node": ">=20" }, "optionalDependencies": { - "@microsoft/shell-use-darwin-arm64": "0.0.1-beta.6", - "@microsoft/shell-use-darwin-x64": "0.0.1-beta.6", - "@microsoft/shell-use-linux-arm64-gnu": "0.0.1-beta.6", - "@microsoft/shell-use-linux-arm64-musl": "0.0.1-beta.6", - "@microsoft/shell-use-linux-x64-gnu": "0.0.1-beta.6", - "@microsoft/shell-use-linux-x64-musl": "0.0.1-beta.6", - "@microsoft/shell-use-win32-arm64-msvc": "0.0.1-beta.6", - "@microsoft/shell-use-win32-x64-msvc": "0.0.1-beta.6" - } - }, - "node_modules/@microsoft/shell-use-darwin-arm64": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-darwin-arm64/-/shell-use-darwin-arm64-0.0.1-beta.6.tgz", - "integrity": "sha512-Lp9akC1J8yfglkiMJNPtxHCGBCYBAPomnc/etgqhDLrB2vYEw+Lo23kcK6CIKlXGrix29jxwr12Kln7s7Re9ow==", + "@microsoft/tui-test-darwin-arm64": "0.1.0-beta.2", + "@microsoft/tui-test-darwin-x64": "0.1.0-beta.2", + "@microsoft/tui-test-linux-arm64-gnu": "0.1.0-beta.2", + "@microsoft/tui-test-linux-arm64-musl": "0.1.0-beta.2", + "@microsoft/tui-test-linux-x64-gnu": "0.1.0-beta.2", + "@microsoft/tui-test-linux-x64-musl": "0.1.0-beta.2", + "@microsoft/tui-test-win32-x64-msvc": "0.1.0-beta.2" + } + }, + "node_modules/@microsoft/tui-test-darwin-arm64": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-arm64/-/tui-test-darwin-arm64-0.1.0-beta.2.tgz", + "integrity": "sha512-3o9O7WQGE5vQcVuEZe2U9uajmi4PyalRFI14nccGSH8JoTIajBSZiRGV+6TFsxG4Gbfo5a+eVSeaa2eD4n5+5A==", "cpu": [ "arm64" ], @@ -1759,10 +1758,10 @@ "node": ">=20" } }, - "node_modules/@microsoft/shell-use-darwin-x64": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-darwin-x64/-/shell-use-darwin-x64-0.0.1-beta.6.tgz", - "integrity": "sha512-ZdlTI4DjSJqjbh9b809cIuuM+5+Uts+qlfzr3lcgNgtMOr1KQBnMq5gm6cm9We1gVvGZQwn+LTabfIx880ew3w==", + "node_modules/@microsoft/tui-test-darwin-x64": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-x64/-/tui-test-darwin-x64-0.1.0-beta.2.tgz", + "integrity": "sha512-qI+Eyn7hYzG5fUU7C5mMJG6fcfuk5HKYm6Ha74SC7J8cW8OtqYt5tVPfSlVGgTaaC0W/pcC8AWAXbLD0fbEGfQ==", "cpu": [ "x64" ], @@ -1776,10 +1775,10 @@ "node": ">=20" } }, - "node_modules/@microsoft/shell-use-linux-arm64-gnu": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-linux-arm64-gnu/-/shell-use-linux-arm64-gnu-0.0.1-beta.6.tgz", - "integrity": "sha512-ymVFNdCLQff2jkG0aaRbzfkGhNyjanB3lahXKvz/Zb0vLO6Cb+d5/GIsK7MUTCfgvj3Yks/wZCy/wxCiHPn/Gg==", + "node_modules/@microsoft/tui-test-linux-arm64-gnu": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-gnu/-/tui-test-linux-arm64-gnu-0.1.0-beta.2.tgz", + "integrity": "sha512-bxB/MBk5mtfpobhE7QYYLGMh4Tk+OPoiR361+siz42ZQRR1G6HZYcy6iEmnqLE/85/vqQvUhGRHA//F2b8j7SA==", "cpu": [ "arm64" ], @@ -1793,10 +1792,10 @@ "node": ">=20" } }, - "node_modules/@microsoft/shell-use-linux-arm64-musl": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-linux-arm64-musl/-/shell-use-linux-arm64-musl-0.0.1-beta.6.tgz", - "integrity": "sha512-HG7/7vweEsPiH9DipE8Oz3ub76zXz6YVpO9JDUlWy5D6tz9kyxvnac1JRZ9Zj7KNrou5PBpxA+IL6xvt3fJeDw==", + "node_modules/@microsoft/tui-test-linux-arm64-musl": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-musl/-/tui-test-linux-arm64-musl-0.1.0-beta.2.tgz", + "integrity": "sha512-ERHvfe1+/vFyf7NroEUJJz6fp4l2mIGtyi9dARhkQyJAVuZ9kCpeUIjktRSOeG3Y7JzfSfAJ4UQxC+9/gFEQgQ==", "cpu": [ "arm64" ], @@ -1810,10 +1809,10 @@ "node": ">=20" } }, - "node_modules/@microsoft/shell-use-linux-x64-gnu": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-linux-x64-gnu/-/shell-use-linux-x64-gnu-0.0.1-beta.6.tgz", - "integrity": "sha512-ss3L6vNTOnrEnT3O+S6qliCiad8+wYTzkxMohfOBTkYi46nGOIeKhWBequsbzb8XjSYzhxfqmBxqsaNLg9b80g==", + "node_modules/@microsoft/tui-test-linux-x64-gnu": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-gnu/-/tui-test-linux-x64-gnu-0.1.0-beta.2.tgz", + "integrity": "sha512-m614FBXWmUUBXX2UUEeF9KIsGHWeQdydqosVuuGLdOSGS/uw2/ioSo35MhHcwAXrkPqeInBrP43DJYDkufvhyQ==", "cpu": [ "x64" ], @@ -1827,10 +1826,10 @@ "node": ">=20" } }, - "node_modules/@microsoft/shell-use-linux-x64-musl": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-linux-x64-musl/-/shell-use-linux-x64-musl-0.0.1-beta.6.tgz", - "integrity": "sha512-KC3FPPOHYEzdGG0WYY1p2zByWLsWcR/eM77pBf2gg8A5RWI5Lmm0CvCU9Djqu+GFVW7xoNSem/jr1+D93sAo3Q==", + "node_modules/@microsoft/tui-test-linux-x64-musl": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-musl/-/tui-test-linux-x64-musl-0.1.0-beta.2.tgz", + "integrity": "sha512-EhT8NiqT7w6kc+vNtkKkIxFephMIinTM3rGjfYv+uXRcPWNVlHmBuV5179oPh4LSy7aVh4QY/ke2DRVFIOyDzw==", "cpu": [ "x64" ], @@ -1844,27 +1843,10 @@ "node": ">=20" } }, - "node_modules/@microsoft/shell-use-win32-arm64-msvc": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-win32-arm64-msvc/-/shell-use-win32-arm64-msvc-0.0.1-beta.6.tgz", - "integrity": "sha512-a47ViMm1MVtK6VJ3cC5qiE8U1ntne69gPTIs9LpRflacFlQ+yQcUr/0R/fgpV2QzhEkLKXtTHyY77jz36NMevw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20" - } - }, - "node_modules/@microsoft/shell-use-win32-x64-msvc": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-win32-x64-msvc/-/shell-use-win32-x64-msvc-0.0.1-beta.6.tgz", - "integrity": "sha512-sB8nA+v3c7pqhA71v+I9ckIWUwqeNbZqktMYmKe5p86DJ6ZDHz+nkmrnH0PBnTqVlbfstJeoBijXWMwePbJwaQ==", + "node_modules/@microsoft/tui-test-win32-x64-msvc": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-win32-x64-msvc/-/tui-test-win32-x64-msvc-0.1.0-beta.2.tgz", + "integrity": "sha512-JZozhcE5q5G2INwemvS88nL6jXZjuvU5M45zxh25VbIlfeczFe0yGODWfHQ+QrIwwYm3aAMRhXjFqWciKuzodA==", "cpu": [ "x64" ], @@ -2738,7 +2720,7 @@ }, "node_modules/baseline-browser-mapping": { "version": "2.10.42", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", "integrity": "sha1-GV3MdrqiaaSX8LB97Kzhaf7prFg=", "dev": true, "bin": { @@ -2750,7 +2732,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.16", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/brace-expansion/-/brace-expansion-1.1.16.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", "integrity": "sha1-cj06MMBVjCJavJ/Eeac+FOJsPC8=", "dev": true, "dependencies": { @@ -2772,7 +2754,7 @@ }, "node_modules/browserslist": { "version": "4.28.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/browserslist/-/browserslist-4.28.5.tgz", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz", "integrity": "sha1-Q4t9OMDUtHdAu7NneNW9ygGzeDg=", "dev": true, "funding": [ @@ -2863,7 +2845,7 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001803", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", "integrity": "sha1-sqXWluBCvIME3NSULDn+Mw+7yyQ=", "dev": true, "funding": [ @@ -2883,7 +2865,7 @@ }, "node_modules/chalk": { "version": "5.6.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/chalk/-/chalk-5.6.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha1-sSOLbiPqM3r3HH+KKV21rwwViuo=", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -2924,7 +2906,7 @@ }, "node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cli-cursor/-/cli-cursor-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha1-JKSDHs9aawHd6zL7caSyCIsNzjg=", "dev": true, "dependencies": { @@ -2939,7 +2921,7 @@ }, "node_modules/cli-truncate": { "version": "4.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cli-truncate/-/cli-truncate-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", "integrity": "sha1-bMKKKST+6eJc6R6XPbVscGbmFyo=", "dev": true, "dependencies": { @@ -2955,13 +2937,13 @@ }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-10.6.0.tgz", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha1-vz1uj3+P0ipl2XA0dbwBRzV6aw0=", "dev": true }, "node_modules/cli-truncate/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha1-tbuOIWXOJ11NQ0dt0nAK2Qkdttw=", "dev": true, "dependencies": { @@ -3106,7 +3088,7 @@ }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/colorette/-/colorette-2.0.20.tgz", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha1-nreT5oMwZ/cjWQL807CZF6AAqVo=", "dev": true }, @@ -3226,7 +3208,7 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/debug/-/debug-4.4.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha1-xq5DLZvZZiWC/OCHCbA4xY6ePWo=", "dependencies": { "ms": "^2.1.3" @@ -3349,7 +3331,7 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.389", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", "integrity": "sha1-U4vp6+x4Am1Nq6a+Mhq4VN+sKo8=", "dev": true }, @@ -3372,7 +3354,7 @@ }, "node_modules/environment": { "version": "1.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/environment/-/environment-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha1-jobGaxgPNjx6sxF4fgJZZl9FqfE=", "dev": true, "engines": { @@ -3550,7 +3532,7 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escalade/-/escalade-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha1-ARo/aYVroYnf+n3I/M6Z0qh5A+U=", "dev": true, "engines": { @@ -3845,7 +3827,7 @@ }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.3.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-yaml/-/js-yaml-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", "integrity": "sha1-0ZAFcqf3zwtfVAyDZz5gutNDZZI=", "dev": true, "funding": [ @@ -3999,7 +3981,7 @@ }, "node_modules/eventemitter3": { "version": "5.0.4", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/eventemitter3/-/eventemitter3-5.0.4.tgz", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha1-qG1mFwQzcS3egUcHrFK1JxzrH+s=", "dev": true }, @@ -4098,7 +4080,7 @@ }, "node_modules/fast-uri": { "version": "3.1.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fast-uri/-/fast-uri-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", "integrity": "sha1-9pWkDwBqulBWMVc6ACHdshGUrRE=", "funding": [ { @@ -4319,7 +4301,7 @@ }, "node_modules/get-east-asian-width": { "version": "1.6.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", "integrity": "sha1-IWkA+R3xGossGYw+HZPWwDWndrk=", "dev": true, "engines": { @@ -4808,7 +4790,7 @@ }, "node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha1-+uMWfHKedGP4RhzlErCApJJoqog=", "dev": true, "engines": { @@ -6165,7 +6147,7 @@ }, "node_modules/js-yaml": { "version": "3.15.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-yaml/-/js-yaml-3.15.0.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", "integrity": "sha1-WG5SFOr+Pok3VqQel5tQ2J0+Smc=", "dev": true, "dependencies": { @@ -6178,7 +6160,7 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsesc/-/jsesc-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha1-dNM1ojT2ftGZB/2t+sfM+dQJgl0=", "dev": true, "bin": { @@ -6280,7 +6262,7 @@ }, "node_modules/lilconfig": { "version": "3.1.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lilconfig/-/lilconfig-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha1-obz9Ylf5WFv1rhTO7rt7VZAl5MQ=", "dev": true, "engines": { @@ -6298,7 +6280,7 @@ }, "node_modules/lint-staged": { "version": "15.5.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lint-staged/-/lint-staged-15.5.2.tgz", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", "integrity": "sha1-vv8Cj9BoH32yb/u2cFCiHtTQWaM=", "dev": true, "dependencies": { @@ -6325,7 +6307,7 @@ }, "node_modules/lint-staged/node_modules/commander": { "version": "13.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/commander/-/commander-13.1.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", "integrity": "sha1-d2Fn22jHjzjczh+bjXuLmkiKv0Y=", "dev": true, "engines": { @@ -6468,7 +6450,7 @@ }, "node_modules/listr2": { "version": "8.3.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/listr2/-/listr2-8.3.3.tgz", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", "integrity": "sha1-gV/I9zgmD/IgmBv56Gaz4R6BIb8=", "dev": true, "dependencies": { @@ -6485,13 +6467,13 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-10.6.0.tgz", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha1-vz1uj3+P0ipl2XA0dbwBRzV6aw0=", "dev": true }, "node_modules/listr2/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha1-tbuOIWXOJ11NQ0dt0nAK2Qkdttw=", "dev": true, "dependencies": { @@ -6508,7 +6490,7 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha1-lWgy3qlJQwbm0gnrhxZDu4c9fJg=", "dev": true, "dependencies": { @@ -6549,7 +6531,7 @@ }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/log-update/-/log-update-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", "integrity": "sha1-GgT/OBZvlGR64a9WL0vWoVsbfNQ=", "dev": true, "dependencies": { @@ -6568,7 +6550,7 @@ }, "node_modules/log-update/node_modules/ansi-escapes": { "version": "7.3.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", "integrity": "sha1-U5W7dLIVCkodbjwlZfSuynjShic=", "dev": true, "dependencies": { @@ -6583,13 +6565,13 @@ }, "node_modules/log-update/node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-10.6.0.tgz", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha1-vz1uj3+P0ipl2XA0dbwBRzV6aw0=", "dev": true }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "5.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", "integrity": "sha1-BGsqbU9rFWsiM9MgfUtal4OZm5g=", "dev": true, "dependencies": { @@ -6604,7 +6586,7 @@ }, "node_modules/log-update/node_modules/slice-ansi": { "version": "7.1.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/slice-ansi/-/slice-ansi-7.1.2.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", "integrity": "sha1-rfe+cKptchYtkHzQ5tXBH1B7VAM=", "dev": true, "dependencies": { @@ -6620,7 +6602,7 @@ }, "node_modules/log-update/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha1-tbuOIWXOJ11NQ0dt0nAK2Qkdttw=", "dev": true, "dependencies": { @@ -6637,7 +6619,7 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha1-lWgy3qlJQwbm0gnrhxZDu4c9fJg=", "dev": true, "dependencies": { @@ -6666,7 +6648,7 @@ }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", "dev": true, "dependencies": { @@ -6742,7 +6724,7 @@ }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mimic-function/-/mimic-function-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha1-rL4rM0n5m53qyn+3Dki4PpTmcHY=", "dev": true, "engines": { @@ -6767,7 +6749,7 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ms/-/ms-2.1.3.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=" }, "node_modules/natural-compare": { @@ -6799,7 +6781,7 @@ }, "node_modules/node-releases": { "version": "2.0.51", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/node-releases/-/node-releases-2.0.51.tgz", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", "integrity": "sha1-zcCEM1d/WzKtAWlEgXJuIu61Su8=", "dev": true, "engines": { @@ -7099,13 +7081,13 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/picocolors/-/picocolors-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha1-PTIa8+q5ObCDyPkpodEs2oHCa2s=", "dev": true }, "node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/picomatch/-/picomatch-2.3.2.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha1-WpQpFeJrNy3A8OZ1MUmhbmscVgE=", "dev": true, "engines": { @@ -7391,7 +7373,7 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/restore-cursor/-/restore-cursor-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", "integrity": "sha1-B2bZVpnvrLFBUJk/VbrwlT6h6+c=", "dev": true, "dependencies": { @@ -7407,7 +7389,7 @@ }, "node_modules/restore-cursor/node_modules/onetime": { "version": "7.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/onetime/-/onetime-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", "integrity": "sha1-nxbJLYye9RIOOs2d2ZV8zuzBq2A=", "dev": true, "dependencies": { @@ -7422,7 +7404,7 @@ }, "node_modules/restore-cursor/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/signal-exit/-/signal-exit-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ=", "dev": true, "engines": { @@ -7444,7 +7426,7 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/rfdc/-/rfdc-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha1-d492xPtzHZNBTo+SX77PZMzn9so=", "dev": true }, @@ -7601,7 +7583,7 @@ }, "node_modules/slice-ansi": { "version": "5.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/slice-ansi/-/slice-ansi-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha1-tzBjxXqpb5zYgWVLFSlNldKFxCo=", "dev": true, "dependencies": { @@ -8577,7 +8559,7 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha1-ZNdttYcTE2rL60xJEUNmzGzC6A0=", "dev": true, "funding": [ @@ -8616,7 +8598,7 @@ }, "node_modules/uuid": { "version": "11.1.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/uuid/-/uuid-11.1.1.tgz", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", "integrity": "sha1-9tgdLhxl0Adi5eKbFsXS2ZXiCK0=", "funding": [ "https://github.com/sponsors/broofa", @@ -8785,13 +8767,13 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yallist/-/yallist-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", "dev": true }, "node_modules/yaml": { "version": "2.9.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yaml/-/yaml-2.9.0.tgz", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", "integrity": "sha1-eCdK/ZNZih391hMN9qVm3vy/mqQ=", "bin": { "yaml": "bin.mjs" @@ -8902,7 +8884,7 @@ }, "@babel/code-frame": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/code-frame/-/code-frame-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha1-8vu/6ofESiFZDsUVt3iywm2IZuc=", "dev": true, "requires": { @@ -8913,13 +8895,13 @@ }, "@babel/compat-data": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/compat-data/-/compat-data-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha1-bwI38PNtLlHAVwpjb67Z0tDv5ik=", "dev": true }, "@babel/core": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/core/-/core-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha1-gMELFySAgpaLV6hXuRZAlx8gcPc=", "dev": true, "requires": { @@ -8950,7 +8932,7 @@ }, "@babel/generator": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/generator/-/generator-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", "integrity": "sha1-zKC4gn5rzzuhdniOfzsYCtbbL6M=", "dev": true, "requires": { @@ -8963,7 +8945,7 @@ }, "@babel/helper-compilation-targets": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha1-eh3vcEMCQBxH9k+oVYnpdK4hcEI=", "dev": true, "requires": { @@ -8976,7 +8958,7 @@ "dependencies": { "semver": { "version": "6.3.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-6.3.1.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha1-VW0u+GiRRuRtzqS/3QlfNDTf/LQ=", "dev": true } @@ -8984,13 +8966,13 @@ }, "@babel/helper-globals": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha1-8EqW+9hHMkGxB5JD9bPwOjAQq3s=", "dev": true }, "@babel/helper-module-imports": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", "integrity": "sha1-7yUEilGOgo1zk/rFiC3dc5Idc5Y=", "dev": true, "requires": { @@ -9000,7 +8982,7 @@ }, "@babel/helper-module-transforms": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha1-sGJ0elmXuhOGNyATKLv/d5YFdK4=", "dev": true, "requires": { @@ -9017,25 +8999,25 @@ }, "@babel/helper-string-parser": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha1-fwhx2Zgk0jE31g+G/PYTD9WhtR8=", "dev": true }, "@babel/helper-validator-identifier": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha1-vYcITO0MeW7Ea9pJLeboPSnon8I=", "dev": true }, "@babel/helper-validator-option": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha1-zzFb6UAhOzVOtKvMC9Aevj9zvCo=", "dev": true }, "@babel/helpers": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/helpers/-/helpers-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha1-Rav951SJl+NDdsPmn+tHXP+0pgc=", "dev": true, "requires": { @@ -9045,7 +9027,7 @@ }, "@babel/parser": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/parser/-/parser-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", "integrity": "sha1-g3uHOHy/XsVTDLY0s8Yi9o7bkzQ=", "dev": true, "requires": { @@ -9180,7 +9162,7 @@ }, "@babel/template": { "version": "7.29.7", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/template/-/template-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha1-TZ1ABPZFzdME3pWMclFieE7KxwA=", "dev": true, "requires": { @@ -9191,7 +9173,7 @@ }, "@babel/traverse": { "version": "7.29.7", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/traverse/-/traverse-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", "integrity": "sha1-xHsHpBuV2gkH0Ca13YlNmN59Ly0=", "dev": true, "requires": { @@ -9206,7 +9188,7 @@ }, "@babel/types": { "version": "7.29.7", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@babel/types/-/types-7.29.7.tgz", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", "integrity": "sha1-gAXjHYJxLuetrvbiPGO3GmJ3CpI=", "dev": true, "requires": { @@ -9463,7 +9445,7 @@ }, "js-yaml": { "version": "4.3.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-yaml/-/js-yaml-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", "integrity": "sha1-0ZAFcqf3zwtfVAyDZz5gutNDZZI=", "dev": true, "requires": { @@ -9931,7 +9913,7 @@ }, "@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha1-Y0Khn0Q0dRjJPkOxrGnes8Rlah8=", "dev": true, "requires": { @@ -9941,7 +9923,7 @@ }, "@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha1-N1xHbRlylHhRuh4Vro8SMEdEWqE=", "dev": true, "requires": { @@ -9957,13 +9939,13 @@ }, "@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha1-aRKwDSxjHA0Vzhp6tXzWV/Ko+Lo=", "dev": true }, "@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha1-2xXWeByTHzolGj2sOVAcmKYIL9A=", "dev": true, "requires": { @@ -9971,75 +9953,67 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@microsoft/shell-use": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use/-/shell-use-0.0.1-beta.6.tgz", - "integrity": "sha512-3aVyFiTJgLUEv1qkBSX77+7BUTl5mpURVOZovntBCzTPaLUbFrehp1ti5069t87K+6S3AJnPni0Vh48K3Z0TEQ==", + "@microsoft/tui-test": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test/-/tui-test-0.1.0-beta.2.tgz", + "integrity": "sha512-xSnK4OUPjBHP/bfKgDiNB6AZNbGwHdGpDw/owR2uCdeCKBB/knraDWxMraPRFQcreMEtph0vWfOii4ESXIuSrg==", "dev": true, "requires": { - "@microsoft/shell-use-darwin-arm64": "0.0.1-beta.6", - "@microsoft/shell-use-darwin-x64": "0.0.1-beta.6", - "@microsoft/shell-use-linux-arm64-gnu": "0.0.1-beta.6", - "@microsoft/shell-use-linux-arm64-musl": "0.0.1-beta.6", - "@microsoft/shell-use-linux-x64-gnu": "0.0.1-beta.6", - "@microsoft/shell-use-linux-x64-musl": "0.0.1-beta.6", - "@microsoft/shell-use-win32-arm64-msvc": "0.0.1-beta.6", - "@microsoft/shell-use-win32-x64-msvc": "0.0.1-beta.6" + "@microsoft/tui-test-darwin-arm64": "0.1.0-beta.2", + "@microsoft/tui-test-darwin-x64": "0.1.0-beta.2", + "@microsoft/tui-test-linux-arm64-gnu": "0.1.0-beta.2", + "@microsoft/tui-test-linux-arm64-musl": "0.1.0-beta.2", + "@microsoft/tui-test-linux-x64-gnu": "0.1.0-beta.2", + "@microsoft/tui-test-linux-x64-musl": "0.1.0-beta.2", + "@microsoft/tui-test-win32-x64-msvc": "0.1.0-beta.2" } }, - "@microsoft/shell-use-darwin-arm64": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-darwin-arm64/-/shell-use-darwin-arm64-0.0.1-beta.6.tgz", - "integrity": "sha512-Lp9akC1J8yfglkiMJNPtxHCGBCYBAPomnc/etgqhDLrB2vYEw+Lo23kcK6CIKlXGrix29jxwr12Kln7s7Re9ow==", + "@microsoft/tui-test-darwin-arm64": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-arm64/-/tui-test-darwin-arm64-0.1.0-beta.2.tgz", + "integrity": "sha512-3o9O7WQGE5vQcVuEZe2U9uajmi4PyalRFI14nccGSH8JoTIajBSZiRGV+6TFsxG4Gbfo5a+eVSeaa2eD4n5+5A==", "dev": true, "optional": true }, - "@microsoft/shell-use-darwin-x64": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-darwin-x64/-/shell-use-darwin-x64-0.0.1-beta.6.tgz", - "integrity": "sha512-ZdlTI4DjSJqjbh9b809cIuuM+5+Uts+qlfzr3lcgNgtMOr1KQBnMq5gm6cm9We1gVvGZQwn+LTabfIx880ew3w==", + "@microsoft/tui-test-darwin-x64": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-darwin-x64/-/tui-test-darwin-x64-0.1.0-beta.2.tgz", + "integrity": "sha512-qI+Eyn7hYzG5fUU7C5mMJG6fcfuk5HKYm6Ha74SC7J8cW8OtqYt5tVPfSlVGgTaaC0W/pcC8AWAXbLD0fbEGfQ==", "dev": true, "optional": true }, - "@microsoft/shell-use-linux-arm64-gnu": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-linux-arm64-gnu/-/shell-use-linux-arm64-gnu-0.0.1-beta.6.tgz", - "integrity": "sha512-ymVFNdCLQff2jkG0aaRbzfkGhNyjanB3lahXKvz/Zb0vLO6Cb+d5/GIsK7MUTCfgvj3Yks/wZCy/wxCiHPn/Gg==", + "@microsoft/tui-test-linux-arm64-gnu": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-gnu/-/tui-test-linux-arm64-gnu-0.1.0-beta.2.tgz", + "integrity": "sha512-bxB/MBk5mtfpobhE7QYYLGMh4Tk+OPoiR361+siz42ZQRR1G6HZYcy6iEmnqLE/85/vqQvUhGRHA//F2b8j7SA==", "dev": true, "optional": true }, - "@microsoft/shell-use-linux-arm64-musl": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-linux-arm64-musl/-/shell-use-linux-arm64-musl-0.0.1-beta.6.tgz", - "integrity": "sha512-HG7/7vweEsPiH9DipE8Oz3ub76zXz6YVpO9JDUlWy5D6tz9kyxvnac1JRZ9Zj7KNrou5PBpxA+IL6xvt3fJeDw==", + "@microsoft/tui-test-linux-arm64-musl": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-arm64-musl/-/tui-test-linux-arm64-musl-0.1.0-beta.2.tgz", + "integrity": "sha512-ERHvfe1+/vFyf7NroEUJJz6fp4l2mIGtyi9dARhkQyJAVuZ9kCpeUIjktRSOeG3Y7JzfSfAJ4UQxC+9/gFEQgQ==", "dev": true, "optional": true }, - "@microsoft/shell-use-linux-x64-gnu": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-linux-x64-gnu/-/shell-use-linux-x64-gnu-0.0.1-beta.6.tgz", - "integrity": "sha512-ss3L6vNTOnrEnT3O+S6qliCiad8+wYTzkxMohfOBTkYi46nGOIeKhWBequsbzb8XjSYzhxfqmBxqsaNLg9b80g==", + "@microsoft/tui-test-linux-x64-gnu": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-gnu/-/tui-test-linux-x64-gnu-0.1.0-beta.2.tgz", + "integrity": "sha512-m614FBXWmUUBXX2UUEeF9KIsGHWeQdydqosVuuGLdOSGS/uw2/ioSo35MhHcwAXrkPqeInBrP43DJYDkufvhyQ==", "dev": true, "optional": true }, - "@microsoft/shell-use-linux-x64-musl": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-linux-x64-musl/-/shell-use-linux-x64-musl-0.0.1-beta.6.tgz", - "integrity": "sha512-KC3FPPOHYEzdGG0WYY1p2zByWLsWcR/eM77pBf2gg8A5RWI5Lmm0CvCU9Djqu+GFVW7xoNSem/jr1+D93sAo3Q==", + "@microsoft/tui-test-linux-x64-musl": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-linux-x64-musl/-/tui-test-linux-x64-musl-0.1.0-beta.2.tgz", + "integrity": "sha512-EhT8NiqT7w6kc+vNtkKkIxFephMIinTM3rGjfYv+uXRcPWNVlHmBuV5179oPh4LSy7aVh4QY/ke2DRVFIOyDzw==", "dev": true, "optional": true }, - "@microsoft/shell-use-win32-arm64-msvc": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-win32-arm64-msvc/-/shell-use-win32-arm64-msvc-0.0.1-beta.6.tgz", - "integrity": "sha512-a47ViMm1MVtK6VJ3cC5qiE8U1ntne69gPTIs9LpRflacFlQ+yQcUr/0R/fgpV2QzhEkLKXtTHyY77jz36NMevw==", - "dev": true, - "optional": true - }, - "@microsoft/shell-use-win32-x64-msvc": { - "version": "0.0.1-beta.6", - "resolved": "https://registry.npmjs.org/@microsoft/shell-use-win32-x64-msvc/-/shell-use-win32-x64-msvc-0.0.1-beta.6.tgz", - "integrity": "sha512-sB8nA+v3c7pqhA71v+I9ckIWUwqeNbZqktMYmKe5p86DJ6ZDHz+nkmrnH0PBnTqVlbfstJeoBijXWMwePbJwaQ==", + "@microsoft/tui-test-win32-x64-msvc": { + "version": "0.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@microsoft/tui-test-win32-x64-msvc/-/tui-test-win32-x64-msvc-0.1.0-beta.2.tgz", + "integrity": "sha512-JZozhcE5q5G2INwemvS88nL6jXZjuvU5M45zxh25VbIlfeczFe0yGODWfHQ+QrIwwYm3aAMRhXjFqWciKuzodA==", "dev": true, "optional": true }, @@ -10686,13 +10660,13 @@ }, "baseline-browser-mapping": { "version": "2.10.42", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", "integrity": "sha1-GV3MdrqiaaSX8LB97Kzhaf7prFg=", "dev": true }, "brace-expansion": { "version": "1.1.16", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/brace-expansion/-/brace-expansion-1.1.16.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", "integrity": "sha1-cj06MMBVjCJavJ/Eeac+FOJsPC8=", "dev": true, "requires": { @@ -10711,7 +10685,7 @@ }, "browserslist": { "version": "4.28.5", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/browserslist/-/browserslist-4.28.5.tgz", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz", "integrity": "sha1-Q4t9OMDUtHdAu7NneNW9ygGzeDg=", "dev": true, "requires": { @@ -10770,13 +10744,13 @@ }, "caniuse-lite": { "version": "1.0.30001803", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", "integrity": "sha1-sqXWluBCvIME3NSULDn+Mw+7yyQ=", "dev": true }, "chalk": { "version": "5.6.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/chalk/-/chalk-5.6.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha1-sSOLbiPqM3r3HH+KKV21rwwViuo=" }, "char-regex": { @@ -10799,7 +10773,7 @@ }, "cli-cursor": { "version": "5.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cli-cursor/-/cli-cursor-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha1-JKSDHs9aawHd6zL7caSyCIsNzjg=", "dev": true, "requires": { @@ -10808,7 +10782,7 @@ }, "cli-truncate": { "version": "4.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cli-truncate/-/cli-truncate-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", "integrity": "sha1-bMKKKST+6eJc6R6XPbVscGbmFyo=", "dev": true, "requires": { @@ -10818,13 +10792,13 @@ "dependencies": { "emoji-regex": { "version": "10.6.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-10.6.0.tgz", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha1-vz1uj3+P0ipl2XA0dbwBRzV6aw0=", "dev": true }, "string-width": { "version": "7.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha1-tbuOIWXOJ11NQ0dt0nAK2Qkdttw=", "dev": true, "requires": { @@ -10933,7 +10907,7 @@ }, "colorette": { "version": "2.0.20", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/colorette/-/colorette-2.0.20.tgz", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha1-nreT5oMwZ/cjWQL807CZF6AAqVo=", "dev": true }, @@ -11026,7 +11000,7 @@ }, "debug": { "version": "4.4.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/debug/-/debug-4.4.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha1-xq5DLZvZZiWC/OCHCbA4xY6ePWo=", "requires": { "ms": "^2.1.3" @@ -11110,7 +11084,7 @@ }, "electron-to-chromium": { "version": "1.5.389", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.389.tgz", "integrity": "sha1-U4vp6+x4Am1Nq6a+Mhq4VN+sKo8=", "dev": true }, @@ -11127,7 +11101,7 @@ }, "environment": { "version": "1.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/environment/-/environment-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha1-jobGaxgPNjx6sxF4fgJZZl9FqfE=", "dev": true }, @@ -11276,7 +11250,7 @@ }, "escalade": { "version": "3.2.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escalade/-/escalade-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha1-ARo/aYVroYnf+n3I/M6Z0qh5A+U=", "dev": true }, @@ -11401,7 +11375,7 @@ }, "js-yaml": { "version": "4.3.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-yaml/-/js-yaml-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", "integrity": "sha1-0ZAFcqf3zwtfVAyDZz5gutNDZZI=", "dev": true, "requires": { @@ -11580,7 +11554,7 @@ }, "eventemitter3": { "version": "5.0.4", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/eventemitter3/-/eventemitter3-5.0.4.tgz", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha1-qG1mFwQzcS3egUcHrFK1JxzrH+s=", "dev": true }, @@ -11663,7 +11637,7 @@ }, "fast-uri": { "version": "3.1.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fast-uri/-/fast-uri-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", "integrity": "sha1-9pWkDwBqulBWMVc6ACHdshGUrRE=" }, "fastq": { @@ -11823,7 +11797,7 @@ }, "get-east-asian-width": { "version": "1.6.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", "integrity": "sha1-IWkA+R3xGossGYw+HZPWwDWndrk=", "dev": true }, @@ -12155,7 +12129,7 @@ }, "is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha1-+uMWfHKedGP4RhzlErCApJJoqog=", "dev": true }, @@ -13121,7 +13095,7 @@ }, "js-yaml": { "version": "3.15.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-yaml/-/js-yaml-3.15.0.tgz", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", "integrity": "sha1-WG5SFOr+Pok3VqQel5tQ2J0+Smc=", "dev": true, "requires": { @@ -13131,7 +13105,7 @@ }, "jsesc": { "version": "3.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsesc/-/jsesc-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha1-dNM1ojT2ftGZB/2t+sfM+dQJgl0=", "dev": true }, @@ -13209,7 +13183,7 @@ }, "lilconfig": { "version": "3.1.3", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lilconfig/-/lilconfig-3.1.3.tgz", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha1-obz9Ylf5WFv1rhTO7rt7VZAl5MQ=", "dev": true }, @@ -13221,7 +13195,7 @@ }, "lint-staged": { "version": "15.5.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lint-staged/-/lint-staged-15.5.2.tgz", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", "integrity": "sha1-vv8Cj9BoH32yb/u2cFCiHtTQWaM=", "dev": true, "requires": { @@ -13239,7 +13213,7 @@ "dependencies": { "commander": { "version": "13.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/commander/-/commander-13.1.0.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", "integrity": "sha1-d2Fn22jHjzjczh+bjXuLmkiKv0Y=", "dev": true }, @@ -13324,7 +13298,7 @@ }, "listr2": { "version": "8.3.3", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/listr2/-/listr2-8.3.3.tgz", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", "integrity": "sha1-gV/I9zgmD/IgmBv56Gaz4R6BIb8=", "dev": true, "requires": { @@ -13338,13 +13312,13 @@ "dependencies": { "emoji-regex": { "version": "10.6.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-10.6.0.tgz", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha1-vz1uj3+P0ipl2XA0dbwBRzV6aw0=", "dev": true }, "string-width": { "version": "7.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha1-tbuOIWXOJ11NQ0dt0nAK2Qkdttw=", "dev": true, "requires": { @@ -13355,7 +13329,7 @@ }, "wrap-ansi": { "version": "9.0.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha1-lWgy3qlJQwbm0gnrhxZDu4c9fJg=", "dev": true, "requires": { @@ -13389,7 +13363,7 @@ }, "log-update": { "version": "6.1.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/log-update/-/log-update-6.1.0.tgz", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", "integrity": "sha1-GgT/OBZvlGR64a9WL0vWoVsbfNQ=", "dev": true, "requires": { @@ -13402,7 +13376,7 @@ "dependencies": { "ansi-escapes": { "version": "7.3.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", "integrity": "sha1-U5W7dLIVCkodbjwlZfSuynjShic=", "dev": true, "requires": { @@ -13411,13 +13385,13 @@ }, "emoji-regex": { "version": "10.6.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-10.6.0.tgz", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha1-vz1uj3+P0ipl2XA0dbwBRzV6aw0=", "dev": true }, "is-fullwidth-code-point": { "version": "5.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", "integrity": "sha1-BGsqbU9rFWsiM9MgfUtal4OZm5g=", "dev": true, "requires": { @@ -13426,7 +13400,7 @@ }, "slice-ansi": { "version": "7.1.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/slice-ansi/-/slice-ansi-7.1.2.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", "integrity": "sha1-rfe+cKptchYtkHzQ5tXBH1B7VAM=", "dev": true, "requires": { @@ -13436,7 +13410,7 @@ }, "string-width": { "version": "7.2.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-7.2.0.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha1-tbuOIWXOJ11NQ0dt0nAK2Qkdttw=", "dev": true, "requires": { @@ -13447,7 +13421,7 @@ }, "wrap-ansi": { "version": "9.0.2", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha1-lWgy3qlJQwbm0gnrhxZDu4c9fJg=", "dev": true, "requires": { @@ -13469,7 +13443,7 @@ }, "lru-cache": { "version": "5.1.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", "dev": true, "requires": { @@ -13530,7 +13504,7 @@ }, "mimic-function": { "version": "5.0.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mimic-function/-/mimic-function-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha1-rL4rM0n5m53qyn+3Dki4PpTmcHY=", "dev": true }, @@ -13545,7 +13519,7 @@ }, "ms": { "version": "2.1.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ms/-/ms-2.1.3.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=" }, "natural-compare": { @@ -13575,7 +13549,7 @@ }, "node-releases": { "version": "2.0.51", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/node-releases/-/node-releases-2.0.51.tgz", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", "integrity": "sha1-zcCEM1d/WzKtAWlEgXJuIu61Su8=", "dev": true }, @@ -13787,13 +13761,13 @@ }, "picocolors": { "version": "1.1.1", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/picocolors/-/picocolors-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha1-PTIa8+q5ObCDyPkpodEs2oHCa2s=", "dev": true }, "picomatch": { "version": "2.3.2", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/picomatch/-/picomatch-2.3.2.tgz", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha1-WpQpFeJrNy3A8OZ1MUmhbmscVgE=", "dev": true }, @@ -13978,7 +13952,7 @@ }, "restore-cursor": { "version": "5.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/restore-cursor/-/restore-cursor-5.1.0.tgz", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", "integrity": "sha1-B2bZVpnvrLFBUJk/VbrwlT6h6+c=", "dev": true, "requires": { @@ -13988,7 +13962,7 @@ "dependencies": { "onetime": { "version": "7.0.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/onetime/-/onetime-7.0.0.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", "integrity": "sha1-nxbJLYye9RIOOs2d2ZV8zuzBq2A=", "dev": true, "requires": { @@ -13997,7 +13971,7 @@ }, "signal-exit": { "version": "4.1.0", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/signal-exit/-/signal-exit-4.1.0.tgz", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ=", "dev": true } @@ -14011,7 +13985,7 @@ }, "rfdc": { "version": "1.4.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/rfdc/-/rfdc-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha1-d492xPtzHZNBTo+SX77PZMzn9so=", "dev": true }, @@ -14118,7 +14092,7 @@ }, "slice-ansi": { "version": "5.0.0", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/slice-ansi/-/slice-ansi-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha1-tzBjxXqpb5zYgWVLFSlNldKFxCo=", "dev": true, "requires": { @@ -14671,7 +14645,7 @@ }, "update-browserslist-db": { "version": "1.2.3", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha1-ZNdttYcTE2rL60xJEUNmzGzC6A0=", "dev": true, "requires": { @@ -14690,7 +14664,7 @@ }, "uuid": { "version": "11.1.1", - "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/uuid/-/uuid-11.1.1.tgz", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", "integrity": "sha1-9tgdLhxl0Adi5eKbFsXS2ZXiCK0=" }, "v8-to-istanbul": { @@ -14813,13 +14787,13 @@ }, "yallist": { "version": "3.1.1", - "resolved": "https://ms-feed-12.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yallist/-/yallist-3.1.1.tgz", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", "dev": true }, "yaml": { "version": "2.9.0", - "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yaml/-/yaml-2.9.0.tgz", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", "integrity": "sha1-eCdK/ZNZih391hMN9qVm3vy/mqQ=" }, "yargs": { diff --git a/package.json b/package.json index f32731d..6dbde4f 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "wrap-ansi": "^8.1.0" }, "devDependencies": { - "@microsoft/shell-use": "^0.0.1-beta.6", + "@microsoft/tui-test": "^0.1.0-beta.2", "@tsconfig/node18": "^18.2.2", "@types/color-convert": "^2.0.3", "@types/jest": "^29.5.5", diff --git a/src/tests/ui/autocomplete.test.ts b/src/tests/ui/autocomplete.test.ts index bb9cd83..3bede7d 100644 --- a/src/tests/ui/autocomplete.test.ts +++ b/src/tests/ui/autocomplete.test.ts @@ -2,8 +2,8 @@ // Licensed under the MIT License. import { jest } from "@jest/globals"; -import { terminalSnapshot } from "@microsoft/shell-use/test"; -import type { ShellUse } from "@microsoft/shell-use/test"; +import { terminalSnapshot } from "@microsoft/tui-test/test"; +import type { TuiTest } from "@microsoft/tui-test/test"; import { closeSession, configs, expectPrompt, returnChar, startSession } from "./helpers"; const accent = "#7d56f4"; @@ -11,7 +11,7 @@ const accent = "#7d56f4"; jest.retryTimes(2, { logErrorsBeforeRetry: true }); describe("resize recovery", () => { - let terminal: ShellUse; + let terminal: TuiTest; beforeEach(async () => { terminal = await startSession({ label: "bash-resize", shell: "bash", env: { BASH_SILENCE_DEPRECATION_WARNING: "1" } }, ["-T", "-s", "bash"]); }); @@ -47,7 +47,7 @@ configs.map((config) => { const rc = returnChar(config.shell); const args = ["-V", "-T", "-s", config.shell]; describe(`[${config.label}]`, () => { - let terminal: ShellUse; + let terminal: TuiTest; beforeEach(async () => { terminal = await startSession(config, args); }); diff --git a/src/tests/ui/helpers.ts b/src/tests/ui/helpers.ts index 2279863..05eb2b8 100644 --- a/src/tests/ui/helpers.ts +++ b/src/tests/ui/helpers.ts @@ -5,9 +5,9 @@ import os from "node:os"; import path from "node:path"; import fs from "node:fs"; import url from "node:url"; -import { ShellUse } from "@microsoft/shell-use"; -import { trackTerminal, untrackTerminal } from "@microsoft/shell-use/test"; -import type { Shell } from "@microsoft/shell-use"; +import type { TuiTest } from "@microsoft/tui-test"; +import { createTerminal, untrackTerminal } from "@microsoft/tui-test/test"; +import type { Shell } from "@microsoft/tui-test"; export type ShellConfig = { label: string; @@ -40,12 +40,12 @@ const idleTimeout = 15_000; const promptTimeout = 20_000; const timeouts = { text: expectTextTimeout, idle: idleTimeout }; -export const expectPrompt = async (terminal: ShellUse, timeout = promptTimeout): Promise => { +export const expectPrompt = async (terminal: TuiTest, timeout = promptTimeout): Promise => { await terminal.expectText("> ", { timeout }); await terminal.waitIdle(); }; -export const closeSession = async (terminal: ShellUse | undefined): Promise => { +export const closeSession = async (terminal: TuiTest | undefined): Promise => { if (terminal) { await terminal.closeQuiet(); untrackTerminal(terminal); @@ -53,21 +53,17 @@ export const closeSession = async (terminal: ShellUse | undefined): Promise { - const terminal = ShellUse.ephemeral(undefined, { timeouts }); - trackTerminal(terminal); - return terminal; -}; -export const startSession = async (config: ShellConfig, args: string[], cols = 80, rows = 30): Promise => { - const terminal = ephemeralTerminal(); +export const startSession = async (config: ShellConfig, args: string[], cols = 80, rows = 30): Promise => { + const terminal = await createTerminal({ + program: ["node", buildEntry, ...args], + cols, + rows, + env: { ...baseEnv, ...config.env }, + timeouts, + retries: 2, + }); try { - await terminal.run("node", [buildEntry, ...args], { - cols, - rows, - env: { ...baseEnv, ...config.env }, - retries: 2, - }); await expectPrompt(terminal); return terminal; } catch (error) { @@ -76,13 +72,4 @@ export const startSession = async (config: ShellConfig, args: string[], cols = 8 } }; -export const startShell = async (shell: Shell): Promise => { - const terminal = ephemeralTerminal(); - try { - await terminal.open({ shell, env: baseEnv, retries: 2 }); - return terminal; - } catch (error) { - await closeSession(terminal); - throw error; - } -}; +export const startShell = async (shell: Shell): Promise => createTerminal({ shell, env: baseEnv, timeouts, retries: 2 }); diff --git a/src/tests/ui/status.test.ts b/src/tests/ui/status.test.ts index 1bbc61e..54cff71 100644 --- a/src/tests/ui/status.test.ts +++ b/src/tests/ui/status.test.ts @@ -3,8 +3,8 @@ import os from "node:os"; import { jest } from "@jest/globals"; -import type { ShellUse } from "@microsoft/shell-use/test"; -import type { Shell } from "@microsoft/shell-use"; +import type { TuiTest } from "@microsoft/tui-test/test"; +import type { Shell } from "@microsoft/tui-test"; import { closeSession, startSession, startShell } from "./helpers"; const shell: Shell = os.platform() == "darwin" ? "zsh" : os.platform() == "linux" ? "bash" : "powershell"; @@ -13,7 +13,7 @@ jest.retryTimes(2, { logErrorsBeforeRetry: true }); describe("status checks", () => { describe("inside inshellisense session", () => { - let terminal: ShellUse; + let terminal: TuiTest; beforeEach(async () => { terminal = await startSession({ label: "status", shell }, ["-T", "-s", shell]); }); @@ -28,7 +28,7 @@ describe("status checks", () => { }); describe("outside inshellisense session", () => { - let terminal: ShellUse; + let terminal: TuiTest; beforeEach(async () => { terminal = await startShell(shell); });